diff --git a/wle_pp/wle_pp/package-lock.json b/wle_pp/wle_pp/package-lock.json index cbbbc11..2ba49fd 100644 --- a/wle_pp/wle_pp/package-lock.json +++ b/wle_pp/wle_pp/package-lock.json @@ -1,12 +1,12 @@ { "name": "wle-pp", - "version": "0.7.2", + "version": "0.7.3", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "wle-pp", - "version": "0.7.2", + "version": "0.7.3", "license": "ISC", "devDependencies": { "esbuild": "^0.24.0", diff --git a/wle_pp/wle_pp/package.json b/wle_pp/wle_pp/package.json index dbc3047..cdb1781 100644 --- a/wle_pp/wle_pp/package.json +++ b/wle_pp/wle_pp/package.json @@ -1,6 +1,6 @@ { "name": "wle-pp", - "version": "0.7.2", + "version": "0.7.3", "author": "Pipo", "description": "A library for the Wonderland Engine", "homepage": "https://github.com/signorpipo/wle-pp", diff --git a/wle_pp/wle_pp/src/pp/gameplay/experimental/character_controller/collision/character_collider_setup.js b/wle_pp/wle_pp/src/pp/gameplay/experimental/character_controller/collision/character_collider_setup.js index 5ebded1..5ab3d5e 100644 --- a/wle_pp/wle_pp/src/pp/gameplay/experimental/character_controller/collision/character_collider_setup.js +++ b/wle_pp/wle_pp/src/pp/gameplay/experimental/character_controller/collision/character_collider_setup.js @@ -211,10 +211,7 @@ export class CharacterColliderWallSlideParams { export class CharacterColliderSurfaceParams { constructor() { - this.mySurfaceSnapEnabled = false; this.mySurfaceSnapMaxDistance = 0; - - this.mySurfacePopOutEnabled = false; this.mySurfacePopOutMaxDistance = 0; this.mySurfaceAngleToIgnore = 0; @@ -507,10 +504,7 @@ CharacterColliderWallSlideParams.prototype.copy = function copy(other) { }; CharacterColliderSurfaceParams.prototype.copy = function copy(other) { - this.mySurfaceSnapEnabled = other.mySurfaceSnapEnabled; this.mySurfaceSnapMaxDistance = other.mySurfaceSnapMaxDistance; - - this.mySurfacePopOutEnabled = other.mySurfacePopOutEnabled; this.mySurfacePopOutMaxDistance = other.mySurfacePopOutMaxDistance; this.mySurfaceAngleToIgnore = other.mySurfaceAngleToIgnore; diff --git a/wle_pp/wle_pp/src/pp/gameplay/experimental/character_controller/collision/character_collider_setup_utils.ts b/wle_pp/wle_pp/src/pp/gameplay/experimental/character_controller/collision/character_collider_setup_utils.ts index 6776a90..346f911 100644 --- a/wle_pp/wle_pp/src/pp/gameplay/experimental/character_controller/collision/character_collider_setup_utils.ts +++ b/wle_pp/wle_pp/src/pp/gameplay/experimental/character_controller/collision/character_collider_setup_utils.ts @@ -86,11 +86,8 @@ export function createSimplified(simplifiedCreationParams: Readonly 0; outCharacterColliderSetup.myGroundParams.mySurfaceSnapMaxDistance = simplifiedCreationParams.myMaxDistanceToSnapOnGround; - outCharacterColliderSetup.myGroundParams.mySurfacePopOutEnabled = simplifiedCreationParams.myMaxDistanceToPopOutGround > 0; - outCharacterColliderSetup.myGroundParams.mySurfacePopOutMaxDistance = simplifiedCreationParams.myMaxDistanceToPopOutGround; - outCharacterColliderSetup.myGroundParams.mySurfacePopOutMaxDistance = Math.max(outCharacterColliderSetup.myGroundParams.mySurfacePopOutMaxDistance, outCharacterColliderSetup.myHorizontalCheckParams.myHorizontalCheckFeetDistanceToIgnore); + outCharacterColliderSetup.myGroundParams.mySurfacePopOutMaxDistance = Math.max(simplifiedCreationParams.myMaxDistanceToPopOutGround, outCharacterColliderSetup.myHorizontalCheckParams.myHorizontalCheckFeetDistanceToIgnore); outCharacterColliderSetup.myGroundParams.myHorizontalMovementSurfaceAngleToIgnoreMaxHorizontalMovementLeft = simplifiedCreationParams.myRadius * 0.75; @@ -119,9 +116,7 @@ export function createSimplified(simplifiedCreationParams: Readonly 0; outCollisionCheckParams.mySnapOnGroundExtraDistance = characterColliderSetup.myGroundParams.mySurfaceSnapMaxDistance; - outCollisionCheckParams.mySnapOnCeilingEnabled = characterColliderSetup.myCeilingParams.mySurfaceSnapEnabled; + outCollisionCheckParams.mySnapOnCeilingEnabled = characterColliderSetup.myCeilingParams.mySurfaceSnapMaxDistance > 0; outCollisionCheckParams.mySnapOnCeilingExtraDistance = characterColliderSetup.myCeilingParams.mySurfaceSnapMaxDistance; - outCollisionCheckParams.myGroundPopOutEnabled = characterColliderSetup.myGroundParams.mySurfacePopOutEnabled; + outCollisionCheckParams.myGroundPopOutEnabled = characterColliderSetup.myGroundParams.mySurfacePopOutMaxDistance > 0; outCollisionCheckParams.myGroundPopOutExtraDistance = characterColliderSetup.myGroundParams.mySurfacePopOutMaxDistance; - outCollisionCheckParams.myCeilingPopOutEnabled = characterColliderSetup.myCeilingParams.mySurfacePopOutEnabled; + outCollisionCheckParams.myCeilingPopOutEnabled = characterColliderSetup.myCeilingParams.mySurfacePopOutMaxDistance > 0; outCollisionCheckParams.myCeilingPopOutExtraDistance = characterColliderSetup.myCeilingParams.mySurfacePopOutMaxDistance; outCollisionCheckParams.myGroundAngleToIgnore = characterColliderSetup.myGroundParams.mySurfaceAngleToIgnore; diff --git a/wle_pp/wle_pp/src/pp/gameplay/experimental/locomotion/legacy/locomotion/components/player_locomotion_component.ts b/wle_pp/wle_pp/src/pp/gameplay/experimental/locomotion/legacy/locomotion/components/player_locomotion_component.ts index 321d486..319b1b5 100644 --- a/wle_pp/wle_pp/src/pp/gameplay/experimental/locomotion/legacy/locomotion/components/player_locomotion_component.ts +++ b/wle_pp/wle_pp/src/pp/gameplay/experimental/locomotion/legacy/locomotion/components/player_locomotion_component.ts @@ -9,13 +9,11 @@ import { PlayerLocomotion, PlayerLocomotionParams } from "../player_locomotion.j /** * Tips - * - Be sure that your colliders has faces on both sides of the mesh, this helps the collision check which otherise might be able to move through walls + * - Be sure that your colliders have faces on both sides of the mesh, this helps the collision check which otherise might be able to move through walls */ export class PlayerLocomotionComponent extends Component { public static override TypeName = "pp-player-locomotion"; - - @property.enum(["Smooth", "Teleport"], "Smooth") private readonly _myDefaultLocomotionType!: number; @@ -518,6 +516,10 @@ export class PlayerLocomotionComponent extends Component { this._myActivateOnNextPostPoseUpdate = false; } + if (!this._myPlayerLocomotion!.isStarted()) { + this._myPlayerLocomotion!.start(); + } + if (!setPlayerLocomotionOnGlobals && Globals.hasPlayerLocomotion(this.engine) && Globals.getPlayerLocomotion(this.engine) != this._myPlayerLocomotion) return; let startTime = 0; @@ -535,10 +537,6 @@ export class PlayerLocomotionComponent extends Component { PhysicsUtils.resetRaycastCount(this.engine.physics!); } - if (!this._myPlayerLocomotion!.isStarted()) { - this._myPlayerLocomotion!.start(); - } - this._myPlayerLocomotion!.update(dt); if (this._myPerformanceLogEnabled && Globals.isDebugEnabled(this.engine)) { diff --git a/wle_pp/wle_pp/src/pp/gameplay/experimental/locomotion/legacy/locomotion/player_locomotion.ts b/wle_pp/wle_pp/src/pp/gameplay/experimental/locomotion/legacy/locomotion/player_locomotion.ts index 9bd9971..eeb8ba3 100644 --- a/wle_pp/wle_pp/src/pp/gameplay/experimental/locomotion/legacy/locomotion/player_locomotion.ts +++ b/wle_pp/wle_pp/src/pp/gameplay/experimental/locomotion/legacy/locomotion/player_locomotion.ts @@ -36,10 +36,10 @@ export enum PlayerLocomotionType { export class PlayerLocomotionParams { public myDefaultLocomotionType: number = PlayerLocomotionType.SMOOTH; - public myAlwaysSmoothForNonVR: boolean = true; + public myAlwaysSmoothForNonVR: boolean = false; /** Double press main hand thumbstick (default: left) to switch */ - public mySwitchLocomotionTypeShortcutEnabled: boolean = true; + public mySwitchLocomotionTypeShortcutEnabled: boolean = false; public myStartIdle: boolean = false; @@ -59,7 +59,7 @@ export class PlayerLocomotionParams { public myMaxSpeed: number = 0; public myMaxRotationSpeed: number = 0; - public mySpeedSlowDownPercentageOnWallSlid: number = 1; + public mySpeedSlowDownPercentageOnWallSlid: number = 0; public myGravityAcceleration: number = 0; @@ -84,7 +84,7 @@ export class PlayerLocomotionParams { public myMainHand: Handedness = Handedness.LEFT; - public myDirectionInvertForwardWhenUpsideDown: boolean = true; + public myDirectionInvertForwardWhenUpsideDown: boolean = false; public myVRDirectionReferenceType: PlayerLocomotionDirectionReferenceType = PlayerLocomotionDirectionReferenceType.HEAD; public myVRDirectionReferenceObject: Readonly | null = null; @@ -101,7 +101,7 @@ export class PlayerLocomotionParams { public myTeleportParableStartReferenceObject: Readonly | null = null; - public myResetRealOnStart: boolean = true; + public myResetRealOnStart: boolean = false; /** * #WARN With `_myResetRealOnStartFramesAmount` at `1` it can happen that you enter the session like 1 frame before the game load @@ -115,7 +115,7 @@ export class PlayerLocomotionParams { * For example, if u have a total fade at start and nothing can be seen aside the clear color for at least, let's say, 10 frames, * you can set this to `3` safely, since there will be no visible stutter to be seen (beside the clear color) */ - public myResetRealOnStartFramesAmount: number = 1; + public myResetRealOnStartFramesAmount: number = 0; /** Can fix some head through floor issues, when you can move your head completely to the other side of the floor If the floors are thick enough that this can't happen, you can leave this to false */ @@ -127,15 +127,15 @@ export class PlayerLocomotionParams { /** Valid means, for example, that the real player has not moved inside a wall by moving in the real space */ - public mySyncWithRealWorldPositionOnlyIfValid: boolean = true; + public mySyncWithRealWorldPositionOnlyIfValid: boolean = false; /** Valid means, for example, that the real player has not moved inside a wall by moving in the real space */ - public mySyncWithRealHeightOnlyIfValid: boolean = true; + public mySyncWithRealHeightOnlyIfValid: boolean = false; public mySnapRealPositionToGround: boolean = false; public myPreventRealFromColliding: boolean = false; - public myViewOcclusionInsideWallsEnabled: boolean = true; + public myViewOcclusionInsideWallsEnabled: boolean = false; public myViewOcclusionLayerFlags: Readonly = new PhysicsLayerFlags(); /** @@ -227,7 +227,7 @@ export class PlayerLocomotionParams { /** Main hand (default: left) select + thumbstick press, auto switch to smooth */ public myDebugFlyShortcutEnabled: boolean = false; - public myDebugFlyMaxSpeedMultiplier: number = 5; + public myDebugFlyMaxSpeedMultiplier: number = 0; /** Main hand (default: left) thumbstick pressed while moving */ public myMoveThroughCollisionShortcutEnabled: boolean = false; @@ -247,6 +247,7 @@ export class PlayerLocomotionParams { public myEngine: Readonly; + constructor(engine: Readonly = Globals.getMainEngine()!) { this.myEngine = engine; } @@ -256,9 +257,10 @@ export class PlayerLocomotionParams { // #TODO Add lerped snap on vertical over like half a second to avoid the "snap effect" // This could be done by detatching the actual vertical position of the player from the collision real one when a snap is detected above a certain threshold // with a timer, after which the vertical position is just copied, while during the detatching is lerped toward the collision vertical one + /** * Tips - * - Be sure that your colliders has faces on both sides of the mesh, this helps the collision check which otherise might be able to move through walls + * - Be sure that your colliders have faces on both sides of the mesh, this helps the collision check which otherise might be able to move through walls */ export class PlayerLocomotion { @@ -333,6 +335,36 @@ export class PlayerLocomotion { params.myTeleportCollisionCheckParamsCheck360 = true; params.myTeleportCollisionCheckParamsGroundAngleToIgnore = this._myParams.myColliderMaxTeleportableGroundAngle; + params.mySyncEnabledFlagMap.set(PlayerTransformManagerSyncFlag.BODY_COLLIDING, true); + params.mySyncEnabledFlagMap.set(PlayerTransformManagerSyncFlag.HEAD_COLLIDING, true); + params.mySyncEnabledFlagMap.set(PlayerTransformManagerSyncFlag.FAR, true); + params.mySyncEnabledFlagMap.set(PlayerTransformManagerSyncFlag.FLOATING, true); + params.mySyncEnabledFlagMap.set(PlayerTransformManagerSyncFlag.HEIGHT_COLLIDING, true); + + params.mySyncPositionFlagMap.set(PlayerTransformManagerSyncFlag.BODY_COLLIDING, true); + params.mySyncPositionFlagMap.set(PlayerTransformManagerSyncFlag.HEAD_COLLIDING, false); + params.mySyncPositionFlagMap.set(PlayerTransformManagerSyncFlag.FAR, true); + params.mySyncPositionFlagMap.set(PlayerTransformManagerSyncFlag.FLOATING, true); + params.mySyncPositionFlagMap.set(PlayerTransformManagerSyncFlag.HEIGHT_COLLIDING, false); + + params.mySyncPositionHeadFlagMap.set(PlayerTransformManagerSyncFlag.BODY_COLLIDING, false); + params.mySyncPositionHeadFlagMap.set(PlayerTransformManagerSyncFlag.HEAD_COLLIDING, true); + params.mySyncPositionHeadFlagMap.set(PlayerTransformManagerSyncFlag.FAR, false); + params.mySyncPositionHeadFlagMap.set(PlayerTransformManagerSyncFlag.FLOATING, false); + params.mySyncPositionHeadFlagMap.set(PlayerTransformManagerSyncFlag.HEIGHT_COLLIDING, false); + + params.mySyncRotationFlagMap.set(PlayerTransformManagerSyncFlag.BODY_COLLIDING, false); + params.mySyncRotationFlagMap.set(PlayerTransformManagerSyncFlag.HEAD_COLLIDING, false); + params.mySyncRotationFlagMap.set(PlayerTransformManagerSyncFlag.FAR, false); + params.mySyncRotationFlagMap.set(PlayerTransformManagerSyncFlag.FLOATING, false); + params.mySyncRotationFlagMap.set(PlayerTransformManagerSyncFlag.HEIGHT_COLLIDING, false); + + params.mySyncHeightFlagMap.set(PlayerTransformManagerSyncFlag.BODY_COLLIDING, false); + params.mySyncHeightFlagMap.set(PlayerTransformManagerSyncFlag.HEAD_COLLIDING, false); + params.mySyncHeightFlagMap.set(PlayerTransformManagerSyncFlag.FAR, false); + params.mySyncHeightFlagMap.set(PlayerTransformManagerSyncFlag.FLOATING, false); + params.mySyncHeightFlagMap.set(PlayerTransformManagerSyncFlag.HEIGHT_COLLIDING, true); + params.myHeadCollisionBlockLayerFlags.copy(this._myParams.myViewOcclusionLayerFlags); params.myHeadCollisionObjectsToIgnore.pp_copy(params.myMovementCollisionCheckParams.myHorizontalObjectsToIgnore as any); const objectsEqualCallback = (first: Readonly, second: Readonly): boolean => first == second; @@ -360,11 +392,9 @@ export class PlayerLocomotion { if (!this._myParams.myViewOcclusionInsideWallsEnabled) { params.mySyncEnabledFlagMap.set(PlayerTransformManagerSyncFlag.HEAD_COLLIDING, false); - params.myAlwaysSyncHeadPositionWithReal = true; - - params.myUpdatePositionHeadValid = false; - params.myUpdateRealPositionHeadValid = false; + } else { + params.myUpdatePositionHeadValid = true; } params.myApplyRealToValidAdjustmentsToRealPositionToo = this._myParams.mySnapRealPositionToGround; @@ -427,6 +457,10 @@ export class PlayerLocomotion { params.myNeverResetRealRotationVR = false; params.myNeverResetRealHeightVR = true; + params.myResetRealResetRotationIfUpChanged = true; + params.myResetHeadToFeetMoveTowardReal = true; + params.myResetHeadToFeetUpOffset = 0.25; + params.myDebugEnabled = false; this._myPlayerTransformManager = new PlayerTransformManager(params); diff --git a/wle_pp/wle_pp/src/pp/gameplay/experimental/locomotion/legacy/locomotion/player_transform_manager.ts b/wle_pp/wle_pp/src/pp/gameplay/experimental/locomotion/legacy/locomotion/player_transform_manager.ts index fc73cde..14422de 100644 --- a/wle_pp/wle_pp/src/pp/gameplay/experimental/locomotion/legacy/locomotion/player_transform_manager.ts +++ b/wle_pp/wle_pp/src/pp/gameplay/experimental/locomotion/legacy/locomotion/player_transform_manager.ts @@ -139,7 +139,7 @@ export class PlayerTransformManagerParams { public myRotateOnlyIfSynced: boolean = false; - public myResetRealResetRotationIfUpChanged: boolean = true; + public myResetRealResetRotationIfUpChanged: boolean = false; @@ -157,11 +157,11 @@ export class PlayerTransformManagerParams { The above issue can still happen but should be more rare, only if you teleport to a place where there could be garbage stuff */ public myResetHeadToFeetInsteadOfRealOnlyIfRealNotReachable: boolean = false; - public myResetHeadToFeetMoveTowardReal: boolean = true; + public myResetHeadToFeetMoveTowardReal: boolean = false; /* Can be used to specify that the head should reset a bit above the actual feet level, so to avoid small objects that could very frequently happen to be close to the floor */ - public myResetHeadToFeetUpOffset: number = 0.25; + public myResetHeadToFeetUpOffset: number = 0; public myResetHeadToFeetGroudnAngleIgnoreEnabled: boolean = false; @@ -180,7 +180,7 @@ export class PlayerTransformManagerParams { // (gravity inside this class?) only when movement is applied not for head only) public myUpdatePositionValid: boolean = false; - public myUpdatePositionHeadValid: boolean = true; + public myUpdatePositionHeadValid: boolean = false; public myUpdateRealPositionValid: boolean = false; public myUpdateRealPositionHeadValid: boolean = false; @@ -246,36 +246,6 @@ export class PlayerTransformManagerParams { constructor(engine: Readonly = Globals.getMainEngine()!) { this.myEngine = engine; - - this.mySyncEnabledFlagMap.set(PlayerTransformManagerSyncFlag.BODY_COLLIDING, true); - this.mySyncEnabledFlagMap.set(PlayerTransformManagerSyncFlag.HEAD_COLLIDING, true); - this.mySyncEnabledFlagMap.set(PlayerTransformManagerSyncFlag.FAR, true); - this.mySyncEnabledFlagMap.set(PlayerTransformManagerSyncFlag.FLOATING, true); - this.mySyncEnabledFlagMap.set(PlayerTransformManagerSyncFlag.HEIGHT_COLLIDING, true); - - this.mySyncPositionFlagMap.set(PlayerTransformManagerSyncFlag.BODY_COLLIDING, true); - this.mySyncPositionFlagMap.set(PlayerTransformManagerSyncFlag.HEAD_COLLIDING, false); - this.mySyncPositionFlagMap.set(PlayerTransformManagerSyncFlag.FAR, true); - this.mySyncPositionFlagMap.set(PlayerTransformManagerSyncFlag.FLOATING, true); - this.mySyncPositionFlagMap.set(PlayerTransformManagerSyncFlag.HEIGHT_COLLIDING, false); - - this.mySyncPositionHeadFlagMap.set(PlayerTransformManagerSyncFlag.BODY_COLLIDING, false); - this.mySyncPositionHeadFlagMap.set(PlayerTransformManagerSyncFlag.HEAD_COLLIDING, true); - this.mySyncPositionHeadFlagMap.set(PlayerTransformManagerSyncFlag.FAR, false); - this.mySyncPositionHeadFlagMap.set(PlayerTransformManagerSyncFlag.FLOATING, false); - this.mySyncPositionHeadFlagMap.set(PlayerTransformManagerSyncFlag.HEIGHT_COLLIDING, false); - - this.mySyncRotationFlagMap.set(PlayerTransformManagerSyncFlag.BODY_COLLIDING, false); - this.mySyncRotationFlagMap.set(PlayerTransformManagerSyncFlag.HEAD_COLLIDING, false); - this.mySyncRotationFlagMap.set(PlayerTransformManagerSyncFlag.FAR, false); - this.mySyncRotationFlagMap.set(PlayerTransformManagerSyncFlag.FLOATING, false); - this.mySyncRotationFlagMap.set(PlayerTransformManagerSyncFlag.HEIGHT_COLLIDING, false); - - this.mySyncHeightFlagMap.set(PlayerTransformManagerSyncFlag.BODY_COLLIDING, false); - this.mySyncHeightFlagMap.set(PlayerTransformManagerSyncFlag.HEAD_COLLIDING, false); - this.mySyncHeightFlagMap.set(PlayerTransformManagerSyncFlag.FAR, false); - this.mySyncHeightFlagMap.set(PlayerTransformManagerSyncFlag.FLOATING, false); - this.mySyncHeightFlagMap.set(PlayerTransformManagerSyncFlag.HEIGHT_COLLIDING, true); } } diff --git a/wle_pp/wle_pp/src/pp/input/cauldron/components/input_manager_component.js b/wle_pp/wle_pp/src/pp/input/cauldron/components/input_manager_component.js index 4586bed..ef7cd12 100644 --- a/wle_pp/wle_pp/src/pp/input/cauldron/components/input_manager_component.js +++ b/wle_pp/wle_pp/src/pp/input/cauldron/components/input_manager_component.js @@ -16,8 +16,6 @@ export class InputManagerComponent extends Component { init() { this._myInputManager = null; - - this._myPoseForwardFixedGlobal = this._myPoseForwardFixed; } update(dt) { @@ -78,7 +76,7 @@ export class InputManagerComponent extends Component { } if (!Globals.hasPoseForwardFixed(this.engine)) { - Globals.setPoseForwardFixed(this._myPoseForwardFixedGlobal, this.engine); + Globals.setPoseForwardFixed(this._myPoseForwardFixed, this.engine); } } @@ -91,7 +89,7 @@ export class InputManagerComponent extends Component { } } - if (Globals.isPoseForwardFixed(this.engine) == this._myPoseForwardFixedGlobal) { + if (Globals.isPoseForwardFixed(this.engine) == this._myPoseForwardFixed) { Globals.removePoseForwardFixed(this.engine); } } diff --git a/wle_pp/wle_pp/src/pp/input/cauldron/input_manager.ts b/wle_pp/wle_pp/src/pp/input/cauldron/input_manager.ts index 99dd7ef..71677b1 100644 --- a/wle_pp/wle_pp/src/pp/input/cauldron/input_manager.ts +++ b/wle_pp/wle_pp/src/pp/input/cauldron/input_manager.ts @@ -25,7 +25,7 @@ export class InputManager { private readonly _myGamepadsManager: GamepadsManager = new GamepadsManager(); private _myStarted: boolean = false; - private _myActive: boolean = true; + private _myActive: boolean = false; private _myTrackedHandPosesEnabled: boolean = true; private _myTrackedHandPosesStarted: boolean = false; @@ -134,6 +134,10 @@ export class InputManager { this._myGamepadsManager.start(); this._myStarted = true; + + const currentActive = this._myActive; + this._myActive = !this._myActive; + this.setActive(currentActive); } public update(dt: number): void { @@ -269,6 +273,10 @@ export class InputManager { this._myTrackedHandPoses[handedness].setReferenceObject(Globals.getPlayerObjects(this._myEngine)!.myReferenceSpace); this._myTrackedHandPoses[handedness].setForwardFixed(Globals.isPoseForwardFixed(this._myEngine)); this._myTrackedHandPoses[handedness].start(); + + if (this._myStarted) { + this._myTrackedHandPoses[handedness].setActive(this._myActive); + } } this._myTrackedHandPosesStarted = true; diff --git a/wle_pp/wle_pp/src/pp/input/cauldron/mouse.js b/wle_pp/wle_pp/src/pp/input/cauldron/mouse.js index 7351528..14bf5f1 100644 --- a/wle_pp/wle_pp/src/pp/input/cauldron/mouse.js +++ b/wle_pp/wle_pp/src/pp/input/cauldron/mouse.js @@ -381,12 +381,15 @@ export class Mouse { setContextMenuActive(active) { if (this._myContextMenuActive != active) { - if (active) { - document.body.removeEventListener("contextmenu", this._myPreventContextMenuEventListener); - } else { - document.body.addEventListener("contextmenu", this._myPreventContextMenuEventListener, false); - } this._myContextMenuActive = active; + + if (this._myActive) { + if (active) { + document.body.removeEventListener("contextmenu", this._myPreventContextMenuEventListener); + } else { + document.body.addEventListener("contextmenu", this._myPreventContextMenuEventListener, false); + } + } } } @@ -396,12 +399,15 @@ export class Mouse { setMiddleButtonScrollActive(active) { if (this._myMiddleButtonScrollActive != active) { - if (active) { - document.body.removeEventListener("mousedown", this._myPreventMiddleButtonScrollEventListener); - } else { - document.body.addEventListener("mousedown", this._myPreventMiddleButtonScrollEventListener, false); - } this._myMiddleButtonScrollActive = active; + + if (this._myActive) { + if (active) { + document.body.removeEventListener("mousedown", this._myPreventMiddleButtonScrollEventListener); + } else { + document.body.addEventListener("mousedown", this._myPreventMiddleButtonScrollEventListener, false); + } + } } } diff --git a/wle_pp/wle_pp/src/pp/plugin/wl/mods/components/cauldron_mods.ts b/wle_pp/wle_pp/src/pp/plugin/wl/mods/components/cauldron_mods.ts index c45e3f2..de778be 100644 --- a/wle_pp/wle_pp/src/pp/plugin/wl/mods/components/cauldron_mods.ts +++ b/wle_pp/wle_pp/src/pp/plugin/wl/mods/components/cauldron_mods.ts @@ -11,24 +11,19 @@ function _initEmitterModPrototype(): void { const { once = false, id = undefined } = opts; const data: any = { id, once, callback: listener }; - const _transactions: { type: number, data: any }[] = (this as unknown as { _transactions: { type: number, data: any }[] })._transactions; - - if (data.id !== undefined) { - _transactions.pp_removeAll((elementToCheck: { type: number, data: any }): boolean => { - return elementToCheck.data.id === data.id; - }); - - this._listeners.pp_removeAll((listener: { id: unknown }): boolean => { - return listener.id === data.id; - }); - } - const _notifying: boolean = (this as unknown as { _notifying: boolean })._notifying; if (_notifying) { + const _transactions: { type: number, data: any }[] = (this as unknown as { _transactions: { type: number, data: any }[] })._transactions; _transactions.push({ type: 1 /* TransactionType.Addition */, data }); - return this; + } else { + this._listeners.pp_removeAll((listener: { callback: unknown, id: unknown }): boolean => { + return (data.id !== undefined && listener.id === data.id) || + (data.id === undefined && listener.id === undefined && listener.callback === data.callback); + }); + + this._listeners.push(data); } - this._listeners.push(data); + return this; }, _flushTransactions(this: Emitter): void { @@ -38,6 +33,11 @@ function _initEmitterModPrototype(): void { for (let i = 0; i < _transactions.length; i++) { const transaction = _transactions[i]; if (transaction.type == 1 /*TransactionType.Addition*/) { + this._listeners.pp_removeAll((listener: { callback: unknown, id: unknown }): boolean => { + return (transaction.data.id !== undefined && listener.id === transaction.data.id) || + (transaction.data.id === undefined && listener.id === undefined && listener.callback === transaction.data.callback); + }); + listeners.push(transaction.data); } else { this.remove(transaction.data); diff --git a/wle_pp/wle_pp/src/pp/plugin/wl/mods/components/cursor_component_mod.js b/wle_pp/wle_pp/src/pp/plugin/wl/mods/components/cursor_component_mod.js index 6e19eaa..124acb9 100644 --- a/wle_pp/wle_pp/src/pp/plugin/wl/mods/components/cursor_component_mod.js +++ b/wle_pp/wle_pp/src/pp/plugin/wl/mods/components/cursor_component_mod.js @@ -2,7 +2,6 @@ import { InputComponent, ViewComponent } from "@wonderlandengine/api"; import { Cursor, CursorTarget, HitTestLocation } from "@wonderlandengine/components"; import { BrowserUtils } from "../../../../cauldron/utils/browser_utils.js"; import { XRUtils } from "../../../../cauldron/utils/xr_utils.js"; -import { Handedness } from "../../../../input/cauldron/input_types.js"; import { InputUtils } from "../../../../input/cauldron/input_utils.js"; import { Globals } from "../../../../pp/globals.js"; import { mat4_create, quat2_create, vec3_create } from "../../../js/extensions/array/vec_create_extension.js"; @@ -145,7 +144,7 @@ function _initCursorComponentModPrototype() { // If in XR, set the cursor ray based on object transform // View Component not null is currently used as a way to specify this is cursor should only work for Non XR if (XRUtils.isSessionActive(this.engine) && this._viewComponent == null) { - if (Globals.getHandPose(this.handedness, this.engine).getInputSourceType() != null) { + if (this.handedness == null || Globals.getHandPose(this.handedness, this.engine).getInputSourceType() != null) { // Since Google Cardboard tap is registered as arTouchDown without a gamepad, we need to check for gamepad presence if (this.arTouchDown && this._pp_isAR()) { let axes = XRUtils.getSession(this.engine).inputSources[0].gamepad.axes; @@ -205,7 +204,7 @@ function _initCursorComponentModPrototype() { } if (this.cursorRayObject) { - if ((XRUtils.isSessionActive(this.engine) && this._viewComponent == null) || (!XRUtils.isSessionActive(this.engine) && this._viewComponent != null && this.handedness != Handedness.LEFT && this.handedness != Handedness.RIGHT)) { + if ((XRUtils.isSessionActive(this.engine) && this._viewComponent == null) || (!XRUtils.isSessionActive(this.engine) && this._viewComponent != null && this.handedness == null)) { this.cursorRayObject.pp_setActive(true); } else { this.cursorRayObject.pp_setActive(false); diff --git a/wle_pp/wle_pp/src/pp/pp/pp_version.ts b/wle_pp/wle_pp/src/pp/pp/pp_version.ts index e3d9f3c..7081b46 100644 --- a/wle_pp/wle_pp/src/pp/pp/pp_version.ts +++ b/wle_pp/wle_pp/src/pp/pp/pp_version.ts @@ -1 +1 @@ -export const PP_VERSION = "0.7.2"; \ No newline at end of file +export const PP_VERSION = "0.7.3"; \ No newline at end of file diff --git a/wle_pp/wle_pp/src/pp/tool/console_vr/console_vr_widget.js b/wle_pp/wle_pp/src/pp/tool/console_vr/console_vr_widget.js index 93e58db..96627c3 100644 --- a/wle_pp/wle_pp/src/pp/tool/console_vr/console_vr_widget.js +++ b/wle_pp/wle_pp/src/pp/tool/console_vr/console_vr_widget.js @@ -706,11 +706,16 @@ export class ConsoleVRWidget { cursorTarget.onDown.add(this._setScrollUp.bind(this, true), { id: this }); cursorTarget.onDownOnHover.add(this._setScrollUp.bind(this, true), { id: this }); cursorTarget.onUp.add(this._setScrollUp.bind(this, false), { id: this }); - cursorTarget.onUnhover.add(this._setScrollUp.bind(this, false), { id: this }); + cursorTarget.onUnhover.add(() => { + this._setScrollUp(false); + this._genericUnhover(backgroundMaterial); + }, { id: this }); cursorTarget.onHover.add(this._genericHover.bind(this, backgroundMaterial), { id: this }); - cursorTarget.onUnhover.add(this._genericUnhover.bind(this, backgroundMaterial), { id: this }); - this._myUnhoverCallbacks.push(this._genericUnhover.bind(this, backgroundMaterial)); + this._myUnhoverCallbacks.push(() => { + this._setScrollUp(false); + this._genericUnhover(backgroundMaterial); + }); } { @@ -721,11 +726,16 @@ export class ConsoleVRWidget { cursorTarget.onDown.add(this._setScrollDown.bind(this, true), { id: this }); cursorTarget.onDownOnHover.add(this._setScrollDown.bind(this, true), { id: this }); cursorTarget.onUp.add(this._setScrollDown.bind(this, false), { id: this }); - cursorTarget.onUnhover.add(this._setScrollDown.bind(this, false), { id: this }); + cursorTarget.onUnhover.add(() => { + this._setScrollDown(false); + this._genericUnhover(backgroundMaterial); + }, { id: this }); cursorTarget.onHover.add(this._genericHover.bind(this, backgroundMaterial), { id: this }); - cursorTarget.onUnhover.add(this._genericUnhover.bind(this, backgroundMaterial), { id: this }); - this._myUnhoverCallbacks.push(this._genericUnhover.bind(this, backgroundMaterial)); + this._myUnhoverCallbacks.push(() => { + this._setScrollDown(false); + this._genericUnhover(backgroundMaterial); + }); } { diff --git a/wle_pp/wle_pp_bundle/bundle/pp/bundle.js b/wle_pp/wle_pp_bundle/bundle/pp/bundle.js index abc6af1..ce618bd 100644 --- a/wle_pp/wle_pp_bundle/bundle/pp/bundle.js +++ b/wle_pp/wle_pp_bundle/bundle/pp/bundle.js @@ -17698,13 +17698,13 @@ var convertCharacterColliderSetupToCollisionCheckParams = /* @__PURE__ */ functi outCollisionCheckParams.myVerticalObjectsToIgnore.pp_copy(characterColliderSetup.myVerticalCheckParams.myVerticalCheckObjectsToIgnore); outCollisionCheckParams.myHorizontalBlockColliderType = characterColliderSetup.myHorizontalCheckParams.myHorizontalBlockColliderType; outCollisionCheckParams.myVerticalBlockColliderType = characterColliderSetup.myVerticalCheckParams.myVerticalBlockColliderType; - outCollisionCheckParams.mySnapOnGroundEnabled = characterColliderSetup.myGroundParams.mySurfaceSnapEnabled; + outCollisionCheckParams.mySnapOnGroundEnabled = characterColliderSetup.myGroundParams.mySurfaceSnapMaxDistance > 0; outCollisionCheckParams.mySnapOnGroundExtraDistance = characterColliderSetup.myGroundParams.mySurfaceSnapMaxDistance; - outCollisionCheckParams.mySnapOnCeilingEnabled = characterColliderSetup.myCeilingParams.mySurfaceSnapEnabled; + outCollisionCheckParams.mySnapOnCeilingEnabled = characterColliderSetup.myCeilingParams.mySurfaceSnapMaxDistance > 0; outCollisionCheckParams.mySnapOnCeilingExtraDistance = characterColliderSetup.myCeilingParams.mySurfaceSnapMaxDistance; - outCollisionCheckParams.myGroundPopOutEnabled = characterColliderSetup.myGroundParams.mySurfacePopOutEnabled; + outCollisionCheckParams.myGroundPopOutEnabled = characterColliderSetup.myGroundParams.mySurfacePopOutMaxDistance > 0; outCollisionCheckParams.myGroundPopOutExtraDistance = characterColliderSetup.myGroundParams.mySurfacePopOutMaxDistance; - outCollisionCheckParams.myCeilingPopOutEnabled = characterColliderSetup.myCeilingParams.mySurfacePopOutEnabled; + outCollisionCheckParams.myCeilingPopOutEnabled = characterColliderSetup.myCeilingParams.mySurfacePopOutMaxDistance > 0; outCollisionCheckParams.myCeilingPopOutExtraDistance = characterColliderSetup.myCeilingParams.mySurfacePopOutMaxDistance; outCollisionCheckParams.myGroundAngleToIgnore = characterColliderSetup.myGroundParams.mySurfaceAngleToIgnore; outCollisionCheckParams.myGroundAngleToIgnoreWithPerceivedAngle = characterColliderSetup.myGroundParams.mySurfaceAngleToIgnoreWithSurfacePerceivedAngle; @@ -20803,12 +20803,14 @@ var Mouse = class { } setContextMenuActive(active) { if (this._myContextMenuActive != active) { - if (active) { - document.body.removeEventListener("contextmenu", this._myPreventContextMenuEventListener); - } else { - document.body.addEventListener("contextmenu", this._myPreventContextMenuEventListener, false); - } this._myContextMenuActive = active; + if (this._myActive) { + if (active) { + document.body.removeEventListener("contextmenu", this._myPreventContextMenuEventListener); + } else { + document.body.addEventListener("contextmenu", this._myPreventContextMenuEventListener, false); + } + } } } isMiddleButtonScrollActive() { @@ -20816,12 +20818,14 @@ var Mouse = class { } setMiddleButtonScrollActive(active) { if (this._myMiddleButtonScrollActive != active) { - if (active) { - document.body.removeEventListener("mousedown", this._myPreventMiddleButtonScrollEventListener); - } else { - document.body.addEventListener("mousedown", this._myPreventMiddleButtonScrollEventListener, false); - } this._myMiddleButtonScrollActive = active; + if (this._myActive) { + if (active) { + document.body.removeEventListener("mousedown", this._myPreventMiddleButtonScrollEventListener); + } else { + document.body.addEventListener("mousedown", this._myPreventMiddleButtonScrollEventListener, false); + } + } } } setResetMovingDelay(delay) { @@ -20970,7 +20974,7 @@ var InputManager = class { _myTrackedHandPoses; _myGamepadsManager = new GamepadsManager(); _myStarted = false; - _myActive = true; + _myActive = false; _myTrackedHandPosesEnabled = true; _myTrackedHandPosesStarted = false; _myPreUpdateEmitter = new Emitter6(); @@ -21054,6 +21058,9 @@ var InputManager = class { } this._myGamepadsManager.start(); this._myStarted = true; + const currentActive = this._myActive; + this._myActive = !this._myActive; + this.setActive(currentActive); } update(dt) { if (!this._myActive) @@ -21156,6 +21163,9 @@ var InputManager = class { this._myTrackedHandPoses[handedness].setReferenceObject(Globals.getPlayerObjects(this._myEngine).myReferenceSpace); this._myTrackedHandPoses[handedness].setForwardFixed(Globals.isPoseForwardFixed(this._myEngine)); this._myTrackedHandPoses[handedness].start(); + if (this._myStarted) { + this._myTrackedHandPoses[handedness].setActive(this._myActive); + } } this._myTrackedHandPosesStarted = true; } @@ -21206,7 +21216,6 @@ var InputManagerComponent = class extends Component14 { }; init() { this._myInputManager = null; - this._myPoseForwardFixedGlobal = this._myPoseForwardFixed; } update(dt) { if (Globals.getInputManager(this.engine) == this._myInputManager) { @@ -21250,7 +21259,7 @@ var InputManagerComponent = class extends Component14 { Globals.setInputManager(this._myInputManager, this.engine); } if (!Globals.hasPoseForwardFixed(this.engine)) { - Globals.setPoseForwardFixed(this._myPoseForwardFixedGlobal, this.engine); + Globals.setPoseForwardFixed(this._myPoseForwardFixed, this.engine); } } onDeactivate() { @@ -21260,7 +21269,7 @@ var InputManagerComponent = class extends Component14 { Globals.removeInputManager(this.engine); } } - if (Globals.isPoseForwardFixed(this.engine) == this._myPoseForwardFixedGlobal) { + if (Globals.isPoseForwardFixed(this.engine) == this._myPoseForwardFixed) { Globals.removePoseForwardFixed(this.engine); } } @@ -24191,21 +24200,16 @@ function _initEmitterModPrototype() { add(listener, opts = {}) { const { once = false, id = void 0 } = opts; const data = { id, once, callback: listener }; - const _transactions = this._transactions; - if (data.id !== void 0) { - _transactions.pp_removeAll((elementToCheck) => { - return elementToCheck.data.id === data.id; - }); - this._listeners.pp_removeAll((listener2) => { - return listener2.id === data.id; - }); - } const _notifying = this._notifying; if (_notifying) { + const _transactions = this._transactions; _transactions.push({ type: 1, data }); - return this; + } else { + this._listeners.pp_removeAll((listener2) => { + return data.id !== void 0 && listener2.id === data.id || data.id === void 0 && listener2.id === void 0 && listener2.callback === data.callback; + }); + this._listeners.push(data); } - this._listeners.push(data); return this; }, _flushTransactions() { @@ -24214,6 +24218,9 @@ function _initEmitterModPrototype() { for (let i = 0; i < _transactions.length; i++) { const transaction = _transactions[i]; if (transaction.type == 1) { + this._listeners.pp_removeAll((listener) => { + return transaction.data.id !== void 0 && listener.id === transaction.data.id || transaction.data.id === void 0 && listener.id === void 0 && listener.callback === transaction.data.callback; + }); listeners.push(transaction.data); } else { this.remove(transaction.data); @@ -24317,7 +24324,7 @@ function _initCursorComponentModPrototype() { this._tripleClickTimer -= dt; } if (XRUtils.isSessionActive(this.engine) && this._viewComponent == null) { - if (Globals.getHandPose(this.handedness, this.engine).getInputSourceType() != null) { + if (this.handedness == null || Globals.getHandPose(this.handedness, this.engine).getInputSourceType() != null) { if (this.arTouchDown && this._pp_isAR()) { let axes = XRUtils.getSession(this.engine).inputSources[0].gamepad.axes; this._direction.vec3_set(axes[0], -axes[1], -1); @@ -24366,7 +24373,7 @@ function _initCursorComponentModPrototype() { } } if (this.cursorRayObject) { - if (XRUtils.isSessionActive(this.engine) && this._viewComponent == null || !XRUtils.isSessionActive(this.engine) && this._viewComponent != null && this.handedness != Handedness.LEFT && this.handedness != Handedness.RIGHT) { + if (XRUtils.isSessionActive(this.engine) && this._viewComponent == null || !XRUtils.isSessionActive(this.engine) && this._viewComponent != null && this.handedness == null) { this.cursorRayObject.pp_setActive(true); } else { this.cursorRayObject.pp_setActive(false); @@ -25079,7 +25086,7 @@ function initPlugins() { } // dist/pp/pp/pp_version.js -var PP_VERSION = "0.7.2"; +var PP_VERSION = "0.7.3"; // dist/pp/pp/init_pp.js function initPP(engine) { @@ -31720,9 +31727,7 @@ var CharacterColliderWallSlideParams = class { }; var CharacterColliderSurfaceParams = class { constructor() { - this.mySurfaceSnapEnabled = false; this.mySurfaceSnapMaxDistance = 0; - this.mySurfacePopOutEnabled = false; this.mySurfacePopOutMaxDistance = 0; this.mySurfaceAngleToIgnore = 0; this.mySurfaceAngleToIgnoreWithSurfacePerceivedAngle = null; @@ -31902,9 +31907,7 @@ CharacterColliderWallSlideParams.prototype.copy = function copy24(other) { this.my90DegreesWallSlideAdjustDirectionSign = other.my90DegreesWallSlideAdjustDirectionSign; }; CharacterColliderSurfaceParams.prototype.copy = function copy25(other) { - this.mySurfaceSnapEnabled = other.mySurfaceSnapEnabled; this.mySurfaceSnapMaxDistance = other.mySurfaceSnapMaxDistance; - this.mySurfacePopOutEnabled = other.mySurfacePopOutEnabled; this.mySurfacePopOutMaxDistance = other.mySurfacePopOutMaxDistance; this.mySurfaceAngleToIgnore = other.mySurfaceAngleToIgnore; this.mySurfaceAngleToIgnoreWithSurfacePerceivedAngle = other.mySurfaceAngleToIgnoreWithSurfacePerceivedAngle; @@ -32076,11 +32079,8 @@ function createSimplified(simplifiedCreationParams, outCharacterColliderSetup = } outCharacterColliderSetup.myWallSlideParams.myWallSlideEnabled = simplifiedCreationParams.myShouldSlideAlongWall; outCharacterColliderSetup.myHorizontalCheckParams.myHorizontalCheckFeetDistanceToIgnore = simplifiedCreationParams.myMaxWalkableGroundStepHeight; - outCharacterColliderSetup.myGroundParams.mySurfaceSnapEnabled = simplifiedCreationParams.myMaxDistanceToSnapOnGround > 0; outCharacterColliderSetup.myGroundParams.mySurfaceSnapMaxDistance = simplifiedCreationParams.myMaxDistanceToSnapOnGround; - outCharacterColliderSetup.myGroundParams.mySurfacePopOutEnabled = simplifiedCreationParams.myMaxDistanceToPopOutGround > 0; - outCharacterColliderSetup.myGroundParams.mySurfacePopOutMaxDistance = simplifiedCreationParams.myMaxDistanceToPopOutGround; - outCharacterColliderSetup.myGroundParams.mySurfacePopOutMaxDistance = Math.max(outCharacterColliderSetup.myGroundParams.mySurfacePopOutMaxDistance, outCharacterColliderSetup.myHorizontalCheckParams.myHorizontalCheckFeetDistanceToIgnore); + outCharacterColliderSetup.myGroundParams.mySurfacePopOutMaxDistance = Math.max(simplifiedCreationParams.myMaxDistanceToPopOutGround, outCharacterColliderSetup.myHorizontalCheckParams.myHorizontalCheckFeetDistanceToIgnore); outCharacterColliderSetup.myGroundParams.myHorizontalMovementSurfaceAngleToIgnoreMaxHorizontalMovementLeft = simplifiedCreationParams.myRadius * 0.75; outCharacterColliderSetup.myGroundParams.myCollectSurfaceInfo = simplifiedCreationParams.myCollectGroundInfo || simplifiedCreationParams.myMaxWalkableGroundAngle > 0; outCharacterColliderSetup.myGroundParams.mySurfaceAngleToIgnore = simplifiedCreationParams.myMaxWalkableGroundAngle; @@ -32100,9 +32100,7 @@ function createSimplified(simplifiedCreationParams, outCharacterColliderSetup = } outCharacterColliderSetup.myHorizontalCheckParams.myHorizontalCheckHeadDistanceToIgnore = simplifiedCreationParams.myMaxWalkableCeilingStepHeight; if (simplifiedCreationParams.myCheckCeilings) { - outCharacterColliderSetup.myCeilingParams.mySurfacePopOutEnabled = outCharacterColliderSetup.myGroundParams.mySurfacePopOutEnabled; - outCharacterColliderSetup.myCeilingParams.mySurfacePopOutMaxDistance = simplifiedCreationParams.myMaxDistanceToPopOutGround; - outCharacterColliderSetup.myCeilingParams.mySurfacePopOutMaxDistance = Math.max(outCharacterColliderSetup.myCeilingParams.mySurfacePopOutMaxDistance, outCharacterColliderSetup.myHorizontalCheckParams.myHorizontalCheckHeadDistanceToIgnore); + outCharacterColliderSetup.myCeilingParams.mySurfacePopOutMaxDistance = Math.max(simplifiedCreationParams.myMaxDistanceToPopOutGround, outCharacterColliderSetup.myHorizontalCheckParams.myHorizontalCheckHeadDistanceToIgnore); outCharacterColliderSetup.myCeilingParams.myHorizontalMovementSurfaceAngleToIgnoreMaxHorizontalMovementLeft = outCharacterColliderSetup.myGroundParams.myHorizontalMovementSurfaceAngleToIgnoreMaxHorizontalMovementLeft; outCharacterColliderSetup.myCeilingParams.myCollectSurfaceInfo = outCharacterColliderSetup.myGroundParams.myCollectSurfaceInfo; outCharacterColliderSetup.myCeilingParams.mySurfaceAngleToIgnore = outCharacterColliderSetup.myGroundParams.mySurfaceAngleToIgnore; @@ -33344,7 +33342,7 @@ var PlayerTransformManagerParams = class { */ myHeadCollisionBlockLayerFlagsForResetToFeet = null; myRotateOnlyIfSynced = false; - myResetRealResetRotationIfUpChanged = true; + myResetRealResetRotationIfUpChanged = false; /** * This make it so the head must be able to reach from the feet to the real head, sort of * like you were teleported in a space squashed to your feet and then have to get up @@ -33357,10 +33355,10 @@ var PlayerTransformManagerParams = class { /** This other flag is to fix the above issue, doing the "squash and get up" only if the head is not reachable normally The above issue can still happen but should be more rare, only if you teleport to a place where there could be garbage stuff */ myResetHeadToFeetInsteadOfRealOnlyIfRealNotReachable = false; - myResetHeadToFeetMoveTowardReal = true; + myResetHeadToFeetMoveTowardReal = false; /* Can be used to specify that the head should reset a bit above the actual feet level, so to avoid small objects that could very frequently happen to be close to the floor */ - myResetHeadToFeetUpOffset = 0.25; + myResetHeadToFeetUpOffset = 0; myResetHeadToFeetGroudnAngleIgnoreEnabled = false; myResetHeadToRealMinDistance = 0; // #TODO Set valid if head synced (head manager) (not sure what I meant with this?) @@ -33370,7 +33368,7 @@ var PlayerTransformManagerParams = class { // #TODO Real movement apply vertical snap or not (other option to apply gravity) // (gravity inside this class?) only when movement is applied not for head only) myUpdatePositionValid = false; - myUpdatePositionHeadValid = true; + myUpdatePositionHeadValid = false; myUpdateRealPositionValid = false; myUpdateRealPositionHeadValid = false; myMinHeight = null; @@ -33414,31 +33412,6 @@ var PlayerTransformManagerParams = class { myEngine; constructor(engine = Globals.getMainEngine()) { this.myEngine = engine; - this.mySyncEnabledFlagMap.set(PlayerTransformManagerSyncFlag.BODY_COLLIDING, true); - this.mySyncEnabledFlagMap.set(PlayerTransformManagerSyncFlag.HEAD_COLLIDING, true); - this.mySyncEnabledFlagMap.set(PlayerTransformManagerSyncFlag.FAR, true); - this.mySyncEnabledFlagMap.set(PlayerTransformManagerSyncFlag.FLOATING, true); - this.mySyncEnabledFlagMap.set(PlayerTransformManagerSyncFlag.HEIGHT_COLLIDING, true); - this.mySyncPositionFlagMap.set(PlayerTransformManagerSyncFlag.BODY_COLLIDING, true); - this.mySyncPositionFlagMap.set(PlayerTransformManagerSyncFlag.HEAD_COLLIDING, false); - this.mySyncPositionFlagMap.set(PlayerTransformManagerSyncFlag.FAR, true); - this.mySyncPositionFlagMap.set(PlayerTransformManagerSyncFlag.FLOATING, true); - this.mySyncPositionFlagMap.set(PlayerTransformManagerSyncFlag.HEIGHT_COLLIDING, false); - this.mySyncPositionHeadFlagMap.set(PlayerTransformManagerSyncFlag.BODY_COLLIDING, false); - this.mySyncPositionHeadFlagMap.set(PlayerTransformManagerSyncFlag.HEAD_COLLIDING, true); - this.mySyncPositionHeadFlagMap.set(PlayerTransformManagerSyncFlag.FAR, false); - this.mySyncPositionHeadFlagMap.set(PlayerTransformManagerSyncFlag.FLOATING, false); - this.mySyncPositionHeadFlagMap.set(PlayerTransformManagerSyncFlag.HEIGHT_COLLIDING, false); - this.mySyncRotationFlagMap.set(PlayerTransformManagerSyncFlag.BODY_COLLIDING, false); - this.mySyncRotationFlagMap.set(PlayerTransformManagerSyncFlag.HEAD_COLLIDING, false); - this.mySyncRotationFlagMap.set(PlayerTransformManagerSyncFlag.FAR, false); - this.mySyncRotationFlagMap.set(PlayerTransformManagerSyncFlag.FLOATING, false); - this.mySyncRotationFlagMap.set(PlayerTransformManagerSyncFlag.HEIGHT_COLLIDING, false); - this.mySyncHeightFlagMap.set(PlayerTransformManagerSyncFlag.BODY_COLLIDING, false); - this.mySyncHeightFlagMap.set(PlayerTransformManagerSyncFlag.HEAD_COLLIDING, false); - this.mySyncHeightFlagMap.set(PlayerTransformManagerSyncFlag.FAR, false); - this.mySyncHeightFlagMap.set(PlayerTransformManagerSyncFlag.FLOATING, false); - this.mySyncHeightFlagMap.set(PlayerTransformManagerSyncFlag.HEIGHT_COLLIDING, true); } }; var PlayerTransformManager = class _PlayerTransformManager { @@ -37440,9 +37413,9 @@ var PlayerLocomotionType; })(PlayerLocomotionType || (PlayerLocomotionType = {})); var PlayerLocomotionParams = class { myDefaultLocomotionType = PlayerLocomotionType.SMOOTH; - myAlwaysSmoothForNonVR = true; + myAlwaysSmoothForNonVR = false; /** Double press main hand thumbstick (default: left) to switch */ - mySwitchLocomotionTypeShortcutEnabled = true; + mySwitchLocomotionTypeShortcutEnabled = false; myStartIdle = false; myPhysicsBlockLayerFlags = new PhysicsLayerFlags(); myDefaultHeight = 0; @@ -37453,7 +37426,7 @@ var PlayerLocomotionParams = class { myForeheadExtraHeight = 0; myMaxSpeed = 0; myMaxRotationSpeed = 0; - mySpeedSlowDownPercentageOnWallSlid = 1; + mySpeedSlowDownPercentageOnWallSlid = 0; myGravityAcceleration = 0; myMaxGravitySpeed = 0; myIsSnapTurn = false; @@ -37470,7 +37443,7 @@ var PlayerLocomotionParams = class { myMinAngleToFlyDownVR = 0; myMinAngleToFlyRight = 0; myMainHand = Handedness.LEFT; - myDirectionInvertForwardWhenUpsideDown = true; + myDirectionInvertForwardWhenUpsideDown = false; myVRDirectionReferenceType = PlayerLocomotionDirectionReferenceType.HEAD; myVRDirectionReferenceObject = null; myTeleportType = PlayerLocomotionTeleportTeleportType.INSTANT; @@ -37483,7 +37456,7 @@ var PlayerLocomotionParams = class { myTeleportPositionObject = null; myTeleportPositionObjectRotateWithHead = false; myTeleportParableStartReferenceObject = null; - myResetRealOnStart = true; + myResetRealOnStart = false; /** * #WARN With `_myResetRealOnStartFramesAmount` at `1` it can happen that you enter the session like 1 frame before the game load * and the head pose might have not been properly initialized yet in the WebXR API, so the reset real will not happen has expected @@ -37496,19 +37469,19 @@ var PlayerLocomotionParams = class { * For example, if u have a total fade at start and nothing can be seen aside the clear color for at least, let's say, 10 frames, * you can set this to `3` safely, since there will be no visible stutter to be seen (beside the clear color) */ - myResetRealOnStartFramesAmount = 1; + myResetRealOnStartFramesAmount = 0; /** Can fix some head through floor issues, when you can move your head completely to the other side of the floor If the floors are thick enough that this can't happen, you can leave this to false */ myResetHeadToFeetInsteadOfReal = false; myResetHeadToRealMinDistance = 0; myMaxHeadToRealHeadSteps = null; /** Valid means, for example, that the real player has not moved inside a wall by moving in the real space */ - mySyncWithRealWorldPositionOnlyIfValid = true; + mySyncWithRealWorldPositionOnlyIfValid = false; /** Valid means, for example, that the real player has not moved inside a wall by moving in the real space */ - mySyncWithRealHeightOnlyIfValid = true; + mySyncWithRealHeightOnlyIfValid = false; mySnapRealPositionToGround = false; myPreventRealFromColliding = false; - myViewOcclusionInsideWallsEnabled = true; + myViewOcclusionInsideWallsEnabled = false; myViewOcclusionLayerFlags = new PhysicsLayerFlags(); /** * To avoid occlusion issues when moving when touching a tilted ceiling (which is not commong anyway), @@ -37581,7 +37554,7 @@ var PlayerLocomotionParams = class { myColliderExtraHeight = 0; /** Main hand (default: left) select + thumbstick press, auto switch to smooth */ myDebugFlyShortcutEnabled = false; - myDebugFlyMaxSpeedMultiplier = 5; + myDebugFlyMaxSpeedMultiplier = 0; /** Main hand (default: left) thumbstick pressed while moving */ myMoveThroughCollisionShortcutEnabled = false; /** Not main hand (default: right) thumbstick pressed while moving */ @@ -37645,6 +37618,31 @@ var PlayerLocomotion = class { params2.myTeleportCollisionCheckParamsCopyFromMovement = true; params2.myTeleportCollisionCheckParamsCheck360 = true; params2.myTeleportCollisionCheckParamsGroundAngleToIgnore = this._myParams.myColliderMaxTeleportableGroundAngle; + params2.mySyncEnabledFlagMap.set(PlayerTransformManagerSyncFlag.BODY_COLLIDING, true); + params2.mySyncEnabledFlagMap.set(PlayerTransformManagerSyncFlag.HEAD_COLLIDING, true); + params2.mySyncEnabledFlagMap.set(PlayerTransformManagerSyncFlag.FAR, true); + params2.mySyncEnabledFlagMap.set(PlayerTransformManagerSyncFlag.FLOATING, true); + params2.mySyncEnabledFlagMap.set(PlayerTransformManagerSyncFlag.HEIGHT_COLLIDING, true); + params2.mySyncPositionFlagMap.set(PlayerTransformManagerSyncFlag.BODY_COLLIDING, true); + params2.mySyncPositionFlagMap.set(PlayerTransformManagerSyncFlag.HEAD_COLLIDING, false); + params2.mySyncPositionFlagMap.set(PlayerTransformManagerSyncFlag.FAR, true); + params2.mySyncPositionFlagMap.set(PlayerTransformManagerSyncFlag.FLOATING, true); + params2.mySyncPositionFlagMap.set(PlayerTransformManagerSyncFlag.HEIGHT_COLLIDING, false); + params2.mySyncPositionHeadFlagMap.set(PlayerTransformManagerSyncFlag.BODY_COLLIDING, false); + params2.mySyncPositionHeadFlagMap.set(PlayerTransformManagerSyncFlag.HEAD_COLLIDING, true); + params2.mySyncPositionHeadFlagMap.set(PlayerTransformManagerSyncFlag.FAR, false); + params2.mySyncPositionHeadFlagMap.set(PlayerTransformManagerSyncFlag.FLOATING, false); + params2.mySyncPositionHeadFlagMap.set(PlayerTransformManagerSyncFlag.HEIGHT_COLLIDING, false); + params2.mySyncRotationFlagMap.set(PlayerTransformManagerSyncFlag.BODY_COLLIDING, false); + params2.mySyncRotationFlagMap.set(PlayerTransformManagerSyncFlag.HEAD_COLLIDING, false); + params2.mySyncRotationFlagMap.set(PlayerTransformManagerSyncFlag.FAR, false); + params2.mySyncRotationFlagMap.set(PlayerTransformManagerSyncFlag.FLOATING, false); + params2.mySyncRotationFlagMap.set(PlayerTransformManagerSyncFlag.HEIGHT_COLLIDING, false); + params2.mySyncHeightFlagMap.set(PlayerTransformManagerSyncFlag.BODY_COLLIDING, false); + params2.mySyncHeightFlagMap.set(PlayerTransformManagerSyncFlag.HEAD_COLLIDING, false); + params2.mySyncHeightFlagMap.set(PlayerTransformManagerSyncFlag.FAR, false); + params2.mySyncHeightFlagMap.set(PlayerTransformManagerSyncFlag.FLOATING, false); + params2.mySyncHeightFlagMap.set(PlayerTransformManagerSyncFlag.HEIGHT_COLLIDING, true); params2.myHeadCollisionBlockLayerFlags.copy(this._myParams.myViewOcclusionLayerFlags); params2.myHeadCollisionObjectsToIgnore.pp_copy(params2.myMovementCollisionCheckParams.myHorizontalObjectsToIgnore); const objectsEqualCallback = (first2, second) => first2 == second; @@ -37666,8 +37664,8 @@ var PlayerLocomotion = class { if (!this._myParams.myViewOcclusionInsideWallsEnabled) { params2.mySyncEnabledFlagMap.set(PlayerTransformManagerSyncFlag.HEAD_COLLIDING, false); params2.myAlwaysSyncHeadPositionWithReal = true; - params2.myUpdatePositionHeadValid = false; - params2.myUpdateRealPositionHeadValid = false; + } else { + params2.myUpdatePositionHeadValid = true; } params2.myApplyRealToValidAdjustmentsToRealPositionToo = this._myParams.mySnapRealPositionToGround; params2.myPreventRealFromColliding = this._myParams.myPreventRealFromColliding; @@ -37712,6 +37710,9 @@ var PlayerLocomotion = class { params2.myNeverResetRealPositionVR = false; params2.myNeverResetRealRotationVR = false; params2.myNeverResetRealHeightVR = true; + params2.myResetRealResetRotationIfUpChanged = true; + params2.myResetHeadToFeetMoveTowardReal = true; + params2.myResetHeadToFeetUpOffset = 0.25; params2.myDebugEnabled = false; this._myPlayerTransformManager = new PlayerTransformManager(params2); } @@ -38624,6 +38625,9 @@ var PlayerLocomotionComponent = class extends Component43 { setPlayerLocomotionOnGlobals = this._onActivate(); this._myActivateOnNextPostPoseUpdate = false; } + if (!this._myPlayerLocomotion.isStarted()) { + this._myPlayerLocomotion.start(); + } if (!setPlayerLocomotionOnGlobals && Globals.hasPlayerLocomotion(this.engine) && Globals.getPlayerLocomotion(this.engine) != this._myPlayerLocomotion) return; let startTime = 0; @@ -38638,9 +38642,6 @@ var PlayerLocomotionComponent = class extends Component43 { if (this._myRaycastCountLogEnabled && Globals.isDebugEnabled(this.engine)) { PhysicsUtils.resetRaycastCount(this.engine.physics); } - if (!this._myPlayerLocomotion.isStarted()) { - this._myPlayerLocomotion.start(); - } this._myPlayerLocomotion.update(dt); if (this._myPerformanceLogEnabled && Globals.isDebugEnabled(this.engine)) { const endTime = window.performance.now(); @@ -43380,10 +43381,15 @@ var ConsoleVRWidget = class { cursorTarget.onDown.add(this._setScrollUp.bind(this, true), { id: this }); cursorTarget.onDownOnHover.add(this._setScrollUp.bind(this, true), { id: this }); cursorTarget.onUp.add(this._setScrollUp.bind(this, false), { id: this }); - cursorTarget.onUnhover.add(this._setScrollUp.bind(this, false), { id: this }); + cursorTarget.onUnhover.add(() => { + this._setScrollUp(false); + this._genericUnhover(backgroundMaterial); + }, { id: this }); cursorTarget.onHover.add(this._genericHover.bind(this, backgroundMaterial), { id: this }); - cursorTarget.onUnhover.add(this._genericUnhover.bind(this, backgroundMaterial), { id: this }); - this._myUnhoverCallbacks.push(this._genericUnhover.bind(this, backgroundMaterial)); + this._myUnhoverCallbacks.push(() => { + this._setScrollUp(false); + this._genericUnhover(backgroundMaterial); + }); } { let cursorTarget = ui.myDownButtonCursorTargetComponent; @@ -43392,10 +43398,15 @@ var ConsoleVRWidget = class { cursorTarget.onDown.add(this._setScrollDown.bind(this, true), { id: this }); cursorTarget.onDownOnHover.add(this._setScrollDown.bind(this, true), { id: this }); cursorTarget.onUp.add(this._setScrollDown.bind(this, false), { id: this }); - cursorTarget.onUnhover.add(this._setScrollDown.bind(this, false), { id: this }); + cursorTarget.onUnhover.add(() => { + this._setScrollDown(false); + this._genericUnhover(backgroundMaterial); + }, { id: this }); cursorTarget.onHover.add(this._genericHover.bind(this, backgroundMaterial), { id: this }); - cursorTarget.onUnhover.add(this._genericUnhover.bind(this, backgroundMaterial), { id: this }); - this._myUnhoverCallbacks.push(this._genericUnhover.bind(this, backgroundMaterial)); + this._myUnhoverCallbacks.push(() => { + this._setScrollDown(false); + this._genericUnhover(backgroundMaterial); + }); } { let cursorTarget = ui.myNotifyIconCursorTargetComponent; diff --git a/wle_pp/wle_pp_bundle/bundle/pp/bundle.js.map b/wle_pp/wle_pp_bundle/bundle/pp/bundle.js.map index ec7edb4..54e0f5e 100644 --- a/wle_pp/wle_pp_bundle/bundle/pp/bundle.js.map +++ b/wle_pp/wle_pp_bundle/bundle/pp/bundle.js.map @@ -1,7 +1,7 @@ { "version": 3, "sources": ["../../src/pp/index.ts", "../../src/pp/tool/easy_tune/easy_object_tuners/components/easy_active_component.ts", "../../src/pp/cauldron/wl/utils/component_utils.js", "../../src/pp/audio/audio_globals.ts", "../../src/pp/cauldron/cauldron/analytics_globals.ts", "../../src/pp/cauldron/cauldron/save_globals.ts", "../../src/pp/cauldron/object_pool/object_pool_globals.ts", "../../src/pp/cauldron/visual/visual_globals.ts", "../../src/pp/cauldron/wl/engine_globals.ts", "../../src/pp/cauldron/wl/getters/default_resources_globals.ts", "../../src/pp/cauldron/wl/getters/scene_objects_globals.ts", "../../src/pp/debug/debug_globals.ts", "../../src/pp/gameplay/experimental/character_controller/collision/character_collision_system_globals.ts", "../../src/pp/gameplay/experimental/locomotion/player_locomotion_globals.ts", "../../src/pp/input/cauldron/input_globals.ts", "../../src/pp/tool/cauldron/tool_globals.ts", "../../src/pp/tool/console_vr/console_vr_globals.ts", "../../src/pp/tool/easy_tune/easy_tune_globals.ts", "../../src/pp/pp/globals.ts", "../../src/pp/cauldron/utils/array/mat3_utils.ts", "../../src/pp/cauldron/utils/array/quat_utils.ts", "../../src/pp/cauldron/utils/math_utils.ts", "../../src/pp/cauldron/utils/array/array_utils.ts", "../../src/pp/cauldron/utils/array/vec3_utils.ts", "../../src/pp/cauldron/utils/array/mat4_utils.ts", "../../src/pp/cauldron/utils/array/quat2_utils.ts", "../../src/pp/cauldron/utils/array/vec_allocation_utils.ts", "../../src/pp/cauldron/wl/utils/object_utils.ts", "../../src/pp/cauldron/wl/utils/wl_component_default_clone_callbacks.js", "../../src/pp/cauldron/wl/utils/mesh_utils.js", "../../src/pp/cauldron/utils/array/vec2_utils.ts", "../../src/pp/cauldron/utils/array/vec4_utils.ts", "../../src/pp/cauldron/utils/array/vec_utils.ts", "../../src/pp/plugin/js/extensions/array/vec_create_extension.ts", "../../src/pp/tool/easy_tune/easy_tune_variable_types.ts", "../../src/pp/tool/easy_tune/easy_tune_utils.ts", "../../src/pp/tool/easy_tune/easy_object_tuners/easy_object_tuner.ts", "../../src/pp/tool/easy_tune/easy_object_tuners/easy_active.ts", "../../src/pp/pp/register_pp_components.js", "../../src/pp/pp/components/pp_gateway_component.ts", "../../src/pp/audio/components/audio_manager_component.js", "../../src/pp/audio/audio_manager.js", "../../src/pp/audio/audio_player.js", "../../src/pp/audio/audio_setup.ts", "../../src/pp/cauldron/cauldron/components/analytics_manager_component.js", "../../src/pp/cauldron/utils/xr_utils.ts", "../../src/pp/cauldron/utils/browser_utils.js", "../../src/pp/cauldron/cauldron/analytics_manager.ts", "../../src/pp/cauldron/cauldron/components/clear_console_component.ts", "../../src/pp/cauldron/cauldron/components/save_manager_component.js", "../../src/pp/cauldron/cauldron/save_manager.js", "../../src/pp/cauldron/utils/save_utils.ts", "../../src/pp/cauldron/cauldron/timer.ts", "../../src/pp/cauldron/object_pool/components/object_pool_manager_component.js", "../../src/pp/cauldron/object_pool/object_pool_manager.ts", "../../src/pp/cauldron/visual/components/visual_manager_component.js", "../../src/pp/cauldron/object_pool/object_pool.ts", "../../src/pp/cauldron/visual/elements/visual_arrow.js", "../../src/pp/cauldron/visual/elements/visual_element.ts", "../../src/pp/cauldron/visual/elements/visual_element_types.ts", "../../src/pp/cauldron/visual/elements/visual_line.js", "../../src/pp/cauldron/visual/elements/visual_mesh.ts", "../../src/pp/cauldron/visual/elements/visual_point.js", "../../src/pp/cauldron/physics/physics_utils.ts", "../../src/pp/cauldron/physics/physics_layer_flags.js", "../../src/pp/cauldron/physics/physics_raycast_params.ts", "../../src/pp/cauldron/visual/elements/visual_raycast.js", "../../src/pp/cauldron/visual/elements/visual_text.js", "../../src/pp/cauldron/visual/elements/visual_torus.js", "../../src/pp/cauldron/visual/elements/visual_transform.js", "../../src/pp/cauldron/visual/visual_manager.ts", "../../src/pp/cauldron/visual/visual_resources.ts", "../../src/pp/cauldron/wl/components/add_wl_to_window_component.js", "../../src/pp/cauldron/wl/getters/components/get_default_resources_component.js", "../../src/pp/cauldron/wl/getters/default_resources.ts", "../../src/pp/cauldron/wl/getters/components/get_scene_objects_component.js", "../../src/pp/input/cauldron/input_types.ts", "../../src/pp/cauldron/wl/getters/scene_objects.ts", "../../src/pp/debug/components/debug_manager_component.js", "../../src/pp/debug/debug_visual_manager.js", "../../src/pp/debug/debug_manager.js", "../../src/pp/debug/components/enable_debug_component.js", "../../src/pp/gameplay/experimental/character_controller/collision/components/character_collision_system_component.js", "../../src/pp/gameplay/experimental/character_controller/collision/character_collision_results.js", "../../src/pp/gameplay/experimental/character_controller/collision/legacy/collision_check/collision_params.js", "../../src/pp/gameplay/experimental/character_controller/collision/legacy/collision_check/collision_check_base.js", "../../src/pp/gameplay/experimental/character_controller/collision/legacy/collision_check/collision_check_surface.js", "../../src/pp/gameplay/experimental/character_controller/collision/legacy/collision_check/collision_check_horizontal_base.js", "../../src/pp/gameplay/experimental/character_controller/collision/legacy/collision_check/collision_check_horizontal_position.js", "../../src/pp/gameplay/experimental/character_controller/collision/legacy/collision_check/collision_check_horizontal_movement.js", "../../src/pp/gameplay/experimental/character_controller/collision/legacy/collision_check/collision_check_horizontal_sliding.js", "../../src/pp/gameplay/experimental/character_controller/collision/legacy/collision_check/collision_check_horizontal.js", "../../src/pp/gameplay/experimental/character_controller/collision/legacy/collision_check/collision_check_vertical.js", "../../src/pp/gameplay/experimental/character_controller/collision/legacy/collision_check/collision_check_move.js", "../../src/pp/gameplay/experimental/character_controller/collision/legacy/collision_check/collision_check_teleport.js", "../../src/pp/gameplay/experimental/character_controller/collision/legacy/collision_check/collision_check_position.js", "../../src/pp/gameplay/experimental/character_controller/collision/legacy/collision_check/collision_check.js", "../../src/pp/gameplay/experimental/character_controller/collision/collision_check_bridge.js", "../../src/pp/gameplay/experimental/character_controller/collision/character_collision_system.js", "../../src/pp/input/cauldron/components/input_manager_component.js", "../../src/pp/input/gamepad/gamepad.ts", "../../src/pp/input/gamepad/gamepad_buttons.ts", "../../src/pp/input/gamepad/gamepad_cores/gamepad_core.js", "../../src/pp/input/gamepad/gamepad_cores/classic_gamepad_core.js", "../../src/pp/input/cauldron/keyboard.js", "../../src/pp/input/gamepad/gamepad_cores/keyboard_gamepad_core.js", "../../src/pp/input/gamepad/gamepad_cores/xr_gamepad_core.js", "../../src/pp/input/cauldron/input_manager.ts", "../../src/pp/input/gamepad/universal_gamepad.ts", "../../src/pp/input/gamepad/cauldron/gamepads_manager.ts", "../../src/pp/input/pose/base_pose.js", "../../src/pp/input/cauldron/input_utils.ts", "../../src/pp/input/pose/hand_pose.js", "../../src/pp/input/pose/hand_ray_pose.js", "../../src/pp/input/pose/head_pose.js", "../../src/pp/input/pose/tracked_hand_joint_pose.js", "../../src/pp/input/pose/tracked_hand_pose.js", "../../src/pp/input/cauldron/mouse.js", "../../src/pp/tool/cauldron/components/enable_tool_component.js", "../../src/pp/tool/console_vr/components/init_console_vr_component.js", "../../src/pp/tool/console_vr/console_original_functions.js", "../../src/pp/tool/console_vr/console_vr.js", "../../src/pp/tool/easy_tune/components/init_easy_tune_variables_component.js", "../../src/pp/tool/easy_tune/easy_tune_variables.ts", "../../src/pp/cauldron/wl/register_wl_components.js", "../../src/pp/cauldron/utils/js_utils.js", "../../src/pp/plugin/utils/plugin_utils.ts", "../../src/pp/plugin/js/extensions/array/array_extension_utils.ts", "../../src/pp/plugin/js/extensions/array/array_extension.ts", "../../src/pp/plugin/js/extensions/array/mat3_extension.ts", "../../src/pp/plugin/js/extensions/array/mat4_extension.ts", "../../src/pp/plugin/js/extensions/array/quat2_extension.ts", "../../src/pp/plugin/js/extensions/array/quat_extension.ts", "../../src/pp/plugin/js/extensions/array/vec2_extension.ts", "../../src/pp/plugin/js/extensions/array/vec3_extension.ts", "../../src/pp/plugin/js/extensions/array/vec4_extension.ts", "../../src/pp/plugin/js/extensions/array/vec_extension.ts", "../../src/pp/plugin/js/extensions/math_extension.ts", "../../src/pp/plugin/js/extensions/number_extension.ts", "../../src/pp/plugin/js/extensions/init_js_extentions.ts", "../../src/pp/plugin/js/init_js_plugins.ts", "../../src/pp/plugin/wl/extensions/number_array_extension.ts", "../../src/pp/plugin/wl/extensions/object_extension.ts", "../../src/pp/plugin/wl/extensions/init_wl_extentions.ts", "../../src/pp/plugin/wl/mods/components/cauldron_mods.ts", "../../src/pp/plugin/wl/mods/components/cursor_component_mod.js", "../../src/pp/plugin/wl/mods/components/cursor_target_component_mod.ts", "../../src/pp/plugin/wl/mods/components/mouse_look_component_mod.js", "../../src/pp/plugin/wl/mods/components/init_component_mods.ts", "../../src/pp/plugin/wl/mods/init_wl_mods.ts", "../../src/pp/plugin/wl/init_wl_plugins.ts", "../../src/pp/plugin/init_plugins.ts", "../../src/pp/pp/pp_version.ts", "../../src/pp/pp/init_pp.ts", "../../src/pp/pp/components/add_pp_to_window_component.js", "../../src/pp/audio/audio_utils.js", "../../src/pp/audio/howler/howler_audio_player.js", "../../src/pp/audio/components/mute_everything_component.js", "../../src/pp/audio/components/spatial_audio_listener_component.js", "../../src/pp/cauldron/benchmarks/benchmark_max_physx_component.js", "../../src/pp/cauldron/physics/physics_collision_collector.ts", "../../src/pp/cauldron/benchmarks/benchmark_max_visible_triangles_component.js", "../../src/pp/cauldron/cauldron/components/adjust_hierarchy_physx_scale_component.js", "../../src/pp/cauldron/cauldron/components/reset_local_transform_component.ts", "../../src/pp/cauldron/cauldron/components/set_active_component.js", "../../src/pp/cauldron/cauldron/components/set_engine_log_level_component.ts", "../../src/pp/cauldron/cauldron/components/show_xr_buttons_component.ts", "../../src/pp/cauldron/fsm/fsm.ts", "../../src/pp/cauldron/fsm/states/condition_states/base_condition_state.ts", "../../src/pp/cauldron/fsm/states/condition_states/condition_state.ts", "../../src/pp/cauldron/fsm/states/condition_states/timer_state.ts", "../../src/pp/cauldron/fsm/states/condition_states/frames_countdown_state.ts", "../../src/pp/cauldron/fsm/states/condition_states/delay_state.ts", "../../src/pp/cauldron/fsm/states/cauldron/branch_state.ts", "../../src/pp/cauldron/utils/color_utils.ts", "../../src/pp/cauldron/utils/analytics_utils.ts", "../../src/pp/cauldron/wl/utils/material_utils.ts", "../../src/pp/cauldron/wl/utils/text_utils.js", "../../src/pp/debug/components/debug_transform_component.js", "../../src/pp/debug/components/show_fps_component.js", "../../src/pp/debug/components/toggle_active_on_button_press_component.ts", "../../src/pp/debug/debug_functions_overwriter/debug_functions_overwriter.js", "../../src/pp/debug/debug_functions_overwriter/debug_functions_performance_analyzer/debug_functions_performance_analyzer.js", "../../src/pp/debug/debug_functions_overwriter/debug_functions_performance_analyzer/debug_functions_performance_analysis_results_logger.js", "../../src/pp/debug/debug_functions_overwriter/debug_functions_performance_analyzer/components/debug_functions_performance_analyzer_component.js", "../../src/pp/debug/debug_functions_overwriter/debug_functions_performance_analyzer/components/debug_pp_functions_performance_analyzer_component.js", "../../src/pp/debug/debug_functions_overwriter/debug_functions_performance_analyzer/components/debug_array_functions_performance_analyzer_component.js", "../../src/pp/debug/debug_functions_overwriter/debug_functions_performance_analyzer/components/debug_pp_array_creation_performance_analyzer_component.js", "../../src/pp/debug/debug_functions_overwriter/debug_functions_performance_analyzer/components/debug_wl_function_performance_analyzer_component.js", "../../src/pp/debug/debug_functions_overwriter/debug_functions_performance_analyzer/components/debug_wl_components_function_performance_analyzer_component.js", "../../src/pp/gameplay/cauldron/cauldron/direction_2D_to_3D_converter.js", "../../src/pp/gameplay/cauldron/cauldron/number_over_factor.ts", "../../src/pp/gameplay/cauldron/cauldron/animated_number.ts", "../../src/pp/gameplay/cauldron/cauldron/components/cursor_button_component.ts", "../../src/pp/gameplay/cauldron/rough/components/scale_on_spawn_component.js", "../../src/pp/gameplay/grab_throw/grabbable_component.js", "../../src/pp/gameplay/grab_throw/grabber_hand_component.js", "../../src/pp/gameplay/integrations/construct_arcade/ca_utils.js", "../../src/pp/gameplay/integrations/construct_arcade/ca_dummy_server.js", "../../src/pp/gameplay/integrations/construct_arcade/ca_display_leaderboard_component.js", "../../src/pp/gameplay/experimental/character_controller/collision/legacy/collision_check/collision_check_utils.ts", "../../src/pp/gameplay/experimental/character_controller/collision/character_collider_setup.js", "../../src/pp/gameplay/experimental/character_controller/character_controller_utils.js", "../../src/pp/gameplay/experimental/character_controller/collision/character_collider_setup_utils.ts", "../../src/pp/gameplay/experimental/locomotion/legacy/locomotion/player_head_manager.ts", "../../src/pp/gameplay/experimental/locomotion/legacy/locomotion/player_transform_manager.ts", "../../src/pp/gameplay/experimental/locomotion/legacy/locomotion/player_locomotion_rotate.js", "../../src/pp/gameplay/experimental/locomotion/legacy/locomotion/player_locomotion_movement.js", "../../src/pp/gameplay/experimental/locomotion/legacy/locomotion/player_locomotion.ts", "../../src/pp/input/gamepad/cauldron/gamepad_utils.js", "../../src/pp/gameplay/experimental/locomotion/legacy/locomotion/player_obscure_manager.js", "../../src/pp/gameplay/experimental/locomotion/legacy/locomotion/teleport/player_locomotion_teleport_detection_state.js", "../../src/pp/gameplay/experimental/locomotion/legacy/locomotion/teleport/player_locomotion_teleport_detection_visualizer.js", "../../src/pp/gameplay/experimental/locomotion/legacy/locomotion/teleport/player_locomotion_teleport_parable.js", "../../src/pp/gameplay/experimental/locomotion/legacy/locomotion/teleport/player_locomotion_teleport_state.js", "../../src/pp/gameplay/experimental/locomotion/legacy/locomotion/teleport/player_locomotion_teleport_teleport_blink_state.js", "../../src/pp/gameplay/experimental/locomotion/legacy/locomotion/teleport/player_locomotion_teleport_teleport_shift_state.js", "../../src/pp/gameplay/experimental/locomotion/legacy/locomotion/teleport/player_locomotion_teleport_teleport_state.js", "../../src/pp/gameplay/experimental/locomotion/legacy/locomotion/teleport/player_locomotion_teleport.js", "../../src/pp/gameplay/experimental/locomotion/legacy/locomotion/player_locomotion_smooth.js", "../../src/pp/gameplay/experimental/locomotion/legacy/locomotion/components/player_locomotion_component.ts", "../../src/pp/input/cauldron/components/overlap_cursor_component.ts", "../../src/pp/input/cauldron/components/finger_cursor_component.ts", "../../src/pp/input/cauldron/components/switch_hand_object_component.js", "../../src/pp/input/cauldron/components/tracked_hand_draw_joint_component.js", "../../src/pp/input/cauldron/components/tracked_hand_draw_all_joints_component.js", "../../src/pp/input/cauldron/components/tracked_hand_draw_skin_component.js", "../../src/pp/input/gamepad/cauldron/gamepad_mesh_animator_component.js", "../../src/pp/input/gamepad/cauldron/gamepad_control_scheme_component.js", "../../src/pp/input/gamepad/virtual_gamepad/virtual_gamepad_icon.js", "../../src/pp/input/gamepad/virtual_gamepad/virtual_gamepad_params.js", "../../src/pp/input/gamepad/virtual_gamepad/virtual_gamepad_virtual_button.js", "../../src/pp/input/gamepad/virtual_gamepad/virtual_gamepad_virtual_thumbstick.js", "../../src/pp/input/gamepad/virtual_gamepad/virtual_gamepad.js", "../../src/pp/input/gamepad/gamepad_cores/virtual_gamepad_gamepad_core.js", "../../src/pp/input/gamepad/virtual_gamepad/virtual_gamepad_component.js", "../../src/pp/input/pose/components/set_player_height_component.js", "../../src/pp/input/pose/components/set_hand_local_transform_component.js", "../../src/pp/input/pose/components/set_hand_ray_local_transform_component.js", "../../src/pp/input/pose/components/set_head_local_transform_component.ts", "../../src/pp/input/pose/components/set_tracked_hand_joint_local_transform_component.js", "../../src/pp/input/pose/components/copy_hand_transform_component.js", "../../src/pp/input/pose/components/copy_head_transform_component.js", "../../src/pp/input/pose/components/copy_player_transform_component.js", "../../src/pp/input/pose/components/copy_reference_space_transform_component.js", "../../src/pp/tool/cauldron/tool_types.js", "../../src/pp/tool/cauldron/components/tool_cursor_component.js", "../../src/pp/tool/console_vr/console_vr_widget_config.js", "../../src/pp/tool/console_vr/console_vr_types.js", "../../src/pp/tool/console_vr/console_vr_widget_ui.js", "../../src/pp/tool/widget_frame/widget_frame.js", "../../src/pp/tool/widget_frame/widget_frame_config.js", "../../src/pp/tool/widget_frame/widget_frame_ui.js", "../../src/pp/tool/console_vr/console_vr_widget.js", "../../src/pp/tool/console_vr/components/console_vr_tool_component.js", "../../src/pp/tool/easy_tune/components/easy_tune_tool_component.ts", "../../src/pp/tool/easy_tune/easy_tune_widgets/base/easy_tune_base_widget.js", "../../src/pp/tool/easy_tune/easy_tune_widgets/base/easy_tune_base_array_widget_selector.js", "../../src/pp/tool/easy_tune/easy_tune_widgets/base/easy_tune_base_widget_config.js", "../../src/pp/tool/easy_tune/easy_tune_widgets/bool/easy_tune_bool_array_widget_config.js", "../../src/pp/tool/easy_tune/easy_tune_widgets/bool/easy_tune_bool_array_widget_ui.js", "../../src/pp/tool/easy_tune/easy_tune_widgets/base/easy_tune_base_widget_ui.js", "../../src/pp/tool/easy_tune/easy_tune_widgets/bool/easy_tune_bool_array_widget.js", "../../src/pp/tool/easy_tune/easy_tune_widgets/bool/easy_tune_bool_array_widget_selector.js", "../../src/pp/tool/easy_tune/easy_tune_widgets/easy_tune_widget_config.js", "../../src/pp/tool/easy_tune/easy_tune_widgets/none/easy_tune_none_widget_config.js", "../../src/pp/tool/easy_tune/easy_tune_widgets/none/easy_tune_none_widget_ui.js", "../../src/pp/tool/easy_tune/easy_tune_widgets/none/easy_tune_none_widget.js", "../../src/pp/tool/easy_tune/easy_tune_widgets/number/easy_tune_number_array_widget_config.js", "../../src/pp/tool/easy_tune/easy_tune_widgets/number/easy_tune_number_array_widget_ui.js", "../../src/pp/tool/easy_tune/easy_tune_widgets/number/easy_tune_number_array_widget.js", "../../src/pp/tool/easy_tune/easy_tune_widgets/number/easy_tune_number_widget_selector.js", "../../src/pp/tool/easy_tune/easy_tune_widgets/transform/easy_tune_transform_widget_config.js", "../../src/pp/tool/easy_tune/easy_tune_widgets/transform/easy_tune_transform_widget_ui.js", "../../src/pp/tool/easy_tune/easy_tune_widgets/transform/easy_tune_transform_widget.js", "../../src/pp/tool/easy_tune/easy_tune_widgets/easy_tune_widget.js", "../../src/pp/tool/easy_tune/components/easy_tune_import_variables_component.js", "../../src/pp/tool/easy_tune/easy_object_tuners/easy_light_attenuation.ts", "../../src/pp/tool/easy_tune/easy_object_tuners/easy_light_color.ts", "../../src/pp/tool/easy_tune/easy_object_tuners/easy_mesh_color.ts", "../../src/pp/tool/easy_tune/easy_object_tuners/easy_scale.ts", "../../src/pp/tool/easy_tune/easy_object_tuners/easy_transform.ts", "../../src/pp/tool/easy_tune/easy_object_tuners/easy_text_color.ts", "../../src/pp/tool/easy_tune/easy_object_tuners/components/easy_light_attenuation_component.ts", "../../src/pp/tool/easy_tune/easy_object_tuners/components/easy_light_color_component.ts", "../../src/pp/tool/easy_tune/easy_object_tuners/components/easy_mesh_color_component.ts", "../../src/pp/tool/easy_tune/easy_object_tuners/components/easy_scale_component.ts", "../../src/pp/tool/easy_tune/easy_object_tuners/components/easy_set_tune_target_child_number_component.js", "../../src/pp/tool/easy_tune/easy_object_tuners/components/easy_set_tune_target_grab_component.js", "../../src/pp/tool/easy_tune/easy_object_tuners/components/easy_text_color_component.ts", "../../src/pp/tool/easy_tune/easy_object_tuners/components/easy_transform_component.ts"], - "sourcesContent": ["// PP\r\nexport * from \"./pp/register_pp_components.js\";\r\nexport { Globals } from \"./pp/globals.js\";\r\n\r\nexport * from \"./pp/components/pp_gateway_component.js\";\r\nexport * from \"./pp/components/add_pp_to_window_component.js\";\r\n\r\n//\tPLUGIN\r\nexport { PluginUtils } from \"./plugin/utils/plugin_utils.js\";\r\n\r\nexport * from \"./plugin/js/extensions/array/vec_create_extension.js\";\r\nexport { ArrayExtensionUtils } from \"./plugin/js/extensions/array/array_extension_utils.js\";\r\n\r\n//\tAUDIO\r\nexport * from \"./audio/audio_manager.js\";\r\nexport * from \"./audio/audio_player.js\";\r\nexport * from \"./audio/audio_setup.js\";\r\nexport { AudioUtils } from \"./audio/audio_utils.js\";\r\n\r\nexport * from \"./audio/howler/howler_audio_player.js\";\r\n\r\nexport * from \"./audio/components/audio_manager_component.js\";\r\nexport * from \"./audio/components/mute_everything_component.js\";\r\nexport * from \"./audio/components/spatial_audio_listener_component.js\";\r\n\r\n//\tCAULDRON\r\n\r\n// BENCHMARKS\r\nexport * from \"./cauldron/benchmarks/benchmark_max_physx_component.js\";\r\nexport * from \"./cauldron/benchmarks/benchmark_max_visible_triangles_component.js\";\r\n\r\n// CAULDRON\r\nexport * from \"./cauldron/cauldron/save_manager.js\";\r\nexport * from \"./cauldron/cauldron/analytics_manager.js\";\r\nexport * from \"./cauldron/cauldron/timer.js\";\r\n\r\nexport * from \"./cauldron/cauldron/components/adjust_hierarchy_physx_scale_component.js\";\r\nexport * from \"./cauldron/cauldron/components/analytics_manager_component.js\";\r\nexport * from \"./cauldron/cauldron/components/clear_console_component.js\";\r\nexport * from \"./cauldron/cauldron/components/reset_local_transform_component.js\";\r\nexport * from \"./cauldron/cauldron/components/save_manager_component.js\";\r\nexport * from \"./cauldron/cauldron/components/set_active_component.js\";\r\nexport * from \"./cauldron/cauldron/components/set_engine_log_level_component.js\";\r\nexport * from \"./cauldron/cauldron/components/show_xr_buttons_component.js\";\r\n\r\n// FSM\r\nexport * from \"./cauldron/fsm/fsm.js\";\r\nexport * from \"./cauldron/fsm/state.js\";\r\nexport * from \"./cauldron/fsm/transition.js\";\r\nexport * from \"./cauldron/fsm/states/condition_states/base_condition_state.js\";\r\nexport * from \"./cauldron/fsm/states/condition_states/condition_state.js\";\r\nexport * from \"./cauldron/fsm/states/condition_states/timer_state.js\";\r\nexport * from \"./cauldron/fsm/states/condition_states/frames_countdown_state.js\";\r\nexport * from \"./cauldron/fsm/states/condition_states/delay_state.js\";\r\nexport * from \"./cauldron/fsm/states/cauldron/branch_state.js\";\r\n\r\n// OBJECT POOL\r\nexport * from \"./cauldron/object_pool/object_pool.js\";\r\nexport * from \"./cauldron/object_pool/object_pool_manager.js\";\r\nexport * from \"./cauldron/object_pool/components/object_pool_manager_component.js\";\r\n\r\n// TYPE DEFINITIONS\r\nexport * from \"./cauldron/type_definitions/array_type_definitions.js\";\r\n\r\n// UTILS\r\nexport { ColorUtils, ColorModel } from \"./cauldron/utils/color_utils.js\";\r\nexport { SaveUtils } from \"./cauldron/utils/save_utils.js\";\r\nexport { XRUtils } from \"./cauldron/utils/xr_utils.js\";\r\nexport { BrowserUtils } from \"./cauldron/utils/browser_utils.js\";\r\nexport { AnalyticsUtils } from \"./cauldron/utils/analytics_utils.js\";\r\n\r\nexport { ArrayUtils } from \"./cauldron/utils/array/array_utils.js\";\r\nexport { VecUtils } from \"./cauldron/utils/array/vec_utils.js\";\r\nexport { Vec2Utils } from \"./cauldron/utils/array/vec2_utils.js\";\r\nexport { Vec3Utils } from \"./cauldron/utils/array/vec3_utils.js\";\r\nexport { Vec4Utils } from \"./cauldron/utils/array/vec4_utils.js\";\r\nexport { QuatUtils } from \"./cauldron/utils/array/quat_utils.js\";\r\nexport { Quat2Utils } from \"./cauldron/utils/array/quat2_utils.js\";\r\nexport { Mat3Utils } from \"./cauldron/utils/array/mat3_utils.js\";\r\nexport { Mat4Utils } from \"./cauldron/utils/array/mat4_utils.js\";\r\nexport { VecAllocationUtils } from \"./cauldron/utils/array/vec_allocation_utils.js\";\r\n\r\nexport { JSUtils } from \"./cauldron/utils/js_utils.js\";\r\nexport { MathUtils, EasingFunction, EasingFunctionName, WaveFunction } from \"./cauldron/utils/math_utils.js\";\r\n\r\n// PHYSICS\r\nexport { PhysicsUtils } from \"./cauldron/physics/physics_utils.js\";\r\nexport * from \"./cauldron/physics/physics_raycast_params.js\";\r\nexport * from \"./cauldron/physics/physics_layer_flags.js\";\r\nexport * from \"./cauldron/physics/physics_collision_collector.js\";\r\n\r\n// VISUAL\r\nexport * from \"./cauldron/visual/visual_manager.js\";\r\nexport * from \"./cauldron/visual/visual_resources.js\";\r\n\r\nexport * from \"./cauldron/visual/elements/visual_element_types.js\";\r\nexport * from \"./cauldron/visual/elements/visual_line.js\";\r\nexport * from \"./cauldron/visual/elements/visual_mesh.js\";\r\nexport * from \"./cauldron/visual/elements/visual_point.js\";\r\nexport * from \"./cauldron/visual/elements/visual_arrow.js\";\r\nexport * from \"./cauldron/visual/elements/visual_text.js\";\r\nexport * from \"./cauldron/visual/elements/visual_transform.js\";\r\nexport * from \"./cauldron/visual/elements/visual_raycast.js\";\r\nexport * from \"./cauldron/visual/elements/visual_torus.js\";\r\n\r\nexport * from \"./cauldron/visual/components/visual_manager_component.js\";\r\n\r\n// WL\r\nexport * from \"./cauldron/wl/register_wl_components.js\";\r\nexport * from \"./cauldron/wl/components/add_wl_to_window_component.js\";\r\nexport { ObjectUtils, ObjectCloneParams } from \"./cauldron/wl/utils/object_utils.js\";\r\nexport { ComponentUtils, ComponentDeepCloneParams, ComponentCustomCloneParams } from \"./cauldron/wl/utils/component_utils.js\";\r\nexport { WLComponentDefaultCloneCallbacks } from \"./cauldron/wl/utils/wl_component_default_clone_callbacks.js\";\r\nexport { MaterialUtils } from \"./cauldron/wl/utils/material_utils.js\";\r\nexport { MeshUtils, MeshCreationVertexParams, MeshCreationTriangleParams, MeshCreationParams } from \"./cauldron/wl/utils/mesh_utils.js\";\r\nexport { TextUtils } from \"./cauldron/wl/utils/text_utils.js\";\r\nexport * from \"./cauldron/wl/getters/scene_objects.js\";\r\nexport * from \"./cauldron/wl/getters/default_resources.js\";\r\nexport * from \"./cauldron/wl/getters/components/get_scene_objects_component.js\";\r\nexport * from \"./cauldron/wl/getters/components/get_default_resources_component.js\";\r\nexport * from \"./cauldron/wl/type_definitions/material_type_definitions.js\";\r\n\r\n//\tDEBUG\r\nexport * from \"./debug/debug_manager.js\";\r\nexport * from \"./debug/debug_visual_manager.js\";\r\n\r\nexport * from \"./debug/components/debug_transform_component.js\";\r\nexport * from \"./debug/components/debug_manager_component.js\";\r\nexport * from \"./debug/components/enable_debug_component.js\";\r\nexport * from \"./debug/components/show_fps_component.js\";\r\nexport * from \"./debug/components/toggle_active_on_button_press_component.js\";\r\n\r\nexport * from \"./debug/debug_functions_overwriter/debug_functions_overwriter.js\";\r\nexport * from \"./debug/debug_functions_overwriter/debug_functions_performance_analyzer/debug_functions_performance_analyzer.js\";\r\nexport * from \"./debug/debug_functions_overwriter/debug_functions_performance_analyzer/debug_functions_performance_analysis_results_logger.js\";\r\nexport * from \"./debug/debug_functions_overwriter/debug_functions_performance_analyzer/components/debug_functions_performance_analyzer_component.js\";\r\nexport * from \"./debug/debug_functions_overwriter/debug_functions_performance_analyzer/components/debug_pp_functions_performance_analyzer_component.js\";\r\nexport * from \"./debug/debug_functions_overwriter/debug_functions_performance_analyzer/components/debug_array_functions_performance_analyzer_component.js\";\r\nexport * from \"./debug/debug_functions_overwriter/debug_functions_performance_analyzer/components/debug_pp_array_creation_performance_analyzer_component.js\";\r\nexport * from \"./debug/debug_functions_overwriter/debug_functions_performance_analyzer/components/debug_wl_function_performance_analyzer_component.js\";\r\nexport * from \"./debug/debug_functions_overwriter/debug_functions_performance_analyzer/components/debug_wl_components_function_performance_analyzer_component.js\";\r\n\r\n//\tGAMEPLAY\r\n\r\n// CAULDRON\r\nexport * from \"./gameplay/cauldron/cauldron/direction_2D_to_3D_converter.js\";\r\nexport * from \"./gameplay/cauldron/cauldron/number_over_factor.js\";\r\nexport * from \"./gameplay/cauldron/cauldron/animated_number.js\";\r\n\r\nexport * from \"./gameplay/cauldron/cauldron/components/cursor_button_component.js\";\r\n\r\n// ROUGH\r\nexport * from \"./gameplay/cauldron/rough/components/scale_on_spawn_component.js\";\r\n\r\n// GRAB & THROW\r\nexport * from \"./gameplay/grab_throw/grabbable_component.js\";\r\nexport * from \"./gameplay/grab_throw/grabber_hand_component.js\";\r\n\r\n// INTEGRATIONS\r\nexport { CAUtils, CAError } from \"./gameplay/integrations/construct_arcade/ca_utils.js\";\r\nexport * from \"./gameplay/integrations/construct_arcade/ca_dummy_server.js\";\r\nexport * from \"./gameplay/integrations/construct_arcade/ca_display_leaderboard_component.js\";\r\n\r\n// EXPERIMENTAL\r\n\r\n// CHARACTER CONTROLLER\r\nexport * from \"./gameplay/experimental/character_controller/collision/legacy/collision_check/collision_params.js\";\r\nexport { CollisionCheck } from \"./gameplay/experimental/character_controller/collision/legacy/collision_check/collision_check.js\";\r\nexport { CollisionCheckUtils } from \"./gameplay/experimental/character_controller/collision/legacy/collision_check/collision_check_utils.js\";\r\n\r\nexport { CollisionCheckBridge } from \"./gameplay/experimental/character_controller/collision/collision_check_bridge.js\";\r\nexport * from \"./gameplay/experimental/character_controller/collision/character_collider_setup.js\";\r\nexport { CharacterControllerUtils } from \"./gameplay/experimental/character_controller/character_controller_utils.js\";\r\nexport { CharacterColliderSetupUtils, CharacterColliderSetupSimplifiedCreationParams, CharacterColliderSetupSimplifiedCreationAccuracyLevel } from \"./gameplay/experimental/character_controller/collision/character_collider_setup_utils.js\";\r\nexport * from \"./gameplay/experimental/character_controller/collision/character_collision_results.js\";\r\nexport * from \"./gameplay/experimental/character_controller/collision/character_collision_system.js\";\r\nexport * from \"./gameplay/experimental/character_controller/collision/components/character_collision_system_component.js\";\r\n\r\n// LOCOMOTION\r\nexport * from \"./gameplay/experimental/locomotion/legacy/locomotion/player_head_manager.js\";\r\nexport * from \"./gameplay/experimental/locomotion/legacy/locomotion/player_transform_manager.js\";\r\nexport * from \"./gameplay/experimental/locomotion/legacy/locomotion/player_locomotion_rotate.js\";\r\nexport * from \"./gameplay/experimental/locomotion/legacy/locomotion/player_locomotion_movement.js\";\r\nexport * from \"./gameplay/experimental/locomotion/legacy/locomotion/player_locomotion_smooth.js\";\r\nexport * from \"./gameplay/experimental/locomotion/legacy/locomotion/player_obscure_manager.js\";\r\nexport * from \"./gameplay/experimental/locomotion/legacy/locomotion/player_locomotion.js\";\r\nexport * from \"./gameplay/experimental/locomotion/legacy/locomotion/components/player_locomotion_component.js\";\r\n\r\nexport * from \"./gameplay/experimental/locomotion/legacy/locomotion/teleport/player_locomotion_teleport_parable.js\";\r\nexport * from \"./gameplay/experimental/locomotion/legacy/locomotion/teleport/player_locomotion_teleport_state.js\";\r\nexport * from \"./gameplay/experimental/locomotion/legacy/locomotion/teleport/player_locomotion_teleport_detection_visualizer.js\";\r\nexport * from \"./gameplay/experimental/locomotion/legacy/locomotion/teleport/player_locomotion_teleport_detection_state.js\";\r\nexport * from \"./gameplay/experimental/locomotion/legacy/locomotion/teleport/player_locomotion_teleport_teleport_state.js\";\r\nexport * from \"./gameplay/experimental/locomotion/legacy/locomotion/teleport/player_locomotion_teleport_teleport_blink_state.js\";\r\nexport * from \"./gameplay/experimental/locomotion/legacy/locomotion/teleport/player_locomotion_teleport_teleport_shift_state.js\";\r\nexport * from \"./gameplay/experimental/locomotion/legacy/locomotion/teleport/player_locomotion_teleport.js\";\r\n\r\n//\tINPUT\r\nexport * from \"./input/cauldron/input_types.js\";\r\nexport { InputUtils } from \"./input/cauldron/input_utils.js\";\r\nexport * from \"./input/cauldron/keyboard.js\";\r\nexport * from \"./input/cauldron/mouse.js\";\r\nexport * from \"./input/cauldron/input_manager.js\";\r\n\r\nexport * from \"./input/cauldron/components/overlap_cursor_component.js\";\r\nexport * from \"./input/cauldron/components/finger_cursor_component.js\";\r\nexport * from \"./input/cauldron/components/input_manager_component.js\";\r\nexport * from \"./input/cauldron/components/switch_hand_object_component.js\";\r\nexport * from \"./input/cauldron/components/tracked_hand_draw_joint_component.js\";\r\nexport * from \"./input/cauldron/components/tracked_hand_draw_all_joints_component.js\";\r\nexport * from \"./input/cauldron/components/tracked_hand_draw_skin_component.js\";\r\n\r\nexport * from \"./input/gamepad/gamepad_buttons.js\";\r\nexport { Gamepad } from \"./input/gamepad/gamepad.js\";\r\nexport * from \"./input/gamepad/universal_gamepad.js\";\r\nexport * from \"./input/gamepad/cauldron/gamepad_mesh_animator_component.js\";\r\nexport * from \"./input/gamepad/cauldron/gamepads_manager.js\";\r\nexport { GamepadUtils } from \"./input/gamepad/cauldron/gamepad_utils.js\";\r\nexport * from \"./input/gamepad/cauldron/gamepad_control_scheme_component.js\";\r\nexport * from \"./input/gamepad/gamepad_cores/gamepad_core.js\";\r\nexport * from \"./input/gamepad/gamepad_cores/xr_gamepad_core.js\";\r\nexport * from \"./input/gamepad/gamepad_cores/keyboard_gamepad_core.js\";\r\nexport * from \"./input/gamepad/gamepad_cores/virtual_gamepad_gamepad_core.js\";\r\nexport * from \"./input/gamepad/gamepad_cores/classic_gamepad_core.js\";\r\n\r\nexport * from \"./input/gamepad/virtual_gamepad/virtual_gamepad.js\";\r\nexport * from \"./input/gamepad/virtual_gamepad/virtual_gamepad_component.js\";\r\nexport * from \"./input/gamepad/virtual_gamepad/virtual_gamepad_params.js\";\r\nexport * from \"./input/gamepad/virtual_gamepad/virtual_gamepad_virtual_button.js\";\r\nexport * from \"./input/gamepad/virtual_gamepad/virtual_gamepad_virtual_thumbstick.js\";\r\nexport * from \"./input/gamepad/virtual_gamepad/virtual_gamepad_icon.js\";\r\n\r\nexport * from \"./input/pose/base_pose.js\";\r\nexport * from \"./input/pose/hand_pose.js\";\r\nexport * from \"./input/pose/hand_ray_pose.js\";\r\nexport * from \"./input/pose/head_pose.js\";\r\nexport * from \"./input/pose/tracked_hand_joint_pose.js\";\r\nexport * from \"./input/pose/tracked_hand_pose.js\";\r\n\r\nexport * from \"./input/pose/components/set_player_height_component.js\";\r\nexport * from \"./input/pose/components/set_hand_local_transform_component.js\";\r\nexport * from \"./input/pose/components/set_hand_ray_local_transform_component.js\";\r\nexport * from \"./input/pose/components/set_head_local_transform_component.js\";\r\nexport * from \"./input/pose/components/set_tracked_hand_joint_local_transform_component.js\";\r\nexport * from \"./input/pose/components/copy_hand_transform_component.js\";\r\nexport * from \"./input/pose/components/copy_head_transform_component.js\";\r\nexport * from \"./input/pose/components/copy_player_transform_component.js\";\r\nexport * from \"./input/pose/components/copy_reference_space_transform_component.js\";\r\n\r\n//\tTOOL\r\nexport * from \"./tool/cauldron/tool_types.js\";\r\nexport * from \"./tool/cauldron/components/tool_cursor_component.js\";\r\nexport * from \"./tool/cauldron/components/enable_tool_component.js\";\r\n\r\nexport * from \"./tool/console_vr/console_vr_widget_config.js\";\r\nexport * from \"./tool/console_vr/console_vr_widget_ui.js\";\r\nexport * from \"./tool/console_vr/console_vr_widget.js\";\r\nexport * from \"./tool/console_vr/console_vr.js\";\r\nexport * from \"./tool/console_vr/console_vr_types.js\";\r\nexport { ConsoleOriginalFunctions } from \"./tool/console_vr/console_original_functions.js\";\r\n\r\nexport * from \"./tool/console_vr/components/console_vr_tool_component.js\";\r\nexport * from \"./tool/console_vr/components/init_console_vr_component.js\";\r\n\r\nexport * from \"./tool/easy_tune/easy_tune_variables.js\";\r\nexport * from \"./tool/easy_tune/easy_tune_variable_types.js\";\r\nexport { EasyTuneUtils } from \"./tool/easy_tune/easy_tune_utils.js\";\r\n\r\nexport * from \"./tool/easy_tune/components/easy_tune_tool_component.js\";\r\nexport * from \"./tool/easy_tune/components/easy_tune_import_variables_component.js\";\r\nexport * from \"./tool/easy_tune/components/init_easy_tune_variables_component.js\";\r\n\r\nexport * from \"./tool/easy_tune/easy_object_tuners/easy_object_tuner.js\";\r\nexport * from \"./tool/easy_tune/easy_object_tuners/easy_light_attenuation.js\";\r\nexport * from \"./tool/easy_tune/easy_object_tuners/easy_light_color.js\";\r\nexport * from \"./tool/easy_tune/easy_object_tuners/easy_mesh_color.js\";\r\nexport * from \"./tool/easy_tune/easy_object_tuners/easy_scale.js\";\r\nexport * from \"./tool/easy_tune/easy_object_tuners/easy_transform.js\";\r\nexport * from \"./tool/easy_tune/easy_object_tuners/easy_active.js\";\r\nexport * from \"./tool/easy_tune/easy_object_tuners/easy_text_color.js\";\r\nexport * from \"./tool/easy_tune/easy_object_tuners/components/easy_light_attenuation_component.js\";\r\nexport * from \"./tool/easy_tune/easy_object_tuners/components/easy_light_color_component.js\";\r\nexport * from \"./tool/easy_tune/easy_object_tuners/components/easy_mesh_color_component.js\";\r\nexport * from \"./tool/easy_tune/easy_object_tuners/components/easy_scale_component.js\";\r\nexport * from \"./tool/easy_tune/easy_object_tuners/components/easy_set_tune_target_child_number_component.js\";\r\nexport * from \"./tool/easy_tune/easy_object_tuners/components/easy_set_tune_target_grab_component.js\";\r\nexport * from \"./tool/easy_tune/easy_object_tuners/components/easy_text_color_component.js\";\r\nexport * from \"./tool/easy_tune/easy_object_tuners/components/easy_transform_component.js\";\r\nexport * from \"./tool/easy_tune/easy_object_tuners/components/easy_active_component.js\";\r\n\r\nexport * from \"./tool/easy_tune/easy_tune_widgets/easy_tune_widget.js\";\r\nexport * from \"./tool/easy_tune/easy_tune_widgets/easy_tune_widget_config.js\";\r\nexport * from \"./tool/easy_tune/easy_tune_widgets/base/easy_tune_base_widget.js\";\r\nexport * from \"./tool/easy_tune/easy_tune_widgets/base/easy_tune_base_widget_ui.js\";\r\nexport * from \"./tool/easy_tune/easy_tune_widgets/base/easy_tune_base_widget_config.js\";\r\nexport * from \"./tool/easy_tune/easy_tune_widgets/base/easy_tune_base_array_widget_selector.js\";\r\nexport * from \"./tool/easy_tune/easy_tune_widgets/bool/easy_tune_bool_array_widget.js\";\r\nexport * from \"./tool/easy_tune/easy_tune_widgets/bool/easy_tune_bool_array_widget_ui.js\";\r\nexport * from \"./tool/easy_tune/easy_tune_widgets/bool/easy_tune_bool_array_widget_config.js\";\r\nexport * from \"./tool/easy_tune/easy_tune_widgets/bool/easy_tune_bool_array_widget_selector.js\";\r\nexport * from \"./tool/easy_tune/easy_tune_widgets/none/easy_tune_none_widget.js\";\r\nexport * from \"./tool/easy_tune/easy_tune_widgets/none/easy_tune_none_widget_ui.js\";\r\nexport * from \"./tool/easy_tune/easy_tune_widgets/none/easy_tune_none_widget_config.js\";\r\nexport * from \"./tool/easy_tune/easy_tune_widgets/number/easy_tune_number_array_widget.js\";\r\nexport * from \"./tool/easy_tune/easy_tune_widgets/number/easy_tune_number_array_widget_ui.js\";\r\nexport * from \"./tool/easy_tune/easy_tune_widgets/number/easy_tune_number_array_widget_config.js\";\r\nexport * from \"./tool/easy_tune/easy_tune_widgets/number/easy_tune_number_widget_selector.js\";\r\nexport * from \"./tool/easy_tune/easy_tune_widgets/transform/easy_tune_transform_widget.js\";\r\nexport * from \"./tool/easy_tune/easy_tune_widgets/transform/easy_tune_transform_widget_ui.js\";\r\nexport * from \"./tool/easy_tune/easy_tune_widgets/transform/easy_tune_transform_widget_config.js\";\r\n\r\nexport * from \"./tool/widget_frame/widget_frame_config.js\";\r\nexport * from \"./tool/widget_frame/widget_frame_ui.js\";\r\nexport * from \"./tool/widget_frame/widget_frame.js\";", "import { Component, Object3D, property } from \"@wonderlandengine/api\";\r\nimport { ComponentUtils } from \"../../../../cauldron/wl/utils/component_utils.js\";\r\nimport { Globals } from \"../../../../pp/globals.js\";\r\nimport { EasyActive } from \"../easy_active.js\";\r\n\r\nexport class EasyActiveComponent extends Component {\r\n public static override TypeName = \"pp-easy-active\";\r\n\r\n @property.string(\"\")\r\n private readonly _myVariableName!: string;\r\n\r\n @property.bool(false)\r\n private readonly _mySetAsWidgetCurrentVariable!: boolean;\r\n\r\n @property.bool(false)\r\n private readonly _myUseTuneTarget!: boolean;\r\n\r\n\r\n\r\n private _myEasyObjectTuner: EasyActive | null = null;\r\n\r\n public override update(dt: number): void {\r\n if (Globals.isToolEnabled(this.engine)) {\r\n if (this._myEasyObjectTuner != null) {\r\n this._myEasyObjectTuner.update(dt);\r\n } else {\r\n this._myEasyObjectTuner = new EasyActive([this], this.object, this._myVariableName, this._mySetAsWidgetCurrentVariable, this._myUseTuneTarget, this.engine);\r\n this._myEasyObjectTuner.start();\r\n }\r\n }\r\n }\r\n\r\n public override onActivate(): void {\r\n if (this._myEasyObjectTuner != null) {\r\n this._myEasyObjectTuner.setActive(true);\r\n }\r\n }\r\n\r\n public override onDeactivate(): void {\r\n if (this._myEasyObjectTuner != null) {\r\n this._myEasyObjectTuner.setActive(false);\r\n }\r\n }\r\n\r\n public getEasyObjectTuner(): EasyActive | null {\r\n return this._myEasyObjectTuner;\r\n }\r\n\r\n public pp_clone(targetObject: Object3D): EasyActiveComponent | null {\r\n const clonedComponent = ComponentUtils.cloneDefault(this, targetObject);\r\n return clonedComponent as any;\r\n }\r\n}", "import { AnimationComponent, CollisionComponent, InputComponent, LightComponent, MeshComponent, PhysXComponent, TextComponent, ViewComponent } from \"@wonderlandengine/api\";\r\nimport { ARCamera8thwall, Anchor, Cursor, CursorTarget, DebugObject, DeviceOrientationLook, FingerCursor, FixedFoveation, HandTracking, HitTestLocation, HowlerAudioListener, HowlerAudioSource, ImageTexture, MouseLookComponent, PlaneDetection, PlayerHeight, TargetFramerate, TeleportComponent, Trail, TwoJointIkSolver, VideoTexture, VrModeActiveSwitch, Vrm, WasdControlsComponent } from \"@wonderlandengine/components\";\r\nimport { Globals } from \"../../../pp/globals.js\";\r\nimport { ObjectUtils } from \"./object_utils.js\";\r\nimport { WLComponentDefaultCloneCallbacks } from \"./wl_component_default_clone_callbacks.js\";\r\n\r\nlet _myCloneCallbacks = new WeakMap(); // Signature: callback(componentToClone, targetObject, useDefaultCloneAsFallback, deeCloneParams, customCloneParams)\r\nlet _myClonePostProcessCallbacks = new WeakMap(); // Signature: callback(componentToClone, clonedComponent, deeCloneParams, customCloneParams)\r\n\r\nexport class ComponentDeepCloneParams {\r\n\r\n constructor() {\r\n this._myDeepCloneComponents = false;\r\n this._myDeepCloneOverrideComponentsMap = new Map();\r\n this._myDeepCloneOverrideComponentsVariablesMap = new Map();\r\n }\r\n\r\n // The implementation is component dependant, not every component implements the deep clone\r\n setDeepCloneComponents(deepClone) {\r\n this._myDeepCloneComponents = deepClone;\r\n }\r\n\r\n // This value override the deep clone components value\r\n // The implementation is component dependant, not every component implements the deep clone\r\n setDeepCloneComponent(componentName, deepClone) {\r\n this._myDeepCloneOverrideComponentsMap.set(componentName, deepClone);\r\n }\r\n\r\n // This value override both the deep clone components value and the deep clone component override one\r\n // The implementation is component dependant, not every component variable override is taken into consideration\r\n setDeepCloneComponentVariable(componentName, variableName, deepClone) {\r\n let componentsVariablesMap = null;\r\n\r\n if (!this._myDeepCloneOverrideComponentsVariablesMap.has(componentName)) {\r\n this._myDeepCloneOverrideComponentsVariablesMap.set(componentName, new Map());\r\n }\r\n\r\n componentsVariablesMap = this._myDeepCloneOverrideComponentsVariablesMap.get(componentName);\r\n\r\n componentsVariablesMap.set(variableName, deepClone);\r\n }\r\n\r\n isDeepCloneComponent(componentName) {\r\n let deepCloneOverride = this._myDeepCloneOverrideComponentsMap.get(componentName);\r\n\r\n if (deepCloneOverride != null) {\r\n return deepCloneOverride;\r\n }\r\n\r\n return this._myDeepCloneComponents;\r\n }\r\n\r\n isDeepCloneComponentVariable(componentName, variableName) {\r\n let componentsVariablesMap = this._myDeepCloneOverrideComponentsVariablesMap.get(componentName);\r\n if (componentsVariablesMap != null) {\r\n let deepCloneOverride = componentsVariablesMap.get(variableName);\r\n if (deepCloneOverride != null) {\r\n return deepCloneOverride;\r\n }\r\n }\r\n\r\n return this.isDeepCloneComponent(componentName);\r\n }\r\n}\r\n\r\nexport class ComponentCustomCloneParams {\r\n\r\n constructor() {\r\n this._myParams = new Map();\r\n }\r\n\r\n addParam(name, value) {\r\n this._myParams.set(name, value);\r\n }\r\n\r\n removeParam(name) {\r\n this._myParams.delete(name);\r\n }\r\n\r\n getParam(name) {\r\n this._myParams.get(name);\r\n }\r\n\r\n hasParam(name) {\r\n this._myParams.has(name);\r\n }\r\n}\r\n\r\nexport function isWLComponent(classOrType) {\r\n return ComponentUtils.isWLNativeComponent(classOrType) || ComponentUtils.isWLJavascriptComponent(classOrType);\r\n}\r\n\r\nexport function isWLNativeComponent(classOrType) {\r\n let wlNative = false;\r\n\r\n let type = ComponentUtils.getTypeFromClassOrType(classOrType);\r\n\r\n if (ComponentUtils.getWLNativeComponentTypes().includes(type)) {\r\n wlNative = true;\r\n }\r\n\r\n return wlNative;\r\n}\r\n\r\nexport function isWLJavascriptComponent(classOrType) {\r\n let wlJavascript = false;\r\n\r\n let type = ComponentUtils.getTypeFromClassOrType(classOrType);\r\n\r\n if (ComponentUtils.getWLJavascriptComponentTypes().includes(type)) {\r\n wlJavascript = true;\r\n }\r\n\r\n return wlJavascript;\r\n}\r\n\r\nexport function getWLNativeComponentTypes() {\r\n return _myWLNativeComponentTypes;\r\n}\r\n\r\nexport function getWLJavascriptComponentTypes() {\r\n return _myWLJavascriptComponentTypes;\r\n}\r\n\r\nexport function getTypeFromClassOrType(classOrType) {\r\n if (classOrType == null) return;\r\n\r\n let type = classOrType;\r\n if (classOrType.TypeName != null) {\r\n type = classOrType.TypeName;\r\n }\r\n\r\n return type;\r\n}\r\n\r\nexport function getClassFromType(type, engine = Globals.getMainEngine()) {\r\n let classToReturn = null;\r\n\r\n if (ComponentUtils.isWLNativeComponent(type)) {\r\n if (ComponentUtils.isWLNativeComponentRegistered(type, engine)) {\r\n switch (type) {\r\n case AnimationComponent.TypeName:\r\n classToReturn = AnimationComponent;\r\n break;\r\n case CollisionComponent.TypeName:\r\n classToReturn = CollisionComponent;\r\n break;\r\n case InputComponent.TypeName:\r\n classToReturn = InputComponent;\r\n break;\r\n case LightComponent.TypeName:\r\n classToReturn = LightComponent;\r\n break;\r\n case MeshComponent.TypeName:\r\n classToReturn = MeshComponent;\r\n break;\r\n case PhysXComponent.TypeName:\r\n classToReturn = PhysXComponent;\r\n break;\r\n case TextComponent.TypeName:\r\n classToReturn = TextComponent;\r\n break;\r\n case ViewComponent.TypeName:\r\n classToReturn = ViewComponent;\r\n break;\r\n default:\r\n classToReturn = null;\r\n }\r\n }\r\n } else {\r\n classToReturn = ComponentUtils.getJavascriptComponentClass(type, engine);\r\n }\r\n\r\n return classToReturn;\r\n}\r\n\r\nexport function isRegistered(classOrType, engine = Globals.getMainEngine()) {\r\n let type = ComponentUtils.getTypeFromClassOrType(classOrType);\r\n return ComponentUtils.getClassFromType(type, engine) != null;\r\n}\r\n\r\nexport function getJavascriptComponentInstances(currentSceneOnly = true, engine = Globals.getMainEngine()) {\r\n if (currentSceneOnly) {\r\n return Globals.getScene(engine)._jsComponents;\r\n }\r\n\r\n return Globals.getWASM(engine)._components;\r\n}\r\n\r\nexport function getJavascriptComponentClass(type, engine = Globals.getMainEngine()) {\r\n return ComponentUtils.getJavascriptComponentClassesByIndex(engine)[ComponentUtils.getJavascriptComponentTypeIndex(type, engine)];\r\n}\r\n\r\nexport function getJavascriptComponentClassesByIndex(engine = Globals.getMainEngine()) {\r\n return Globals.getWASM(engine)._componentTypes;\r\n}\r\n\r\nexport function getJavascriptComponentTypeIndex(classOrType, engine = Globals.getMainEngine()) {\r\n let type = ComponentUtils.getTypeFromClassOrType(classOrType);\r\n return ComponentUtils.getJavascriptComponentTypeIndexes(engine)[type];\r\n}\r\n\r\nexport function getJavascriptComponentTypeIndexes(engine = Globals.getMainEngine()) {\r\n return Globals.getWASM(engine)._componentTypeIndices;\r\n}\r\n\r\nexport function getJavascriptComponentTypeFromIndex(typeIndex, engine = Globals.getMainEngine()) {\r\n let type = null;\r\n\r\n let componentClass = ComponentUtils.getJavascriptComponentClassesByIndex(engine)[typeIndex];\r\n if (componentClass != null) {\r\n type = componentClass.TypeName;\r\n }\r\n\r\n return type;\r\n}\r\n\r\nexport function isWLNativeComponentRegistered(classOrType, engine = Globals.getMainEngine()) {\r\n let scene = Globals.getScene(engine);\r\n let type = ComponentUtils.getTypeFromClassOrType(classOrType);\r\n return scene._components.getNativeManager(type) != null;\r\n}\r\n\r\nexport function isCloneable(classOrType, defaultCloneValid = false, engine = Globals.getMainEngine()) {\r\n let type = ComponentUtils.getTypeFromClassOrType(classOrType);\r\n return defaultCloneValid || ComponentUtils.hasCloneCallback(type, engine) || ComponentUtils.getClassFromType(type, engine)?.prototype.pp_clone != null;\r\n}\r\n\r\nexport function hasClonePostProcess(classOrType, engine = Globals.getMainEngine()) {\r\n let type = ComponentUtils.getTypeFromClassOrType(classOrType);\r\n return ComponentUtils.hasClonePostProcessCallback(type, engine) || ComponentUtils.getClassFromType(type, engine)?.prototype.pp_clonePostProcess != null;\r\n}\r\n\r\nexport function clone(componentToClone, targetObject, deeCloneParams, customCloneParams, useDefaultCloneAsFallback = false, defaultCloneAutoStartIfNotActive = true) {\r\n let clonedComponent = null;\r\n\r\n let cloneCallback = ComponentUtils.getCloneCallback(componentToClone.type, ObjectUtils.getEngine(componentToClone.object));\r\n\r\n if (cloneCallback != null) {\r\n clonedComponent = cloneCallback(componentToClone, targetObject, deeCloneParams, customCloneParams);\r\n } else if (componentToClone.pp_clone != null) {\r\n clonedComponent = componentToClone.pp_clone(targetObject, deeCloneParams, customCloneParams);\r\n } else if (useDefaultCloneAsFallback) {\r\n clonedComponent = ComponentUtils.cloneDefault(componentToClone, targetObject, defaultCloneAutoStartIfNotActive);\r\n }\r\n\r\n return clonedComponent;\r\n}\r\n\r\nexport function clonePostProcess(componentToClone, clonedComponent, deeCloneParams, customCloneParams) {\r\n let clonePostProcessCallback = ComponentUtils.getClonePostProcessCallback(componentToClone.type, ObjectUtils.getEngine(componentToClone.object));\r\n\r\n if (clonePostProcessCallback != null) {\r\n clonePostProcessCallback(componentToClone, clonedComponent, deeCloneParams, customCloneParams);\r\n } else if (componentToClone.pp_clonePostProcess != null) {\r\n componentToClone.pp_clonePostProcess(clonedComponent, deeCloneParams, customCloneParams);\r\n }\r\n\r\n return clonedComponent;\r\n}\r\n\r\nexport function cloneDefault(componentToClone, targetObject, autoStartIfNotActive = true) {\r\n let clonedComponent = ObjectUtils.addComponent(targetObject, componentToClone.type, componentToClone);\r\n\r\n // Trigger start, which otherwise would be called later, on first activation\r\n if (autoStartIfNotActive && !clonedComponent.active) {\r\n clonedComponent.active = true;\r\n clonedComponent.active = false;\r\n }\r\n\r\n return clonedComponent;\r\n}\r\n\r\nexport function setCloneCallback(classOrType, callback, engine = Globals.getMainEngine()) {\r\n let type = ComponentUtils.getTypeFromClassOrType(classOrType);\r\n\r\n if (!_myCloneCallbacks.has(engine)) {\r\n _myCloneCallbacks.set(engine, new Map());\r\n }\r\n\r\n _myCloneCallbacks.get(engine).set(type, callback);\r\n}\r\n\r\nexport function removeCloneCallback(classOrType, engine = Globals.getMainEngine()) {\r\n let type = ComponentUtils.getTypeFromClassOrType(classOrType);\r\n\r\n if (_myCloneCallbacks.has(engine)) {\r\n _myCloneCallbacks.get(engine).delete(type);\r\n }\r\n}\r\n\r\nexport function getCloneCallback(classOrType, engine = Globals.getMainEngine()) {\r\n let callback = null;\r\n\r\n let type = ComponentUtils.getTypeFromClassOrType(classOrType);\r\n if (_myCloneCallbacks.has(engine)) {\r\n callback = _myCloneCallbacks.get(engine).get(type);\r\n }\r\n\r\n return callback;\r\n}\r\n\r\nexport function hasCloneCallback(classOrType, engine = Globals.getMainEngine()) {\r\n let hasCallback = false;\r\n\r\n let type = ComponentUtils.getTypeFromClassOrType(classOrType);\r\n if (_myCloneCallbacks.has(engine)) {\r\n hasCallback = _myCloneCallbacks.get(engine).has(type);\r\n }\r\n\r\n return hasCallback;\r\n}\r\n\r\nexport function setClonePostProcessCallback(classOrType, callback, engine = Globals.getMainEngine()) {\r\n let type = ComponentUtils.getTypeFromClassOrType(classOrType);\r\n\r\n if (!_myClonePostProcessCallbacks.has(engine)) {\r\n _myClonePostProcessCallbacks.set(engine, new Map());\r\n }\r\n\r\n _myClonePostProcessCallbacks.get(engine).set(type, callback);\r\n}\r\n\r\nexport function removeClonePostProcessCallback(classOrType, engine = Globals.getMainEngine()) {\r\n let type = ComponentUtils.getTypeFromClassOrType(classOrType);\r\n\r\n if (_myClonePostProcessCallbacks.has(engine)) {\r\n _myClonePostProcessCallbacks.get(engine).delete(type);\r\n }\r\n}\r\n\r\nexport function getClonePostProcessCallback(classOrType, engine = Globals.getMainEngine()) {\r\n let callback = null;\r\n\r\n let type = ComponentUtils.getTypeFromClassOrType(classOrType);\r\n if (_myClonePostProcessCallbacks.has(engine)) {\r\n callback = _myClonePostProcessCallbacks.get(engine).get(type);\r\n }\r\n\r\n return callback;\r\n}\r\n\r\nexport function hasClonePostProcessCallback(classOrType, engine = Globals.getMainEngine()) {\r\n let hasCallback = false;\r\n\r\n let type = ComponentUtils.getTypeFromClassOrType(classOrType);\r\n if (_myClonePostProcessCallbacks.has(engine)) {\r\n hasCallback = _myClonePostProcessCallbacks.get(engine).has(type);\r\n }\r\n\r\n return hasCallback;\r\n}\r\n\r\n\r\nexport function getDefaultWLComponentCloneCallback(classOrType) {\r\n let callback = null;\r\n\r\n let type = ComponentUtils.getTypeFromClassOrType(classOrType);\r\n\r\n switch (type) {\r\n case MeshComponent.TypeName:\r\n callback = WLComponentDefaultCloneCallbacks.cloneMesh;\r\n break;\r\n case CollisionComponent.TypeName:\r\n callback = WLComponentDefaultCloneCallbacks.cloneCollision;\r\n break;\r\n case TextComponent.TypeName:\r\n callback = WLComponentDefaultCloneCallbacks.cloneText;\r\n break;\r\n case PhysXComponent.TypeName:\r\n callback = WLComponentDefaultCloneCallbacks.clonePhysX;\r\n break;\r\n default:\r\n callback = null;\r\n }\r\n\r\n return callback;\r\n}\r\n\r\n\r\nexport function hasDefaultWLComponentCloneCallback(classOrType) {\r\n return ComponentUtils.getDefaultWLComponentCloneCallback(classOrType) != null;\r\n}\r\n\r\n\r\nexport function setWLComponentDefaultCloneCallbacks(engine = Globals.getMainEngine()) {\r\n for (let nativeType of ComponentUtils.getWLNativeComponentTypes()) {\r\n let cloneCallback = ComponentUtils.getDefaultWLComponentCloneCallback(nativeType);\r\n if (cloneCallback != null) {\r\n ComponentUtils.setCloneCallback(nativeType, cloneCallback, engine);\r\n }\r\n }\r\n\r\n for (let javascriptType of ComponentUtils.getWLJavascriptComponentTypes()) {\r\n let cloneCallback = ComponentUtils.getDefaultWLComponentCloneCallback(javascriptType);\r\n if (cloneCallback != null) {\r\n ComponentUtils.setCloneCallback(javascriptType, cloneCallback, engine);\r\n }\r\n }\r\n}\r\n\r\nexport function removeWLComponentDefaultCloneCallbacks(engine = Globals.getMainEngine()) {\r\n for (let nativeType of ComponentUtils.getWLNativeComponentTypes()) {\r\n let cloneCallback = ComponentUtils.getDefaultWLComponentCloneCallback(nativeType);\r\n if (cloneCallback != null) {\r\n if (ComponentUtils.getCloneCallback(nativeType, engine) == cloneCallback) {\r\n ComponentUtils.removeCloneCallback(nativeType, engine);\r\n }\r\n }\r\n }\r\n\r\n for (let javascriptType of ComponentUtils.getWLNativeComponentTypes()) {\r\n let cloneCallback = ComponentUtils.getDefaultWLComponentCloneCallback(javascriptType);\r\n if (cloneCallback != null) {\r\n if (ComponentUtils.getCloneCallback(javascriptType, engine) == cloneCallback) {\r\n ComponentUtils.removeCloneCallback(javascriptType, engine);\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport let ComponentUtils = {\r\n isWLComponent,\r\n isWLNativeComponent,\r\n isWLJavascriptComponent,\r\n getWLNativeComponentTypes,\r\n getWLJavascriptComponentTypes,\r\n getTypeFromClassOrType,\r\n getClassFromType,\r\n isRegistered,\r\n\r\n getJavascriptComponentInstances,\r\n getJavascriptComponentClass,\r\n getJavascriptComponentClassesByIndex,\r\n getJavascriptComponentTypeIndex,\r\n getJavascriptComponentTypeIndexes,\r\n getJavascriptComponentTypeFromIndex,\r\n isWLNativeComponentRegistered,\r\n\r\n isCloneable,\r\n hasClonePostProcess,\r\n clone,\r\n clonePostProcess,\r\n cloneDefault,\r\n\r\n setCloneCallback,\r\n removeCloneCallback,\r\n getCloneCallback,\r\n hasCloneCallback,\r\n setClonePostProcessCallback,\r\n removeClonePostProcessCallback,\r\n getClonePostProcessCallback,\r\n hasClonePostProcessCallback,\r\n\r\n setWLComponentDefaultCloneCallbacks,\r\n removeWLComponentDefaultCloneCallbacks,\r\n getDefaultWLComponentCloneCallback,\r\n hasDefaultWLComponentCloneCallback\r\n};\r\n\r\n\r\n\r\nlet _myWLNativeComponentTypes = [\r\n AnimationComponent.TypeName,\r\n CollisionComponent.TypeName,\r\n InputComponent.TypeName,\r\n LightComponent.TypeName,\r\n MeshComponent.TypeName,\r\n PhysXComponent.TypeName,\r\n TextComponent.TypeName,\r\n ViewComponent.TypeName\r\n];\r\n\r\nlet _myWLJavascriptComponentTypes = [\r\n ARCamera8thwall.TypeName,\r\n Anchor.TypeName,\r\n Cursor.TypeName,\r\n CursorTarget.TypeName,\r\n DebugObject.TypeName,\r\n DeviceOrientationLook.TypeName,\r\n FingerCursor.TypeName,\r\n FixedFoveation.TypeName,\r\n HandTracking.TypeName,\r\n HitTestLocation.TypeName,\r\n HowlerAudioListener.TypeName,\r\n HowlerAudioSource.TypeName,\r\n ImageTexture.TypeName,\r\n MouseLookComponent.TypeName,\r\n PlaneDetection.TypeName,\r\n PlayerHeight.TypeName,\r\n TargetFramerate.TypeName,\r\n TeleportComponent.TypeName,\r\n Trail.TypeName,\r\n TwoJointIkSolver.TypeName,\r\n VideoTexture.TypeName,\r\n VrModeActiveSwitch.TypeName,\r\n Vrm.TypeName,\r\n WasdControlsComponent.TypeName\r\n];", "import { WonderlandEngine } from \"@wonderlandengine/api\";\r\nimport { Globals } from \"../pp/globals.js\";\r\nimport { AudioManager } from \"./audio_manager.js\";\r\n\r\nconst _myAudioManagers: WeakMap, AudioManager> = new WeakMap();\r\n\r\nexport function getAudioManager(engine: Readonly | null = Globals.getMainEngine()): AudioManager | null {\r\n if (engine == null) return null;\r\n\r\n const audioManager = _myAudioManagers.get(engine);\r\n return audioManager != null ? audioManager : null;\r\n}\r\n\r\nexport function setAudioManager(audioManager: AudioManager, engine: Readonly | null = Globals.getMainEngine()): void {\r\n if (engine != null) {\r\n _myAudioManagers.set(engine, audioManager);\r\n }\r\n}\r\n\r\nexport function removeAudioManager(engine: Readonly | null = Globals.getMainEngine()): void {\r\n if (engine != null) {\r\n _myAudioManagers.delete(engine);\r\n }\r\n}\r\n\r\nexport function hasAudioManager(engine: Readonly | null = Globals.getMainEngine()): boolean {\r\n return engine != null ? _myAudioManagers.has(engine) : false;\r\n}", "import { WonderlandEngine } from \"@wonderlandengine/api\";\r\nimport { Globals } from \"../../pp/globals.js\";\r\nimport { AnalyticsManager } from \"./analytics_manager.js\";\r\n\r\nconst _myAnalyticsManagers: WeakMap, AnalyticsManager> = new WeakMap();\r\n\r\nexport function getAnalyticsManager(engine: Readonly | null = Globals.getMainEngine()): AnalyticsManager | null {\r\n if (engine == null) return null;\r\n\r\n const analyticsManager = _myAnalyticsManagers.get(engine);\r\n return analyticsManager != null ? analyticsManager : null;\r\n}\r\n\r\nexport function setAnalyticsManager(analyticsManager: AnalyticsManager, engine: Readonly | null = Globals.getMainEngine()): void {\r\n if (engine != null) {\r\n _myAnalyticsManagers.set(engine, analyticsManager);\r\n }\r\n}\r\n\r\nexport function removeAnalyticsManager(engine: Readonly | null = Globals.getMainEngine()): void {\r\n if (engine != null) {\r\n _myAnalyticsManagers.delete(engine);\r\n }\r\n}\r\n\r\nexport function hasAnalyticsManager(engine: Readonly | null = Globals.getMainEngine()): boolean {\r\n return engine != null ? _myAnalyticsManagers.has(engine) : false;\r\n}", "import { WonderlandEngine } from \"@wonderlandengine/api\";\r\nimport { Globals } from \"../../pp/globals.js\";\r\nimport { SaveManager } from \"./save_manager.js\";\r\n\r\nconst _mySaveManagers: WeakMap, SaveManager> = new WeakMap();\r\n\r\nexport function getSaveManager(engine: Readonly | null = Globals.getMainEngine()): SaveManager | null {\r\n if (engine == null) return null;\r\n\r\n const saveManager = _mySaveManagers.get(engine);\r\n return saveManager != null ? saveManager : null;\r\n}\r\n\r\nexport function setSaveManager(saveManager: SaveManager, engine: Readonly | null = Globals.getMainEngine()): void {\r\n if (engine != null) {\r\n _mySaveManagers.set(engine, saveManager);\r\n }\r\n}\r\n\r\nexport function removeSaveManager(engine: Readonly | null = Globals.getMainEngine()): void {\r\n if (engine != null) {\r\n _mySaveManagers.delete(engine);\r\n }\r\n}\r\n\r\nexport function hasSaveManager(engine: Readonly | null = Globals.getMainEngine()): boolean {\r\n return engine != null ? _mySaveManagers.has(engine) : false;\r\n}", "import { WonderlandEngine } from \"@wonderlandengine/api\";\r\nimport { Globals } from \"../../pp/globals.js\";\r\nimport { ObjectPoolManager } from \"./object_pool_manager.js\";\r\n\r\nconst _myObjectPoolManagers: WeakMap, ObjectPoolManager> = new WeakMap();\r\n\r\nexport function getObjectPoolManager(engine: Readonly | null = Globals.getMainEngine()): ObjectPoolManager | null {\r\n if (engine == null) return null;\r\n\r\n const objectPoolManager = _myObjectPoolManagers.get(engine);\r\n return objectPoolManager != null ? objectPoolManager : null;\r\n}\r\n\r\nexport function setObjectPoolManager(objectPoolManager: ObjectPoolManager, engine: Readonly | null = Globals.getMainEngine()): void {\r\n if (engine != null) {\r\n _myObjectPoolManagers.set(engine, objectPoolManager);\r\n }\r\n}\r\n\r\nexport function removeObjectPoolManager(engine: Readonly | null = Globals.getMainEngine()): void {\r\n if (engine != null) {\r\n _myObjectPoolManagers.delete(engine);\r\n }\r\n}\r\n\r\nexport function hasObjectPoolManager(engine: Readonly | null = Globals.getMainEngine()): boolean {\r\n return engine != null ? _myObjectPoolManagers.has(engine) : false;\r\n}", "import { WonderlandEngine } from \"@wonderlandengine/api\";\r\nimport { Globals } from \"../../pp/globals.js\";\r\nimport { VisualManager } from \"./visual_manager.js\";\r\nimport { VisualResources } from \"./visual_resources.js\";\r\n\r\nconst _myVisualManagers: WeakMap, VisualManager> = new WeakMap();\r\nconst _myVisualResourcesMap: WeakMap, VisualResources> = new WeakMap();\r\n\r\nexport function getVisualManager(engine: Readonly | null = Globals.getMainEngine()): VisualManager | null {\r\n if (engine == null) return null;\r\n\r\n const visualManager = _myVisualManagers.get(engine);\r\n return visualManager != null ? visualManager : null;\r\n}\r\n\r\nexport function setVisualManager(visualManager: VisualManager, engine: Readonly | null = Globals.getMainEngine()): void {\r\n if (engine != null) {\r\n _myVisualManagers.set(engine, visualManager);\r\n }\r\n}\r\n\r\nexport function removeVisualManager(engine: Readonly | null = Globals.getMainEngine()): void {\r\n if (engine != null) {\r\n _myVisualManagers.delete(engine);\r\n }\r\n}\r\n\r\nexport function hasVisualManager(engine: Readonly | null = Globals.getMainEngine()): boolean {\r\n return engine != null ? _myVisualManagers.has(engine) : false;\r\n}\r\n\r\nexport function getVisualResources(engine: Readonly | null = Globals.getMainEngine()): VisualResources | null {\r\n if (engine == null) return null;\r\n\r\n const visualResources = _myVisualResourcesMap.get(engine);\r\n return visualResources != null ? visualResources : null;\r\n}\r\n\r\nexport function setVisualResources(visualResources: VisualResources, engine: Readonly | null = Globals.getMainEngine()): void {\r\n if (engine != null) {\r\n _myVisualResourcesMap.set(engine, visualResources);\r\n }\r\n}\r\n\r\nexport function removeVisualResources(engine: Readonly | null = Globals.getMainEngine()): void {\r\n if (engine != null) {\r\n _myVisualResourcesMap.delete(engine);\r\n }\r\n}\r\n\r\nexport function hasVisualResources(engine: Readonly | null = Globals.getMainEngine()): boolean {\r\n return engine != null ? _myVisualResourcesMap.has(engine) : false;\r\n}", "import { Physics, Scene, WASM, WonderlandEngine, XR } from \"@wonderlandengine/api\";\r\nimport { Globals } from \"../../pp/globals.js\";\r\n\r\nlet _myMainEngine: WonderlandEngine | null = null;\r\nconst _myEngines: WonderlandEngine[] = [];\r\n\r\nexport function getMainEngine(): WonderlandEngine | null {\r\n return _myMainEngine;\r\n}\r\n\r\nexport function setMainEngine(engine: WonderlandEngine): void {\r\n if (!hasEngine(engine)) {\r\n addEngine(engine);\r\n }\r\n\r\n _myMainEngine = engine;\r\n}\r\n\r\nexport function removeMainEngine(): void {\r\n _myMainEngine = null;\r\n}\r\n\r\nexport function getEngines(): WonderlandEngine[] {\r\n return _myEngines;\r\n}\r\n\r\nexport function addEngine(engine: WonderlandEngine): void {\r\n removeEngine(engine);\r\n _myEngines.push(engine);\r\n}\r\n\r\nexport function removeEngine(engine: Readonly): void {\r\n const index = _myEngines.indexOf(engine as WonderlandEngine);\r\n\r\n if (index >= 0) {\r\n _myEngines.splice(index, 1);\r\n\r\n if (getMainEngine() == engine) {\r\n removeMainEngine();\r\n }\r\n }\r\n}\r\n\r\nexport function hasEngine(engine: Readonly): boolean {\r\n return _myEngines.indexOf(engine as WonderlandEngine) >= 0;\r\n}\r\n\r\nexport function getScene(): Scene | null;\r\nexport function getScene(engine: Readonly): Scene;\r\nexport function getScene(engine: Readonly | null = Globals.getMainEngine()): Scene | null {\r\n let scene = null;\r\n\r\n if (engine != null) {\r\n scene = engine.scene;\r\n }\r\n\r\n return scene;\r\n}\r\n\r\nexport function getPhysics(): Physics | null;\r\nexport function getPhysics(engine: Readonly): Physics;\r\nexport function getPhysics(engine: Readonly | null = Globals.getMainEngine()): Physics | null {\r\n let physics = null;\r\n\r\n if (engine != null) {\r\n physics = engine.physics;\r\n }\r\n\r\n return physics;\r\n}\r\n\r\nexport function getCanvas(): HTMLCanvasElement | null;\r\nexport function getCanvas(engine: Readonly): HTMLCanvasElement;\r\nexport function getCanvas(engine: Readonly | null = Globals.getMainEngine()): HTMLCanvasElement | null {\r\n let canvas = null;\r\n\r\n if (engine != null) {\r\n canvas = engine.canvas;\r\n }\r\n\r\n return canvas;\r\n}\r\n\r\nexport function getWASM(): WASM | null;\r\nexport function getWASM(engine: Readonly): WASM;\r\nexport function getWASM(engine: Readonly | null = Globals.getMainEngine()): WASM | null {\r\n let wasm = null;\r\n\r\n if (engine != null) {\r\n wasm = engine.wasm;\r\n }\r\n\r\n return wasm;\r\n}\r\n\r\nexport function getXR(): XR | null;\r\nexport function getXR(engine: Readonly): XR;\r\nexport function getXR(engine: Readonly | null = Globals.getMainEngine()): XR | null {\r\n let xr = null;\r\n\r\n if (engine != null) {\r\n xr = engine.xr;\r\n }\r\n\r\n return xr;\r\n}", "import { WonderlandEngine } from \"@wonderlandengine/api\";\r\nimport { Globals } from \"../../../pp/globals.js\";\r\nimport { DefaultResources, DefaultResourcesMaterials, DefaultResourcesMeshes } from \"./default_resources.js\";\r\n\r\nconst _myDefaultResourcesContainer: WeakMap, DefaultResources> = new WeakMap();\r\n\r\nexport function getDefaultResources(engine: Readonly | null = Globals.getMainEngine()): DefaultResources | null {\r\n if (engine == null) return null;\r\n\r\n const defaultResources = _myDefaultResourcesContainer.get(engine);\r\n return defaultResources != null ? defaultResources : null;\r\n}\r\n\r\nexport function setDefaultResources(defaultResources: DefaultResources, engine: Readonly | null = Globals.getMainEngine()): void {\r\n if (engine != null) {\r\n _myDefaultResourcesContainer.set(engine, defaultResources);\r\n }\r\n}\r\n\r\nexport function removeDefaultResources(engine: Readonly | null = Globals.getMainEngine()): void {\r\n if (engine != null) {\r\n _myDefaultResourcesContainer.delete(engine);\r\n }\r\n}\r\n\r\nexport function hasDefaultResources(engine: Readonly | null = Globals.getMainEngine()): boolean {\r\n return engine != null ? _myDefaultResourcesContainer.has(engine) : false;\r\n}\r\n\r\nexport function getDefaultMeshes(engine: Readonly | null = Globals.getMainEngine()): DefaultResourcesMeshes | null {\r\n const defaultResources = getDefaultResources(engine);\r\n\r\n if (defaultResources != null) {\r\n return defaultResources.myMeshes;\r\n }\r\n\r\n return null;\r\n}\r\n\r\nexport function getDefaultMaterials(engine: Readonly | null = Globals.getMainEngine()): DefaultResourcesMaterials | null {\r\n const defaultResources = getDefaultResources(engine);\r\n\r\n if (defaultResources != null) {\r\n return defaultResources.myMaterials;\r\n }\r\n\r\n return null;\r\n}", "import { Object3D, WonderlandEngine } from \"@wonderlandengine/api\";\r\nimport { Globals } from \"../../../pp/globals.js\";\r\nimport { PlayerObjects, SceneObjects } from \"./scene_objects.js\";\r\n\r\nconst _mySceneObjectsContainer: WeakMap, SceneObjects> = new WeakMap();\r\n\r\nexport function getSceneObjects(engine: Readonly | null = Globals.getMainEngine()): SceneObjects | null {\r\n if (engine == null) return null;\r\n\r\n const sceneObjects = _mySceneObjectsContainer.get(engine);\r\n return sceneObjects != null ? sceneObjects : null;\r\n}\r\n\r\nexport function setSceneObjects(sceneObjects: SceneObjects, engine: Readonly | null = Globals.getMainEngine()): void {\r\n if (engine != null) {\r\n _mySceneObjectsContainer.set(engine, sceneObjects);\r\n }\r\n}\r\n\r\nexport function removeSceneObjects(engine: Readonly | null = Globals.getMainEngine()): void {\r\n if (engine != null) {\r\n _mySceneObjectsContainer.delete(engine);\r\n }\r\n}\r\n\r\nexport function hasSceneObjects(engine: Readonly | null = Globals.getMainEngine()): boolean {\r\n return engine != null ? _mySceneObjectsContainer.has(engine) : false;\r\n}\r\n\r\nexport function getRootObject(engine: Readonly | null = Globals.getMainEngine()): Object3D | null {\r\n const sceneObjects = getSceneObjects(engine);\r\n\r\n if (sceneObjects != null) {\r\n return sceneObjects.myRoot;\r\n }\r\n\r\n return null;\r\n}\r\n\r\nexport function getSceneObject(engine: Readonly | null = Globals.getMainEngine()): Object3D | null {\r\n const sceneObjects = getSceneObjects(engine);\r\n\r\n if (sceneObjects != null) {\r\n return sceneObjects.myScene;\r\n }\r\n\r\n return null;\r\n}\r\n\r\nexport function getPlayerObjects(engine: Readonly | null = Globals.getMainEngine()): PlayerObjects | null {\r\n const sceneObjects = getSceneObjects(engine);\r\n\r\n if (sceneObjects != null) {\r\n return sceneObjects.myPlayerObjects;\r\n }\r\n\r\n return null;\r\n}\r\n\r\nexport function getPlayerObject(engine: Readonly | null = Globals.getMainEngine()): Object3D | null {\r\n const sceneObjects = getSceneObjects(engine);\r\n\r\n if (sceneObjects != null) {\r\n return sceneObjects.myPlayerObjects.myPlayer;\r\n }\r\n\r\n return null;\r\n}\r\n\r\nexport function getPlayerReferenceSpaceObject(engine: Readonly | null = Globals.getMainEngine()): Object3D | null {\r\n const sceneObjects = getSceneObjects(engine);\r\n\r\n if (sceneObjects != null) {\r\n return sceneObjects.myPlayerObjects.myReferenceSpace;\r\n }\r\n\r\n return null;\r\n}\r\n\r\nexport function getPlayerHeadObject(engine: Readonly | null = Globals.getMainEngine()): Object3D | null {\r\n const sceneObjects = getSceneObjects(engine);\r\n\r\n if (sceneObjects != null) {\r\n return sceneObjects.myPlayerObjects.myHead;\r\n }\r\n\r\n return null;\r\n}", "import { WonderlandEngine } from \"@wonderlandengine/api\";\r\nimport { Globals } from \"../pp/globals.js\";\r\nimport { DebugManager } from \"./debug_manager.js\";\r\nimport { DebugVisualManager } from \"./debug_visual_manager.js\";\r\n\r\nconst _myDebugManagers: WeakMap, DebugManager> = new WeakMap();\r\nconst _myDebugEnableds: WeakMap, boolean> = new WeakMap();\r\n\r\nexport function getDebugManager(engine: Readonly | null = Globals.getMainEngine()): DebugManager | null {\r\n if (engine == null) return null;\r\n\r\n const debugManager = _myDebugManagers.get(engine);\r\n return debugManager != null ? debugManager : null;\r\n}\r\n\r\nexport function setDebugManager(debugManager: DebugManager, engine: Readonly | null = Globals.getMainEngine()): void {\r\n if (engine != null) {\r\n _myDebugManagers.set(engine, debugManager);\r\n }\r\n}\r\n\r\nexport function removeDebugManager(engine: Readonly | null = Globals.getMainEngine()): void {\r\n if (engine != null) {\r\n _myDebugManagers.delete(engine);\r\n }\r\n}\r\n\r\nexport function hasDebugManager(engine: Readonly | null = Globals.getMainEngine()): boolean {\r\n return engine != null ? _myDebugManagers.has(engine) : false;\r\n}\r\n\r\nexport function getDebugVisualManager(engine: Readonly | null = Globals.getMainEngine()): DebugVisualManager | null {\r\n const debugManager = getDebugManager(engine);\r\n\r\n if (debugManager != null) {\r\n return debugManager.getDebugVisualManager();\r\n }\r\n\r\n return null;\r\n}\r\n\r\nexport function isDebugEnabled(engine: Readonly | null = Globals.getMainEngine()): boolean {\r\n return engine != null ? !!_myDebugEnableds.get(engine) : false;\r\n}\r\n\r\nexport function setDebugEnabled(debugEnabled: boolean, engine: Readonly | null = Globals.getMainEngine()): void {\r\n if (engine != null) {\r\n _myDebugEnableds.set(engine, debugEnabled);\r\n }\r\n}\r\n\r\nexport function removeDebugEnabled(engine: Readonly | null = Globals.getMainEngine()): void {\r\n if (engine != null) {\r\n _myDebugEnableds.delete(engine);\r\n }\r\n}\r\n\r\nexport function hasDebugEnabled(engine: Readonly | null = Globals.getMainEngine()): boolean {\r\n return engine != null ? _myDebugEnableds.has(engine) : false;\r\n}", "import { WonderlandEngine } from \"@wonderlandengine/api\";\r\nimport { Globals } from \"../../../../pp/globals.js\";\r\nimport { CharacterCollisionSystem } from \"./character_collision_system.js\";\r\n\r\nconst _myCharacterCollisionSystems: WeakMap, CharacterCollisionSystem> = new WeakMap();\r\n\r\nexport function getCharacterCollisionSystem(engine: Readonly | null = Globals.getMainEngine()): CharacterCollisionSystem | null {\r\n if (engine == null) return null;\r\n\r\n const characterCollisionSystem = _myCharacterCollisionSystems.get(engine);\r\n return characterCollisionSystem != null ? characterCollisionSystem : null;\r\n}\r\n\r\nexport function setCharacterCollisionSystem(characterCollisionSystem: CharacterCollisionSystem, engine: Readonly | null = Globals.getMainEngine()): void {\r\n if (engine != null) {\r\n _myCharacterCollisionSystems.set(engine, characterCollisionSystem);\r\n }\r\n}\r\n\r\nexport function removeCharacterCollisionSystem(engine: Readonly | null = Globals.getMainEngine()): void {\r\n if (engine != null) {\r\n _myCharacterCollisionSystems.delete(engine);\r\n }\r\n}\r\n\r\nexport function hasCharacterCollisionSystem(engine: Readonly | null = Globals.getMainEngine()): boolean {\r\n return engine != null ? _myCharacterCollisionSystems.has(engine) : false;\r\n}", "import { WonderlandEngine } from \"@wonderlandengine/api\";\r\nimport { Globals } from \"../../../pp/globals.js\";\r\nimport { PlayerHeadManager } from \"./legacy/locomotion/player_head_manager.js\";\r\nimport { PlayerLocomotion } from \"./legacy/locomotion/player_locomotion.js\";\r\nimport { PlayerLocomotionRotate } from \"./legacy/locomotion/player_locomotion_rotate.js\";\r\nimport { PlayerLocomotionSmooth } from \"./legacy/locomotion/player_locomotion_smooth.js\";\r\nimport { PlayerObscureManager } from \"./legacy/locomotion/player_obscure_manager.js\";\r\nimport { PlayerTransformManager } from \"./legacy/locomotion/player_transform_manager.js\";\r\nimport { PlayerLocomotionTeleport } from \"./legacy/locomotion/teleport/player_locomotion_teleport.js\";\r\n\r\nconst _myPlayerLocomotions: WeakMap, PlayerLocomotion> = new WeakMap();\r\n\r\nexport function getPlayerLocomotion(engine: Readonly | null = Globals.getMainEngine()): PlayerLocomotion | null {\r\n if (engine == null) return null;\r\n\r\n return _myPlayerLocomotions.get(engine) ?? null;\r\n}\r\n\r\nexport function setPlayerLocomotion(playerLocomotionComponent: PlayerLocomotion, engine: Readonly | null = Globals.getMainEngine()): void {\r\n if (engine != null) {\r\n _myPlayerLocomotions.set(engine, playerLocomotionComponent);\r\n }\r\n}\r\n\r\nexport function removePlayerLocomotion(engine: Readonly | null = Globals.getMainEngine()): void {\r\n if (engine != null) {\r\n _myPlayerLocomotions.delete(engine);\r\n }\r\n}\r\n\r\nexport function hasPlayerLocomotion(engine: Readonly | null = Globals.getMainEngine()): boolean {\r\n return engine != null ? _myPlayerLocomotions.has(engine) : false;\r\n}\r\n\r\nexport function getPlayerHeadManager(engine: Readonly | null = Globals.getMainEngine()): PlayerHeadManager | null {\r\n const playerLocomotion = getPlayerLocomotion(engine);\r\n\r\n if (playerLocomotion != null) {\r\n return playerLocomotion.getPlayerHeadManager();\r\n }\r\n\r\n return null;\r\n}\r\n\r\nexport function getPlayerTransformManager(engine: Readonly | null = Globals.getMainEngine()): PlayerTransformManager | null {\r\n const playerLocomotion = getPlayerLocomotion(engine);\r\n\r\n if (playerLocomotion != null) {\r\n return playerLocomotion.getPlayerTransformManager();\r\n }\r\n\r\n return null;\r\n}\r\n\r\nexport function getPlayerLocomotionSmooth(engine: Readonly | null = Globals.getMainEngine()): PlayerLocomotionSmooth | null {\r\n const playerLocomotion = getPlayerLocomotion(engine);\r\n\r\n if (playerLocomotion != null) {\r\n return playerLocomotion.getPlayerLocomotionSmooth();\r\n }\r\n\r\n return null;\r\n}\r\n\r\nexport function getPlayerLocomotionTeleport(engine: Readonly | null = Globals.getMainEngine()): PlayerLocomotionTeleport | null {\r\n const playerLocomotion = getPlayerLocomotion(engine);\r\n\r\n if (playerLocomotion != null) {\r\n return playerLocomotion.getPlayerLocomotionTeleport();\r\n }\r\n\r\n return null;\r\n}\r\n\r\nexport function getPlayerLocomotionRotate(engine: Readonly | null = Globals.getMainEngine()): PlayerLocomotionRotate | null {\r\n const playerLocomotion = getPlayerLocomotion(engine);\r\n\r\n if (playerLocomotion != null) {\r\n return playerLocomotion.getPlayerLocomotionRotate();\r\n }\r\n\r\n return null;\r\n}\r\n\r\nexport function getPlayerObscureManager(engine: Readonly | null = Globals.getMainEngine()): PlayerObscureManager | null {\r\n const playerLocomotion = getPlayerLocomotion(engine);\r\n\r\n if (playerLocomotion != null) {\r\n return playerLocomotion.getPlayerObscureManager();\r\n }\r\n\r\n return null;\r\n}", "import { WonderlandEngine } from \"@wonderlandengine/api\";\r\nimport { GamepadsManager } from \"../../input/gamepad/cauldron/gamepads_manager.js\";\r\nimport { HandPose } from \"../../input/pose/hand_pose.js\";\r\nimport { HeadPose } from \"../../input/pose/head_pose.js\";\r\nimport { TrackedHandPose } from \"../../input/pose/tracked_hand_pose.js\";\r\nimport { Globals } from \"../../pp/globals.js\";\r\nimport { Gamepad } from \"../gamepad/gamepad.js\";\r\nimport { HandRayPose } from \"../pose/hand_ray_pose.js\";\r\nimport { InputManager } from \"./input_manager.js\";\r\nimport { Handedness } from \"./input_types.js\";\r\nimport { Keyboard } from \"./keyboard.js\";\r\nimport { Mouse } from \"./mouse.js\";\r\n\r\nconst _myInputManagers: WeakMap, InputManager> = new WeakMap();\r\nconst _myPoseForwardFixeds: WeakMap, boolean> = new WeakMap();\r\n\r\nexport function getInputManager(engine: Readonly | null = Globals.getMainEngine()): InputManager | null {\r\n if (engine == null) return null;\r\n\r\n const inputManager = _myInputManagers.get(engine);\r\n return inputManager != null ? inputManager : null;\r\n}\r\n\r\nexport function setInputManager(inputManager: InputManager, engine: Readonly | null = Globals.getMainEngine()): void {\r\n if (engine != null) {\r\n _myInputManagers.set(engine, inputManager);\r\n }\r\n}\r\n\r\nexport function removeInputManager(engine: Readonly | null = Globals.getMainEngine()): void {\r\n if (engine != null) {\r\n _myInputManagers.delete(engine);\r\n }\r\n}\r\n\r\nexport function hasInputManager(engine: Readonly | null = Globals.getMainEngine()): boolean {\r\n return engine != null ? _myInputManagers.has(engine) : false;\r\n}\r\n\r\nexport function getMouse(engine: Readonly | null = Globals.getMainEngine()): Mouse | null {\r\n const inputManager = getInputManager(engine);\r\n\r\n if (inputManager != null) {\r\n return inputManager.getMouse();\r\n }\r\n\r\n return null;\r\n}\r\n\r\nexport function getKeyboard(engine: Readonly | null = Globals.getMainEngine()): Keyboard | null {\r\n const inputManager = getInputManager(engine);\r\n\r\n if (inputManager != null) {\r\n return inputManager.getKeyboard();\r\n }\r\n\r\n return null;\r\n}\r\n\r\n// Gamepad\r\n\r\nexport function getGamepadsManager(engine: Readonly | null = Globals.getMainEngine()): GamepadsManager | null {\r\n const inputManager = getInputManager(engine);\r\n\r\n if (inputManager != null) {\r\n return inputManager.getGamepadsManager();\r\n }\r\n\r\n return null;\r\n}\r\n\r\nexport function getGamepad(handedness: Handedness, engine: Readonly | null = Globals.getMainEngine()): Gamepad | null {\r\n const inputManager = getInputManager(engine);\r\n\r\n if (inputManager != null) {\r\n return inputManager.getGamepadsManager().getGamepad(handedness);\r\n }\r\n\r\n return null;\r\n}\r\n\r\nexport function getGamepads(engine: Readonly | null = Globals.getMainEngine()): Record | null {\r\n const inputManager = getInputManager(engine);\r\n\r\n if (inputManager != null) {\r\n return inputManager.getGamepadsManager().getGamepads();\r\n }\r\n\r\n return null;\r\n}\r\n\r\nexport function getLeftGamepad(engine: Readonly | null = Globals.getMainEngine()): Gamepad | null {\r\n const inputManager = getInputManager(engine);\r\n\r\n if (inputManager != null) {\r\n return inputManager.getGamepadsManager().getLeftGamepad();\r\n }\r\n\r\n return null;\r\n}\r\n\r\nexport function getRightGamepad(engine: Readonly | null = Globals.getMainEngine()): Gamepad | null {\r\n const inputManager = getInputManager(engine);\r\n\r\n if (inputManager != null) {\r\n return inputManager.getGamepadsManager().getRightGamepad();\r\n }\r\n\r\n return null;\r\n}\r\n\r\n// Pose\r\n\r\nexport function getHeadPose(engine: Readonly | null = Globals.getMainEngine()): HeadPose | null {\r\n const inputManager = getInputManager(engine);\r\n\r\n if (inputManager != null) {\r\n return inputManager.getHeadPose();\r\n }\r\n\r\n return null;\r\n}\r\n\r\nexport function getHandPose(handedness: Handedness, engine: Readonly | null = Globals.getMainEngine()): HandPose | null {\r\n const inputManager = getInputManager(engine);\r\n\r\n if (inputManager != null) {\r\n return inputManager.getHandPose(handedness);\r\n }\r\n\r\n return null;\r\n}\r\n\r\nexport function getHandPoses(engine: Readonly | null = Globals.getMainEngine()): Record | null {\r\n const inputManager = getInputManager(engine);\r\n\r\n if (inputManager != null) {\r\n return inputManager.getHandPoses();\r\n }\r\n\r\n return null;\r\n}\r\n\r\nexport function getLeftHandPose(engine: Readonly | null = Globals.getMainEngine()): HandPose | null {\r\n const inputManager = getInputManager(engine);\r\n\r\n if (inputManager != null) {\r\n return inputManager.getLeftHandPose();\r\n }\r\n\r\n return null;\r\n}\r\n\r\nexport function getRightHandPose(engine: Readonly | null = Globals.getMainEngine()): HandPose | null {\r\n const inputManager = getInputManager(engine);\r\n\r\n if (inputManager != null) {\r\n return inputManager.getRightHandPose();\r\n }\r\n\r\n return null;\r\n}\r\n\r\nexport function getHandRayPose(handedness: Handedness, engine: Readonly | null = Globals.getMainEngine()): HandRayPose | null {\r\n const inputManager = getInputManager(engine);\r\n\r\n if (inputManager != null) {\r\n return inputManager.getHandRayPose(handedness);\r\n }\r\n\r\n return null;\r\n}\r\n\r\nexport function getHandRayPoses(engine: Readonly | null = Globals.getMainEngine()): Record | null {\r\n const inputManager = getInputManager(engine);\r\n\r\n if (inputManager != null) {\r\n return inputManager.getHandRayPoses();\r\n }\r\n\r\n return null;\r\n}\r\n\r\nexport function getLeftHandRayPose(engine: Readonly | null = Globals.getMainEngine()): HandRayPose | null {\r\n const inputManager = getInputManager(engine);\r\n\r\n if (inputManager != null) {\r\n return inputManager.getLeftHandRayPose();\r\n }\r\n\r\n return null;\r\n}\r\n\r\nexport function getRightHandRayPose(engine: Readonly | null = Globals.getMainEngine()): HandRayPose | null {\r\n const inputManager = getInputManager(engine);\r\n\r\n if (inputManager != null) {\r\n return inputManager.getRightHandRayPose();\r\n }\r\n\r\n return null;\r\n}\r\n\r\nexport function getTrackedHandPose(handedness: Handedness, engine: Readonly | null = Globals.getMainEngine()): TrackedHandPose | null {\r\n const inputManager = getInputManager(engine);\r\n\r\n if (inputManager != null) {\r\n return inputManager.getTrackedHandPose(handedness);\r\n }\r\n\r\n return null;\r\n}\r\n\r\nexport function getTrackedHandPoses(engine: Readonly | null = Globals.getMainEngine()): Record | null {\r\n const inputManager = getInputManager(engine);\r\n\r\n if (inputManager != null) {\r\n return inputManager.getTrackedHandPoses();\r\n }\r\n\r\n return null;\r\n}\r\n\r\nexport function getLeftTrackedHandPose(engine: Readonly | null = Globals.getMainEngine()): TrackedHandPose | null {\r\n const inputManager = getInputManager(engine);\r\n\r\n if (inputManager != null) {\r\n return inputManager.getLeftTrackedHandPose();\r\n }\r\n\r\n return null;\r\n}\r\n\r\nexport function getRightTrackedHandPose(engine: Readonly | null = Globals.getMainEngine()): TrackedHandPose | null {\r\n const inputManager = getInputManager(engine);\r\n\r\n if (inputManager != null) {\r\n return inputManager.getRightTrackedHandPose();\r\n }\r\n\r\n return null;\r\n}\r\n\r\n// Pose Forward Fixed\r\n\r\nexport function isPoseForwardFixed(engine: Readonly | null = Globals.getMainEngine()): boolean {\r\n return engine != null ? !!_myPoseForwardFixeds.get(engine) : false;\r\n}\r\n\r\nexport function setPoseForwardFixed(toolEnabled: boolean, engine: Readonly | null = Globals.getMainEngine()): void {\r\n if (engine != null) {\r\n _myPoseForwardFixeds.set(engine, toolEnabled);\r\n }\r\n}\r\n\r\nexport function removePoseForwardFixed(engine: Readonly | null = Globals.getMainEngine()): void {\r\n if (engine != null) {\r\n _myPoseForwardFixeds.delete(engine);\r\n }\r\n}\r\n\r\nexport function hasPoseForwardFixed(engine: Readonly | null = Globals.getMainEngine()): boolean {\r\n return engine != null ? _myPoseForwardFixeds.has(engine) : false;\r\n}", "import { WonderlandEngine } from \"@wonderlandengine/api\";\r\nimport { Globals } from \"../../pp/globals.js\";\r\n\r\nconst _myToolEnableds: WeakMap, boolean> = new WeakMap();\r\n\r\nexport function isToolEnabled(engine: Readonly | null = Globals.getMainEngine()): boolean | null {\r\n if (engine == null) return null;\r\n\r\n const toolEnabled = _myToolEnableds.get(engine);\r\n return toolEnabled != null ? toolEnabled : null;\r\n}\r\n\r\nexport function setToolEnabled(toolEnabled: boolean, engine: Readonly | null = Globals.getMainEngine()): void {\r\n if (engine != null) {\r\n _myToolEnableds.set(engine, toolEnabled);\r\n }\r\n}\r\n\r\nexport function removeToolEnabled(engine: Readonly | null = Globals.getMainEngine()): void {\r\n if (engine != null) {\r\n _myToolEnableds.delete(engine);\r\n }\r\n}\r\n\r\nexport function hasToolEnabled(engine: Readonly | null = Globals.getMainEngine()): boolean {\r\n return engine != null ? _myToolEnableds.has(engine) : false;\r\n}", "import { WonderlandEngine } from \"@wonderlandengine/api\";\r\nimport { Globals } from \"../../pp/globals.js\";\r\nimport { ConsoleVR } from \"./console_vr.js\";\r\nimport { ConsoleVRWidget } from \"./console_vr_widget.js\";\r\n\r\nconst _myConsoleVRs: WeakMap, ConsoleVR> = new WeakMap();\r\nconst _myConsoleVRWidgets: WeakMap, ConsoleVRWidget> = new WeakMap();\r\n\r\nexport function getConsoleVR(engine: Readonly | null = Globals.getMainEngine()): ConsoleVR | null {\r\n if (engine == null) return null;\r\n\r\n const consoleVR = _myConsoleVRs.get(engine);\r\n return consoleVR != null ? consoleVR : null;\r\n}\r\n\r\nexport function setConsoleVR(consoleVR: ConsoleVR, engine: Readonly | null = Globals.getMainEngine()): void {\r\n if (engine != null) {\r\n _myConsoleVRs.set(engine, consoleVR);\r\n }\r\n}\r\n\r\nexport function removeConsoleVR(engine: Readonly | null = Globals.getMainEngine()): void {\r\n if (engine != null) {\r\n _myConsoleVRs.delete(engine);\r\n }\r\n}\r\n\r\nexport function hasConsoleVR(engine: Readonly | null = Globals.getMainEngine()): boolean {\r\n return engine != null ? _myConsoleVRs.has(engine) : false;\r\n}\r\n\r\nexport function getConsoleVRWidget(engine: Readonly | null = Globals.getMainEngine()): ConsoleVRWidget | null {\r\n if (engine == null) return null;\r\n\r\n const consoleVRWidget = _myConsoleVRWidgets.get(engine);\r\n return consoleVRWidget != null ? consoleVRWidget : null;\r\n}\r\n\r\nexport function setConsoleVRWidget(consoleVRWidget: ConsoleVRWidget, engine: Readonly | null = Globals.getMainEngine()): void {\r\n if (engine != null) {\r\n _myConsoleVRWidgets.set(engine, consoleVRWidget);\r\n }\r\n}\r\n\r\nexport function removeConsoleVRWidget(engine: Readonly | null = Globals.getMainEngine()): void {\r\n if (engine != null) {\r\n _myConsoleVRWidgets.delete(engine);\r\n }\r\n}\r\n\r\nexport function hasConsoleVRWidget(engine: Readonly | null = Globals.getMainEngine()): boolean {\r\n return engine != null ? _myConsoleVRWidgets.has(engine) : false;\r\n}", "import { Object3D, WonderlandEngine } from \"@wonderlandengine/api\";\r\nimport { Globals } from \"../../pp/globals.js\";\r\nimport { EasyTuneVariables } from \"./easy_tune_variables.js\";\r\nimport { EasyTuneWidget } from \"./easy_tune_widgets/easy_tune_widget.js\";\r\n\r\nconst _myEasyTuneVariablesList: WeakMap, EasyTuneVariables> = new WeakMap();\r\nconst _myEasyTuneTargets: WeakMap, Object3D> = new WeakMap();\r\nconst _myEasyTuneWidgets: WeakMap, EasyTuneWidget> = new WeakMap();\r\n\r\nexport function getEasyTuneVariables(engine: Readonly | null = Globals.getMainEngine()): EasyTuneVariables | null {\r\n if (engine == null) return null;\r\n\r\n const easyTuneVariables = _myEasyTuneVariablesList.get(engine);\r\n return easyTuneVariables != null ? easyTuneVariables : null;\r\n}\r\n\r\nexport function setEasyTuneVariables(easyTuneVariables: EasyTuneVariables, engine: Readonly | null = Globals.getMainEngine()): void {\r\n if (engine != null) {\r\n _myEasyTuneVariablesList.set(engine, easyTuneVariables);\r\n }\r\n}\r\n\r\nexport function removeEasyTuneVariables(engine: Readonly | null = Globals.getMainEngine()): void {\r\n if (engine != null) {\r\n _myEasyTuneVariablesList.delete(engine);\r\n }\r\n}\r\n\r\nexport function hasEasyTuneVariables(engine: Readonly | null = Globals.getMainEngine()): boolean {\r\n return engine != null ? _myEasyTuneVariablesList.has(engine) : false;\r\n}\r\n\r\nexport function getEasyTuneTarget(engine: Readonly | null = Globals.getMainEngine()): Object3D | null {\r\n if (engine == null) return null;\r\n\r\n const easyTuneTarget = _myEasyTuneTargets.get(engine);\r\n return easyTuneTarget != null ? easyTuneTarget : null;\r\n}\r\n\r\nexport function setEasyTuneTarget(easyTuneTarget: Object3D, engine: Readonly | null = Globals.getMainEngine()): void {\r\n if (engine != null) {\r\n _myEasyTuneTargets.set(engine, easyTuneTarget);\r\n }\r\n}\r\n\r\nexport function removeEasyTuneTarget(engine: Readonly | null = Globals.getMainEngine()): void {\r\n if (engine != null) {\r\n _myEasyTuneTargets.delete(engine);\r\n }\r\n}\r\n\r\nexport function hasEasyTuneTarget(engine: Readonly | null = Globals.getMainEngine()): boolean {\r\n return engine != null ? _myEasyTuneTargets.has(engine) : false;\r\n}\r\n\r\nexport function getEasyTuneWidget(engine: Readonly | null = Globals.getMainEngine()): EasyTuneWidget | null {\r\n if (engine == null) return null;\r\n\r\n const easyTuneWidget = _myEasyTuneWidgets.get(engine);\r\n return easyTuneWidget != null ? easyTuneWidget : null;\r\n}\r\n\r\nexport function setEasyTuneWidget(easyTuneWidget: EasyTuneWidget, engine: Readonly | null = Globals.getMainEngine()): void {\r\n if (engine != null) {\r\n _myEasyTuneWidgets.set(engine, easyTuneWidget);\r\n }\r\n}\r\n\r\nexport function removeEasyTuneWidget(engine: Readonly | null = Globals.getMainEngine()): void {\r\n if (engine != null) {\r\n _myEasyTuneWidgets.delete(engine);\r\n }\r\n}\r\n\r\nexport function hasEasyTuneWidget(engine: Readonly | null = Globals.getMainEngine()): boolean {\r\n return engine != null ? _myEasyTuneWidgets.has(engine) : false;\r\n}", "import * as AudioGlobals from \"../audio/audio_globals.js\";\r\nimport * as AnalyticsGlobals from \"../cauldron/cauldron/analytics_globals.js\";\r\nimport * as SaveGlobals from \"../cauldron/cauldron/save_globals.js\";\r\nimport * as ObjectPoolManagerGlobals from \"../cauldron/object_pool/object_pool_globals.js\";\r\nimport * as VisualGlobals from \"../cauldron/visual/visual_globals.js\";\r\nimport * as EngineGlobals from \"../cauldron/wl/engine_globals.js\";\r\nimport * as DefaultResourcesGlobals from \"../cauldron/wl/getters/default_resources_globals.js\";\r\nimport * as SceneObjectsGlobals from \"../cauldron/wl/getters/scene_objects_globals.js\";\r\nimport * as DebugGlobals from \"../debug/debug_globals.js\";\r\nimport * as CharacterCollisionSystemGlobals from \"../gameplay/experimental/character_controller/collision/character_collision_system_globals.js\";\r\nimport * as PlayerLocomotionGlobals from \"../gameplay/experimental/locomotion/player_locomotion_globals.js\";\r\nimport * as InputGlobals from \"../input/cauldron/input_globals.js\";\r\nimport * as ToolGlobals from \"../tool/cauldron/tool_globals.js\";\r\nimport * as ConsoleVRGlobals from \"../tool/console_vr/console_vr_globals.js\";\r\nimport * as EasyTuneGlobals from \"../tool/easy_tune/easy_tune_globals.js\";\r\n\r\nexport const Globals = {\r\n ...EngineGlobals,\r\n ...SceneObjectsGlobals,\r\n ...DefaultResourcesGlobals,\r\n ...AudioGlobals,\r\n ...VisualGlobals,\r\n ...DebugGlobals,\r\n ...ObjectPoolManagerGlobals,\r\n ...CharacterCollisionSystemGlobals,\r\n ...PlayerLocomotionGlobals,\r\n ...InputGlobals,\r\n ...SaveGlobals,\r\n ...AnalyticsGlobals,\r\n ...ToolGlobals,\r\n ...ConsoleVRGlobals,\r\n ...EasyTuneGlobals\r\n} as const;", "import { mat3 as gl_mat3, quat as gl_quat, type mat3 as gl_mat3_type, type quat as gl_quat_type } from \"gl-matrix\";\r\nimport { Matrix3, Quaternion, Vector3 } from \"../../type_definitions/array_type_definitions.js\";\r\nimport { QuatUtils, create as quat_utils_create } from \"./quat_utils.js\";\r\nimport { Vec3Utils } from \"./vec3_utils.js\";\r\nimport { getMatrix3AllocationFunction, setMatrix3AllocationFunction } from \"./vec_allocation_utils.js\";\r\n\r\nexport function create(): Matrix3;\r\nexport function create(m00: number, m01: number, m02: number, m10: number, m11: number, m12: number, m20: number, m21: number, m22: number): Matrix3;\r\nexport function create(uniformValue: number): Matrix3;\r\nexport function create(\r\n m00?: number, m01?: number, m02?: number,\r\n m10?: number, m11?: number, m12?: number,\r\n m20?: number, m21?: number, m22?: number): Matrix3 {\r\n\r\n const out = getAllocationFunction()();\r\n\r\n if (m00 != null) {\r\n Mat3Utils.set(out,\r\n m00, m01!, m02!,\r\n m10!, m11!, m12!,\r\n m20!, m21!, m22!);\r\n }\r\n\r\n return out;\r\n}\r\n\r\nexport function getAllocationFunction(): () => Matrix3 {\r\n return getMatrix3AllocationFunction();\r\n}\r\n\r\n/** Specify the function that will be used to allocate the matrix when calling the {@link create} function */\r\nexport function setAllocationFunction(allocationFunction: () => Matrix3): void {\r\n setMatrix3AllocationFunction(allocationFunction);\r\n}\r\n\r\nexport function set(matrix: T, m00: number, m01: number, m02: number, m10: number, m11: number, m12: number, m20: number, m21: number, m22: number): T;\r\nexport function set(matrix: T, uniformValue: number): T;\r\nexport function set(matrix: T,\r\n m00: number, m01?: number, m02?: number,\r\n m10?: number, m11?: number, m12?: number,\r\n m20?: number, m21?: number, m22?: number): T {\r\n\r\n if (m01 == null) {\r\n gl_mat3.set(matrix as unknown as gl_mat3_type,\r\n m00!, m00, m00,\r\n m00, m00, m00,\r\n m00, m00, m00);\r\n } else {\r\n gl_mat3.set(matrix as unknown as gl_mat3_type,\r\n m00, m01, m02!,\r\n m10!, m11!, m12!,\r\n m20!, m21!, m22!);\r\n }\r\n\r\n return matrix;\r\n}\r\n\r\nexport function copy(from: Readonly, to: T): T {\r\n gl_mat3.copy(to as unknown as gl_mat3_type, from as unknown as gl_mat3_type);\r\n return to;\r\n}\r\n\r\n/** The overload where `T extends Vector2` does also get `array` as `Readonly`, but is not marked as such due to \r\n Typescript having issues with inferring the proper type of `T` when `Readonly` is used */\r\nexport function clone(matrix: Readonly): T;\r\nexport function clone(matrix: Readonly): number[];\r\nexport function clone(matrix: T): T;\r\nexport function clone(matrix: Readonly): T {\r\n return matrix.slice(0) as T;\r\n}\r\n\r\nexport function equals(first: Readonly, second: Readonly, epsilon: number = 0): boolean {\r\n let equals = first.length == second.length;\r\n\r\n if (equals) {\r\n equals &&= (Math.abs(first[0] - second[0]) <= epsilon);\r\n equals &&= (Math.abs(first[1] - second[1]) <= epsilon);\r\n equals &&= (Math.abs(first[2] - second[2]) <= epsilon);\r\n equals &&= (Math.abs(first[3] - second[3]) <= epsilon);\r\n equals &&= (Math.abs(first[4] - second[4]) <= epsilon);\r\n equals &&= (Math.abs(first[5] - second[5]) <= epsilon);\r\n equals &&= (Math.abs(first[6] - second[6]) <= epsilon);\r\n equals &&= (Math.abs(first[7] - second[7]) <= epsilon);\r\n equals &&= (Math.abs(first[8] - second[8]) <= epsilon);\r\n }\r\n\r\n return equals;\r\n}\r\n\r\n\r\nexport const toDegrees = function () {\r\n const quat = quat_utils_create();\r\n\r\n function toDegrees(matrix: Readonly): Vector3;\r\n function toDegrees(matrix: Readonly, out: T): T;\r\n function toDegrees(matrix: Readonly, out: Vector3 | T = Vec3Utils.create()): Vector3 | T {\r\n Mat3Utils.toQuat(matrix, quat);\r\n QuatUtils.toDegrees(quat, out);\r\n return out;\r\n }\r\n\r\n return toDegrees;\r\n}();\r\n\r\nexport const toRadians = function () {\r\n const quat = quat_utils_create();\r\n\r\n function toRadians(matrix: Readonly): Vector3;\r\n function toRadians(matrix: Readonly, out: T): T;\r\n function toRadians(matrix: Readonly, out: Vector3 | T = Vec3Utils.create()): Vector3 | T {\r\n Mat3Utils.toQuat(matrix, quat);\r\n QuatUtils.toRadians(quat, out);\r\n return out;\r\n }\r\n\r\n return toRadians;\r\n}();\r\n\r\nexport function toQuat(matrix: Readonly): Quaternion;\r\nexport function toQuat(matrix: Readonly, out: T): T;\r\nexport function toQuat(matrix: Readonly, out: Quaternion | T = QuatUtils.create()): Quaternion | T {\r\n gl_quat.fromMat3(out as unknown as gl_quat_type, matrix as unknown as gl_mat3_type);\r\n return out;\r\n}\r\n\r\nexport function fromAxes(left: Readonly, up: Readonly, forward: Readonly): Matrix3;\r\nexport function fromAxes(left: Readonly, up: Readonly, forward: Readonly, out: T): T;\r\nexport function fromAxes(left: Readonly, up: Readonly, forward: Readonly, out: Matrix3 | T = Mat3Utils.create()): Matrix3 | T {\r\n Mat3Utils.set(out,\r\n left[0], left[1], left[2],\r\n up[0], up[1], up[2],\r\n forward[0], forward[1], forward[2]);\r\n return out;\r\n}\r\n\r\nexport const Mat3Utils = {\r\n create,\r\n getAllocationFunction,\r\n setAllocationFunction,\r\n set,\r\n copy,\r\n clone,\r\n equals,\r\n toDegrees,\r\n toRadians,\r\n toQuat,\r\n fromAxes\r\n} as const;", "import { mat3 as gl_mat3, quat as gl_quat, type mat3 as gl_mat3_type, type quat as gl_quat_type, type vec3 as gl_vec3_type } from \"gl-matrix\";\r\nimport { Matrix3, Quaternion, Vector3 } from \"../../../cauldron/type_definitions/array_type_definitions.js\";\r\nimport { EasingFunction, MathUtils } from \"../math_utils.js\";\r\nimport { ArrayUtils } from \"./array_utils.js\";\r\nimport { Mat3Utils, create as mat3_utils_create } from \"./mat3_utils.js\";\r\nimport { Vec3Utils, create as vec3_utils_create } from \"./vec3_utils.js\";\r\nimport { getQuaternionAllocationFunction, setQuaternionAllocationFunction } from \"./vec_allocation_utils.js\";\r\n\r\nexport function create(): Quaternion;\r\nexport function create(x: number, y: number, z: number, w: number): Quaternion;\r\nexport function create(uniformValue: number): Quaternion;\r\nexport function create(x?: number, y?: number, z?: number, w?: number): Quaternion {\r\n const out = getAllocationFunction()();\r\n\r\n if (x != null) {\r\n QuatUtils.set(out, x, y!, z!, w!);\r\n }\r\n\r\n return out;\r\n}\r\n\r\nexport function getAllocationFunction(): () => Quaternion {\r\n return getQuaternionAllocationFunction();\r\n}\r\n\r\n/** Specify the function that will be used to allocate the quaternion when calling the {@link create} function */\r\nexport function setAllocationFunction(allocationFunction: () => Quaternion): void {\r\n setQuaternionAllocationFunction(allocationFunction);\r\n}\r\n\r\nexport function set(quat: T, x: number, y: number, z: number, w: number): T;\r\nexport function set(quat: T, uniformValue: number): T;\r\nexport function set(quat: T, x: number, y?: number, z?: number, w?: number): T {\r\n if (y == null) {\r\n gl_quat.set(quat as unknown as gl_quat_type, x, x, x, x);\r\n } else {\r\n gl_quat.set(quat as unknown as gl_quat_type, x, y, z!, w!);\r\n }\r\n\r\n return quat;\r\n}\r\n\r\nexport function copy(from: Readonly, to: T): T {\r\n gl_quat.copy(to as unknown as gl_quat_type, from as unknown as gl_quat_type);\r\n return to;\r\n}\r\n\r\n/** The overload where `T extends Quaternion` does also get `array` as `Readonly`, but is not marked as such due to \r\n Typescript having issues with inferring the proper type of `T` when `Readonly` is used */\r\nexport function clone(quat: Readonly): T;\r\nexport function clone(quat: Readonly): number[];\r\nexport function clone(quat: T): T;\r\nexport function clone(quat: Readonly): T {\r\n return quat.slice(0) as T;\r\n}\r\n\r\nexport function equals(first: Readonly, second: Readonly, epsilon: number = 0): boolean {\r\n let equals = first.length == second.length;\r\n\r\n if (equals) {\r\n equals &&= (Math.abs(first[0] - second[0]) <= epsilon);\r\n equals &&= (Math.abs(first[1] - second[1]) <= epsilon);\r\n equals &&= (Math.abs(first[2] - second[2]) <= epsilon);\r\n equals &&= (Math.abs(first[3] - second[3]) <= epsilon);\r\n }\r\n\r\n return equals;\r\n}\r\n\r\nexport function isNormalized(quat: Readonly, epsilon: number = MathUtils.EPSILON): boolean {\r\n return Math.abs(QuatUtils.lengthSquared(quat) - 1) < epsilon;\r\n}\r\n\r\nexport function normalize(quat: Readonly): T;\r\nexport function normalize(quat: Readonly, out: T): T;\r\nexport function normalize(quat: Readonly, out: T | U = QuatUtils.clone(quat)): T | U {\r\n gl_quat.normalize(out as unknown as gl_quat_type, quat as unknown as gl_quat_type);\r\n return out;\r\n}\r\n\r\nexport function length(quat: Readonly): number {\r\n return gl_quat.length(quat as unknown as gl_quat_type);\r\n}\r\n\r\nexport function lengthSquared(quat: Readonly): number {\r\n return gl_quat.squaredLength(quat as unknown as gl_quat_type);\r\n}\r\n\r\nexport function identity(quat: T): T {\r\n gl_quat.identity(quat as unknown as gl_quat_type);\r\n return quat;\r\n}\r\n\r\nexport function mul(first: Readonly, second: Readonly): T;\r\nexport function mul(first: Readonly, second: Readonly, out: T): T;\r\nexport function mul(first: Readonly, second: Readonly, out: T | U = QuatUtils.clone(first)): T | U {\r\n gl_quat.mul(out as unknown as gl_quat_type, first as unknown as gl_quat_type, second as unknown as gl_quat_type);\r\n return out;\r\n}\r\n\r\nexport function invert(quat: Readonly): T;\r\nexport function invert(quat: Readonly, out: T): T;\r\nexport function invert(quat: Readonly, out: T | U = QuatUtils.clone(quat)): T | U {\r\n gl_quat.invert(out as unknown as gl_quat_type, quat as unknown as gl_quat_type);\r\n return out;\r\n}\r\n\r\nexport function conjugate(quat: Readonly): T;\r\nexport function conjugate(quat: Readonly, out: T): T;\r\nexport function conjugate(quat: Readonly, out: T | U = QuatUtils.clone(quat)): T | U {\r\n gl_quat.conjugate(out as unknown as gl_quat_type, quat as unknown as gl_quat_type);\r\n return out;\r\n}\r\n\r\nexport function lerp(from: Readonly, to: Readonly, interpolationFactor: number): T;\r\nexport function lerp(from: Readonly, to: Readonly, interpolationFactor: number, out: T): T;\r\nexport function lerp(from: Readonly, to: Readonly, interpolationFactor: number, out: T | U = QuatUtils.clone(from)): T | U {\r\n if (interpolationFactor <= 0) {\r\n QuatUtils.copy(from, out);\r\n return out;\r\n } else if (interpolationFactor >= 1) {\r\n QuatUtils.copy(to, out);\r\n return out;\r\n }\r\n\r\n gl_quat.lerp(out as unknown as gl_quat_type, from as unknown as gl_quat_type, to as unknown as gl_quat_type, interpolationFactor);\r\n return out;\r\n}\r\n\r\nexport function interpolate(from: Readonly, to: Readonly, interpolationFactor: number, easingFunction?: EasingFunction): T;\r\nexport function interpolate(from: Readonly, to: Readonly, interpolationFactor: number, easingFunction: EasingFunction, out: T): T;\r\nexport function interpolate(from: Readonly, to: Readonly, interpolationFactor: number, easingFunction: EasingFunction = EasingFunction.linear, out: T | U = QuatUtils.clone(from)): T | U {\r\n const lerpFactor = easingFunction(interpolationFactor);\r\n return QuatUtils.lerp(from, to, lerpFactor, out);\r\n}\r\n\r\nexport function slerp(from: Readonly, to: Readonly, interpolationFactor: number): T;\r\nexport function slerp(from: Readonly, to: Readonly, interpolationFactor: number, out: T): T;\r\nexport function slerp(from: Readonly, to: Readonly, interpolationFactor: number, out: T | U = QuatUtils.clone(from)): T | U {\r\n if (interpolationFactor <= 0) {\r\n QuatUtils.copy(from, out);\r\n return out;\r\n } else if (interpolationFactor >= 1) {\r\n QuatUtils.copy(to, out);\r\n return out;\r\n }\r\n\r\n gl_quat.slerp(out as unknown as gl_quat_type, from as unknown as gl_quat_type, to as unknown as gl_quat_type, interpolationFactor);\r\n return out;\r\n}\r\n\r\nexport function interpolateSpherical(from: Readonly, to: Readonly, interpolationFactor: number, easingFunction?: EasingFunction): T;\r\nexport function interpolateSpherical(from: Readonly, to: Readonly, interpolationFactor: number, easingFunction: EasingFunction, out: T): T;\r\nexport function interpolateSpherical(from: Readonly, to: Readonly, interpolationFactor: number, easingFunction: EasingFunction = EasingFunction.linear, out: T | U = QuatUtils.clone(from)): T | U {\r\n const lerpFactor = easingFunction(interpolationFactor);\r\n return QuatUtils.slerp(from, to, lerpFactor, out);\r\n}\r\n\r\nexport function getAngle(quat: Readonly): number {\r\n return QuatUtils.getAngleDegrees(quat);\r\n}\r\n\r\nexport function getAngleDegrees(quat: Readonly): number {\r\n const angle = QuatUtils.getAngleRadians(quat);\r\n return MathUtils.toDegrees(angle);\r\n}\r\n\r\nexport const getAngleRadians = function () {\r\n const vector = vec3_utils_create();\r\n return function getAngleRadians(quat: Readonly): number {\r\n const angle = gl_quat.getAxisAngle(vector as unknown as gl_vec3_type, quat as unknown as gl_quat_type);\r\n return angle;\r\n };\r\n}();\r\n\r\nexport const getAxis = function () {\r\n const zero = vec3_utils_create(0, 0, 0);\r\n\r\n function getAxis(quat: Readonly): Vector3;\r\n function getAxis(quat: Readonly, out: T): T;\r\n function getAxis(quat: Readonly, out: Vector3 | T = Vec3Utils.create()): Vector3 | T {\r\n const angle = gl_quat.getAxisAngle(out as unknown as gl_vec3_type, quat as unknown as gl_quat_type);\r\n if (angle <= MathUtils.EPSILON) {\r\n Vec3Utils.copy(zero, out);\r\n }\r\n return out;\r\n }\r\n\r\n return getAxis;\r\n}();\r\n\r\n\r\nexport function getAxisScaled(quat: Readonly): Vector3;\r\nexport function getAxisScaled(quat: Readonly, out: T): T;\r\nexport function getAxisScaled(quat: Readonly, out: Vector3 | T = Vec3Utils.create()): Vector3 | T {\r\n return QuatUtils.getAxisScaledDegrees(quat, out);\r\n}\r\n\r\nexport function getAxisScaledDegrees(quat: Readonly): Vector3;\r\nexport function getAxisScaledDegrees(quat: Readonly, out: T): T;\r\nexport function getAxisScaledDegrees(quat: Readonly, out: Vector3 | T = Vec3Utils.create()): Vector3 | T {\r\n QuatUtils.getAxis(quat, out);\r\n const angle = QuatUtils.getAngleDegrees(quat);\r\n Vec3Utils.scale(out, angle, out);\r\n return out;\r\n}\r\n\r\nexport const getAxisScaledRadians = function () {\r\n const zero = vec3_utils_create(0, 0, 0);\r\n\r\n function getAxisScaledRadians(quat: Readonly): Vector3;\r\n function getAxisScaledRadians(quat: Readonly, out: T): T;\r\n function getAxisScaledRadians(quat: Readonly, out: Vector3 | T = Vec3Utils.create()): Vector3 | T {\r\n QuatUtils.getAxis(quat, out);\r\n const angle = QuatUtils.getAngleRadians(quat);\r\n if (angle <= MathUtils.EPSILON) {\r\n Vec3Utils.copy(zero, out);\r\n } else {\r\n Vec3Utils.scale(out, angle, out);\r\n }\r\n return out;\r\n }\r\n\r\n return getAxisScaledRadians;\r\n}();\r\n\r\nexport function getAxes(quat: Readonly): [Vector3, Vector3, Vector3];\r\nexport function getAxes(quat: Readonly, out: [T, U, V]): [T, U, V];\r\nexport function getAxes(quat: Readonly, out: [Vector3, Vector3, Vector3] | [T, U, V] = [Vec3Utils.create(), Vec3Utils.create(), Vec3Utils.create()]): [Vector3, Vector3, Vector3] | [T, U, V] {\r\n QuatUtils.getLeft(quat, out[0]);\r\n QuatUtils.getUp(quat, out[1]);\r\n QuatUtils.getForward(quat, out[2]);\r\n return out;\r\n}\r\n\r\nexport const getForward = function () {\r\n const rotationMatrix = mat3_utils_create();\r\n\r\n function getForward(quat: Readonly): Vector3;\r\n function getForward(quat: Readonly, out: T): T;\r\n function getForward(quat: Readonly, out: Vector3 | T = Vec3Utils.create()): Vector3 | T {\r\n QuatUtils.toMatrix(quat, rotationMatrix);\r\n\r\n Vec3Utils.set(out, rotationMatrix[6], rotationMatrix[7], rotationMatrix[8]);\r\n\r\n return out;\r\n }\r\n\r\n return getForward;\r\n}();\r\n\r\nexport function getBackward(quat: Readonly): Vector3;\r\nexport function getBackward(quat: Readonly, out: T): T;\r\nexport function getBackward(quat: Readonly, out?: Vector3 | T): Vector3 | T {\r\n out = QuatUtils.getForward(quat, out!);\r\n Vec3Utils.negate(out, out);\r\n return out!;\r\n}\r\n\r\nexport const getLeft = function () {\r\n const rotationMatrix = mat3_utils_create();\r\n\r\n function getLeft(quat: Readonly): Vector3;\r\n function getLeft(quat: Readonly, out: T): T;\r\n function getLeft(quat: Readonly, out: Vector3 | T = Vec3Utils.create()): Vector3 | T {\r\n QuatUtils.toMatrix(quat, rotationMatrix);\r\n\r\n Vec3Utils.set(out, rotationMatrix[0], rotationMatrix[1], rotationMatrix[2]);\r\n\r\n return out;\r\n }\r\n\r\n return getLeft;\r\n}();\r\n\r\nexport function getRight(quat: Readonly): Vector3;\r\nexport function getRight(quat: Readonly, out: T): T;\r\nexport function getRight(quat: Readonly, out?: Vector3 | T): Vector3 | T {\r\n out = QuatUtils.getLeft(quat, out!);\r\n Vec3Utils.negate(out, out);\r\n return out!;\r\n}\r\n\r\nexport const getUp = function () {\r\n const rotationMatrix = mat3_utils_create();\r\n\r\n function getUp(quat: Readonly): Vector3;\r\n function getUp(quat: Readonly, out: T): T;\r\n function getUp(quat: Readonly, out: Vector3 | T = Vec3Utils.create()): Vector3 | T {\r\n QuatUtils.toMatrix(quat, rotationMatrix);\r\n\r\n Vec3Utils.set(out, rotationMatrix[3], rotationMatrix[4], rotationMatrix[5]);\r\n\r\n return out;\r\n }\r\n\r\n return getUp;\r\n}();\r\n\r\nexport function getDown(quat: Readonly): Vector3;\r\nexport function getDown(quat: Readonly, out: T): T;\r\nexport function getDown(quat: Readonly, out?: Vector3 | T): Vector3 | T {\r\n out = QuatUtils.getUp(quat, out!);\r\n Vec3Utils.negate(out, out);\r\n return out!;\r\n}\r\n\r\nexport function setAxes(quat: T, left: Readonly, up: Readonly, forward: Readonly): T {\r\n if (forward != null) {\r\n return QuatUtils.setForward(quat, forward, up, left);\r\n } else if (up != null) {\r\n return QuatUtils.setUp(quat, up, forward, left);\r\n } else {\r\n return QuatUtils.setLeft(quat, left, up, forward);\r\n }\r\n}\r\n\r\nexport const setForward = function () {\r\n const axes: [Readonly | null, Readonly | null, Readonly | null] = [null, null, null];\r\n const priority = [2, 1, 0];\r\n return function setForward(quat: T, forward: Readonly, up?: Readonly, left?: Readonly): T {\r\n axes[0] = left!;\r\n axes[1] = up!;\r\n axes[2] = forward;\r\n\r\n _setAxes(quat, axes, priority);\r\n\r\n axes[0] = null;\r\n axes[1] = null;\r\n axes[2] = null;\r\n\r\n return quat;\r\n };\r\n}();\r\n\r\nexport const setBackward = function () {\r\n const forward = vec3_utils_create();\r\n\r\n const axes: [Readonly | null, Readonly | null, Readonly | null] = [null, null, null];\r\n const priority = [2, 1, 0];\r\n return function setBackward(quat: T, backward: Readonly, up?: Readonly, left?: Readonly): T {\r\n Vec3Utils.negate(backward, forward);\r\n\r\n axes[0] = left || null;\r\n axes[1] = up || null;\r\n axes[2] = forward;\r\n\r\n _setAxes(quat, axes, priority);\r\n\r\n axes[0] = null;\r\n axes[1] = null;\r\n axes[2] = null;\r\n\r\n return quat;\r\n };\r\n}();\r\n\r\nexport const setUp = function () {\r\n const axes: [Readonly | null, Readonly | null, Readonly | null] = [null, null, null];\r\n const priority = [1, 2, 0];\r\n return function setUp(quat: T, up: Readonly, forward?: Readonly, left?: Readonly): T {\r\n axes[0] = left || null;\r\n axes[1] = up;\r\n axes[2] = forward || null;\r\n\r\n _setAxes(quat, axes, priority);\r\n\r\n axes[0] = null;\r\n axes[1] = null;\r\n axes[2] = null;\r\n\r\n return quat;\r\n };\r\n}();\r\n\r\nexport const setDown = function () {\r\n const up = vec3_utils_create();\r\n\r\n const axes: [Readonly | null, Readonly | null, Readonly | null] = [null, null, null];\r\n const priority = [1, 2, 0];\r\n return function setDown(quat: T, down: Readonly, forward?: Readonly, left?: Readonly): T {\r\n Vec3Utils.negate(down, up);\r\n\r\n axes[0] = left || null;\r\n axes[1] = up;\r\n axes[2] = forward || null;\r\n\r\n _setAxes(quat, axes, priority);\r\n\r\n axes[0] = null;\r\n axes[1] = null;\r\n axes[2] = null;\r\n\r\n return quat;\r\n };\r\n}();\r\n\r\nexport const setLeft = function () {\r\n const axes: [Readonly | null, Readonly | null, Readonly | null] = [null, null, null];\r\n const priority = [0, 1, 2];\r\n return function setLeft(quat: T, left: Readonly, up?: Readonly, forward?: Readonly): T {\r\n axes[0] = left;\r\n axes[1] = up || null;\r\n axes[2] = forward || null;\r\n\r\n _setAxes(quat, axes, priority);\r\n\r\n axes[0] = null;\r\n axes[1] = null;\r\n axes[2] = null;\r\n\r\n return quat;\r\n };\r\n}();\r\n\r\nexport const setRight = function () {\r\n const left = vec3_utils_create();\r\n\r\n const axes: [Readonly | null, Readonly | null, Readonly | null] = [null, null, null];\r\n const priority = [0, 1, 2];\r\n return function setRight(quat: T, right: Readonly, up?: Readonly, forward?: Readonly): T {\r\n Vec3Utils.negate(right, left);\r\n\r\n axes[0] = left;\r\n axes[1] = up || null;\r\n axes[2] = forward || null;\r\n\r\n _setAxes(quat, axes, priority);\r\n\r\n axes[0] = null;\r\n axes[1] = null;\r\n axes[2] = null;\r\n\r\n return quat;\r\n };\r\n}();\r\n\r\nexport function toWorld(quat: Readonly, parentRotationQuat: Readonly): T;\r\nexport function toWorld(quat: Readonly, parentRotationQuat: Readonly, out: T): T;\r\nexport function toWorld(quat: Readonly, parentRotationQuat: Readonly, out: T | U = QuatUtils.clone(quat)): T | U {\r\n QuatUtils.mul(parentRotationQuat, quat, out);\r\n return out;\r\n}\r\n\r\nexport const toLocal = function () {\r\n const invertQuat = create();\r\n\r\n function toLocal(quat: Readonly, parentRotationQuat: Readonly): T;\r\n function toLocal(quat: Readonly, parentRotationQuat: Readonly, out: T): T;\r\n function toLocal(quat: Readonly, parentRotationQuat: Readonly, out: T | U = QuatUtils.clone(quat)): T | U {\r\n QuatUtils.conjugate(parentRotationQuat, invertQuat);\r\n QuatUtils.mul(invertQuat, quat, out);\r\n return out;\r\n }\r\n\r\n return toLocal;\r\n}();\r\n\r\nexport function fromDegrees(rotation: Readonly): Quaternion;\r\nexport function fromDegrees(rotation: Readonly, out: T): T;\r\nexport function fromDegrees(rotation: Readonly, out: Quaternion | T = QuatUtils.create()): Quaternion | T {\r\n gl_quat.fromEuler(out as unknown as gl_quat_type, rotation[0], rotation[1], rotation[2]);\r\n return out;\r\n}\r\n\r\nexport const fromRadians = function () {\r\n const vector = vec3_utils_create();\r\n\r\n function fromRadians(rotation: Readonly): Quaternion;\r\n function fromRadians(rotation: Readonly, out: T): T;\r\n function fromRadians(rotation: Readonly, out: Quaternion | T = QuatUtils.create()): Quaternion | T {\r\n Vec3Utils.toDegrees(rotation, vector);\r\n return QuatUtils.fromDegrees(vector, out);\r\n }\r\n\r\n return fromRadians;\r\n}();\r\n\r\nexport function fromAxis(angle: number, axis: Readonly): Quaternion;\r\nexport function fromAxis(angle: number, axis: Readonly, out: T): T;\r\nexport function fromAxis(angle: number, axis: Readonly, out: Quaternion | T = QuatUtils.create()): Quaternion | T {\r\n return QuatUtils.fromAxisDegrees(angle, axis, out);\r\n}\r\n\r\nexport function fromAxisDegrees(angle: number, axis: Readonly): Quaternion;\r\nexport function fromAxisDegrees(angle: number, axis: Readonly, out: T): T;\r\nexport function fromAxisDegrees(angle: number, axis: Readonly, out: Quaternion | T = QuatUtils.create()): Quaternion | T {\r\n QuatUtils.fromAxisRadians(MathUtils.toRadians(angle), axis, out);\r\n return out;\r\n}\r\n\r\nexport function fromAxisRadians(angle: number, axis: Readonly): Quaternion;\r\nexport function fromAxisRadians(angle: number, axis: Readonly, out: T): T;\r\nexport function fromAxisRadians(angle: number, axis: Readonly, out: Quaternion | T = QuatUtils.create()): Quaternion | T {\r\n gl_quat.setAxisAngle(out as unknown as gl_quat_type, axis as unknown as gl_vec3_type, angle);\r\n return out;\r\n}\r\n\r\nexport const fromAxes = function () {\r\n const matrix = mat3_utils_create();\r\n\r\n function fromAxes(left: Readonly, up: Readonly, forward: Readonly): Quaternion;\r\n function fromAxes(left: Readonly, up: Readonly, forward: Readonly, out: T): T;\r\n function fromAxes(left: Readonly, up: Readonly, forward: Readonly, out: Quaternion | T = QuatUtils.create()): Quaternion | T {\r\n Mat3Utils.fromAxes(left, up, forward, matrix);\r\n return Mat3Utils.toQuat(matrix, out);\r\n }\r\n\r\n return fromAxes;\r\n}();\r\n\r\nexport function toDegrees(quat: Readonly): Vector3;\r\nexport function toDegrees(quat: Readonly, out: T): T;\r\nexport function toDegrees(quat: Readonly, out: Vector3 | T = Vec3Utils.create()): Vector3 | T {\r\n QuatUtils.toRadians(quat, out);\r\n Vec3Utils.toDegrees(out, out);\r\n return out;\r\n}\r\n\r\nexport const toRadians = function () {\r\n const matrix = mat3_utils_create();\r\n\r\n function toRadians(quat: Readonly): Vector3;\r\n function toRadians(quat: Readonly, out: T): T;\r\n function toRadians(quat: Readonly, out: Vector3 | T = Vec3Utils.create()): Vector3 | T {\r\n QuatUtils.toMatrix(quat, matrix);\r\n\r\n // Rotation order is ZYX \r\n out[1] = Math.asin(-MathUtils.clamp(matrix[2], -1, 1));\r\n\r\n if (Math.abs(matrix[2]) < (1 - MathUtils.EPSILON)) {\r\n out[0] = Math.atan2(matrix[5], matrix[8]);\r\n out[2] = Math.atan2(matrix[1], matrix[0]);\r\n } else {\r\n out[0] = 0;\r\n out[2] = Math.atan2(-matrix[3], matrix[4]);\r\n }\r\n\r\n return out;\r\n }\r\n\r\n return toRadians;\r\n}();\r\n\r\nexport function toMatrix(quat: Readonly): Matrix3;\r\nexport function toMatrix(quat: Readonly, out: T): T;\r\nexport function toMatrix(quat: Readonly, out: Matrix3 | T = Mat3Utils.create()): Matrix3 | T {\r\n gl_mat3.fromQuat(out as unknown as gl_mat3_type, quat as unknown as gl_quat_type);\r\n return out;\r\n}\r\n\r\nexport function addRotation(first: Readonly, second: Readonly): T;\r\nexport function addRotation(first: Readonly, second: Readonly, out: T): T;\r\nexport function addRotation(first: Readonly, second: Readonly, out?: T | U): T | U {\r\n return QuatUtils.addRotationDegrees(first, second, out!);\r\n}\r\n\r\nexport const addRotationDegrees = function () {\r\n const secondQuat = create();\r\n\r\n function addRotationDegrees(first: Readonly, second: Readonly): T;\r\n function addRotationDegrees(first: Readonly, second: Readonly, out: T): T;\r\n function addRotationDegrees(first: Readonly, second: Readonly, out?: T | U): T | U {\r\n Vec3Utils.degreesToQuat(second, secondQuat);\r\n return QuatUtils.addRotationQuat(first, secondQuat, out!);\r\n }\r\n\r\n return addRotationDegrees;\r\n}();\r\n\r\nexport const addRotationRadians = function () {\r\n const secondQuat = create();\r\n\r\n function addRotationRadians(first: Readonly, second: Readonly): T;\r\n function addRotationRadians(first: Readonly, second: Readonly, out: T): T;\r\n function addRotationRadians(first: Readonly, second: Readonly, out?: T | U): T | U {\r\n Vec3Utils.radiansToQuat(second, secondQuat);\r\n return QuatUtils.addRotationQuat(first, secondQuat, out!);\r\n }\r\n\r\n return addRotationRadians;\r\n}();\r\n\r\nexport function addRotationQuat(first: Readonly, second: Readonly): T;\r\nexport function addRotationQuat(first: Readonly, second: Readonly, out: T): T;\r\nexport function addRotationQuat(first: Readonly, second: Readonly, out: T | U = QuatUtils.clone(first)): T | U {\r\n QuatUtils.mul(second, first, out);\r\n return out;\r\n}\r\n\r\nexport function subRotation(first: Readonly, second: Readonly): T;\r\nexport function subRotation(first: Readonly, second: Readonly, out: T): T;\r\nexport function subRotation(first: Readonly, second: Readonly, out?: T | U): T | U {\r\n return QuatUtils.subRotationDegrees(first, second, out!);\r\n}\r\n\r\nexport const subRotationDegrees = function () {\r\n const secondQuat = create();\r\n\r\n function subRotationDegrees(first: Readonly, second: Readonly): T;\r\n function subRotationDegrees(first: Readonly, second: Readonly, out: T): T;\r\n function subRotationDegrees(first: Readonly, second: Readonly, out?: T | U): T | U {\r\n Vec3Utils.degreesToQuat(second, secondQuat);\r\n return QuatUtils.subRotationQuat(first, secondQuat, out!);\r\n }\r\n\r\n return subRotationDegrees;\r\n}();\r\n\r\nexport const subRotationRadians = function () {\r\n const secondQuat = create();\r\n\r\n function subRotationRadians(first: Readonly, second: Readonly): T;\r\n function subRotationRadians(first: Readonly, second: Readonly, out: T): T;\r\n function subRotationRadians(first: Readonly, second: Readonly, out?: T | U): T | U {\r\n Vec3Utils.radiansToQuat(second, secondQuat);\r\n return QuatUtils.subRotationQuat(first, secondQuat, out!);\r\n }\r\n\r\n return subRotationRadians;\r\n}();\r\n\r\nexport const subRotationQuat = function () {\r\n const inverse = create();\r\n\r\n function subRotationQuat(first: Readonly, second: Readonly): T;\r\n function subRotationQuat(first: Readonly, second: Readonly, out: T): T;\r\n function subRotationQuat(first: Readonly, second: Readonly, out: T | U = QuatUtils.clone(first)): T | U {\r\n QuatUtils.invert(second, inverse);\r\n QuatUtils.mul(first, inverse, out);\r\n return out;\r\n }\r\n\r\n return subRotationQuat;\r\n}();\r\n\r\nexport function rotationTo(from: Readonly, to: Readonly): T;\r\nexport function rotationTo(from: Readonly, to: Readonly, out: T): T;\r\nexport function rotationTo(from: Readonly, to: Readonly, out?: T | U): T | U {\r\n return QuatUtils.rotationToDegrees(from, to, out!);\r\n}\r\n\r\nexport const rotationToDegrees = function () {\r\n const toQuat = create();\r\n\r\n function rotationToDegrees(from: Readonly, to: Readonly): T;\r\n function rotationToDegrees(from: Readonly, to: Readonly, out: T): T;\r\n function rotationToDegrees(from: Readonly, to: Readonly, out?: T | U): T | U {\r\n Vec3Utils.degreesToQuat(to, toQuat);\r\n return QuatUtils.rotationToQuat(from, toQuat, out!);\r\n }\r\n\r\n return rotationToDegrees;\r\n}();\r\n\r\nexport const rotationToRadians = function () {\r\n const toQuat = create();\r\n\r\n function rotationToRadians(from: Readonly, to: Readonly): T;\r\n function rotationToRadians(from: Readonly, to: Readonly, out: T): T;\r\n function rotationToRadians(from: Readonly, to: Readonly, out?: T | U): T | U {\r\n Vec3Utils.radiansToQuat(to, toQuat);\r\n return QuatUtils.rotationToQuat(from, toQuat, out!);\r\n }\r\n\r\n return rotationToRadians;\r\n}();\r\n\r\nexport function rotationToQuat(from: Readonly, to: Readonly): T;\r\nexport function rotationToQuat(from: Readonly, to: Readonly, out: T): T;\r\nexport function rotationToQuat(from: Readonly, to: Readonly, out?: T | U): T | U {\r\n return QuatUtils.normalize(QuatUtils.subRotationQuat(to, from, out!), out!);\r\n}\r\n\r\n\r\nexport function rotationAroundAxis(quat: Readonly, axis: Readonly): T;\r\nexport function rotationAroundAxis(quat: Readonly, axis: Readonly, out: T): T;\r\nexport function rotationAroundAxis(quat: Readonly, axis: Readonly, out?: T | U): T | U {\r\n return QuatUtils.rotationAroundAxisDegrees(quat, axis, out!);\r\n}\r\n\r\nexport const rotationAroundAxisDegrees = function () {\r\n const rotationAroundQuat = create();\r\n\r\n function rotationAroundAxisDegrees(quat: Readonly, axis: Readonly): T;\r\n function rotationAroundAxisDegrees(quat: Readonly, axis: Readonly, out: T): T;\r\n function rotationAroundAxisDegrees(quat: Readonly, axis: Readonly, out: T | U = Vec3Utils.clone(axis)): T | U {\r\n QuatUtils.rotationAroundAxisQuat(quat, axis, rotationAroundQuat);\r\n return QuatUtils.toDegrees(rotationAroundQuat, out);\r\n }\r\n\r\n return rotationAroundAxisDegrees;\r\n}();\r\n\r\nexport const rotationAroundAxisRadians = function () {\r\n const rotationAroundQuat = create();\r\n\r\n function rotationAroundAxisRadians(quat: Readonly, axis: Readonly): T;\r\n function rotationAroundAxisRadians(quat: Readonly, axis: Readonly, out: T): T;\r\n function rotationAroundAxisRadians(quat: Readonly, axis: Readonly, out: T | U = Vec3Utils.clone(axis)): T | U {\r\n QuatUtils.rotationAroundAxisQuat(quat, axis, rotationAroundQuat);\r\n return QuatUtils.toRadians(rotationAroundQuat, out);\r\n }\r\n\r\n return rotationAroundAxisRadians;\r\n}();\r\n\r\nexport function rotationAroundAxisQuat(quat: Readonly, axis: Readonly): T;\r\nexport function rotationAroundAxisQuat(quat: Readonly, axis: Readonly, out: T): T;\r\nexport function rotationAroundAxisQuat(quat: Readonly, axis: Readonly, out: T | U = QuatUtils.clone(quat)): T | U {\r\n return QuatUtils.getTwist(quat, axis, out);\r\n}\r\n\r\nexport const getTwist = function () {\r\n const rotationAxis = vec3_utils_create();\r\n const projection = vec3_utils_create();\r\n const rotationAlongAxis = create();\r\n\r\n function getTwist(quat: Readonly, axis: Readonly): T;\r\n function getTwist(quat: Readonly, axis: Readonly, out: T): T;\r\n function getTwist(quat: Readonly, axis: Readonly, out: T | U = QuatUtils.clone(quat)): T | U {\r\n rotationAxis[0] = quat[0];\r\n rotationAxis[1] = quat[1];\r\n rotationAxis[2] = quat[2];\r\n\r\n const dotProd = Vec3Utils.dot(axis, rotationAxis);\r\n Vec3Utils.scale(axis, dotProd, projection);\r\n rotationAlongAxis[0] = projection[0];\r\n rotationAlongAxis[1] = projection[1];\r\n rotationAlongAxis[2] = projection[2];\r\n rotationAlongAxis[3] = quat[3];\r\n QuatUtils.normalize(rotationAlongAxis, rotationAlongAxis);\r\n if (dotProd < 0) {\r\n rotationAlongAxis[0] = -rotationAlongAxis[0];\r\n rotationAlongAxis[1] = -rotationAlongAxis[1];\r\n rotationAlongAxis[2] = -rotationAlongAxis[2];\r\n rotationAlongAxis[3] = -rotationAlongAxis[3];\r\n }\r\n\r\n return QuatUtils.copy(rotationAlongAxis, out);\r\n }\r\n\r\n return getTwist;\r\n}();\r\n\r\nexport const getSwing = function () {\r\n const twist = create();\r\n\r\n function getSwing(quat: Readonly, axis: Readonly): T;\r\n function getSwing(quat: Readonly, axis: Readonly, out: T): T;\r\n function getSwing(quat: Readonly, axis: Readonly, out: T | U = QuatUtils.clone(quat)): T | U {\r\n QuatUtils.getTwist(quat, axis, twist);\r\n QuatUtils.getSwingFromTwist(quat, twist, out);\r\n return out;\r\n }\r\n\r\n return getSwing;\r\n}();\r\n\r\nexport function getSwingFromTwist(quat: Readonly, axis: Readonly): T;\r\nexport function getSwingFromTwist(quat: Readonly, axis: Readonly, out: T): T;\r\nexport function getSwingFromTwist(quat: Readonly, twist: Readonly, out: T | U = QuatUtils.clone(quat)): T | U {\r\n return QuatUtils.subRotationQuat(quat, twist, out);\r\n}\r\n\r\nexport const getTwistFromSwing = function () {\r\n const inverse = create();\r\n\r\n function getTwistFromSwing(quat: Readonly, swing: Readonly): T;\r\n function getTwistFromSwing(quat: Readonly, swing: Readonly, out: T): T;\r\n function getTwistFromSwing(quat: Readonly, swing: Readonly, out: T | U = QuatUtils.clone(quat)): T | U {\r\n QuatUtils.conjugate(swing, inverse);\r\n QuatUtils.addRotationQuat(quat, inverse, out);\r\n return out;\r\n }\r\n\r\n return getTwistFromSwing;\r\n}();\r\n\r\nexport function fromTwistSwing(twist: Readonly, swing: Readonly): T;\r\nexport function fromTwistSwing(twist: Readonly, swing: Readonly, out: T): T;\r\nexport function fromTwistSwing(twist: Readonly, swing: Readonly, out: T | U = QuatUtils.clone(twist)): T | U {\r\n return QuatUtils.addRotationQuat(twist, swing, out);\r\n}\r\n\r\nexport function rotate(first: Readonly, second: Readonly): T;\r\nexport function rotate(first: Readonly, second: Readonly, out: T): T;\r\nexport function rotate(first: Readonly, second: Readonly, out?: T | U): T | U {\r\n return QuatUtils.rotateDegrees(first, second, out!);\r\n}\r\n\r\nexport function rotateDegrees(first: Readonly, second: Readonly): T;\r\nexport function rotateDegrees(first: Readonly, second: Readonly, out: T): T;\r\nexport function rotateDegrees(first: Readonly, second: Readonly, out?: T | U): T | U {\r\n return QuatUtils.addRotationDegrees(first, second, out!);\r\n}\r\n\r\nexport function rotateRadians(first: Readonly, second: Readonly): T;\r\nexport function rotateRadians(first: Readonly, second: Readonly, out: T): T;\r\nexport function rotateRadians(first: Readonly, second: Readonly, out?: T | U): T | U {\r\n return QuatUtils.addRotationRadians(first, second, out!);\r\n}\r\n\r\nexport function rotateQuat(first: Readonly, second: Readonly): T;\r\nexport function rotateQuat(first: Readonly, second: Readonly, out: T): T;\r\nexport function rotateQuat(first: Readonly, second: Readonly, out?: T | U): T | U {\r\n return QuatUtils.addRotationQuat(first, second, out!);\r\n}\r\n\r\nexport function rotateAxis(quat: Readonly, angle: number, axis: Readonly): T;\r\nexport function rotateAxis(quat: Readonly, angle: number, axis: Readonly, out?: T): T;\r\nexport function rotateAxis(quat: Readonly, angle: number, axis: Readonly, out?: T | U): T | U {\r\n return QuatUtils.rotateAxisDegrees(quat, angle, axis, out);\r\n}\r\n\r\nexport const rotateAxisDegrees = function () {\r\n const secondQuat = create();\r\n\r\n function rotateAxisDegrees(quat: Readonly, angle: number, axis: Readonly): T;\r\n function rotateAxisDegrees(quat: Readonly, angle: number, axis: Readonly, out?: T): T;\r\n function rotateAxisDegrees(quat: Readonly, angle: number, axis: Readonly, out?: T | U): T | U {\r\n QuatUtils.fromAxisDegrees(angle, axis, secondQuat);\r\n return QuatUtils.rotateQuat(quat, secondQuat, out!);\r\n }\r\n\r\n return rotateAxisDegrees;\r\n}();\r\n\r\nexport const rotateAxisRadians = function () {\r\n const secondQuat = create();\r\n\r\n function rotateAxisRadians(quat: Readonly, angle: number, axis: Readonly): T;\r\n function rotateAxisRadians(quat: Readonly, angle: number, axis: Readonly, out?: T): T;\r\n function rotateAxisRadians(quat: Readonly, angle: number, axis: Readonly, out?: T | U): T | U {\r\n QuatUtils.fromAxisRadians(angle, axis, secondQuat);\r\n return QuatUtils.rotateQuat(quat, secondQuat, out!);\r\n }\r\n\r\n return rotateAxisRadians;\r\n}();\r\n\r\n/**\r\n * How to use\r\n * \r\n * By default rotations are in `Degrees` and transforms are `Matrix4` (and not `Quat2`) \r\n * For functions that work with rotations, `Matrix` means `Matrix3` and `Quat` means `Quat` \r\n * For functions that work with transforms, `Matrix` means `Matrix4` and `Quat` means `Quat2`\r\n * \r\n * For rotations u can add a suffix like `Degrees`/`Radians`/`Quat`/`Matrix` to use a specific version, example: \r\n * - `getAngleRadians` \r\n * - `addRotationQuat`\r\n * \r\n * The functions leave u the choice of forwarding an out parameter or just get the return value, example: \r\n * - `let forward = QuatUtils.getForward(quat)` \r\n * - `QuatUtils.getForward(quat, forward)` \r\n * - the out parameter is always the last one\r\n */\r\nexport const QuatUtils = {\r\n create,\r\n getAllocationFunction,\r\n setAllocationFunction,\r\n set,\r\n copy,\r\n clone,\r\n equals,\r\n isNormalized,\r\n normalize,\r\n length,\r\n lengthSquared,\r\n identity,\r\n mul,\r\n invert,\r\n conjugate,\r\n lerp,\r\n interpolate,\r\n slerp,\r\n interpolateSpherical,\r\n getAngle,\r\n getAngleDegrees,\r\n getAngleRadians,\r\n getAxis,\r\n getAxisScaled,\r\n getAxisScaledDegrees,\r\n getAxisScaledRadians,\r\n getAxes,\r\n getForward,\r\n getBackward,\r\n getLeft,\r\n getRight,\r\n getUp,\r\n getDown,\r\n setAxes,\r\n setForward,\r\n setBackward,\r\n setUp,\r\n setDown,\r\n setLeft,\r\n setRight,\r\n toWorld,\r\n toLocal,\r\n addRotation,\r\n addRotationDegrees,\r\n addRotationRadians,\r\n addRotationQuat,\r\n subRotation,\r\n subRotationDegrees,\r\n subRotationRadians,\r\n subRotationQuat,\r\n rotationTo,\r\n rotationToDegrees,\r\n rotationToRadians,\r\n rotationToQuat,\r\n rotationAroundAxis,\r\n rotationAroundAxisDegrees,\r\n rotationAroundAxisRadians,\r\n rotationAroundAxisQuat,\r\n getTwist,\r\n getSwing,\r\n getSwingFromTwist,\r\n getTwistFromSwing,\r\n fromTwistSwing,\r\n rotate,\r\n rotateDegrees,\r\n rotateRadians,\r\n rotateQuat,\r\n rotateAxis,\r\n rotateAxisDegrees,\r\n rotateAxisRadians,\r\n fromDegrees,\r\n fromRadians,\r\n fromAxis,\r\n fromAxisDegrees,\r\n fromAxisRadians,\r\n fromAxes,\r\n toDegrees,\r\n toRadians,\r\n toMatrix\r\n} as const;\r\n\r\n\r\n\r\nconst _setAxes = function () {\r\n const fixedAxes = [vec3_utils_create(), vec3_utils_create(), vec3_utils_create()];\r\n\r\n const fixedAxesFixSignMap = [\r\n [1, -1, 1],\r\n [1, 1, -1],\r\n [-1, 1, -1]\r\n ];\r\n\r\n const fixedLeft = vec3_utils_create();\r\n const fixedUp = vec3_utils_create();\r\n const fixedForward = vec3_utils_create();\r\n\r\n const currentAxis = vec3_utils_create();\r\n\r\n const rotationAxis = vec3_utils_create();\r\n const rotationMat = mat3_utils_create();\r\n const rotationQuat = create();\r\n return function _setAxes(quat: Quaternion, axes: Readonly<[Readonly | null, Readonly | null, Readonly | null]>, priority: Readonly): Quaternion {\r\n const firstAxis = axes[priority[0]];\r\n const secondAxis = axes[priority[1]];\r\n const thirdAxis = axes[priority[2]];\r\n\r\n if (firstAxis == null || Vec3Utils.isZero(firstAxis, MathUtils.EPSILON)) {\r\n return quat;\r\n }\r\n\r\n let secondAxisValid = false;\r\n if (secondAxis != null) {\r\n const angleBetween = Vec3Utils.angleRadians(firstAxis, secondAxis);\r\n if (angleBetween > MathUtils.EPSILON) {\r\n secondAxisValid = true;\r\n }\r\n }\r\n\r\n let thirdAxisValid = false;\r\n if (thirdAxis != null) {\r\n const angleBetween = Vec3Utils.angleRadians(firstAxis, thirdAxis);\r\n if (angleBetween > MathUtils.EPSILON) {\r\n thirdAxisValid = true;\r\n }\r\n }\r\n\r\n if (secondAxisValid || thirdAxisValid) {\r\n let crossAxis = null;\r\n let secondAxisIndex = null;\r\n let thirdAxisIndex = null;\r\n if (secondAxisValid) {\r\n crossAxis = secondAxis;\r\n secondAxisIndex = 1;\r\n thirdAxisIndex = 2;\r\n } else {\r\n crossAxis = thirdAxis;\r\n secondAxisIndex = 2;\r\n thirdAxisIndex = 1;\r\n }\r\n\r\n const fixSignMap = fixedAxesFixSignMap[priority[0]];\r\n\r\n Vec3Utils.cross(firstAxis, crossAxis!, fixedAxes[thirdAxisIndex]);\r\n Vec3Utils.scale(fixedAxes[thirdAxisIndex], fixSignMap[priority[thirdAxisIndex]], fixedAxes[thirdAxisIndex]);\r\n\r\n Vec3Utils.cross(firstAxis, fixedAxes[thirdAxisIndex], fixedAxes[secondAxisIndex]);\r\n Vec3Utils.scale(fixedAxes[secondAxisIndex], fixSignMap[priority[secondAxisIndex]], fixedAxes[secondAxisIndex]);\r\n\r\n Vec3Utils.cross(fixedAxes[1], fixedAxes[2], fixedAxes[0]);\r\n Vec3Utils.scale(fixedAxes[0], fixSignMap[priority[0]], fixedAxes[0]);\r\n\r\n Vec3Utils.normalize(fixedAxes[ArrayUtils.findIndexEqual(priority, 0)], fixedLeft);\r\n Vec3Utils.normalize(fixedAxes[ArrayUtils.findIndexEqual(priority, 1)], fixedUp);\r\n Vec3Utils.normalize(fixedAxes[ArrayUtils.findIndexEqual(priority, 2)], fixedForward);\r\n\r\n Mat3Utils.set(rotationMat,\r\n fixedLeft[0], fixedLeft[1], fixedLeft[2],\r\n fixedUp[0], fixedUp[1], fixedUp[2],\r\n fixedForward[0], fixedForward[1], fixedForward[2]\r\n );\r\n\r\n Mat3Utils.toQuat(rotationMat, rotationQuat);\r\n\r\n QuatUtils.copy(rotationQuat, quat);\r\n } else {\r\n if (priority[0] == 0) {\r\n QuatUtils.getLeft(quat, currentAxis);\r\n } else if (priority[0] == 1) {\r\n QuatUtils.getUp(quat, currentAxis);\r\n } else {\r\n QuatUtils.getForward(quat, currentAxis);\r\n }\r\n\r\n const angleBetween = Vec3Utils.angleRadians(firstAxis, currentAxis);\r\n if (angleBetween > MathUtils.EPSILON) {\r\n Vec3Utils.cross(currentAxis, firstAxis, rotationAxis);\r\n Vec3Utils.normalize(rotationAxis, rotationAxis);\r\n\r\n if (Vec3Utils.isZero(rotationAxis)) {\r\n Vec3Utils.perpendicularAny(currentAxis, rotationAxis);\r\n Vec3Utils.normalize(rotationAxis, rotationAxis);\r\n }\r\n\r\n QuatUtils.fromAxisRadians(angleBetween, rotationAxis, rotationQuat);\r\n QuatUtils.rotateQuat(quat, rotationQuat, quat);\r\n }\r\n }\r\n\r\n return quat;\r\n };\r\n}();", "export type EasingFunction = (valueToEase: number) => number;\r\n\r\n/** #CREDITS https://easings.net */\r\nexport const EasingFunction = {\r\n linear: (valueToEase: number): number => valueToEase,\r\n\r\n easeInVeryWeak: (valueToEase: number): number => 1 - Math.cos((valueToEase * Math.PI) / 2),\r\n easeInWeak: (valueToEase: number): number => Math.pow(valueToEase, 2),\r\n easeIn: (valueToEase: number): number => Math.pow(valueToEase, 3),\r\n easeInStrong: (valueToEase: number): number => Math.pow(valueToEase, 4),\r\n easeInVeryStrong: (valueToEase: number): number => Math.pow(valueToEase, 5),\r\n\r\n easeOutVeryWeak: (valueToEase: number): number => Math.sin((valueToEase * Math.PI) / 2),\r\n easeOutWeak: (valueToEase: number): number => 1 - Math.pow(1 - valueToEase, 2),\r\n easeOut: (valueToEase: number): number => 1 - Math.pow(1 - valueToEase, 3),\r\n easeOutStrong: (valueToEase: number): number => 1 - Math.pow(1 - valueToEase, 4),\r\n easeOutVeryStrong: (valueToEase: number): number => 1 - Math.pow(1 - valueToEase, 5),\r\n\r\n easeInOutVeryWeak: (valueToEase: number): number => -(Math.cos(valueToEase * Math.PI) - 1) / 2,\r\n easeInOutWeak: (valueToEase: number): number => valueToEase < 0.5 ? 2 * Math.pow(valueToEase, 2) : 1 - Math.pow(-2 * valueToEase + 2, 2) / 2,\r\n easeInOut: (valueToEase: number): number => valueToEase < 0.5 ? 4 * Math.pow(valueToEase, 3) : 1 - Math.pow(-2 * valueToEase + 2, 3) / 2,\r\n easeInOutStrong: (valueToEase: number): number => valueToEase < 0.5 ? 8 * Math.pow(valueToEase, 4) : 1 - Math.pow(-2 * valueToEase + 2, 4) / 2,\r\n easeInOutVeryStrong: (valueToEase: number): number => valueToEase < 0.5 ? 16 * Math.pow(valueToEase, 5) : 1 - Math.pow(-2 * valueToEase + 2, 5) / 2\r\n} as const;\r\n\r\nexport enum EasingFunctionName {\r\n LINEAR = \"Linear\",\r\n\r\n EASE_IN_VERY_WEAK = \"Ease In Very Weak\",\r\n EASE_IN_WEAK = \"Ease In Weak\",\r\n EASE_IN = \"Ease In\",\r\n EASE_IN_STRONG = \"Ease In Strong\",\r\n EASE_IN_VERY_STRONG = \"Ease In Very Strong\",\r\n\r\n EASE_OUT_VERY_WEAK = \"Ease Out Very Weak\",\r\n EASE_OUT_WEAK = \"Ease Out Weak\",\r\n EASE_OUT = \"Ease Out\",\r\n EASE_OUT_STRONG = \"Ease Out Strong\",\r\n EASE_OUT_VERY_STRONG = \"Ease Out Very Strong\",\r\n\r\n EASE_IN_OUT_VERY_WEAK = \"Ease In/Out Very Weak\",\r\n EASE_IN_OUT_WEAK = \"Ease In/Out Weak\",\r\n EASE_IN_OUT = \"Ease In/Out\",\r\n EASE_IN_OUT_STRONG = \"Ease In/Out Strong\",\r\n EASE_IN_OUT_VERY_STRONG = \"Ease In/Out Very Strong\",\r\n}\r\n\r\nexport type WaveFunction = (inputValue: number) => number;\r\nexport const WaveFunction = {\r\n triangleWave: (inputValue: number): number => (2 / Math.PI) * Math.asin(Math.sin((Math.PI / 2) * inputValue)),\r\n positiveTriangleWave: (inputValue: number): number => 1 - Math.abs((Math.abs(inputValue) % 2) - 1)\r\n} as const;\r\n\r\nexport const EPSILON: number = 0.000001;\r\nexport const EPSILON_SQUARED: number = EPSILON * EPSILON;\r\nexport const EPSILON_DEGREES: number = 0.00001;\r\n\r\nexport function clamp(value: number, start: number = -Number.MAX_VALUE, end: number = Number.MAX_VALUE): number {\r\n const min = Math.min(start, end);\r\n const max = Math.max(start, end);\r\n return Math.min(Math.max(value, min), max);\r\n}\r\n\r\nexport function sign(value: number, zeroSign: number = 1): number {\r\n let sign = Math.sign(value);\r\n if (sign == 0) {\r\n sign = Math.sign(zeroSign);\r\n }\r\n return sign;\r\n}\r\n\r\nexport function toDegrees(angle: number): number {\r\n return angle * (180 / Math.PI);\r\n}\r\n\r\nexport function toRadians(angle: number): number {\r\n return angle * (Math.PI / 180);\r\n}\r\n\r\nexport function roundDecimal(number: number, decimalPlaces: number): number {\r\n const factor = Math.pow(10, decimalPlaces);\r\n number = Math.round(number * factor) / factor;\r\n\r\n return number;\r\n}\r\n\r\n/** Start range value doesn't need to be lower than the end one, so you can map from `[0, 1]` to `[3, 2]`, where `3` is greater than `2` */\r\nexport function mapToRange(value: number, originRangeStart: number, originRangeEnd: number, newRangeStart: number, newRangeEnd: number): number {\r\n if (originRangeStart == originRangeEnd) {\r\n return newRangeStart;\r\n }\r\n\r\n const clampedValue = MathUtils.clamp(value, originRangeStart, originRangeEnd);\r\n\r\n if (clampedValue == originRangeStart) {\r\n return newRangeStart;\r\n } else if (clampedValue == originRangeEnd) {\r\n return newRangeEnd;\r\n }\r\n\r\n const newValue = newRangeStart + ((newRangeEnd - newRangeStart) / (originRangeEnd - originRangeStart)) * (clampedValue - originRangeStart);\r\n const clampedNewValue = MathUtils.clamp(newValue, newRangeStart, newRangeEnd);\r\n return clampedNewValue;\r\n}\r\n\r\n/** Range is `[0, 1)` */\r\nexport function random(): number;\r\n/** Range is `[start, end)` */\r\nexport function random(start: number, end: number): number;\r\nexport function random(start: number = 0, end: number = 1): number {\r\n return Math.random() * (end - start) + start;\r\n}\r\n\r\n/** Range is `[start, end]` */\r\nexport function randomInt(start: number, end: number): number {\r\n const min = Math.min(start, end);\r\n const max = Math.max(start, end);\r\n return Math.floor(Math.random() * (max - min + 1) + min);\r\n}\r\n\r\nexport function randomBool(): boolean {\r\n return MathUtils.randomInt(0, 1) == 0;\r\n}\r\n\r\n/** Return `1` or `-1` */\r\nexport function randomSign(): number {\r\n return (Math.random() < 0.5) ? 1 : -1;\r\n}\r\n\r\n/** You give it a list of parameters and returns a random one */\r\nexport function randomPick(array: T[]): T | null;\r\nexport function randomPick(...args: T[]): T | null;\r\nexport function randomPick(...args: T[]): T | null {\r\n let random: T | null = null;\r\n\r\n if (args.length > 0) {\r\n if (args.length == 1 && (args[0] as T[]).length != null) {\r\n const arrayArg0 = args[0] as T[];\r\n if (arrayArg0.length > 0) {\r\n const randomIndex = MathUtils.randomInt(0, arrayArg0.length - 1);\r\n random = arrayArg0[randomIndex];\r\n }\r\n } else {\r\n const randomIndex = MathUtils.randomInt(0, args.length - 1);\r\n random = args[randomIndex];\r\n }\r\n }\r\n\r\n return random;\r\n}\r\n\r\nexport const randomUUID = function () {\r\n const uuidRandomValues = new Uint8Array(1);\r\n const uuidSkeleton = (1e7 + \"-\" + 1e3 + \"-\" + 4e3 + \"-\" + 8e3 + \"-\" + 1e11);\r\n const replaceUUIDSkeletonRegex = new RegExp(\"[018]\", \"g\");\r\n const replaceUUIDSkeletonCallback = function (charString: string): string {\r\n const digit = parseInt(charString.charAt(0));\r\n return (digit ^ ((crypto.getRandomValues(uuidRandomValues)[0] & 15)) >> (digit / 4)).toString(16);\r\n };\r\n return function randomUUID(): string {\r\n let uuid = \"\";\r\n\r\n if (crypto.randomUUID != null) {\r\n uuid = crypto.randomUUID();\r\n } else {\r\n uuid = uuidSkeleton.replace(replaceUUIDSkeletonRegex, replaceUUIDSkeletonCallback);\r\n }\r\n\r\n return uuid;\r\n };\r\n}();\r\n\r\n/** `[from, to]` range is mapped to an `interpolationFactor` in the range `[0, 1]` */\r\nexport function lerp(from: number, to: number, interpolationFactor: number): number {\r\n if (interpolationFactor <= 0) {\r\n return from;\r\n } else if (interpolationFactor >= 1) {\r\n return to;\r\n }\r\n\r\n return interpolationFactor * (to - from) + from;\r\n}\r\n\r\n/** `[from, to]` range is mapped to an `interpolationFactor` in the range `[0, 1]` */\r\nexport function interpolate(from: number, to: number, interpolationFactor: number, easingFunction: EasingFunction = EasingFunction.linear): number {\r\n const lerpFactor = easingFunction(interpolationFactor);\r\n return MathUtils.lerp(from, to, lerpFactor);\r\n}\r\n\r\n/** `[from, to]` range is mapped to an `interpolationFactor` in the range `[0, 1]` \r\n `interpolationFactor` can go outside the `[0, 1]` range, periodically repeating the interpolation in the given range */\r\nexport function interpolatePeriodic(from: number, to: number, interpolationFactor: number, easingFunction: EasingFunction = EasingFunction.linear): number {\r\n const adjustedInterpolationFactor = WaveFunction.positiveTriangleWave(interpolationFactor);\r\n return MathUtils.interpolate(from, to, adjustedInterpolationFactor, easingFunction);\r\n}\r\n\r\nexport function getEasingFunctionByName(easingFunctionName: EasingFunctionName): EasingFunction {\r\n let easingFunction = EasingFunction.linear;\r\n\r\n switch (easingFunctionName) {\r\n case EasingFunctionName.LINEAR:\r\n easingFunction = EasingFunction.linear;\r\n break;\r\n\r\n case EasingFunctionName.EASE_IN_VERY_WEAK:\r\n easingFunction = EasingFunction.easeInVeryWeak;\r\n break;\r\n case EasingFunctionName.EASE_IN_WEAK:\r\n easingFunction = EasingFunction.easeInWeak;\r\n break;\r\n case EasingFunctionName.EASE_IN:\r\n easingFunction = EasingFunction.easeIn;\r\n break;\r\n case EasingFunctionName.EASE_IN_STRONG:\r\n easingFunction = EasingFunction.easeInStrong;\r\n break;\r\n case EasingFunctionName.EASE_IN_VERY_STRONG:\r\n easingFunction = EasingFunction.easeInVeryStrong;\r\n break;\r\n\r\n case EasingFunctionName.EASE_OUT_VERY_WEAK:\r\n easingFunction = EasingFunction.easeOutVeryWeak;\r\n break;\r\n case EasingFunctionName.EASE_OUT_WEAK:\r\n easingFunction = EasingFunction.easeOutWeak;\r\n break;\r\n case EasingFunctionName.EASE_OUT:\r\n easingFunction = EasingFunction.easeOut;\r\n break;\r\n case EasingFunctionName.EASE_OUT_STRONG:\r\n easingFunction = EasingFunction.easeOutStrong;\r\n break;\r\n case EasingFunctionName.EASE_OUT_VERY_STRONG:\r\n easingFunction = EasingFunction.easeOutVeryStrong;\r\n break;\r\n\r\n case EasingFunctionName.EASE_IN_OUT_VERY_WEAK:\r\n easingFunction = EasingFunction.easeInOutVeryWeak;\r\n break;\r\n case EasingFunctionName.EASE_IN_OUT_WEAK:\r\n easingFunction = EasingFunction.easeInOutWeak;\r\n break;\r\n case EasingFunctionName.EASE_IN_OUT:\r\n easingFunction = EasingFunction.easeInOut;\r\n break;\r\n case EasingFunctionName.EASE_IN_OUT_STRONG:\r\n easingFunction = EasingFunction.easeInOutStrong;\r\n break;\r\n case EasingFunctionName.EASE_IN_OUT_VERY_STRONG:\r\n easingFunction = EasingFunction.easeInOutVeryStrong;\r\n break;\r\n }\r\n\r\n return easingFunction;\r\n}\r\n\r\nexport function getEasingFunctionNameByIndex(index: number): EasingFunctionName | null {\r\n let easingFunctionName: EasingFunctionName | null = null;\r\n\r\n switch (index) {\r\n case 0:\r\n easingFunctionName = EasingFunctionName.LINEAR;\r\n break;\r\n\r\n case 1:\r\n easingFunctionName = EasingFunctionName.EASE_IN_VERY_WEAK;\r\n break;\r\n case 2:\r\n easingFunctionName = EasingFunctionName.EASE_IN_WEAK;\r\n break;\r\n case 3:\r\n easingFunctionName = EasingFunctionName.EASE_IN;\r\n break;\r\n case 4:\r\n easingFunctionName = EasingFunctionName.EASE_IN_STRONG;\r\n break;\r\n case 5:\r\n easingFunctionName = EasingFunctionName.EASE_IN_VERY_STRONG;\r\n break;\r\n\r\n case 6:\r\n easingFunctionName = EasingFunctionName.EASE_OUT_VERY_WEAK;\r\n break;\r\n case 7:\r\n easingFunctionName = EasingFunctionName.EASE_OUT_WEAK;\r\n break;\r\n case 8:\r\n easingFunctionName = EasingFunctionName.EASE_OUT;\r\n break;\r\n case 9:\r\n easingFunctionName = EasingFunctionName.EASE_OUT_STRONG;\r\n break;\r\n case 10:\r\n easingFunctionName = EasingFunctionName.EASE_OUT_VERY_STRONG;\r\n break;\r\n\r\n case 11:\r\n easingFunctionName = EasingFunctionName.EASE_IN_OUT_VERY_WEAK;\r\n break;\r\n case 12:\r\n easingFunctionName = EasingFunctionName.EASE_IN_OUT_WEAK;\r\n break;\r\n case 13:\r\n easingFunctionName = EasingFunctionName.EASE_IN_OUT;\r\n break;\r\n case 14:\r\n easingFunctionName = EasingFunctionName.EASE_IN_OUT_STRONG;\r\n break;\r\n case 15:\r\n easingFunctionName = EasingFunctionName.EASE_IN_OUT_VERY_STRONG;\r\n break;\r\n }\r\n\r\n return easingFunctionName;\r\n}\r\n\r\nexport function angleDistance(from: number, to: number): number {\r\n return MathUtils.angleDistanceDegrees(from, to);\r\n}\r\n\r\nexport function angleDistanceDegrees(from: number, to: number): number {\r\n return Math.abs(MathUtils.angleDistanceSignedDegrees(from, to));\r\n}\r\n\r\nexport function angleDistanceRadians(from: number, to: number): number {\r\n return Math.abs(MathUtils.angleDistanceSignedRadians(from, to));\r\n}\r\n\r\nexport function angleDistanceSigned(from: number, to: number): number {\r\n return MathUtils.angleDistanceSignedDegrees(from, to);\r\n}\r\n\r\nexport function angleDistanceSignedDegrees(from: number, to: number): number {\r\n const clampedFrom = MathUtils.angleClampDegrees(from, true);\r\n const clampedTo = MathUtils.angleClampDegrees(to, true);\r\n\r\n let distance = clampedTo - clampedFrom;\r\n if (clampedTo - clampedFrom > 180) {\r\n distance = (clampedTo - clampedFrom) - 360;\r\n } else if (clampedTo - clampedFrom < -180) {\r\n distance = (clampedTo - clampedFrom) + 360;\r\n }\r\n\r\n return distance;\r\n}\r\n\r\nexport function angleDistanceSignedRadians(from: number, to: number): number {\r\n return MathUtils.toRadians(MathUtils.angleDistanceSignedDegrees(MathUtils.toDegrees(from), MathUtils.toDegrees(to)));\r\n}\r\n\r\n/** Clamp the angle to `-180 / +180`, so that, for example, `270` will be `-90` \r\n If `usePositiveRange` is `true`, the angle will be clamped to `0 / 360` */\r\nexport function angleClamp(angle: number, usePositiveRange: boolean = false): number {\r\n return MathUtils.angleClampDegrees(angle, usePositiveRange);\r\n}\r\n\r\n/** Clamp the angle to `-180 / +180`, so that, for example, `270` will be `-90` \r\n If `usePositiveRange` is `true`, the angle will be clamped to `0 / 360` */\r\nexport function angleClampDegrees(angle: number, usePositiveRange: boolean = false): number {\r\n let clampedAngle = angle % 360;\r\n\r\n if (clampedAngle < 0) {\r\n clampedAngle += 360;\r\n }\r\n\r\n if (!usePositiveRange) {\r\n if (clampedAngle > 180) {\r\n clampedAngle -= 360;\r\n }\r\n }\r\n\r\n return clampedAngle;\r\n}\r\n\r\n\r\n/** Clamp the angle to `-PI / +PI`, so that, for example, `1.5PI` will be `-0.5PI` \r\n If `usePositiveRange` is `true`, the angle will be clamped to `0 / 2PI` */\r\nexport function angleClampRadians(angle: number, usePositiveRange: boolean = false): number {\r\n return MathUtils.toRadians(MathUtils.angleClampDegrees(MathUtils.toDegrees(angle), usePositiveRange));\r\n}\r\n\r\n/** The range goes from `start` to `end` by going toward the positive direction (if `useShortestAngle` is `false`) \r\n `[20, 300]` is a `280` degrees range, `[300, 20]` is an `80` degrees range, \r\n `[-150, -170]` = `[210, 190]` is a `240` degrees range, \r\n `[0, -10]` = `[0, 350]` is a `350` degrees range */\r\nexport function isInsideAngleRange(angle: number, start: number, end: number, useShortestAngle: boolean = false): boolean {\r\n return MathUtils.isInsideAngleRangeDegrees(angle, start, end, useShortestAngle);\r\n}\r\n\r\nexport function isInsideAngleRangeDegrees(angle: number, start: number, end: number, useShortestAngle: boolean = false): boolean {\r\n let insideAngleRange = false;\r\n\r\n const anglePositive = MathUtils.angleClampDegrees(angle, true);\r\n let startPositive = MathUtils.angleClampDegrees(start, true);\r\n let endPositive = MathUtils.angleClampDegrees(end, true);\r\n\r\n if (useShortestAngle) {\r\n if (MathUtils.angleDistanceSignedDegrees(startPositive, endPositive) < 0) {\r\n const temp = startPositive;\r\n startPositive = endPositive;\r\n endPositive = temp;\r\n }\r\n }\r\n\r\n if (startPositive < endPositive) {\r\n insideAngleRange = anglePositive >= startPositive && anglePositive <= endPositive;\r\n } else {\r\n insideAngleRange = anglePositive >= startPositive || anglePositive <= endPositive;\r\n }\r\n\r\n return insideAngleRange;\r\n}\r\n\r\nexport function isInsideAngleRangeRadians(angle: number, start: number, end: number, useShortestAngle: boolean = false): boolean {\r\n return MathUtils.isInsideAngleRangeDegrees(MathUtils.toDegrees(angle), MathUtils.toDegrees(start), MathUtils.toDegrees(end), useShortestAngle);\r\n}\r\n\r\n/**\r\n * How to use\r\n * \r\n * By default the rotations are in `Degrees`\r\n * \r\n * For rotations u can add a suffix like `Degrees`/`Radians` to use a specific version, example: \r\n * - `angleDistanceSignedDegrees` \r\n * - `isInsideAngleRangeRadians`\r\n */\r\nexport const MathUtils = {\r\n EPSILON,\r\n EPSILON_SQUARED,\r\n EPSILON_DEGREES,\r\n clamp,\r\n sign,\r\n toDegrees,\r\n toRadians,\r\n roundDecimal,\r\n mapToRange,\r\n random,\r\n randomInt,\r\n randomBool,\r\n randomSign,\r\n randomPick,\r\n randomUUID,\r\n lerp,\r\n interpolate,\r\n interpolatePeriodic,\r\n getEasingFunctionByName,\r\n getEasingFunctionNameByIndex,\r\n angleDistance,\r\n angleDistanceDegrees,\r\n angleDistanceRadians,\r\n angleDistanceSigned,\r\n angleDistanceSignedDegrees,\r\n angleDistanceSignedRadians,\r\n angleClamp,\r\n angleClampDegrees,\r\n angleClampRadians,\r\n isInsideAngleRange,\r\n isInsideAngleRangeDegrees,\r\n isInsideAngleRangeRadians,\r\n} as const;", "import { ArrayLike, DynamicArrayLike } from \"../../type_definitions/array_type_definitions.js\";\r\n\r\nexport function copy, T>(from: Readonly>, to: ArrayType, copyCallback?: (fromElement: T, toElement: T) => T): ArrayType {\r\n const _to = to as (ArrayType & { pop: () => T | undefined });\r\n if (_to.pop != null) {\r\n while (to.length > from.length) {\r\n _to.pop();\r\n }\r\n }\r\n\r\n for (let i = 0; i < from.length; i++) {\r\n if (copyCallback == null) {\r\n to[i] = from[i];\r\n } else {\r\n to[i] = copyCallback(from[i], to[i]);\r\n }\r\n }\r\n\r\n return to;\r\n}\r\n\r\n/** The overload where `ArrayType extends ArrayLike` does also get `array` as `Readonly`, but is not marked as such due to \r\n Typescript having issues with inferring the proper type of `ArrayType` when `Readonly` */\r\nexport function clone, T>(array: Readonly, cloneCallback?: (elementToClone: T) => T): ArrayType;\r\nexport function clone(array: Readonly, cloneCallback?: (elementToClone: T) => T): T[];\r\nexport function clone>(array: ArrayType, cloneCallback?: (elementToClone: number) => number): ArrayType;\r\nexport function clone, T>(array: Readonly, cloneCallback?: (elementToClone: T) => T): ArrayType {\r\n const clonedArray = array.slice(0) as ArrayType;\r\n\r\n if (cloneCallback != null) {\r\n for (let i = 0; i < array.length; i++) {\r\n clonedArray[i] = cloneCallback(array[i]);\r\n }\r\n }\r\n\r\n return clonedArray;\r\n}\r\n\r\nexport function equals(array: Readonly>, other: Readonly>, elementsEqualCallback?: (arrayElement: T, otherElement: T) => boolean): boolean {\r\n let equals = true;\r\n\r\n if (other != null && array.length == other.length) {\r\n for (let i = 0; i < array.length; i++) {\r\n if ((elementsEqualCallback != null && !elementsEqualCallback(array[i], other[i])) ||\r\n (elementsEqualCallback == null && array[i] != other[i])) {\r\n equals = false;\r\n break;\r\n }\r\n }\r\n } else {\r\n equals = false;\r\n }\r\n\r\n return equals;\r\n}\r\n\r\nexport function first(array: Readonly>): T | undefined {\r\n return array.length > 0 ? array[0] : undefined;\r\n}\r\n\r\nexport function last(array: Readonly>): T | undefined {\r\n return array.length > 0 ? array[array.length - 1] : undefined;\r\n}\r\n\r\nexport function has(array: Readonly>, callback: (elementToCheck: T, elementIndex: number) => boolean): boolean {\r\n return ArrayUtils.find(array, callback) != undefined;\r\n}\r\n\r\nexport function hasEqual(array: Readonly>, elementToFind: T, elementsEqualCallback?: (elementToCheck: T, elementToFind: T) => boolean): boolean {\r\n return ArrayUtils.findEqual(array, elementToFind, elementsEqualCallback) != undefined;\r\n}\r\n\r\nexport function find(array: Readonly>, callback: (elementToCheck: T, elementIndex: number) => boolean): T | undefined {\r\n let elementFound = undefined;\r\n\r\n const index = ArrayUtils.findIndex(array, callback);\r\n if (index >= 0) {\r\n elementFound = array[index];\r\n }\r\n\r\n return elementFound;\r\n}\r\n\r\nexport function findIndex(array: Readonly>, callback: (elementToCheck: T, elementIndex: number) => boolean): number {\r\n return array.findIndex(callback);\r\n}\r\n\r\nexport function findAll(array: Readonly>, callback: (elementToCheck: T, elementIndex: number) => boolean): T[] {\r\n const elementsFound = [];\r\n\r\n for (let i = 0; i < array.length; i++) {\r\n const element = array[i];\r\n if (callback(element, i)) {\r\n elementsFound.push(element);\r\n }\r\n }\r\n\r\n return elementsFound;\r\n}\r\n\r\nexport function findAllIndexes(array: Readonly>, callback: (elementToCheck: T, elementIndex: number) => boolean): number[] {\r\n const indexes = [];\r\n\r\n for (let i = 0; i < array.length; i++) {\r\n const element = array[i];\r\n if (callback(element, i)) {\r\n indexes.push(i);\r\n }\r\n }\r\n\r\n return indexes;\r\n}\r\n\r\nexport function findEqual(array: Readonly>, elementToFind: T, elementsEqualCallback?: (elementToCheck: T, elementToFind: T) => boolean): T | undefined {\r\n if (elementsEqualCallback == null) {\r\n const index = ArrayUtils.findIndexEqual(array, elementToFind);\r\n return index < 0 ? undefined : array[index];\r\n }\r\n\r\n let elementFound = undefined;\r\n for (let i = 0; i < array.length; i++) {\r\n const currentElement = array[i];\r\n if (elementsEqualCallback(currentElement, elementToFind)) {\r\n elementFound = currentElement;\r\n break;\r\n }\r\n }\r\n\r\n return elementFound;\r\n}\r\n\r\nexport function findAllEqual(array: Readonly>, elementToFind: T, elementsEqualCallback?: (elementToCheck: T, elementToFind: T) => boolean): T[] {\r\n if (elementsEqualCallback == null) {\r\n return _findAllEqualOptimized(array, elementToFind);\r\n }\r\n\r\n const elementsFound = [];\r\n\r\n for (let i = 0; i < array.length; i++) {\r\n const currentElement = array[i];\r\n if (elementsEqualCallback(currentElement, elementToFind)) {\r\n elementsFound.push(currentElement);\r\n }\r\n }\r\n\r\n return elementsFound;\r\n}\r\n\r\nexport function findIndexEqual(array: Readonly>, elementToFind: T, elementsEqualCallback?: (elementToCheck: T, elementToFind: T) => boolean): number {\r\n if (elementsEqualCallback == null) {\r\n return array.indexOf(elementToFind);\r\n }\r\n\r\n let indexFound = -1;\r\n for (let i = 0; i < array.length; i++) {\r\n const currentElement = array[i];\r\n if (elementsEqualCallback(currentElement, elementToFind)) {\r\n indexFound = i;\r\n break;\r\n }\r\n }\r\n\r\n return indexFound;\r\n}\r\n\r\nexport function findAllIndexesEqual(array: Readonly>, elementToFind: T, elementsEqualCallback?: (elementToCheck: T, elementToFind: T) => boolean): number[] {\r\n if (elementsEqualCallback == null) {\r\n return _findAllIndexesEqualOptimized(array, elementToFind);\r\n }\r\n\r\n const indexesFound = [];\r\n for (let i = 0; i < array.length; i++) {\r\n const currentElement = array[i];\r\n if (elementsEqualCallback(currentElement, elementToFind)) {\r\n indexesFound.push(i);\r\n }\r\n }\r\n return indexesFound;\r\n}\r\n\r\nexport function remove(array: DynamicArrayLike, callback: (elementToCheck: T, elementIndex: number) => boolean): T | undefined {\r\n let elementRemoved = undefined;\r\n\r\n const index = array.findIndex(callback);\r\n if (index >= 0) {\r\n elementRemoved = ArrayUtils.removeIndex(array, index);\r\n }\r\n\r\n return elementRemoved;\r\n}\r\n\r\nexport function removeIndex(array: DynamicArrayLike, index: number): T | undefined {\r\n let elementRemoved = undefined;\r\n\r\n if (index >= 0 && index < array.length) {\r\n const arrayRemoved = array.splice(index, 1);\r\n if (arrayRemoved.length == 1) {\r\n elementRemoved = arrayRemoved[0];\r\n }\r\n }\r\n\r\n return elementRemoved;\r\n}\r\n\r\nexport function removeAll(array: DynamicArrayLike, callback: (elementToCheck: T, elementIndex: number) => boolean): T[] {\r\n const elementsRemoved = [];\r\n\r\n let currentElement = undefined;\r\n do {\r\n currentElement = ArrayUtils.remove(array, callback);\r\n if (currentElement !== undefined) {\r\n elementsRemoved.push(currentElement);\r\n }\r\n } while (currentElement !== undefined);\r\n\r\n return elementsRemoved;\r\n}\r\n\r\nexport function removeAllIndexes(array: DynamicArrayLike, indexes: ArrayLike): T[] {\r\n const elementsRemoved = [];\r\n\r\n for (const index of indexes) {\r\n const elementRemoved = ArrayUtils.removeIndex(array, index);\r\n if (elementRemoved !== undefined) {\r\n elementsRemoved.push(elementRemoved);\r\n }\r\n }\r\n\r\n return elementsRemoved;\r\n}\r\n\r\nexport function removeEqual(array: DynamicArrayLike, elementToRemove: T, elementsEqualCallback?: (elementToCheck: T, elementToRemove: T) => boolean): T | undefined {\r\n return ArrayUtils.removeIndex(array, ArrayUtils.findIndexEqual(array, elementToRemove, elementsEqualCallback));\r\n}\r\n\r\nexport function removeAllEqual(array: DynamicArrayLike, elementToRemove: T, elementsEqualCallback?: (elementToCheck: T, elementToRemove: T) => boolean): T[] {\r\n return ArrayUtils.removeAllIndexes(array, ArrayUtils.findAllIndexesEqual(array, elementToRemove, elementsEqualCallback));\r\n}\r\n\r\nexport function clear, T>(array: ArrayType): ArrayType {\r\n array.length = 0;\r\n\r\n return array;\r\n}\r\n\r\nexport function pushUnique(array: DynamicArrayLike, elementToAdd: T, elementsEqualCallback?: (elementToCheck: T, elementToAdd: T) => boolean): number {\r\n let length = array.length;\r\n\r\n const hasElement = ArrayUtils.hasEqual(array, elementToAdd, elementsEqualCallback);\r\n\r\n if (!hasElement) {\r\n length = array.push(elementToAdd);\r\n }\r\n\r\n return length;\r\n}\r\n\r\nexport function unshiftUnique(array: DynamicArrayLike, elementToAdd: T, elementsEqualCallback?: (elementToCheck: T, elementToAdd: T) => boolean): number {\r\n let length = array.length;\r\n\r\n const hasElement = ArrayUtils.hasEqual(array, elementToAdd, elementsEqualCallback);\r\n\r\n if (!hasElement) {\r\n length = array.unshift(elementToAdd);\r\n }\r\n\r\n return length;\r\n}\r\n\r\nexport const ArrayUtils = {\r\n copy,\r\n clone,\r\n equals,\r\n first,\r\n last,\r\n has,\r\n hasEqual,\r\n find,\r\n findIndex,\r\n findAll,\r\n findAllIndexes,\r\n findEqual,\r\n findAllEqual,\r\n findIndexEqual,\r\n findAllIndexesEqual,\r\n remove,\r\n removeIndex,\r\n removeAll,\r\n removeAllIndexes,\r\n removeEqual,\r\n removeAllEqual,\r\n clear,\r\n pushUnique,\r\n unshiftUnique\r\n} as const;\r\n\r\n\r\n\r\nfunction _findAllEqualOptimized(array: Readonly>, elementToFind: T): T[] {\r\n // Adapted from: https:// stackoverflow.com/a/20798567\r\n\r\n const elementsFound = [];\r\n\r\n let index = -1;\r\n while ((index = array.indexOf(elementToFind, index + 1)) >= 0) {\r\n elementsFound.push(array[index]);\r\n }\r\n\r\n return elementsFound;\r\n}\r\n\r\nfunction _findAllIndexesEqualOptimized(array: Readonly>, elementToFind: T): number[] {\r\n // Adapted from: https:// stackoverflow.com/a/20798567\r\n\r\n const elementsFound = [];\r\n\r\n let index = -1;\r\n while ((index = array.indexOf(elementToFind, index + 1)) >= 0) {\r\n elementsFound.push(index);\r\n }\r\n\r\n return elementsFound;\r\n}", "import { vec3 as gl_vec3, type mat3 as gl_mat3_type, type mat4 as gl_mat4_type, type quat as gl_quat_type, type vec3 as gl_vec3_type } from \"gl-matrix\";\r\nimport { Matrix3, Matrix4, Quaternion, Vector3 } from \"../../../cauldron/type_definitions/array_type_definitions.js\";\r\nimport { EasingFunction, MathUtils } from \"../math_utils.js\";\r\nimport { Mat3Utils } from \"./mat3_utils.js\";\r\nimport { Mat4Utils, create as mat4_utils_create } from \"./mat4_utils.js\";\r\nimport { Quat2Utils } from \"./quat2_utils.js\";\r\nimport { QuatUtils, create as quat_utils_create } from \"./quat_utils.js\";\r\nimport { getVector3AllocationFunction, setVector3AllocationFunction } from \"./vec_allocation_utils.js\";\r\n\r\nexport function create(): Vector3;\r\nexport function create(x: number, y: number, z: number): Vector3;\r\nexport function create(uniformValue: number): Vector3;\r\nexport function create(x?: number, y?: number, z?: number): Vector3 {\r\n const out = getAllocationFunction()();\r\n\r\n if (x != null) {\r\n Vec3Utils.set(out, x, y!, z!);\r\n }\r\n\r\n return out;\r\n}\r\n\r\nexport function getAllocationFunction(): () => Vector3 {\r\n return getVector3AllocationFunction();\r\n}\r\n\r\n/** Specify the function that will be used to allocate the vector when calling the {@link create} function */\r\nexport function setAllocationFunction(allocationFunction: () => Vector3): void {\r\n setVector3AllocationFunction(allocationFunction);\r\n}\r\n\r\nexport function set(vector: T, x: number, y: number, z: number): T;\r\nexport function set(vector: T, uniformValue: number): T;\r\nexport function set(vector: T, x: number, y?: number, z?: number): T {\r\n if (y == null) {\r\n gl_vec3.set(vector as unknown as gl_vec3_type, x, x, x);\r\n } else {\r\n gl_vec3.set(vector as unknown as gl_vec3_type, x, y, z!);\r\n }\r\n\r\n return vector;\r\n}\r\n\r\nexport function copy(from: Readonly, to: T): T {\r\n gl_vec3.copy(to as unknown as gl_vec3_type, from as unknown as gl_vec3_type);\r\n return to;\r\n}\r\n\r\n/** The overload where `T extends Vector3` does also get `array` as `Readonly`, but is not marked as such due to \r\n Typescript having issues with inferring the proper type of `T` when `Readonly` is used */\r\nexport function clone(vector: Readonly): T;\r\nexport function clone(vector: Readonly): number[];\r\nexport function clone(vector: T): T;\r\nexport function clone(vector: Readonly): T {\r\n return vector.slice(0) as T;\r\n}\r\n\r\nexport function equals(first: Readonly, second: Readonly, epsilon: number = 0): boolean {\r\n let equals = first.length == second.length;\r\n\r\n if (equals) {\r\n equals &&= (Math.abs(first[0] - second[0]) <= epsilon);\r\n equals &&= (Math.abs(first[1] - second[1]) <= epsilon);\r\n equals &&= (Math.abs(first[2] - second[2]) <= epsilon);\r\n }\r\n\r\n return equals;\r\n}\r\n\r\nexport function isNormalized(vector: Readonly, epsilon: number = MathUtils.EPSILON): boolean {\r\n return Math.abs(Vec3Utils.lengthSquared(vector) - 1) < epsilon;\r\n}\r\n\r\nexport function normalize(vector: Readonly): T;\r\nexport function normalize(vector: Readonly, out: T): T;\r\nexport function normalize(vector: Readonly, out: T | U = Vec3Utils.clone(vector)): T | U {\r\n gl_vec3.normalize(out as unknown as gl_vec3_type, vector as unknown as gl_vec3_type);\r\n return out;\r\n}\r\n\r\nexport function isZero(vector: Readonly, epsilon: number = 0): boolean {\r\n return Vec3Utils.lengthSquared(vector) <= (epsilon * epsilon);\r\n}\r\n\r\nexport function zero(vector: T): T {\r\n gl_vec3.zero(vector as unknown as gl_vec3_type);\r\n return vector;\r\n}\r\n\r\nexport function length(vector: Readonly): number {\r\n return gl_vec3.length(vector as unknown as gl_vec3_type);\r\n}\r\n\r\nexport function lengthSquared(vector: Readonly): number {\r\n return gl_vec3.squaredLength(vector as unknown as gl_vec3_type);\r\n}\r\n\r\nexport function lengthSigned(vector: Readonly, positiveDirection: Readonly): number {\r\n let signedLength = Vec3Utils.length(vector);\r\n if (!Vec3Utils.isConcordant(vector, positiveDirection)) {\r\n signedLength *= -1;\r\n }\r\n\r\n return signedLength;\r\n}\r\n\r\nexport function distance(first: Readonly, second: Readonly): number {\r\n return gl_vec3.dist(first as unknown as gl_vec3_type, second as unknown as gl_vec3_type);\r\n}\r\n\r\nexport function distanceSquared(first: Readonly, second: Readonly): number {\r\n return gl_vec3.squaredDistance(first as unknown as gl_vec3_type, second as unknown as gl_vec3_type);\r\n}\r\n\r\nexport function add(first: Readonly, second: Readonly): T;\r\nexport function add(first: Readonly, second: Readonly, out: T): T;\r\nexport function add(first: Readonly, second: Readonly, out: T | U = Vec3Utils.clone(first)): T | U {\r\n gl_vec3.add(out as unknown as gl_vec3_type, first as unknown as gl_vec3_type, second as unknown as gl_vec3_type);\r\n return out;\r\n}\r\n\r\nexport function sub(first: Readonly, second: Readonly): T;\r\nexport function sub(first: Readonly, second: Readonly, out: T): T;\r\nexport function sub(first: Readonly, second: Readonly, out: T | U = Vec3Utils.clone(first)): T | U {\r\n gl_vec3.sub(out as unknown as gl_vec3_type, first as unknown as gl_vec3_type, second as unknown as gl_vec3_type);\r\n return out;\r\n}\r\n\r\nexport function mul(first: Readonly, second: Readonly): T;\r\nexport function mul(first: Readonly, second: Readonly, out: T): T;\r\nexport function mul(first: Readonly, second: Readonly, out: T | U = Vec3Utils.clone(first)): T | U {\r\n gl_vec3.mul(out as unknown as gl_vec3_type, first as unknown as gl_vec3_type, second as unknown as gl_vec3_type);\r\n return out;\r\n}\r\n\r\n\r\nexport function div(first: Readonly, second: Readonly): T;\r\nexport function div(first: Readonly, second: Readonly, out: T): T;\r\nexport function div(first: Readonly, second: Readonly, out: T | U = Vec3Utils.clone(first)): T | U {\r\n gl_vec3.div(out as unknown as gl_vec3_type, first as unknown as gl_vec3_type, second as unknown as gl_vec3_type);\r\n return out;\r\n}\r\n\r\nexport function scale(vector: Readonly, value: number): T;\r\nexport function scale(vector: Readonly, value: number, out: T): T;\r\nexport function scale(vector: Readonly, value: number, out: T | U = Vec3Utils.clone(vector)): T | U {\r\n gl_vec3.scale(out as unknown as gl_vec3_type, vector as unknown as gl_vec3_type, value);\r\n return out;\r\n}\r\n\r\nexport function negate(vector: Readonly): T;\r\nexport function negate(vector: Readonly, out: T): T;\r\nexport function negate(vector: Readonly, out: T | U = Vec3Utils.clone(vector)): T | U {\r\n gl_vec3.negate(out as unknown as gl_vec3_type, vector as unknown as gl_vec3_type);\r\n return out;\r\n}\r\n\r\nexport function dot(first: Readonly, second: Readonly): number {\r\n return gl_vec3.dot(first as unknown as gl_vec3_type, second as unknown as gl_vec3_type);\r\n}\r\n\r\nexport function cross(first: Readonly, second: Readonly): T;\r\nexport function cross(first: Readonly, second: Readonly, out: T): T;\r\nexport function cross(first: Readonly, second: Readonly, out: T | U = Vec3Utils.clone(first)): T | U {\r\n gl_vec3.cross(out as unknown as gl_vec3_type, first as unknown as gl_vec3_type, second as unknown as gl_vec3_type);\r\n return out;\r\n}\r\n\r\nexport function transformQuat(vector: Readonly, quat: Readonly): T;\r\nexport function transformQuat(vector: Readonly, quat: Readonly, out: T): T;\r\nexport function transformQuat(vector: Readonly, quat: Readonly, out: T | U = Vec3Utils.clone(vector)): T | U {\r\n gl_vec3.transformQuat(out as unknown as gl_vec3_type, vector as unknown as gl_vec3_type, quat as unknown as gl_quat_type);\r\n return out;\r\n}\r\n\r\nexport function transformMat3(vector: Readonly, matrix: Readonly): T;\r\nexport function transformMat3(vector: Readonly, matrix: Readonly, out: T): T;\r\nexport function transformMat3(vector: Readonly, matrix: Readonly, out: T | U = Vec3Utils.clone(vector)): T | U {\r\n gl_vec3.transformMat3(out as unknown as gl_vec3_type, vector as unknown as gl_vec3_type, matrix as unknown as gl_mat3_type);\r\n return out;\r\n}\r\n\r\nexport function transformMat4(vector: Readonly, matrix: Readonly): T;\r\nexport function transformMat4(vector: Readonly, matrix: Readonly, out: T): T;\r\nexport function transformMat4(vector: Readonly, matrix: Readonly, out: T | U = Vec3Utils.clone(vector)): T | U {\r\n gl_vec3.transformMat4(out as unknown as gl_vec3_type, vector as unknown as gl_vec3_type, matrix as unknown as gl_mat4_type);\r\n return out;\r\n}\r\n\r\nexport function lerp(from: Readonly, to: Readonly, interpolationFactor: number): T;\r\nexport function lerp(from: Readonly, to: Readonly, interpolationFactor: number, out: T): T;\r\nexport function lerp(from: Readonly, to: Readonly, interpolationFactor: number, out: T | U = Vec3Utils.clone(from)): T | U {\r\n if (interpolationFactor <= 0) {\r\n Vec3Utils.copy(from, out);\r\n return out;\r\n } else if (interpolationFactor >= 1) {\r\n Vec3Utils.copy(to, out);\r\n return out;\r\n }\r\n\r\n gl_vec3.lerp(out as unknown as gl_vec3_type, from as unknown as gl_vec3_type, to as unknown as gl_vec3_type, interpolationFactor);\r\n return out;\r\n}\r\n\r\nexport function interpolate(from: Readonly, to: Readonly, interpolationFactor: number, easingFunction?: EasingFunction): T;\r\nexport function interpolate(from: Readonly, to: Readonly, interpolationFactor: number, easingFunction: EasingFunction, out: T): T;\r\nexport function interpolate(from: Readonly, to: Readonly, interpolationFactor: number, easingFunction: EasingFunction = EasingFunction.linear, out: T | U = Vec3Utils.clone(from)): T | U {\r\n const lerpFactor = easingFunction(interpolationFactor);\r\n return Vec3Utils.lerp(from, to, lerpFactor, out);\r\n}\r\n\r\nexport function angle(first: Readonly, second: Readonly): number {\r\n return Vec3Utils.angleDegrees(first, second);\r\n}\r\n\r\nexport function angleDegrees(first: Readonly, second: Readonly): number {\r\n return MathUtils.toDegrees(Vec3Utils.angleRadians(first, second));\r\n}\r\n\r\nexport function angleRadians(first: Readonly, second: Readonly): number {\r\n const firstX = first[0];\r\n const firstY = first[1];\r\n const firstZ = first[2];\r\n\r\n const secondX = second[0];\r\n const secondY = second[1];\r\n const secondZ = second[2];\r\n\r\n const firstLengthSquared = (firstX * firstX + firstY * firstY + firstZ * firstZ);\r\n const secondLengthSquared = (secondX * secondX + secondY * secondY + secondZ * secondZ);\r\n\r\n const lengthSquared = firstLengthSquared * secondLengthSquared;\r\n\r\n let angle = 0;\r\n if (lengthSquared > MathUtils.EPSILON_SQUARED) {\r\n const length = Math.sqrt(lengthSquared);\r\n\r\n const cos = Vec3Utils.dot(first, second) / length;\r\n angle = Math.acos(MathUtils.clamp(cos, -1, 1));\r\n }\r\n\r\n return angle;\r\n}\r\n\r\nexport function angleSigned(first: Readonly, second: Readonly, referenceAxis: Readonly): number {\r\n return Vec3Utils.angleSignedDegrees(first, second, referenceAxis);\r\n}\r\n\r\nexport function angleSignedDegrees(first: Readonly, second: Readonly, referenceAxis: Readonly): number {\r\n return MathUtils.toDegrees(Vec3Utils.angleSignedRadians(first, second, referenceAxis));\r\n}\r\n\r\nexport const angleSignedRadians = function () {\r\n const crossAxis = create();\r\n return function angleSignedRadians(first: Readonly, second: Readonly, referenceAxis: Readonly): number {\r\n Vec3Utils.cross(first, second, crossAxis);\r\n let angle = Vec3Utils.angleRadians(first, second);\r\n if (!Vec3Utils.isConcordant(crossAxis, referenceAxis)) {\r\n angle = -angle;\r\n }\r\n\r\n return angle;\r\n };\r\n}();\r\n\r\nexport function anglePivoted(first: Readonly, second: Readonly, referenceAxis: Readonly): number {\r\n return Vec3Utils.anglePivotedDegrees(first, second, referenceAxis);\r\n}\r\n\r\nexport function anglePivotedDegrees(first: Readonly, second: Readonly, referenceAxis: Readonly): number {\r\n return MathUtils.toDegrees(Vec3Utils.anglePivotedRadians(first, second, referenceAxis));\r\n}\r\n\r\nexport const anglePivotedRadians = function () {\r\n const flatFirst = create();\r\n const flatSecond = create();\r\n return function anglePivotedRadians(first: Readonly, second: Readonly, referenceAxis: Readonly): number {\r\n Vec3Utils.removeComponentAlongAxis(first, referenceAxis, flatFirst);\r\n Vec3Utils.removeComponentAlongAxis(second, referenceAxis, flatSecond);\r\n\r\n return Vec3Utils.angleRadians(flatFirst, flatSecond);\r\n };\r\n}();\r\n\r\nexport function anglePivotedSigned(first: Readonly, second: Readonly, referenceAxis: Readonly): number {\r\n return Vec3Utils.anglePivotedSignedDegrees(first, second, referenceAxis);\r\n}\r\n\r\nexport function anglePivotedSignedDegrees(first: Readonly, second: Readonly, referenceAxis: Readonly): number {\r\n return MathUtils.toDegrees(Vec3Utils.anglePivotedSignedRadians(first, second, referenceAxis));\r\n}\r\n\r\nexport const anglePivotedSignedRadians = function () {\r\n const flatFirst = create();\r\n const flatSecond = create();\r\n return function anglePivotedSignedRadians(first: Readonly, second: Readonly, referenceAxis: Readonly): number {\r\n Vec3Utils.removeComponentAlongAxis(first, referenceAxis, flatFirst);\r\n Vec3Utils.removeComponentAlongAxis(second, referenceAxis, flatSecond);\r\n\r\n return Vec3Utils.angleSignedRadians(flatFirst, flatSecond, referenceAxis);\r\n };\r\n}();\r\n\r\nexport function valueAlongAxis(vector: Readonly, axis: Readonly): number {\r\n const valueAlongAxis = Vec3Utils.dot(vector, axis);\r\n return valueAlongAxis;\r\n}\r\n\r\nexport const valueAlongPlane = function () {\r\n const componentAlong = create();\r\n return function valueAlongPlane(vector: Readonly, planeNormal: Readonly): number {\r\n Vec3Utils.removeComponentAlongAxis(vector, planeNormal, componentAlong);\r\n return Vec3Utils.length(componentAlong);\r\n };\r\n}();\r\n\r\nexport function componentAlongAxis(vector: Readonly, axis: Readonly): T;\r\nexport function componentAlongAxis(vector: Readonly, axis: Readonly, out: T): T;\r\nexport function componentAlongAxis(vector: Readonly, axis: Readonly, out: T | U = Vec3Utils.clone(vector)): T | U {\r\n const valueAlongAxis = Vec3Utils.valueAlongAxis(vector, axis);\r\n\r\n Vec3Utils.copy(axis, out);\r\n Vec3Utils.scale(out, valueAlongAxis, out);\r\n return out;\r\n}\r\n\r\nexport const removeComponentAlongAxis = function () {\r\n const componentAlong = create();\r\n\r\n function removeComponentAlongAxis(vector: Readonly, axis: Readonly): T;\r\n function removeComponentAlongAxis(vector: Readonly, axis: Readonly, out: T): T;\r\n function removeComponentAlongAxis(vector: Readonly, axis: Readonly, out: T | U = Vec3Utils.clone(vector)): T | U {\r\n Vec3Utils.componentAlongAxis(vector, axis, componentAlong);\r\n Vec3Utils.sub(vector, componentAlong, out);\r\n return out;\r\n }\r\n\r\n return removeComponentAlongAxis;\r\n}();\r\n\r\nexport const copyComponentAlongAxis = function () {\r\n const componentAlong = create();\r\n\r\n function copyComponentAlongAxis(from: Readonly, to: Readonly, axis: Readonly): T;\r\n function copyComponentAlongAxis(from: Readonly, to: Readonly, axis: Readonly, out: T): T;\r\n function copyComponentAlongAxis(from: Readonly, to: Readonly, axis: Readonly, out: T | U = Vec3Utils.clone(from)): T | U {\r\n Vec3Utils.removeComponentAlongAxis(to, axis, out);\r\n Vec3Utils.componentAlongAxis(from, axis, componentAlong);\r\n Vec3Utils.add(out, componentAlong, out);\r\n\r\n return out;\r\n }\r\n\r\n return copyComponentAlongAxis;\r\n}();\r\n\r\nexport function isConcordant(first: Readonly, second: Readonly): boolean {\r\n return Vec3Utils.dot(first, second) >= 0;\r\n}\r\n\r\nexport function isFartherAlongAxis(first: Readonly, second: Readonly, axis: Readonly): boolean {\r\n return Vec3Utils.valueAlongAxis(first, axis) > Vec3Utils.valueAlongAxis(second, axis);\r\n}\r\n\r\nexport function isToTheRight(first: Readonly, second: Readonly, referenceAxis: Readonly): boolean {\r\n return Vec3Utils.signTo(first, second, referenceAxis) >= 0;\r\n}\r\n\r\nexport const signTo = function () {\r\n const componentAlongThis = create();\r\n const componentAlongVector = create();\r\n return function signTo(first: Readonly, second: Readonly, referenceAxis: Readonly, zeroSign: number = 1): number {\r\n Vec3Utils.removeComponentAlongAxis(first, referenceAxis, componentAlongThis);\r\n Vec3Utils.removeComponentAlongAxis(second, referenceAxis, componentAlongVector);\r\n\r\n const angleSignedResult = Vec3Utils.angleSigned(first, second, referenceAxis);\r\n return angleSignedResult > 0 ? 1 : (angleSignedResult == 0 ? zeroSign : -1);\r\n };\r\n}();\r\n\r\nexport function projectOnAxis(vector: Readonly, axis: Readonly): T;\r\nexport function projectOnAxis(vector: Readonly, axis: Readonly, out: T): T;\r\nexport function projectOnAxis(vector: Readonly, axis: Readonly, out: T | U = Vec3Utils.clone(vector)): T | U {\r\n Vec3Utils.componentAlongAxis(vector, axis, out);\r\n return out;\r\n}\r\n\r\n// The result can easily be not 100% exact due to precision errors\r\nexport const projectOnAxisAlongAxis = function () {\r\n const up = create();\r\n const vectorProjectedToAxis = create();\r\n const fixedProjectAlongAxis = create();\r\n\r\n function projectOnAxisAlongAxis(vector: Readonly, axis: Readonly, projectAlongAxis: Readonly): T;\r\n function projectOnAxisAlongAxis(vector: Readonly, axis: Readonly, projectAlongAxis: Readonly, out: T): T;\r\n function projectOnAxisAlongAxis(vector: Readonly, axis: Readonly, projectAlongAxis: Readonly, out: T | U = Vec3Utils.clone(vector)): T | U {\r\n if (Vec3Utils.isOnAxis(vector, axis) || Vec3Utils.isOnAxis(projectAlongAxis, axis)) {\r\n Vec3Utils.copy(vector, out);\r\n } else {\r\n Vec3Utils.cross(projectAlongAxis, axis, up);\r\n Vec3Utils.normalize(up, up);\r\n\r\n if (Vec3Utils.isZero(up)) {\r\n Vec3Utils.perpendicularAny(projectAlongAxis, up);\r\n Vec3Utils.normalize(up, up);\r\n }\r\n\r\n Vec3Utils.removeComponentAlongAxis(vector, up, out);\r\n if (!Vec3Utils.isOnAxis(out, axis)) {\r\n Vec3Utils.projectOnAxis(out, axis, vectorProjectedToAxis);\r\n Vec3Utils.sub(vectorProjectedToAxis, out, vectorProjectedToAxis);\r\n\r\n if (Vec3Utils.isConcordant(vectorProjectedToAxis, projectAlongAxis)) {\r\n Vec3Utils.copy(projectAlongAxis, fixedProjectAlongAxis);\r\n } else {\r\n Vec3Utils.negate(projectAlongAxis, fixedProjectAlongAxis);\r\n }\r\n\r\n const angleWithAlongAxis = Vec3Utils.angleRadians(fixedProjectAlongAxis, vectorProjectedToAxis);\r\n const lengthToRemove = Vec3Utils.length(vectorProjectedToAxis) / Math.cos(angleWithAlongAxis);\r\n\r\n Vec3Utils.scale(fixedProjectAlongAxis, lengthToRemove, fixedProjectAlongAxis);\r\n Vec3Utils.add(out, fixedProjectAlongAxis, out);\r\n\r\n Vec3Utils.projectOnAxis(out, axis, out); // Snap on the axis, due to float precision error\r\n }\r\n }\r\n\r\n return out;\r\n }\r\n\r\n return projectOnAxisAlongAxis;\r\n}();\r\n\r\nexport function projectOnPlane(vector: Readonly, planeNormal: Readonly): T;\r\nexport function projectOnPlane(vector: Readonly, planeNormal: Readonly, out: T): T;\r\nexport function projectOnPlane(vector: Readonly, planeNormal: Readonly, out: T | U = Vec3Utils.clone(vector)): T | U {\r\n Vec3Utils.removeComponentAlongAxis(vector, planeNormal, out);\r\n return out;\r\n}\r\n\r\n// The result can easily be not 100% exact due to precision errors\r\nexport const projectOnPlaneAlongAxis = function () {\r\n const vectorProjectedToPlane = create();\r\n const fixedProjectAlongAxis = create();\r\n\r\n function projectOnPlaneAlongAxis(vector: Readonly, planeNormal: Readonly, projectAlongAxis: Readonly): T;\r\n function projectOnPlaneAlongAxis(vector: Readonly, planeNormal: Readonly, projectAlongAxis: Readonly, out: T): T;\r\n function projectOnPlaneAlongAxis(vector: Readonly, planeNormal: Readonly, projectAlongAxis: Readonly, out: T | U = Vec3Utils.clone(vector)): T | U {\r\n if (Vec3Utils.isOnPlane(vector, planeNormal) || Vec3Utils.isOnPlane(projectAlongAxis, planeNormal)) {\r\n Vec3Utils.copy(vector, out);\r\n } else {\r\n Vec3Utils.copy(vector, out);\r\n\r\n Vec3Utils.projectOnPlane(out, planeNormal, vectorProjectedToPlane);\r\n Vec3Utils.sub(vectorProjectedToPlane, out, vectorProjectedToPlane);\r\n\r\n if (Vec3Utils.isConcordant(vectorProjectedToPlane, projectAlongAxis)) {\r\n Vec3Utils.copy(projectAlongAxis, fixedProjectAlongAxis);\r\n } else {\r\n Vec3Utils.negate(projectAlongAxis, fixedProjectAlongAxis);\r\n }\r\n\r\n const angleWithAlongAxis = Vec3Utils.angleRadians(fixedProjectAlongAxis, vectorProjectedToPlane);\r\n const lengthToRemove = Vec3Utils.length(vectorProjectedToPlane) / Math.cos(angleWithAlongAxis);\r\n\r\n Vec3Utils.scale(fixedProjectAlongAxis, lengthToRemove, fixedProjectAlongAxis);\r\n Vec3Utils.add(out, fixedProjectAlongAxis, out);\r\n\r\n Vec3Utils.projectOnPlane(out, planeNormal, out); // Snap on the axis, due to float precision error\r\n }\r\n\r\n return out;\r\n }\r\n\r\n return projectOnPlaneAlongAxis;\r\n}();\r\n\r\nexport function isOnAxis(vector: Readonly, axis: Readonly): boolean {\r\n const angleResult = Vec3Utils.angle(vector, axis);\r\n return Math.abs(angleResult) < MathUtils.EPSILON_DEGREES || Math.abs(angleResult - 180) < MathUtils.EPSILON_DEGREES;\r\n}\r\n\r\nexport function isOnPlane(vector: Readonly, planeNormal: Readonly): boolean {\r\n const angleResult = Vec3Utils.angle(vector, planeNormal);\r\n return Math.abs(angleResult - 90) < MathUtils.EPSILON_DEGREES;\r\n}\r\n\r\nexport const perpendicularAny = function () {\r\n const notVector = create();\r\n\r\n function perpendicularAny(vector: Readonly): T;\r\n function perpendicularAny(vector: Readonly, out: T): T;\r\n function perpendicularAny(vector: Readonly, out: T | U = Vec3Utils.clone(vector)): T | U {\r\n if (Vec3Utils.isZero(vector)) {\r\n return Vec3Utils.zero(out);\r\n }\r\n\r\n Vec3Utils.copy(vector, notVector);\r\n\r\n let zeroAmount = 0;\r\n for (let i = 0; i < 3; i++) {\r\n if (vector[i] == 0) {\r\n zeroAmount++;\r\n }\r\n }\r\n\r\n if (zeroAmount == 2) {\r\n if (notVector[0] == 0) {\r\n notVector[0] = 1;\r\n } else if (notVector[1] == 0) {\r\n notVector[1] = 1;\r\n } else if (notVector[2] == 0) {\r\n notVector[2] = 1;\r\n }\r\n } else {\r\n if (notVector[0] != 0) {\r\n notVector[0] = -notVector[0];\r\n } else if (notVector[1] != 0) {\r\n notVector[1] = -notVector[1];\r\n } else if (notVector[2] != 0) {\r\n notVector[2] = -notVector[2];\r\n }\r\n }\r\n\r\n Vec3Utils.cross(notVector, vector, out);\r\n\r\n return out;\r\n }\r\n\r\n return perpendicularAny;\r\n}();\r\n\r\nexport function rotate(vector: Readonly, rotation: Readonly): T;\r\nexport function rotate(vector: Readonly, rotation: Readonly, out: T): T;\r\nexport function rotate(vector: Readonly, rotation: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.rotateDegrees(vector, rotation, out!);\r\n}\r\n\r\nexport const rotateDegrees = function () {\r\n const zero = create();\r\n\r\n function rotateDegrees(vector: Readonly, rotation: Readonly): T;\r\n function rotateDegrees(vector: Readonly, rotation: Readonly, out: T): T;\r\n function rotateDegrees(vector: Readonly, rotation: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.rotateAroundDegrees(vector, rotation, zero, out!);\r\n }\r\n\r\n return rotateDegrees;\r\n}();\r\n\r\nexport const rotateRadians = function () {\r\n const zero = create();\r\n\r\n function rotateRadians(vector: Readonly, rotation: Readonly): T;\r\n function rotateRadians(vector: Readonly, rotation: Readonly, out: T): T;\r\n function rotateRadians(vector: Readonly, rotation: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.rotateAroundRadians(vector, rotation, zero, out!);\r\n }\r\n\r\n return rotateRadians;\r\n}();\r\n\r\nexport const rotateQuat = function () {\r\n const zero = create();\r\n\r\n function rotateQuat(vector: Readonly, rotation: Readonly): T;\r\n function rotateQuat(vector: Readonly, rotation: Readonly, out: T): T;\r\n function rotateQuat(vector: Readonly, rotation: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.rotateAroundQuat(vector, rotation, zero, out!);\r\n }\r\n\r\n return rotateQuat;\r\n}();\r\n\r\nexport function rotateAxis(vector: Readonly, angle: number, axis: Readonly): T;\r\nexport function rotateAxis(vector: Readonly, angle: number, axis: Readonly, out: T): T;\r\nexport function rotateAxis(vector: Readonly, angle: number, axis: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.rotateAxisDegrees(vector, angle, axis, out!);\r\n}\r\n\r\nexport const rotateAxisDegrees = function () {\r\n const zero = create();\r\n\r\n function rotateAxisDegrees(vector: Readonly, angle: number, axis: Readonly): T;\r\n function rotateAxisDegrees(vector: Readonly, angle: number, axis: Readonly, out: T): T;\r\n function rotateAxisDegrees(vector: Readonly, angle: number, axis: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.rotateAroundAxisDegrees(vector, angle, axis, zero, out!);\r\n }\r\n\r\n return rotateAxisDegrees;\r\n}();\r\n\r\nexport const rotateAxisRadians = function () {\r\n const zero = create();\r\n\r\n function rotateAxisRadians(vector: Readonly, angle: number, axis: Readonly): T;\r\n function rotateAxisRadians(vector: Readonly, angle: number, axis: Readonly, out: T): T;\r\n function rotateAxisRadians(vector: Readonly, angle: number, axis: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.rotateAroundAxisRadians(vector, angle, axis, zero, out!);\r\n }\r\n\r\n return rotateAxisRadians;\r\n}();\r\n\r\nexport function rotateAround(vector: Readonly, rotation: Readonly, origin: Readonly): T;\r\nexport function rotateAround(vector: Readonly, rotation: Readonly, origin: Readonly, out: T): T;\r\nexport function rotateAround(vector: Readonly, rotation: Readonly, origin: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.rotateAroundDegrees(vector, rotation, origin, out!);\r\n}\r\n\r\nexport const rotateAroundDegrees = function () {\r\n const quat = quat_utils_create();\r\n\r\n function rotateAroundDegrees(vector: Readonly, rotation: Readonly, origin: Readonly): T;\r\n function rotateAroundDegrees(vector: Readonly, rotation: Readonly, origin: Readonly, out: T): T;\r\n function rotateAroundDegrees(vector: Readonly, rotation: Readonly, origin: Readonly, out: T | U = Vec3Utils.clone(vector)): T | U {\r\n Vec3Utils.degreesToQuat(rotation, quat);\r\n return Vec3Utils.rotateAroundQuat(vector, quat, origin, out);\r\n }\r\n\r\n return rotateAroundDegrees;\r\n}();\r\n\r\nexport const rotateAroundRadians = function () {\r\n const quat = quat_utils_create();\r\n\r\n function rotateAroundRadians(vector: Readonly, rotation: Readonly, origin: Readonly): T;\r\n function rotateAroundRadians(vector: Readonly, rotation: Readonly, origin: Readonly, out: T): T;\r\n function rotateAroundRadians(vector: Readonly, rotation: Readonly, origin: Readonly, out: T | U = Vec3Utils.clone(vector)): T | U {\r\n Vec3Utils.radiansToQuat(rotation, quat);\r\n return Vec3Utils.rotateAroundQuat(vector, quat, origin, out);\r\n }\r\n\r\n return rotateAroundRadians;\r\n}();\r\n\r\nexport function rotateAroundQuat(vector: Readonly, rotation: Readonly, origin: Readonly): T;\r\nexport function rotateAroundQuat(vector: Readonly, rotation: Readonly, origin: Readonly, out: T): T;\r\nexport function rotateAroundQuat(vector: Readonly, rotation: Readonly, origin: Readonly, out: T | U = Vec3Utils.clone(vector)): T | U {\r\n Vec3Utils.sub(vector, origin, out);\r\n Vec3Utils.transformQuat(out, rotation, out);\r\n Vec3Utils.add(out, origin, out);\r\n return out;\r\n}\r\n\r\nexport function rotateAroundAxis(vector: Readonly, angle: number, axis: Readonly, origin: Readonly): T;\r\nexport function rotateAroundAxis(vector: Readonly, angle: number, axis: Readonly, origin: Readonly, out: T): T;\r\nexport function rotateAroundAxis(vector: Readonly, angle: number, axis: Readonly, origin: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.rotateAroundAxisDegrees(vector, angle, axis, origin, out!);\r\n}\r\n\r\nexport function rotateAroundAxisDegrees(vector: Readonly, angle: number, axis: Readonly, origin: Readonly): T;\r\nexport function rotateAroundAxisDegrees(vector: Readonly, angle: number, axis: Readonly, origin: Readonly, out: T): T;\r\nexport function rotateAroundAxisDegrees(vector: Readonly, angle: number, axis: Readonly, origin: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.rotateAroundAxisRadians(vector, MathUtils.toRadians(angle), axis, origin, out!);\r\n}\r\nexport const rotateAroundAxisRadians = function () {\r\n const quat = quat_utils_create();\r\n\r\n function rotateAroundAxisRadians(vector: Readonly, angle: number, axis: Readonly, origin: Readonly): T;\r\n function rotateAroundAxisRadians(vector: Readonly, angle: number, axis: Readonly, origin: Readonly, out: T): T;\r\n function rotateAroundAxisRadians(vector: Readonly, angle: number, axis: Readonly, origin: Readonly, out: T | U = Vec3Utils.clone(vector)): T | U {\r\n QuatUtils.fromAxisRadians(angle, axis, quat);\r\n return Vec3Utils.rotateAroundQuat(vector, quat, origin, out);\r\n }\r\n\r\n return rotateAroundAxisRadians;\r\n}();\r\n\r\nexport function addRotation(vector: Readonly, rotation: Readonly): T;\r\nexport function addRotation(vector: Readonly, rotation: Readonly, out: T): T;\r\nexport function addRotation(vector: Readonly, rotation: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.degreesAddRotation(vector, rotation, out!);\r\n}\r\n\r\nexport function addRotationDegrees(vector: Readonly, rotation: Readonly): T;\r\nexport function addRotationDegrees(vector: Readonly, rotation: Readonly, out: T): T;\r\nexport function addRotationDegrees(vector: Readonly, rotation: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.degreesAddRotationDegrees(vector, rotation, out!);\r\n}\r\n\r\nexport function addRotationRadians(vector: Readonly, rotation: Readonly): T;\r\nexport function addRotationRadians(vector: Readonly, rotation: Readonly, out: T): T;\r\nexport function addRotationRadians(vector: Readonly, rotation: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.degreesAddRotationRadians(vector, rotation, out!);\r\n}\r\n\r\nexport function addRotationQuat(vector: Readonly, rotation: Readonly): T;\r\nexport function addRotationQuat(vector: Readonly, rotation: Readonly, out: T): T;\r\nexport function addRotationQuat(vector: Readonly, rotation: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.degreesAddRotationQuat(vector, rotation, out!);\r\n}\r\n\r\nexport function degreesAddRotation(vector: Readonly, rotation: Readonly): T;\r\nexport function degreesAddRotation(vector: Readonly, rotation: Readonly, out: T): T;\r\nexport function degreesAddRotation(vector: Readonly, rotation: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.degreesAddRotationDegrees(vector, rotation, out!);\r\n}\r\n\r\nexport const degreesAddRotationDegrees = function () {\r\n const quat = quat_utils_create();\r\n\r\n function degreesAddRotationDegrees(vector: Readonly, rotation: Readonly, out: T): T;\r\n function degreesAddRotationDegrees(vector: Readonly, rotation: Readonly, out: T): T;\r\n function degreesAddRotationDegrees(vector: Readonly, rotation: Readonly, out: T | U = Vec3Utils.clone(vector)): T | U {\r\n Vec3Utils.degreesToQuat(vector, quat);\r\n return QuatUtils.toDegrees(QuatUtils.addRotationDegrees(quat, rotation, quat), out);\r\n }\r\n\r\n return degreesAddRotationDegrees;\r\n}();\r\n\r\nexport const degreesAddRotationRadians = function () {\r\n const quat = quat_utils_create();\r\n\r\n function degreesAddRotationRadians(vector: Readonly, rotation: Readonly, out: T): T;\r\n function degreesAddRotationRadians(vector: Readonly, rotation: Readonly, out: T): T;\r\n function degreesAddRotationRadians(vector: Readonly, rotation: Readonly, out: T | U = Vec3Utils.clone(vector)): T | U {\r\n Vec3Utils.degreesToQuat(vector, quat);\r\n return QuatUtils.toDegrees(QuatUtils.addRotationRadians(quat, rotation, quat), out);\r\n }\r\n\r\n return degreesAddRotationRadians;\r\n}();\r\n\r\nexport const degreesAddRotationQuat = function () {\r\n const quat = quat_utils_create();\r\n\r\n function degreesAddRotationQuat(vector: Readonly, rotation: Readonly, out: T): T;\r\n function degreesAddRotationQuat(vector: Readonly, rotation: Readonly, out: T): T;\r\n function degreesAddRotationQuat(vector: Readonly, rotation: Readonly, out: T | U = Vec3Utils.clone(vector)): T | U {\r\n Vec3Utils.degreesToQuat(vector, quat);\r\n return QuatUtils.toDegrees(QuatUtils.addRotationQuat(quat, rotation, quat), out);\r\n }\r\n\r\n return degreesAddRotationQuat;\r\n}();\r\n\r\nexport function radiansAddRotation(vector: Readonly, rotation: Readonly): T;\r\nexport function radiansAddRotation(vector: Readonly, rotation: Readonly, out: T): T;\r\nexport function radiansAddRotation(vector: Readonly, rotation: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.radiansAddRotationDegrees(vector, rotation, out!);\r\n}\r\n\r\nexport const radiansAddRotationDegrees = function () {\r\n const quat = quat_utils_create();\r\n\r\n function radiansAddRotationDegrees(vector: Readonly, rotation: Readonly, out: T): T;\r\n function radiansAddRotationDegrees(vector: Readonly, rotation: Readonly, out: T): T;\r\n function radiansAddRotationDegrees(vector: Readonly, rotation: Readonly, out: T | U = Vec3Utils.clone(vector)): T | U {\r\n Vec3Utils.radiansToQuat(vector, quat);\r\n return QuatUtils.toRadians(QuatUtils.addRotationDegrees(quat, rotation, quat), out);\r\n }\r\n\r\n return radiansAddRotationDegrees;\r\n}();\r\n\r\nexport const radiansAddRotationRadians = function () {\r\n const quat = quat_utils_create();\r\n\r\n function radiansAddRotationRadians(vector: Readonly, rotation: Readonly, out: T): T;\r\n function radiansAddRotationRadians(vector: Readonly, rotation: Readonly, out: T): T;\r\n function radiansAddRotationRadians(vector: Readonly, rotation: Readonly, out: T | U = Vec3Utils.clone(vector)): T | U {\r\n Vec3Utils.radiansToQuat(vector, quat);\r\n return QuatUtils.toRadians(QuatUtils.addRotationRadians(quat, rotation, quat), out);\r\n }\r\n\r\n return radiansAddRotationRadians;\r\n}();\r\n\r\nexport const radiansAddRotationQuat = function () {\r\n const quat = quat_utils_create();\r\n\r\n function radiansAddRotationQuat(vector: Readonly, rotation: Readonly, out: T): T;\r\n function radiansAddRotationQuat(vector: Readonly, rotation: Readonly, out: T): T;\r\n function radiansAddRotationQuat(vector: Readonly, rotation: Readonly, out: T | U = Vec3Utils.clone(vector)): T | U {\r\n Vec3Utils.radiansToQuat(vector, quat);\r\n return QuatUtils.toRadians(QuatUtils.addRotationQuat(quat, rotation, quat), out);\r\n }\r\n\r\n return radiansAddRotationQuat;\r\n}();\r\n\r\nexport function rotationTo(from: Readonly, to: Readonly): T;\r\nexport function rotationTo(from: Readonly, to: Readonly, out: T): T;\r\nexport function rotationTo(from: Readonly, to: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.rotationToDegrees(from, to, out!);\r\n}\r\n\r\nexport const rotationToDegrees = function () {\r\n const rotationQuat = quat_utils_create();\r\n\r\n function rotationToDegrees(from: Readonly, to: Readonly): T;\r\n function rotationToDegrees(from: Readonly, to: Readonly, out: T): T;\r\n function rotationToDegrees(from: Readonly, to: Readonly, out: T | U = Vec3Utils.clone(from)): T | U {\r\n Vec3Utils.rotationToQuat(from, to, rotationQuat);\r\n QuatUtils.toDegrees(rotationQuat, out);\r\n return out;\r\n }\r\n\r\n return rotationToDegrees;\r\n}();\r\n\r\nexport const rotationToRadians = function () {\r\n const rotationQuat = quat_utils_create();\r\n\r\n function rotationToRadians(from: Readonly, to: Readonly): T;\r\n function rotationToRadians(from: Readonly, to: Readonly, out: T): T;\r\n function rotationToRadians(from: Readonly, to: Readonly, out: T | U = Vec3Utils.clone(from)): T | U {\r\n Vec3Utils.rotationToQuat(from, to, rotationQuat);\r\n QuatUtils.toRadians(rotationQuat, out);\r\n return out;\r\n }\r\n\r\n return rotationToRadians;\r\n}();\r\n\r\nexport const rotationToQuat = function () {\r\n const rotationAxis = create();\r\n\r\n function rotationToQuat(from: Readonly, to: Readonly): Quaternion;\r\n function rotationToQuat(from: Readonly, to: Readonly, out: T): T;\r\n function rotationToQuat(from: Readonly, to: Readonly, out: Quaternion | T = QuatUtils.create()): Quaternion | T {\r\n Vec3Utils.cross(from, to, rotationAxis);\r\n Vec3Utils.normalize(rotationAxis, rotationAxis);\r\n\r\n if (Vec3Utils.isZero(rotationAxis)) {\r\n Vec3Utils.perpendicularAny(from, rotationAxis);\r\n Vec3Utils.normalize(rotationAxis, rotationAxis);\r\n }\r\n\r\n const signedAngle = Vec3Utils.angleSigned(from, to, rotationAxis);\r\n QuatUtils.fromAxisRadians(signedAngle, rotationAxis, out);\r\n return out;\r\n }\r\n\r\n return rotationToQuat;\r\n}();\r\n\r\nexport function rotationToPivoted(from: Readonly, to: Readonly, pivotAxis: Readonly): T;\r\nexport function rotationToPivoted(from: Readonly, to: Readonly, pivotAxis: Readonly, out: T): T;\r\nexport function rotationToPivoted(from: Readonly, to: Readonly, pivotAxis: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.rotationToPivotedDegrees(from, to, pivotAxis, out!);\r\n}\r\n\r\nexport const rotationToPivotedDegrees = function () {\r\n const rotationQuat = quat_utils_create();\r\n\r\n function rotationToPivotedDegrees(from: Readonly, to: Readonly, pivotAxis: Readonly): T;\r\n function rotationToPivotedDegrees(from: Readonly, to: Readonly, pivotAxis: Readonly, out: T): T;\r\n function rotationToPivotedDegrees(from: Readonly, to: Readonly, pivotAxis: Readonly, out: T | U = Vec3Utils.clone(from)): T | U {\r\n Vec3Utils.rotationToPivotedQuat(from, to, pivotAxis, rotationQuat);\r\n QuatUtils.toDegrees(rotationQuat, out);\r\n return out;\r\n }\r\n\r\n return rotationToPivotedDegrees;\r\n}();\r\n\r\nexport const rotationToPivotedRadians = function () {\r\n const rotationQuat = quat_utils_create();\r\n\r\n function rotationToPivotedRadians(from: Readonly, to: Readonly, pivotAxis: Readonly): T;\r\n function rotationToPivotedRadians(from: Readonly, to: Readonly, pivotAxis: Readonly, out: T): T;\r\n function rotationToPivotedRadians(from: Readonly, to: Readonly, pivotAxis: Readonly, out: T | U = Vec3Utils.clone(from)): T | U {\r\n Vec3Utils.rotationToPivotedQuat(from, to, pivotAxis, rotationQuat);\r\n QuatUtils.toRadians(rotationQuat, out);\r\n return out;\r\n }\r\n\r\n return rotationToPivotedRadians;\r\n}();\r\n\r\nexport const rotationToPivotedQuat = function () {\r\n const fromFlat = create();\r\n const toFlat = create();\r\n const rotationAxis = create();\r\n\r\n function rotationToPivotedQuat(from: Readonly, to: Readonly, pivotAxis: Readonly): Quaternion;\r\n function rotationToPivotedQuat(from: Readonly, to: Readonly, pivotAxis: Readonly, out: T): T;\r\n function rotationToPivotedQuat(from: Readonly, to: Readonly, pivotAxis: Readonly, out: Quaternion | T = QuatUtils.create()): Quaternion | T {\r\n Vec3Utils.removeComponentAlongAxis(from, pivotAxis, fromFlat);\r\n Vec3Utils.removeComponentAlongAxis(to, pivotAxis, toFlat);\r\n\r\n Vec3Utils.cross(fromFlat, toFlat, rotationAxis);\r\n Vec3Utils.normalize(rotationAxis, rotationAxis);\r\n\r\n if (Vec3Utils.isZero(rotationAxis)) {\r\n Vec3Utils.perpendicularAny(fromFlat, rotationAxis);\r\n Vec3Utils.normalize(rotationAxis, rotationAxis);\r\n }\r\n\r\n const signedAngle = Vec3Utils.angleSignedRadians(fromFlat, toFlat, rotationAxis);\r\n QuatUtils.fromAxisRadians(signedAngle, rotationAxis, out);\r\n return out;\r\n }\r\n\r\n return rotationToPivotedQuat;\r\n}();\r\n\r\nexport function convertPositionToWorld(vector: Readonly, parentTransform: Readonly): T;\r\nexport function convertPositionToWorld(vector: Readonly, parentTransform: Readonly, out: T): T;\r\nexport function convertPositionToWorld(vector: Readonly, parentTransform: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.convertPositionToWorldMatrix(vector, parentTransform, out!);\r\n}\r\n\r\nexport function convertPositionToLocal(vector: Readonly, parentTransform: Readonly): T;\r\nexport function convertPositionToLocal(vector: Readonly, parentTransform: Readonly, out: T): T;\r\nexport function convertPositionToLocal(vector: Readonly, parentTransform: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.convertPositionToLocalMatrix(vector, parentTransform, out!);\r\n}\r\n\r\nexport function convertPositionToWorldMatrix(vector: Readonly, parentTransform: Readonly): T;\r\nexport function convertPositionToWorldMatrix(vector: Readonly, parentTransform: Readonly, out: T): T;\r\nexport function convertPositionToWorldMatrix(vector: Readonly, parentTransform: Readonly, out: T | U = Vec3Utils.clone(vector)): T | U {\r\n Vec3Utils.transformMat4(vector, parentTransform, out);\r\n return out;\r\n}\r\n\r\nexport const convertPositionToLocalMatrix = function () {\r\n const inverse = mat4_utils_create();\r\n\r\n function convertPositionToLocalMatrix(vector: Readonly, parentTransform: Readonly): T;\r\n function convertPositionToLocalMatrix(vector: Readonly, parentTransform: Readonly, out: T): T;\r\n function convertPositionToLocalMatrix(vector: Readonly, parentTransform: Readonly, out: T | U = Vec3Utils.clone(vector)): T | U {\r\n Mat4Utils.invert(parentTransform, inverse);\r\n Vec3Utils.transformMat4(vector, inverse, out);\r\n return out;\r\n }\r\n\r\n return convertPositionToLocalMatrix;\r\n}();\r\n\r\nexport const convertPositionToWorldQuat = function () {\r\n const parentTransformMatrix = mat4_utils_create();\r\n const position = create();\r\n const rotation = quat_utils_create();\r\n const one = create();\r\n set(one, 1, 1, 1);\r\n\r\n function convertPositionToWorldQuat(vector: Readonly, parentTransform: Readonly): T;\r\n function convertPositionToWorldQuat(vector: Readonly, parentTransform: Readonly, out: T): T;\r\n function convertPositionToWorldQuat(vector: Readonly, parentTransform: Readonly, out: T | U = Vec3Utils.clone(vector)): T | U {\r\n Quat2Utils.getPosition(parentTransform, position);\r\n Quat2Utils.getRotationQuat(parentTransform, rotation);\r\n Mat4Utils.setPositionRotationQuatScale(parentTransformMatrix, position, rotation, one);\r\n return Vec3Utils.convertPositionToWorldMatrix(vector, parentTransformMatrix, out);\r\n }\r\n\r\n return convertPositionToWorldQuat;\r\n}();\r\n\r\nexport const convertPositionToLocalQuat = function () {\r\n const parentTransformMatrix = mat4_utils_create();\r\n const position = create();\r\n const rotation = quat_utils_create();\r\n const one = create();\r\n set(one, 1, 1, 1);\r\n\r\n function convertPositionToLocalQuat(vector: Readonly, parentTransform: Readonly): T;\r\n function convertPositionToLocalQuat(vector: Readonly, parentTransform: Readonly, out: T): T;\r\n function convertPositionToLocalQuat(vector: Readonly, parentTransform: Readonly, out: T | U = Vec3Utils.clone(vector)): T | U {\r\n Quat2Utils.getPosition(parentTransform, position);\r\n Quat2Utils.getRotationQuat(parentTransform, rotation);\r\n Mat4Utils.setPositionRotationQuatScale(parentTransformMatrix, position, rotation, one);\r\n return Vec3Utils.convertPositionToLocalMatrix(vector, parentTransformMatrix, out);\r\n }\r\n\r\n return convertPositionToLocalQuat;\r\n}();\r\n\r\nexport function convertDirectionToWorld(vector: Readonly, parentTransform: Readonly): T;\r\nexport function convertDirectionToWorld(vector: Readonly, parentTransform: Readonly, out: T): T;\r\nexport function convertDirectionToWorld(vector: Readonly, parentTransform: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.convertDirectionToWorldMatrix(vector, parentTransform, out!);\r\n}\r\n\r\nexport function convertDirectionToLocal(vector: Readonly, parentTransform: Readonly): T;\r\nexport function convertDirectionToLocal(vector: Readonly, parentTransform: Readonly, out: T): T;\r\nexport function convertDirectionToLocal(vector: Readonly, parentTransform: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.convertDirectionToLocalMatrix(vector, parentTransform, out!);\r\n}\r\n\r\nexport const convertDirectionToWorldMatrix = function () {\r\n const rotation = quat_utils_create();\r\n\r\n function convertDirectionToWorldMatrix(vector: Readonly, parentTransform: Readonly): T;\r\n function convertDirectionToWorldMatrix(vector: Readonly, parentTransform: Readonly, out: T): T;\r\n function convertDirectionToWorldMatrix(vector: Readonly, parentTransform: Readonly, out: T | U = Vec3Utils.clone(vector)): T | U {\r\n Mat4Utils.getRotationQuat(parentTransform, rotation);\r\n Vec3Utils.transformQuat(vector, rotation, out);\r\n return out;\r\n }\r\n\r\n return convertDirectionToWorldMatrix;\r\n}();\r\n\r\nexport const convertDirectionToLocalMatrix = function () {\r\n const rotation = quat_utils_create();\r\n\r\n function convertDirectionToLocalMatrix(vector: Readonly, parentTransform: Readonly): T;\r\n function convertDirectionToLocalMatrix(vector: Readonly, parentTransform: Readonly, out: T): T;\r\n function convertDirectionToLocalMatrix(vector: Readonly, parentTransform: Readonly, out: T | U = Vec3Utils.clone(vector)): T | U {\r\n Mat4Utils.getRotationQuat(parentTransform, rotation);\r\n QuatUtils.conjugate(rotation, rotation);\r\n Vec3Utils.transformQuat(vector, rotation, out);\r\n return out;\r\n }\r\n\r\n return convertDirectionToLocalMatrix;\r\n}();\r\n\r\n\r\nexport const convertDirectionToWorldQuat = function () {\r\n const rotation = quat_utils_create();\r\n\r\n function convertDirectionToWorldQuat(vector: Readonly, parentTransform: Readonly): T;\r\n function convertDirectionToWorldQuat(vector: Readonly, parentTransform: Readonly, out: T): T;\r\n function convertDirectionToWorldQuat(vector: Readonly, parentTransform: Readonly, out: T | U = Vec3Utils.clone(vector)): T | U {\r\n Quat2Utils.getRotationQuat(parentTransform, rotation);\r\n Vec3Utils.transformQuat(vector, rotation, out);\r\n return out;\r\n }\r\n\r\n return convertDirectionToWorldQuat;\r\n}();\r\n\r\nexport const convertDirectionToLocalQuat = function () {\r\n const rotation = quat_utils_create();\r\n\r\n function convertDirectionToLocalQuat(vector: Readonly, parentTransform: Readonly): T;\r\n function convertDirectionToLocalQuat(vector: Readonly, parentTransform: Readonly, out: T): T;\r\n function convertDirectionToLocalQuat(vector: Readonly, parentTransform: Readonly, out: T | U = Vec3Utils.clone(vector)): T | U {\r\n Quat2Utils.getRotationQuat(parentTransform, rotation);\r\n QuatUtils.conjugate(rotation, rotation);\r\n Vec3Utils.transformQuat(vector, rotation, out);\r\n return out;\r\n }\r\n\r\n return convertDirectionToLocalQuat;\r\n}();\r\n\r\nexport function toRadians(vector: Readonly): T;\r\nexport function toRadians(vector: Readonly, out: T): T;\r\nexport function toRadians(vector: Readonly, out: T | U = Vec3Utils.clone(vector)): T | U {\r\n Vec3Utils.set(out, MathUtils.toRadians(vector[0]), MathUtils.toRadians(vector[1]), MathUtils.toRadians(vector[2]));\r\n return out;\r\n}\r\n\r\nexport function toDegrees(vector: Readonly): T;\r\nexport function toDegrees(vector: Readonly, out: T): T;\r\nexport function toDegrees(vector: Readonly, out: T | U = Vec3Utils.clone(vector)): T | U {\r\n Vec3Utils.set(out, MathUtils.toDegrees(vector[0]), MathUtils.toDegrees(vector[1]), MathUtils.toDegrees(vector[2]));\r\n return out;\r\n}\r\n\r\nexport function toQuat(vector: Readonly): Quaternion;\r\nexport function toQuat(vector: Readonly, out: T): T;\r\nexport function toQuat(vector: Readonly, out: Quaternion | T = QuatUtils.create()): Quaternion | T {\r\n return Vec3Utils.degreesToQuat(vector, out);\r\n}\r\n\r\nexport function radiansToQuat(vector: Readonly): Quaternion;\r\nexport function radiansToQuat(vector: Readonly, out: T): T;\r\nexport function radiansToQuat(vector: Readonly, out: Quaternion | T = QuatUtils.create()): Quaternion | T {\r\n QuatUtils.fromRadians(vector, out);\r\n return out;\r\n}\r\n\r\nexport function degreesToQuat(vector: Readonly): Quaternion;\r\nexport function degreesToQuat(vector: Readonly, out: T): T;\r\nexport function degreesToQuat(vector: Readonly, out: Quaternion | T = QuatUtils.create()): Quaternion | T {\r\n QuatUtils.fromDegrees(vector, out);\r\n return out;\r\n}\r\n\r\nexport function toMatrix(vector: Readonly): Matrix3;\r\nexport function toMatrix(vector: Readonly, out: T): T;\r\nexport function toMatrix(vector: Readonly, out: Matrix3 | T = Mat3Utils.create()): Matrix3 | T {\r\n return Vec3Utils.degreesToMatrix(vector, out);\r\n}\r\n\r\nexport const degreesToMatrix = function () {\r\n const quat = quat_utils_create();\r\n\r\n function degreesToMatrix(vector: Readonly): Matrix3;\r\n function degreesToMatrix(vector: Readonly, out: T): T;\r\n function degreesToMatrix(vector: Readonly, out: Matrix3 | T = Mat3Utils.create()): Matrix3 | T {\r\n Vec3Utils.degreesToQuat(vector, quat);\r\n return QuatUtils.toMatrix(quat, out);\r\n }\r\n\r\n return degreesToMatrix;\r\n}();\r\n\r\nexport const radiansToMatrix = function () {\r\n const quat = quat_utils_create();\r\n\r\n function radiansToMatrix(vector: Readonly): Matrix3;\r\n function radiansToMatrix(vector: Readonly, out: T): T;\r\n function radiansToMatrix(vector: Readonly, out: Matrix3 | T = Mat3Utils.create()): Matrix3 | T {\r\n Vec3Utils.radiansToQuat(vector, quat);\r\n return QuatUtils.toMatrix(quat, out);\r\n }\r\n\r\n return radiansToMatrix;\r\n}();\r\n\r\n/**\r\n * How to use\r\n * \r\n * By default rotations are in `Degrees` and transforms are `Matrix4` (and not `Quat2`) \r\n * For functions that work with rotations, `Matrix` means `Matrix3` and `Quat` means `Quat` \r\n * For functions that work with transforms, `Matrix` means `Matrix4` and `Quat` means `Quat2`\r\n * \r\n * For rotations u can add a suffix like `Degrees`/`Radians`/`Quat`/`Matrix` to use a specific version, example: \r\n * - `angleDegrees` \r\n * - `rotateQuat`\r\n * \r\n * For transform u can add a suffix like `Quat`/`Matrix` to use a specific version, example: \r\n * - convertPositionToWorldMatrix \r\n * - convertDirectionToWorldQuat\r\n * \r\n * Some functions let u add a prefix to specify if the vector represent a rotation in `Degrees` or `Radians`, where `Degrees` is the default: \r\n * - toQuat \r\n * - degreesToQuat \r\n * - radiansToQuat \r\n * - degreesAddRotation\r\n * \r\n * Rotation operations return a rotation of the same kind of the starting variable: \r\n * - degreesAddRotationQuat -> returns a rotation in `Degrees` \r\n * - radiansAddRotationDegrees -> returns a rotation in `Radians`\r\n * \r\n * The functions leave u the choice of forwarding an out parameter or just get the return value, example: \r\n * - `let negate = Vec3Utils.negate(vector)` \r\n * - `Vec3Utils.negate(vector, negate)` \r\n * - the out parameter is always the last one\r\n */\r\nexport const Vec3Utils = {\r\n create,\r\n getAllocationFunction,\r\n setAllocationFunction,\r\n set,\r\n copy,\r\n clone,\r\n equals,\r\n isNormalized,\r\n normalize,\r\n isZero,\r\n zero,\r\n length,\r\n lengthSquared,\r\n lengthSigned,\r\n distance,\r\n distanceSquared,\r\n add,\r\n sub,\r\n mul,\r\n div,\r\n scale,\r\n negate,\r\n dot,\r\n cross,\r\n transformQuat,\r\n transformMat3,\r\n transformMat4,\r\n lerp,\r\n interpolate,\r\n angle,\r\n angleDegrees,\r\n angleRadians,\r\n angleSigned,\r\n angleSignedDegrees,\r\n angleSignedRadians,\r\n anglePivoted,\r\n anglePivotedDegrees,\r\n anglePivotedRadians,\r\n anglePivotedSigned,\r\n anglePivotedSignedDegrees,\r\n anglePivotedSignedRadians,\r\n valueAlongAxis,\r\n valueAlongPlane,\r\n componentAlongAxis,\r\n removeComponentAlongAxis,\r\n copyComponentAlongAxis,\r\n isConcordant,\r\n isFartherAlongAxis,\r\n isToTheRight,\r\n signTo,\r\n projectOnAxis,\r\n projectOnAxisAlongAxis,\r\n projectOnPlane,\r\n projectOnPlaneAlongAxis,\r\n isOnAxis,\r\n isOnPlane,\r\n perpendicularAny,\r\n rotate,\r\n rotateDegrees,\r\n rotateRadians,\r\n rotateQuat,\r\n rotateAxis,\r\n rotateAxisDegrees,\r\n rotateAxisRadians,\r\n rotateAround,\r\n rotateAroundDegrees,\r\n rotateAroundRadians,\r\n rotateAroundQuat,\r\n rotateAroundAxis,\r\n rotateAroundAxisDegrees,\r\n rotateAroundAxisRadians,\r\n addRotation,\r\n addRotationDegrees,\r\n addRotationRadians,\r\n addRotationQuat,\r\n degreesAddRotation,\r\n degreesAddRotationDegrees,\r\n degreesAddRotationRadians,\r\n degreesAddRotationQuat,\r\n radiansAddRotation,\r\n radiansAddRotationDegrees,\r\n radiansAddRotationRadians,\r\n radiansAddRotationQuat,\r\n rotationTo,\r\n rotationToDegrees,\r\n rotationToRadians,\r\n rotationToQuat,\r\n rotationToPivoted,\r\n rotationToPivotedDegrees,\r\n rotationToPivotedRadians,\r\n rotationToPivotedQuat,\r\n convertPositionToWorld,\r\n convertPositionToLocal,\r\n convertPositionToWorldMatrix,\r\n convertPositionToLocalMatrix,\r\n convertPositionToWorldQuat,\r\n convertPositionToLocalQuat,\r\n convertDirectionToWorld,\r\n convertDirectionToLocal,\r\n convertDirectionToWorldMatrix,\r\n convertDirectionToLocalMatrix,\r\n convertDirectionToWorldQuat,\r\n convertDirectionToLocalQuat,\r\n toRadians,\r\n toDegrees,\r\n toQuat,\r\n radiansToQuat,\r\n degreesToQuat,\r\n toMatrix,\r\n degreesToMatrix,\r\n radiansToMatrix\r\n} as const;", "\r\nimport { mat4 as gl_mat4, type mat4 as gl_mat4_type, type vec3 as gl_vec3_type } from \"gl-matrix\";\r\nimport { Matrix4, Quaternion, Quaternion2, Vector3 } from \"../../type_definitions/array_type_definitions.js\";\r\nimport { MathUtils } from \"../math_utils.js\";\r\nimport { Quat2Utils } from \"./quat2_utils.js\";\r\nimport { QuatUtils, create as quat_utils_create } from \"./quat_utils.js\";\r\nimport { Vec3Utils, create as vec3_utils_create, set as vec3_utils_set } from \"./vec3_utils.js\";\r\nimport { getMatrix4AllocationFunction, setMatrix4AllocationFunction } from \"./vec_allocation_utils.js\";\r\n\r\nexport function create(): Matrix4;\r\nexport function create(\r\n m00: number, m01: number, m02: number, m03: number,\r\n m10: number, m11: number, m12: number, m13: number,\r\n m20: number, m21: number, m22: number, m23: number,\r\n m30: number, m31: number, m32: number, m33: number): Matrix4;\r\nexport function create(uniformValue: number): Matrix4;\r\nexport function create(\r\n m00?: number, m01?: number, m02?: number, m03?: number,\r\n m10?: number, m11?: number, m12?: number, m13?: number,\r\n m20?: number, m21?: number, m22?: number, m23?: number,\r\n m30?: number, m31?: number, m32?: number, m33?: number): Matrix4 {\r\n const out = getAllocationFunction()();\r\n\r\n if (m00 != null) {\r\n Mat4Utils.set(\r\n out,\r\n m00, m01!, m02!, m03!,\r\n m10!, m11!, m12!, m13!,\r\n m20!, m21!, m22!, m23!,\r\n m30!, m31!, m32!, m33!);\r\n }\r\n\r\n return out;\r\n}\r\n\r\nexport function getAllocationFunction(): () => Matrix4 {\r\n return getMatrix4AllocationFunction();\r\n}\r\n\r\n/** Specify the function that will be used to allocate the matrix when calling the {@link create} function */\r\nexport function setAllocationFunction(allocationFunction: () => Matrix4): void {\r\n setMatrix4AllocationFunction(allocationFunction);\r\n}\r\n\r\nexport function set(matrix: T,\r\n m00: number, m01: number, m02: number, m03: number,\r\n m10: number, m11: number, m12: number, m13: number,\r\n m20: number, m21: number, m22: number, m23: number,\r\n m30: number, m31: number, m32: number, m33: number): T;\r\nexport function set(matrix: T, uniformValue: number): T;\r\nexport function set(matrix: T,\r\n m00: number, m01?: number, m02?: number, m03?: number,\r\n m10?: number, m11?: number, m12?: number, m13?: number,\r\n m20?: number, m21?: number, m22?: number, m23?: number,\r\n m30?: number, m31?: number, m32?: number, m33?: number): T {\r\n if (m01 == null) {\r\n gl_mat4.set(matrix as unknown as gl_mat4_type,\r\n m00, m00, m00, m00,\r\n m00, m00, m00, m00,\r\n m00, m00, m00, m00,\r\n m00, m00, m00, m00);\r\n } else {\r\n gl_mat4.set(matrix as unknown as gl_mat4_type,\r\n m00, m01, m02!, m03!,\r\n m10!, m11!, m12!, m13!,\r\n m20!, m21!, m22!, m23!,\r\n m30!, m31!, m32!, m33!);\r\n }\r\n\r\n return matrix;\r\n}\r\n\r\nexport function copy(from: Readonly, to: T): T {\r\n gl_mat4.copy(to as unknown as gl_mat4_type, from as unknown as gl_mat4_type);\r\n return to;\r\n}\r\n\r\n/** The overload where `T extends Matrix4` does also get `array` as `Readonly`, but is not marked as such due to \r\n Typescript having issues with inferring the proper type of `T` when `Readonly` is used */\r\nexport function clone(matrix: Readonly): T;\r\nexport function clone(matrix: Readonly): number[];\r\nexport function clone(matrix: T): T;\r\nexport function clone(matrix: Readonly): T {\r\n return matrix.slice(0) as T;\r\n}\r\n\r\nexport function equals(first: Readonly, second: Readonly, epsilon: number = 0): boolean {\r\n let equals = first.length == second.length;\r\n\r\n if (equals) {\r\n equals &&= (Math.abs(first[0] - second[0]) <= epsilon);\r\n equals &&= (Math.abs(first[1] - second[1]) <= epsilon);\r\n equals &&= (Math.abs(first[2] - second[2]) <= epsilon);\r\n equals &&= (Math.abs(first[3] - second[3]) <= epsilon);\r\n equals &&= (Math.abs(first[4] - second[4]) <= epsilon);\r\n equals &&= (Math.abs(first[5] - second[5]) <= epsilon);\r\n equals &&= (Math.abs(first[6] - second[6]) <= epsilon);\r\n equals &&= (Math.abs(first[7] - second[7]) <= epsilon);\r\n equals &&= (Math.abs(first[8] - second[8]) <= epsilon);\r\n equals &&= (Math.abs(first[9] - second[9]) <= epsilon);\r\n equals &&= (Math.abs(first[10] - second[10]) <= epsilon);\r\n equals &&= (Math.abs(first[11] - second[11]) <= epsilon);\r\n equals &&= (Math.abs(first[12] - second[12]) <= epsilon);\r\n equals &&= (Math.abs(first[13] - second[13]) <= epsilon);\r\n equals &&= (Math.abs(first[14] - second[14]) <= epsilon);\r\n equals &&= (Math.abs(first[15] - second[15]) <= epsilon);\r\n }\r\n\r\n return equals;\r\n}\r\n\r\nexport function identity(matrix: T): T {\r\n gl_mat4.identity(matrix as unknown as gl_mat4_type);\r\n return matrix;\r\n}\r\n\r\nexport function invert(matrix: Readonly): T;\r\nexport function invert(matrix: Readonly, out: T): T;\r\nexport function invert(matrix: Readonly, out: T | U = Mat4Utils.clone(matrix)): T | U {\r\n gl_mat4.invert(out as unknown as gl_mat4_type, matrix as unknown as gl_mat4_type);\r\n return out;\r\n}\r\n\r\nexport function mul(first: Readonly, second: Readonly): T;\r\nexport function mul(first: Readonly, second: Readonly, out: T): T;\r\nexport function mul(first: Readonly, second: Readonly, out: T | U = Mat4Utils.clone(first)): T | U {\r\n gl_mat4.mul(out as unknown as gl_mat4_type, first as unknown as gl_mat4_type, second as unknown as gl_mat4_type);\r\n return out;\r\n}\r\n\r\nexport function scale(matrix: Readonly, vector: Readonly): T;\r\nexport function scale(matrix: Readonly, vector: Readonly, out: T): T;\r\nexport function scale(matrix: Readonly, vector: Readonly, out: T | U = Mat4Utils.clone(matrix)): T | U {\r\n gl_mat4.scale(out as unknown as gl_mat4_type, matrix as unknown as gl_mat4_type, vector as unknown as gl_vec3_type);\r\n return out;\r\n}\r\n\r\nexport function getPosition(matrix: Readonly): Vector3;\r\nexport function getPosition(matrix: Readonly, out: T): T;\r\nexport function getPosition(matrix: Readonly, out: Vector3 | T = Vec3Utils.create()): Vector3 | T {\r\n gl_mat4.getTranslation(out as unknown as gl_vec3_type, matrix as unknown as gl_mat4_type);\r\n return out;\r\n}\r\n\r\nexport function getRotation(matrix: Readonly): Vector3;\r\nexport function getRotation(matrix: Readonly, out: T): T;\r\nexport function getRotation(matrix: Readonly, out?: Vector3 | T): Vector3 | T {\r\n return Mat4Utils.getRotationDegrees(matrix, out!);\r\n}\r\n\r\nexport const getRotationDegrees = function () {\r\n const quat = quat_utils_create();\r\n\r\n function getRotationDegrees(matrix: Readonly): Vector3;\r\n function getRotationDegrees(matrix: Readonly, out: T): T;\r\n function getRotationDegrees(matrix: Readonly, out: Vector3 | T = Vec3Utils.create()): Vector3 | T {\r\n Mat4Utils.getRotationQuat(matrix, quat);\r\n QuatUtils.toDegrees(quat, out);\r\n return out;\r\n }\r\n\r\n return getRotationDegrees;\r\n}();\r\n\r\nexport const getRotationRadians = function () {\r\n const quat = quat_utils_create();\r\n\r\n function getRotationRadians(matrix: Readonly): Vector3;\r\n function getRotationRadians(matrix: Readonly, out: T): T;\r\n function getRotationRadians(matrix: Readonly, out: Vector3 | T = Vec3Utils.create()): Vector3 | T {\r\n Mat4Utils.getRotationQuat(matrix, quat);\r\n QuatUtils.toRadians(quat, out);\r\n return out;\r\n }\r\n\r\n return getRotationRadians;\r\n}();\r\n\r\nexport const getRotationQuat = function () {\r\n const tempScale = vec3_utils_create();\r\n const transformMatrixNoScale = create();\r\n const inverseScale = vec3_utils_create();\r\n const one = vec3_utils_create();\r\n vec3_utils_set(one, 1, 1, 1);\r\n\r\n function getRotationQuat(matrix: Readonly): Quaternion;\r\n function getRotationQuat(matrix: Readonly, out: T): T;\r\n function getRotationQuat(matrix: Readonly, out: Quaternion | T = QuatUtils.create()): Quaternion | T {\r\n Mat4Utils.getScale(matrix, tempScale);\r\n Vec3Utils.div(one, tempScale, inverseScale);\r\n Mat4Utils.scale(matrix, inverseScale, transformMatrixNoScale);\r\n _customGLMatrixGetRotation(out, transformMatrixNoScale);\r\n return out;\r\n }\r\n\r\n return getRotationQuat;\r\n}();\r\n\r\nexport function getScale(matrix: Readonly): Vector3;\r\nexport function getScale(matrix: Readonly, out: T): T;\r\nexport function getScale(matrix: Readonly, out: Vector3 | T = Vec3Utils.create()): Vector3 | T {\r\n gl_mat4.getScaling(out as unknown as gl_vec3_type, matrix as unknown as gl_mat4_type);\r\n return out;\r\n}\r\n\r\nexport function setPosition(matrix: T, position: Readonly): T {\r\n matrix[12] = position[0];\r\n matrix[13] = position[1];\r\n matrix[14] = position[2];\r\n return matrix;\r\n}\r\n\r\nexport function setRotation(matrix: T, rotation: Readonly): T {\r\n Mat4Utils.setRotationDegrees(matrix, rotation);\r\n return matrix;\r\n}\r\n\r\nexport const setRotationDegrees = function () {\r\n const quat = quat_utils_create();\r\n return function setRotationDegrees(matrix: T, rotation: Readonly): T {\r\n Mat4Utils.setRotationQuat(matrix, Vec3Utils.degreesToQuat(rotation, quat));\r\n return matrix;\r\n };\r\n}();\r\n\r\nexport const setRotationRadians = function () {\r\n const vector = vec3_utils_create();\r\n return function setRotationRadians(matrix: T, rotation: Readonly): T {\r\n Mat4Utils.setRotationDegrees(matrix, Vec3Utils.toDegrees(rotation, vector));\r\n return matrix;\r\n };\r\n}();\r\n\r\nexport const setRotationQuat = function () {\r\n const position = vec3_utils_create();\r\n const scale = vec3_utils_create();\r\n return function setRotationQuat(matrix: T, rotation: Readonly): T {\r\n Mat4Utils.getPosition(matrix, position);\r\n Mat4Utils.getScale(matrix, scale);\r\n Mat4Utils.setPositionRotationQuatScale(matrix, position, rotation, scale);\r\n return matrix;\r\n };\r\n}();\r\n\r\nexport const setScale = function () {\r\n const tempScale = vec3_utils_create();\r\n return function setScale(matrix: T, scale: Readonly): T {\r\n Mat4Utils.getScale(matrix, tempScale);\r\n Vec3Utils.div(scale, tempScale, tempScale);\r\n Mat4Utils.scale(matrix, tempScale, matrix);\r\n return matrix;\r\n };\r\n}();\r\n\r\nexport function setPositionRotationScale(matrix: T, position: Readonly, rotation: Readonly, scale: Readonly): T {\r\n Mat4Utils.setPositionRotationDegreesScale(matrix, position, rotation, scale);\r\n return matrix;\r\n}\r\n\r\nexport const setPositionRotationDegreesScale = function () {\r\n const quat = quat_utils_create();\r\n return function setPositionRotationDegreesScale(matrix: T, position: Readonly, rotation: Readonly, scale: Readonly): T {\r\n Mat4Utils.setPositionRotationQuatScale(matrix, position, Vec3Utils.degreesToQuat(rotation, quat), scale);\r\n return matrix;\r\n };\r\n}();\r\n\r\nexport const setPositionRotationRadiansScale = function () {\r\n const vector = vec3_utils_create();\r\n return function setPositionRotationRadiansScale(matrix: T, position: Readonly, rotation: Readonly, scale: Readonly): T {\r\n Mat4Utils.setPositionRotationDegreesScale(matrix, position, Vec3Utils.toDegrees(rotation, vector), scale);\r\n return matrix;\r\n };\r\n}();\r\n\r\nexport function setPositionRotationQuatScale(matrix: T, position: Readonly, rotation: Readonly, scale: Readonly): T {\r\n gl_mat4.fromRotationTranslationScale(matrix as unknown as gl_mat4_type, rotation as unknown as gl_vec3_type, position as unknown as gl_vec3_type, scale as unknown as gl_vec3_type);\r\n return matrix;\r\n}\r\n\r\nexport function setPositionRotation(matrix: T, position: Readonly, rotation: Readonly): T {\r\n Mat4Utils.setPositionRotationDegrees(matrix, position, rotation);\r\n return matrix;\r\n}\r\n\r\nexport const setPositionRotationDegrees = function () {\r\n const quat = quat_utils_create();\r\n return function setPositionRotationDegrees(matrix: T, position: Readonly, rotation: Readonly): T {\r\n Mat4Utils.setPositionRotationQuat(matrix, position, Vec3Utils.degreesToQuat(rotation, quat));\r\n return matrix;\r\n };\r\n}();\r\n\r\nexport const setPositionRotationRadians = function () {\r\n const vector = vec3_utils_create();\r\n return function setPositionRotationRadians(matrix: T, position: Readonly, rotation: Readonly): T {\r\n Mat4Utils.setPositionRotationDegrees(matrix, position, Vec3Utils.toDegrees(rotation, vector));\r\n return matrix;\r\n };\r\n}();\r\n\r\nexport function setPositionRotationQuat(matrix: T, position: Readonly, rotation: Readonly): T {\r\n gl_mat4.fromRotationTranslation(matrix as unknown as gl_mat4_type, rotation as unknown as gl_vec3_type, position as unknown as gl_vec3_type);\r\n return matrix;\r\n}\r\n\r\nexport function getAxes(matrix: Readonly): [Vector3, Vector3, Vector3];\r\nexport function getAxes(matrix: Readonly, out: [T, U, V]): [T, U, V];\r\nexport function getAxes(matrix: Readonly, out: [Vector3, Vector3, Vector3] | [T, U, V] = [Vec3Utils.create(), Vec3Utils.create(), Vec3Utils.create()]): [Vector3, Vector3, Vector3] | [T, U, V] {\r\n Mat4Utils.getLeft(matrix, out[0]);\r\n Mat4Utils.getUp(matrix, out[1]);\r\n Mat4Utils.getForward(matrix, out[2]);\r\n\r\n return out;\r\n}\r\n\r\nexport function getForward(matrix: Readonly): Vector3;\r\nexport function getForward(matrix: Readonly, out: T): T;\r\nexport function getForward(matrix: Readonly, out: Vector3 | T = Vec3Utils.create()): Vector3 | T {\r\n Vec3Utils.set(out, matrix[8], matrix[9], matrix[10]);\r\n Vec3Utils.normalize(out, out);\r\n return out;\r\n}\r\n\r\nexport function getBackward(matrix: Readonly): Vector3;\r\nexport function getBackward(matrix: Readonly, out: T): T;\r\nexport function getBackward(matrix: Readonly, out?: Vector3 | T): Vector3 | T {\r\n out = Mat4Utils.getForward(matrix, out!);\r\n Vec3Utils.negate(out, out);\r\n return out;\r\n}\r\n\r\nexport function getLeft(matrix: Readonly): Vector3;\r\nexport function getLeft(matrix: Readonly, out: T): T;\r\nexport function getLeft(matrix: Readonly, out: Vector3 | T = Vec3Utils.create()): Vector3 | T {\r\n Vec3Utils.set(out, matrix[0], matrix[1], matrix[2]);\r\n Vec3Utils.normalize(out, out);\r\n return out;\r\n}\r\n\r\nexport function getRight(matrix: Readonly): Vector3;\r\nexport function getRight(matrix: Readonly, out: T): T;\r\nexport function getRight(matrix: Readonly, out?: Vector3 | T): Vector3 | T {\r\n out = Mat4Utils.getLeft(matrix, out!);\r\n Vec3Utils.negate(out, out);\r\n return out;\r\n}\r\n\r\nexport function getUp(matrix: Readonly): Vector3;\r\nexport function getUp(matrix: Readonly, out: T): T;\r\nexport function getUp(matrix: Readonly, out: Vector3 | T = Vec3Utils.create()): Vector3 | T {\r\n Vec3Utils.set(out, matrix[4], matrix[5], matrix[6]);\r\n Vec3Utils.normalize(out, out);\r\n return out;\r\n}\r\n\r\nexport function getDown(matrix: Readonly): Vector3;\r\nexport function getDown(matrix: Readonly, out: T): T;\r\nexport function getDown(matrix: Readonly, out?: Vector3 | T): Vector3 | T {\r\n out = Mat4Utils.getUp(matrix, out!);\r\n Vec3Utils.negate(out, out);\r\n return out;\r\n}\r\n\r\nexport const hasUniformScale = function () {\r\n const scale = vec3_utils_create();\r\n return function hasUniformScale(matrix: Readonly): boolean {\r\n Mat4Utils.getScale(matrix, scale);\r\n return Math.abs(scale[0] - scale[1]) < MathUtils.EPSILON && Math.abs(scale[1] - scale[2]) < MathUtils.EPSILON && Math.abs(scale[0] - scale[2]) < MathUtils.EPSILON;\r\n };\r\n}();\r\n\r\nexport const toWorld = function () {\r\n const convertTransform = create();\r\n const position = vec3_utils_create();\r\n const tempScale = vec3_utils_create();\r\n const inverseScale = vec3_utils_create();\r\n const one = vec3_utils_create();\r\n vec3_utils_set(one, 1, 1, 1);\r\n\r\n function toWorld(matrix: Readonly, parentTransformMatrix: Readonly): T;\r\n function toWorld(matrix: Readonly, parentTransformMatrix: Readonly, out: T): T;\r\n function toWorld(matrix: Readonly, parentTransformMatrix: Readonly, out: T | U = Mat4Utils.clone(matrix)): T | U {\r\n if (Mat4Utils.hasUniformScale(parentTransformMatrix)) {\r\n Mat4Utils.mul(parentTransformMatrix, matrix, out);\r\n } else {\r\n Vec3Utils.set(position, matrix[12], matrix[13], matrix[14]);\r\n Vec3Utils.convertPositionToWorldMatrix(position, parentTransformMatrix, position);\r\n\r\n Mat4Utils.getScale(parentTransformMatrix, tempScale);\r\n Vec3Utils.div(one, tempScale, inverseScale);\r\n Mat4Utils.scale(parentTransformMatrix, inverseScale, convertTransform);\r\n\r\n Mat4Utils.mul(convertTransform, matrix, out);\r\n Mat4Utils.scale(out, tempScale, out);\r\n\r\n out[12] = position[0];\r\n out[13] = position[1];\r\n out[14] = position[2];\r\n out[15] = 1;\r\n }\r\n return out;\r\n }\r\n\r\n return toWorld;\r\n}();\r\n\r\nexport const toLocal = function () {\r\n const convertTransform = create();\r\n const position = vec3_utils_create();\r\n const tempScale = vec3_utils_create();\r\n const inverseScale = vec3_utils_create();\r\n const one = vec3_utils_create();\r\n vec3_utils_set(one, 1, 1, 1);\r\n\r\n function toLocal(matrix: Readonly, parentTransformMatrix: Readonly): T;\r\n function toLocal(matrix: Readonly, parentTransformMatrix: Readonly, out: T): T;\r\n function toLocal(matrix: Readonly, parentTransformMatrix: Readonly, out: T | U = Mat4Utils.clone(matrix)): T | U {\r\n if (Mat4Utils.hasUniformScale(parentTransformMatrix)) {\r\n Mat4Utils.invert(parentTransformMatrix, convertTransform);\r\n Mat4Utils.mul(convertTransform, matrix, out);\r\n } else {\r\n Vec3Utils.set(position, matrix[12], matrix[13], matrix[14]);\r\n Vec3Utils.convertPositionToLocalMatrix(position, parentTransformMatrix, position);\r\n\r\n Mat4Utils.getScale(parentTransformMatrix, tempScale);\r\n Vec3Utils.div(one, tempScale, inverseScale);\r\n Mat4Utils.scale(parentTransformMatrix, inverseScale, convertTransform);\r\n\r\n Mat4Utils.invert(convertTransform, convertTransform);\r\n Mat4Utils.mul(convertTransform, matrix, out);\r\n Mat4Utils.scale(out, inverseScale, out);\r\n\r\n out[12] = position[0];\r\n out[13] = position[1];\r\n out[14] = position[2];\r\n out[15] = 1;\r\n }\r\n return out;\r\n }\r\n\r\n return toLocal;\r\n}();\r\n\r\nexport const toQuat = function () {\r\n const position = vec3_utils_create();\r\n const rotation = quat_utils_create();\r\n\r\n function toQuat(matrix: Readonly): Quaternion2;\r\n function toQuat(matrix: Readonly, out: T): T;\r\n function toQuat(matrix: Readonly, out: Quaternion2 | T = Quat2Utils.create()): Quaternion2 | T {\r\n Mat4Utils.getPosition(matrix, position);\r\n Mat4Utils.getRotationQuat(matrix, rotation);\r\n Quat2Utils.setPositionRotationQuat(out, position, rotation);\r\n return out;\r\n }\r\n\r\n return toQuat;\r\n}();\r\n\r\nexport function fromQuat(quat: Readonly): Matrix4;\r\nexport function fromQuat(quat: Readonly, out: T): T;\r\nexport function fromQuat(quat: Readonly, out: Matrix4 | T = Mat4Utils.create()): Matrix4 | T {\r\n Quat2Utils.toMatrix(quat, out);\r\n return out;\r\n}\r\n\r\n/**\r\n * How to use\r\n * \r\n * By default rotations are in `Degrees` and transforms are `Matrix4` (and not `Quat2`) \r\n * For functions that work with rotations, `Matrix` means `Matrix3` and `Quat` means `Quat` \r\n * For functions that work with transforms, `Matrix` means `Matrix4` and `Quat` means `Quat2`\r\n * \r\n * For rotations u can add a suffix like `Degrees`/`Radians`/`Quat`/`Matrix` to use a specific version, example: \r\n * - `getRotationRadians` \r\n * - `setRotationQuat`\r\n * \r\n * The functions leave u the choice of forwarding an out parameter or just get the return value, example: \r\n * - `let position = Mat4Utils.getPosition(matrix)` \r\n * - `Mat4Utils.getPosition(matrix, position)` \r\n * - the out parameter is always the last one\r\n */\r\nexport const Mat4Utils = {\r\n create,\r\n getAllocationFunction,\r\n setAllocationFunction,\r\n set,\r\n copy,\r\n clone,\r\n equals,\r\n identity,\r\n invert,\r\n mul,\r\n scale,\r\n getPosition,\r\n getRotation,\r\n getRotationDegrees,\r\n getRotationRadians,\r\n getRotationQuat,\r\n getScale,\r\n setPosition,\r\n setRotation,\r\n setRotationDegrees,\r\n setRotationRadians,\r\n setRotationQuat,\r\n setScale,\r\n setPositionRotationScale,\r\n setPositionRotationDegreesScale,\r\n setPositionRotationRadiansScale,\r\n setPositionRotationQuatScale,\r\n setPositionRotation,\r\n setPositionRotationDegrees,\r\n setPositionRotationRadians,\r\n setPositionRotationQuat,\r\n getAxes,\r\n getForward,\r\n getBackward,\r\n getLeft,\r\n getRight,\r\n getUp,\r\n getDown,\r\n hasUniformScale,\r\n toWorld,\r\n toLocal,\r\n toQuat,\r\n fromQuat\r\n} as const;\r\n\r\n\r\n\r\n/** This is used in place of the glMatrix one to avoid the array allocation */\r\nconst _customGLMatrixGetRotation = function () {\r\n const scaling = vec3_utils_create();\r\n return function _customGLMatrixGetRotation(out: Quaternion, mat: Matrix4): Quaternion {\r\n gl_mat4.getScaling(scaling as unknown as gl_vec3_type, mat as unknown as gl_mat4_type);\r\n\r\n const is1 = 1 / scaling[0];\r\n const is2 = 1 / scaling[1];\r\n const is3 = 1 / scaling[2];\r\n\r\n const sm11 = mat[0] * is1;\r\n const sm12 = mat[1] * is2;\r\n const sm13 = mat[2] * is3;\r\n const sm21 = mat[4] * is1;\r\n const sm22 = mat[5] * is2;\r\n const sm23 = mat[6] * is3;\r\n const sm31 = mat[8] * is1;\r\n const sm32 = mat[9] * is2;\r\n const sm33 = mat[10] * is3;\r\n\r\n const trace = sm11 + sm22 + sm33;\r\n\r\n if (trace > 0) {\r\n const s = Math.sqrt(trace + 1.0) * 2;\r\n out[3] = 0.25 * s;\r\n out[0] = (sm23 - sm32) / s;\r\n out[1] = (sm31 - sm13) / s;\r\n out[2] = (sm12 - sm21) / s;\r\n } else if (sm11 > sm22 && sm11 > sm33) {\r\n const s = Math.sqrt(1.0 + sm11 - sm22 - sm33) * 2;\r\n out[3] = (sm23 - sm32) / s;\r\n out[0] = 0.25 * s;\r\n out[1] = (sm12 + sm21) / s;\r\n out[2] = (sm31 + sm13) / s;\r\n } else if (sm22 > sm33) {\r\n const s = Math.sqrt(1.0 + sm22 - sm11 - sm33) * 2;\r\n out[3] = (sm31 - sm13) / s;\r\n out[0] = (sm12 + sm21) / s;\r\n out[1] = 0.25 * s;\r\n out[2] = (sm23 + sm32) / s;\r\n } else {\r\n const s = Math.sqrt(1.0 + sm33 - sm11 - sm22) * 2;\r\n out[3] = (sm12 - sm21) / s;\r\n out[0] = (sm31 + sm13) / s;\r\n out[1] = (sm23 + sm32) / s;\r\n out[2] = 0.25 * s;\r\n }\r\n\r\n return out;\r\n };\r\n}();", "import { mat4 as gl_mat4, quat2 as gl_quat2, type mat4 as gl_mat4_type, type quat2 as gl_quat2_type, type quat as gl_quat_type, type vec3 as gl_vec3_type, type vec4 as gl_vec4_type } from \"gl-matrix\";\r\nimport { Matrix4, Quaternion, Quaternion2, Vector3 } from \"../../../cauldron/type_definitions/array_type_definitions.js\";\r\nimport { EasingFunction, MathUtils } from \"../math_utils.js\";\r\nimport { create as mat3_utils_create } from \"./mat3_utils.js\";\r\nimport { Mat4Utils } from \"./mat4_utils.js\";\r\nimport { QuatUtils, create as quat_utils_create } from \"./quat_utils.js\";\r\nimport { Vec3Utils, create as vec3_utils_create } from \"./vec3_utils.js\";\r\nimport { getQuaternion2AllocationFunction, setQuaternion2AllocationFunction } from \"./vec_allocation_utils.js\";\r\n\r\nexport function create(): Quaternion2;\r\nexport function create(x1: number, y1: number, z1: number, w1: number, x2: number, y2: number, z2: number, w2: number): Quaternion2;\r\nexport function create(x1?: number, y1?: number, z1?: number, w1?: number, x2?: number, y2?: number, z2?: number, w2?: number): Quaternion2 {\r\n const out = getAllocationFunction()();\r\n\r\n if (x1 != null) {\r\n Quat2Utils.set(out, x1, y1!, z1!, w1!, x2!, y2!, z2!, w2!);\r\n }\r\n\r\n return out;\r\n}\r\n\r\nexport function getAllocationFunction(): () => Quaternion2 {\r\n return getQuaternion2AllocationFunction();\r\n}\r\n\r\n/** Specify the function that will be used to allocate the quaternion when calling the {@link create} function */\r\nexport function setAllocationFunction(allocationFunction: () => Quaternion2): void {\r\n setQuaternion2AllocationFunction(allocationFunction);\r\n}\r\n\r\nexport function set(quat: T, x1: number, y1: number, z1: number, w1: number, x2: number, y2: number, z2: number, w2: number): T;\r\nexport function set(quat: T, uniformValue: number): T;\r\nexport function set(quat: T, x1: number, y1?: number, z1?: number, w1?: number, x2?: number, y2?: number, z2?: number, w2?: number): T {\r\n if (y1 == null) {\r\n gl_quat2.set(quat as unknown as gl_quat2_type, x1, x1, x1, x1, x1, x1, x1, x1);\r\n } else {\r\n gl_quat2.set(quat as unknown as gl_quat2_type, x1, y1, z1!, w1!, x2!, y2!, z2!, w2!);\r\n }\r\n\r\n return quat;\r\n}\r\n\r\nexport function copy(from: Readonly, to: T): T {\r\n gl_quat2.copy(to as unknown as gl_quat2_type, from as unknown as gl_quat2_type);\r\n return to;\r\n}\r\n\r\n/** The overload where `T extends Quaternion2` does also get `array` as `Readonly`, but is not marked as such due to \r\n Typescript having issues with inferring the proper type of `T` when `Readonly` is used */\r\nexport function clone(quat: Readonly): T;\r\nexport function clone(quat: Readonly): number[];\r\nexport function clone(quat: T): T;\r\nexport function clone(quat: Readonly): T {\r\n return quat.slice(0) as T;\r\n}\r\n\r\nexport function equals(first: Readonly, second: Readonly, epsilon: number = 0): boolean {\r\n let equals = first.length == second.length;\r\n\r\n if (equals) {\r\n equals &&= (Math.abs(first[0] - second[0]) <= epsilon);\r\n equals &&= (Math.abs(first[1] - second[1]) <= epsilon);\r\n equals &&= (Math.abs(first[2] - second[2]) <= epsilon);\r\n equals &&= (Math.abs(first[3] - second[3]) <= epsilon);\r\n equals &&= (Math.abs(first[4] - second[4]) <= epsilon);\r\n equals &&= (Math.abs(first[5] - second[5]) <= epsilon);\r\n equals &&= (Math.abs(first[6] - second[6]) <= epsilon);\r\n equals &&= (Math.abs(first[7] - second[7]) <= epsilon);\r\n }\r\n\r\n return equals;\r\n}\r\n\r\nexport function isNormalized(quat: Readonly, epsilon: number = MathUtils.EPSILON): boolean {\r\n return Math.abs(Quat2Utils.lengthSquared(quat) - 1) < epsilon;\r\n}\r\n\r\nexport function normalize(quat: Readonly): T;\r\nexport function normalize(quat: Readonly, out: T): T;\r\nexport function normalize(quat: Readonly, out: T | U = Quat2Utils.clone(quat)): T | U {\r\n gl_quat2.normalize(out as unknown as gl_quat2_type, quat as unknown as gl_quat2_type);\r\n return out;\r\n}\r\n\r\nexport function length(quat: Readonly): number {\r\n return gl_quat2.length(quat as unknown as gl_vec4_type);\r\n}\r\n\r\nexport function lengthSquared(quat: Readonly): number {\r\n return gl_quat2.squaredLength(quat as unknown as gl_vec4_type);\r\n}\r\n\r\nexport function identity(quat: T): T {\r\n gl_quat2.identity(quat as unknown as gl_quat2_type);\r\n return quat;\r\n}\r\n\r\nexport function mul(first: Readonly, second: Readonly): T;\r\nexport function mul(first: Readonly, second: Readonly, out: T): T;\r\nexport function mul(first: Readonly, second: Readonly, out: T | U = Quat2Utils.clone(first)): T | U {\r\n gl_quat2.mul(out as unknown as gl_quat2_type, first as unknown as gl_quat2_type, second as unknown as gl_quat2_type);\r\n return out;\r\n}\r\n\r\nexport function invert(quat: Readonly): T;\r\nexport function invert(quat: Readonly, out: T): T;\r\nexport function invert(quat: Readonly, out: T | U = Quat2Utils.clone(quat)): T | U {\r\n gl_quat2.invert(out as unknown as gl_quat2_type, quat as unknown as gl_quat2_type);\r\n return out;\r\n}\r\n\r\nexport function conjugate(quat: Readonly): T;\r\nexport function conjugate(quat: Readonly, out: T): T;\r\nexport function conjugate(quat: Readonly, out: T | U = Quat2Utils.clone(quat)): T | U {\r\n gl_quat2.conjugate(out as unknown as gl_quat2_type, quat as unknown as gl_quat2_type);\r\n return out;\r\n}\r\n\r\nexport function lerp(from: Readonly, to: Readonly, interpolationFactor: number): T;\r\nexport function lerp(from: Readonly, to: Readonly, interpolationFactor: number, out: T): T;\r\nexport function lerp(from: Readonly, to: Readonly, interpolationFactor: number, out: T | U = Quat2Utils.clone(from)): T | U {\r\n if (interpolationFactor <= 0) {\r\n Quat2Utils.copy(from, out);\r\n return out;\r\n } else if (interpolationFactor >= 1) {\r\n Quat2Utils.copy(to, out);\r\n return out;\r\n }\r\n\r\n gl_quat2.lerp(out as unknown as gl_quat2_type, from as unknown as gl_quat2_type, to as unknown as gl_quat2_type, interpolationFactor);\r\n return out;\r\n}\r\n\r\nexport function interpolate(from: Readonly, to: Readonly, interpolationFactor: number, easingFunction?: EasingFunction): T;\r\nexport function interpolate(from: Readonly, to: Readonly, interpolationFactor: number, easingFunction: EasingFunction, out: T): T;\r\nexport function interpolate(from: Readonly, to: Readonly, interpolationFactor: number, easingFunction: EasingFunction = EasingFunction.linear, out: T | U = Quat2Utils.clone(from)): T | U {\r\n const lerpFactor = easingFunction(interpolationFactor);\r\n return Quat2Utils.lerp(from, to, lerpFactor, out);\r\n}\r\n\r\nexport const slerp = function () {\r\n const fromPosition = vec3_utils_create();\r\n const toPosition = vec3_utils_create();\r\n const interpolatedPosition = vec3_utils_create();\r\n const fromRotationQuat = quat_utils_create();\r\n const toRotationQuat = quat_utils_create();\r\n const interpolatedRotationQuat = quat_utils_create();\r\n\r\n function slerp(from: Readonly, to: Readonly, interpolationFactor: number): T;\r\n function slerp(from: Readonly, to: Readonly, interpolationFactor: number, out: T): T;\r\n function slerp(from: Readonly, to: Readonly, interpolationFactor: number, out: T | U = Quat2Utils.clone(from)): T | U {\r\n if (interpolationFactor <= 0) {\r\n Quat2Utils.copy(from, out);\r\n return out;\r\n } else if (interpolationFactor >= 1) {\r\n Quat2Utils.copy(to, out);\r\n return out;\r\n }\r\n\r\n Quat2Utils.getPosition(from, fromPosition);\r\n Quat2Utils.getPosition(to, toPosition);\r\n\r\n Quat2Utils.getRotationQuat(from, fromRotationQuat);\r\n Quat2Utils.getRotationQuat(to, toRotationQuat);\r\n\r\n Vec3Utils.lerp(fromPosition, toPosition, interpolationFactor, interpolatedPosition);\r\n QuatUtils.slerp(fromRotationQuat, toRotationQuat, interpolationFactor, interpolatedRotationQuat);\r\n\r\n Quat2Utils.setPositionRotationQuat(out, interpolatedPosition, interpolatedRotationQuat);\r\n return out;\r\n }\r\n\r\n return slerp;\r\n}();\r\n\r\nexport function interpolateSpherical(from: Readonly, to: Readonly, interpolationFactor: number, easingFunction?: EasingFunction): T;\r\nexport function interpolateSpherical(from: Readonly, to: Readonly, interpolationFactor: number, easingFunction: EasingFunction, out: T): T;\r\nexport function interpolateSpherical(from: Readonly, to: Readonly, interpolationFactor: number, easingFunction: EasingFunction = EasingFunction.linear, out: T | U = Quat2Utils.clone(from)): T | U {\r\n const lerpFactor = easingFunction(interpolationFactor);\r\n return Quat2Utils.slerp(from, to, lerpFactor, out);\r\n}\r\n\r\nexport function getPosition(quat: Readonly): Vector3;\r\nexport function getPosition(quat: Readonly, out: T): T;\r\nexport function getPosition(quat: Readonly, out: Vector3 | T = Vec3Utils.create()): Vector3 | T {\r\n gl_quat2.getTranslation(out as unknown as gl_vec3_type, quat as unknown as gl_quat2_type);\r\n return out;\r\n}\r\n\r\nexport function getRotation(quat: Readonly): Vector3;\r\nexport function getRotation(quat: Readonly, out: T): T;\r\nexport function getRotation(quat: Readonly, out?: Vector3 | T): Vector3 | T {\r\n return Quat2Utils.getRotationDegrees(quat, out!);\r\n}\r\n\r\nexport const getRotationDegrees = function () {\r\n const rotationQuat = quat_utils_create();\r\n\r\n function getRotationDegrees(quat: Readonly): Vector3;\r\n function getRotationDegrees(quat: Readonly, out: T): T;\r\n function getRotationDegrees(quat: Readonly, out: Vector3 | T = Vec3Utils.create()): Vector3 | T {\r\n QuatUtils.toDegrees(Quat2Utils.getRotationQuat(quat, rotationQuat), out);\r\n return out;\r\n }\r\n\r\n return getRotationDegrees;\r\n}();\r\n\r\nexport const getRotationRadians = function () {\r\n const rotationQuat = quat_utils_create();\r\n\r\n function getRotationRadians(quat: Readonly): Vector3;\r\n function getRotationRadians(quat: Readonly, out: T): T;\r\n function getRotationRadians(quat: Readonly, out: Vector3 | T = Vec3Utils.create()): Vector3 | T {\r\n QuatUtils.toRadians(Quat2Utils.getRotationQuat(quat, rotationQuat), out);\r\n return out;\r\n }\r\n\r\n return getRotationRadians;\r\n}();\r\n\r\nexport function getRotationQuat(quat: Readonly): Quaternion;\r\nexport function getRotationQuat(quat: Readonly, out: T): T;\r\nexport function getRotationQuat(quat: Readonly, out: Quaternion | T = QuatUtils.create()): Quaternion | T {\r\n QuatUtils.copy(quat, out);\r\n return out;\r\n}\r\n\r\nexport const setPosition = function () {\r\n const rotationQuat = quat_utils_create();\r\n return function setPosition(quat: T, position: Readonly): T {\r\n Quat2Utils.getRotationQuat(quat, rotationQuat);\r\n Quat2Utils.setPositionRotationQuat(quat, position, rotationQuat);\r\n return quat;\r\n };\r\n}();\r\n\r\nexport function setRotation(quat: T, rotation: Readonly): T {\r\n return Quat2Utils.setRotationDegrees(quat, rotation);\r\n}\r\n\r\nexport const setRotationDegrees = function () {\r\n const position = vec3_utils_create();\r\n return function setRotationDegrees(quat: T, rotation: Readonly): T {\r\n Quat2Utils.getPosition(quat, position);\r\n Quat2Utils.setPositionRotationDegrees(quat, position, rotation);\r\n return quat;\r\n };\r\n}();\r\n\r\nexport const setRotationRadians = function () {\r\n const position = vec3_utils_create();\r\n return function setRotationRadians(quat: T, rotation: Readonly): T {\r\n Quat2Utils.getPosition(quat, position);\r\n Quat2Utils.setPositionRotationRadians(quat, position, rotation);\r\n return quat;\r\n };\r\n}();\r\n\r\nexport const setRotationQuat = function () {\r\n const position = vec3_utils_create();\r\n return function setRotationQuat(quat: T, rotation: Readonly): T {\r\n Quat2Utils.getPosition(quat, position);\r\n Quat2Utils.setPositionRotationQuat(quat, position, rotation);\r\n return quat;\r\n };\r\n}();\r\n\r\n\r\nexport function setPositionRotation(quat: T, position: Readonly, rotation: Readonly): T {\r\n return Quat2Utils.setPositionRotationDegrees(quat, position, rotation);\r\n}\r\n\r\nexport const setPositionRotationDegrees = function () {\r\n const rotationQuat = quat_utils_create();\r\n return function setPositionRotationDegrees(quat: T, position: Readonly, rotation: Readonly): T {\r\n Vec3Utils.degreesToQuat(rotation, rotationQuat);\r\n Quat2Utils.setPositionRotationQuat(quat, position, rotationQuat);\r\n\r\n return quat;\r\n };\r\n}();\r\n\r\nexport const setPositionRotationRadians = function () {\r\n const rotationQuat = quat_utils_create();\r\n return function setPositionRotationRadians(quat: T, position: Readonly, rotation: Readonly): T {\r\n Vec3Utils.radiansToQuat(rotation, rotationQuat);\r\n Quat2Utils.setPositionRotationQuat(quat, position, rotationQuat);\r\n return quat;\r\n };\r\n}();\r\n\r\nexport function setPositionRotationQuat(quat: T, position: Readonly, rotation: Readonly): T {\r\n gl_quat2.fromRotationTranslation(quat, rotation as unknown as gl_quat_type, position as unknown as gl_vec3_type);\r\n return quat;\r\n}\r\n\r\nexport function getAxes(quat: Readonly): [Vector3, Vector3, Vector3];\r\nexport function getAxes(quat: Readonly, out: [T, U, V]): [T, U, V];\r\nexport function getAxes(quat: Readonly, out: [Vector3, Vector3, Vector3] | [T, U, V] = [Vec3Utils.create(), Vec3Utils.create(), Vec3Utils.create()]): [Vector3, Vector3, Vector3] | [T, U, V] {\r\n Quat2Utils.getLeft(quat, out[0]);\r\n Quat2Utils.getUp(quat, out[1]);\r\n Quat2Utils.getForward(quat, out[2]);\r\n return out;\r\n}\r\n\r\nexport const getForward = function () {\r\n const rotationMatrix = mat3_utils_create();\r\n\r\n function getForward(quat: Readonly): Vector3;\r\n function getForward(quat: Readonly, out: T): T;\r\n function getForward(quat: Readonly, out: Vector3 | T = Vec3Utils.create()): Vector3 | T {\r\n QuatUtils.toMatrix(quat, rotationMatrix);\r\n\r\n Vec3Utils.set(out, rotationMatrix[6], rotationMatrix[7], rotationMatrix[8]);\r\n\r\n return out;\r\n }\r\n\r\n return getForward;\r\n}();\r\n\r\nexport function getBackward(quat: Readonly): Vector3;\r\nexport function getBackward(quat: Readonly, out: T): T;\r\nexport function getBackward(quat: Readonly, out?: Vector3 | T): Vector3 | T {\r\n out = Quat2Utils.getForward(quat, out!);\r\n Vec3Utils.negate(out, out);\r\n return out;\r\n}\r\n\r\nexport const getLeft = function () {\r\n const rotationMatrix = mat3_utils_create();\r\n\r\n function getLeft(quat: Readonly): Vector3;\r\n function getLeft(quat: Readonly, out: T): T;\r\n function getLeft(quat: Readonly, out: Vector3 | T = Vec3Utils.create()): Vector3 | T {\r\n QuatUtils.toMatrix(quat, rotationMatrix);\r\n\r\n Vec3Utils.set(out, rotationMatrix[0], rotationMatrix[1], rotationMatrix[2]);\r\n\r\n return out;\r\n }\r\n\r\n return getLeft;\r\n}();\r\n\r\nexport function getRight(quat: Readonly): Vector3;\r\nexport function getRight(quat: Readonly, out: T): T;\r\nexport function getRight(quat: Readonly, out?: Vector3 | T): Vector3 | T {\r\n out = Quat2Utils.getLeft(quat, out!);\r\n Vec3Utils.negate(out, out);\r\n return out;\r\n}\r\n\r\nexport const getUp = function () {\r\n const rotationMatrix = mat3_utils_create();\r\n\r\n function getUp(quat: Readonly): Vector3;\r\n function getUp(quat: Readonly, out: T): T;\r\n function getUp(quat: Readonly, out: Vector3 | T = Vec3Utils.create()): Vector3 | T {\r\n QuatUtils.toMatrix(quat, rotationMatrix);\r\n\r\n Vec3Utils.set(out, rotationMatrix[3], rotationMatrix[4], rotationMatrix[5]);\r\n\r\n return out;\r\n }\r\n\r\n return getUp;\r\n}();\r\n\r\nexport function getDown(quat: Readonly): Vector3;\r\nexport function getDown(quat: Readonly, out: T): T;\r\nexport function getDown(quat: Readonly, out?: Vector3 | T): Vector3 | T {\r\n out = Quat2Utils.getUp(quat, out!);\r\n Vec3Utils.negate(out, out);\r\n return out;\r\n}\r\n\r\nexport function rotateAxis(quat: Readonly, angle: number, axis: Readonly): T;\r\nexport function rotateAxis(quat: Readonly, angle: number, axis: Readonly, out: T): T;\r\nexport function rotateAxis(quat: Readonly, angle: number, axis: Readonly, out?: T | U): T | U {\r\n return Quat2Utils.rotateAxisDegrees(quat, angle, axis, out!);\r\n}\r\n\r\nexport function rotateAxisDegrees(quat: Readonly, angle: number, axis: Readonly): T;\r\nexport function rotateAxisDegrees(quat: Readonly, angle: number, axis: Readonly, out: T): T;\r\nexport function rotateAxisDegrees(quat: Readonly, angle: number, axis: Readonly, out: T | U = Quat2Utils.clone(quat)): T | U {\r\n return Quat2Utils.rotateAxisRadians(quat, MathUtils.toRadians(angle), axis, out);\r\n}\r\n\r\nexport const rotateAxisRadians = function () {\r\n const rotationQuat = quat_utils_create();\r\n\r\n function rotateAxisRadians(quat: Readonly, angle: number, axis: Readonly): T;\r\n function rotateAxisRadians(quat: Readonly, angle: number, axis: Readonly, out: T): T;\r\n function rotateAxisRadians(quat: Readonly, angle: number, axis: Readonly, out: T | U = Quat2Utils.clone(quat)): T | U {\r\n Quat2Utils.getRotationQuat(quat, rotationQuat);\r\n QuatUtils.rotateAxisRadians(rotationQuat, angle, axis, rotationQuat);\r\n Quat2Utils.copy(quat, out);\r\n Quat2Utils.setRotationQuat(out, rotationQuat);\r\n return out;\r\n }\r\n\r\n return rotateAxisRadians;\r\n}();\r\n\r\n\r\nexport function toWorld(quat: Readonly, parentTransformQuat: Readonly): T;\r\nexport function toWorld(quat: Readonly, parentTransformQuat: Readonly, out: T): T;\r\nexport function toWorld(quat: Readonly, parentTransformQuat: Readonly, out: T | U = Quat2Utils.clone(quat)): T | U {\r\n Quat2Utils.mul(parentTransformQuat, quat, out);\r\n return out;\r\n}\r\n\r\nexport const toLocal = function () {\r\n const invertQuat = create();\r\n\r\n function toLocal(quat: Readonly, parentTransformQuat: Readonly): T;\r\n function toLocal(quat: Readonly, parentTransformQuat: Readonly, out: T): T;\r\n function toLocal(quat: Readonly, parentTransformQuat: Readonly, out: T | U = Quat2Utils.clone(quat)): T | U {\r\n Quat2Utils.conjugate(parentTransformQuat, invertQuat);\r\n Quat2Utils.mul(invertQuat, quat, out);\r\n return out;\r\n }\r\n\r\n return toLocal;\r\n}();\r\n\r\nexport function toMatrix(quat: Readonly): Matrix4;\r\nexport function toMatrix(quat: Readonly, out: T): T;\r\nexport function toMatrix(quat: Readonly, out: Matrix4 | T = Mat4Utils.create()): Matrix4 | T {\r\n _customGLMatrixFromQuat2(out, quat);\r\n return out;\r\n}\r\n\r\nexport function fromMatrix(matrix: Readonly): Quaternion2;\r\nexport function fromMatrix(matrix: Readonly, out: T): T;\r\nexport function fromMatrix(matrix: Readonly, out: Quaternion2 | T = Quat2Utils.create()): Quaternion2 | T {\r\n Mat4Utils.toQuat(matrix, out);\r\n return out;\r\n}\r\n\r\n/**\r\n * How to use\r\n * \r\n * By default rotations are in `Degrees` and transforms are `Matrix4` (and not `Quat2`) \r\n * For functions that work with rotations, `Matrix` means `Matrix3` and `Quat` means `Quat` \r\n * For functions that work with transforms, `Matrix` means `Matrix4` and `Quat` means `Quat2`\r\n * \r\n * For rotations u can add a suffix like `Degrees`/`Radians`/`Quat`/`Matrix` to use a specific version, example: \r\n * - `getRotationRadians` \r\n * - `setRotationQuat`\r\n * \r\n * The functions leave u the choice of forwarding an out parameter or just get the return value, example: \r\n * - `let position = Quat2Utils.getPosition(quat)` \r\n * - `Quat2Utils.getPosition(quat, position)` \r\n * - the out parameter is always the last one\r\n */\r\nexport const Quat2Utils = {\r\n create,\r\n getAllocationFunction,\r\n setAllocationFunction,\r\n set,\r\n copy,\r\n clone,\r\n equals,\r\n isNormalized,\r\n normalize,\r\n length,\r\n lengthSquared,\r\n identity,\r\n mul,\r\n invert,\r\n conjugate,\r\n lerp,\r\n interpolate,\r\n slerp,\r\n interpolateSpherical,\r\n getPosition,\r\n getRotation,\r\n getRotationDegrees,\r\n getRotationRadians,\r\n getRotationQuat,\r\n setPosition,\r\n setRotation,\r\n setRotationDegrees,\r\n setRotationRadians,\r\n setRotationQuat,\r\n setPositionRotation,\r\n setPositionRotationDegrees,\r\n setPositionRotationRadians,\r\n setPositionRotationQuat,\r\n getAxes,\r\n getForward,\r\n getBackward,\r\n getLeft,\r\n getRight,\r\n getUp,\r\n getDown,\r\n rotateAxis,\r\n rotateAxisDegrees,\r\n rotateAxisRadians,\r\n toWorld,\r\n toLocal,\r\n toMatrix,\r\n fromMatrix\r\n} as const;\r\n\r\n\r\n/** This is used in place of the glMatrix one to avoid the array allocation */\r\nconst _customGLMatrixFromQuat2 = function () {\r\n const translation = vec3_utils_create();\r\n return function _customGLMatrixFromQuat2(out: Matrix4, quat: Readonly): Matrix4 {\r\n const bx = -quat[0],\r\n by = -quat[1],\r\n bz = -quat[2],\r\n bw = quat[3],\r\n ax = quat[4],\r\n ay = quat[5],\r\n az = quat[6],\r\n aw = quat[7];\r\n\r\n const magnitude = bx * bx + by * by + bz * bz + bw * bw;\r\n\r\n //Only scale if it makes sense\r\n if (magnitude > 0) {\r\n translation[0] = ((ax * bw + aw * bx + ay * bz - az * by) * 2) / magnitude;\r\n translation[1] = ((ay * bw + aw * by + az * bx - ax * bz) * 2) / magnitude;\r\n translation[2] = ((az * bw + aw * bz + ax * by - ay * bx) * 2) / magnitude;\r\n } else {\r\n translation[0] = (ax * bw + aw * bx + ay * bz - az * by) * 2;\r\n translation[1] = (ay * bw + aw * by + az * bx - ax * bz) * 2;\r\n translation[2] = (az * bw + aw * bz + ax * by - ay * bx) * 2;\r\n }\r\n\r\n gl_mat4.fromRotationTranslation(out as unknown as gl_mat4_type, quat, translation as unknown as gl_vec3_type);\r\n\r\n return out;\r\n };\r\n}();", "import { mat3 as gl_mat3, mat4 as gl_mat4, quat as gl_quat, quat2 as gl_quat2, vec2 as gl_vec2, vec3 as gl_vec3, vec4 as gl_vec4, glMatrix } from \"gl-matrix\";\r\nimport { Matrix3, Matrix4, Quaternion, Quaternion2, Vector, Vector2, Vector3, Vector4 } from \"../../type_definitions/array_type_definitions.js\";\r\n\r\nexport let _myVectorAllocationFunction: (length: number) => Vector = () => { return new glMatrix.ARRAY_TYPE(length); };\r\n\r\nexport function setVectorAllocationFunction(allocationFunction: (length: number) => Vector): void {\r\n _myVectorAllocationFunction = allocationFunction;\r\n}\r\n\r\nexport function getVectorAllocationFunction(): (length: number) => Vector {\r\n return _myVectorAllocationFunction;\r\n}\r\n\r\n\r\n\r\nexport let _myVector2AllocationFunction: () => Vector2 = gl_vec2.create;\r\n\r\nexport function setVector2AllocationFunction(allocationFunction: () => Vector2): void {\r\n _myVector2AllocationFunction = allocationFunction;\r\n}\r\n\r\nexport function getVector2AllocationFunction(): () => Vector2 {\r\n return _myVector2AllocationFunction;\r\n}\r\n\r\n\r\n\r\nexport let _myVector3AllocationFunction: () => Vector3 = gl_vec3.create;\r\n\r\nexport function setVector3AllocationFunction(allocationFunction: () => Vector3): void {\r\n _myVector3AllocationFunction = allocationFunction;\r\n}\r\n\r\nexport function getVector3AllocationFunction(): () => Vector3 {\r\n return _myVector3AllocationFunction;\r\n}\r\n\r\n\r\n\r\nexport let _myVector4AllocationFunction: () => Vector4 = gl_vec4.create;\r\n\r\nexport function setVector4AllocationFunction(allocationFunction: () => Vector4): void {\r\n _myVector4AllocationFunction = allocationFunction;\r\n}\r\n\r\nexport function getVector4AllocationFunction(): () => Vector4 {\r\n return _myVector4AllocationFunction;\r\n}\r\n\r\n\r\n\r\nexport let _myQuaternionAllocationFunction: () => Quaternion = gl_quat.create;\r\n\r\nexport function setQuaternionAllocationFunction(allocationFunction: () => Quaternion): void {\r\n _myQuaternionAllocationFunction = allocationFunction;\r\n}\r\n\r\nexport function getQuaternionAllocationFunction(): () => Quaternion {\r\n return _myQuaternionAllocationFunction;\r\n}\r\n\r\n\r\n\r\nexport let _myQuaternion2AllocationFunction: () => Quaternion2 = gl_quat2.create;\r\n\r\nexport function setQuaternion2AllocationFunction(allocationFunction: () => Quaternion2): void {\r\n _myQuaternion2AllocationFunction = allocationFunction;\r\n}\r\n\r\nexport function getQuaternion2AllocationFunction(): () => Quaternion2 {\r\n return _myQuaternion2AllocationFunction;\r\n}\r\n\r\n\r\n\r\nexport let _myMatrix3AllocationFunction: () => Matrix3 = gl_mat3.create;\r\n\r\nexport function setMatrix3AllocationFunction(allocationFunction: () => Matrix3): void {\r\n _myMatrix3AllocationFunction = allocationFunction;\r\n}\r\n\r\nexport function getMatrix3AllocationFunction(): () => Matrix3 {\r\n return _myMatrix3AllocationFunction;\r\n}\r\n\r\n\r\n\r\nexport let _myMatrix4AllocationFunction: () => Matrix4 = gl_mat4.create;\r\n\r\nexport function setMatrix4AllocationFunction(allocationFunction: () => Matrix4): void {\r\n _myMatrix4AllocationFunction = allocationFunction;\r\n}\r\n\r\nexport function getMatrix4AllocationFunction(): () => Matrix4 {\r\n return _myMatrix4AllocationFunction;\r\n}\r\n\r\n\r\n\r\nexport const VecAllocationUtils = {\r\n setVectorAllocationFunction,\r\n getVectorAllocationFunction,\r\n setVector2AllocationFunction,\r\n getVector2AllocationFunction,\r\n setVector3AllocationFunction,\r\n getVector3AllocationFunction,\r\n setVector4AllocationFunction,\r\n getVector4AllocationFunction,\r\n setQuaternionAllocationFunction,\r\n getQuaternionAllocationFunction,\r\n setQuaternion2AllocationFunction,\r\n getQuaternion2AllocationFunction,\r\n setMatrix3AllocationFunction,\r\n getMatrix3AllocationFunction,\r\n setMatrix4AllocationFunction,\r\n getMatrix4AllocationFunction\r\n} as const;", "import { Component, Object3D, Scene, WonderlandEngine, type ComponentConstructor } from \"@wonderlandengine/api\";\r\nimport { Globals } from \"../../../pp/globals.js\";\r\nimport { Matrix3, Matrix4, Quaternion, Quaternion2, Vector3 } from \"../../type_definitions/array_type_definitions.js\";\r\nimport { Mat3Utils } from \"../../utils/array/mat3_utils.js\";\r\nimport { Mat4Utils } from \"../../utils/array/mat4_utils.js\";\r\nimport { Quat2Utils } from \"../../utils/array/quat2_utils.js\";\r\nimport { QuatUtils } from \"../../utils/array/quat_utils.js\";\r\nimport { Vec3Utils } from \"../../utils/array/vec3_utils.js\";\r\nimport { MathUtils } from \"../../utils/math_utils.js\";\r\nimport { ComponentCustomCloneParams, ComponentDeepCloneParams, ComponentUtils } from \"./component_utils.js\";\r\n\r\nexport class ObjectCloneParams {\r\n\r\n /** Defaults to the object to clone parent, null can be used to specify u want the scene root as the parent */\r\n public myCloneParent: Object3D | null | undefined = undefined;\r\n\r\n\r\n /** Ignores components that are not clonable */\r\n public myIgnoreNonCloneable: boolean = false;\r\n /** All components are ignored, cloning only the object hierarchy */\r\n public myIgnoreComponents: boolean = false;\r\n /** Clones only the given object without the descendants */\r\n public myIgnoreDescendants: boolean = false;\r\n\r\n\r\n /** Ignores all component types in this list (example: `[\"mesh\"]`), has lower priority over `myComponentsToInclude` */\r\n public myComponentsToIgnore: string[] = [];\r\n /** Clones only the component types in this list (example: `[\"mesh\"]`), has higher priority over `myComponentsToIgnore`, if empty it's ignored */\r\n public myComponentsToInclude: string[] = [];\r\n /** Returns true if the component must be ignored. It's called after the previous filters */\r\n public myIgnoreComponentCallback: ((component: Component) => boolean) | null = null;\r\n\r\n\r\n /** Ignores all the objects in this list, has lower priority over `myDescendantsToInclude` */\r\n public myDescendantsToIgnore: Object3D[] = [];\r\n /** Clones only the objects in this list, has higher priority over `myDescendantsToIgnore`, if empty it's ignored */\r\n public myDescendantsToInclude: Object3D[] = [];\r\n /** Returns true if the object must be ignored. It's called after the previous filters */\r\n public myIgnoreDescendantCallback: ((component: Object3D) => boolean) | null = null;\r\n\r\n\r\n /** Uses the default component clone function */\r\n public myUseDefaultComponentClone: boolean = false;\r\n /** Uses the default component clone function only as fallback, that is if there is no custom component clone */\r\n public myUseDefaultComponentCloneAsFallback: boolean = false;\r\n /** Automatically starts the component even if it's cloned not activated, keeping it not active. This also triggers `onActivate` and `onDeactivate` once */\r\n public myDefaultComponentCloneAutoStartIfNotActive: boolean = true;\r\n\r\n\r\n /** Uses the default object clone function, ignoring all the other clone settings but `myCloneParent` and `myDefaultComponentCloneAutoStartIfNotActive` */\r\n public myUseDefaultObjectClone: boolean = false;\r\n /** Uses the default object clone function only as fallback, that is if the object is not PP cloneable */\r\n public myUseDefaultObjectCloneAsFallback: boolean = false;\r\n\r\n\r\n /** Used to specify if the object components must be deep cloned or not, you can also override the behavior for specific components and variables */\r\n public myComponentDeepCloneParams: ComponentDeepCloneParams = new ComponentDeepCloneParams();\r\n\r\n\r\n /** This class can be filled with whatever custom paramater the component clone functions could need */\r\n public myComponentCustomCloneParams: ComponentCustomCloneParams = new ComponentCustomCloneParams();\r\n}\r\n\r\n// GETTER\r\n\r\n// Position\r\n\r\nexport function getPosition(object: Readonly): Vector3;\r\nexport function getPosition(object: Readonly, outPosition: T): T;\r\nexport function getPosition(object: Readonly, outPosition?: T): T {\r\n return ObjectUtils.getPositionWorld(object, outPosition!);\r\n}\r\n\r\nexport function getPositionWorld(object: Readonly): Vector3;\r\nexport function getPositionWorld(object: Readonly, outPosition: T): T;\r\nexport function getPositionWorld(object: Readonly, outPosition: Vector3 | T = Vec3Utils.create()): Vector3 | T {\r\n object.getPositionWorld(outPosition);\r\n return outPosition;\r\n}\r\n\r\nexport function getPositionLocal(object: Readonly): Matrix3;\r\nexport function getPositionLocal(object: Readonly, outPosition: T): T;\r\nexport function getPositionLocal(object: Readonly, outPosition: Vector3 | T = Vec3Utils.create()): Vector3 | T {\r\n object.getPositionLocal(outPosition);\r\n return outPosition;\r\n}\r\n\r\n// Rotation\r\n\r\nexport function getRotation(object: Readonly): Vector3;\r\nexport function getRotation(object: Readonly, outRotation: T): T;\r\nexport function getRotation(object: Readonly, outRotation?: T): T {\r\n return ObjectUtils.getRotationWorld(object, outRotation!);\r\n}\r\n\r\nexport function getRotationDegrees(object: Readonly): Vector3;\r\nexport function getRotationDegrees(object: Readonly, outRotation: T): T;\r\nexport function getRotationDegrees(object: Readonly, outRotation?: T): T {\r\n return ObjectUtils.getRotationWorldDegrees(object, outRotation!);\r\n}\r\n\r\nexport function getRotationRadians(object: Readonly): Vector3;\r\nexport function getRotationRadians(object: Readonly, outRotation: T): T;\r\nexport function getRotationRadians(object: Readonly, outRotation?: T): T {\r\n return ObjectUtils.getRotationWorldRadians(object, outRotation!);\r\n}\r\n\r\nexport function getRotationMatrix(object: Readonly): Matrix3;\r\nexport function getRotationMatrix(object: Readonly, outRotation: T): T;\r\nexport function getRotationMatrix(object: Readonly, outRotation?: Matrix3 | T): Matrix3 | T {\r\n return ObjectUtils.getRotationWorldMatrix(object, outRotation!);\r\n}\r\n\r\nexport function getRotationQuat(object: Readonly): Quaternion;\r\nexport function getRotationQuat(object: Readonly, outRotation: T): T;\r\nexport function getRotationQuat(object: Readonly, outRotation?: Quaternion | T): Quaternion | T {\r\n return ObjectUtils.getRotationWorldQuat(object, outRotation!);\r\n}\r\n\r\n// Rotation World\r\n\r\nexport function getRotationWorld(object: Readonly): Vector3;\r\nexport function getRotationWorld(object: Readonly, outRotation: T): T;\r\nexport function getRotationWorld(object: Readonly, outRotation?: T): T {\r\n return ObjectUtils.getRotationWorldDegrees(object, outRotation!);\r\n}\r\n\r\nexport function getRotationWorldDegrees(object: Readonly): Vector3;\r\nexport function getRotationWorldDegrees(object: Readonly, outRotation: T): T;\r\nexport function getRotationWorldDegrees(object: Readonly, outRotation?: T): T {\r\n outRotation = ObjectUtils.getRotationWorldRadians(object, outRotation!);\r\n Vec3Utils.toDegrees(outRotation, outRotation);\r\n return outRotation!;\r\n}\r\n\r\nexport const getRotationWorldRadians = function () {\r\n const quat = QuatUtils.create();\r\n\r\n function getRotationWorldRadians(object: Readonly): Vector3;\r\n function getRotationWorldRadians(object: Readonly, outRotation: T): T;\r\n function getRotationWorldRadians(object: Readonly, outRotation: Vector3 | T = Vec3Utils.create()): Vector3 | T {\r\n ObjectUtils.getRotationWorldQuat(object, quat);\r\n QuatUtils.toRadians(quat, outRotation);\r\n return outRotation;\r\n }\r\n\r\n return getRotationWorldRadians;\r\n}();\r\n\r\nexport const getRotationWorldMatrix = function () {\r\n const quat = QuatUtils.create();\r\n\r\n function getRotationWorldMatrix(object: Readonly): Matrix3;\r\n function getRotationWorldMatrix(object: Readonly, outRotation: T): T;\r\n function getRotationWorldMatrix(object: Readonly, outRotation: Matrix3 | T = Mat3Utils.create()): Matrix3 | T {\r\n ObjectUtils.getRotationWorldQuat(object, quat);\r\n QuatUtils.toMatrix(quat, outRotation);\r\n return outRotation;\r\n }\r\n\r\n return getRotationWorldMatrix;\r\n}();\r\n\r\nexport function getRotationWorldQuat(object: Readonly): Quaternion;\r\nexport function getRotationWorldQuat(object: Readonly, outRotation: T): T;\r\nexport function getRotationWorldQuat(object: Readonly, outRotation: Quaternion | T = QuatUtils.create()): Quaternion | T {\r\n object.getRotationWorld(outRotation);\r\n return outRotation;\r\n}\r\n\r\n// Rotation Local\r\n\r\nexport function getRotationLocal(object: Readonly): Vector3;\r\nexport function getRotationLocal(object: Readonly, outRotation: T): T;\r\nexport function getRotationLocal(object: Readonly, outRotation?: T): T {\r\n return ObjectUtils.getRotationLocalDegrees(object, outRotation!);\r\n}\r\n\r\nexport function getRotationLocalDegrees(object: Readonly): Vector3;\r\nexport function getRotationLocalDegrees(object: Readonly, outRotation: T): T;\r\nexport function getRotationLocalDegrees(object: Readonly, outRotation?: T): T {\r\n outRotation = ObjectUtils.getRotationLocalRadians(object, outRotation!);\r\n Vec3Utils.toDegrees(outRotation, outRotation);\r\n return outRotation!;\r\n}\r\n\r\nexport const getRotationLocalRadians = function () {\r\n const quat = QuatUtils.create();\r\n\r\n function getRotationLocalRadians(object: Readonly): Vector3;\r\n function getRotationLocalRadians(object: Readonly, outRotation: T): T;\r\n function getRotationLocalRadians(object: Readonly, outRotation: Vector3 | T = Vec3Utils.create()): Vector3 | T {\r\n ObjectUtils.getRotationLocalQuat(object, quat);\r\n QuatUtils.toRadians(quat, outRotation);\r\n return outRotation;\r\n }\r\n\r\n return getRotationLocalRadians;\r\n}();\r\n\r\nexport const getRotationLocalMatrix = function () {\r\n const quat = QuatUtils.create();\r\n\r\n function getRotationLocalMatrix(object: Readonly): Matrix3;\r\n function getRotationLocalMatrix(object: Readonly, outRotation: T): T;\r\n function getRotationLocalMatrix(object: Readonly, outRotation: Matrix3 | T = Mat3Utils.create()): Matrix3 | T {\r\n ObjectUtils.getRotationLocalQuat(object, quat);\r\n QuatUtils.toMatrix(quat, outRotation);\r\n return outRotation;\r\n }\r\n\r\n return getRotationLocalMatrix;\r\n}();\r\n\r\nexport function getRotationLocalQuat(object: Readonly): Quaternion;\r\nexport function getRotationLocalQuat(object: Readonly, outRotation: T): T;\r\nexport function getRotationLocalQuat(object: Readonly, outRotation: Quaternion | T = QuatUtils.create()): Quaternion | T {\r\n object.getRotationLocal(outRotation);\r\n return outRotation;\r\n}\r\n\r\n// Scale\r\n\r\nexport function getScale(object: Readonly): Vector3;\r\nexport function getScale(object: Readonly, outScale: T): T;\r\nexport function getScale(object: Readonly, outScale?: T): T {\r\n return ObjectUtils.getScaleWorld(object, outScale!);\r\n}\r\n\r\nexport function getScaleWorld(object: Readonly): Vector3;\r\nexport function getScaleWorld(object: Readonly, outScale: T): T;\r\nexport function getScaleWorld(object: Readonly, outScale: Vector3 | T = Vec3Utils.create()): Vector3 | T {\r\n object.getScalingWorld(outScale);\r\n return outScale;\r\n}\r\n\r\nexport function getScaleLocal(object: Readonly): Vector3;\r\nexport function getScaleLocal(object: Readonly, outScale: T): T;\r\nexport function getScaleLocal(object: Readonly, outScale: Vector3 | T = Vec3Utils.create()): Vector3 | T {\r\n object.getScalingLocal(outScale);\r\n return outScale;\r\n}\r\n\r\n// Transform\r\n\r\nexport function getTransform(object: Readonly): Matrix4;\r\nexport function getTransform(object: Readonly, outTransform: T): T;\r\nexport function getTransform(object: Readonly, outTransform?: Matrix4 | T): Matrix4 | T {\r\n return ObjectUtils.getTransformWorld(object, outTransform!);\r\n}\r\n\r\nexport function getTransformMatrix(object: Readonly): Matrix4;\r\nexport function getTransformMatrix(object: Readonly, outTransform: T): T;\r\nexport function getTransformMatrix(object: Readonly, outTransform?: Matrix4 | T): Matrix4 | T {\r\n return ObjectUtils.getTransformWorldMatrix(object, outTransform!);\r\n}\r\n\r\nexport function getTransformQuat(object: Readonly): Quaternion2;\r\nexport function getTransformQuat(object: Readonly, outTransform: T): T;\r\nexport function getTransformQuat(object: Readonly, outTransform?: Quaternion2 | T): Quaternion2 | T {\r\n return ObjectUtils.getTransformWorldQuat(object, outTransform!);\r\n}\r\n\r\n// Transform World\r\n\r\nexport function getTransformWorld(object: Readonly): Matrix4;\r\nexport function getTransformWorld(object: Readonly, outTransform: T): T;\r\nexport function getTransformWorld(object: Readonly, outTransform?: Matrix4 | T): Matrix4 | T {\r\n return ObjectUtils.getTransformWorldMatrix(object, outTransform!);\r\n}\r\n\r\nexport const getTransformWorldMatrix = function () {\r\n const transformQuat = Quat2Utils.create();\r\n const scale = Vec3Utils.create();\r\n\r\n function getTransformWorldMatrix(object: Readonly): Matrix4;\r\n function getTransformWorldMatrix(object: Readonly, outTransform: T): T;\r\n function getTransformWorldMatrix(object: Readonly, outTransform: Matrix4 | T = Mat4Utils.create()): Matrix4 | T {\r\n ObjectUtils.getTransformWorldQuat(object, transformQuat);\r\n ObjectUtils.getScaleWorld(object, scale);\r\n Mat4Utils.fromQuat(transformQuat, outTransform);\r\n Mat4Utils.scale(outTransform, scale, outTransform);\r\n return outTransform;\r\n }\r\n\r\n return getTransformWorldMatrix;\r\n}();\r\n\r\nexport function getTransformWorldQuat(object: Readonly): Quaternion2;\r\nexport function getTransformWorldQuat(object: Readonly, outTransform: T): T;\r\nexport function getTransformWorldQuat(object: Readonly, outTransform: Quaternion2 | T = Quat2Utils.create()): Quaternion2 | T {\r\n object.getTransformWorld(outTransform);\r\n return outTransform;\r\n}\r\n\r\n// Transform Local\r\n\r\nexport function getTransformLocal(object: Readonly): Matrix4;\r\nexport function getTransformLocal(object: Readonly, outTransform: T): T;\r\nexport function getTransformLocal(object: Readonly, outTransform?: Matrix4 | T): Matrix4 | T {\r\n return ObjectUtils.getTransformLocalMatrix(object, outTransform!);\r\n}\r\n\r\nexport const getTransformLocalMatrix = function () {\r\n const transformQuat = Quat2Utils.create();\r\n const scale = Vec3Utils.create();\r\n\r\n function getTransformLocalMatrix(object: Readonly): Matrix4;\r\n function getTransformLocalMatrix(object: Readonly, outTransform: T): T;\r\n function getTransformLocalMatrix(object: Readonly, outTransform: Matrix4 | T = Mat4Utils.create()): Matrix4 | T {\r\n ObjectUtils.getTransformLocalQuat(object, transformQuat);\r\n ObjectUtils.getScaleLocal(object, scale);\r\n Mat4Utils.fromQuat(transformQuat, outTransform);\r\n Mat4Utils.scale(outTransform, scale, outTransform);\r\n return outTransform;\r\n }\r\n\r\n return getTransformLocalMatrix;\r\n}();\r\n\r\nexport function getTransformLocalQuat(object: Readonly): Quaternion2;\r\nexport function getTransformLocalQuat(object: Readonly, outTransform: T): T;\r\nexport function getTransformLocalQuat(object: Readonly, outTransform: Quaternion2 | T = Quat2Utils.create()): Quaternion2 | T {\r\n object.getTransformLocal(outTransform);\r\n return outTransform;\r\n}\r\n\r\n// Axes\r\n\r\nexport function getAxes(object: Readonly): [Vector3, Vector3, Vector3];\r\nexport function getAxes(object: Readonly, outAxes: [T, U, V]): [T, U, V];\r\nexport function getAxes(object: Readonly, outAxes: [Vector3, Vector3, Vector3] | [T, U, V] = [Vec3Utils.create(), Vec3Utils.create(), Vec3Utils.create()]): [Vector3, Vector3, Vector3] | [T, U, V] {\r\n return ObjectUtils.getAxesWorld(object, outAxes);\r\n}\r\n\r\nexport function getAxesWorld(object: Readonly): [Vector3, Vector3, Vector3];\r\nexport function getAxesWorld(object: Readonly, outAxes: [T, U, V]): [T, U, V];\r\nexport function getAxesWorld(object: Readonly, outAxes: [Vector3, Vector3, Vector3] | [T, U, V] = [Vec3Utils.create(), Vec3Utils.create(), Vec3Utils.create()]): [Vector3, Vector3, Vector3] | [T, U, V] {\r\n ObjectUtils.getLeftWorld(object, outAxes[0]);\r\n ObjectUtils.getUpWorld(object, outAxes[1]);\r\n ObjectUtils.getForwardWorld(object, outAxes[2]);\r\n return outAxes;\r\n}\r\n\r\nexport function getAxesLocal(object: Readonly): [Vector3, Vector3, Vector3];\r\nexport function getAxesLocal(object: Readonly, outAxes: [T, U, V]): [T, U, V];\r\nexport function getAxesLocal(object: Readonly, outAxes: [Vector3, Vector3, Vector3] | [T, U, V] = [Vec3Utils.create(), Vec3Utils.create(), Vec3Utils.create()]): [Vector3, Vector3, Vector3] | [T, U, V] {\r\n ObjectUtils.getLeftLocal(object, outAxes[0]);\r\n ObjectUtils.getUpLocal(object, outAxes[1]);\r\n ObjectUtils.getForwardLocal(object, outAxes[2]);\r\n return outAxes;\r\n}\r\n\r\n// Forward\r\n\r\nexport function getForward(object: Readonly): Vector3;\r\nexport function getForward(object: Readonly, outForward: T): T;\r\nexport function getForward(object: Readonly, outForward?: T): T {\r\n return ObjectUtils.getForwardWorld(object, outForward!);\r\n}\r\n\r\nexport const getForwardWorld = function () {\r\n const rotation = Mat3Utils.create();\r\n\r\n function getForwardWorld(object: Readonly): Vector3;\r\n function getForwardWorld(object: Readonly, outForward: T): T;\r\n function getForwardWorld(object: Readonly, outForward: Vector3 | T = Vec3Utils.create()): Vector3 | T {\r\n ObjectUtils.getRotationWorldMatrix(object, rotation);\r\n outForward[0] = rotation[6];\r\n outForward[1] = rotation[7];\r\n outForward[2] = rotation[8];\r\n return outForward;\r\n }\r\n\r\n return getForwardWorld;\r\n}();\r\n\r\nexport const getForwardLocal = function () {\r\n const rotation = Mat3Utils.create();\r\n\r\n function getForwardLocal(object: Readonly): Vector3;\r\n function getForwardLocal(object: Readonly, outForward: T): T;\r\n function getForwardLocal(object: Readonly, outForward: Vector3 | T = Vec3Utils.create()): Vector3 | T {\r\n ObjectUtils.getRotationLocalMatrix(object, rotation);\r\n outForward[0] = rotation[6];\r\n outForward[1] = rotation[7];\r\n outForward[2] = rotation[8];\r\n return outForward;\r\n }\r\n\r\n return getForwardLocal;\r\n}();\r\n\r\n// Backward\r\n\r\nexport function getBackward(object: Readonly): Vector3;\r\nexport function getBackward(object: Readonly, outBackward: T): T;\r\nexport function getBackward(object: Readonly, outBackward?: T): T {\r\n return ObjectUtils.getBackwardWorld(object, outBackward!);\r\n}\r\n\r\nexport const getBackwardWorld = function () {\r\n const rotation = Mat3Utils.create();\r\n\r\n function getBackwardWorld(object: Readonly): Vector3;\r\n function getBackwardWorld(object: Readonly, outBackward: T): T;\r\n function getBackwardWorld(object: Readonly, outBackward: Vector3 | T = Vec3Utils.create()): Vector3 | T {\r\n ObjectUtils.getRotationWorldMatrix(object, rotation);\r\n outBackward[0] = -rotation[6];\r\n outBackward[1] = -rotation[7];\r\n outBackward[2] = -rotation[8];\r\n return outBackward;\r\n }\r\n\r\n return getBackwardWorld;\r\n}();\r\n\r\nexport const getBackwardLocal = function () {\r\n const rotation = Mat3Utils.create();\r\n\r\n function getBackwardLocal(object: Readonly): Vector3;\r\n function getBackwardLocal(object: Readonly, outBackward: T): T;\r\n function getBackwardLocal(object: Readonly, outBackward: Vector3 | T = Vec3Utils.create()): Vector3 | T {\r\n ObjectUtils.getRotationLocalMatrix(object, rotation);\r\n outBackward[0] = -rotation[6];\r\n outBackward[1] = -rotation[7];\r\n outBackward[2] = -rotation[8];\r\n return outBackward;\r\n }\r\n\r\n return getBackwardLocal;\r\n}();\r\n\r\n// Up\r\n\r\nexport function getUp(object: Readonly): Vector3;\r\nexport function getUp(object: Readonly, outUp: T): T;\r\nexport function getUp(object: Readonly, outUp?: T): T {\r\n return ObjectUtils.getUpWorld(object, outUp!);\r\n}\r\n\r\nexport const getUpWorld = function () {\r\n const rotation = Mat3Utils.create();\r\n\r\n function getUpWorld(object: Readonly): Vector3;\r\n function getUpWorld(object: Readonly, outUp: T): T;\r\n function getUpWorld(object: Readonly, outUp: Vector3 | T = Vec3Utils.create()): Vector3 | T {\r\n ObjectUtils.getRotationWorldMatrix(object, rotation);\r\n outUp[0] = rotation[3];\r\n outUp[1] = rotation[4];\r\n outUp[2] = rotation[5];\r\n return outUp;\r\n }\r\n\r\n return getUpWorld;\r\n}();\r\n\r\nexport const getUpLocal = function () {\r\n const rotation = Mat3Utils.create();\r\n\r\n function getUpLocal(object: Readonly): Vector3;\r\n function getUpLocal(object: Readonly, outUp: T): T;\r\n function getUpLocal(object: Readonly, outUp: Vector3 | T = Vec3Utils.create()): Vector3 | T {\r\n ObjectUtils.getRotationLocalMatrix(object, rotation);\r\n outUp[0] = rotation[3];\r\n outUp[1] = rotation[4];\r\n outUp[2] = rotation[5];\r\n return outUp;\r\n }\r\n\r\n return getUpLocal;\r\n}();\r\n\r\n// Down\r\n\r\nexport function getDown(object: Readonly): Vector3;\r\nexport function getDown(object: Readonly, outDown: T): T;\r\nexport function getDown(object: Readonly, outDown?: T): T {\r\n return ObjectUtils.getDownWorld(object, outDown!);\r\n}\r\n\r\nexport const getDownWorld = function () {\r\n const rotation = Mat3Utils.create();\r\n\r\n function getDownWorld(object: Readonly): Vector3;\r\n function getDownWorld(object: Readonly, outDown: T): T;\r\n function getDownWorld(object: Readonly, outDown: Vector3 | T = Vec3Utils.create()): Vector3 | T {\r\n ObjectUtils.getRotationWorldMatrix(object, rotation);\r\n outDown[0] = -rotation[3];\r\n outDown[1] = -rotation[4];\r\n outDown[2] = -rotation[5];\r\n return outDown;\r\n }\r\n\r\n return getDownWorld;\r\n}();\r\n\r\nexport const getDownLocal = function () {\r\n const rotation = Mat3Utils.create();\r\n\r\n function getDownLocal(object: Readonly): Vector3;\r\n function getDownLocal(object: Readonly, outDown: T): T;\r\n function getDownLocal(object: Readonly, outDown: Vector3 | T = Vec3Utils.create()): Vector3 | T {\r\n ObjectUtils.getRotationLocalMatrix(object, rotation);\r\n outDown[0] = -rotation[3];\r\n outDown[1] = -rotation[4];\r\n outDown[2] = -rotation[5];\r\n return outDown;\r\n }\r\n\r\n return getDownLocal;\r\n}();\r\n\r\n// Left\r\n\r\nexport function getLeft(object: Readonly): Vector3;\r\nexport function getLeft(object: Readonly, outLeft: T): T;\r\nexport function getLeft(object: Readonly, outLeft?: T): T {\r\n return ObjectUtils.getLeftWorld(object, outLeft!);\r\n}\r\n\r\nexport const getLeftWorld = function () {\r\n const rotation = Mat3Utils.create();\r\n\r\n function getLeftWorld(object: Readonly): Vector3;\r\n function getLeftWorld(object: Readonly, outLeft: T): T;\r\n function getLeftWorld(object: Readonly, outLeft: Vector3 | T = Vec3Utils.create()): Vector3 | T {\r\n ObjectUtils.getRotationWorldMatrix(object, rotation);\r\n outLeft[0] = rotation[0];\r\n outLeft[1] = rotation[1];\r\n outLeft[2] = rotation[2];\r\n return outLeft;\r\n }\r\n\r\n return getLeftWorld;\r\n}();\r\n\r\nexport const getLeftLocal = function () {\r\n const rotation = Mat3Utils.create();\r\n\r\n function getLeftLocal(object: Readonly): Vector3;\r\n function getLeftLocal(object: Readonly, outLeft: T): T;\r\n function getLeftLocal(object: Readonly, outLeft: Vector3 | T = Vec3Utils.create()): Vector3 | T {\r\n ObjectUtils.getRotationLocalMatrix(object, rotation);\r\n outLeft[0] = rotation[0];\r\n outLeft[1] = rotation[1];\r\n outLeft[2] = rotation[2];\r\n return outLeft;\r\n }\r\n\r\n return getLeftLocal;\r\n}();\r\n\r\n// Right\r\n\r\nexport function getRight(object: Readonly): Vector3;\r\nexport function getRight(object: Readonly, outRight: T): T;\r\nexport function getRight(object: Readonly, outRight?: T): T {\r\n return ObjectUtils.getRightWorld(object, outRight!);\r\n}\r\n\r\nexport const getRightWorld = function () {\r\n const rotation = Mat3Utils.create();\r\n\r\n function getRightWorld(object: Readonly): Vector3;\r\n function getRightWorld(object: Readonly, outRight: T): T;\r\n function getRightWorld(object: Readonly, outRight: Vector3 | T = Vec3Utils.create()): Vector3 | T {\r\n ObjectUtils.getRotationWorldMatrix(object, rotation);\r\n outRight[0] = -rotation[0];\r\n outRight[1] = -rotation[1];\r\n outRight[2] = -rotation[2];\r\n return outRight;\r\n }\r\n\r\n return getRightWorld;\r\n}();\r\n\r\nexport const getRightLocal = function () {\r\n const rotation = Mat3Utils.create();\r\n\r\n function getRightLocal(object: Readonly): Vector3;\r\n function getRightLocal(object: Readonly, outRight: T): T;\r\n function getRightLocal(object: Readonly, outRight: Vector3 | T = Vec3Utils.create()): Vector3 | T {\r\n ObjectUtils.getRotationLocalMatrix(object, rotation);\r\n outRight[0] = -rotation[0];\r\n outRight[1] = -rotation[1];\r\n outRight[2] = -rotation[2];\r\n return outRight;\r\n }\r\n\r\n return getRightLocal;\r\n}();\r\n\r\n// SETTER\r\n\r\n// Position\r\n\r\nexport function setPosition(object: Object3D, position: Readonly): Object3D {\r\n return ObjectUtils.setPositionWorld(object, position);\r\n}\r\n\r\nexport function setPositionWorld(object: Object3D, position: Readonly): Object3D {\r\n return object.setPositionWorld(position);\r\n}\r\n\r\nexport function setPositionLocal(object: Object3D, position: Readonly): Object3D {\r\n return object.setPositionLocal(position);\r\n}\r\n\r\n// Rotation\r\n\r\nexport function setRotation(object: Object3D, rotation: Readonly): Object3D {\r\n return ObjectUtils.setRotationWorld(object, rotation);\r\n}\r\n\r\nexport function setRotationDegrees(object: Object3D, rotation: Readonly): Object3D {\r\n return ObjectUtils.setRotationWorldDegrees(object, rotation);\r\n}\r\n\r\nexport function setRotationRadians(object: Object3D, rotation: Readonly): Object3D {\r\n return ObjectUtils.setRotationWorldRadians(object, rotation);\r\n}\r\n\r\nexport function setRotationMatrix(object: Object3D, rotation: Readonly): Object3D {\r\n return ObjectUtils.setRotationWorldMatrix(object, rotation);\r\n}\r\n\r\nexport function setRotationQuat(object: Object3D, rotation: Readonly): Object3D {\r\n return ObjectUtils.setRotationWorldQuat(object, rotation);\r\n}\r\n\r\n// Rotation World\r\n\r\nexport function setRotationWorld(object: Object3D, rotation: Readonly): Object3D {\r\n return ObjectUtils.setRotationWorldDegrees(object, rotation);\r\n}\r\n\r\nexport const setRotationWorldDegrees = function () {\r\n const quat = QuatUtils.create();\r\n return function setRotationWorldDegrees(object: Object3D, rotation: Readonly): Object3D {\r\n Vec3Utils.degreesToQuat(rotation, quat);\r\n return ObjectUtils.setRotationWorldQuat(object, quat);\r\n };\r\n}();\r\n\r\nexport const setRotationWorldRadians = function () {\r\n const degreesRotation = Vec3Utils.create();\r\n return function setRotationWorldRadians(object: Object3D, rotation: Readonly): Object3D {\r\n Vec3Utils.toDegrees(rotation, degreesRotation);\r\n return ObjectUtils.setRotationWorldDegrees(object, degreesRotation);\r\n };\r\n}();\r\n\r\nexport const setRotationWorldMatrix = function () {\r\n const quat = QuatUtils.create();\r\n return function setRotationWorldMatrix(object: Object3D, rotation: Readonly): Object3D {\r\n Mat3Utils.toQuat(rotation, quat);\r\n return ObjectUtils.setRotationWorldQuat(object, quat);\r\n };\r\n}();\r\n\r\nexport function setRotationWorldQuat(object: Object3D, rotation: Readonly): Object3D {\r\n return object.setRotationWorld(rotation);\r\n}\r\n\r\n// Rotation Local\r\n\r\nexport function setRotationLocal(object: Object3D, rotation: Readonly): Object3D {\r\n return ObjectUtils.setRotationLocalDegrees(object, rotation);\r\n}\r\n\r\nexport const setRotationLocalDegrees = function () {\r\n const quat = QuatUtils.create();\r\n return function setRotationLocalDegrees(object: Object3D, rotation: Readonly): Object3D {\r\n Vec3Utils.degreesToQuat(rotation, quat);\r\n return ObjectUtils.setRotationLocalQuat(object, quat);\r\n };\r\n}();\r\n\r\nexport const setRotationLocalRadians = function () {\r\n const degreesRotation = Vec3Utils.create();\r\n return function setRotationLocalRadians(object: Object3D, rotation: Readonly): Object3D {\r\n Vec3Utils.toDegrees(rotation, degreesRotation);\r\n return ObjectUtils.setRotationLocalDegrees(object, degreesRotation);\r\n };\r\n}();\r\n\r\nexport const setRotationLocalMatrix = function () {\r\n const quat = QuatUtils.create();\r\n return function setRotationLocalMatrix(object: Object3D, rotation: Readonly): Object3D {\r\n Mat3Utils.toQuat(rotation, quat);\r\n return ObjectUtils.setRotationLocalQuat(object, quat);\r\n };\r\n}();\r\n\r\nexport function setRotationLocalQuat(object: Object3D, rotation: Readonly): Object3D {\r\n return object.setRotationLocal(rotation);\r\n}\r\n\r\n// Scale\r\n\r\nexport function setScale(object: Object3D, scale: Readonly): Object3D;\r\nexport function setScale(object: Object3D, uniformScale: number): Object3D;\r\nexport function setScale(object: Object3D, scale: Readonly | number): Object3D {\r\n return ObjectUtils.setScaleWorld(object, scale as Vector3);\r\n}\r\n\r\nexport const setScaleWorld = function () {\r\n const vector = Vec3Utils.create();\r\n\r\n function setScaleWorld(object: Object3D, scale: Readonly): Object3D;\r\n function setScaleWorld(object: Object3D, uniformScale: number): Object3D;\r\n function setScaleWorld(object: Object3D, scale: Readonly | number): Object3D {\r\n if (isNaN(scale as number)) {\r\n return object.setScalingWorld(scale as Vector3);\r\n } else {\r\n Vec3Utils.set(vector, scale as number);\r\n return object.setScalingWorld(vector);\r\n }\r\n }\r\n\r\n return setScaleWorld;\r\n}();\r\n\r\nexport const setScaleLocal = function () {\r\n const vector = Vec3Utils.create();\r\n\r\n function setScaleLocal(object: Object3D, scale: Readonly): Object3D;\r\n function setScaleLocal(object: Object3D, uniformScale: number): Object3D;\r\n function setScaleLocal(object: Object3D, scale: Readonly | number): Object3D {\r\n if (isNaN(scale as number)) {\r\n return object.setScalingLocal(scale as Vector3);\r\n } else {\r\n Vec3Utils.set(vector, scale as number);\r\n return object.setScalingLocal(vector);\r\n }\r\n }\r\n\r\n return setScaleLocal;\r\n}();\r\n\r\n// Axes \r\n\r\nexport function setAxes(object: Object3D, left?: Readonly, up?: Readonly, forward?: Readonly): Object3D {\r\n return ObjectUtils.setAxesWorld(object, left, up, forward);\r\n}\r\n\r\nexport function setAxesWorld(object: Object3D, left?: Readonly, up?: Readonly, forward?: Readonly): Object3D {\r\n if (forward != null) {\r\n return ObjectUtils.setForwardWorld(object, forward, up, left);\r\n } else if (up != null) {\r\n return ObjectUtils.setUpWorld(object, up, forward, left);\r\n } else if (left != null) {\r\n return ObjectUtils.setLeftWorld(object, left, up, forward);\r\n }\r\n\r\n return object;\r\n}\r\n\r\nexport function setAxesLocal(object: Object3D, left?: Readonly, up?: Readonly, forward?: Readonly): Object3D {\r\n if (forward != null) {\r\n return ObjectUtils.setForwardLocal(object, forward, up, left);\r\n } else if (up != null) {\r\n return ObjectUtils.setUpLocal(object, up, forward, left);\r\n } else if (left != null) {\r\n return ObjectUtils.setLeftLocal(object, left, up, forward);\r\n }\r\n\r\n return object;\r\n}\r\n\r\n// Forward\r\n\r\nexport function setForward(object: Object3D, forward: Readonly, up?: Readonly, left?: Readonly): Object3D {\r\n return ObjectUtils.setForwardWorld(object, forward, up, left);\r\n}\r\n\r\nexport const setForwardWorld = function () {\r\n const quat = QuatUtils.create();\r\n return function setForwardWorld(object: Object3D, forward: Readonly, up?: Readonly, left?: Readonly): Object3D {\r\n ObjectUtils.getRotationWorldQuat(object, quat);\r\n QuatUtils.setForward(quat, forward, up, left);\r\n return ObjectUtils.setRotationWorldQuat(object, quat);\r\n };\r\n}();\r\n\r\nexport const setForwardLocal = function () {\r\n const quat = QuatUtils.create();\r\n return function setForwardLocal(object: Object3D, forward: Readonly, up?: Readonly, left?: Readonly): Object3D {\r\n ObjectUtils.getRotationLocalQuat(object, quat);\r\n QuatUtils.setForward(quat, forward, up, left);\r\n return ObjectUtils.setRotationLocalQuat(object, quat);\r\n };\r\n}();\r\n\r\n// Backward\r\n\r\nexport function setBackward(object: Object3D, backward: Readonly, up?: Readonly, left?: Readonly): Object3D {\r\n return ObjectUtils.setBackwardWorld(object, backward, up, left);\r\n}\r\n\r\nexport const setBackwardWorld = function () {\r\n const quat = QuatUtils.create();\r\n return function setBackwardWorld(object: Object3D, backward: Readonly, up?: Readonly, left?: Readonly): Object3D {\r\n ObjectUtils.getRotationWorldQuat(object, quat);\r\n QuatUtils.setBackward(quat, backward, up, left);\r\n return ObjectUtils.setRotationWorldQuat(object, quat);\r\n };\r\n}();\r\n\r\nexport const setBackwardLocal = function () {\r\n const quat = QuatUtils.create();\r\n return function setBackwardLocal(object: Object3D, backward: Readonly, up?: Readonly, left?: Readonly): Object3D {\r\n ObjectUtils.getRotationLocalQuat(object, quat);\r\n QuatUtils.setBackward(quat, backward, up, left);\r\n return ObjectUtils.setRotationLocalQuat(object, quat);\r\n };\r\n}();\r\n\r\n// Up\r\n\r\nexport function setUp(object: Object3D, up: Readonly, forward?: Readonly, left?: Readonly): Object3D {\r\n return ObjectUtils.setUpWorld(object, up, forward, left);\r\n}\r\n\r\nexport const setUpWorld = function () {\r\n const quat = QuatUtils.create();\r\n return function setUpWorld(object: Object3D, up: Readonly, forward?: Readonly, left?: Readonly): Object3D {\r\n ObjectUtils.getRotationWorldQuat(object, quat);\r\n QuatUtils.setUp(quat, up, forward, left);\r\n return ObjectUtils.setRotationWorldQuat(object, quat);\r\n };\r\n}();\r\n\r\nexport const setUpLocal = function () {\r\n const quat = QuatUtils.create();\r\n return function setUpLocal(object: Object3D, up: Readonly, forward?: Readonly, left?: Readonly): Object3D {\r\n ObjectUtils.getRotationLocalQuat(object, quat);\r\n QuatUtils.setUp(quat, up, forward, left);\r\n return ObjectUtils.setRotationLocalQuat(object, quat);\r\n };\r\n}();\r\n\r\n// Down\r\n\r\nexport function setDown(object: Object3D, down: Readonly, forward?: Readonly, left?: Readonly): Object3D {\r\n return ObjectUtils.setDownWorld(object, down, forward, left);\r\n}\r\n\r\nexport const setDownWorld = function () {\r\n const quat = QuatUtils.create();\r\n return function setDownWorld(object: Object3D, down: Readonly, forward?: Readonly, left?: Readonly): Object3D {\r\n ObjectUtils.getRotationWorldQuat(object, quat);\r\n QuatUtils.setDown(quat, down, forward, left);\r\n return ObjectUtils.setRotationWorldQuat(object, quat);\r\n };\r\n}();\r\n\r\nexport const setDownLocal = function () {\r\n const quat = QuatUtils.create();\r\n return function setDownLocal(object: Object3D, down: Readonly, forward?: Readonly, left?: Readonly): Object3D {\r\n ObjectUtils.getRotationLocalQuat(object, quat);\r\n QuatUtils.setDown(quat, down, forward, left);\r\n return ObjectUtils.setRotationLocalQuat(object, quat);\r\n };\r\n}();\r\n\r\n// Left\r\n\r\nexport function setLeft(object: Object3D, left: Readonly, up?: Readonly, forward?: Readonly): Object3D {\r\n return ObjectUtils.setLeftWorld(object, left, up, forward);\r\n}\r\n\r\nexport const setLeftWorld = function () {\r\n const quat = QuatUtils.create();\r\n return function setLeftWorld(object: Object3D, left: Readonly, up?: Readonly, forward?: Readonly): Object3D {\r\n ObjectUtils.getRotationWorldQuat(object, quat);\r\n QuatUtils.setLeft(quat, left, up, forward);\r\n return ObjectUtils.setRotationWorldQuat(object, quat);\r\n };\r\n}();\r\n\r\nexport const setLeftLocal = function () {\r\n const quat = QuatUtils.create();\r\n return function setLeftLocal(object: Object3D, left: Readonly, up?: Readonly, forward?: Readonly): Object3D {\r\n ObjectUtils.getRotationLocalQuat(object, quat);\r\n QuatUtils.setLeft(quat, left, up, forward);\r\n return ObjectUtils.setRotationLocalQuat(object, quat);\r\n };\r\n}();\r\n\r\n// Right\r\n\r\nexport function setRight(object: Object3D, right: Readonly, up?: Readonly, forward?: Readonly): Object3D {\r\n return ObjectUtils.setRightWorld(object, right, up, forward);\r\n}\r\n\r\nexport const setRightWorld = function () {\r\n const quat = QuatUtils.create();\r\n return function setRightWorld(object: Object3D, right: Readonly, up?: Readonly, forward?: Readonly): Object3D {\r\n ObjectUtils.getRotationWorldQuat(object, quat);\r\n QuatUtils.setRight(quat, right, up, forward);\r\n return ObjectUtils.setRotationWorldQuat(object, quat);\r\n };\r\n}();\r\n\r\nexport const setRightLocal = function () {\r\n const quat = QuatUtils.create();\r\n return function setRightLocal(object: Object3D, right: Readonly, up?: Readonly, forward?: Readonly): Object3D {\r\n ObjectUtils.getRotationLocalQuat(object, quat);\r\n QuatUtils.setRight(quat, right, up, forward);\r\n return ObjectUtils.setRotationLocalQuat(object, quat);\r\n };\r\n}();\r\n\r\n// Transform\r\n\r\nexport function setTransform(object: Object3D, transform: Readonly): Object3D {\r\n return ObjectUtils.setTransformWorld(object, transform);\r\n}\r\n\r\nexport function setTransformMatrix(object: Object3D, transform: Readonly): Object3D {\r\n return ObjectUtils.setTransformWorldMatrix(object, transform);\r\n}\r\n\r\nexport function setTransformQuat(object: Object3D, transform: Readonly): Object3D {\r\n return ObjectUtils.setTransformWorldQuat(object, transform);\r\n}\r\n\r\n// Transform World\r\n\r\nexport function setTransformWorld(object: Object3D, transform: Readonly): Object3D {\r\n return ObjectUtils.setTransformWorldMatrix(object, transform);\r\n}\r\n\r\nexport const setTransformWorldMatrix = function () {\r\n const position = Vec3Utils.create();\r\n const rotation = QuatUtils.create();\r\n const scale = Vec3Utils.create();\r\n const transformMatrixNoScale = Mat4Utils.create();\r\n const inverseScale = Vec3Utils.create();\r\n const one = Vec3Utils.create(1);\r\n return function setTransformWorldMatrix(object: Object3D, transform: Readonly): Object3D {\r\n Mat4Utils.getPosition(transform, position);\r\n Mat4Utils.getScale(transform, scale);\r\n Vec3Utils.div(one, scale, inverseScale);\r\n Mat4Utils.scale(transform, inverseScale, transformMatrixNoScale);\r\n Mat4Utils.getRotationQuat(transformMatrixNoScale, rotation);\r\n QuatUtils.normalize(rotation, rotation);\r\n ObjectUtils.setScaleWorld(object, scale);\r\n ObjectUtils.setRotationWorldQuat(object, rotation);\r\n ObjectUtils.setPositionWorld(object, position);\r\n\r\n return object;\r\n };\r\n}();\r\n\r\nexport function setTransformWorldQuat(object: Object3D, transform: Readonly): Object3D {\r\n return object.setTransformWorld(transform);\r\n}\r\n\r\n// Transform Local\r\n\r\nexport function setTransformLocal(object: Object3D, transform: Readonly): Object3D {\r\n return ObjectUtils.setTransformLocalMatrix(object, transform);\r\n}\r\n\r\nexport const setTransformLocalMatrix = function () {\r\n const position = Vec3Utils.create();\r\n const rotation = QuatUtils.create();\r\n const scale = Vec3Utils.create();\r\n const transformMatrixNoScale = Mat4Utils.create();\r\n const inverseScale = Vec3Utils.create();\r\n const one = Vec3Utils.create(1);\r\n return function setTransformLocalMatrix(object: Object3D, transform: Readonly): Object3D {\r\n Mat4Utils.getPosition(transform, position);\r\n Mat4Utils.getScale(transform, scale);\r\n Vec3Utils.div(one, scale, inverseScale);\r\n Mat4Utils.scale(transform, inverseScale, transformMatrixNoScale);\r\n Mat4Utils.getRotationQuat(transformMatrixNoScale, rotation);\r\n QuatUtils.normalize(rotation, rotation);\r\n ObjectUtils.setScaleLocal(object, scale);\r\n ObjectUtils.setRotationLocalQuat(object, rotation);\r\n ObjectUtils.setPositionLocal(object, position);\r\n\r\n return object;\r\n };\r\n}();\r\n\r\nexport function setTransformLocalQuat(object: Object3D, transform: Readonly): Object3D {\r\n return object.setTransformLocal(transform);\r\n}\r\n\r\n// RESET\r\n\r\n// Position\r\n\r\nexport function resetPosition(object: Object3D): Object3D {\r\n return ObjectUtils.resetPositionWorld(object);\r\n}\r\n\r\nexport const resetPositionWorld = function () {\r\n const zero = Vec3Utils.create();\r\n return function resetPositionWorld(object: Object3D): Object3D {\r\n return ObjectUtils.setPositionWorld(object, zero);\r\n };\r\n}();\r\n\r\nexport const resetPositionLocal = function () {\r\n const zero = Vec3Utils.create();\r\n return function resetPositionLocal(object: Object3D): Object3D {\r\n return ObjectUtils.setPositionLocal(object, zero);\r\n };\r\n}();\r\n\r\n// Rotation\r\n\r\nexport function resetRotation(object: Object3D): Object3D {\r\n return ObjectUtils.resetRotationWorld(object);\r\n}\r\n\r\nexport const resetRotationWorld = function () {\r\n const identity = QuatUtils.create();\r\n return function resetRotationWorld(object: Object3D): Object3D {\r\n return ObjectUtils.setRotationWorldQuat(object, identity);\r\n };\r\n}();\r\n\r\nexport const resetRotationLocal = function () {\r\n const identity = QuatUtils.create();\r\n return function resetRotationLocal(object: Object3D): Object3D {\r\n return ObjectUtils.setRotationLocalQuat(object, identity);\r\n };\r\n}();\r\n\r\n// Scale\r\n\r\nexport function resetScale(object: Object3D): Object3D {\r\n return ObjectUtils.resetScaleWorld(object);\r\n}\r\n\r\nexport const resetScaleWorld = function () {\r\n const one = Vec3Utils.create(1);\r\n return function resetScaleWorld(object: Object3D): Object3D {\r\n return ObjectUtils.setScaleWorld(object, one);\r\n };\r\n}();\r\n\r\nexport const resetScaleLocal = function () {\r\n const one = Vec3Utils.create(1);\r\n return function resetScaleLocal(object: Object3D): Object3D {\r\n return ObjectUtils.setScaleLocal(object, one);\r\n };\r\n}();\r\n\r\n// Transform\r\n\r\nexport function resetTransform(object: Object3D): Object3D {\r\n return ObjectUtils.resetTransformWorld(object);\r\n}\r\n\r\nexport function resetTransformWorld(object: Object3D): Object3D {\r\n ObjectUtils.resetScaleWorld(object);\r\n ObjectUtils.resetRotationWorld(object);\r\n ObjectUtils.resetPositionWorld(object);\r\n\r\n return object;\r\n}\r\n\r\nexport function resetTransformLocal(object: Object3D): Object3D {\r\n ObjectUtils.resetScaleLocal(object);\r\n ObjectUtils.resetRotationLocal(object);\r\n ObjectUtils.resetPositionLocal(object);\r\n\r\n return object;\r\n}\r\n\r\n// TRANSFORMATIONS\r\n\r\n// Translate\r\n\r\nexport function translate(object: Object3D, translation: Readonly): Object3D {\r\n return ObjectUtils.translateWorld(object, translation);\r\n}\r\n\r\nexport function translateWorld(object: Object3D, translation: Readonly): Object3D {\r\n return object.translateWorld(translation);\r\n}\r\n\r\nexport function translateLocal(object: Object3D, translation: Readonly): Object3D {\r\n return object.translateLocal(translation);\r\n}\r\n\r\nexport function translateObject(object: Object3D, translation: Readonly): Object3D {\r\n return object.translateObject(translation);\r\n}\r\n\r\n// Translate Axis\r\n\r\nexport function translateAxis(object: Object3D, amount: number, direction: Readonly): Object3D {\r\n return ObjectUtils.translateAxisWorld(object, amount, direction);\r\n}\r\n\r\nexport const translateAxisWorld = function () {\r\n const translation = Vec3Utils.create();\r\n return function translateAxisWorld(object: Object3D, amount: number, direction: Readonly): Object3D {\r\n Vec3Utils.scale(direction, amount, translation);\r\n return ObjectUtils.translateWorld(object, translation);\r\n };\r\n}();\r\n\r\nexport const translateAxisLocal = function () {\r\n const translation = Vec3Utils.create();\r\n return function translateAxisLocal(object: Object3D, amount: number, direction: Readonly): Object3D {\r\n Vec3Utils.scale(direction, amount, translation);\r\n return ObjectUtils.translateLocal(object, translation);\r\n };\r\n}();\r\n\r\nexport const translateAxisObject = function () {\r\n const translation = Vec3Utils.create();\r\n return function translateAxisObject(object: Object3D, amount: number, direction: Readonly): Object3D {\r\n Vec3Utils.scale(direction, amount, translation);\r\n return ObjectUtils.translateObject(object, translation);\r\n };\r\n}();\r\n\r\n// Rotate\r\n\r\nexport function rotate(object: Object3D, rotation: Readonly): Object3D {\r\n return ObjectUtils.rotateWorld(object, rotation);\r\n}\r\n\r\nexport function rotateDegrees(object: Object3D, rotation: Readonly): Object3D {\r\n return ObjectUtils.rotateWorldDegrees(object, rotation);\r\n}\r\n\r\nexport function rotateRadians(object: Object3D, rotation: Readonly): Object3D {\r\n return ObjectUtils.rotateWorldRadians(object, rotation);\r\n}\r\n\r\nexport function rotateMatrix(object: Object3D, rotation: Readonly): Object3D {\r\n return ObjectUtils.rotateWorldMatrix(object, rotation);\r\n}\r\n\r\nexport function rotateQuat(object: Object3D, rotation: Readonly): Object3D {\r\n return ObjectUtils.rotateWorldQuat(object, rotation);\r\n}\r\n\r\n// Rotate World\r\n\r\nexport function rotateWorld(object: Object3D, rotation: Readonly): Object3D {\r\n return ObjectUtils.rotateWorldDegrees(object, rotation);\r\n}\r\n\r\nexport const rotateWorldDegrees = function () {\r\n const rotationQuat = QuatUtils.create();\r\n return function rotateWorldDegrees(object: Object3D, rotation: Readonly): Object3D {\r\n Vec3Utils.degreesToQuat(rotation, rotationQuat);\r\n return ObjectUtils.rotateWorldQuat(object, rotationQuat);\r\n };\r\n}();\r\n\r\nexport const rotateWorldRadians = function () {\r\n const degreesRotation = Vec3Utils.create();\r\n return function rotateWorldRadians(object: Object3D, rotation: Readonly): Object3D {\r\n Vec3Utils.toDegrees(rotation, degreesRotation);\r\n return ObjectUtils.rotateWorldDegrees(object, degreesRotation);\r\n };\r\n}();\r\n\r\nexport const rotateWorldMatrix = function () {\r\n const rotationQuat = QuatUtils.create();\r\n return function rotateWorldMatrix(object: Object3D, rotation: Readonly): Object3D {\r\n Mat3Utils.toQuat(rotation, rotationQuat);\r\n QuatUtils.normalize(rotationQuat, rotationQuat);\r\n return ObjectUtils.rotateWorldQuat(object, rotationQuat);\r\n };\r\n}();\r\n\r\nexport const rotateWorldQuat = function () {\r\n const currentRotationQuat = QuatUtils.create();\r\n return function rotateWorldQuat(object: Object3D, rotation: Readonly): Object3D {\r\n ObjectUtils.getRotationWorldQuat(object, currentRotationQuat);\r\n QuatUtils.mul(rotation, currentRotationQuat, currentRotationQuat);\r\n QuatUtils.normalize(currentRotationQuat, currentRotationQuat);\r\n return ObjectUtils.setRotationWorldQuat(object, currentRotationQuat);\r\n };\r\n}();\r\n\r\n// Rotate Local\r\n\r\nexport function rotateLocal(object: Object3D, rotation: Readonly): Object3D {\r\n return ObjectUtils.rotateLocalDegrees(object, rotation);\r\n}\r\n\r\nexport const rotateLocalDegrees = function () {\r\n const rotationQuat = QuatUtils.create();\r\n return function rotateLocalDegrees(object: Object3D, rotation: Readonly): Object3D {\r\n Vec3Utils.degreesToQuat(rotation, rotationQuat);\r\n return ObjectUtils.rotateLocalQuat(object, rotationQuat);\r\n };\r\n}();\r\n\r\nexport const rotateLocalRadians = function () {\r\n const degreesRotation = Vec3Utils.create();\r\n return function rotateLocalRadians(object: Object3D, rotation: Readonly): Object3D {\r\n Vec3Utils.toDegrees(rotation, degreesRotation);\r\n return ObjectUtils.rotateLocalDegrees(object, degreesRotation);\r\n };\r\n}();\r\n\r\nexport const rotateLocalMatrix = function () {\r\n const rotationQuat = QuatUtils.create();\r\n return function rotateLocalMatrix(object: Object3D, rotation: Readonly): Object3D {\r\n Mat3Utils.toQuat(rotation, rotationQuat);\r\n QuatUtils.normalize(rotationQuat, rotationQuat);\r\n return ObjectUtils.rotateLocalQuat(object, rotationQuat);\r\n };\r\n}();\r\n\r\nexport const rotateLocalQuat = function () {\r\n const currentRotationQuat = QuatUtils.create();\r\n return function rotateLocalQuat(object: Object3D, rotation: Readonly): Object3D {\r\n ObjectUtils.getRotationLocalQuat(object, currentRotationQuat);\r\n QuatUtils.mul(rotation, currentRotationQuat, currentRotationQuat);\r\n QuatUtils.normalize(currentRotationQuat, currentRotationQuat);\r\n return ObjectUtils.setRotationLocalQuat(object, currentRotationQuat);\r\n };\r\n}();\r\n\r\n// Rotate Object\r\n\r\nexport function rotateObject(object: Object3D, rotation: Readonly): Object3D {\r\n return ObjectUtils.rotateObjectDegrees(object, rotation);\r\n}\r\n\r\nexport const rotateObjectDegrees = function () {\r\n const rotationQuat = QuatUtils.create();\r\n return function rotateObjectDegrees(object: Object3D, rotation: Readonly): Object3D {\r\n Vec3Utils.degreesToQuat(rotation, rotationQuat);\r\n return ObjectUtils.rotateObjectQuat(object, rotationQuat);\r\n };\r\n}();\r\n\r\nexport const rotateObjectRadians = function () {\r\n const degreesRotation = Vec3Utils.create();\r\n return function rotateObjectRadians(object: Object3D, rotation: Readonly): Object3D {\r\n Vec3Utils.toDegrees(rotation, degreesRotation);\r\n return ObjectUtils.rotateObjectDegrees(object, degreesRotation);\r\n };\r\n}();\r\n\r\nexport const rotateObjectMatrix = function () {\r\n const rotationQuat = QuatUtils.create();\r\n return function rotateObjectMatrix(object: Object3D, rotation: Readonly): Object3D {\r\n Mat3Utils.toQuat(rotation, rotationQuat);\r\n QuatUtils.normalize(rotationQuat, rotationQuat);\r\n return ObjectUtils.rotateObjectQuat(object, rotationQuat);\r\n };\r\n}();\r\n\r\nexport function rotateObjectQuat(object: Object3D, rotation: Readonly): Object3D {\r\n return object.rotateObject(rotation);\r\n}\r\n\r\n// Rotate Axis\r\n\r\nexport function rotateAxis(object: Object3D, angle: number, axis: Readonly): Object3D {\r\n return ObjectUtils.rotateAxisWorld(object, angle, axis);\r\n}\r\n\r\nexport function rotateAxisDegrees(object: Object3D, angle: number, axis: Readonly): Object3D {\r\n return ObjectUtils.rotateAxisWorldDegrees(object, angle, axis);\r\n}\r\n\r\nexport function rotateAxisRadians(object: Object3D, angle: number, axis: Readonly): Object3D {\r\n return ObjectUtils.rotateAxisWorldRadians(object, angle, axis);\r\n}\r\n\r\n// Rotate Axis World\r\n\r\nexport function rotateAxisWorld(object: Object3D, angle: number, axis: Readonly): Object3D {\r\n return ObjectUtils.rotateAxisWorldDegrees(object, angle, axis);\r\n}\r\n\r\nexport function rotateAxisWorldDegrees(object: Object3D, angle: number, axis: Readonly): Object3D {\r\n return ObjectUtils.rotateAxisWorldRadians(object, MathUtils.toRadians(angle), axis);\r\n}\r\n\r\nexport const rotateAxisWorldRadians = function () {\r\n const rotation = QuatUtils.create();\r\n return function rotateAxisWorldRadians(object: Object3D, angle: number, axis: Readonly): Object3D {\r\n QuatUtils.fromAxisRadians(angle, axis, rotation);\r\n return ObjectUtils.rotateWorldQuat(object, rotation);\r\n };\r\n}();\r\n\r\n// Rotate Axis Local\r\n\r\nexport function rotateAxisLocal(object: Object3D, angle: number, axis: Readonly): Object3D {\r\n return ObjectUtils.rotateAxisLocalDegrees(object, angle, axis);\r\n}\r\n\r\nexport function rotateAxisLocalDegrees(object: Object3D, angle: number, axis: Readonly): Object3D {\r\n return ObjectUtils.rotateAxisLocalRadians(object, MathUtils.toRadians(angle), axis);\r\n}\r\n\r\nexport const rotateAxisLocalRadians = function () {\r\n const rotation = QuatUtils.create();\r\n return function rotateAxisLocalRadians(object: Object3D, angle: number, axis: Readonly): Object3D {\r\n QuatUtils.fromAxisRadians(angle, axis, rotation);\r\n return ObjectUtils.rotateLocalQuat(object, rotation);\r\n };\r\n}();\r\n\r\n// Rotate Axis Object\r\n\r\nexport function rotateAxisObject(object: Object3D, angle: number, axis: Readonly): Object3D {\r\n return ObjectUtils.rotateAxisObjectDegrees(object, angle, axis);\r\n}\r\n\r\nexport function rotateAxisObjectDegrees(object: Object3D, angle: number, axis: Readonly): Object3D {\r\n return ObjectUtils.rotateAxisObjectRadians(object, MathUtils.toRadians(angle), axis);\r\n}\r\n\r\nexport const rotateAxisObjectRadians = function () {\r\n const rotation = QuatUtils.create();\r\n return function rotateAxisObjectRadians(object: Object3D, angle: number, axis: Readonly): Object3D {\r\n QuatUtils.fromAxisRadians(angle, axis, rotation);\r\n return ObjectUtils.rotateObjectQuat(object, rotation);\r\n };\r\n}();\r\n\r\n// Rotate Around\r\n\r\nexport function rotateAround(object: Object3D, rotation: Readonly, origin: Readonly): Object3D {\r\n return ObjectUtils.rotateAroundWorld(object, rotation, origin);\r\n}\r\n\r\nexport function rotateAroundDegrees(object: Object3D, rotation: Readonly, origin: Readonly): Object3D {\r\n return ObjectUtils.rotateAroundWorldDegrees(object, rotation, origin);\r\n}\r\n\r\nexport function rotateAroundRadians(object: Object3D, rotation: Readonly, origin: Readonly): Object3D {\r\n return ObjectUtils.rotateAroundWorldRadians(object, rotation, origin);\r\n}\r\n\r\nexport function rotateAroundMatrix(object: Object3D, rotation: Readonly, origin: Readonly): Object3D {\r\n return ObjectUtils.rotateAroundWorldMatrix(object, rotation, origin);\r\n}\r\n\r\nexport function rotateAroundQuat(object: Object3D, rotation: Readonly, origin: Readonly): Object3D {\r\n return ObjectUtils.rotateAroundWorldQuat(object, rotation, origin);\r\n}\r\n\r\n// Rotate Around World\r\n\r\nexport function rotateAroundWorld(object: Object3D, rotation: Readonly, origin: Readonly): Object3D {\r\n return ObjectUtils.rotateAroundWorldDegrees(object, rotation, origin);\r\n}\r\n\r\nexport const rotateAroundWorldDegrees = function () {\r\n const rotationQuat = QuatUtils.create();\r\n return function rotateAroundWorldDegrees(object: Object3D, rotation: Readonly, origin: Readonly): Object3D {\r\n Vec3Utils.degreesToQuat(rotation, rotationQuat);\r\n return ObjectUtils.rotateAroundWorldQuat(object, rotationQuat, origin);\r\n };\r\n}();\r\n\r\nexport const rotateAroundWorldRadians = function () {\r\n const degreesRotation = Vec3Utils.create();\r\n return function rotateAroundWorldRadians(object: Object3D, rotation: Readonly, origin: Readonly): Object3D {\r\n Vec3Utils.toDegrees(rotation, degreesRotation);\r\n return ObjectUtils.rotateAroundWorldDegrees(object, degreesRotation, origin);\r\n };\r\n}();\r\n\r\nexport const rotateAroundWorldMatrix = function () {\r\n const rotationQuat = QuatUtils.create();\r\n return function rotateAroundWorldMatrix(object: Object3D, rotation: Readonly, origin: Readonly): Object3D {\r\n Mat3Utils.toQuat(rotation, rotationQuat);\r\n QuatUtils.normalize(rotationQuat, rotationQuat);\r\n return ObjectUtils.rotateAroundWorldQuat(object, rotationQuat, origin);\r\n };\r\n}();\r\n\r\nexport const rotateAroundWorldQuat = function () {\r\n const axis = Vec3Utils.create();\r\n return function rotateAroundWorldQuat(object: Object3D, rotation: Readonly, origin: Readonly): Object3D {\r\n QuatUtils.getAxis(rotation, axis);\r\n const angle = QuatUtils.getAngleRadians(rotation,);\r\n return ObjectUtils.rotateAroundAxisWorldRadians(object, angle, axis, origin);\r\n };\r\n}();\r\n\r\n// Rotate Around Local\r\n\r\nexport function rotateAroundLocal(object: Object3D, rotation: Readonly, origin: Readonly): Object3D {\r\n return ObjectUtils.rotateAroundLocalDegrees(object, rotation, origin);\r\n}\r\n\r\nexport const rotateAroundLocalDegrees = function () {\r\n const rotationQuat = QuatUtils.create();\r\n return function rotateAroundLocalDegrees(object: Object3D, rotation: Readonly, origin: Readonly): Object3D {\r\n Vec3Utils.degreesToQuat(rotation, rotationQuat);\r\n return ObjectUtils.rotateAroundLocalQuat(object, rotationQuat, origin);\r\n };\r\n}();\r\n\r\nexport const rotateAroundLocalRadians = function () {\r\n const degreesRotation = Vec3Utils.create();\r\n return function rotateAroundLocalRadians(object: Object3D, rotation: Readonly, origin: Readonly): Object3D {\r\n Vec3Utils.toDegrees(rotation, degreesRotation);\r\n return ObjectUtils.rotateAroundLocalDegrees(object, degreesRotation, origin);\r\n };\r\n}();\r\n\r\nexport const rotateAroundLocalMatrix = function () {\r\n const rotationQuat = QuatUtils.create();\r\n return function rotateAroundLocalMatrix(object: Object3D, rotation: Readonly, origin: Readonly): Object3D {\r\n Mat3Utils.toQuat(rotation, rotationQuat);\r\n QuatUtils.normalize(rotationQuat, rotationQuat);\r\n return ObjectUtils.rotateAroundLocalQuat(object, rotationQuat, origin);\r\n };\r\n}();\r\n\r\nexport const rotateAroundLocalQuat = function () {\r\n const axis = Vec3Utils.create();\r\n return function rotateAroundLocalQuat(object: Object3D, rotation: Readonly, origin: Readonly): Object3D {\r\n QuatUtils.getAxis(rotation, axis);\r\n const angle = QuatUtils.getAngleRadians(rotation,);\r\n return ObjectUtils.rotateAroundAxisLocalRadians(object, angle, axis, origin);\r\n };\r\n}();\r\n\r\n// Rotate Around Object\r\n\r\nexport function rotateAroundObject(object: Object3D, rotation: Readonly, origin: Readonly): Object3D {\r\n return ObjectUtils.rotateAroundObjectDegrees(object, rotation, origin);\r\n}\r\n\r\nexport const rotateAroundObjectDegrees = function () {\r\n const rotationQuat = QuatUtils.create();\r\n return function rotateAroundObjectDegrees(object: Object3D, rotation: Readonly, origin: Readonly): Object3D {\r\n Vec3Utils.degreesToQuat(rotation, rotationQuat);\r\n return ObjectUtils.rotateAroundObjectQuat(object, rotationQuat, origin);\r\n };\r\n}();\r\n\r\nexport const rotateAroundObjectRadians = function () {\r\n const degreesRotation = Vec3Utils.create();\r\n return function rotateAroundObjectRadians(object: Object3D, rotation: Readonly, origin: Readonly): Object3D {\r\n Vec3Utils.toDegrees(rotation, degreesRotation);\r\n return ObjectUtils.rotateAroundObjectDegrees(object, degreesRotation, origin);\r\n };\r\n}();\r\n\r\nexport const rotateAroundObjectMatrix = function () {\r\n const rotationQuat = QuatUtils.create();\r\n return function rotateAroundObjectMatrix(object: Object3D, rotation: Readonly, origin: Readonly): Object3D {\r\n Mat3Utils.toQuat(rotation, rotationQuat);\r\n QuatUtils.normalize(rotationQuat, rotationQuat);\r\n return ObjectUtils.rotateAroundObjectQuat(object, rotationQuat, origin);\r\n };\r\n}();\r\n\r\nexport const rotateAroundObjectQuat = function () {\r\n const axis = Vec3Utils.create();\r\n return function rotateAroundObjectQuat(object: Object3D, rotation: Readonly, origin: Readonly): Object3D {\r\n QuatUtils.getAxis(rotation, axis);\r\n const angle = QuatUtils.getAngleRadians(rotation,);\r\n return ObjectUtils.rotateAroundAxisObjectRadians(object, angle, axis, origin);\r\n };\r\n}();\r\n\r\n// Rotate Around Axis\r\n\r\nexport function rotateAroundAxis(object: Object3D, angle: number, axis: Readonly, origin: Readonly): Object3D {\r\n return ObjectUtils.rotateAroundAxisWorld(object, angle, axis, origin);\r\n}\r\n\r\nexport function rotateAroundAxisDegrees(object: Object3D, angle: number, axis: Readonly, origin: Readonly): Object3D {\r\n return ObjectUtils.rotateAroundAxisWorldDegrees(object, angle, axis, origin);\r\n}\r\n\r\nexport function rotateAroundAxisRadians(object: Object3D, angle: number, axis: Readonly, origin: Readonly): Object3D {\r\n return ObjectUtils.rotateAroundAxisWorldRadians(object, angle, axis, origin);\r\n}\r\n\r\n// Rotate Around Axis World\r\n\r\nexport function rotateAroundAxisWorld(object: Object3D, angle: number, axis: Readonly, origin: Readonly): Object3D {\r\n return ObjectUtils.rotateAroundAxisWorldDegrees(object, angle, axis, origin);\r\n}\r\n\r\nexport function rotateAroundAxisWorldDegrees(object: Object3D, angle: number, axis: Readonly, origin: Readonly): Object3D {\r\n return ObjectUtils.rotateAroundAxisWorldRadians(object, MathUtils.toRadians(angle), axis, origin);\r\n}\r\n\r\nexport const rotateAroundAxisWorldRadians = function () {\r\n const transformToRotate = Quat2Utils.create();\r\n const transformToRotateConjugate = Quat2Utils.create();\r\n const transformQuat = Quat2Utils.create();\r\n const defaultQuat = QuatUtils.create();\r\n return function rotateAroundAxisWorldRadians(object: Object3D, angle: number, axis: Readonly, origin: Readonly): Object3D {\r\n Quat2Utils.setPositionRotationQuat(transformToRotate, origin, defaultQuat);\r\n ObjectUtils.getTransformWorldQuat(object, transformQuat);\r\n Quat2Utils.conjugate(transformToRotate, transformToRotateConjugate);\r\n Quat2Utils.mul(transformToRotateConjugate, transformQuat, transformQuat);\r\n Quat2Utils.rotateAxisRadians(transformToRotate, angle, axis, transformToRotate);\r\n Quat2Utils.mul(transformToRotate, transformQuat, transformQuat);\r\n return ObjectUtils.setTransformWorldQuat(object, transformQuat);\r\n };\r\n}();\r\n\r\n// Rotate Around Axis Local\r\n\r\nexport function rotateAroundAxisLocal(object: Object3D, angle: number, axis: Readonly, origin: Readonly): Object3D {\r\n return ObjectUtils.rotateAroundAxisLocalDegrees(object, angle, axis, origin);\r\n}\r\n\r\nexport function rotateAroundAxisLocalDegrees(object: Object3D, angle: number, axis: Readonly, origin: Readonly): Object3D {\r\n return ObjectUtils.rotateAroundAxisLocalRadians(object, MathUtils.toRadians(angle), axis, origin);\r\n}\r\n\r\nexport const rotateAroundAxisLocalRadians = function () {\r\n const convertedPosition = Vec3Utils.create();\r\n const convertedAxis = Vec3Utils.create();\r\n return function rotateAroundAxisLocalRadians(object: Object3D, angle: number, axis: Readonly, origin: Readonly): Object3D {\r\n ObjectUtils.convertPositionLocalToWorld(object, origin, convertedPosition);\r\n ObjectUtils.convertDirectionLocalToWorld(object, axis, convertedAxis);\r\n return ObjectUtils.rotateAroundAxisWorldRadians(object, angle, convertedAxis, convertedPosition);\r\n };\r\n}();\r\n\r\n// Rotate Around Axis Object\r\n\r\nexport function rotateAroundAxisObject(object: Object3D, angle: number, axis: Readonly, origin: Readonly): Object3D {\r\n return ObjectUtils.rotateAroundAxisObjectDegrees(object, angle, axis, origin);\r\n}\r\n\r\nexport function rotateAroundAxisObjectDegrees(object: Object3D, angle: number, axis: Readonly, origin: Readonly): Object3D {\r\n return ObjectUtils.rotateAroundAxisObjectRadians(object, MathUtils.toRadians(angle), axis, origin);\r\n}\r\n\r\nexport const rotateAroundAxisObjectRadians = function () {\r\n const convertedPosition = Vec3Utils.create();\r\n const convertedAxis = Vec3Utils.create();\r\n return function rotateAroundAxisObjectRadians(object: Object3D, angle: number, axis: Readonly, origin: Readonly): Object3D {\r\n ObjectUtils.convertPositionObjectToWorld(object, origin, convertedPosition);\r\n ObjectUtils.convertDirectionObjectToWorld(object, axis, convertedAxis);\r\n return ObjectUtils.rotateAroundAxisWorldRadians(object, angle, convertedAxis, convertedPosition);\r\n };\r\n}();\r\n\r\n// Scale\r\n\r\n// #TODO For now it does not really make sense in WL to scale in world space or parent space\r\n// so there is no scale default function\r\n\r\nexport const scaleObject = function () {\r\n const vector = Vec3Utils.create();\r\n\r\n function scaleObject(object: Object3D, scale: Readonly): Object3D;\r\n function scaleObject(object: Object3D, uniformScale: number): Object3D;\r\n function scaleObject(object: Object3D, scale: Readonly | number): Object3D {\r\n if (isNaN(scale as number)) {\r\n return object.scaleLocal(scale as Vector3);\r\n } else {\r\n Vec3Utils.set(vector, scale as number);\r\n return object.scaleLocal(vector);\r\n }\r\n }\r\n\r\n return scaleObject;\r\n}();\r\n\r\n// Look At\r\n\r\nexport function lookAt(object: Object3D, position: Readonly, up?: Readonly): Object3D {\r\n return ObjectUtils.lookAtWorld(object, position, up);\r\n}\r\n\r\nexport const lookAtWorld = function () {\r\n const direction = Vec3Utils.create();\r\n return function lookAtWorld(object: Object3D, position: Readonly, up?: Readonly): Object3D {\r\n ObjectUtils.getPositionWorld(object, direction);\r\n Vec3Utils.sub(position, direction, direction);\r\n return ObjectUtils.lookToWorld(object, direction, up);\r\n };\r\n}();\r\n\r\nexport const lookAtLocal = function () {\r\n const direction = Vec3Utils.create();\r\n return function lookAtLocal(object: Object3D, position: Readonly, up?: Readonly): Object3D {\r\n ObjectUtils.getPositionLocal(object, direction);\r\n Vec3Utils.sub(position, direction, direction);\r\n return ObjectUtils.lookToLocal(object, direction, up);\r\n };\r\n}();\r\n\r\nexport function lookTo(object: Object3D, direction: Readonly, up?: Readonly): Object3D {\r\n return ObjectUtils.lookToWorld(object, direction, up);\r\n}\r\n\r\nexport const lookToWorld: (object: Object3D, direction: Readonly, up?: Readonly) => Object3D = function () {\r\n const internalUp = Vec3Utils.create();\r\n return function lookToWorld(object: Object3D, direction: Readonly, up: Readonly = ObjectUtils.getUpWorld(object, internalUp)): Object3D {\r\n return ObjectUtils.setForwardWorld(object, direction, up);\r\n };\r\n}();\r\n\r\nexport const lookToLocal: (object: Object3D, direction: Readonly, up?: Readonly) => Object3D = function () {\r\n const internalUp = Vec3Utils.create();\r\n return function lookToLocal(object: Object3D, direction: Readonly, up: Readonly = ObjectUtils.getUpLocal(object, internalUp)): Object3D {\r\n return ObjectUtils.setForwardLocal(object, direction, up);\r\n };\r\n}();\r\n\r\n// EXTRA\r\n\r\n// Convert Vector Object World\r\n\r\nexport const convertPositionObjectToWorld = function () {\r\n const matrix = Mat4Utils.create();\r\n\r\n function convertPositionObjectToWorld(object: Readonly, position: Readonly): Vector3;\r\n function convertPositionObjectToWorld(object: Readonly, position: Readonly, outPosition: T): T;\r\n function convertPositionObjectToWorld(object: Readonly, position: Readonly, outPosition: Vector3 | T = Vec3Utils.create()): Vector3 | T {\r\n ObjectUtils.getTransformWorldMatrix(object, matrix);\r\n Vec3Utils.transformMat4(position, matrix, outPosition);\r\n return outPosition;\r\n }\r\n\r\n return convertPositionObjectToWorld;\r\n}();\r\n\r\nexport const convertDirectionObjectToWorld = function () {\r\n const rotation = QuatUtils.create();\r\n\r\n function convertDirectionObjectToWorld(object: Readonly, direction: Readonly): Vector3;\r\n function convertDirectionObjectToWorld(object: Readonly, direction: Readonly, outDirection: T): T;\r\n function convertDirectionObjectToWorld(object: Readonly, direction: Readonly, outDirection: Vector3 | T = Vec3Utils.create()): Vector3 | T {\r\n ObjectUtils.getRotationWorldQuat(object, rotation);\r\n Vec3Utils.transformQuat(direction, rotation, outDirection);\r\n return outDirection;\r\n }\r\n\r\n return convertDirectionObjectToWorld;\r\n}();\r\n\r\nexport const convertPositionWorldToObject = function () {\r\n const matrix = Mat4Utils.create();\r\n\r\n function convertPositionWorldToObject(object: Readonly, position: Readonly): Vector3;\r\n function convertPositionWorldToObject(object: Readonly, position: Readonly, outPosition: T): T;\r\n function convertPositionWorldToObject(object: Readonly, position: Readonly, outPosition: Vector3 | T = Vec3Utils.create()): Vector3 | T {\r\n ObjectUtils.getTransformWorldMatrix(object, matrix);\r\n Mat4Utils.invert(matrix, matrix);\r\n Vec3Utils.transformMat4(position, matrix, outPosition);\r\n return outPosition;\r\n }\r\n\r\n return convertPositionWorldToObject;\r\n}();\r\n\r\nexport const convertDirectionWorldToObject = function () {\r\n const rotation = QuatUtils.create();\r\n\r\n function convertDirectionWorldToObject(object: Readonly, direction: Readonly): Vector3;\r\n function convertDirectionWorldToObject(object: Readonly, direction: Readonly, outDirection: T): T;\r\n function convertDirectionWorldToObject(object: Readonly, direction: Readonly, outDirection: Vector3 | T = Vec3Utils.create()): Vector3 | T {\r\n ObjectUtils.getRotationWorldQuat(object, rotation);\r\n QuatUtils.conjugate(rotation, rotation);\r\n Vec3Utils.transformQuat(direction, rotation, outDirection);\r\n return outDirection;\r\n }\r\n\r\n return convertDirectionWorldToObject;\r\n}();\r\n\r\n// Convert Vector Local World\r\n\r\nexport function convertPositionLocalToWorld(object: Readonly, position: Readonly): Vector3;\r\nexport function convertPositionLocalToWorld(object: Readonly, position: Readonly, outPosition: T): T;\r\nexport function convertPositionLocalToWorld(object: Readonly, position: Readonly, outPosition: Vector3 | T = Vec3Utils.create()): Vector3 | T {\r\n if (ObjectUtils.getParent(object) != null) {\r\n ObjectUtils.convertPositionObjectToWorld(ObjectUtils.getParent(object)!, position, outPosition);\r\n } else {\r\n Vec3Utils.copy(position, outPosition);\r\n }\r\n return outPosition;\r\n}\r\n\r\nexport function convertDirectionLocalToWorld(object: Readonly, direction: Readonly): Vector3;\r\nexport function convertDirectionLocalToWorld(object: Readonly, direction: Readonly, outDirection: T): T;\r\nexport function convertDirectionLocalToWorld(object: Readonly, direction: Readonly, outDirection: Vector3 | T = Vec3Utils.create()): Vector3 | T {\r\n if (ObjectUtils.getParent(object) != null) {\r\n ObjectUtils.convertDirectionObjectToWorld(ObjectUtils.getParent(object)!, direction, outDirection);\r\n } else {\r\n Vec3Utils.copy(direction, outDirection);\r\n }\r\n return outDirection;\r\n}\r\n\r\nexport function convertPositionWorldToLocal(object: Readonly, position: Readonly): Vector3;\r\nexport function convertPositionWorldToLocal(object: Readonly, position: Readonly, outPosition: T): T;\r\nexport function convertPositionWorldToLocal(object: Readonly, position: Readonly, outPosition: Vector3 | T = Vec3Utils.create()): Vector3 | T {\r\n if (ObjectUtils.getParent(object) != null) {\r\n ObjectUtils.convertPositionWorldToObject(ObjectUtils.getParent(object)!, position, outPosition);\r\n } else {\r\n Vec3Utils.copy(position, outPosition);\r\n }\r\n return outPosition;\r\n}\r\n\r\nexport function convertDirectionWorldToLocal(object: Readonly, direction: Readonly): Vector3;\r\nexport function convertDirectionWorldToLocal(object: Readonly, direction: Readonly, outDirection: T): T;\r\nexport function convertDirectionWorldToLocal(object: Readonly, direction: Readonly, outDirection: Vector3 | T = Vec3Utils.create()): Vector3 | T {\r\n if (ObjectUtils.getParent(object) != null) {\r\n ObjectUtils.convertDirectionWorldToObject(ObjectUtils.getParent(object)!, direction, outDirection);\r\n } else {\r\n Vec3Utils.copy(direction, outDirection);\r\n }\r\n return outDirection;\r\n}\r\n\r\n// Convert Vector Local Object\r\n\r\n// I need to use the converson to world and then local also use the parent scale that changes the position in local space\r\n\r\nexport function convertPositionObjectToLocal(object: Readonly, position: Readonly): Vector3;\r\nexport function convertPositionObjectToLocal(object: Readonly, position: Readonly, outPosition: T): T;\r\nexport function convertPositionObjectToLocal(object: Readonly, position: Readonly, outPosition: Vector3 | T = Vec3Utils.create()): Vector3 | T {\r\n ObjectUtils.convertPositionObjectToWorld(object, position, outPosition);\r\n ObjectUtils.convertPositionWorldToLocal(object, outPosition, outPosition);\r\n return outPosition;\r\n}\r\n\r\nexport function convertDirectionObjectToLocal(object: Readonly, direction: Readonly): Vector3;\r\nexport function convertDirectionObjectToLocal(object: Readonly, direction: Readonly, outDirection: T): T;\r\nexport function convertDirectionObjectToLocal(object: Readonly, direction: Readonly, outDirection: Vector3 | T = Vec3Utils.create()): Vector3 | T {\r\n ObjectUtils.convertDirectionObjectToWorld(object, direction, outDirection);\r\n ObjectUtils.convertDirectionWorldToLocal(object, outDirection, outDirection);\r\n return outDirection;\r\n}\r\n\r\nexport function convertPositionLocalToObject(object: Readonly, position: Readonly): Vector3;\r\nexport function convertPositionLocalToObject(object: Readonly, position: Readonly, outPosition: T): T;\r\nexport function convertPositionLocalToObject(object: Readonly, position: Readonly, outPosition: Vector3 | T = Vec3Utils.create()): Vector3 | T {\r\n ObjectUtils.convertPositionLocalToWorld(object, position, outPosition);\r\n ObjectUtils.convertPositionWorldToObject(object, outPosition, outPosition);\r\n return outPosition;\r\n}\r\n\r\nexport function convertDirectionLocalToObject(object: Readonly, direction: Readonly): Vector3;\r\nexport function convertDirectionLocalToObject(object: Readonly, direction: Readonly, outDirection: T): T;\r\nexport function convertDirectionLocalToObject(object: Readonly, direction: Readonly, outDirection: Vector3 | T = Vec3Utils.create()): Vector3 | T {\r\n ObjectUtils.convertDirectionLocalToWorld(object, direction, outDirection);\r\n ObjectUtils.convertDirectionWorldToObject(object, outDirection, outDirection);\r\n return outDirection;\r\n}\r\n\r\n// Convert Transform Object World\r\n\r\nexport function convertTransformObjectToWorld(object: Readonly, transform: Readonly): T;\r\nexport function convertTransformObjectToWorld(object: Readonly, transform: Readonly, outTransform: T): T;\r\nexport function convertTransformObjectToWorld(object: Readonly, transform: Readonly, outTransform?: T | U): T | U {\r\n return ObjectUtils.convertTransformObjectToWorldMatrix(object, transform, outTransform!);\r\n}\r\n\r\nexport const convertTransformObjectToWorldMatrix = function () {\r\n const convertTransform = Mat4Utils.create();\r\n const position = Vec3Utils.create();\r\n const scale = Vec3Utils.create();\r\n const inverseScale = Vec3Utils.create();\r\n const one = Vec3Utils.create(1);\r\n\r\n function convertTransformObjectToWorldMatrix(object: Readonly, transform: Readonly): T;\r\n function convertTransformObjectToWorldMatrix(object: Readonly, transform: Readonly, outTransform: T): T;\r\n function convertTransformObjectToWorldMatrix(object: Readonly, transform: Readonly, outTransform: T | U = Mat4Utils.clone(transform)): T | U {\r\n ObjectUtils.getTransformWorldMatrix(object, convertTransform);\r\n if (ObjectUtils.hasUniformScaleWorld(object)) {\r\n Mat4Utils.mul(convertTransform, transform, outTransform);\r\n } else {\r\n Vec3Utils.set(position, transform[12], transform[13], transform[14]);\r\n ObjectUtils.convertPositionObjectToWorld(object, position, position);\r\n\r\n Mat4Utils.getScale(convertTransform, scale);\r\n Vec3Utils.div(one, scale, inverseScale);\r\n Mat4Utils.scale(convertTransform, inverseScale, convertTransform);\r\n\r\n Mat4Utils.mul(convertTransform, transform, outTransform);\r\n Mat4Utils.scale(outTransform, scale, outTransform);\r\n\r\n outTransform[12] = position[0];\r\n outTransform[13] = position[1];\r\n outTransform[14] = position[2];\r\n outTransform[15] = 1;\r\n }\r\n return outTransform;\r\n }\r\n\r\n return convertTransformObjectToWorldMatrix;\r\n}();\r\n\r\nexport const convertTransformObjectToWorldQuat = function () {\r\n const position = Vec3Utils.create();\r\n const rotation = QuatUtils.create();\r\n\r\n function convertTransformObjectToWorldQuat(object: Readonly, transform: Readonly): T;\r\n function convertTransformObjectToWorldQuat(object: Readonly, transform: Readonly, outTransform: T): T;\r\n function convertTransformObjectToWorldQuat(object: Readonly, transform: Readonly, outTransform: T | U = Quat2Utils.clone(transform)): T | U {\r\n ObjectUtils.getRotationWorldQuat(object, rotation);\r\n QuatUtils.mul(rotation, transform, rotation);\r\n Quat2Utils.getPosition(transform, position);\r\n ObjectUtils.convertPositionObjectToWorld(object, position, position);\r\n Quat2Utils.setPositionRotationQuat(outTransform, position, rotation);\r\n return outTransform;\r\n }\r\n\r\n return convertTransformObjectToWorldQuat;\r\n}();\r\n\r\n\r\nexport function convertTransformWorldToObject(object: Readonly, transform: Readonly): T;\r\nexport function convertTransformWorldToObject(object: Readonly, transform: Readonly, outTransform: T): T;\r\nexport function convertTransformWorldToObject(object: Readonly, transform: Readonly, outTransform?: T | U): T | U {\r\n return ObjectUtils.convertTransformWorldToObjectMatrix(object, transform, outTransform!);\r\n}\r\n\r\nexport const convertTransformWorldToObjectMatrix = function () {\r\n const convertTransform = Mat4Utils.create();\r\n const position = Vec3Utils.create();\r\n const scale = Vec3Utils.create();\r\n const inverseScale = Vec3Utils.create();\r\n const one = Vec3Utils.create(1);\r\n\r\n function convertTransformWorldToObjectMatrix(object: Readonly, transform: Readonly): T;\r\n function convertTransformWorldToObjectMatrix(object: Readonly, transform: Readonly, outTransform: T): T;\r\n function convertTransformWorldToObjectMatrix(object: Readonly, transform: Readonly, outTransform: T | U = Mat4Utils.clone(transform)): T | U {\r\n ObjectUtils.getTransformWorldMatrix(object, convertTransform);\r\n if (ObjectUtils.hasUniformScaleWorld(object)) {\r\n Mat4Utils.invert(convertTransform, convertTransform);\r\n Mat4Utils.mul(convertTransform, transform, outTransform);\r\n } else {\r\n Vec3Utils.set(position, transform[12], transform[13], transform[14]);\r\n ObjectUtils.convertPositionWorldToObject(object, position, position);\r\n\r\n Mat4Utils.getScale(convertTransform, scale);\r\n Vec3Utils.div(one, scale, inverseScale);\r\n Mat4Utils.scale(convertTransform, inverseScale, convertTransform);\r\n\r\n Mat4Utils.invert(convertTransform, convertTransform);\r\n Mat4Utils.mul(convertTransform, transform, outTransform);\r\n Mat4Utils.scale(outTransform, inverseScale, outTransform);\r\n\r\n outTransform[12] = position[0];\r\n outTransform[13] = position[1];\r\n outTransform[14] = position[2];\r\n outTransform[15] = 1;\r\n }\r\n return outTransform;\r\n }\r\n\r\n return convertTransformWorldToObjectMatrix;\r\n}();\r\n\r\nexport const convertTransformWorldToObjectQuat = function () {\r\n const position = Vec3Utils.create();\r\n const rotation = QuatUtils.create();\r\n\r\n function convertTransformWorldToObjectQuat(object: Readonly, transform: Readonly): T;\r\n function convertTransformWorldToObjectQuat(object: Readonly, transform: Readonly, outTransform: T): T;\r\n function convertTransformWorldToObjectQuat(object: Readonly, transform: Readonly, outTransform: T | U = Quat2Utils.clone(transform)): T | U {\r\n ObjectUtils.getRotationWorldQuat(object, rotation);\r\n QuatUtils.conjugate(rotation, rotation);\r\n QuatUtils.mul(rotation, transform, rotation);\r\n Quat2Utils.getPosition(transform, position);\r\n ObjectUtils.convertPositionWorldToObject(object, position, position);\r\n Quat2Utils.setPositionRotationQuat(outTransform, position, rotation);\r\n return outTransform;\r\n }\r\n\r\n return convertTransformWorldToObjectQuat;\r\n}();\r\n\r\n// Convert Transform Local World\r\n\r\n\r\nexport function convertTransformLocalToWorld(object: Readonly, transform: Readonly): T;\r\nexport function convertTransformLocalToWorld(object: Readonly, transform: Readonly, outTransform: T): T;\r\nexport function convertTransformLocalToWorld(object: Readonly, transform: Readonly, outTransform?: T | U): T | U {\r\n return ObjectUtils.convertTransformLocalToWorldMatrix(object, transform, outTransform!);\r\n}\r\n\r\n\r\nexport function convertTransformLocalToWorldMatrix(object: Readonly, transform: Readonly): T;\r\nexport function convertTransformLocalToWorldMatrix(object: Readonly, transform: Readonly, outTransform: T): T;\r\nexport function convertTransformLocalToWorldMatrix(object: Readonly, transform: Readonly, outTransform: T | U = Mat4Utils.clone(transform)): T | U {\r\n if (ObjectUtils.getParent(object) != null) {\r\n ObjectUtils.convertTransformObjectToWorldMatrix(ObjectUtils.getParent(object)!, transform, outTransform!);\r\n } else {\r\n Mat4Utils.copy(transform, outTransform);\r\n }\r\n return outTransform!;\r\n}\r\n\r\nexport function convertTransformLocalToWorldQuat(object: Readonly, transform: Readonly): T;\r\nexport function convertTransformLocalToWorldQuat(object: Readonly, transform: Readonly, outTransform: T): T;\r\nexport function convertTransformLocalToWorldQuat(object: Readonly, transform: Readonly, outTransform: T | U = Quat2Utils.clone(transform)): T | U {\r\n if (ObjectUtils.getParent(object) != null) {\r\n ObjectUtils.convertTransformObjectToWorldQuat(ObjectUtils.getParent(object)!, transform, outTransform);\r\n } else {\r\n Quat2Utils.copy(transform, outTransform);\r\n }\r\n return outTransform;\r\n}\r\n\r\nexport function convertTransformWorldToLocal(object: Readonly, transform: Readonly): T;\r\nexport function convertTransformWorldToLocal(object: Readonly, transform: Readonly, outTransform: T): T;\r\nexport function convertTransformWorldToLocal(object: Readonly, transform: Readonly, outTransform?: T | U): T | U {\r\n return ObjectUtils.convertTransformWorldToLocalMatrix(object, transform, outTransform!);\r\n}\r\n\r\nexport function convertTransformWorldToLocalMatrix(object: Readonly, transform: Readonly): T;\r\nexport function convertTransformWorldToLocalMatrix(object: Readonly, transform: Readonly, outTransform: T): T;\r\nexport function convertTransformWorldToLocalMatrix(object: Readonly, transform: Readonly, outTransform: T | U = Mat4Utils.clone(transform)): T | U {\r\n if (ObjectUtils.getParent(object) != null) {\r\n ObjectUtils.convertTransformWorldToObjectMatrix(ObjectUtils.getParent(object)!, transform, outTransform!);\r\n } else {\r\n Mat4Utils.copy(transform, outTransform);\r\n }\r\n return outTransform!;\r\n}\r\n\r\nexport function convertTransformWorldToLocalQuat(object: Readonly, transform: Readonly): T;\r\nexport function convertTransformWorldToLocalQuat(object: Readonly, transform: Readonly, outTransform: T): T;\r\nexport function convertTransformWorldToLocalQuat(object: Readonly, transform: Readonly, outTransform: T | U = Quat2Utils.clone(transform)): T | U {\r\n if (ObjectUtils.getParent(object) != null) {\r\n ObjectUtils.convertTransformWorldToObjectQuat(ObjectUtils.getParent(object)!, transform, outTransform);\r\n } else {\r\n Quat2Utils.copy(transform, outTransform);\r\n }\r\n return outTransform;\r\n}\r\n\r\n// Convert Transform Object Local\r\n\r\n// I need to use the conversion to world and then local to also use the parent scale that changes the position in local space\r\n\r\n\r\nexport function convertTransformObjectToLocal(object: Readonly, transform: Readonly): T;\r\nexport function convertTransformObjectToLocal(object: Readonly, transform: Readonly, outTransform: T): T;\r\nexport function convertTransformObjectToLocal(object: Readonly, transform: Readonly, outTransform?: T | U): T | U {\r\n return ObjectUtils.convertTransformObjectToLocalMatrix(object, transform, outTransform!);\r\n}\r\n\r\nexport function convertTransformObjectToLocalMatrix(object: Readonly, transform: Readonly): T;\r\nexport function convertTransformObjectToLocalMatrix(object: Readonly, transform: Readonly, outTransform: T): T;\r\nexport function convertTransformObjectToLocalMatrix(object: Readonly, transform: Readonly, outTransform?: T | U): T | U {\r\n outTransform = ObjectUtils.convertTransformObjectToWorldMatrix(object, transform, outTransform!);\r\n ObjectUtils.convertTransformWorldToLocalMatrix(object, outTransform, outTransform);\r\n return outTransform!;\r\n}\r\n\r\nexport function convertTransformObjectToLocalQuat(object: Readonly, transform: Readonly): T;\r\nexport function convertTransformObjectToLocalQuat(object: Readonly, transform: Readonly, outTransform: T): T;\r\nexport function convertTransformObjectToLocalQuat(object: Readonly, transform: Readonly, outTransform?: T | U): T | U {\r\n outTransform = ObjectUtils.convertTransformObjectToWorldQuat(object, transform, outTransform!);\r\n ObjectUtils.convertTransformWorldToLocalQuat(object, outTransform, outTransform);\r\n return outTransform;\r\n}\r\n\r\nexport function convertTransformLocalToObject(object: Readonly, transform: Readonly): T;\r\nexport function convertTransformLocalToObject(object: Readonly, transform: Readonly, outTransform: T): T;\r\nexport function convertTransformLocalToObject(object: Readonly, transform: Readonly, outTransform?: T | U): T | U {\r\n return ObjectUtils.convertTransformLocalToObjectMatrix(object, transform, outTransform!);\r\n}\r\n\r\nexport function convertTransformLocalToObjectMatrix(object: Readonly, transform: Readonly): T;\r\nexport function convertTransformLocalToObjectMatrix(object: Readonly, transform: Readonly, outTransform: T): T;\r\nexport function convertTransformLocalToObjectMatrix(object: Readonly, transform: Readonly, outTransform?: T | U): T | U {\r\n outTransform = ObjectUtils.convertTransformLocalToWorldMatrix(object, transform, outTransform!);\r\n ObjectUtils.convertTransformWorldToObjectMatrix(object, outTransform, outTransform);\r\n return outTransform!;\r\n}\r\n\r\nexport function convertTransformLocalToObjectQuat(object: Readonly, transform: Readonly): T;\r\nexport function convertTransformLocalToObjectQuat(object: Readonly, transform: Readonly, outTransform: T): T;\r\nexport function convertTransformLocalToObjectQuat(object: Readonly, transform: Readonly, outTransform?: T | U): T | U {\r\n outTransform = ObjectUtils.convertTransformLocalToWorldQuat(object, transform, outTransform!);\r\n ObjectUtils.convertTransformWorldToObjectQuat(object, outTransform, outTransform);\r\n return outTransform;\r\n}\r\n\r\n// Parent\r\n\r\nexport const setParent = function () {\r\n const position = Vec3Utils.create();\r\n const rotation = QuatUtils.create();\r\n const scale = Vec3Utils.create();\r\n return function setParent(object: Object3D, newParent: Object3D, keepTransformWorld: boolean = true): Object3D {\r\n if (!keepTransformWorld) {\r\n object.parent = newParent;\r\n } else {\r\n ObjectUtils.getPositionWorld(object, position);\r\n ObjectUtils.getRotationWorldQuat(object, rotation);\r\n ObjectUtils.getScaleWorld(object, scale);\r\n object.parent = newParent;\r\n ObjectUtils.setScaleWorld(object, scale);\r\n ObjectUtils.setRotationWorldQuat(object, rotation);\r\n ObjectUtils.setPositionWorld(object, position);\r\n }\r\n\r\n return object;\r\n };\r\n}();\r\n\r\nexport function getParent(object: Readonly): Object3D | null {\r\n return object.parent;\r\n}\r\n\r\n// Component\r\n\r\nexport function addComponent(object: Object3D, classOrType: ComponentConstructor | string, paramsOrActive?: Record | boolean, active?: boolean): T | null {\r\n let params: Record | undefined = undefined;\r\n\r\n if (typeof paramsOrActive == \"boolean\") {\r\n params = {};\r\n params[\"active\"] = paramsOrActive;\r\n } else {\r\n if (paramsOrActive != null) {\r\n params = paramsOrActive;\r\n }\r\n\r\n if (active != null) {\r\n if (params == null) {\r\n params = {};\r\n }\r\n\r\n params[\"active\"] = active;\r\n }\r\n }\r\n\r\n return object.addComponent(classOrType as ComponentConstructor, params);\r\n}\r\n\r\nexport function getComponent(object: Readonly, classOrType: ComponentConstructor | string, index: number = 0): T | null {\r\n return ObjectUtils.getComponentHierarchy(object, classOrType, index);\r\n}\r\n\r\nexport function getComponentSelf(object: Readonly, classOrType: ComponentConstructor | string, index: number = 0): T | null {\r\n return object.getComponent(classOrType as ComponentConstructor, index);\r\n}\r\n\r\nexport function getComponentHierarchy(object: Readonly, classOrType: ComponentConstructor | string, index: number = 0): T | null {\r\n return ObjectUtils.getComponentHierarchyBreadth(object, classOrType, index);\r\n}\r\n\r\nexport function getComponentHierarchyBreadth(object: Readonly, classOrType: ComponentConstructor | string, index: number = 0): T | null {\r\n const objects = ObjectUtils.getHierarchyBreadth(object);\r\n return ObjectUtils.getComponentObjects(objects, classOrType, index);\r\n}\r\n\r\nexport function getComponentHierarchyDepth(object: Readonly, classOrType: ComponentConstructor | string, index: number = 0): T | null {\r\n const objects = ObjectUtils.getHierarchyDepth(object);\r\n return ObjectUtils.getComponentObjects(objects, classOrType, index);\r\n}\r\n\r\nexport function getComponentDescendants(object: Readonly, classOrType: ComponentConstructor | string, index: number = 0): T | null {\r\n return ObjectUtils.getComponentDescendantsBreadth(object, classOrType, index);\r\n}\r\n\r\nexport function getComponentDescendantsBreadth(object: Readonly, classOrType: ComponentConstructor | string, index: number = 0): T | null {\r\n const objects = ObjectUtils.getDescendantsBreadth(object);\r\n return ObjectUtils.getComponentObjects(objects, classOrType, index);\r\n}\r\n\r\nexport function getComponentDescendantsDepth(object: Readonly, classOrType: ComponentConstructor | string, index: number = 0): T | null {\r\n const objects = ObjectUtils.getDescendantsDepth(object);\r\n return ObjectUtils.getComponentObjects(objects, classOrType, index);\r\n}\r\n\r\nexport function getComponentChildren(object: Readonly, classOrType: ComponentConstructor | string, index: number = 0): T | null {\r\n const objects = ObjectUtils.getChildren(object);\r\n return ObjectUtils.getComponentObjects(objects, classOrType, index);\r\n}\r\n\r\nexport function getComponents(object: Readonly, classOrType?: ComponentConstructor | string): T[] {\r\n return ObjectUtils.getComponentsHierarchy(object, classOrType);\r\n}\r\n\r\nexport function getComponentsSelf(object: Readonly, classOrType?: ComponentConstructor | string): T[] {\r\n return object.getComponents(classOrType as ComponentConstructor);\r\n}\r\n\r\nexport function getComponentsHierarchy(object: Readonly, classOrType?: ComponentConstructor | string): T[] {\r\n return ObjectUtils.getComponentsHierarchyBreadth(object, classOrType);\r\n}\r\n\r\nexport function getComponentsHierarchyBreadth(object: Readonly, classOrType?: ComponentConstructor | string): T[] {\r\n const objects = ObjectUtils.getHierarchyBreadth(object);\r\n return ObjectUtils.getComponentsObjects(objects, classOrType);\r\n}\r\n\r\nexport function getComponentsHierarchyDepth(object: Readonly, classOrType?: ComponentConstructor | string): T[] {\r\n const objects = ObjectUtils.getHierarchyDepth(object);\r\n return ObjectUtils.getComponentsObjects(objects, classOrType);\r\n}\r\n\r\nexport function getComponentsDescendants(object: Readonly, classOrType?: ComponentConstructor | string): T[] {\r\n return ObjectUtils.getComponentsDescendantsBreadth(object, classOrType);\r\n}\r\n\r\nexport function getComponentsDescendantsBreadth(object: Readonly, classOrType?: ComponentConstructor | string): T[] {\r\n const objects = ObjectUtils.getDescendantsBreadth(object);\r\n return ObjectUtils.getComponentsObjects(objects, classOrType);\r\n}\r\n\r\nexport function getComponentsDescendantsDepth(object: Readonly, classOrType?: ComponentConstructor | string): T[] {\r\n const objects = ObjectUtils.getDescendantsDepth(object);\r\n return ObjectUtils.getComponentsObjects(objects, classOrType);\r\n}\r\n\r\nexport function getComponentsChildren(object: Readonly, classOrType?: ComponentConstructor | string): T[] {\r\n const objects = ObjectUtils.getChildren(object);\r\n return ObjectUtils.getComponentsObjects(objects, classOrType);\r\n}\r\n\r\n// Active\r\n\r\nexport function setActive(object: Object3D, active: boolean): Object3D {\r\n return ObjectUtils.setActiveHierarchy(object, active);\r\n}\r\n\r\nexport function setActiveSelf(object: Object3D, active: boolean): Object3D {\r\n object.active = active;\r\n return object;\r\n}\r\n\r\nexport function setActiveHierarchy(object: Object3D, active: boolean): Object3D {\r\n return ObjectUtils.setActiveHierarchyBreadth(object, active);\r\n}\r\n\r\nexport function setActiveHierarchyBreadth(object: Object3D, active: boolean): Object3D {\r\n const objects = ObjectUtils.getHierarchyBreadth(object);\r\n ObjectUtils.setActiveObjects(objects, active);\r\n\r\n return object;\r\n}\r\n\r\nexport function setActiveHierarchyDepth(object: Object3D, active: boolean): Object3D {\r\n const objects = ObjectUtils.getHierarchyDepth(object);\r\n ObjectUtils.setActiveObjects(objects, active);\r\n\r\n return object;\r\n}\r\n\r\nexport function setActiveDescendants(object: Object3D, active: boolean): Object3D {\r\n return ObjectUtils.setActiveDescendantsBreadth(object, active);\r\n}\r\n\r\nexport function setActiveDescendantsBreadth(object: Object3D, active: boolean): Object3D {\r\n const objects = ObjectUtils.getDescendantsBreadth(object);\r\n ObjectUtils.setActiveObjects(objects, active);\r\n\r\n return object;\r\n}\r\n\r\nexport function setActiveDescendantsDepth(object: Object3D, active: boolean): Object3D {\r\n const objects = ObjectUtils.getDescendantsDepth(object);\r\n ObjectUtils.setActiveObjects(objects, active);\r\n\r\n return object;\r\n}\r\n\r\nexport function setActiveChildren(object: Object3D, active: boolean): Object3D {\r\n const objects = ObjectUtils.getChildren(object);\r\n ObjectUtils.setActiveObjects(objects, active);\r\n\r\n return object;\r\n}\r\n\r\n// Uniform Scale\r\n\r\nexport function hasUniformScale(object: Readonly): boolean {\r\n return ObjectUtils.hasUniformScaleWorld(object);\r\n}\r\n\r\nexport const hasUniformScaleWorld = function () {\r\n const scale = Vec3Utils.create();\r\n return function hasUniformScaleWorld(object: Readonly): boolean {\r\n ObjectUtils.getScaleWorld(object, scale);\r\n return Math.abs(scale[0] - scale[1]) < MathUtils.EPSILON && Math.abs(scale[1] - scale[2]) < MathUtils.EPSILON && Math.abs(scale[0] - scale[2]) < MathUtils.EPSILON;\r\n };\r\n}();\r\n\r\nexport const hasUniformScaleLocal = function () {\r\n const scale = Vec3Utils.create();\r\n return function hasUniformScaleLocal(object: Readonly): boolean {\r\n ObjectUtils.getScaleLocal(object, scale);\r\n return Math.abs(scale[0] - scale[1]) < MathUtils.EPSILON && Math.abs(scale[1] - scale[2]) < MathUtils.EPSILON && Math.abs(scale[0] - scale[2]) < MathUtils.EPSILON;\r\n };\r\n}();\r\n\r\n// Clone\r\n\r\nexport const clone = function () {\r\n const scale = Vec3Utils.create();\r\n const transformQuat = Quat2Utils.create();\r\n return function clone(object: Readonly, cloneParams: Readonly = new ObjectCloneParams()): Object3D | null {\r\n let clonedObject = null;\r\n\r\n const cloneParent = cloneParams.myCloneParent === undefined ? ObjectUtils.getParent(object) : cloneParams.myCloneParent;\r\n\r\n if (cloneParams.myUseDefaultObjectClone) {\r\n clonedObject = object.clone(cloneParent);\r\n\r\n if (cloneParams.myDefaultComponentCloneAutoStartIfNotActive) {\r\n const clonedComponents = ObjectUtils.getComponents(clonedObject);\r\n for (const clonedComponent of clonedComponents) {\r\n\r\n // Trigger start, which otherwise would be called later, on first activation\r\n if (cloneParams.myDefaultComponentCloneAutoStartIfNotActive && !clonedComponent.active) {\r\n clonedComponent.active = true;\r\n clonedComponent.active = false;\r\n }\r\n }\r\n }\r\n } else if (ObjectUtils.isCloneable(object, cloneParams)) {\r\n const objectsToCloneData: [Object3D | null, Readonly][] = [];\r\n objectsToCloneData.push([cloneParent, object]);\r\n\r\n // Create the object hierarchy\r\n const objectsToCloneComponentsData: [Readonly, Object3D][] = [];\r\n while (objectsToCloneData.length > 0) {\r\n const cloneData = objectsToCloneData.shift();\r\n const parent = cloneData![0];\r\n const objectToClone = cloneData![1];\r\n\r\n const currentClonedObject = (parent != null) ? ObjectUtils.addChild(parent) : ObjectUtils.addChild(Globals.getRootObject(ObjectUtils.getEngine(object))!);\r\n ObjectUtils.setName(currentClonedObject, ObjectUtils.getName(objectToClone));\r\n\r\n ObjectUtils.setScaleLocal(currentClonedObject, ObjectUtils.getScaleLocal(objectToClone, scale));\r\n ObjectUtils.setTransformLocalQuat(currentClonedObject, ObjectUtils.getTransformLocalQuat(objectToClone, transformQuat));\r\n\r\n if (!cloneParams.myIgnoreComponents) {\r\n objectsToCloneComponentsData.push([objectToClone, currentClonedObject]);\r\n }\r\n\r\n if (!cloneParams.myIgnoreDescendants) {\r\n for (const child of ObjectUtils.getChildren(objectToClone)) {\r\n let cloneDescendant = false;\r\n if (cloneParams.myDescendantsToInclude.length > 0) {\r\n cloneDescendant = cloneParams.myDescendantsToInclude.find(descendantToInclude => descendantToInclude == child) != null;\r\n } else {\r\n cloneDescendant = cloneParams.myDescendantsToIgnore.find(descendantToIgnore => descendantToIgnore == child) == null;\r\n }\r\n\r\n if (cloneDescendant && cloneParams.myIgnoreDescendantCallback != null) {\r\n cloneDescendant = !cloneParams.myIgnoreDescendantCallback(child);\r\n }\r\n\r\n if (cloneDescendant) {\r\n objectsToCloneData.push([currentClonedObject, child]);\r\n }\r\n }\r\n }\r\n\r\n if (clonedObject == null) {\r\n clonedObject = currentClonedObject;\r\n }\r\n }\r\n\r\n // Get the components to clone\r\n const componentsToCloneData: [Component, Object3D][] = [];\r\n while (objectsToCloneComponentsData.length > 0) {\r\n const cloneData = objectsToCloneComponentsData.shift();\r\n const objectToClone = cloneData![0];\r\n const currentClonedObject = cloneData![1];\r\n\r\n const components = ObjectUtils.getComponentsSelf(objectToClone);\r\n for (const component of components) {\r\n if (ComponentUtils.isCloneable(component.type, cloneParams.myUseDefaultComponentClone || cloneParams.myUseDefaultComponentCloneAsFallback, ObjectUtils.getEngine(object))) {\r\n let cloneComponent = false;\r\n if (cloneParams.myComponentsToInclude.length > 0) {\r\n cloneComponent = cloneParams.myComponentsToInclude.indexOf(component.type) != -1;\r\n } else {\r\n cloneComponent = cloneParams.myComponentsToIgnore.indexOf(component.type) == -1;\r\n }\r\n\r\n if (cloneComponent && cloneParams.myIgnoreComponentCallback != null) {\r\n cloneComponent = !cloneParams.myIgnoreComponentCallback(component);\r\n }\r\n\r\n if (cloneComponent) {\r\n componentsToCloneData.push([component, currentClonedObject]);\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Clone the components\r\n const componentsToPostProcessData: [Component, Component][] = [];\r\n while (componentsToCloneData.length > 0) {\r\n const cloneData = componentsToCloneData.shift();\r\n const componentToClone = cloneData![0];\r\n const currentClonedObject = cloneData![1];\r\n let clonedComponent = null;\r\n\r\n if (!cloneParams.myUseDefaultComponentClone) {\r\n clonedComponent = ComponentUtils.clone(componentToClone, currentClonedObject, cloneParams.myComponentDeepCloneParams, cloneParams.myComponentCustomCloneParams, cloneParams.myUseDefaultComponentCloneAsFallback, cloneParams.myDefaultComponentCloneAutoStartIfNotActive);\r\n } else {\r\n clonedComponent = ComponentUtils.cloneDefault(componentToClone, currentClonedObject, cloneParams.myDefaultComponentCloneAutoStartIfNotActive);\r\n }\r\n\r\n if (clonedComponent != null) {\r\n if (ComponentUtils.hasClonePostProcess(componentToClone.type, ObjectUtils.getEngine(object))) {\r\n componentsToPostProcessData.push([componentToClone, clonedComponent]);\r\n }\r\n }\r\n }\r\n\r\n // Clone post process\r\n // Can be useful if you have to get some data from other components in the hierarchy which have now been created\r\n while (componentsToPostProcessData.length > 0) {\r\n const cloneData = componentsToPostProcessData.shift();\r\n const componentToClone = cloneData![0];\r\n const currentClonedComponent = cloneData![1];\r\n\r\n ComponentUtils.clonePostProcess(componentToClone, currentClonedComponent, cloneParams.myComponentDeepCloneParams, cloneParams.myComponentCustomCloneParams);\r\n }\r\n } else if (cloneParams.myUseDefaultObjectCloneAsFallback) {\r\n clonedObject = object.clone(cloneParent);\r\n\r\n if (cloneParams.myDefaultComponentCloneAutoStartIfNotActive) {\r\n const clonedComponents = ObjectUtils.getComponents(clonedObject);\r\n for (const clonedComponent of clonedComponents) {\r\n // Trigger start, which otherwise would be called later, on first activation\r\n if (cloneParams.myDefaultComponentCloneAutoStartIfNotActive && !clonedComponent.active) {\r\n clonedComponent.active = true;\r\n clonedComponent.active = false;\r\n }\r\n }\r\n }\r\n }\r\n\r\n return clonedObject;\r\n };\r\n}();\r\n\r\nexport function isCloneable(object: Readonly, cloneParams: Readonly = new ObjectCloneParams()): boolean {\r\n if (cloneParams.myIgnoreNonCloneable || cloneParams.myIgnoreComponents || cloneParams.myUseDefaultComponentClone || cloneParams.myUseDefaultComponentCloneAsFallback) {\r\n return true;\r\n }\r\n\r\n let cloneable = true;\r\n\r\n const objectsToClone: Readonly[] = [];\r\n objectsToClone.push(object);\r\n\r\n while (cloneable && objectsToClone.length > 0) {\r\n const objectToClone = objectsToClone.shift()!;\r\n\r\n const components = ObjectUtils.getComponentsSelf(objectToClone);\r\n for (const component of components) {\r\n let cloneComponent = false;\r\n if (cloneParams.myComponentsToInclude.length > 0) {\r\n cloneComponent = cloneParams.myComponentsToInclude.indexOf(component.type) != -1;\r\n } else {\r\n cloneComponent = cloneParams.myComponentsToIgnore.indexOf(component.type) == -1;\r\n }\r\n\r\n if (cloneComponent && cloneParams.myIgnoreComponentCallback != null) {\r\n cloneComponent = !cloneParams.myIgnoreComponentCallback(component);\r\n }\r\n\r\n if (cloneComponent && !ComponentUtils.isCloneable(component.type, false, ObjectUtils.getEngine(object))) {\r\n cloneable = false;\r\n break;\r\n }\r\n }\r\n\r\n if (cloneable && !cloneParams.myIgnoreDescendants) {\r\n for (const child of ObjectUtils.getChildren(objectToClone)) {\r\n let cloneDescendant = false;\r\n if (cloneParams.myDescendantsToInclude.length > 0) {\r\n cloneDescendant = cloneParams.myDescendantsToInclude.find(descendantToInclude => descendantToInclude == child) != null;\r\n } else {\r\n cloneDescendant = cloneParams.myDescendantsToIgnore.find(descendantToIgnore => descendantToIgnore == child) == null;\r\n }\r\n\r\n if (cloneDescendant && cloneParams.myIgnoreDescendantCallback != null) {\r\n cloneDescendant = !cloneParams.myIgnoreDescendantCallback(child);\r\n }\r\n\r\n if (cloneDescendant) {\r\n objectsToClone.push(child);\r\n }\r\n }\r\n }\r\n }\r\n\r\n return cloneable;\r\n}\r\n\r\n// To String\r\n\r\nexport function toString(object: Readonly): string {\r\n return ObjectUtils.toStringCompact(object);\r\n}\r\n\r\nexport const toStringExtended = function () {\r\n const tab = \" \";\r\n const newLine = \"\\n\";\r\n const startObject = \"{\";\r\n const endObject = \"}\";\r\n const nameLabel = \"name: \";\r\n const idLabel = \"id: \";\r\n const componentsLabel = \"components: \";\r\n const typeLabel = \"type: \";\r\n const childrenLabel = \"children: \";\r\n const startComponents = \"[\";\r\n const endComponents = \"]\";\r\n const startChildren = startComponents;\r\n const endChildren = endComponents;\r\n const separator = \",\";\r\n const newLineTab = newLine.concat(tab, tab);\r\n return function toStringExtended(object: Readonly): string {\r\n let objectString = \"\";\r\n objectString = objectString.concat(startObject, newLine);\r\n\r\n const components = ObjectUtils.getComponentsSelf(object);\r\n const children = ObjectUtils.getChildren(object);\r\n const name = ObjectUtils.getName(object);\r\n\r\n if (components.length > 0 || children.length > 0 || name.length > 0) {\r\n objectString = objectString.concat(tab, idLabel, ObjectUtils.getID(object).toString(), separator, newLine);\r\n } else {\r\n objectString = objectString.concat(tab, idLabel, ObjectUtils.getID(object).toString(), newLine);\r\n }\r\n\r\n if (name.length > 0) {\r\n if (components.length > 0 || children.length > 0) {\r\n objectString = objectString.concat(tab, nameLabel, ObjectUtils.getName(object), separator, newLine);\r\n } else {\r\n objectString = objectString.concat(tab, nameLabel, ObjectUtils.getName(object), newLine);\r\n }\r\n }\r\n\r\n if (components.length > 0) {\r\n objectString = objectString.concat(tab, componentsLabel, newLine, tab, startComponents, newLine);\r\n for (let i = 0; i < components.length; i++) {\r\n const component = components[i];\r\n\r\n objectString = objectString.concat(tab, tab, startObject, newLine);\r\n objectString = objectString.concat(tab, tab, tab, typeLabel, component.type, separator, newLine);\r\n objectString = objectString.concat(tab, tab, tab, idLabel, component._id.toString(), separator, newLine);\r\n objectString = objectString.concat(tab, tab, endObject);\r\n\r\n if (i != components.length - 1) {\r\n objectString = objectString.concat(separator, newLine);\r\n } else {\r\n objectString = objectString.concat(newLine);\r\n }\r\n }\r\n\r\n if (children.length > 0) {\r\n objectString = objectString.concat(tab, endComponents, separator, newLine);\r\n } else {\r\n objectString = objectString.concat(tab, endComponents, newLine);\r\n }\r\n }\r\n\r\n if (children.length > 0) {\r\n objectString = objectString.concat(tab, childrenLabel, newLine, tab, startChildren, newLine);\r\n for (let i = 0; i < children.length; i++) {\r\n const child = children[i];\r\n\r\n let childString = ObjectUtils.toStringExtended(child);\r\n childString = childString.replaceAll(newLine, newLineTab);\r\n childString = tab.concat(tab, childString);\r\n objectString = objectString.concat(childString);\r\n\r\n if (i != children.length - 1) {\r\n objectString = objectString.concat(separator, newLine);\r\n } else {\r\n objectString = objectString.concat(newLine);\r\n }\r\n }\r\n objectString = objectString.concat(tab, endChildren, newLine);\r\n }\r\n\r\n objectString = objectString.concat(endObject);\r\n\r\n return objectString;\r\n };\r\n}();\r\n\r\nexport const toStringCompact = function () {\r\n const tab = \" \";\r\n const newLine = \"\\n\";\r\n const emptyName = \"\";\r\n const nameLabel = \"name: \";\r\n const componentsLabel = \"components: \";\r\n const separator = \", \";\r\n const newLineTab = newLine.concat(tab);\r\n return function toStringCompact(object: Readonly): string {\r\n let objectString = \"\";\r\n\r\n const name = ObjectUtils.getName(object);\r\n if (name.length > 0) {\r\n objectString = objectString.concat(nameLabel, name);\r\n } else {\r\n objectString = objectString.concat(nameLabel, emptyName);\r\n }\r\n\r\n const components = ObjectUtils.getComponentsSelf(object);\r\n if (components.length > 0) {\r\n objectString = objectString.concat(separator, componentsLabel);\r\n for (let i = 0; i < components.length; i++) {\r\n const component = components[i];\r\n\r\n objectString = objectString.concat(component.type);\r\n\r\n if (i != components.length - 1) {\r\n objectString = objectString.concat(separator);\r\n }\r\n }\r\n }\r\n\r\n const children = ObjectUtils.getChildren(object);\r\n if (children.length > 0) {\r\n objectString = objectString.concat(newLine);\r\n for (let i = 0; i < children.length; i++) {\r\n const child = children[i];\r\n\r\n let childString = ObjectUtils.toStringCompact(child);\r\n childString = childString.replaceAll(newLine, newLineTab);\r\n childString = tab.concat(childString);\r\n objectString = objectString.concat(childString);\r\n\r\n if (i != children.length - 1) {\r\n objectString = objectString.concat(newLine);\r\n }\r\n }\r\n }\r\n\r\n return objectString;\r\n };\r\n}();\r\n\r\nexport function log(object: Readonly): Object3D {\r\n return ObjectUtils.logCompact(object);\r\n}\r\n\r\nexport function logExtended(object: Readonly): Object3D {\r\n console.log(ObjectUtils.toStringExtended(object));\r\n return object as Object3D;\r\n}\r\n\r\nexport function logCompact(object: Readonly): Object3D {\r\n console.log(ObjectUtils.toStringCompact(object));\r\n return object as Object3D;\r\n}\r\n\r\nexport function warn(object: Readonly): Object3D {\r\n return ObjectUtils.warnCompact(object);\r\n}\r\n\r\nexport function warnExtended(object: Readonly): Object3D {\r\n console.warn(ObjectUtils.toStringExtended(object));\r\n return object as Object3D;\r\n}\r\n\r\nexport function warnCompact(object: Readonly): Object3D {\r\n console.warn(ObjectUtils.toStringCompact(object));\r\n return object as Object3D;\r\n}\r\n\r\nexport function error(object: Readonly): Object3D {\r\n return ObjectUtils.errorCompact(object);\r\n}\r\n\r\nexport function errorExtended(object: Readonly): Object3D {\r\n console.error(ObjectUtils.toStringExtended(object));\r\n return object as Object3D;\r\n}\r\n\r\nexport function errorCompact(object: Readonly): Object3D {\r\n console.error(ObjectUtils.toStringCompact(object));\r\n return object as Object3D;\r\n}\r\n\r\n// Get Object By Name\r\n\r\nexport function getObjectByName(object: Readonly, name: string, isRegex: boolean = false, index: number = 0): Object3D | null {\r\n return ObjectUtils.getObjectByNameHierarchy(object, name, isRegex, index);\r\n}\r\n\r\nexport function getObjectByNameHierarchy(object: Readonly, name: string, isRegex: boolean = false, index: number = 0): Object3D | null {\r\n return ObjectUtils.getObjectByNameHierarchyBreadth(object, name, isRegex, index);\r\n}\r\n\r\nexport function getObjectByNameHierarchyBreadth(object: Readonly, name: string, isRegex: boolean = false, index: number = 0): Object3D | null {\r\n const objects = ObjectUtils.getHierarchyBreadth(object);\r\n return ObjectUtils.getObjectByNameObjects(objects, name, isRegex, index);\r\n}\r\n\r\nexport function getObjectByNameHierarchyDepth(object: Readonly, name: string, isRegex: boolean = false, index: number = 0): Object3D | null {\r\n const objects = ObjectUtils.getHierarchyDepth(object);\r\n return ObjectUtils.getObjectByNameObjects(objects, name, isRegex, index);\r\n}\r\n\r\nexport function getObjectByNameDescendants(object: Readonly, name: string, isRegex: boolean = false, index: number = 0): Object3D | null {\r\n return ObjectUtils.getObjectByNameDescendantsBreadth(object, name, isRegex, index);\r\n}\r\n\r\nexport function getObjectByNameDescendantsBreadth(object: Readonly, name: string, isRegex: boolean = false, index: number = 0): Object3D | null {\r\n const objects = ObjectUtils.getDescendantsBreadth(object);\r\n return ObjectUtils.getObjectByNameObjects(objects, name, isRegex, index);\r\n}\r\n\r\nexport function getObjectByNameDescendantsDepth(object: Readonly, name: string, isRegex: boolean = false, index: number = 0): Object3D | null {\r\n const objects = ObjectUtils.getDescendantsDepth(object);\r\n return ObjectUtils.getObjectByNameObjects(objects, name, isRegex, index);\r\n}\r\n\r\nexport function getObjectByNameChildren(object: Readonly, name: string, isRegex: boolean = false, index: number = 0): Object3D | null {\r\n const objects = ObjectUtils.getChildren(object);\r\n return ObjectUtils.getObjectByNameObjects(objects, name, isRegex, index);\r\n}\r\n\r\nexport function getObjectsByName(object: Readonly, name: string, isRegex: boolean = false): Object3D[] {\r\n return ObjectUtils.getObjectsByNameHierarchy(object, name, isRegex);\r\n}\r\n\r\nexport function getObjectsByNameHierarchy(object: Readonly, name: string, isRegex: boolean = false): Object3D[] {\r\n return ObjectUtils.getObjectsByNameHierarchyBreadth(object, name, isRegex);\r\n}\r\n\r\nexport function getObjectsByNameHierarchyBreadth(object: Readonly, name: string, isRegex: boolean = false): Object3D[] {\r\n const objects = ObjectUtils.getHierarchyBreadth(object);\r\n return ObjectUtils.getObjectsByNameObjects(objects, name, isRegex);\r\n}\r\n\r\nexport function getObjectsByNameHierarchyDepth(object: Readonly, name: string, isRegex: boolean = false): Object3D[] {\r\n const objects = ObjectUtils.getHierarchyDepth(object);\r\n return ObjectUtils.getObjectsByNameObjects(objects, name, isRegex);\r\n}\r\n\r\nexport function getObjectsByNameDescendants(object: Readonly, name: string, isRegex: boolean = false): Object3D[] {\r\n return ObjectUtils.getObjectsByNameDescendantsBreadth(object, name, isRegex);\r\n}\r\n\r\nexport function getObjectsByNameDescendantsBreadth(object: Readonly, name: string, isRegex: boolean = false): Object3D[] {\r\n const objects = ObjectUtils.getDescendantsBreadth(object);\r\n return ObjectUtils.getObjectsByNameObjects(objects, name, isRegex);\r\n}\r\n\r\nexport function getObjectsByNameDescendantsDepth(object: Readonly, name: string, isRegex: boolean = false): Object3D[] {\r\n const objects = ObjectUtils.getDescendantsDepth(object);\r\n return ObjectUtils.getObjectsByNameObjects(objects, name, isRegex);\r\n}\r\n\r\nexport function getObjectsByNameChildren(object: Readonly, name: string, isRegex: boolean = false): Object3D[] {\r\n const objects = ObjectUtils.getChildren(object);\r\n return ObjectUtils.getObjectsByNameObjects(objects, name, isRegex);\r\n}\r\n\r\n// Get Object By ID\r\n\r\nexport function getObjectByID(object: Readonly, id: number): Object3D | null {\r\n return ObjectUtils.getObjectByIDHierarchy(object, id);\r\n}\r\n\r\nexport function getObjectByIDHierarchy(object: Readonly, id: number): Object3D | null {\r\n return ObjectUtils.getObjectByIDHierarchyBreadth(object, id);\r\n}\r\n\r\nexport function getObjectByIDHierarchyBreadth(object: Readonly, id: number): Object3D | null {\r\n const objects = ObjectUtils.getHierarchyBreadth(object);\r\n return ObjectUtils.getObjectByIDObjects(objects, id);\r\n}\r\n\r\nexport function getObjectByIDHierarchyDepth(object: Readonly, id: number): Object3D | null {\r\n const objects = ObjectUtils.getHierarchyDepth(object);\r\n return ObjectUtils.getObjectByIDObjects(objects, id);\r\n}\r\n\r\nexport function getObjectByIDDescendants(object: Readonly, id: number): Object3D | null {\r\n return ObjectUtils.getObjectByIDDescendantsBreadth(object, id);\r\n}\r\n\r\nexport function getObjectByIDDescendantsBreadth(object: Readonly, id: number): Object3D | null {\r\n const objects = ObjectUtils.getDescendantsBreadth(object);\r\n return ObjectUtils.getObjectByIDObjects(objects, id);\r\n}\r\n\r\nexport function getObjectByIDDescendantsDepth(object: Readonly, id: number): Object3D | null {\r\n const objects = ObjectUtils.getDescendantsDepth(object);\r\n return ObjectUtils.getObjectByIDObjects(objects, id);\r\n}\r\n\r\nexport function getObjectByIDChildren(object: Readonly, id: number): Object3D | null {\r\n const objects = ObjectUtils.getChildren(object);\r\n return ObjectUtils.getObjectByIDObjects(objects, id);\r\n}\r\n\r\n// Get Hierarchy\r\n\r\nexport function getHierarchy(object: Readonly): Object3D[] {\r\n return ObjectUtils.getHierarchyBreadth(object);\r\n}\r\n\r\nexport function getHierarchyBreadth(object: Readonly): Object3D[] {\r\n const hierarchy = ObjectUtils.getDescendantsBreadth(object);\r\n\r\n hierarchy.unshift(object as Object3D);\r\n\r\n return hierarchy;\r\n}\r\n\r\nexport function getHierarchyDepth(object: Readonly): Object3D[] {\r\n const hierarchy = ObjectUtils.getDescendantsDepth(object);\r\n\r\n hierarchy.unshift(object as Object3D);\r\n\r\n return hierarchy;\r\n}\r\n\r\nexport function getDescendants(object: Readonly): Object3D[] {\r\n return ObjectUtils.getDescendantsBreadth(object);\r\n}\r\n\r\nexport function getDescendantsBreadth(object: Readonly): Object3D[] {\r\n const descendants: Object3D[] = [];\r\n\r\n const descendantsQueue = ObjectUtils.getChildren(object);\r\n\r\n while (descendantsQueue.length > 0) {\r\n const descendant = descendantsQueue.shift()!;\r\n descendants.push(descendant);\r\n for (const child of ObjectUtils.getChildren(descendant)) {\r\n descendantsQueue.push(child);\r\n }\r\n }\r\n\r\n return descendants;\r\n}\r\n\r\nexport function getDescendantsDepth(object: Readonly): Object3D[] {\r\n const descendants: Object3D[] = [];\r\n\r\n const children = ObjectUtils.getChildren(object);\r\n\r\n for (const child of children) {\r\n descendants.push(child);\r\n\r\n const childDescendants = ObjectUtils.getDescendantsDepth(child);\r\n for (let i = 0; i < childDescendants.length; i++) {\r\n descendants.push(childDescendants[i]);\r\n }\r\n }\r\n\r\n return descendants;\r\n}\r\n\r\nexport function getChildren(object: Readonly): Object3D[] {\r\n return object.children;\r\n}\r\n\r\nexport function getSelf(object: Readonly): Object3D {\r\n return object as Object3D;\r\n}\r\n\r\n// Cauldron\r\n\r\nexport function addChild(object: Object3D): Object3D {\r\n return object.addChild();\r\n}\r\n\r\nexport function getName(object: Readonly): string {\r\n return object.name;\r\n}\r\n\r\nexport function setName(object: Object3D, name: string): Object3D {\r\n object.name = name;\r\n return object;\r\n}\r\n\r\nexport function getEngine(object: Readonly): WonderlandEngine {\r\n return object.engine;\r\n}\r\n\r\nexport function getID(object: Readonly): number {\r\n return object.objectId;\r\n}\r\n\r\nexport function markDirty(object: Object3D): Object3D {\r\n object.setDirty();\r\n return object;\r\n}\r\n\r\nexport function isTransformChanged(object: Readonly): boolean {\r\n return object.changed;\r\n}\r\n\r\nexport function destroy(object: Object3D): void {\r\n object.destroy();\r\n}\r\n\r\nexport function reserveObjects(object: Readonly, count: number): Object3D {\r\n return ObjectUtils.reserveObjectsHierarchy(object, count);\r\n}\r\n\r\nexport function reserveObjectsSelf(object: Readonly, count: number): Object3D {\r\n const componentsAmountMap = ObjectUtils.getComponentsAmountMapSelf(object);\r\n _reserveObjects(count, componentsAmountMap, Globals.getScene(ObjectUtils.getEngine(object)));\r\n\r\n return object as Object3D;\r\n}\r\n\r\nexport function reserveObjectsHierarchy(object: Readonly, count: number): Object3D {\r\n const componentsAmountMap = ObjectUtils.getComponentsAmountMapHierarchy(object);\r\n _reserveObjects(count, componentsAmountMap, Globals.getScene(ObjectUtils.getEngine(object)));\r\n\r\n return object as Object3D;\r\n}\r\n\r\nexport function reserveObjectsDescendants(object: Readonly, count: number): Object3D {\r\n const componentsAmountMap = ObjectUtils.getComponentsAmountMapDescendants(object);\r\n _reserveObjects(count, componentsAmountMap, Globals.getScene(ObjectUtils.getEngine(object)));\r\n\r\n return object as Object3D;\r\n}\r\n\r\nexport function reserveObjectsChildren(object: Readonly, count: number): Object3D {\r\n const componentsAmountMap = ObjectUtils.getComponentsAmountMapChildren(object);\r\n _reserveObjects(count, componentsAmountMap, Globals.getScene(ObjectUtils.getEngine(object)));\r\n\r\n return object as Object3D;\r\n}\r\n\r\nexport function getComponentsAmountMap(object: Readonly): Map;\r\nexport function getComponentsAmountMap(object: Readonly, outComponentsAmountMap: Map): Map;\r\nexport function getComponentsAmountMap(object: Readonly, outComponentsAmountMap: Map = new Map()): Map {\r\n return ObjectUtils.getComponentsAmountMapHierarchy(object, outComponentsAmountMap);\r\n}\r\n\r\nexport function getComponentsAmountMapSelf(object: Readonly): Map;\r\nexport function getComponentsAmountMapSelf(object: Readonly, outComponentsAmountMap: Map): Map;\r\nexport function getComponentsAmountMapSelf(object: Readonly, outComponentsAmountMap: Map = new Map()): Map {\r\n let objectsAmount = outComponentsAmountMap.get(\"object\");\r\n if (objectsAmount == null) {\r\n objectsAmount = 0;\r\n }\r\n objectsAmount += 1;\r\n outComponentsAmountMap.set(\"object\", objectsAmount);\r\n\r\n const components = ObjectUtils.getComponentsSelf(object);\r\n for (const component of components) {\r\n const type = component.type;\r\n let typeAmount = outComponentsAmountMap.get(type);\r\n if (typeAmount == null) {\r\n typeAmount = 0;\r\n }\r\n typeAmount += 1;\r\n outComponentsAmountMap.set(type, typeAmount);\r\n }\r\n\r\n return outComponentsAmountMap;\r\n}\r\n\r\nexport function getComponentsAmountMapHierarchy(object: Readonly): Map;\r\nexport function getComponentsAmountMapHierarchy(object: Readonly, outComponentsAmountMap: Map): Map;\r\nexport function getComponentsAmountMapHierarchy(object: Readonly, outComponentsAmountMap: Map = new Map()): Map {\r\n const hierarchy = ObjectUtils.getHierarchy(object);\r\n\r\n for (const hierarchyObject of hierarchy) {\r\n ObjectUtils.getComponentsAmountMapSelf(hierarchyObject, outComponentsAmountMap);\r\n }\r\n\r\n return outComponentsAmountMap;\r\n}\r\n\r\nexport function getComponentsAmountMapDescendants(object: Readonly): Map;\r\nexport function getComponentsAmountMapDescendants(object: Readonly, outComponentsAmountMap: Map): Map;\r\nexport function getComponentsAmountMapDescendants(object: Readonly, outComponentsAmountMap: Map = new Map()): Map {\r\n const descendants = ObjectUtils.getDescendants(object);\r\n\r\n for (const descendant of descendants) {\r\n ObjectUtils.getComponentsAmountMapSelf(descendant, outComponentsAmountMap);\r\n }\r\n\r\n return outComponentsAmountMap;\r\n}\r\n\r\nexport function getComponentsAmountMapChildren(object: Readonly): Map;\r\nexport function getComponentsAmountMapChildren(object: Readonly, outComponentsAmountMap: Map): Map;\r\nexport function getComponentsAmountMapChildren(object: Readonly, outComponentsAmountMap: Map = new Map()): Map {\r\n const children = ObjectUtils.getChildren(object);\r\n\r\n for (const child of children) {\r\n ObjectUtils.getComponentsAmountMapSelf(child, outComponentsAmountMap);\r\n }\r\n\r\n return outComponentsAmountMap;\r\n}\r\n\r\n// GLOBALS\r\n\r\nexport function getComponentObjects(objects: Object3D[], classOrType: ComponentConstructor | string, index: number = 0): T | null {\r\n let component = null;\r\n\r\n for (const object of objects) {\r\n component = object.getComponent(classOrType as ComponentConstructor, index);\r\n\r\n if (component != null) {\r\n break;\r\n }\r\n }\r\n\r\n return component;\r\n}\r\n\r\nexport function getComponentsObjects(objects: Object3D[], classOrType?: ComponentConstructor | string): T[] {\r\n const components: T[] = [];\r\n\r\n for (const currentObject of objects) {\r\n const currentObjectComponents = currentObject.getComponents(classOrType as ComponentConstructor);\r\n\r\n for (let i = 0; i < currentObjectComponents.length; i++) {\r\n components.push(currentObjectComponents[i]);\r\n }\r\n }\r\n\r\n return components;\r\n}\r\n\r\nexport function setActiveObjects(objects: Object3D[], active: boolean): void {\r\n for (const currentObject of objects) {\r\n currentObject.active = active;\r\n }\r\n}\r\n\r\nexport function getObjectByNameObjects(objects: Object3D[], name: string, isRegex: boolean = false, index: number = 0): Object3D | null {\r\n let objectFound = null;\r\n\r\n let currentIndex = index;\r\n for (const currentObject of objects) {\r\n const objectName = ObjectUtils.getName(currentObject);\r\n if ((!isRegex && objectName == name) || (isRegex && objectName.match(name) != null)) {\r\n if (currentIndex == 0) {\r\n objectFound = currentObject;\r\n break;\r\n }\r\n\r\n currentIndex--;\r\n }\r\n }\r\n\r\n return objectFound;\r\n}\r\n\r\nexport function getObjectsByNameObjects(objects: Object3D[], name: string, isRegex: boolean = false): Object3D[] {\r\n const objectsFound: Object3D[] = [];\r\n\r\n for (const currentObject of objects) {\r\n const objectName = ObjectUtils.getName(currentObject);\r\n if ((!isRegex && objectName == name) || (isRegex && objectName.match(name) != null)) {\r\n objectsFound.push(currentObject);\r\n }\r\n }\r\n\r\n return objectsFound;\r\n}\r\n\r\nexport function getObjectByIDObjects(objects: Object3D[], id: number, index: number = 0): Object3D | null {\r\n let objectFound = null;\r\n\r\n let currentIndex = index;\r\n for (const currentObject of objects) {\r\n if (ObjectUtils.getID(currentObject) == id) {\r\n if (currentIndex == 0) {\r\n objectFound = currentObject;\r\n break;\r\n }\r\n\r\n currentIndex--;\r\n }\r\n }\r\n\r\n return objectFound;\r\n}\r\n\r\nexport function getObjectsByIDObjects(objects: Object3D[], id: number): Object3D[] {\r\n const objectsFound: Object3D[] = [];\r\n\r\n for (const currentObject of objects) {\r\n if (ObjectUtils.getID(currentObject) == id) {\r\n objectsFound.push(currentObject);\r\n }\r\n }\r\n\r\n return objectsFound;\r\n}\r\n\r\nexport function wrapObject(id: number, engine: Readonly | null = Globals.getMainEngine()): Object3D | null {\r\n return engine != null ? Globals.getScene(engine).wrap(id) : null;\r\n}\r\n\r\n/**\r\n * How to use\r\n * \r\n * By default the functions work on `World` space, rotations are in `Degrees` and transforms are `Matrix4` (and not `Quat2`) \r\n * For functions that work with rotations, `Matrix` means `Matrix3` and `Quat` means `Quat` \r\n * For functions that work with transforms, `Matrix` means `Matrix4` and `Quat` means `Quat2`\r\n * \r\n * \r\n * You can add a suffix like `World`/`Local`/`Object` at the end of some functions to specify the space, example: \r\n * - `getPositionLocal` to get the position in local space (parent space) \r\n * - `translateObject` to translate in object space\r\n * \r\n * \r\n * For rotations u can add a suffix like `Degrees`/`Radians`/`Quat`/`Matrix` to use a specific version, example: \r\n * - `getRotationDegrees` \r\n * - `setRotationLocalMatrix` \r\n * - `rotateWorldQuat`\r\n * \r\n * \r\n * For transform u can add a suffix like `Quat`/`Matrix` to use a specific version, example: \r\n * - `getTransformQuat` \r\n * - `setTransformWorldMatrix`\r\n * \r\n * \r\n * Some functions let you specify if u want them to work on the `Hierarchy`/`Descendants`/`Children`/`Self` where: \r\n * - `Self`: the current object only \r\n * - `Children`: direct children of the object \r\n * - `Descendants`: all the children of the object, including child of child and so on \r\n * - `Hierarchy`: `Descendants` plus the current object\r\n * \r\n * Examples: \r\n * - `getComponent` \r\n * - `getComponentHierarchy` \r\n * - `getComponentsAmountMapDescendants` \r\n * - `setActiveChildren` \r\n * - `setActiveSelf`\r\n * \r\n * By default the functions work on the `Hierarchy`\r\n * \r\n * On some of the functions where u can specify `Hierarchy`/`Descendants` u can also specify if the algorithm should explore by `Breadth`/`Depth`, example: \r\n * - `getComponentHierarchyBreadth` \r\n * - `setActiveDescendantsDepth`\r\n * \r\n * By default the functions explore by `Breadth`\r\n * \r\n * The functions leave u the choice of forwarding an out parameter or just get the return value, example: \r\n * - `let position = ObjectUtils.getPosition(object)` \r\n * - `ObjectUtils.getPosition(object, position)` \r\n * - the out parameter is always the last one\r\n * \r\n * \r\n * If a method require an engine parameter, u can always avoid specifying it and it will by default use the current main engine \r\n * If a method require a scene parameter, u can always avoid specifying it and it will by default use the scene from the current main engine\r\n */\r\nexport const ObjectUtils = {\r\n getPosition,\r\n getPositionWorld,\r\n getPositionLocal,\r\n getRotation,\r\n getRotationDegrees,\r\n getRotationRadians,\r\n getRotationMatrix,\r\n getRotationQuat,\r\n getRotationWorld,\r\n getRotationWorldDegrees,\r\n getRotationWorldRadians,\r\n getRotationWorldMatrix,\r\n getRotationWorldQuat,\r\n getRotationLocal,\r\n getRotationLocalDegrees,\r\n getRotationLocalRadians,\r\n getRotationLocalMatrix,\r\n getRotationLocalQuat,\r\n getScale,\r\n getScaleWorld,\r\n getScaleLocal,\r\n getTransform,\r\n getTransformMatrix,\r\n getTransformQuat,\r\n getTransformWorld,\r\n getTransformWorldMatrix,\r\n getTransformWorldQuat,\r\n getTransformLocal,\r\n getTransformLocalMatrix,\r\n getTransformLocalQuat,\r\n getAxes,\r\n getAxesWorld,\r\n getAxesLocal,\r\n getForward,\r\n getForwardWorld,\r\n getForwardLocal,\r\n getBackward,\r\n getBackwardWorld,\r\n getBackwardLocal,\r\n getUp,\r\n getUpWorld,\r\n getUpLocal,\r\n getDown,\r\n getDownWorld,\r\n getDownLocal,\r\n getLeft,\r\n getLeftWorld,\r\n getLeftLocal,\r\n getRight,\r\n getRightWorld,\r\n getRightLocal,\r\n setPosition,\r\n setPositionWorld,\r\n setPositionLocal,\r\n setRotation,\r\n setRotationDegrees,\r\n setRotationRadians,\r\n setRotationMatrix,\r\n setRotationQuat,\r\n setRotationWorld,\r\n setRotationWorldDegrees,\r\n setRotationWorldRadians,\r\n setRotationWorldMatrix,\r\n setRotationWorldQuat,\r\n setRotationLocal,\r\n setRotationLocalDegrees,\r\n setRotationLocalRadians,\r\n setRotationLocalMatrix,\r\n setRotationLocalQuat,\r\n setScale,\r\n setScaleWorld,\r\n setScaleLocal,\r\n setAxes,\r\n setAxesWorld,\r\n setAxesLocal,\r\n setForward,\r\n setForwardWorld,\r\n setForwardLocal,\r\n setBackward,\r\n setBackwardWorld,\r\n setBackwardLocal,\r\n setUp,\r\n setUpWorld,\r\n setUpLocal,\r\n setDown,\r\n setDownWorld,\r\n setDownLocal,\r\n setLeft,\r\n setLeftWorld,\r\n setLeftLocal,\r\n setRight,\r\n setRightWorld,\r\n setRightLocal,\r\n setTransform,\r\n setTransformMatrix,\r\n setTransformQuat,\r\n setTransformWorld,\r\n setTransformWorldMatrix,\r\n setTransformWorldQuat,\r\n setTransformLocal,\r\n setTransformLocalMatrix,\r\n setTransformLocalQuat,\r\n resetPosition,\r\n resetPositionWorld,\r\n resetPositionLocal,\r\n resetRotation,\r\n resetRotationWorld,\r\n resetRotationLocal,\r\n resetScale,\r\n resetScaleWorld,\r\n resetScaleLocal,\r\n resetTransform,\r\n resetTransformWorld,\r\n resetTransformLocal,\r\n translate,\r\n translateWorld,\r\n translateLocal,\r\n translateObject,\r\n translateAxis,\r\n translateAxisWorld,\r\n translateAxisLocal,\r\n translateAxisObject,\r\n rotate,\r\n rotateDegrees,\r\n rotateRadians,\r\n rotateMatrix,\r\n rotateQuat,\r\n rotateWorld,\r\n rotateWorldDegrees,\r\n rotateWorldRadians,\r\n rotateWorldMatrix,\r\n rotateWorldQuat,\r\n rotateLocal,\r\n rotateLocalDegrees,\r\n rotateLocalRadians,\r\n rotateLocalMatrix,\r\n rotateLocalQuat,\r\n rotateObject,\r\n rotateObjectDegrees,\r\n rotateObjectRadians,\r\n rotateObjectMatrix,\r\n rotateObjectQuat,\r\n rotateAxis,\r\n rotateAxisDegrees,\r\n rotateAxisRadians,\r\n rotateAxisWorld,\r\n rotateAxisWorldDegrees,\r\n rotateAxisWorldRadians,\r\n rotateAxisLocal,\r\n rotateAxisLocalDegrees,\r\n rotateAxisLocalRadians,\r\n rotateAxisObject,\r\n rotateAxisObjectDegrees,\r\n rotateAxisObjectRadians,\r\n rotateAround,\r\n rotateAroundDegrees,\r\n rotateAroundRadians,\r\n rotateAroundMatrix,\r\n rotateAroundQuat,\r\n rotateAroundWorld,\r\n rotateAroundWorldDegrees,\r\n rotateAroundWorldRadians,\r\n rotateAroundWorldMatrix,\r\n rotateAroundWorldQuat,\r\n rotateAroundLocal,\r\n rotateAroundLocalDegrees,\r\n rotateAroundLocalRadians,\r\n rotateAroundLocalMatrix,\r\n rotateAroundLocalQuat,\r\n rotateAroundObject,\r\n rotateAroundObjectDegrees,\r\n rotateAroundObjectRadians,\r\n rotateAroundObjectMatrix,\r\n rotateAroundObjectQuat,\r\n rotateAroundAxis,\r\n rotateAroundAxisDegrees,\r\n rotateAroundAxisRadians,\r\n rotateAroundAxisWorld,\r\n rotateAroundAxisWorldDegrees,\r\n rotateAroundAxisWorldRadians,\r\n rotateAroundAxisLocal,\r\n rotateAroundAxisLocalDegrees,\r\n rotateAroundAxisLocalRadians,\r\n rotateAroundAxisObject,\r\n rotateAroundAxisObjectDegrees,\r\n rotateAroundAxisObjectRadians,\r\n scaleObject,\r\n lookAt,\r\n lookAtWorld,\r\n lookAtLocal,\r\n lookTo,\r\n lookToWorld,\r\n lookToLocal,\r\n convertPositionObjectToWorld,\r\n convertDirectionObjectToWorld,\r\n convertPositionWorldToObject,\r\n convertDirectionWorldToObject,\r\n convertPositionLocalToWorld,\r\n convertDirectionLocalToWorld,\r\n convertPositionWorldToLocal,\r\n convertDirectionWorldToLocal,\r\n convertPositionObjectToLocal,\r\n convertDirectionObjectToLocal,\r\n convertPositionLocalToObject,\r\n convertDirectionLocalToObject,\r\n convertTransformObjectToWorld,\r\n convertTransformObjectToWorldMatrix,\r\n convertTransformObjectToWorldQuat,\r\n convertTransformWorldToObject,\r\n convertTransformWorldToObjectMatrix,\r\n convertTransformWorldToObjectQuat,\r\n convertTransformLocalToWorld,\r\n convertTransformLocalToWorldMatrix,\r\n convertTransformLocalToWorldQuat,\r\n convertTransformWorldToLocal,\r\n convertTransformWorldToLocalMatrix,\r\n convertTransformWorldToLocalQuat,\r\n convertTransformObjectToLocal,\r\n convertTransformObjectToLocalMatrix,\r\n convertTransformObjectToLocalQuat,\r\n convertTransformLocalToObject,\r\n convertTransformLocalToObjectMatrix,\r\n convertTransformLocalToObjectQuat,\r\n setParent,\r\n getParent,\r\n addComponent,\r\n getComponent,\r\n getComponentSelf,\r\n getComponentHierarchy,\r\n getComponentHierarchyBreadth,\r\n getComponentHierarchyDepth,\r\n getComponentDescendants,\r\n getComponentDescendantsBreadth,\r\n getComponentDescendantsDepth,\r\n getComponentChildren,\r\n getComponents,\r\n getComponentsSelf,\r\n getComponentsHierarchy,\r\n getComponentsHierarchyBreadth,\r\n getComponentsHierarchyDepth,\r\n getComponentsDescendants,\r\n getComponentsDescendantsBreadth,\r\n getComponentsDescendantsDepth,\r\n getComponentsChildren,\r\n setActive,\r\n setActiveSelf,\r\n setActiveHierarchy,\r\n setActiveHierarchyBreadth,\r\n setActiveHierarchyDepth,\r\n setActiveDescendants,\r\n setActiveDescendantsBreadth,\r\n setActiveDescendantsDepth,\r\n setActiveChildren,\r\n hasUniformScale,\r\n hasUniformScaleWorld,\r\n hasUniformScaleLocal,\r\n clone,\r\n isCloneable,\r\n toString,\r\n toStringExtended,\r\n toStringCompact,\r\n log,\r\n logExtended,\r\n logCompact,\r\n warn,\r\n warnExtended,\r\n warnCompact,\r\n error,\r\n errorExtended,\r\n errorCompact,\r\n getObjectByName,\r\n getObjectByNameHierarchy,\r\n getObjectByNameHierarchyBreadth,\r\n getObjectByNameHierarchyDepth,\r\n getObjectByNameDescendants,\r\n getObjectByNameDescendantsBreadth,\r\n getObjectByNameDescendantsDepth,\r\n getObjectByNameChildren,\r\n getObjectsByName,\r\n getObjectsByNameHierarchy,\r\n getObjectsByNameHierarchyBreadth,\r\n getObjectsByNameHierarchyDepth,\r\n getObjectsByNameDescendants,\r\n getObjectsByNameDescendantsBreadth,\r\n getObjectsByNameDescendantsDepth,\r\n getObjectsByNameChildren,\r\n getObjectByID,\r\n getObjectByIDHierarchy,\r\n getObjectByIDHierarchyBreadth,\r\n getObjectByIDHierarchyDepth,\r\n getObjectByIDDescendants,\r\n getObjectByIDDescendantsBreadth,\r\n getObjectByIDDescendantsDepth,\r\n getObjectByIDChildren,\r\n getHierarchy,\r\n getHierarchyBreadth,\r\n getHierarchyDepth,\r\n getDescendants,\r\n getDescendantsBreadth,\r\n getDescendantsDepth,\r\n getChildren,\r\n getSelf,\r\n addChild,\r\n getName,\r\n setName,\r\n getEngine,\r\n getID,\r\n markDirty,\r\n isTransformChanged,\r\n destroy,\r\n reserveObjects,\r\n reserveObjectsSelf,\r\n reserveObjectsHierarchy,\r\n reserveObjectsDescendants,\r\n reserveObjectsChildren,\r\n getComponentsAmountMap,\r\n getComponentsAmountMapSelf,\r\n getComponentsAmountMapHierarchy,\r\n getComponentsAmountMapDescendants,\r\n getComponentsAmountMapChildren,\r\n getComponentObjects,\r\n getComponentsObjects,\r\n setActiveObjects,\r\n getObjectByNameObjects,\r\n getObjectsByNameObjects,\r\n getObjectByIDObjects,\r\n getObjectsByIDObjects,\r\n wrapObject\r\n} as const;\r\n\r\n\r\n\r\nfunction _reserveObjects(count: number, componentsAmountMap: Readonly>, scene: Scene): void {\r\n if (componentsAmountMap.has(\"object\")) {\r\n const objectsToReserve = componentsAmountMap.get(\"object\")! * count;\r\n\r\n const componentsToReserve: Record = {};\r\n for (const [componentName, componentCount] of componentsAmountMap.entries()) {\r\n if (componentName != \"object\") {\r\n componentsToReserve[componentName] = componentCount * count;\r\n }\r\n }\r\n\r\n scene.reserveObjects(objectsToReserve, componentsToReserve);\r\n }\r\n}", "import { MeshComponent, TextComponent } from \"@wonderlandengine/api\";\r\nimport { ComponentDeepCloneParams, ComponentUtils } from \"./component_utils.js\";\r\nimport { MeshUtils } from \"./mesh_utils.js\";\r\n\r\nexport function cloneMesh(componentToClone, targetObject, deepCloneParams = new ComponentDeepCloneParams(), customCloneParams = null) {\r\n let clonedComponent = ComponentUtils.cloneDefault(componentToClone, targetObject, true);\r\n\r\n if (deepCloneParams.isDeepCloneComponentVariable(MeshComponent.TypeName, \"material\")) {\r\n if (componentToClone.material != null) {\r\n clonedComponent.material = componentToClone.material.clone();\r\n }\r\n }\r\n\r\n if (deepCloneParams.isDeepCloneComponentVariable(MeshComponent.TypeName, \"mesh\")) {\r\n clonedComponent.mesh = MeshUtils.clone(componentToClone.mesh);\r\n }\r\n\r\n return clonedComponent;\r\n}\r\n\r\nexport function cloneCollision(componentToClone, targetObject, deepCloneParams = new ComponentDeepCloneParams(), customCloneParams = null) {\r\n let clonedComponent = ComponentUtils.cloneDefault(componentToClone, targetObject);\r\n\r\n return clonedComponent;\r\n}\r\n\r\nexport function cloneText(componentToClone, targetObject, deepCloneParams = new ComponentDeepCloneParams(), customCloneParams = null) {\r\n let clonedComponent = ComponentUtils.cloneDefault(componentToClone, targetObject);\r\n\r\n if (deepCloneParams.isDeepCloneComponentVariable(TextComponent.TypeName, \"material\")) {\r\n if (componentToClone.material != null) {\r\n clonedComponent.material = componentToClone.material.clone();\r\n }\r\n }\r\n\r\n return clonedComponent;\r\n}\r\n\r\nexport function clonePhysX(componentToClone, targetObject, deepCloneParams = new ComponentDeepCloneParams(), customCloneParams = null) {\r\n let clonedComponent = ComponentUtils.cloneDefault(componentToClone, targetObject);\r\n\r\n return clonedComponent;\r\n}\r\n\r\nexport let WLComponentDefaultCloneCallbacks = {\r\n cloneMesh,\r\n cloneCollision,\r\n cloneText,\r\n clonePhysX\r\n};", "import { MeshAttribute, MeshIndexType } from \"@wonderlandengine/api\";\r\nimport { vec2_create, vec3_create, vec4_create } from \"../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Globals } from \"../../../pp/globals.js\";\r\n\r\nexport class MeshCreationVertexParams {\r\n\r\n constructor() {\r\n this.myPosition = null; // @Vec3\r\n this.myTextureCoordinates = null; // @Vec2\r\n this.myNormal = null; // @Vec3\r\n this.myColor = null; // @Vec4\r\n }\r\n}\r\n\r\nexport class MeshCreationTriangleParams {\r\n\r\n constructor() {\r\n this.myIndexes = new Uint32Array(3);\r\n }\r\n}\r\n\r\nexport class MeshCreationParams {\r\n\r\n constructor(engine = Globals.getMainEngine()) {\r\n this.myVertexes = [];\r\n this.myTriangles = [];\r\n\r\n this.myEngine = engine;\r\n }\r\n}\r\n\r\nexport function create(meshCreationParams) {\r\n let indexData = [];\r\n for (let triangle of meshCreationParams.myTriangles) {\r\n indexData.push(triangle.myIndexes[0]);\r\n indexData.push(triangle.myIndexes[1]);\r\n indexData.push(triangle.myIndexes[2]);\r\n }\r\n\r\n let indexDataUnsignedInt = new Uint32Array(indexData.length);\r\n indexDataUnsignedInt.pp_copy(indexData);\r\n\r\n let vertexCount = meshCreationParams.myVertexes.length;\r\n let mesh = meshCreationParams.myEngine.meshes.create({\r\n vertexCount: vertexCount,\r\n indexData: indexDataUnsignedInt,\r\n indexType: MeshIndexType.UnsignedInt\r\n });\r\n\r\n let positionAttribute = null;\r\n let textureCoordinatesAttribute = null;\r\n let normalAttribute = null;\r\n let colorAttribute = null;\r\n\r\n try {\r\n positionAttribute = mesh.attribute(MeshAttribute.Position);\r\n } catch (error) {\r\n positionAttribute = null;\r\n }\r\n\r\n try {\r\n textureCoordinatesAttribute = mesh.attribute(MeshAttribute.TextureCoordinate);\r\n } catch (error) {\r\n textureCoordinatesAttribute = null;\r\n }\r\n\r\n try {\r\n normalAttribute = mesh.attribute(MeshAttribute.Normal);\r\n } catch (error) {\r\n normalAttribute = null;\r\n }\r\n\r\n try {\r\n colorAttribute = mesh.attribute(MeshAttribute.Color);\r\n } catch (error) {\r\n colorAttribute = null;\r\n }\r\n\r\n for (let i = 0; i < meshCreationParams.myVertexes.length; i++) {\r\n let vertex = meshCreationParams.myVertexes[i];\r\n if (positionAttribute != null && vertex.myPosition) {\r\n positionAttribute.set(i, vertex.myPosition);\r\n }\r\n if (textureCoordinatesAttribute != null && vertex.myTextureCoordinates) {\r\n textureCoordinatesAttribute.set(i, vertex.myTextureCoordinates);\r\n }\r\n if (normalAttribute != null && vertex.myNormal) {\r\n normalAttribute.set(i, vertex.myNormal);\r\n }\r\n if (colorAttribute != null && vertex.myColor) {\r\n colorAttribute.set(i, vertex.myColor);\r\n }\r\n }\r\n\r\n return mesh;\r\n}\r\n\r\nexport let clone = function () {\r\n let position = vec3_create();\r\n let textureCoordinates = vec2_create();\r\n let normal = vec3_create();\r\n let color = vec4_create();\r\n\r\n return function clone(mesh) {\r\n if (mesh == null) {\r\n return null;\r\n }\r\n\r\n let clonedIndexData = mesh.indexData.pp_clone();\r\n\r\n let clonedMesh = mesh.engine.meshes.create({\r\n vertexCount: mesh.vertexCount,\r\n indexData: clonedIndexData,\r\n indexType: MeshIndexType.UnsignedInt\r\n });\r\n\r\n let positionAttribute = null;\r\n let textureCoordinatesAttribute = null;\r\n let normalAttribute = null;\r\n let colorAttribute = null;\r\n\r\n let clonedPositionAttribute = null;\r\n let clonedTextureCoordinatesAttribute = null;\r\n let clonedNormalAttribute = null;\r\n let clonedColorAttribute = null;\r\n\r\n\r\n try {\r\n positionAttribute = mesh.attribute(MeshAttribute.Position);\r\n clonedPositionAttribute = clonedMesh.attribute(MeshAttribute.Position);\r\n } catch (error) {\r\n positionAttribute = null;\r\n clonedPositionAttribute = null;\r\n }\r\n\r\n try {\r\n textureCoordinatesAttribute = mesh.attribute(MeshAttribute.TextureCoordinate);\r\n clonedTextureCoordinatesAttribute = clonedMesh.attribute(MeshAttribute.TextureCoordinate);\r\n } catch (error) {\r\n textureCoordinatesAttribute = null;\r\n clonedTextureCoordinatesAttribute = null;\r\n }\r\n\r\n try {\r\n normalAttribute = mesh.attribute(MeshAttribute.Normal);\r\n clonedNormalAttribute = clonedMesh.attribute(MeshAttribute.Normal);\r\n } catch (error) {\r\n normalAttribute = null;\r\n clonedNormalAttribute = null;\r\n }\r\n\r\n try {\r\n colorAttribute = mesh.attribute(MeshAttribute.Color);\r\n clonedColorAttribute = clonedMesh.attribute(MeshAttribute.Color);\r\n } catch (error) {\r\n colorAttribute = null;\r\n clonedColorAttribute = null;\r\n }\r\n\r\n for (let i = 0; i < mesh.vertexCount; i++) {\r\n if (positionAttribute != null && clonedPositionAttribute != null) {\r\n clonedPositionAttribute.set(i, positionAttribute.get(i, position));\r\n }\r\n if (textureCoordinatesAttribute != null && clonedTextureCoordinatesAttribute != null) {\r\n clonedTextureCoordinatesAttribute.set(i, textureCoordinatesAttribute.get(i, textureCoordinates));\r\n }\r\n if (normalAttribute != null && clonedNormalAttribute != null) {\r\n clonedNormalAttribute.set(i, normalAttribute.get(i, normal));\r\n }\r\n if (colorAttribute != null && clonedColorAttribute != null) {\r\n clonedColorAttribute.set(i, colorAttribute.get(i, color));\r\n }\r\n }\r\n\r\n return clonedMesh;\r\n };\r\n}();\r\n\r\nexport let invert = function () {\r\n let position = vec3_create();\r\n let textureCoordinates = vec2_create();\r\n let normal = vec3_create();\r\n let color = vec4_create();\r\n\r\n return function invert(mesh) {\r\n if (mesh == null) {\r\n return null;\r\n }\r\n\r\n let invertedIndexData = new Uint32Array(mesh.indexData.length);\r\n for (let i = 0; i < mesh.indexData.length / 3; i++) {\r\n invertedIndexData[i * 3 + 0] = mesh.indexData[i * 3 + 2];\r\n invertedIndexData[i * 3 + 1] = mesh.indexData[i * 3 + 1];\r\n invertedIndexData[i * 3 + 2] = mesh.indexData[i * 3 + 0];\r\n }\r\n\r\n let invertedMesh = mesh.engine.meshes.create({\r\n vertexCount: mesh.vertexCount,\r\n indexData: invertedIndexData,\r\n indexType: MeshIndexType.UnsignedInt\r\n });\r\n\r\n let positionAttribute = null;\r\n let textureCoordinatesAttribute = null;\r\n let normalAttribute = null;\r\n let colorAttribute = null;\r\n\r\n let invertedPositionAttribute = null;\r\n let invertedTextureCoordinatesAttribute = null;\r\n let invertedNormalAttribute = null;\r\n let invertedColorAttribute = null;\r\n\r\n try {\r\n positionAttribute = mesh.attribute(MeshAttribute.Position);\r\n invertedPositionAttribute = invertedMesh.attribute(MeshAttribute.Position);\r\n } catch (error) {\r\n positionAttribute = null;\r\n invertedPositionAttribute = null;\r\n }\r\n\r\n try {\r\n textureCoordinatesAttribute = mesh.attribute(MeshAttribute.TextureCoordinate);\r\n invertedTextureCoordinatesAttribute = invertedMesh.attribute(MeshAttribute.TextureCoordinate);\r\n } catch (error) {\r\n textureCoordinatesAttribute = null;\r\n invertedTextureCoordinatesAttribute = null;\r\n }\r\n\r\n try {\r\n normalAttribute = mesh.attribute(MeshAttribute.Normal);\r\n invertedNormalAttribute = invertedMesh.attribute(MeshAttribute.Normal);\r\n } catch (error) {\r\n normalAttribute = null;\r\n invertedNormalAttribute = null;\r\n }\r\n\r\n try {\r\n colorAttribute = mesh.attribute(MeshAttribute.Color);\r\n invertedColorAttribute = invertedMesh.attribute(MeshAttribute.Color);\r\n } catch (error) {\r\n colorAttribute = null;\r\n invertedColorAttribute = null;\r\n }\r\n\r\n for (let i = 0; i < mesh.vertexCount; i++) {\r\n if (positionAttribute != null && invertedPositionAttribute != null) {\r\n invertedPositionAttribute.set(i, positionAttribute.get(i, position));\r\n }\r\n\r\n if (textureCoordinatesAttribute != null && invertedTextureCoordinatesAttribute != null) {\r\n invertedTextureCoordinatesAttribute.set(i, textureCoordinatesAttribute.get(i, textureCoordinates));\r\n }\r\n\r\n if (normalAttribute != null && invertedNormalAttribute != null) {\r\n normalAttribute.get(i, normal);\r\n normal.vec3_negate(normal);\r\n invertedNormalAttribute.set(i, normal);\r\n }\r\n\r\n if (colorAttribute != null && invertedColorAttribute != null) {\r\n invertedColorAttribute.set(i, colorAttribute.get(i, color));\r\n }\r\n }\r\n\r\n return invertedMesh;\r\n };\r\n}();\r\n\r\nexport let makeDoubleSided = function () {\r\n let position = vec3_create();\r\n let textureCoordinates = vec2_create();\r\n let normal = vec3_create();\r\n let color = vec4_create();\r\n\r\n return function makeDoubleSided(mesh) {\r\n if (mesh == null) {\r\n return null;\r\n }\r\n\r\n let doubleSidedIndexData = new Uint32Array(mesh.indexData.length * 2);\r\n for (let i = 0; i < doubleSidedIndexData.length / 3; i++) {\r\n doubleSidedIndexData[i * 3 * 2 + 0] = mesh.indexData[i * 3 + 0] * 2;\r\n doubleSidedIndexData[i * 3 * 2 + 1] = mesh.indexData[i * 3 + 1] * 2;\r\n doubleSidedIndexData[i * 3 * 2 + 2] = mesh.indexData[i * 3 + 2] * 2;\r\n\r\n doubleSidedIndexData[i * 3 * 2 + 3] = mesh.indexData[i * 3 + 2] * 2 + 1;\r\n doubleSidedIndexData[i * 3 * 2 + 4] = mesh.indexData[i * 3 + 1] * 2 + 1;\r\n doubleSidedIndexData[i * 3 * 2 + 5] = mesh.indexData[i * 3 + 0] * 2 + 1;\r\n }\r\n\r\n let doubleSidedMesh = mesh.engine.meshes.create({\r\n vertexCount: mesh.vertexCount * 2,\r\n indexData: doubleSidedIndexData,\r\n indexType: MeshIndexType.UnsignedInt\r\n });\r\n\r\n let positionAttribute = null;\r\n let textureCoordinatesAttribute = null;\r\n let normalAttribute = null;\r\n let colorAttribute = null;\r\n\r\n let doubleSidedPositionAttribute = null;\r\n let doubleSidedTextureCoordinatesAttribute = null;\r\n let doubleSidedNormalAttribute = null;\r\n let doubleSidedColorAttribute = null;\r\n\r\n try {\r\n positionAttribute = mesh.attribute(MeshAttribute.Position);\r\n doubleSidedPositionAttribute = doubleSidedMesh.attribute(MeshAttribute.Position);\r\n } catch (error) {\r\n positionAttribute = null;\r\n doubleSidedPositionAttribute = null;\r\n }\r\n\r\n try {\r\n textureCoordinatesAttribute = mesh.attribute(MeshAttribute.TextureCoordinate);\r\n doubleSidedTextureCoordinatesAttribute = doubleSidedMesh.attribute(MeshAttribute.TextureCoordinate);\r\n } catch (error) {\r\n textureCoordinatesAttribute = null;\r\n doubleSidedTextureCoordinatesAttribute = null;\r\n }\r\n\r\n try {\r\n normalAttribute = mesh.attribute(MeshAttribute.Normal);\r\n doubleSidedNormalAttribute = doubleSidedMesh.attribute(MeshAttribute.Normal);\r\n } catch (error) {\r\n normalAttribute = null;\r\n doubleSidedNormalAttribute = null;\r\n }\r\n\r\n try {\r\n colorAttribute = mesh.attribute(MeshAttribute.Color);\r\n doubleSidedColorAttribute = doubleSidedMesh.attribute(MeshAttribute.Color);\r\n } catch (error) {\r\n colorAttribute = null;\r\n doubleSidedColorAttribute = null;\r\n }\r\n\r\n for (let i = 0; i < mesh.vertexCount; i++) {\r\n if (positionAttribute != null && doubleSidedPositionAttribute != null) {\r\n doubleSidedPositionAttribute.set(i * 2, positionAttribute.get(i, position));\r\n doubleSidedPositionAttribute.set(i * 2 + 1, positionAttribute.get(i, position));\r\n }\r\n\r\n if (textureCoordinatesAttribute != null && doubleSidedTextureCoordinatesAttribute != null) {\r\n doubleSidedTextureCoordinatesAttribute.set(i * 2, textureCoordinatesAttribute.get(i, textureCoordinates));\r\n doubleSidedTextureCoordinatesAttribute.set(i * 2 + 1, textureCoordinatesAttribute.get(i, textureCoordinates));\r\n }\r\n\r\n if (normalAttribute != null && doubleSidedNormalAttribute != null) {\r\n normalAttribute.get(i, normal);\r\n doubleSidedNormalAttribute.set(i * 2, normal);\r\n\r\n let invertedNormal = normal.vec3_negate();\r\n doubleSidedNormalAttribute.set(i * 2 + 1, invertedNormal);\r\n }\r\n\r\n if (colorAttribute != null && doubleSidedColorAttribute != null) {\r\n doubleSidedColorAttribute.set(i * 2, colorAttribute.get(i, color));\r\n doubleSidedColorAttribute.set(i * 2 + 1, colorAttribute.get(i, color));\r\n }\r\n }\r\n\r\n return doubleSidedMesh;\r\n };\r\n}();\r\n\r\nexport function createPlane(engine = Globals.getMainEngine()) {\r\n let vertexCount = 4;\r\n\r\n let meshCreationParams = new MeshCreationParams(engine);\r\n\r\n for (let i = 0; i < vertexCount; ++i) {\r\n let vertexCreationParams = new MeshCreationVertexParams();\r\n\r\n vertexCreationParams.myPosition = new vec3_create();\r\n vertexCreationParams.myPosition[0] = -1 + (i & 1) * 2;\r\n vertexCreationParams.myPosition[1] = -1 + ((i & 2) >> 1) * 2; // This is a quick way to have positions (-1,-1) (1,-1) (1,-1) (1,1)\r\n vertexCreationParams.myPosition[2] = 0;\r\n\r\n vertexCreationParams.myTextureCoordinates = new vec2_create();\r\n vertexCreationParams.myTextureCoordinates[0] = (i & 1);\r\n vertexCreationParams.myTextureCoordinates[1] = ((i & 2) >> 1);\r\n\r\n vertexCreationParams.myNormal = new vec3_create();\r\n vertexCreationParams.myNormal[0] = 0;\r\n vertexCreationParams.myNormal[1] = 0;\r\n vertexCreationParams.myNormal[2] = 1;\r\n\r\n meshCreationParams.myVertexes.push(vertexCreationParams);\r\n }\r\n\r\n let firstTriangle = new MeshCreationTriangleParams();\r\n firstTriangle.myIndexes[0] = 0;\r\n firstTriangle.myIndexes[1] = 1;\r\n firstTriangle.myIndexes[2] = 2;\r\n\r\n let secondTriangle = new MeshCreationTriangleParams();\r\n secondTriangle.myIndexes[0] = 2;\r\n secondTriangle.myIndexes[1] = 1;\r\n secondTriangle.myIndexes[2] = 3;\r\n\r\n meshCreationParams.myTriangles.push(firstTriangle);\r\n meshCreationParams.myTriangles.push(secondTriangle);\r\n\r\n let mesh = MeshUtils.create(meshCreationParams);\r\n\r\n return mesh;\r\n}\r\n\r\nexport let MeshUtils = {\r\n create,\r\n clone,\r\n invert,\r\n makeDoubleSided,\r\n createPlane\r\n};", "import { vec2 as gl_vec2, type vec2 as gl_vec2_type } from \"gl-matrix\";\r\nimport { Vector2 } from \"../../type_definitions/array_type_definitions.js\";\r\nimport { EasingFunction } from \"../math_utils.js\";\r\nimport { getVector2AllocationFunction, setVector2AllocationFunction } from \"./vec_allocation_utils.js\";\r\n\r\nexport function create(): Vector2;\r\nexport function create(x: number, y: number): Vector2;\r\nexport function create(uniformValue: number): Vector2;\r\nexport function create(x?: number, y?: number): Vector2 {\r\n const out = getAllocationFunction()();\r\n\r\n if (x != null) {\r\n Vec2Utils.set(out, x, y!);\r\n }\r\n\r\n return out;\r\n}\r\n\r\nexport function getAllocationFunction(): () => Vector2 {\r\n return getVector2AllocationFunction();\r\n}\r\n\r\n/** Specify the function that will be used to allocate the vector when calling the {@link create} function */\r\nexport function setAllocationFunction(allocationFunction: () => Vector2): void {\r\n setVector2AllocationFunction(allocationFunction);\r\n}\r\n\r\nexport function set(vector: T, x: number, y: number): T;\r\nexport function set(vector: T, uniformValue: number): T;\r\nexport function set(vector: T, x: number, y?: number): T {\r\n if (y == null) {\r\n gl_vec2.set(vector as unknown as gl_vec2_type, x, x);\r\n } else {\r\n gl_vec2.set(vector as unknown as gl_vec2_type, x, y);\r\n }\r\n\r\n return vector;\r\n}\r\n\r\nexport function copy(from: Readonly, to: T): T {\r\n gl_vec2.copy(to as unknown as gl_vec2_type, from as unknown as gl_vec2_type);\r\n return to;\r\n}\r\n\r\n/** The overload where `T extends Vector2` does also get `array` as `Readonly`, but is not marked as such due to \r\n Typescript having issues with inferring the proper type of `T` when `Readonly` is used */\r\nexport function clone(vector: Readonly): T;\r\nexport function clone(vector: Readonly): number[];\r\nexport function clone(vector: T): T;\r\nexport function clone(vector: Readonly): T {\r\n return vector.slice(0) as T;\r\n}\r\n\r\nexport function equals(first: Readonly, second: Readonly, epsilon: number = 0): boolean {\r\n let equals = first.length == second.length;\r\n\r\n if (equals) {\r\n equals &&= (Math.abs(first[0] - second[0]) <= epsilon);\r\n equals &&= (Math.abs(first[1] - second[1]) <= epsilon);\r\n }\r\n\r\n return equals;\r\n}\r\n\r\nexport function length(vector: Readonly): number {\r\n return gl_vec2.length(vector as unknown as gl_vec2_type);\r\n}\r\n\r\nexport function normalize(vector: Readonly): T;\r\nexport function normalize(vector: Readonly, out: T): T;\r\nexport function normalize(vector: Readonly, out: T | U = Vec2Utils.clone(vector)): T | U {\r\n gl_vec2.normalize(out as unknown as gl_vec2_type, vector as unknown as gl_vec2_type);\r\n return out;\r\n}\r\n\r\nexport function zero(vector: T): T {\r\n gl_vec2.zero(vector as unknown as gl_vec2_type);\r\n return vector;\r\n}\r\n\r\nexport function isZero(vector: Readonly, epsilon: number = 0): boolean {\r\n return Vec2Utils.length(vector) <= epsilon;\r\n}\r\n\r\nexport function lerp(from: Readonly, to: Readonly, interpolationFactor: number): T;\r\nexport function lerp(from: Readonly, to: Readonly, interpolationFactor: number, out: T): T;\r\nexport function lerp(from: Readonly, to: Readonly, interpolationFactor: number, out: T | U = Vec2Utils.clone(from)): T | U {\r\n if (interpolationFactor <= 0) {\r\n Vec2Utils.copy(from, out);\r\n return out;\r\n } else if (interpolationFactor >= 1) {\r\n Vec2Utils.copy(to, out);\r\n return out;\r\n }\r\n\r\n gl_vec2.lerp(out as unknown as gl_vec2_type, from as unknown as gl_vec2_type, to as unknown as gl_vec2_type, interpolationFactor);\r\n return out;\r\n}\r\n\r\nexport function interpolate(from: Readonly, to: Readonly, interpolationFactor: number, easingFunction?: EasingFunction): T;\r\nexport function interpolate(from: Readonly, to: Readonly, interpolationFactor: number, easingFunction: EasingFunction, out: T): T;\r\nexport function interpolate(from: Readonly, to: Readonly, interpolationFactor: number, easingFunction: EasingFunction = EasingFunction.linear, out: T | U = Vec2Utils.clone(from)): T | U {\r\n const lerpFactor = easingFunction(interpolationFactor);\r\n return Vec2Utils.lerp(from, to, lerpFactor, out);\r\n}\r\n\r\nexport const Vec2Utils = {\r\n create,\r\n getAllocationFunction,\r\n setAllocationFunction,\r\n set,\r\n copy,\r\n clone,\r\n equals,\r\n length,\r\n normalize,\r\n zero,\r\n isZero,\r\n lerp,\r\n interpolate\r\n} as const;", "import { vec4 as gl_vec4, type vec4 as gl_vec4_type } from \"gl-matrix\";\r\nimport { Vector4 } from \"../../type_definitions/array_type_definitions.js\";\r\nimport { EasingFunction } from \"../math_utils.js\";\r\nimport { getVector4AllocationFunction, setVector4AllocationFunction } from \"./vec_allocation_utils.js\";\r\n\r\nexport function create(): Vector4;\r\nexport function create(x: number, y: number, z: number, w: number): Vector4;\r\nexport function create(uniformValue: number): Vector4;\r\nexport function create(x?: number, y?: number, z?: number, w?: number): Vector4 {\r\n const out = getAllocationFunction()();\r\n\r\n if (x != null) {\r\n Vec4Utils.set(out, x, y!, z!, w!);\r\n }\r\n\r\n return out;\r\n}\r\n\r\nexport function getAllocationFunction(): () => Vector4 {\r\n return getVector4AllocationFunction();\r\n}\r\n\r\n/** Specify the function that will be used to allocate the vector when calling the {@link create} function */\r\nexport function setAllocationFunction(allocationFunction: () => Vector4): void {\r\n setVector4AllocationFunction(allocationFunction);\r\n}\r\n\r\nexport function set(vector: T, x: number, y: number, z: number, w: number): T;\r\nexport function set(vector: T, uniformValue: number): T;\r\nexport function set(vector: T, x: number, y?: number, z?: number, w?: number): T {\r\n if (y == null) {\r\n gl_vec4.set(vector as unknown as gl_vec4_type, x, x, x, x);\r\n } else {\r\n gl_vec4.set(vector as unknown as gl_vec4_type, x, y, z!, w!);\r\n }\r\n\r\n return vector;\r\n}\r\n\r\nexport function copy(from: Readonly, to: T): T {\r\n gl_vec4.copy(to as unknown as gl_vec4_type, from as unknown as gl_vec4_type);\r\n return to;\r\n}\r\n\r\n/** The overload where `T extends Vector4` does also get `array` as `Readonly`, but is not marked as such due to \r\n Typescript having issues with inferring the proper type of `T` when `Readonly` is used */\r\nexport function clone(vector: Readonly): T;\r\nexport function clone(vector: Readonly): number[];\r\nexport function clone(vector: T): T;\r\nexport function clone(vector: Readonly): T {\r\n return vector.slice(0) as T;\r\n}\r\n\r\nexport function equals(first: Readonly, second: Readonly, epsilon: number = 0): boolean {\r\n let equals = first.length == second.length;\r\n\r\n if (equals) {\r\n equals &&= (Math.abs(first[0] - second[0]) <= epsilon);\r\n equals &&= (Math.abs(first[1] - second[1]) <= epsilon);\r\n equals &&= (Math.abs(first[2] - second[2]) <= epsilon);\r\n equals &&= (Math.abs(first[3] - second[3]) <= epsilon);\r\n }\r\n\r\n return equals;\r\n}\r\n\r\nexport function lerp(from: Readonly, to: Readonly, interpolationFactor: number): T;\r\nexport function lerp(from: Readonly, to: Readonly, interpolationFactor: number, out: T): T;\r\nexport function lerp(from: Readonly, to: Readonly, interpolationFactor: number, out: T | U = Vec4Utils.clone(from)): T | U {\r\n if (interpolationFactor <= 0) {\r\n Vec4Utils.copy(from, out);\r\n return out;\r\n } else if (interpolationFactor >= 1) {\r\n Vec4Utils.copy(to, out);\r\n return out;\r\n }\r\n\r\n gl_vec4.lerp(out as unknown as gl_vec4_type, from as unknown as gl_vec4_type, to as unknown as gl_vec4_type, interpolationFactor);\r\n return out;\r\n}\r\n\r\nexport function interpolate(from: Readonly, to: Readonly, interpolationFactor: number, easingFunction?: EasingFunction): T;\r\nexport function interpolate(from: Readonly, to: Readonly, interpolationFactor: number, easingFunction: EasingFunction, out: T): T;\r\nexport function interpolate(from: Readonly, to: Readonly, interpolationFactor: number, easingFunction: EasingFunction = EasingFunction.linear, out: T | U = Vec4Utils.clone(from)): T | U {\r\n const lerpFactor = easingFunction(interpolationFactor);\r\n return Vec4Utils.lerp(from, to, lerpFactor, out);\r\n}\r\n\r\nexport const Vec4Utils = {\r\n create,\r\n getAllocationFunction,\r\n setAllocationFunction,\r\n set,\r\n copy,\r\n clone,\r\n equals,\r\n lerp,\r\n interpolate\r\n} as const;", "import { Vector } from \"../../type_definitions/array_type_definitions.js\";\r\nimport { EasingFunction, MathUtils } from \"../math_utils.js\";\r\nimport { getVectorAllocationFunction, setVectorAllocationFunction } from \"./vec_allocation_utils.js\";\r\n\r\nexport function create(length: number): Vector;\r\nexport function create(firstValue: number, ...remainingValues: number[]): Vector;\r\nexport function create(firstValue: number, ...remainingValues: number[]): Vector {\r\n let out: Vector | null = null;\r\n\r\n if (remainingValues.length == 0) {\r\n const length = firstValue;\r\n out = getAllocationFunction()(length);\r\n for (let i = 0; i < length; i++) {\r\n out[i] = 0;\r\n }\r\n } else {\r\n out = getAllocationFunction()(remainingValues.length + 1);\r\n out[0] = firstValue;\r\n for (let i = 0; i < remainingValues.length; i++) {\r\n out[i + 1] = remainingValues[i];\r\n }\r\n }\r\n\r\n return out;\r\n}\r\n\r\nexport function getAllocationFunction(): (length: number) => Vector {\r\n return getVectorAllocationFunction();\r\n}\r\n\r\n/** Specify the function that will be used to allocate the vector when calling the {@link create} function */\r\nexport function setAllocationFunction(allocationFunction: (length: number) => Vector): void {\r\n setVectorAllocationFunction(allocationFunction);\r\n}\r\n\r\nexport function set(vector: T, uniformValue: number): T;\r\nexport function set(vector: T, firstValue: number, ...remainingValues: number[]): T;\r\nexport function set(vector: T, firstValue: number, ...remainingValues: number[]): T {\r\n if (remainingValues.length == 0) {\r\n for (let i = 0; i < vector.length; i++) {\r\n vector[i] = firstValue;\r\n }\r\n } else {\r\n vector[0] = firstValue;\r\n for (let i = 0; i < remainingValues.length && i < vector.length - 1; i++) {\r\n vector[i + 1] = remainingValues[i];\r\n }\r\n }\r\n\r\n return vector;\r\n}\r\n\r\nexport function copy(from: Readonly, to: T): T {\r\n const minLength = Math.min(from.length, to.length);\r\n for (let i = 0; i < minLength; i++) {\r\n to[i] = from[i];\r\n }\r\n return to;\r\n}\r\n\r\n/** The overload where `T extends Vector` does also get `array` as `Readonly`, but is not marked as such due to \r\n Typescript having issues with inferring the proper type of `T` when `Readonly` is used */\r\nexport function clone(vector: Readonly): T;\r\nexport function clone(vector: Readonly): number[];\r\nexport function clone(vector: T): T;\r\nexport function clone(vector: Readonly): T {\r\n return vector.slice(0) as T;\r\n}\r\n\r\nexport function equals(vector: Readonly, other: Readonly, epsilon: number = 0): boolean {\r\n let equals = vector.length == other.length;\r\n\r\n for (let i = 0; i < vector.length && equals; i++) {\r\n equals = equals && (Math.abs(vector[i] - other[i]) <= epsilon);\r\n }\r\n\r\n return equals;\r\n}\r\n\r\nexport function zero(vector: T): T {\r\n for (let i = 0; i < vector.length; i++) {\r\n vector[i] = 0;\r\n }\r\n\r\n return vector;\r\n}\r\n\r\nexport function isZero(vector: Readonly, epsilon: number = 0): boolean {\r\n let zero = true;\r\n\r\n for (let i = 0; i < vector.length && zero; i++) {\r\n zero = zero && (Math.abs(vector[i]) <= epsilon);\r\n }\r\n\r\n return zero;\r\n}\r\n\r\nexport function scale(vector: Readonly, value: number): T;\r\nexport function scale(vector: Readonly, value: number, out: T): T;\r\nexport function scale(vector: Readonly, value: number, out: T | U = VecUtils.clone(vector)): T | U {\r\n for (let i = 0; i < vector.length; i++) {\r\n out[i] = vector[i] * value;\r\n }\r\n\r\n return out;\r\n}\r\n\r\nexport function round(vector: Readonly): T;\r\nexport function round(vector: Readonly, out: T): T;\r\nexport function round(vector: Readonly, out: T | U = VecUtils.clone(vector)): T | U {\r\n for (let i = 0; i < vector.length; i++) {\r\n out[i] = Math.round(vector[i]);\r\n }\r\n\r\n return out;\r\n}\r\n\r\nexport function floor(vector: Readonly): T;\r\nexport function floor(vector: Readonly, out: T): T;\r\nexport function floor(vector: Readonly, out: T | U = VecUtils.clone(vector)): T | U {\r\n for (let i = 0; i < vector.length; i++) {\r\n out[i] = Math.floor(vector[i]);\r\n }\r\n\r\n return out;\r\n}\r\n\r\nexport function ceil(vector: Readonly): T;\r\nexport function ceil(vector: Readonly, out: T): T;\r\nexport function ceil(vector: Readonly, out: T | U = VecUtils.clone(vector)): T | U {\r\n for (let i = 0; i < vector.length; i++) {\r\n out[i] = Math.ceil(vector[i]);\r\n }\r\n\r\n return out;\r\n}\r\n\r\nexport function clamp(vector: Readonly, start?: number, end?: number): T;\r\nexport function clamp(vector: Readonly, start: number, end: number, out: T): T;\r\nexport function clamp(vector: Readonly, start: number = -Number.MAX_VALUE, end: number = Number.MAX_VALUE, out: T | U = VecUtils.clone(vector)): T | U {\r\n const min = Math.min(start, end);\r\n const max = Math.max(start, end);\r\n\r\n for (let i = 0; i < vector.length; i++) {\r\n out[i] = MathUtils.clamp(vector[i], min, max);\r\n }\r\n\r\n return out;\r\n}\r\n\r\nexport function lerp(from: Readonly, to: Readonly, interpolationFactor: number): T;\r\nexport function lerp(from: Readonly, to: Readonly, interpolationFactor: number, out: T): T;\r\nexport function lerp(from: Readonly, to: Readonly, interpolationFactor: number, out: T | U = VecUtils.clone(from)): T | U {\r\n if (interpolationFactor <= 0) {\r\n VecUtils.copy(from, out);\r\n return out;\r\n } else if (interpolationFactor >= 1) {\r\n VecUtils.copy(to, out);\r\n return out;\r\n }\r\n\r\n const minLength = Math.min(from.length, to.length, out.length);\r\n for (let i = 0; i < minLength; i++) {\r\n const fromCurrentValue = from[i];\r\n const toCurrentValue = to[i];\r\n\r\n out[i] = fromCurrentValue + interpolationFactor * (toCurrentValue - fromCurrentValue);\r\n }\r\n\r\n return out;\r\n}\r\n\r\nexport function interpolate(from: Readonly, to: Readonly, interpolationFactor: number, easingFunction?: EasingFunction): T;\r\nexport function interpolate(from: Readonly, to: Readonly, interpolationFactor: number, easingFunction: EasingFunction, out: T): T;\r\nexport function interpolate(from: Readonly, to: Readonly, interpolationFactor: number, easingFunction: EasingFunction = EasingFunction.linear, out: T | U = VecUtils.clone(from)): T | U {\r\n const lerpFactor = easingFunction(interpolationFactor);\r\n return VecUtils.lerp(from, to, lerpFactor, out);\r\n}\r\n\r\nexport function toString(vector: Readonly, decimalPlaces: number = 4): string {\r\n const message = _buildConsoleMessage(vector, decimalPlaces);\r\n return message;\r\n}\r\n\r\nexport function log(vector: Readonly, decimalPlaces: number = 4): Vector {\r\n const message = _buildConsoleMessage(vector, decimalPlaces);\r\n console.log(message);\r\n\r\n return vector;\r\n}\r\n\r\nexport function error(vector: Readonly, decimalPlaces: number = 4): Vector {\r\n const message = _buildConsoleMessage(vector, decimalPlaces);\r\n console.error(message);\r\n\r\n return vector;\r\n}\r\n\r\nexport function warn(vector: Readonly, decimalPlaces: number = 4): Vector {\r\n const message = _buildConsoleMessage(vector, decimalPlaces);\r\n console.warn(message);\r\n\r\n return vector;\r\n}\r\n\r\nexport const VecUtils = {\r\n create,\r\n getAllocationFunction,\r\n setAllocationFunction,\r\n set,\r\n copy,\r\n clone,\r\n equals,\r\n zero,\r\n isZero,\r\n scale,\r\n round,\r\n floor,\r\n ceil,\r\n clamp,\r\n lerp,\r\n interpolate,\r\n toString,\r\n log,\r\n error,\r\n warn\r\n} as const;\r\n\r\n\r\n\r\nfunction _buildConsoleMessage(vector: Readonly, decimalPlaces?: number): string {\r\n let message = \"[\";\r\n\r\n for (let i = 0; i < vector.length; i++) {\r\n if (i != 0) {\r\n message = message.concat(\", \");\r\n }\r\n\r\n if (decimalPlaces != null) {\r\n message = message.concat(vector[i].toFixed(decimalPlaces));\r\n } else {\r\n message = message.concat(vector[i].toString());\r\n }\r\n }\r\n\r\n message = message.concat(\"]\");\r\n return message;\r\n}", "import { Matrix3, Matrix4, Quaternion, Quaternion2, Vector, Vector2, Vector3, Vector4 } from \"../../../../cauldron/type_definitions/array_type_definitions.js\";\r\nimport { Mat3Utils } from \"../../../../cauldron/utils/array/mat3_utils.js\";\r\nimport { Mat4Utils } from \"../../../../cauldron/utils/array/mat4_utils.js\";\r\nimport { Quat2Utils } from \"../../../../cauldron/utils/array/quat2_utils.js\";\r\nimport { QuatUtils } from \"../../../../cauldron/utils/array/quat_utils.js\";\r\nimport { Vec2Utils } from \"../../../../cauldron/utils/array/vec2_utils.js\";\r\nimport { Vec3Utils } from \"../../../../cauldron/utils/array/vec3_utils.js\";\r\nimport { Vec4Utils } from \"../../../../cauldron/utils/array/vec4_utils.js\";\r\nimport { VecUtils } from \"../../../../cauldron/utils/array/vec_utils.js\";\r\n\r\nexport function vec_create(length: number): Vector;\r\nexport function vec_create(firstValue: number, ...remainingValues: number[]): Vector;\r\nexport function vec_create(firstValue: number, ...remainingValues: number[]): Vector {\r\n return VecUtils.create(firstValue, ...remainingValues);\r\n}\r\n\r\nexport function vec_getAllocationFunction(): (length: number) => Vector {\r\n return VecUtils.getAllocationFunction();\r\n}\r\n\r\nexport function vec_setAllocationFunction(allocationFunction: (length: number) => Vector): void {\r\n VecUtils.setAllocationFunction(allocationFunction);\r\n}\r\n\r\n\r\n\r\nexport function vec2_create(): Vector2;\r\nexport function vec2_create(x: number, y: number): Vector2;\r\nexport function vec2_create(uniformValue: number): Vector2;\r\nexport function vec2_create(x?: number, y?: number): Vector2 {\r\n return Vec2Utils.create(x!, y!);\r\n}\r\n\r\nexport function vec2_getAllocationFunction(): () => Vector2 {\r\n return Vec2Utils.getAllocationFunction();\r\n}\r\n\r\nexport function vec2_setAllocationFunction(allocationFunction: () => Vector2): void {\r\n Vec2Utils.setAllocationFunction(allocationFunction);\r\n}\r\n\r\n\r\n\r\nexport function vec3_create(): Vector3;\r\nexport function vec3_create(x: number, y: number, z: number): Vector3;\r\nexport function vec3_create(uniformValue: number): Vector3;\r\nexport function vec3_create(x?: number, y?: number, z?: number): Vector3 {\r\n return Vec3Utils.create(x!, y!, z!);\r\n}\r\n\r\nexport function vec3_getAllocationFunction(): () => Vector3 {\r\n return Vec3Utils.getAllocationFunction();\r\n}\r\n\r\nexport function vec3_setAllocationFunction(allocationFunction: () => Vector3): void {\r\n Vec3Utils.setAllocationFunction(allocationFunction);\r\n}\r\n\r\n\r\n\r\nexport function vec4_create(): Vector4;\r\nexport function vec4_create(x: number, y: number, z: number, w: number): Vector4;\r\nexport function vec4_create(uniformValue: number): Vector4;\r\nexport function vec4_create(x?: number, y?: number, z?: number, w?: number): Vector4 {\r\n return Vec4Utils.create(x!, y!, z!, w!);\r\n}\r\n\r\nexport function vec4_getAllocationFunction(): () => Vector4 {\r\n return Vec4Utils.getAllocationFunction();\r\n}\r\n\r\nexport function vec4_setAllocationFunction(allocationFunction: () => Vector4): void {\r\n Vec4Utils.setAllocationFunction(allocationFunction);\r\n}\r\n\r\n\r\n\r\nexport function quat_create(): Quaternion;\r\nexport function quat_create(x: number, y: number, z: number, w: number): Quaternion;\r\nexport function quat_create(uniformValue: number): Quaternion;\r\nexport function quat_create(x?: number, y?: number, z?: number, w?: number): Quaternion {\r\n return QuatUtils.create(x!, y!, z!, w!);\r\n}\r\n\r\nexport function quat_getAllocationFunction(): () => Quaternion {\r\n return QuatUtils.getAllocationFunction();\r\n}\r\n\r\nexport function quat_setAllocationFunction(allocationFunction: () => Quaternion): void {\r\n QuatUtils.setAllocationFunction(allocationFunction);\r\n}\r\n\r\n\r\n\r\nexport function quat2_create(): Quaternion2;\r\nexport function quat2_create(x1: number, y1: number, z1: number, w1: number, x2: number, y2: number, z2: number, w2: number): Quaternion2;\r\nexport function quat2_create(uniformValue: number): Quaternion2;\r\nexport function quat2_create(x1?: number, y1?: number, z1?: number, w1?: number, x2?: number, y2?: number, z2?: number, w2?: number): Quaternion2 {\r\n return Quat2Utils.create(x1!, y1!, z1!, w1!, x2!, y2!, z2!, w2!);\r\n}\r\n\r\nexport function quat2_getAllocationFunction(): () => Quaternion2 {\r\n return Quat2Utils.getAllocationFunction();\r\n}\r\n\r\nexport function quat2_setAllocationFunction(allocationFunction: () => Quaternion2): void {\r\n Quat2Utils.setAllocationFunction(allocationFunction);\r\n}\r\n\r\n\r\n\r\nexport function mat3_create(): Matrix3;\r\nexport function mat3_create(\r\n m00: number, m01: number, m02: number,\r\n m10: number, m11: number, m12: number,\r\n m20: number, m21: number, m22: number): Matrix3;\r\nexport function mat3_create(uniformValue: number): Matrix3;\r\nexport function mat3_create(\r\n m00?: number, m01?: number, m02?: number,\r\n m10?: number, m11?: number, m12?: number,\r\n m20?: number, m21?: number, m22?: number): Matrix3 {\r\n return Mat3Utils.create(\r\n m00!, m01!, m02!,\r\n m10!, m11!, m12!,\r\n m20!, m21!, m22!\r\n );\r\n}\r\n\r\nexport function mat3_getAllocationFunction(): () => Matrix3 {\r\n return Mat3Utils.getAllocationFunction();\r\n}\r\n\r\nexport function mat3_setAllocationFunction(allocationFunction: () => Matrix3): void {\r\n Mat3Utils.setAllocationFunction(allocationFunction);\r\n}\r\n\r\n\r\n\r\nexport function mat4_create(): Matrix4;\r\nexport function mat4_create(\r\n m00: number, m01: number, m02: number, m03: number,\r\n m10: number, m11: number, m12: number, m13: number,\r\n m20: number, m21: number, m22: number, m23: number,\r\n m30: number, m31: number, m32: number, m33: number): Matrix4;\r\nexport function mat4_create(uniformValue: number): Matrix4;\r\nexport function mat4_create(\r\n m00?: number, m01?: number, m02?: number, m03?: number,\r\n m10?: number, m11?: number, m12?: number, m13?: number,\r\n m20?: number, m21?: number, m22?: number, m23?: number,\r\n m30?: number, m31?: number, m32?: number, m33?: number): Matrix4 {\r\n return Mat4Utils.create(\r\n m00!, m01!, m02!, m03!,\r\n m10!, m11!, m12!, m13!,\r\n m20!, m21!, m22!, m23!,\r\n m30!, m31!, m32!, m33!\r\n );\r\n}\r\n\r\nexport function mat4_getAllocationFunction(): () => Matrix4 {\r\n return Mat4Utils.getAllocationFunction();\r\n}\r\n\r\nexport function mat4_setAllocationFunction(allocationFunction: () => Matrix4): void {\r\n Mat4Utils.setAllocationFunction(allocationFunction);\r\n}", "/**\r\n * Easy Tune Variables Examples\r\n * \r\n * Number: Globals.getEasyTuneVariables().add(new EasyTuneNumber(\"Float\", 1.00, (newValue) => this.myFloat = newValue, true, 2, 0.1)); \r\n * Number Array: Globals.getEasyTuneVariables().add(new EasyTuneNumberArray(\"Float Array\", [1.00, 2.00, 3.00], (newValue) => this.myFloatArray.pp_copy(newValue), true, 2, 0.1)); \r\n * Int: Globals.getEasyTuneVariables().add(new EasyTuneInt(\"Int\", this.myInt, (newValue) => this.myInt = newValue, true, 1)); \r\n * Int Array: Globals.getEasyTuneVariables().add(new EasyTuneIntArray(\"Int Array\", [1, 2, 3], (newValue) => this.myIntArray.pp_copy(newValue), true, 1)); \r\n * Bool: Globals.getEasyTuneVariables().add(new EasyTuneBool(\"Bool\", this.myBool, (newValue) => this.myBool = newValue, true)); \r\n * Bool Array: Globals.getEasyTuneVariables().add(new EasyTuneBoolArray(\"Bool Array\", [false, true, false], (newValue) => this.myBoolArray.pp_copy(newValue), true)); \r\n * Transform: Globals.getEasyTuneVariables().add(new EasyTuneTransform(\"Transform\", mat4_create(), (newValue) => this.myTransform.mat4_copy(newValue), true, true, 3));\r\n */\r\n\r\n// #WARN some private variables are unused because they are used by the js widget! Maybe when that will be converted to ts I will fix that to a getter\r\n// but for now do not delete them\r\n\r\nimport { Emitter, WonderlandEngine } from \"@wonderlandengine/api\";\r\nimport { ArrayLike, Matrix4, Vector3 } from \"../../cauldron/type_definitions/array_type_definitions.js\";\r\nimport { MathUtils } from \"../../cauldron/utils/math_utils.js\";\r\nimport { mat4_create, vec3_create } from \"../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Globals } from \"../../pp/globals.js\";\r\nimport { EasyTuneUtils } from \"./easy_tune_utils.js\";\r\n\r\nexport enum EasyTuneVariableType {\r\n NONE = 0,\r\n NUMBER = 1,\r\n BOOL = 2,\r\n TRANSFORM = 3\r\n}\r\n\r\nexport class EasyTuneVariableExtraParams {\r\n public myAutoImportEnabled: boolean | null = null;\r\n public myManualImportEnabled: boolean | null = null;\r\n public myExportEnabled: boolean | null = null;\r\n\r\n constructor(autoimportEnabled: boolean | null = null, manualImportEnabled: boolean | null = null, exportEnabled: boolean | null = null) {\r\n this.myAutoImportEnabled = autoimportEnabled;\r\n this.myManualImportEnabled = manualImportEnabled;\r\n this.myExportEnabled = exportEnabled;\r\n }\r\n}\r\n\r\nexport abstract class EasyTuneVariable {\r\n private readonly _myType: EasyTuneVariableType;\r\n\r\n private _myName: string;\r\n\r\n protected abstract _myValue: unknown;\r\n protected abstract _myDefaultValue: unknown;\r\n\r\n private _myShowOnWidget: boolean;\r\n private _myAutoImportEnabled: boolean;\r\n private _myManualImportEnabled: boolean;\r\n private _myExportEnabled: boolean;\r\n\r\n private _myWidgetCurrentVariable: boolean = false;\r\n\r\n private readonly _myValueChangedEmitter: Emitter<[unknown, EasyTuneVariable]> = new Emitter();\r\n\r\n protected readonly _myEngine: Readonly;\r\n\r\n constructor(type: EasyTuneVariableType, name: string, valueChangedEventListener: ((value: unknown, easyTuneVariable: EasyTuneVariable) => void) | null = null, showOnWidget: boolean = true, extraParams: Readonly = new EasyTuneVariableExtraParams(), engine: Readonly = Globals.getMainEngine()!) {\r\n this._myType = type;\r\n\r\n this._myName = name;\r\n\r\n this._myShowOnWidget = showOnWidget;\r\n this._myAutoImportEnabled = extraParams.myAutoImportEnabled ?? EasyTuneUtils.getAutoImportEnabledDefaultValue(engine);\r\n this._myManualImportEnabled = extraParams.myManualImportEnabled ?? EasyTuneUtils.getManualImportEnabledDefaultValue(engine);\r\n this._myExportEnabled = extraParams.myExportEnabled ?? EasyTuneUtils.getExportEnabledDefaultValue(engine);\r\n\r\n this._myWidgetCurrentVariable = false;\r\n\r\n this._myValueChangedEmitter = new Emitter(); // Signature: listener(value, easyTuneVariables)\r\n\r\n this._myEngine = engine;\r\n\r\n if (valueChangedEventListener != null) {\r\n this.registerValueChangedEventListener(this, valueChangedEventListener);\r\n }\r\n }\r\n\r\n public getName(): string {\r\n return this._myName;\r\n }\r\n\r\n public setName(name: string): this {\r\n if (this._myName != name) {\r\n this._myName = name;\r\n EasyTuneUtils.refreshWidget(this._myEngine);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n public getType(): EasyTuneVariableType {\r\n return this._myType;\r\n }\r\n\r\n public isWidgetCurrentVariable(): boolean {\r\n return this._myWidgetCurrentVariable;\r\n }\r\n\r\n public setWidgetCurrentVariable(widgetCurrentVariable: boolean): this {\r\n this._myWidgetCurrentVariable = widgetCurrentVariable;\r\n return this;\r\n }\r\n\r\n public getValue(): unknown {\r\n return this._myValue;\r\n }\r\n\r\n public setValue(value: unknown, resetDefaultValue: boolean = false, skipValueChangedNotify: boolean = false): this {\r\n const valueChanged = this._myValue != null && this._myValue != value;\r\n\r\n this._myValue = value;\r\n\r\n if (resetDefaultValue) {\r\n this.setDefaultValue(value);\r\n }\r\n\r\n EasyTuneUtils.refreshWidget(this._myEngine);\r\n\r\n if (valueChanged && !skipValueChangedNotify) {\r\n this._notifyValueChanged();\r\n }\r\n\r\n return this;\r\n }\r\n\r\n public getDefaultValue(): unknown {\r\n return this._myDefaultValue;\r\n }\r\n\r\n public isValueEqual(otherValue: unknown): boolean {\r\n return this._myValue == otherValue;\r\n }\r\n\r\n public setDefaultValue(value: unknown): this {\r\n this._myDefaultValue = value;\r\n return this;\r\n }\r\n\r\n public isShownOnWidget(): boolean {\r\n return this._myShowOnWidget;\r\n }\r\n\r\n public setShowOnWidget(showOnWidget: boolean): this {\r\n this._myShowOnWidget = showOnWidget;\r\n return this;\r\n }\r\n\r\n public isManualImportEnabled(): boolean {\r\n return this._myManualImportEnabled;\r\n }\r\n\r\n public isAutoImportEnabled(): boolean {\r\n return this._myAutoImportEnabled;\r\n }\r\n\r\n public isExportEnabled(): boolean {\r\n return this._myExportEnabled;\r\n }\r\n\r\n public setManualImportEnabled(enabled: boolean): this {\r\n this._myManualImportEnabled = enabled;\r\n return this;\r\n }\r\n\r\n public setAutoImportEnabled(enabled: boolean): this {\r\n this._myAutoImportEnabled = enabled;\r\n return this;\r\n }\r\n\r\n public setExportEnabled(enabled: boolean): this {\r\n this._myExportEnabled = enabled;\r\n return this;\r\n }\r\n\r\n public setEasyTuneVariableExtraParams(extraParams: Readonly): this {\r\n this.setAutoImportEnabled(extraParams.myAutoImportEnabled ?? EasyTuneUtils.getAutoImportEnabledDefaultValue(this._myEngine));\r\n this.setManualImportEnabled(extraParams.myManualImportEnabled ?? EasyTuneUtils.getManualImportEnabledDefaultValue(this._myEngine));\r\n this.setExportEnabled(extraParams.myExportEnabled ?? EasyTuneUtils.getExportEnabledDefaultValue(this._myEngine));\r\n\r\n return this;\r\n }\r\n\r\n public fromJSON(valueJSON: string, resetDefaultValue: boolean = false, skipValueChangedNotify: boolean = false): this {\r\n this.setValue(JSON.parse(valueJSON), resetDefaultValue, skipValueChangedNotify);\r\n return this;\r\n }\r\n\r\n public toJSON(): string {\r\n return JSON.stringify(this.getValue());\r\n }\r\n\r\n /**\r\n * @param id if `undefined` is used as id, it will overwrite the default variable listener\r\n */\r\n public registerValueChangedEventListener(id: unknown, listener: (value: unknown, easyTuneVariable: EasyTuneVariable) => void): this {\r\n if (id !== undefined) {\r\n this._myValueChangedEmitter.add(listener, { id: id });\r\n } else {\r\n this._myValueChangedEmitter.add(listener, { id: this });\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * @param id if `undefined` is used as id, it will unregister the default variable listener\r\n */\r\n public unregisterValueChangedEventListener(id?: unknown): this {\r\n if (id !== undefined) {\r\n this._myValueChangedEmitter.remove(id);\r\n } else {\r\n this._myValueChangedEmitter.remove(this);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n protected _notifyValueChanged(): void {\r\n this._myValueChangedEmitter.notify(this.getValue(), this);\r\n }\r\n}\r\n\r\nexport abstract class EasyTuneVariableTyped extends EasyTuneVariable {\r\n protected abstract override _myValue: T;\r\n protected abstract override _myDefaultValue: T;\r\n\r\n constructor(type: EasyTuneVariableType, name: string, valueChangedEventListener?: ((value: Readonly, easyTuneVariable: EasyTuneVariable) => void) | null, showOnWidget?: boolean, extraParams?: Readonly, engine?: Readonly) {\r\n super(type, name, valueChangedEventListener as (value: unknown, easyTuneVariable: EasyTuneVariable) => void, showOnWidget, extraParams, engine);\r\n }\r\n\r\n public override getValue(): Readonly {\r\n return super.getValue() as T;\r\n }\r\n\r\n public override setValue(value: Readonly, resetDefaultValue?: boolean, skipValueChangedNotify?: boolean): this {\r\n return super.setValue(value, resetDefaultValue, skipValueChangedNotify);\r\n }\r\n\r\n public override isValueEqual(otherValue: Readonly): boolean {\r\n return this._myValue == otherValue;\r\n }\r\n\r\n public override getDefaultValue(): Readonly {\r\n return super.getDefaultValue() as T;\r\n }\r\n\r\n public override setDefaultValue(value: Readonly): this {\r\n return super.setDefaultValue(value);\r\n }\r\n\r\n public override registerValueChangedEventListener(id: unknown, listener: (value: Readonly, easyTuneVariable: EasyTuneVariable) => void): this {\r\n return super.registerValueChangedEventListener(id, listener as (value: unknown, easyTuneVariable: EasyTuneVariable) => void);\r\n }\r\n\r\n public override unregisterValueChangedEventListener(id?: unknown): this {\r\n return super.unregisterValueChangedEventListener(id);\r\n }\r\n}\r\n\r\nexport abstract class EasyTuneVariableArray, ArrayElementType> extends EasyTuneVariableTyped {\r\n protected override _myValue!: ArrayType;\r\n protected override _myDefaultValue!: ArrayType;\r\n\r\n constructor(type: EasyTuneVariableType, name: string, value: ArrayType, valueChangedEventListener?: ((value: Readonly, easyTuneVariable: EasyTuneVariable) => void) | null, showOnWidget?: boolean, extraParams?: Readonly, engine?: Readonly) {\r\n super(type, name, valueChangedEventListener, showOnWidget, extraParams, engine);\r\n\r\n this.setValue(value, true, true);\r\n }\r\n\r\n public override setValue(value: Readonly, resetDefaultValue: boolean = false, skipValueChangedNotify: boolean = false): this {\r\n const valueChanged = this._myValue != null && !this._myValue.pp_equals(value);\r\n\r\n if (this._myValue == null) {\r\n this._myValue = value.pp_clone();\r\n } else {\r\n this._myValue.pp_copy(value);\r\n }\r\n\r\n if (resetDefaultValue) {\r\n this.setDefaultValue(value);\r\n }\r\n\r\n EasyTuneUtils.refreshWidget(this._myEngine);\r\n\r\n if (valueChanged && !skipValueChangedNotify) {\r\n this._notifyValueChanged();\r\n }\r\n\r\n return this;\r\n }\r\n\r\n public override setDefaultValue(value: Readonly): this {\r\n if (this._myDefaultValue == null) {\r\n this._myDefaultValue = value.pp_clone();\r\n } else {\r\n this._myDefaultValue.pp_copy(value);\r\n }\r\n\r\n return this;\r\n }\r\n}\r\n\r\n\r\n// NUMBER\r\n\r\nexport class EasyTuneNumberArray extends EasyTuneVariableArray, number> {\r\n\r\n private _myDecimalPlaces: number;\r\n private _myStepPerSecond: number;\r\n\r\n private _myDefaultStepPerSecond: number;\r\n\r\n private _myMin: number;\r\n private _myMax: number;\r\n\r\n private _myEditAllValuesTogether: boolean;\r\n\r\n constructor(name: string, value: Readonly>, valueChangedEventListener?: ((value: Readonly>, easyTuneVariable: EasyTuneVariable) => void) | null, showOnWidget?: boolean, decimalPlaces: number = 3, stepPerSecond: number = 1, min: number = -Number.MAX_VALUE, max: number = Number.MAX_VALUE, editAllValuesTogether: boolean = false, extraParams?: Readonly, engine?: Readonly) {\r\n super(EasyTuneVariableType.NUMBER, name, value, valueChangedEventListener, showOnWidget, extraParams, engine);\r\n\r\n this._myDecimalPlaces = decimalPlaces;\r\n this._myStepPerSecond = stepPerSecond;\r\n\r\n this._myDefaultStepPerSecond = this._myStepPerSecond;\r\n\r\n this._myMin = min;\r\n this._myMax = max;\r\n\r\n this._myEditAllValuesTogether = editAllValuesTogether;\r\n\r\n this._clampValue(true, true);\r\n }\r\n\r\n public override isValueEqual(otherValue: Readonly>, epsilon: number = MathUtils.EPSILON): boolean {\r\n return this._myValue.vec_equals(otherValue, epsilon);\r\n }\r\n\r\n public setMax(max: number): this {\r\n this._myMax = max;\r\n this._clampValue(false);\r\n return this;\r\n }\r\n\r\n public setMin(min: number): this {\r\n this._myMin = min;\r\n this._clampValue(false);\r\n return this;\r\n }\r\n\r\n public override toJSON(): string {\r\n return this.getValue().vec_toString();\r\n }\r\n\r\n private _clampValue(resetDefaultValue: boolean, skipValueChangedNotify: boolean = false): void {\r\n const clampedValue = this._myValue.vec_clamp(this._myMin, this._myMax);\r\n\r\n if (!resetDefaultValue) {\r\n const clampedDefaultValue = this.getDefaultValue().vec_clamp(this._myMin, this._myMax);\r\n this.setDefaultValue(clampedDefaultValue);\r\n }\r\n\r\n this.setValue(clampedValue, resetDefaultValue, skipValueChangedNotify);\r\n }\r\n}\r\n\r\nexport class EasyTuneIntArray extends EasyTuneNumberArray {\r\n\r\n constructor(name: string, value: Readonly>, valueChangedEventListener?: ((value: Readonly>, easyTuneVariable: EasyTuneVariable) => void) | null, showOnWidget?: boolean, stepPerSecond?: number, min: number = -Number.MAX_VALUE, max: number = Number.MAX_VALUE, editAllValuesTogether?: boolean, extraParams?: Readonly, engine?: Readonly) {\r\n const roundedValue = value.pp_clone();\r\n\r\n for (let i = 0; i < value.length; i++) {\r\n roundedValue[i] = Math.round(roundedValue[i]);\r\n }\r\n\r\n super(name, roundedValue, valueChangedEventListener, showOnWidget, 0, stepPerSecond, Math.round(min), Math.round(max), editAllValuesTogether, extraParams, engine);\r\n }\r\n}\r\n\r\nexport class EasyTuneNumber extends EasyTuneVariableTyped {\r\n\r\n protected override _myValue!: number;\r\n protected override _myDefaultValue!: number;\r\n\r\n private _myDecimalPlaces: number;\r\n private _myStepPerSecond: number;\r\n\r\n private _myDefaultStepPerSecond: number;\r\n\r\n private _myMin: number;\r\n private _myMax: number;\r\n\r\n constructor(name: string, value: number, valueChangedEventListener?: ((value: number, easyTuneVariable: EasyTuneVariable) => void) | null, showOnWidget?: boolean, decimalPlaces: number = 3, stepPerSecond: number = 1, min: number = -Number.MAX_VALUE, max: number = Number.MAX_VALUE, extraParams?: Readonly, engine?: Readonly) {\r\n super(EasyTuneVariableType.NUMBER, name, valueChangedEventListener, showOnWidget, extraParams, engine);\r\n\r\n this.setValue(value, true, true);\r\n\r\n this._myDecimalPlaces = decimalPlaces;\r\n this._myStepPerSecond = stepPerSecond;\r\n\r\n this._myDefaultStepPerSecond = this._myStepPerSecond;\r\n\r\n this._myMin = min;\r\n this._myMax = max;\r\n\r\n this._clampValue(true, true);\r\n }\r\n\r\n public override isValueEqual(otherValue: Readonly, epsilon: number = MathUtils.EPSILON): boolean {\r\n return Math.abs(this._myValue - otherValue) < epsilon;\r\n }\r\n\r\n public setMax(max: number): this {\r\n this._myMax = max;\r\n this._clampValue(false);\r\n return this;\r\n }\r\n\r\n public setMin(min: number): this {\r\n this._myMin = min;\r\n this._clampValue(false);\r\n return this;\r\n }\r\n\r\n public override toJSON(): string {\r\n return JSON.stringify(this.getValue());\r\n }\r\n\r\n private _clampValue(resetDefaultValue: boolean, skipValueChangedNotify: boolean = false): void {\r\n const clampedValue = MathUtils.clamp(this._myValue, this._myMin, this._myMax);\r\n\r\n if (!resetDefaultValue) {\r\n const clampedDefaultValue = MathUtils.clamp(this.getDefaultValue(), this._myMin, this._myMax);\r\n this.setDefaultValue(clampedDefaultValue);\r\n }\r\n\r\n this.setValue(clampedValue, resetDefaultValue, skipValueChangedNotify);\r\n }\r\n}\r\n\r\nexport class EasyTuneInt extends EasyTuneNumber {\r\n\r\n constructor(name: string, value: number, valueChangedEventListener?: ((value: number, easyTuneVariable: EasyTuneVariable) => void) | null, showOnWidget?: boolean, stepPerSecond?: number, min?: number, max?: number, extraParams?: Readonly, engine?: Readonly) {\r\n super(name, value, valueChangedEventListener, showOnWidget, 0, stepPerSecond, min, max, extraParams, engine);\r\n }\r\n}\r\n\r\n// BOOL\r\n\r\nexport class EasyTuneBoolArray extends EasyTuneVariableArray, boolean> {\r\n\r\n constructor(name: string, value: Readonly>, valueChangedEventListener?: ((value: Readonly>, easyTuneVariable: EasyTuneVariable) => void) | null, showOnWidget?: boolean, extraParams?: Readonly, engine?: Readonly) {\r\n super(EasyTuneVariableType.BOOL, name, value, valueChangedEventListener, showOnWidget, extraParams, engine);\r\n }\r\n}\r\n\r\nexport class EasyTuneBool extends EasyTuneVariableTyped {\r\n\r\n protected override _myValue!: boolean;\r\n protected override _myDefaultValue!: boolean;\r\n\r\n constructor(name: string, value: boolean, valueChangedEventListener?: ((value: boolean, easyTuneVariable: EasyTuneVariable) => void) | null, showOnWidget?: boolean, extraParams?: Readonly, engine?: Readonly) {\r\n super(EasyTuneVariableType.BOOL, name, valueChangedEventListener, showOnWidget, extraParams, engine);\r\n\r\n this.setValue(value, true, true);\r\n }\r\n}\r\n\r\n// EASY TUNE EASY TRANSFORM\r\n\r\nexport class EasyTuneTransform extends EasyTuneVariableTyped {\r\n protected override _myValue: Matrix4 = mat4_create();\r\n protected override _myDefaultValue: Matrix4 = mat4_create();\r\n\r\n private _myDecimalPlaces: number;\r\n\r\n private readonly _myPosition: Vector3 = vec3_create();\r\n private readonly _myRotation: Vector3 = vec3_create();\r\n private readonly _myScale: Vector3 = vec3_create();\r\n\r\n private _myScaleAsOne: boolean;\r\n\r\n private _myPositionStepPerSecond: number;\r\n private _myRotationStepPerSecond: number;\r\n private _myScaleStepPerSecond: number;\r\n\r\n private readonly _myDefaultPosition: Vector3 = vec3_create();\r\n private readonly _myDefaultRotation: Vector3 = vec3_create();\r\n private readonly _myDefaultScale: Vector3 = vec3_create();\r\n\r\n private _myDefaultPositionStepPerSecond: number;\r\n private _myDefaultRotationStepPerSecond: number;\r\n private _myDefaultScaleStepPerSecond: number;\r\n\r\n constructor(name: string, value: Readonly, valueChangedEventListener?: ((value: Readonly, easyTuneVariable: EasyTuneVariable) => void) | null, showOnWidget?: boolean, scaleAsOne: boolean = true, decimalPlaces: number = 3, positionStepPerSecond: number = 1, rotationStepPerSecond: number = 50, scaleStepPerSecond: number = 1, extraParams?: Readonly, engine?: Readonly) {\r\n super(EasyTuneVariableType.TRANSFORM, name, valueChangedEventListener, showOnWidget, extraParams, engine);\r\n\r\n this._myDecimalPlaces = decimalPlaces;\r\n\r\n this.setValue(value, true, true);\r\n\r\n // To avoid having a 0 scale that can mess up the transform\r\n const decimalPlacesMultiplier = Math.pow(10, this._myDecimalPlaces);\r\n for (let i = 0; i < 3; i++) {\r\n this._myScale[i] = Math.max(this._myScale[i], 1 / decimalPlacesMultiplier);\r\n }\r\n\r\n this._myValue.mat4_setPosition(this._myPosition);\r\n this._myValue.mat4_setRotationDegrees(this._myRotation);\r\n this._myValue.mat4_setScale(this._myScale);\r\n\r\n this.setValue(this._myValue, true, true);\r\n\r\n this._myScaleAsOne = scaleAsOne;\r\n\r\n this._myPositionStepPerSecond = positionStepPerSecond;\r\n this._myRotationStepPerSecond = rotationStepPerSecond;\r\n this._myScaleStepPerSecond = scaleStepPerSecond;\r\n\r\n this._myDefaultPositionStepPerSecond = this._myPositionStepPerSecond;\r\n this._myDefaultRotationStepPerSecond = this._myRotationStepPerSecond;\r\n this._myDefaultScaleStepPerSecond = this._myScaleStepPerSecond;\r\n }\r\n\r\n private static readonly _setValueSV =\r\n {\r\n oldValue: mat4_create()\r\n };\r\n public override setValue(value: Readonly, resetDefaultValue = false, skipValueChangedNotify: boolean = false): this {\r\n const oldValue = EasyTuneTransform._setValueSV.oldValue;\r\n oldValue.mat4_copy(this._myValue);\r\n\r\n this._myValue.mat4_copy(value);\r\n\r\n this._myValue.mat4_getPosition(this._myPosition);\r\n this._myValue.mat4_getRotationDegrees(this._myRotation);\r\n this._myValue.mat4_getScale(this._myScale);\r\n\r\n const valueChanged = !oldValue.pp_equals(this._myValue);\r\n\r\n if (resetDefaultValue) {\r\n this.setDefaultValue(value);\r\n }\r\n\r\n EasyTuneUtils.refreshWidget(this._myEngine);\r\n\r\n if (valueChanged && !skipValueChangedNotify) {\r\n this._notifyValueChanged();\r\n }\r\n\r\n return this;\r\n }\r\n\r\n public override isValueEqual(otherValue: Readonly, epsilon: number = MathUtils.EPSILON): boolean {\r\n return this._myValue.vec_equals(otherValue, epsilon);\r\n }\r\n\r\n public override setDefaultValue(value: Readonly): this {\r\n this._myDefaultValue.mat4_copy(value);\r\n\r\n this._myDefaultValue.mat4_getPosition(this._myDefaultPosition);\r\n this._myDefaultValue.mat4_getRotationDegrees(this._myDefaultRotation);\r\n this._myDefaultValue.mat4_getScale(this._myDefaultScale);\r\n\r\n return this;\r\n }\r\n\r\n public override toJSON(): string {\r\n return this.getValue().vec_toString();\r\n }\r\n}", "import { WonderlandEngine } from \"@wonderlandengine/api\";\r\nimport { Globals } from \"../../pp/globals.js\";\r\n\r\nconst _mySetWidgetCurrentVariableCallbacks: WeakMap, Map void>> = new WeakMap();\r\nconst _myRefreshWidgetCallbacks: WeakMap, Map void>> = new WeakMap();\r\n\r\nconst _myAutoImportEnabledDefaultValues: WeakMap, boolean> = new WeakMap();\r\nconst _myManualImportEnabledDefaultValues: WeakMap, boolean> = new WeakMap();\r\nconst _myExportEnabledDefaultValues: WeakMap, boolean> = new WeakMap();\r\n\r\nexport function setWidgetCurrentVariable(variableName: string, engine: Readonly = Globals.getMainEngine()!): void {\r\n if (_mySetWidgetCurrentVariableCallbacks.has(engine)) {\r\n for (const callback of _mySetWidgetCurrentVariableCallbacks.get(engine)!.values()) {\r\n callback(variableName);\r\n }\r\n }\r\n}\r\n\r\nexport function refreshWidget(engine: Readonly = Globals.getMainEngine()!): void {\r\n if (_myRefreshWidgetCallbacks.has(engine)) {\r\n for (const callback of _myRefreshWidgetCallbacks.get(engine)!.values()) {\r\n callback();\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * @param fileURL Can contain parameters inside brackets, like `my-url.com/{param}`, which will be replaced with the same one on the current page url, like `www.currentpage.com/?param=2` \r\n * If `null` or empty, it will import from the clipboard\r\n */\r\nexport function importVariables(fileURL: string | null = null, resetVariablesDefaultValueOnImport: boolean = false, skipValueChangedNotifyOnImport: boolean = false, manualImport: boolean = false, onSuccessCallback?: () => void, onFailureCallback?: () => void, engine: Readonly = Globals.getMainEngine()!): void {\r\n if (fileURL == null || fileURL.length == 0) {\r\n if (navigator.clipboard) {\r\n navigator.clipboard.readText().then(\r\n function (clipboard) {\r\n Globals.getEasyTuneVariables(engine)!.fromJSON(clipboard, resetVariablesDefaultValueOnImport, skipValueChangedNotifyOnImport, manualImport);\r\n\r\n EasyTuneUtils.refreshWidget(engine);\r\n\r\n if (onSuccessCallback != null) {\r\n onSuccessCallback();\r\n }\r\n\r\n console.log(\"Easy Tune Variables Imported from: clipboard\");\r\n console.log(clipboard);\r\n }\r\n ).catch(function (reason) {\r\n if (onFailureCallback != null) {\r\n onFailureCallback();\r\n }\r\n\r\n console.error(\"An error occurred while importing the easy tune variables from: clipboard\");\r\n console.error(reason);\r\n });\r\n }\r\n } else {\r\n const replacedFileURL = _importExportVariablesReplaceFileURLParams(fileURL);\r\n\r\n fetch(replacedFileURL).then(\r\n function (response) {\r\n if (response.ok) {\r\n response.text().then(\r\n function (text) {\r\n Globals.getEasyTuneVariables(engine)!.fromJSON(text, resetVariablesDefaultValueOnImport, skipValueChangedNotifyOnImport, manualImport);\r\n\r\n EasyTuneUtils.refreshWidget(engine);\r\n\r\n if (onSuccessCallback != null) {\r\n onSuccessCallback();\r\n }\r\n\r\n console.log(\"Easy Tune Variables Imported from:\", replacedFileURL);\r\n console.log(text);\r\n }\r\n ).catch(function (reason) {\r\n if (onFailureCallback != null) {\r\n onFailureCallback();\r\n }\r\n\r\n console.error(\"An error occurred while importing the easy tune variables from:\", replacedFileURL);\r\n console.error(reason);\r\n });\r\n } else {\r\n if (onFailureCallback != null) {\r\n onFailureCallback();\r\n }\r\n\r\n console.error(\"An error occurred while importing the easy tune variables from:\", replacedFileURL);\r\n console.error(response);\r\n }\r\n }\r\n ).catch(function (reason) {\r\n if (onFailureCallback != null) {\r\n onFailureCallback();\r\n }\r\n\r\n console.error(\"An error occurred while importing the easy tune variables from:\", replacedFileURL);\r\n console.error(reason);\r\n });\r\n }\r\n\r\n EasyTuneUtils.refreshWidget(engine);\r\n}\r\n\r\n\r\n/**\r\n * @param fileURL Can contain parameters inside brackets, like `my-url.com/{param}`, which will be replaced with the same one on the current page url, like `www.currentpage.com/?param=2` \r\n * If `null` or empty, it will import from the clipboard\r\n */\r\nexport function getImportVariablesJSON(fileURL: string | null = null, onSuccessCallback?: (variablesJSON: string) => void, onFailureCallback?: () => void, engine: Readonly = Globals.getMainEngine()!): void {\r\n if (fileURL == null || fileURL.length == 0) {\r\n if (navigator.clipboard) {\r\n navigator.clipboard.readText().then(\r\n function (clipboard) {\r\n if (onSuccessCallback != null) {\r\n onSuccessCallback(clipboard);\r\n }\r\n }\r\n ).catch(function (reason) {\r\n if (onFailureCallback != null) {\r\n onFailureCallback();\r\n }\r\n });\r\n }\r\n } else {\r\n const replacedFileURL = _importExportVariablesReplaceFileURLParams(fileURL);\r\n\r\n fetch(replacedFileURL).then(\r\n function (response) {\r\n if (response.ok) {\r\n response.text().then(\r\n function (text) {\r\n if (onSuccessCallback != null) {\r\n onSuccessCallback(text);\r\n }\r\n }\r\n ).catch(function (reason) {\r\n if (onFailureCallback != null) {\r\n onFailureCallback();\r\n }\r\n });\r\n } else {\r\n if (onFailureCallback != null) {\r\n onFailureCallback();\r\n }\r\n }\r\n }\r\n ).catch(function (reason) {\r\n if (onFailureCallback != null) {\r\n onFailureCallback();\r\n }\r\n });\r\n }\r\n}\r\n\r\n\r\n/**\r\n * @param fileURL Can contain parameters inside brackets, like `my-url.com/{param}`, which will be replaced with the same one on the current page url, like `www.currentpage.com/?param=2` \r\n * If `null` or empty, it will import from the clipboard\r\n */\r\nexport function exportVariables(fileURL: string | null = null, excludeVariablesWithValueAsDefault: boolean, variablesToKeep?: Record, onSuccessCallback?: () => void, onFailureCallback?: () => void, engine: Readonly = Globals.getMainEngine()!): void {\r\n const variablesJSONToExport = Globals.getEasyTuneVariables(engine)!.toJSON(excludeVariablesWithValueAsDefault);\r\n EasyTuneUtils.exportVariablesJSON(variablesJSONToExport, fileURL, variablesToKeep, onSuccessCallback, onFailureCallback, engine);\r\n}\r\n\r\n\r\n/**\r\n * @param fileURL Can contain parameters inside brackets, like `my-url.com/{param}`, which will be replaced with the same one on the current page url, like `www.currentpage.com/?param=2` \r\n * If `null` or empty, it will import from the clipboard\r\n */\r\nexport function exportVariablesByName(variableNamesToExport: string[], fileURL: string | null = null, excludeVariablesWithValueAsDefault: boolean, variablesToKeep?: Record, onSuccessCallback?: () => void, onFailureCallback?: () => void, engine: Readonly = Globals.getMainEngine()!): void {\r\n const objectJSON: Record = {};\r\n\r\n const easyTuneVariables = Globals.getEasyTuneVariables(engine)!;\r\n for (const variableName of variableNamesToExport) {\r\n const variable = easyTuneVariables.getEasyTuneVariable(variableName);\r\n if (variable != null && variable.isExportEnabled()) {\r\n if (!excludeVariablesWithValueAsDefault || !variable.isValueEqual(variable.getDefaultValue())) {\r\n objectJSON[variable.getName()] = variable.toJSON();\r\n }\r\n }\r\n }\r\n\r\n const variablesJSONToExport = JSON.stringify(objectJSON);\r\n EasyTuneUtils.exportVariablesJSON(variablesJSONToExport, fileURL, variablesToKeep, onSuccessCallback, onFailureCallback, engine);\r\n}\r\n\r\n\r\n/**\r\n * @param fileURL Can contain parameters inside brackets, like `my-url.com/{param}`, which will be replaced with the same one on the current page url, like `www.currentpage.com/?param=2` \r\n * If `null` or empty, it will import from the clipboard\r\n */\r\nexport function exportVariablesJSON(variablesJSONToExport: string, fileURL: string | null = null, variablesToKeep?: Record, onSuccessCallback?: () => void, onFailureCallback?: () => void, engine: Readonly = Globals.getMainEngine()!): void {\r\n // Useful if some variables are not in the json export and therefore would not be there anymore\r\n if (variablesToKeep != null) {\r\n try {\r\n const variablesToExport = JSON.parse(variablesJSONToExport);\r\n for (const variableName in variablesToKeep) {\r\n if (!(variableName in variablesToExport)) {\r\n variablesToExport[variableName] = variablesToKeep[variableName];\r\n }\r\n }\r\n\r\n variablesJSONToExport = JSON.stringify(variablesToExport);\r\n } catch (error) {\r\n // Do nothing\r\n }\r\n }\r\n\r\n if (fileURL == null || fileURL.length == 0) {\r\n if (navigator.clipboard) {\r\n navigator.clipboard.writeText(variablesJSONToExport).then(\r\n function () {\r\n if (onSuccessCallback != null) {\r\n onSuccessCallback();\r\n }\r\n\r\n console.log(\"Easy Tune Variables Exported to: clipboard\");\r\n console.log(variablesJSONToExport);\r\n },\r\n function () {\r\n if (onFailureCallback != null) {\r\n onFailureCallback();\r\n }\r\n\r\n console.error(\"An error occurred while exporting the easy tune variables to: clipboard\");\r\n }\r\n ).catch(function (reason) {\r\n if (onFailureCallback != null) {\r\n onFailureCallback();\r\n }\r\n\r\n console.error(\"An error occurred while exporting the easy tune variables to: clipboard\");\r\n console.error(reason);\r\n });\r\n }\r\n } else {\r\n const replacedFileURL = _importExportVariablesReplaceFileURLParams(fileURL);\r\n\r\n fetch(replacedFileURL, {\r\n headers: {\r\n \"Accept\": \"application/json\",\r\n \"Content-Type\": \"application/json\"\r\n },\r\n method: \"POST\",\r\n body: variablesJSONToExport\r\n }).then(\r\n function (response) {\r\n if (response.ok) {\r\n if (onSuccessCallback != null) {\r\n onSuccessCallback();\r\n }\r\n\r\n console.log(\"Easy Tune Variables Exported to:\", replacedFileURL);\r\n console.log(variablesJSONToExport);\r\n } else {\r\n if (onFailureCallback != null) {\r\n onFailureCallback();\r\n }\r\n\r\n console.error(\"An error occurred while exporting the easy tune variables to:\", replacedFileURL);\r\n console.error(response);\r\n }\r\n },\r\n function (response) {\r\n if (onFailureCallback != null) {\r\n onFailureCallback();\r\n }\r\n\r\n console.error(\"An error occurred while exporting the easy tune variables to:\", replacedFileURL);\r\n console.error(response);\r\n }\r\n ).catch(function (reason) {\r\n if (onFailureCallback != null) {\r\n onFailureCallback();\r\n }\r\n\r\n console.error(\"An error occurred while exporting the easy tune variables to:\", replacedFileURL);\r\n console.error(reason);\r\n });\r\n }\r\n}\r\n\r\n\r\n/**\r\n * @param fileURL Can contain parameters inside brackets, like `my-url.com/{param}`, which will be replaced with the same one on the current page url, like `www.currentpage.com/?param=2` \r\n * If `null` or empty, it will import from the clipboard\r\n */\r\nexport function clearExportedVariables(fileURL: string | null = null, onSuccessCallback?: () => void, onFailureCallback?: () => void, engine: Readonly = Globals.getMainEngine()!): void {\r\n EasyTuneUtils.exportVariablesJSON(\"\", fileURL, undefined, onSuccessCallback, onFailureCallback, engine);\r\n}\r\n\r\nexport function setAutoImportEnabledDefaultValue(defaultValue: boolean, engine: Readonly = Globals.getMainEngine()!): void {\r\n _myAutoImportEnabledDefaultValues.set(engine, defaultValue);\r\n}\r\n\r\nexport function setManualImportEnabledDefaultValue(defaultValue: boolean, engine: Readonly = Globals.getMainEngine()!): void {\r\n _myManualImportEnabledDefaultValues.set(engine, defaultValue);\r\n}\r\n\r\nexport function setExportEnabledDefaultValue(defaultValue: boolean, engine: Readonly = Globals.getMainEngine()!): void {\r\n _myExportEnabledDefaultValues.set(engine, defaultValue);\r\n}\r\n\r\nexport function getAutoImportEnabledDefaultValue(engine: Readonly = Globals.getMainEngine()!): boolean {\r\n let defaultValue = true;\r\n\r\n if (_myAutoImportEnabledDefaultValues.has(engine)) {\r\n defaultValue = _myAutoImportEnabledDefaultValues.get(engine) ?? false;\r\n }\r\n\r\n return defaultValue;\r\n}\r\n\r\nexport function getManualImportEnabledDefaultValue(engine: Readonly = Globals.getMainEngine()!): boolean {\r\n let defaultValue = true;\r\n\r\n if (_myManualImportEnabledDefaultValues.has(engine)) {\r\n defaultValue = _myManualImportEnabledDefaultValues.get(engine) ?? false;\r\n }\r\n\r\n return defaultValue;\r\n}\r\n\r\nexport function getExportEnabledDefaultValue(engine: Readonly = Globals.getMainEngine()!): boolean {\r\n let defaultValue = true;\r\n\r\n if (_myExportEnabledDefaultValues.has(engine)) {\r\n defaultValue = _myExportEnabledDefaultValues.get(engine) ?? false;\r\n }\r\n\r\n return defaultValue;\r\n}\r\n\r\nexport function addSetWidgetCurrentVariableCallback(id: unknown, callback: (variableName: string) => void, engine: Readonly = Globals.getMainEngine()!): void {\r\n if (!_mySetWidgetCurrentVariableCallbacks.has(engine)) {\r\n _mySetWidgetCurrentVariableCallbacks.set(engine, new Map());\r\n }\r\n\r\n _mySetWidgetCurrentVariableCallbacks.get(engine)!.set(id, callback);\r\n}\r\n\r\nexport function removeSetWidgetCurrentVariableCallback(id: unknown, engine: Readonly = Globals.getMainEngine()!): void {\r\n if (_mySetWidgetCurrentVariableCallbacks.has(engine)) {\r\n _mySetWidgetCurrentVariableCallbacks.get(engine)!.delete(id);\r\n }\r\n}\r\n\r\nexport function addRefreshWidgetCallback(id: unknown, callback: () => void, engine: Readonly = Globals.getMainEngine()!): void {\r\n if (!_myRefreshWidgetCallbacks.has(engine)) {\r\n _myRefreshWidgetCallbacks.set(engine, new Map());\r\n }\r\n\r\n _myRefreshWidgetCallbacks.get(engine)!.set(id, callback);\r\n}\r\n\r\nexport function removeRefreshWidgetCallback(id: unknown, engine: Readonly = Globals.getMainEngine()!): void {\r\n if (_myRefreshWidgetCallbacks.has(engine)) {\r\n _myRefreshWidgetCallbacks.get(engine)!.delete(id);\r\n }\r\n}\r\n\r\nexport const EasyTuneUtils = {\r\n setWidgetCurrentVariable,\r\n refreshWidget,\r\n importVariables,\r\n getImportVariablesJSON,\r\n exportVariables,\r\n exportVariablesByName,\r\n exportVariablesJSON,\r\n clearExportedVariables,\r\n setAutoImportEnabledDefaultValue,\r\n setManualImportEnabledDefaultValue,\r\n setExportEnabledDefaultValue,\r\n getAutoImportEnabledDefaultValue,\r\n getManualImportEnabledDefaultValue,\r\n getExportEnabledDefaultValue,\r\n addSetWidgetCurrentVariableCallback,\r\n removeSetWidgetCurrentVariableCallback,\r\n addRefreshWidgetCallback,\r\n removeRefreshWidgetCallback\r\n} as const;\r\n\r\n\r\n\r\nconst _importExportVariablesReplaceFileURLParams = function () {\r\n const matchEasyTuneURLParamsRegex = new RegExp(\"\\\\{.+?\\\\}\", \"g\");\r\n return function _importExportVariablesReplaceFileURLParams(fileURL: string) {\r\n const params = fileURL.match(matchEasyTuneURLParamsRegex);\r\n\r\n if (params == null || params.length == 0) {\r\n return fileURL;\r\n }\r\n\r\n for (let i = 0; i < params.length; i++) {\r\n params[i] = params[i].replace(\"{\", \"\");\r\n params[i] = params[i].replace(\"}\", \"\");\r\n }\r\n\r\n const urlQuery = window.location.search;\r\n const urlSearchParams = new URLSearchParams(urlQuery);\r\n\r\n let replacedFileURL = fileURL;\r\n\r\n for (const param of params) {\r\n const searchParamValue = urlSearchParams.get(param);\r\n if (searchParamValue != null) {\r\n replacedFileURL = replacedFileURL.replace(\"{\" + param + \"}\", searchParamValue);\r\n }\r\n }\r\n\r\n return replacedFileURL;\r\n };\r\n}();", "import { Object3D, WonderlandEngine } from \"@wonderlandengine/api\";\r\nimport { Globals } from \"../../../pp/globals.js\";\r\nimport { EasyTuneUtils } from \"../easy_tune_utils.js\";\r\nimport { EasyTuneVariable, EasyTuneVariableTyped } from \"../easy_tune_variable_types.js\";\r\n\r\nexport abstract class EasyObjectTuner> {\r\n private _myObject: Object3D;\r\n\r\n private _myEasyTuneVariable: EasyTuneVariableType | null = null;\r\n\r\n private _myUseTuneTarget: boolean;\r\n private _mySetAsWidgetCurrentVariable: boolean;\r\n\r\n private _myInitialEasyTuneVariableName: string;\r\n\r\n private _myPrevObject: Object3D | null = null;\r\n private _myManualVariableUpdate: boolean = false;\r\n\r\n private _myActive: boolean = true;\r\n private _mySetupDone: boolean = false;\r\n\r\n protected readonly _myEngine: Readonly;\r\n\r\n constructor(object: Object3D, variableName: string, setAsWidgetCurrentVariable: boolean, useTuneTarget: boolean, engine: Readonly = Globals.getMainEngine()!) {\r\n this._myObject = object;\r\n this._myUseTuneTarget = useTuneTarget;\r\n this._mySetAsWidgetCurrentVariable = setAsWidgetCurrentVariable;\r\n\r\n let easyObject: Object3D | null = this._myObject;\r\n if (this._myUseTuneTarget) {\r\n easyObject = Globals.getEasyTuneTarget(engine);\r\n }\r\n\r\n const variableNamePrefix = this._getVariableNamePrefix();\r\n\r\n if (variableName == \"\") {\r\n const objectName = easyObject != null ? easyObject.pp_getName() : \"\";\r\n if (objectName != \"\") {\r\n this._myInitialEasyTuneVariableName = variableNamePrefix.concat(objectName);\r\n } else {\r\n this._myInitialEasyTuneVariableName = variableNamePrefix.concat(easyObject != null ? easyObject.pp_getID().toFixed() : \"\");\r\n }\r\n } else {\r\n this._myInitialEasyTuneVariableName = variableName;\r\n }\r\n\r\n this._myEngine = engine;\r\n }\r\n\r\n public getEasyTuneVariable(): EasyTuneVariable | null {\r\n return this._myEasyTuneVariable;\r\n }\r\n\r\n public start(): void {\r\n this._myEasyTuneVariable = this._createEasyTuneVariable(this._myInitialEasyTuneVariableName);\r\n Globals.getEasyTuneVariables(this._myEngine)!.add(this._myEasyTuneVariable);\r\n\r\n let easyObject: Object3D | null = this._myObject;\r\n if (this._myUseTuneTarget) {\r\n easyObject = Globals.getEasyTuneTarget(this._myEngine);\r\n }\r\n this._myPrevObject = easyObject;\r\n\r\n if (easyObject != null) {\r\n const value = this._getObjectValue(easyObject);\r\n this._myEasyTuneVariable.setValue(value, true);\r\n }\r\n\r\n this._myActive = false;\r\n this.setActive(true);\r\n }\r\n\r\n public setActive(active: boolean): void {\r\n if (this._myActive != active) {\r\n this._myActive = active;\r\n\r\n if (this._myEasyTuneVariable != null) {\r\n if (this._myActive) {\r\n this._myEasyTuneVariable.registerValueChangedEventListener(this, function (this: EasyObjectTuner, newValue: Readonly) {\r\n if (this._myManualVariableUpdate) return;\r\n\r\n let easyObject: Object3D | null = this._myObject;\r\n if (this._myUseTuneTarget) {\r\n easyObject = Globals.getEasyTuneTarget(this._myEngine);\r\n }\r\n\r\n if (easyObject != null) {\r\n this._updateObjectValue(easyObject, newValue);\r\n }\r\n }.bind(this));\r\n } else {\r\n this._myEasyTuneVariable.unregisterValueChangedEventListener(this);\r\n }\r\n }\r\n }\r\n }\r\n\r\n public isActive(): boolean {\r\n return this._myActive;\r\n }\r\n\r\n public update(dt: number): void {\r\n if (!this._mySetupDone) {\r\n if (Globals.hasEasyTuneWidget()) {\r\n if (this._mySetAsWidgetCurrentVariable) {\r\n EasyTuneUtils.setWidgetCurrentVariable(this._myInitialEasyTuneVariableName, this._myEngine);\r\n }\r\n\r\n this._mySetupDone = true;\r\n }\r\n }\r\n\r\n if (this._myEasyTuneVariable == null || !this._myActive || !this.canUpdate()) return;\r\n\r\n let easyObject: Object3D | null = this._myObject;\r\n if (this._myUseTuneTarget) {\r\n easyObject = Globals.getEasyTuneTarget(this._myEngine);\r\n }\r\n\r\n let value = null;\r\n if (easyObject != null) {\r\n value = this._getObjectValue(easyObject);\r\n } else {\r\n value = this._getDefaultValue();\r\n }\r\n\r\n if (value != null) {\r\n const currentValue = this._myEasyTuneVariable.getValue();\r\n if (!this._areValueEqual(currentValue, value)) {\r\n this._myManualVariableUpdate = true;\r\n this._myEasyTuneVariable.setValue(value, this._myPrevObject != easyObject);\r\n this._myPrevObject = easyObject;\r\n\r\n this._myManualVariableUpdate = false;\r\n }\r\n }\r\n }\r\n\r\n protected canUpdate(): boolean {\r\n return true;\r\n }\r\n\r\n protected abstract _getVariableNamePrefix(): string;\r\n\r\n protected abstract _createEasyTuneVariable(variableName: string): EasyTuneVariableType;\r\n\r\n protected abstract _getObjectValue(object: Readonly): Readonly;\r\n\r\n protected abstract _getDefaultValue(): Readonly;\r\n\r\n protected abstract _areValueEqual(first: Readonly, second: Readonly): boolean;\r\n\r\n protected abstract _updateObjectValue(object: Object3D, value: Readonly): void;\r\n}", "import { Component, Object3D, WonderlandEngine } from \"@wonderlandengine/api\";\r\nimport { EasyTuneBool } from \"../easy_tune_variable_types.js\";\r\nimport { EasyObjectTuner } from \"./easy_object_tuner.js\";\r\n\r\nexport class EasyActive extends EasyObjectTuner {\r\n\r\n private _myComponentsToIgnore: Component[];\r\n\r\n constructor(componentsToIgnore: Component[], object: Object3D, variableName: string, setAsWidgetCurrentVariable: boolean, useTuneTarget: boolean, engine?: Readonly) {\r\n super(object, variableName, setAsWidgetCurrentVariable, useTuneTarget, engine);\r\n\r\n this._myComponentsToIgnore = componentsToIgnore;\r\n }\r\n\r\n protected override _getVariableNamePrefix(): string {\r\n return \"Active \";\r\n }\r\n\r\n protected override _createEasyTuneVariable(variableName: string): EasyTuneBool {\r\n return new EasyTuneBool(variableName, this._getDefaultValue(), null, true, undefined, this._myEngine);\r\n }\r\n\r\n protected override _getObjectValue(object: Readonly): boolean {\r\n let active = false;\r\n\r\n const components = object.pp_getComponents();\r\n for (const component of components) {\r\n if (!this._myComponentsToIgnore.pp_hasEqual(component) && component.active) {\r\n active = true;\r\n break;\r\n }\r\n }\r\n\r\n return active;\r\n }\r\n\r\n protected override _getDefaultValue(): boolean {\r\n return true;\r\n }\r\n\r\n protected override _areValueEqual(first: boolean, second: boolean): boolean {\r\n return first == second;\r\n }\r\n\r\n protected override _updateObjectValue(object: Object3D, value: boolean): void {\r\n const componentToIgnoreState = new Map();\r\n\r\n for (const componentToIgnore of this._myComponentsToIgnore) {\r\n componentToIgnoreState.set(componentToIgnore, componentToIgnore.active);\r\n }\r\n\r\n object.pp_setActive(value);\r\n\r\n for (const [componentToIgnore, active] of componentToIgnoreState.entries()) {\r\n componentToIgnore.active = active;\r\n }\r\n }\r\n\r\n protected override canUpdate(): boolean {\r\n const easyTuneVariable = this.getEasyTuneVariable();\r\n return easyTuneVariable == null || easyTuneVariable.isWidgetCurrentVariable();\r\n }\r\n}", "import { EasyActiveComponent } from \"wle-pp/tool/easy_tune/easy_object_tuners/components/easy_active_component.js\";\r\nimport { AddPPToWindowComponent, AddWLToWindowComponent, AdjustHierarchyPhysXScaleComponent, AnalyticsManagerComponent, AudioManagerComponent, BenchmarkMaxPhysXComponent, BenchmarkMaxVisibleTrianglesComponent, CADisplayLeaderboardComponent, CharacterCollisionSystemComponent, ClearConsoleComponent, ConsoleVRToolComponent, CopyHandTransformComponent, CopyHeadTransformComponent, CopyPlayerTransformComponent, CopyReferenceSpaceTransformComponent, DebugArrayFunctionsPerformanceAnalyzerComponent, DebugFunctionsPerformanceAnalyzerComponent, DebugManagerComponent, DebugPPArrayCreationPerformanceAnalyzerComponent, DebugPPFunctionsPerformanceAnalyzerComponent, DebugTransformComponent, DebugWLComponentsFunctionsPerformanceAnalyzerComponent, DebugWLFunctionsPerformanceAnalyzerComponent, EasyLightAttenuationComponent, EasyLightColorComponent, EasyMeshColorComponent, EasyScaleComponent, EasySetTuneTargeetGrabComponent, EasySetTuneTargetChildNumberComponent, EasyTextColorComponent, EasyTransformComponent, EasyTuneImportVariablesComponent, EasyTuneToolComponent, EnableDebugComponent, EnableToolComponent, FingerCursorComponent, GamepadControlSchemeComponent, GamepadMeshAnimatorComponent, GetDefaultResourcesComponent, GetSceneObjectsComponent, GrabbableComponent, GrabberHandComponent, InitConsoleVRComponent, InitEasyTuneVariablesComponent, InputManagerComponent, MuteEverythingComponent, ObjectPoolManagerComponent, OverlapCursorComponent, PPGatewayComponent, PlayerLocomotionComponent, SaveManagerComponent, ScaleOnSpawnComponent, SetActiveComponent, SetEngineLogLevelComponent, SetHandLocalTransformComponent, SetHandRayLocalTransformComponent, SetHeadLocalTransformComponent, SetPlayerHeightComponent, SetTrackedHandJointLocalTransformComponent, ShowFPSComponent, ShowXRButtonsComponent, SpatialAudioListenerComponent, SwitchHandObjectComponent, ToggleActiveOnButtonPressComponent, ToolCursorComponent, TrackedHandDrawAllJointsComponent, TrackedHandDrawJointComponent, TrackedHandDrawSkinComponent, VirtualGamepadComponent, VisualManagerComponent } from \"../index.js\";\r\n\r\nexport function registerPPComponents(engine) {\r\n engine.registerComponent(\r\n AddPPToWindowComponent,\r\n AddWLToWindowComponent,\r\n AdjustHierarchyPhysXScaleComponent,\r\n AnalyticsManagerComponent,\r\n AudioManagerComponent,\r\n BenchmarkMaxPhysXComponent,\r\n BenchmarkMaxVisibleTrianglesComponent,\r\n CADisplayLeaderboardComponent,\r\n CharacterCollisionSystemComponent,\r\n ClearConsoleComponent,\r\n ConsoleVRToolComponent,\r\n CopyHandTransformComponent,\r\n CopyHeadTransformComponent,\r\n CopyReferenceSpaceTransformComponent,\r\n CopyPlayerTransformComponent,\r\n DebugPPArrayCreationPerformanceAnalyzerComponent,\r\n DebugArrayFunctionsPerformanceAnalyzerComponent,\r\n DebugFunctionsPerformanceAnalyzerComponent,\r\n DebugManagerComponent,\r\n DebugPPFunctionsPerformanceAnalyzerComponent,\r\n DebugTransformComponent,\r\n DebugWLComponentsFunctionsPerformanceAnalyzerComponent,\r\n DebugWLFunctionsPerformanceAnalyzerComponent,\r\n EasyLightAttenuationComponent,\r\n EasyLightColorComponent,\r\n EasyMeshColorComponent,\r\n EasyScaleComponent,\r\n EasySetTuneTargeetGrabComponent,\r\n EasySetTuneTargetChildNumberComponent,\r\n EasyTextColorComponent,\r\n EasyTransformComponent,\r\n EasyTuneImportVariablesComponent,\r\n EasyTuneToolComponent,\r\n EasyActiveComponent,\r\n EnableDebugComponent,\r\n EnableToolComponent,\r\n OverlapCursorComponent,\r\n FingerCursorComponent,\r\n GamepadControlSchemeComponent,\r\n GamepadMeshAnimatorComponent,\r\n GetDefaultResourcesComponent,\r\n GetSceneObjectsComponent,\r\n GrabbableComponent,\r\n GrabberHandComponent,\r\n InitConsoleVRComponent,\r\n InitEasyTuneVariablesComponent,\r\n InputManagerComponent,\r\n MuteEverythingComponent,\r\n ObjectPoolManagerComponent,\r\n PPGatewayComponent,\r\n PlayerLocomotionComponent,\r\n SaveManagerComponent,\r\n ScaleOnSpawnComponent,\r\n SetActiveComponent,\r\n SetEngineLogLevelComponent,\r\n SetHandLocalTransformComponent,\r\n SetHandRayLocalTransformComponent,\r\n SetHeadLocalTransformComponent,\r\n SetPlayerHeightComponent,\r\n SetTrackedHandJointLocalTransformComponent,\r\n ShowFPSComponent,\r\n ShowXRButtonsComponent,\r\n SpatialAudioListenerComponent,\r\n SwitchHandObjectComponent,\r\n ToggleActiveOnButtonPressComponent,\r\n ToolCursorComponent,\r\n TrackedHandDrawAllJointsComponent,\r\n TrackedHandDrawJointComponent,\r\n TrackedHandDrawSkinComponent,\r\n VirtualGamepadComponent,\r\n VisualManagerComponent\r\n );\r\n}", "import { Component, Property, WonderlandEngine, type ComponentProperty } from \"@wonderlandengine/api\";\r\nimport { AudioManagerComponent } from \"../../audio/components/audio_manager_component.js\";\r\nimport { AnalyticsManagerComponent } from \"../../cauldron/cauldron/components/analytics_manager_component.js\";\r\nimport { ClearConsoleComponent } from \"../../cauldron/cauldron/components/clear_console_component.js\";\r\nimport { SaveManagerComponent } from \"../../cauldron/cauldron/components/save_manager_component.js\";\r\nimport { ObjectPoolManagerComponent } from \"../../cauldron/object_pool/components/object_pool_manager_component.js\";\r\nimport { VisualManagerComponent } from \"../../cauldron/visual/components/visual_manager_component.js\";\r\nimport { AddWLToWindowComponent } from \"../../cauldron/wl/components/add_wl_to_window_component.js\";\r\nimport { GetDefaultResourcesComponent } from \"../../cauldron/wl/getters/components/get_default_resources_component.js\";\r\nimport { GetSceneObjectsComponent } from \"../../cauldron/wl/getters/components/get_scene_objects_component.js\";\r\nimport { DebugManagerComponent } from \"../../debug/components/debug_manager_component.js\";\r\nimport { EnableDebugComponent } from \"../../debug/components/enable_debug_component.js\";\r\nimport { CharacterCollisionSystemComponent } from \"../../gameplay/experimental/character_controller/collision/components/character_collision_system_component.js\";\r\nimport { InputManagerComponent } from \"../../input/cauldron/components/input_manager_component.js\";\r\nimport { EnableToolComponent } from \"../../tool/cauldron/components/enable_tool_component.js\";\r\nimport { InitConsoleVRComponent } from \"../../tool/console_vr/components/init_console_vr_component.js\";\r\nimport { InitEasyTuneVariablesComponent } from \"../../tool/easy_tune/components/init_easy_tune_variables_component.js\";\r\nimport { initPP } from \"../init_pp.js\";\r\nimport { AddPPToWindowComponent } from \"./add_pp_to_window_component.js\";\r\n\r\n// #TODO enable this again as soon as it is possible for the wonderland engine to find components not specified in the index.js,\r\n// since that would make the extension be included just by using the library, and not only when this component is used\r\n// import \"../../plugin/add_type_extensions_to_typescript.js\";\r\n\r\nconst _myRegisteredEngines: WeakMap, null> = new WeakMap();\r\n\r\nexport class PPGatewayComponent extends Component {\r\n public static override TypeName = \"pp-gateway\";\r\n\r\n public static override Properties = {\r\n _myEnableDebug: Property.bool(true),\r\n _myEnableTool: Property.bool(true),\r\n _myAddPPToWindow: Property.bool(true),\r\n _myAddWLToWindow: Property.bool(true),\r\n _myClearConsoleOnInit: Property.bool(false),\r\n ...InputManagerComponent.Properties,\r\n ...AudioManagerComponent.Properties,\r\n ...VisualManagerComponent.Properties,\r\n ...CharacterCollisionSystemComponent.Properties,\r\n ...ObjectPoolManagerComponent.Properties,\r\n ...SaveManagerComponent.Properties,\r\n ...AnalyticsManagerComponent.Properties,\r\n ...DebugManagerComponent.Properties,\r\n ...GetSceneObjectsComponent.Properties,\r\n ...GetDefaultResourcesComponent.Properties\r\n };\r\n\r\n private readonly _myEnableDebug!: boolean;\r\n private readonly _myEnableTool!: boolean;\r\n\r\n private readonly _myAddPPToWindow!: boolean;\r\n private readonly _myAddWLToWindow!: boolean;\r\n\r\n private readonly _myClearConsoleOnInit!: boolean;\r\n\r\n private readonly _myGetDefaultResourcesComponent!: GetDefaultResourcesComponent;\r\n private readonly _myGetSceneObjectsComponent!: GetSceneObjectsComponent;\r\n private readonly _myEnableDebugComponent!: EnableDebugComponent;\r\n private readonly _myEnableToolComponent!: EnableToolComponent;\r\n private readonly _myAddPPToWindowComponent!: AddPPToWindowComponent;\r\n private readonly _myAddWLToWindowComponent!: AddWLToWindowComponent;\r\n private readonly _myInitConsoleVRComponent!: InitConsoleVRComponent;\r\n private readonly _myInitEasyTuneVariablesComponent!: InitEasyTuneVariablesComponent;\r\n private readonly _myObjectPoolManagerComponent!: ObjectPoolManagerComponent;\r\n private readonly _myInputManagerComponent!: InputManagerComponent;\r\n private readonly _myAudioManagerComponent!: AudioManagerComponent;\r\n private readonly _myVisualManagerComponent!: VisualManagerComponent;\r\n private readonly _myCharacterCollisionSystemComponent!: CharacterCollisionSystemComponent;\r\n private readonly _mySaveManagerComponent!: SaveManagerComponent;\r\n private readonly _myAnalyticsManagerComponent!: AnalyticsManagerComponent;\r\n private readonly _myDebugManagerComponent!: DebugManagerComponent;\r\n\r\n private _myClearConsoleComponent: ClearConsoleComponent | null = null;\r\n\r\n public static override onRegister(engine: WonderlandEngine): void {\r\n if (!_myRegisteredEngines.has(engine)) {\r\n _myRegisteredEngines.set(engine, null);\r\n initPP(engine);\r\n }\r\n }\r\n\r\n public override init(): void {\r\n if (this._myClearConsoleOnInit) {\r\n this._myClearConsoleComponent = this.object.pp_addComponent(ClearConsoleComponent, false);\r\n }\r\n\r\n (this._myGetDefaultResourcesComponent as GetDefaultResourcesComponent) = this.object.pp_addComponent(GetDefaultResourcesComponent, this._getProperties(GetDefaultResourcesComponent.Properties), false)!;\r\n (this._myGetSceneObjectsComponent as GetSceneObjectsComponent) = this.object.pp_addComponent(GetSceneObjectsComponent, this._getProperties(GetSceneObjectsComponent.Properties), false)!;\r\n\r\n if (this._myEnableDebug) {\r\n (this._myEnableDebugComponent as EnableDebugComponent) = this.object.pp_addComponent(EnableDebugComponent, false)!;\r\n }\r\n\r\n if (this._myEnableTool) {\r\n (this._myEnableToolComponent as EnableToolComponent) = this.object.pp_addComponent(EnableToolComponent, false)!;\r\n }\r\n\r\n if (this._myAddPPToWindow) {\r\n (this._myAddPPToWindowComponent as AddPPToWindowComponent) = this.object.pp_addComponent(AddPPToWindowComponent, false)!;\r\n }\r\n\r\n if (this._myAddWLToWindow) {\r\n (this._myAddWLToWindowComponent as AddWLToWindowComponent) = this.object.pp_addComponent(AddWLToWindowComponent, false)!;\r\n }\r\n\r\n (this._myInitConsoleVRComponent as InitConsoleVRComponent) = this.object.pp_addComponent(InitConsoleVRComponent, false)!;\r\n (this._myInitEasyTuneVariablesComponent as InitEasyTuneVariablesComponent) = this.object.pp_addComponent(InitEasyTuneVariablesComponent, false)!;\r\n\r\n (this._myObjectPoolManagerComponent as ObjectPoolManagerComponent) = this.object.pp_addComponent(ObjectPoolManagerComponent, this._getProperties(ObjectPoolManagerComponent.Properties), false)!;\r\n (this._myInputManagerComponent as InputManagerComponent) = this.object.pp_addComponent(InputManagerComponent, this._getProperties(InputManagerComponent.Properties), false)!;\r\n (this._myAudioManagerComponent as AudioManagerComponent) = this.object.pp_addComponent(AudioManagerComponent, this._getProperties(AudioManagerComponent.Properties), false)!;\r\n (this._myVisualManagerComponent as VisualManagerComponent) = this.object.pp_addComponent(VisualManagerComponent, this._getProperties(VisualManagerComponent.Properties), false)!;\r\n (this._myCharacterCollisionSystemComponent as CharacterCollisionSystemComponent) = this.object.pp_addComponent(CharacterCollisionSystemComponent, this._getProperties(CharacterCollisionSystemComponent.Properties), false)!;\r\n (this._mySaveManagerComponent as SaveManagerComponent) = this.object.pp_addComponent(SaveManagerComponent, this._getProperties(SaveManagerComponent.Properties), false)!;\r\n (this._myAnalyticsManagerComponent as AnalyticsManagerComponent) = this.object.pp_addComponent(AnalyticsManagerComponent, this._getProperties(AnalyticsManagerComponent.Properties), false)!;\r\n\r\n (this._myDebugManagerComponent as DebugManagerComponent) = this.object.pp_addComponent(DebugManagerComponent, this._getProperties(DebugManagerComponent.Properties), false)!;\r\n }\r\n\r\n public override start(): void {\r\n if (this._myClearConsoleComponent != null) {\r\n this._myClearConsoleComponent.active = true;\r\n }\r\n\r\n this._myGetDefaultResourcesComponent.active = true;\r\n this._myGetSceneObjectsComponent.active = true;\r\n\r\n if (this._myEnableDebugComponent != null) {\r\n this._myEnableDebugComponent.active = true;\r\n }\r\n\r\n if (this._myEnableToolComponent != null) {\r\n this._myEnableToolComponent.active = true;\r\n }\r\n\r\n if (this._myAddPPToWindowComponent != null) {\r\n this._myAddPPToWindowComponent.active = true;\r\n }\r\n\r\n if (this._myAddWLToWindowComponent != null) {\r\n this._myAddWLToWindowComponent.active = true;\r\n }\r\n\r\n this._myInitConsoleVRComponent.active = true;\r\n this._myInitEasyTuneVariablesComponent.active = true;\r\n\r\n this._myObjectPoolManagerComponent.active = true;\r\n this._myInputManagerComponent.active = true;\r\n this._myAudioManagerComponent.active = true;\r\n this._myVisualManagerComponent.active = true;\r\n this._myCharacterCollisionSystemComponent.active = true;\r\n this._mySaveManagerComponent.active = true;\r\n this._myAnalyticsManagerComponent.active = true;\r\n\r\n this._myDebugManagerComponent.active = true;\r\n }\r\n\r\n private _getProperties(propertiesToGet: Readonly>): Record {\r\n const properties: Record = {};\r\n\r\n if (propertiesToGet != null) {\r\n const propertyNames = Object.getOwnPropertyNames(propertiesToGet);\r\n\r\n for (const propertyName of propertyNames) {\r\n const _this = (this as Record);\r\n if (_this[propertyName] != undefined) {\r\n properties[propertyName] = _this[propertyName];\r\n }\r\n }\r\n }\r\n\r\n return properties;\r\n }\r\n}", "import { Component, Property } from \"@wonderlandengine/api\";\r\nimport { Globals } from \"../../pp/globals.js\";\r\nimport { AudioManager } from \"../audio_manager.js\";\r\n\r\nexport class AudioManagerComponent extends Component {\r\n static TypeName = \"pp-audio-manager\";\r\n static Properties = {\r\n _myPreloadAudio: Property.bool(false),\r\n _myCleanUpAudioSourcesOnActivate: Property.bool(false)\r\n };\r\n\r\n init() {\r\n this._myAudioManager = new AudioManager(this._myPreloadAudio, this.engine);\r\n }\r\n\r\n onActivate() {\r\n if (!Globals.hasAudioManager(this.engine)) {\r\n if (this._myCleanUpAudioSourcesOnActivate) {\r\n this._myAudioManager.unloadAllAudioSources();\r\n }\r\n\r\n Globals.setAudioManager(this._myAudioManager, this.engine);\r\n }\r\n }\r\n\r\n onDeactivate() {\r\n if (Globals.getAudioManager(this.engine) == this._myAudioManager) {\r\n Globals.removeAudioManager(this.engine);\r\n }\r\n }\r\n}", "import { Howler } from \"howler\";\r\nimport { Globals } from \"../pp/globals.js\";\r\nimport { AudioPlayer } from \"./audio_player.js\";\r\n\r\nexport class AudioManager {\r\n\r\n constructor(preloadAudio = true, engine = Globals.getMainEngine()) {\r\n this._myEngine = engine;\r\n\r\n this._myPreloadAudio = preloadAudio;\r\n this._myAudioSetups = new Map();\r\n\r\n this._myAudioPlayersCreatedForPreload = [];\r\n }\r\n\r\n createAudioPlayer(audioSetupID) {\r\n let audioSetup = this.getAudioSetup(audioSetupID);\r\n if (audioSetup != null) {\r\n return new AudioPlayer(this.getAudioSetup(audioSetupID));\r\n }\r\n\r\n return null;\r\n }\r\n\r\n getAudioSetup(id) {\r\n return this._myAudioSetups.get(id);\r\n }\r\n\r\n addAudioSetup(id, audioSetup, preloadAudioOverride = null) {\r\n this._myAudioSetups.set(id, audioSetup);\r\n if ((this._myPreloadAudio && preloadAudioOverride == null) || (preloadAudioOverride != null && preloadAudioOverride)) {\r\n this._myAudioPlayersCreatedForPreload.push(this.createAudioPlayer(id));\r\n }\r\n }\r\n\r\n removeAudioSetup(id) {\r\n this._myAudioSetups.delete(id);\r\n }\r\n\r\n setVolume(volume) {\r\n Howler.volume(volume);\r\n }\r\n\r\n setMute(mute) {\r\n Howler.mute(mute);\r\n }\r\n\r\n stop() {\r\n Howler.stop();\r\n }\r\n\r\n unloadAllAudioSources() {\r\n Howler.unload();\r\n }\r\n}", "import { RetainEmitter } from \"@wonderlandengine/api\";\r\nimport { Howl, Howler } from \"howler\";\r\nimport { AudioSetup } from \"./audio_setup.js\";\r\n\r\nexport let AudioEvent = {\r\n END: \"end\",\r\n STOP: \"stop\",\r\n LOAD: \"load\",\r\n LOAD_ERROR: \"loaderror\",\r\n PLAY: \"play\",\r\n PLAY_ERROR: \"playerror\",\r\n PAUSE: \"pause\",\r\n MUTE: \"mute\",\r\n VOLUME: \"volume\",\r\n RATE: \"rate\",\r\n SEEK: \"seek\",\r\n FADE: \"fade\",\r\n UNLOCK: \"unlock\"\r\n};\r\n\r\nexport class AudioPlayer {\r\n\r\n /**\r\n * TS type inference helper\r\n * \r\n * @param {any} audioInstance\r\n */\r\n constructor(audioSetupOrAudioFilePath, audioInstance = null) {\r\n if (audioSetupOrAudioFilePath == null) {\r\n this._myAudioSetup = new AudioSetup();\r\n } else if (typeof audioSetupOrAudioFilePath == \"string\") {\r\n this._myAudioSetup = new AudioSetup(audioSetupOrAudioFilePath);\r\n } else {\r\n this._myAudioSetup = audioSetupOrAudioFilePath.clone();\r\n }\r\n\r\n this._myAudio = null;\r\n\r\n if (audioInstance == null) {\r\n this._myAudio = new Howl({\r\n src: [this._myAudioSetup.myAudioFilePath],\r\n loop: this._myAudioSetup.myLoop,\r\n volume: this._myAudioSetup.myVolume,\r\n autoplay: false,\r\n rate: this._myAudioSetup.myRate,\r\n pool: this._myAudioSetup.myPool,\r\n pos: (this._myAudioSetup.mySpatial) ? this._myAudioSetup.myPosition : null,\r\n refDistance: this._myAudioSetup.myReferenceDistance,\r\n preload: this._myAudioSetup.myPreload\r\n });\r\n\r\n this._myAudio._pannerAttr.refDistance = this._myAudioSetup.myReferenceDistance;\r\n } else {\r\n this._myAudio = audioInstance;\r\n }\r\n\r\n this._myLastAudioID = null;\r\n\r\n this._myAudioEventEmitters = new Map();\r\n for (let eventKey in AudioEvent) {\r\n this._myAudioEventEmitters.set(AudioEvent[eventKey], new RetainEmitter()); // Signature: listener(audioID)\r\n }\r\n\r\n this._addListeners();\r\n\r\n if (this._myAudioSetup.myAutoPlay) {\r\n this.play();\r\n }\r\n\r\n this._myDestroyed = false;\r\n }\r\n\r\n isValid() {\r\n return this._myAudio != null;\r\n }\r\n\r\n play() {\r\n if (Howler.state != \"running\" && this._myAudioSetup.myPreventPlayWhenAudioContextNotRunning) {\r\n return false;\r\n }\r\n\r\n let audioID = this._myAudio.play();\r\n if (audioID != null) {\r\n this._myLastAudioID = audioID;\r\n\r\n this.updatePosition(this._myAudioSetup.myPosition, true);\r\n this.updatePitch(this._myAudioSetup.myPitch, true);\r\n this.updateVolume(this._myAudioSetup.myVolume, true);\r\n }\r\n\r\n return audioID != null;\r\n }\r\n\r\n stop() {\r\n this._myAudio.stop();\r\n }\r\n\r\n pause() {\r\n this._myAudio.pause();\r\n }\r\n\r\n resume() {\r\n this._myAudio.play();\r\n }\r\n\r\n isPlaying(checkOnlyLast = false) {\r\n let playing = false;\r\n\r\n if (checkOnlyLast) {\r\n playing = this._myAudio.playing(this._myLastAudioID);\r\n }\r\n else {\r\n playing = this._myAudio.playing();\r\n }\r\n\r\n return playing;\r\n }\r\n\r\n isLoaded() {\r\n return this._myAudio.state() == \"loaded\";\r\n }\r\n\r\n fade(fromVolume, toVolume, duration, updateOnlyLast = true, setValueOnPlayer = true) {\r\n if (setValueOnPlayer) {\r\n this.setVolume(toVolume);\r\n }\r\n\r\n if (updateOnlyLast) {\r\n this._myAudio.fade(fromVolume, toVolume, duration * 1000, this._myLastAudioID);\r\n } else {\r\n this._myAudio.fade(fromVolume, toVolume, duration * 1000);\r\n }\r\n }\r\n\r\n isFading(checkOnlyLast = true) {\r\n let fading = false;\r\n\r\n if (checkOnlyLast) {\r\n let lastSound = this._myAudio._soundById(this._myLastAudioID);\r\n if (lastSound != null) {\r\n fading = lastSound._fadeTo != null;\r\n }\r\n } else {\r\n for (let sound of this._myAudio._sounds) {\r\n if (sound._fadeTo != null) {\r\n fading = true;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return fading;\r\n }\r\n\r\n updatePosition(position, updateOnlyLast = true, setValueOnPlayer = true) {\r\n if (setValueOnPlayer) {\r\n this.setPosition(position);\r\n }\r\n\r\n if (this._myAudioSetup.mySpatial && position) {\r\n if (updateOnlyLast) {\r\n this._myAudio.pos(position[0], position[1], position[2], this._myLastAudioID);\r\n } else {\r\n this._myAudio.pos(position[0], position[1], position[2]);\r\n }\r\n }\r\n }\r\n\r\n updatePitch(pitch, updateOnlyLast = true, setValueOnPlayer = true) {\r\n this.updateRate(pitch, updateOnlyLast, setValueOnPlayer);\r\n }\r\n\r\n updateRate(rate, updateOnlyLast = true, setValueOnPlayer = true) {\r\n if (setValueOnPlayer) {\r\n this.setRate(rate);\r\n }\r\n\r\n if (rate != null) {\r\n if (updateOnlyLast) {\r\n this._myAudio.rate(rate, this._myLastAudioID);\r\n } else {\r\n this._myAudio.rate(rate);\r\n }\r\n }\r\n }\r\n\r\n updateVolume(volume, updateOnlyLast = true, setValueOnPlayer = true) {\r\n if (setValueOnPlayer) {\r\n this.setVolume(volume);\r\n }\r\n\r\n if (volume != null) {\r\n if (updateOnlyLast) {\r\n this._myAudio.volume(volume, this._myLastAudioID);\r\n } else {\r\n this._myAudio.volume(volume);\r\n }\r\n }\r\n }\r\n\r\n setSpatial(spatial) {\r\n this._myAudioSetup.mySpatial = spatial;\r\n }\r\n\r\n setPosition(position) {\r\n this._myAudioSetup.myPosition = position;\r\n }\r\n\r\n setPitch(pitch) {\r\n this._myAudioSetup.myPitch = pitch;\r\n }\r\n\r\n setRate(rate) {\r\n this._myAudioSetup.myRate = rate;\r\n }\r\n\r\n setVolume(volume) {\r\n this._myAudioSetup.myVolume = volume;\r\n }\r\n\r\n getDuration() {\r\n return this._myAudio.duration();\r\n }\r\n\r\n getVolume() {\r\n return this._myAudioSetup.myVolume;\r\n }\r\n\r\n getPitch() {\r\n return this._myAudioSetup.myPitch;\r\n }\r\n\r\n getRate() {\r\n return this._myAudioSetup.myRate;\r\n }\r\n\r\n registerAudioEventListener(audioEvent, id, listener, notifyOnce = false, notifyIfAlreadyHappened = false) {\r\n this._myAudioEventEmitters.get(audioEvent).add(listener, { id: id, once: notifyOnce, immediate: notifyIfAlreadyHappened });\r\n }\r\n\r\n unregisterAudioEventListener(audioEvent, id) {\r\n this._myAudioEventEmitters.get(audioEvent).remove(id);\r\n }\r\n\r\n _addListeners() {\r\n if (this._myAudio != null) {\r\n for (let eventKey in AudioEvent) {\r\n let event = AudioEvent[eventKey];\r\n this._myAudio.on(event, function (audioID) {\r\n let emitter = this._myAudioEventEmitters.get(event);\r\n emitter.notify(audioID);\r\n }.bind(this));\r\n }\r\n }\r\n }\r\n\r\n destroy() {\r\n this._myDestroyed = true;\r\n\r\n this._myAudio.unload();\r\n }\r\n\r\n isDestroyed() {\r\n return this._myDestroyed;\r\n }\r\n}", "import { Vector3 } from \"../cauldron/type_definitions/array_type_definitions.js\";\r\n\r\nexport class AudioSetup {\r\n\r\n public myAudioFilePath: string | null = null;\r\n\r\n public myLoop: boolean = false;\r\n public myAutoPlay: boolean = false;\r\n\r\n public myVolume: number = 1.0;\r\n\r\n /** From `0.5` to `4.0` */\r\n public _myRate: number = 1.0;\r\n\r\n public myPool: number = 5;\r\n public myPreload: boolean = true;\r\n\r\n public myPreventPlayWhenAudioContextNotRunning: boolean = false;\r\n\r\n // Spatial Params\r\n\r\n public myPosition: Vector3 | null = null;\r\n public mySpatial: boolean = true;\r\n\r\n /** At this distance (and closer) the volume is not reduced */\r\n public myReferenceDistance: number = 1;\r\n\r\n // End Spatial Params\r\n\r\n constructor(audioFilePath?: string) {\r\n if (audioFilePath != null) {\r\n this.myAudioFilePath = audioFilePath;\r\n }\r\n }\r\n\r\n public clone(): AudioSetup {\r\n const audioSetup = new AudioSetup();\r\n\r\n audioSetup.myAudioFilePath = this.myAudioFilePath;\r\n\r\n audioSetup.myLoop = this.myLoop;\r\n audioSetup.myAutoPlay = this.myAutoPlay;\r\n\r\n audioSetup.myVolume = this.myVolume;\r\n audioSetup.myPitch = this.myPitch;\r\n audioSetup.myRate = this.myRate;\r\n\r\n audioSetup.myPool = this.myPool;\r\n audioSetup.myPreload = this.myPreload;\r\n\r\n audioSetup.myPreventPlayWhenAudioContextNotRunning = this.myPreventPlayWhenAudioContextNotRunning;\r\n\r\n // Spatial\r\n\r\n if (this.myPosition != null) {\r\n audioSetup.myPosition = this.myPosition.vec3_clone();\r\n } else {\r\n audioSetup.myPosition = null;\r\n }\r\n\r\n audioSetup.mySpatial = this.mySpatial;\r\n audioSetup.myReferenceDistance = this.myReferenceDistance;\r\n\r\n return audioSetup;\r\n }\r\n\r\n get myPitch(): number {\r\n return this._myRate;\r\n }\r\n\r\n get myRate(): number {\r\n return this._myRate;\r\n }\r\n\r\n set myPitch(pitch) {\r\n this._myRate = pitch;\r\n }\r\n\r\n set myRate(rate) {\r\n this._myRate = rate;\r\n }\r\n}", "import { Component, Property } from \"@wonderlandengine/api\";\r\nimport { Globals } from \"../../../pp/globals.js\";\r\nimport { BrowserUtils } from \"../../utils/browser_utils.js\";\r\nimport { AnalyticsManager } from \"../analytics_manager.js\";\r\n\r\nexport class AnalyticsManagerComponent extends Component {\r\n static TypeName = \"pp-analytics-manager\";\r\n static Properties = {\r\n _myDisableAnalyticsOnLocalhost: Property.bool(true)\r\n };\r\n\r\n init() {\r\n this._myAnalyticsManager = new AnalyticsManager();\r\n }\r\n\r\n update(dt) {\r\n if (Globals.getAnalyticsManager(this.engine) == this._myAnalyticsManager) {\r\n this._myAnalyticsManager.update(dt);\r\n }\r\n }\r\n\r\n onActivate() {\r\n if (!Globals.hasAnalyticsManager(this.engine)) {\r\n if (BrowserUtils.isLocalhost() && this._myDisableAnalyticsOnLocalhost) {\r\n this._myAnalyticsManager.setAnalyticsEnabled(false);\r\n }\r\n\r\n Globals.setAnalyticsManager(this._myAnalyticsManager, this.engine);\r\n }\r\n }\r\n\r\n onDeactivate() {\r\n if (Globals.getAnalyticsManager(this.engine) == this._myAnalyticsManager) {\r\n Globals.removeAnalyticsManager(this.engine);\r\n }\r\n }\r\n}", "import { WonderlandEngine, type RetainListenerOptions } from \"@wonderlandengine/api\";\r\nimport { Globals } from \"../../pp/globals.js\";\r\nimport { BrowserUtils } from \"./browser_utils.js\";\r\n\r\nexport function getSession(engine: Readonly = Globals.getMainEngine()!): XRSession | null {\r\n const xr = Globals.getXR(engine);\r\n return xr != null ? xr.session : null;\r\n}\r\n\r\nexport function getSessionMode(engine: Readonly = Globals.getMainEngine()!): XRSessionMode | null {\r\n const xr = Globals.getXR(engine);\r\n return xr != null ? xr.sessionMode : null;\r\n}\r\n\r\nexport function getReferenceSpace(engine: Readonly = Globals.getMainEngine()!): XRReferenceSpace | null {\r\n const xr = Globals.getXR(engine);\r\n return xr != null ? xr.currentReferenceSpace : null;\r\n}\r\n\r\nexport function getReferenceSpaceType(engine: Readonly = Globals.getMainEngine()!): XRReferenceSpaceType | null {\r\n let type: XRReferenceSpaceType | null = \"local\";\r\n\r\n try {\r\n const xr = Globals.getXR(engine);\r\n type = xr != null ? xr.currentReferenceSpaceType : null;\r\n } catch (error) {\r\n // Do nothing\r\n }\r\n\r\n return type;\r\n}\r\n\r\nexport function getFrame(engine: Readonly = Globals.getMainEngine()!): XRFrame | null {\r\n const xr = Globals.getXR(engine);\r\n return xr != null ? xr.frame : null;\r\n}\r\n\r\nexport function isSessionActive(engine: Readonly = Globals.getMainEngine()!): boolean {\r\n return XRUtils.getSession(engine) != null;\r\n}\r\n\r\nexport function isReferenceSpaceFloorBased(engine: Readonly = Globals.getMainEngine()!): boolean {\r\n const referenceSpaceType = XRUtils.getReferenceSpaceType(engine);\r\n return referenceSpaceType != null ? referenceSpaceType.includes(\"floor\") : false;\r\n}\r\n\r\nexport function exitSession(engine: Readonly = Globals.getMainEngine()!): void {\r\n const xrSession = XRUtils.getSession(engine);\r\n\r\n if (xrSession != null) {\r\n xrSession.end();\r\n }\r\n}\r\n\r\nexport function registerSessionStartEventListener(id: unknown, listener: ((xrSession: XRSession, xrSessionMode: XRSessionMode) => void) | ((manualCall: boolean, xrSession: XRSession, xrSessionMode: XRSessionMode) => void), manuallyCallSessionStartIfSessionAlreadyActive = true, addManualCallFlagToStartListener = false, engine: Readonly = Globals.getMainEngine()!): void {\r\n if (listener != null) {\r\n if (addManualCallFlagToStartListener) {\r\n const manualStartListener = listener as (manualCall: boolean, xrSession: XRSession, xrSessionMode: XRSessionMode) => void;\r\n engine.onXRSessionStart.add(manualStartListener.bind(undefined, false), { id: id, immediate: false } as RetainListenerOptions);\r\n } else {\r\n const standardListener = listener as (xrSession: XRSession, xrSessionMode: XRSessionMode) => void;\r\n engine.onXRSessionStart.add(standardListener, { id: id, immediate: false } as RetainListenerOptions);\r\n }\r\n\r\n if (manuallyCallSessionStartIfSessionAlreadyActive && XRUtils.isSessionActive(engine)) {\r\n if (addManualCallFlagToStartListener) {\r\n const manualStartListener = listener as (manualCall: boolean, xrSession: XRSession, xrSessionMode: XRSessionMode) => void;\r\n manualStartListener(true, XRUtils.getSession(engine)!, XRUtils.getSessionMode(engine)!);\r\n } else {\r\n const standardListener = listener as (xrSession: XRSession, xrSessionMode: XRSessionMode) => void;\r\n standardListener(XRUtils.getSession(engine)!, XRUtils.getSessionMode(engine)!);\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport function unregisterSessionStartEventListener(id: unknown, engine: Readonly = Globals.getMainEngine()!): void {\r\n engine.onXRSessionStart.remove(id);\r\n}\r\n\r\nexport function registerSessionEndEventListener(id: unknown, listener: () => void, engine: Readonly = Globals.getMainEngine()!): void {\r\n if (listener != null) {\r\n engine.onXRSessionEnd.add(listener, { id: id });\r\n }\r\n}\r\n\r\nexport function unregisterSessionEndEventListener(id: unknown, engine: Readonly = Globals.getMainEngine()!): void {\r\n engine.onXRSessionEnd.remove(id);\r\n}\r\n\r\nexport function registerSessionStartEndEventListeners(id: unknown, startListener: ((xrSession: XRSession, xrSessionMode: XRSessionMode) => void) | ((manualCall: boolean, xrSession: XRSession, xrSessionMode: XRSessionMode) => void), endListener: () => void, manuallyCallSessionStartIfSessionAlreadyActive = true, addManualCallFlagToStartListener = false, engine: Readonly = Globals.getMainEngine()!): void {\r\n XRUtils.registerSessionEndEventListener(id, endListener, engine);\r\n XRUtils.registerSessionStartEventListener(id, startListener, manuallyCallSessionStartIfSessionAlreadyActive, addManualCallFlagToStartListener, engine);\r\n}\r\n\r\nexport function unregisterSessionStartEndEventListeners(id: unknown, engine: Readonly = Globals.getMainEngine()!): void {\r\n XRUtils.unregisterSessionEndEventListener(id, engine);\r\n XRUtils.unregisterSessionStartEventListener(id, engine);\r\n}\r\n\r\nexport function isXRSupported(engine: Readonly = Globals.getMainEngine()!): boolean {\r\n return XRUtils.isVRSupported(engine) || XRUtils.isARSupported(engine);\r\n}\r\n\r\nexport function isVRSupported(engine: Readonly = Globals.getMainEngine()!): boolean {\r\n return engine.vrSupported;\r\n}\r\n\r\nexport function isARSupported(engine: Readonly = Globals.getMainEngine()!): boolean {\r\n return engine.arSupported;\r\n}\r\n\r\nexport function isDeviceEmulated(onlyOnLocalhost: boolean = true): boolean {\r\n const emulated = (window as unknown as { CustomWebXRPolyfill: unknown }).CustomWebXRPolyfill != null && (!onlyOnLocalhost || BrowserUtils.isLocalhost());\r\n return emulated;\r\n}\r\n\r\nexport const XRUtils = {\r\n getSession,\r\n getSessionMode,\r\n getReferenceSpace,\r\n getReferenceSpaceType,\r\n getFrame,\r\n isSessionActive,\r\n exitSession,\r\n registerSessionStartEventListener,\r\n unregisterSessionStartEventListener,\r\n registerSessionEndEventListener,\r\n unregisterSessionEndEventListener,\r\n registerSessionStartEndEventListeners,\r\n unregisterSessionStartEndEventListeners,\r\n isReferenceSpaceFloorBased,\r\n isXRSupported,\r\n isVRSupported,\r\n isARSupported,\r\n isDeviceEmulated\r\n} as const;", "import { Globals } from \"../../pp/globals.js\";\r\nimport { XRUtils } from \"./xr_utils.js\";\r\n\r\nexport let isMobile = function () {\r\n let checkMobileRegex = new RegExp(\"Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini\", \"i\");\r\n return function isMobile() {\r\n let userAgent = navigator.userAgent;\r\n return userAgent != null && userAgent.match(checkMobileRegex) != null;\r\n };\r\n}();\r\n\r\nexport function isDesktop() {\r\n return !BrowserUtils.isMobile();\r\n}\r\n\r\nexport let isLocalhost = function () {\r\n let localhostRegex = new RegExp(\"(localhost|127\\\\.0\\\\.0\\\\.1)(:(\\\\d{4}))?\");\r\n return function isLocalhost(port = null, isRegex = false) {\r\n let isLocalhost = false;\r\n\r\n let localhostMatch = window.location.origin.match(localhostRegex);\r\n\r\n if (localhostMatch != null) {\r\n if (port == null) {\r\n isLocalhost = true;\r\n } else if (localhostMatch.length >= 4 && localhostMatch[3] != null) {\r\n let portMatch = localhostMatch[3];\r\n if (isRegex) {\r\n isLocalhost = portMatch.match(port) != null;\r\n } else {\r\n isLocalhost = portMatch == port;\r\n }\r\n }\r\n }\r\n\r\n return isLocalhost;\r\n };\r\n}();\r\n\r\nexport function openLink(url, newTab = true, exitXRSessionBeforeOpen = true, exitXRSessionOnSuccess = true, tryOpenLinkOnClickOnFailure = false, onSuccessCallback = null, onFailureCallback = null, engine = Globals.getMainEngine()) {\r\n let element = document.createElement(\"a\");\r\n\r\n element.style.display = \"none\";\r\n\r\n document.body.appendChild(element);\r\n\r\n element.addEventListener(\"click\", function () {\r\n let targetPage = undefined;\r\n if (newTab) {\r\n targetPage = \"_blank\";\r\n } else {\r\n targetPage = \"_top\";\r\n }\r\n\r\n let result = window.open(url, targetPage);\r\n\r\n if (result != null) {\r\n if (!exitXRSessionBeforeOpen && exitXRSessionOnSuccess) {\r\n XRUtils.exitSession(engine);\r\n }\r\n\r\n if (onSuccessCallback != null) {\r\n onSuccessCallback();\r\n }\r\n } else {\r\n if (tryOpenLinkOnClickOnFailure) {\r\n setTimeout(function () {\r\n BrowserUtils.openLinkOnClick(url, newTab, exitXRSessionOnSuccess, onSuccessCallback, onFailureCallback);\r\n }, 100);\r\n } else if (onFailureCallback != null) {\r\n onFailureCallback();\r\n }\r\n }\r\n });\r\n\r\n if (exitXRSessionBeforeOpen) {\r\n XRUtils.exitSession(engine);\r\n }\r\n\r\n element.click();\r\n\r\n document.body.removeChild(element);\r\n}\r\n\r\nexport function openLinkOnClick(url, newTab = true, exitXRSessionOnSuccess = true, onSuccessCallback = null, onFailureCallback = null, engine = Globals.getMainEngine()) {\r\n document.addEventListener(\"click\", function () {\r\n let targetPage = undefined;\r\n if (newTab) {\r\n targetPage = \"_blank\";\r\n } else {\r\n targetPage = \"_top\";\r\n }\r\n\r\n let result = window.open(url, targetPage);\r\n\r\n if (result != null) {\r\n if (exitXRSessionOnSuccess) {\r\n XRUtils.exitSession(engine);\r\n }\r\n\r\n if (onSuccessCallback != null) {\r\n onSuccessCallback();\r\n }\r\n } else {\r\n if (onFailureCallback != null) {\r\n onFailureCallback();\r\n }\r\n }\r\n }, { once: true });\r\n}\r\n\r\nexport let BrowserUtils = {\r\n isMobile,\r\n isDesktop,\r\n isLocalhost,\r\n openLink,\r\n openLinkOnClick\r\n};", "\r\nexport class AnalyticsManager {\r\n\r\n private _myAnalyticsEnabled: boolean = true;\r\n\r\n private _mySendDataCallback: ((...args: unknown[]) => void) | null = null;\r\n\r\n private _myDefaultEventCooldown: number = 0;\r\n private _myEventCooldowns: Map = new Map();\r\n\r\n private _myEventsSentOnce: string[] = [];\r\n\r\n private _myDataLogEnabled: boolean = false;\r\n private _myEventsLogEnabled: boolean = false;\r\n\r\n private _myErrorsLogEnabled: boolean = false;\r\n\r\n public update(dt: number): void {\r\n if (this._myEventCooldowns.size > 0) {\r\n for (const [eventName, eventCooldown] of this._myEventCooldowns.entries()) {\r\n const newCooldown = eventCooldown - dt;\r\n if (newCooldown <= 0) {\r\n this._myEventCooldowns.delete(eventName);\r\n } else {\r\n this._myEventCooldowns.set(eventName, newCooldown);\r\n }\r\n }\r\n }\r\n }\r\n\r\n public setAnalyticsEnabled(enabled: boolean): void {\r\n this._myAnalyticsEnabled = enabled;\r\n }\r\n\r\n public isAnalyticsEnabled(): boolean {\r\n return this._myAnalyticsEnabled;\r\n }\r\n\r\n public setSendDataCallback(callback: ((...args: unknown[]) => void) | null): void {\r\n this._mySendDataCallback = callback;\r\n }\r\n\r\n public sendData(...args: unknown[]): boolean {\r\n let dataSent = false;\r\n\r\n try {\r\n if (this._myAnalyticsEnabled) {\r\n if (this._myDataLogEnabled) {\r\n console.log(\"Analytics Data: \" + args);\r\n }\r\n\r\n if (this._mySendDataCallback != null) {\r\n this._mySendDataCallback(...args);\r\n\r\n dataSent = true;\r\n } else if (this._myErrorsLogEnabled) {\r\n console.error(\"Analytics Error: You need to set the send data callback\");\r\n } else {\r\n console.warn(\"Analytics Error: You need to set the send data callback\");\r\n }\r\n }\r\n } catch (error) {\r\n if (this._myErrorsLogEnabled) {\r\n console.error(error);\r\n }\r\n\r\n dataSent = false;\r\n }\r\n\r\n return dataSent;\r\n }\r\n\r\n public sendEvent(eventName: string, params?: Record): boolean {\r\n let eventSent = false;\r\n\r\n try {\r\n if (this._myAnalyticsEnabled) {\r\n if (this._myEventsLogEnabled) {\r\n if (params != null) {\r\n console.log(\"Analytics Event: \" + eventName + \" - Params:\", params);\r\n } else {\r\n console.log(\"Analytics Event: \" + eventName);\r\n }\r\n }\r\n\r\n if (this._mySendDataCallback != null) {\r\n if (params != null) {\r\n this._mySendDataCallback(\"event\", eventName, params);\r\n } else {\r\n this._mySendDataCallback(\"event\", eventName);\r\n }\r\n\r\n eventSent = true;\r\n } else if (this._myErrorsLogEnabled) {\r\n console.error(\"Analytics Error: You need to set the send data callback\");\r\n } else {\r\n console.warn(\"Analytics Error: You need to set the send data callback\");\r\n }\r\n }\r\n } catch (error) {\r\n if (this._myErrorsLogEnabled) {\r\n console.error(error);\r\n }\r\n\r\n eventSent = false;\r\n }\r\n\r\n return eventSent;\r\n }\r\n\r\n public sendEventOnce(eventName: string, params?: Record): boolean {\r\n let eventSent = false;\r\n\r\n if (this._myAnalyticsEnabled) {\r\n if (!this.hasEventAlreadyBeenSent(eventName)) {\r\n eventSent = this.sendEvent(eventName, params);\r\n\r\n if (eventSent) {\r\n this._myEventsSentOnce.pp_pushUnique(eventName);\r\n }\r\n }\r\n }\r\n\r\n return eventSent;\r\n }\r\n\r\n public sendEventWithValue(eventName: string, value: number): boolean {\r\n return this.sendEvent(eventName, { \"value\": value });\r\n }\r\n\r\n public sendEventOnceWithValue(eventName: string, value: number): boolean {\r\n return this.sendEventOnce(eventName, { \"value\": value });\r\n }\r\n\r\n public clearEventSentOnceState(eventName: string): void {\r\n this._myEventsSentOnce.pp_removeEqual(eventName);\r\n }\r\n\r\n public clearAllEventsSentOnceState(): void {\r\n this._myEventsSentOnce.pp_clear();\r\n }\r\n\r\n public hasEventAlreadyBeenSent(eventName: string): boolean {\r\n return this._myEventsSentOnce.pp_hasEqual(eventName);\r\n }\r\n\r\n public getEventsAlreadyBeenSent(): string[] {\r\n return this._myEventsSentOnce;\r\n }\r\n\r\n public sendEventWithCooldown(eventName: string, cooldownSeconds: number = this._myDefaultEventCooldown, params?: Record): boolean {\r\n let eventSent = false;\r\n\r\n if (this._myAnalyticsEnabled) {\r\n if (this.getEventCooldown(eventName) <= 0) {\r\n eventSent = this.sendEvent(eventName, params);\r\n\r\n if (eventSent) {\r\n this._myEventCooldowns.set(eventName, cooldownSeconds);\r\n }\r\n }\r\n }\r\n\r\n return eventSent;\r\n }\r\n\r\n public getDefaultEventCooldown(): number {\r\n return this._myDefaultEventCooldown;\r\n }\r\n\r\n public setDefaultEventCooldown(cooldownSeconds: number): void {\r\n this._myDefaultEventCooldown = cooldownSeconds;\r\n }\r\n\r\n public clearEventCooldown(eventName: string): void {\r\n this._myEventCooldowns.delete(eventName);\r\n }\r\n\r\n public clearAllEventCooldowns(): void {\r\n this._myEventCooldowns.clear();\r\n }\r\n\r\n public getEventCooldown(eventName: string): number {\r\n const eventCooldown = this._myEventCooldowns.get(eventName);\r\n\r\n if (eventCooldown != null) {\r\n return eventCooldown;\r\n }\r\n\r\n return 0;\r\n }\r\n\r\n public getEventCooldowns(): Map {\r\n return this._myEventCooldowns;\r\n }\r\n\r\n public setDataLogEnabled(enabled: boolean): void {\r\n this._myDataLogEnabled = enabled;\r\n }\r\n\r\n public isDataLogEnabled(): boolean {\r\n return this._myDataLogEnabled;\r\n }\r\n\r\n public setEventsLogEnabled(enabled: boolean): void {\r\n this._myEventsLogEnabled = enabled;\r\n }\r\n\r\n public isEventsLogEnabled(): boolean {\r\n return this._myEventsLogEnabled;\r\n }\r\n\r\n public setErrorsLogEnabled(enabled: boolean): void {\r\n this._myErrorsLogEnabled = enabled;\r\n }\r\n\r\n public isErrorsLogEnabled(): boolean {\r\n return this._myErrorsLogEnabled;\r\n }\r\n}", "import { Component, property } from \"@wonderlandengine/api\";\r\nimport { XRUtils } from \"../../../cauldron/utils/xr_utils.js\";\r\n\r\nexport class ClearConsoleComponent extends Component {\r\n public static override TypeName = \"pp-clear-console\";\r\n\r\n @property.enum([\"Init\", \"Start\", \"Update\", \"Enter XR\", \"Exit XR\"], \"Init\")\r\n private _myWhen!: number;\r\n\r\n @property.bool(true)\r\n private _myFirstTimeOnly!: boolean;\r\n\r\n private _myFirstTimeDone: boolean = false;\r\n\r\n public override init(): void {\r\n if (this._myWhen == 0) {\r\n this._clearConsole();\r\n }\r\n }\r\n\r\n public override start(): void {\r\n if (this._myWhen == 1) {\r\n this._clearConsole();\r\n }\r\n }\r\n\r\n public override update(dt: number): void {\r\n if (this._myWhen == 2) {\r\n this._clearConsole();\r\n }\r\n }\r\n\r\n private _onXRSessionStart(): void {\r\n if (this._myWhen == 3) {\r\n this._clearConsole();\r\n }\r\n }\r\n\r\n private _onXRSessionEnd(): void {\r\n if (this._myWhen == 4) {\r\n this._clearConsole();\r\n }\r\n }\r\n\r\n private _clearConsole(): void {\r\n if (!this._myFirstTimeOnly || !this._myFirstTimeDone) {\r\n console.clear();\r\n\r\n this._myFirstTimeDone = true;\r\n }\r\n\r\n if (this._myFirstTimeOnly && this._myFirstTimeDone) {\r\n this.active = false;\r\n }\r\n }\r\n\r\n public override onActivate(): void {\r\n if (this._myWhen == 3) {\r\n XRUtils.registerSessionStartEventListener(this, this._onXRSessionStart.bind(this), true, true, this.engine);\r\n }\r\n\r\n if (this._myWhen == 4) {\r\n XRUtils.registerSessionEndEventListener(this, this._onXRSessionEnd.bind(this), this.engine);\r\n }\r\n }\r\n\r\n public override onDeactivate(): void {\r\n XRUtils.unregisterSessionStartEndEventListeners(this, this.engine);\r\n }\r\n}", "import { Component, Property } from \"@wonderlandengine/api\";\r\nimport { Globals } from \"../../../pp/globals.js\";\r\nimport { SaveManager } from \"../save_manager.js\";\r\n\r\nexport class SaveManagerComponent extends Component {\r\n static TypeName = \"pp-save-manager\";\r\n static Properties = {\r\n _mySaveID: Property.string(\"\"),\r\n _myAutoLoadSaves: Property.bool(true)\r\n };\r\n\r\n init() {\r\n this._mySaveManager = null;\r\n\r\n if (this._mySaveID.length > 0) {\r\n this._mySaveManager = new SaveManager(this._mySaveID, this._myAutoLoadSaves, this.engine);\r\n }\r\n }\r\n\r\n update(dt) {\r\n if (this._mySaveManager != null && Globals.getSaveManager(this.engine) == this._mySaveManager) {\r\n this._mySaveManager.update(dt);\r\n }\r\n }\r\n\r\n onActivate() {\r\n if (this._mySaveManager != null && !Globals.hasSaveManager(this.engine)) {\r\n this._mySaveManager.setActive(true);\r\n\r\n Globals.setSaveManager(this._mySaveManager, this.engine);\r\n }\r\n }\r\n\r\n onDeactivate() {\r\n if (this._mySaveManager != null) {\r\n this._mySaveManager.setActive(false);\r\n\r\n if (Globals.getSaveManager(this.engine) == this._mySaveManager) {\r\n Globals.removeSaveManager(this.engine);\r\n }\r\n }\r\n }\r\n\r\n onDestroy() {\r\n if (this._mySaveManager != null) {\r\n this._mySaveManager.destroy();\r\n }\r\n }\r\n}", "import { Emitter } from \"@wonderlandengine/api\";\r\nimport { Globals } from \"../../pp/globals.js\";\r\nimport { SaveUtils } from \"../utils/save_utils.js\";\r\nimport { XRUtils } from \"../utils/xr_utils.js\";\r\nimport { Timer } from \"./timer.js\";\r\n\r\nexport class SaveManager {\r\n\r\n constructor(saveID, autoLoadSaves = true, engine = Globals.getMainEngine()) {\r\n this._myEngine = engine;\r\n\r\n this._mySaveID = saveID;\r\n\r\n this._myCommitSavesDelayTimer = new Timer(0, false);\r\n this._myDelaySavesCommit = true;\r\n this._myCommitSavesDirty = false;\r\n this._myCommitSavesDirtyClearOnFail = true;\r\n this._myCommitSavesOnInterrupt = true;\r\n this._myCommitSavesWhenLoadSavesFailed = false;\r\n this._myResetSaveObjectOnLoadSavesFail = false;\r\n\r\n this._mySaveObject = {};\r\n this._myLoadSavesSucceded = false;\r\n\r\n this._mySaveObjectLoadedOnce = false;\r\n this._myAtLeastOneValueSavedOnce = false;\r\n\r\n this._myClearEmitter = new Emitter(); // Signature: listener()\r\n this._myDeleteEmitter = new Emitter(); // Signature: listener(id)\r\n this._myDeleteIDEmitters = new Map(); // Signature: listener(id)\r\n this._mySaveEmitter = new Emitter(); // Signature: listener(id, value)\r\n this._mySaveValueChangedEmitter = new Emitter(); // Signature: listener(id, value)\r\n this._mySaveIDEmitters = new Map(); // Signature: listener(id, value)\r\n this._mySaveValueChangedIDEmitters = new Map(); // Signature: listener(id, value)\r\n this._myCommitSavesEmitter = new Emitter(); // Signature: listener(succeeded)\r\n this._myLoadEmitter = new Emitter(); // Signature: listener(id, value)\r\n this._myLoadIDEmitters = new Map(); // Signature: listener(id, value)\r\n this._myLoadSavesEmitter = new Emitter(); // Signature: listener(loadSavesSucceded, saveObjectReset)\r\n\r\n if (autoLoadSaves) {\r\n this.loadSaves();\r\n }\r\n\r\n this._myXRVisibilityChangeEventListener = null;\r\n this._myWindowVisibilityChangeEventListener = function () {\r\n if (document.visibilityState != \"visible\") {\r\n this._onInterrupt();\r\n }\r\n }.bind(this);\r\n\r\n this._myActive = false;\r\n this.setActive(true);\r\n\r\n this._myDestroyed = false;\r\n }\r\n\r\n setCommitSavesDelay(delay) {\r\n this._myCommitSavesDelayTimer.start(delay);\r\n }\r\n\r\n setDelaySavesCommit(delayed) {\r\n this._myDelaySavesCommit = delayed;\r\n }\r\n\r\n setCommitSavesDirty(dirty, startDelayTimer = true) {\r\n this._myCommitSavesDirty = dirty;\r\n if (dirty && startDelayTimer) {\r\n if (!this.startDelayTimer.isRunning()) {\r\n this._myCommitSavesDelayTimer.start();\r\n }\r\n } else {\r\n this._myCommitSavesDelayTimer.reset();\r\n }\r\n }\r\n\r\n setCommitSavesDirtyClearOnFail(clearOnFail) {\r\n this._myCommitSavesDirtyClearOnFail = clearOnFail;\r\n }\r\n\r\n setCommitSavesOnInterrupt(commitSavesOnInterrupt) {\r\n this._myCommitSavesOnInterrupt = commitSavesOnInterrupt;\r\n }\r\n\r\n setCommitSavesWhenLoadSavesFailed(commitSavesWhenLoadSavesFailed) {\r\n this._myCommitSavesWhenLoadSavesFailed = commitSavesWhenLoadSavesFailed;\r\n }\r\n\r\n setResetSaveObjectOnLoadSavesFail(resetSaveObjectOnLoadSavesFail) {\r\n this._myResetSaveObjectOnLoadSavesFail = resetSaveObjectOnLoadSavesFail;\r\n }\r\n\r\n getCommitSavesDelay() {\r\n return this._myCommitSavesDelayTimer.getDuration();\r\n }\r\n\r\n isDelaySavesCommit() {\r\n return this._myDelaySavesCommit;\r\n }\r\n\r\n isCommitSavesDirty() {\r\n return this._myCommitSavesDirty;\r\n }\r\n\r\n isCommitSavesDirtyClearOnFail() {\r\n return this._myCommitSavesDirtyClearOnFail;\r\n }\r\n\r\n isCommitSavesOnInterrupt() {\r\n return this._myCommitSavesOnInterrupt;\r\n }\r\n\r\n isCommitSavesWhenLoadSavesFailed() {\r\n return this._myCommitSavesWhenLoadSavesFailed;\r\n }\r\n\r\n isResetSaveObjectOnLoadSavesFail() {\r\n return this._myResetSaveObjectOnLoadSavesFail;\r\n }\r\n\r\n hasLoadSavesSucceded() {\r\n return this._myLoadSavesSucceded;\r\n }\r\n\r\n update(dt) {\r\n if (this._myCommitSavesDelayTimer.isRunning()) {\r\n this._myCommitSavesDelayTimer.update(dt);\r\n if (this._myCommitSavesDelayTimer.isDone()) {\r\n if (this._myCommitSavesDirty) {\r\n this._commitSaves();\r\n }\r\n }\r\n } else {\r\n if (this._myCommitSavesDirty) {\r\n this._commitSaves();\r\n }\r\n }\r\n }\r\n\r\n has(id) {\r\n return id in this._mySaveObject;\r\n }\r\n\r\n save(id, value, delaySavesCommitOverride = null) {\r\n let sameValue = false;\r\n if (this.has(id)) {\r\n sameValue = this._mySaveObject[id] === value;\r\n }\r\n\r\n if (!sameValue) {\r\n this._mySaveObject[id] = value;\r\n\r\n if ((this._myDelaySavesCommit && delaySavesCommitOverride == null) || (delaySavesCommitOverride != null && delaySavesCommitOverride)) {\r\n this._myCommitSavesDirty = true;\r\n if (!this._myCommitSavesDelayTimer.isRunning()) {\r\n this._myCommitSavesDelayTimer.start();\r\n }\r\n } else {\r\n this._commitSaves();\r\n }\r\n }\r\n\r\n this._myAtLeastOneValueSavedOnce = true;\r\n\r\n this._mySaveEmitter.notify(id, value);\r\n\r\n if (this._mySaveIDEmitters.size > 0) {\r\n let emitter = this._mySaveIDEmitters.get(id);\r\n if (emitter != null) {\r\n emitter.notify(id, value);\r\n }\r\n }\r\n\r\n if (!sameValue) {\r\n this._mySaveValueChangedEmitter.notify(id, value);\r\n\r\n if (this._mySaveValueChangedIDEmitters.size > 0) {\r\n let emitter = this._mySaveValueChangedIDEmitters.get(id);\r\n if (emitter != null) {\r\n emitter.notify(id, value);\r\n }\r\n }\r\n }\r\n }\r\n\r\n delete(id, delaySavesCommitOverride = null) {\r\n if (this.has(id)) {\r\n delete this._mySaveObject[id];\r\n\r\n if ((this._myDelaySavesCommit && delaySavesCommitOverride == null) || (delaySavesCommitOverride != null && delaySavesCommitOverride)) {\r\n this._myCommitSavesDirty = true;\r\n if (!this._myCommitSavesDelayTimer.isRunning()) {\r\n this._myCommitSavesDelayTimer.start();\r\n }\r\n } else {\r\n this._commitSaves();\r\n }\r\n }\r\n\r\n this._myAtLeastOneValueSavedOnce = true;\r\n\r\n this._myDeleteEmitter.notify(id);\r\n\r\n if (this._myDeleteIDEmitters.size > 0) {\r\n let emitter = this._myDeleteIDEmitters.get(id);\r\n if (emitter != null) {\r\n emitter.notify(id);\r\n }\r\n }\r\n }\r\n\r\n clear(delaySavesCommitOverride = null) {\r\n if (Object.keys(this._mySaveObject).length > 0) {\r\n this._mySaveObject = {};\r\n\r\n if ((this._myDelaySavesCommit && delaySavesCommitOverride == null) || (delaySavesCommitOverride != null && delaySavesCommitOverride)) {\r\n this._myCommitSavesDirty = true;\r\n if (!this._myCommitSavesDelayTimer.isRunning()) {\r\n this._myCommitSavesDelayTimer.start();\r\n }\r\n } else {\r\n this._commitSaves();\r\n }\r\n }\r\n\r\n this._myAtLeastOneValueSavedOnce = true;\r\n\r\n this._myClearEmitter.notify();\r\n }\r\n\r\n load(id, defaultValue) {\r\n let value = this._mySaveObject[id];\r\n\r\n if (value == null && defaultValue != null) {\r\n value = defaultValue;\r\n }\r\n\r\n this._myLoadEmitter.notify(id, value);\r\n\r\n if (this._myLoadIDEmitters.size > 0) {\r\n let emitter = this._myLoadIDEmitters.get(id);\r\n if (emitter != null) {\r\n emitter.notify(id, value);\r\n }\r\n }\r\n\r\n return value;\r\n }\r\n\r\n commitSaves(commitSavesOnlyIfDirty = true) {\r\n if (this._myCommitSavesDirty || !commitSavesOnlyIfDirty) {\r\n this._commitSaves();\r\n }\r\n }\r\n\r\n _commitSaves() {\r\n let succeded = true;\r\n\r\n if (this._myLoadSavesSucceded || this._myCommitSavesWhenLoadSavesFailed) {\r\n try {\r\n let saveObjectStringified = JSON.stringify(this._mySaveObject);\r\n SaveUtils.save(this._mySaveID, saveObjectStringified);\r\n } catch (error) {\r\n succeded = false;\r\n }\r\n }\r\n\r\n if (succeded || this._myCommitSavesDirtyClearOnFail) {\r\n this._myCommitSavesDirty = false;\r\n this._myCommitSavesDelayTimer.reset();\r\n }\r\n\r\n this._myCommitSavesEmitter.notify(succeded);\r\n\r\n return succeded;\r\n }\r\n\r\n loadSaves() {\r\n let saveObject = {};\r\n let loadSavesSucceded = false;\r\n let saveObjectReset = false;\r\n\r\n let maxLoadObjectAttempts = 3;\r\n do {\r\n try {\r\n saveObject = SaveUtils.loadObject(this._mySaveID, {});\r\n loadSavesSucceded = true;\r\n } catch (error) {\r\n maxLoadObjectAttempts--;\r\n }\r\n } while (maxLoadObjectAttempts > 0 && !loadSavesSucceded);\r\n\r\n if (loadSavesSucceded) {\r\n this._mySaveObject = saveObject;\r\n this._myLoadSavesSucceded = true;\r\n } else if (this._myResetSaveObjectOnLoadSavesFail) {\r\n this._mySaveObject = {};\r\n this._myLoadSavesSucceded = false;\r\n\r\n saveObjectReset = true;\r\n }\r\n\r\n this._mySaveObjectLoadedOnce = true;\r\n\r\n this._myLoadSavesEmitter.notify(loadSavesSucceded, saveObjectReset);\r\n\r\n return loadSavesSucceded;\r\n }\r\n\r\n _onXRSessionStart(session) {\r\n this._myXRVisibilityChangeEventListener = function (event) {\r\n if (event.session.visibilityState != \"visible\") {\r\n this._onInterrupt();\r\n }\r\n }.bind(this);\r\n\r\n session.addEventListener(\"visibilitychange\", this._myXRVisibilityChangeEventListener);\r\n }\r\n\r\n _onXRSessionEnd() {\r\n this._myXRVisibilityChangeEventListener = null;\r\n\r\n this._onInterrupt();\r\n }\r\n\r\n _onInterrupt() {\r\n if (this._myCommitSavesOnInterrupt && this._myCommitSavesDirty && (this._mySaveObjectLoadedOnce || this._myAtLeastOneValueSavedOnce)) {\r\n this.commitSaves();\r\n }\r\n }\r\n\r\n registerClearEventListener(listenerID, listener) {\r\n this._myClearEmitter.add(listener, { id: listenerID });\r\n }\r\n\r\n unregisterClearEventListener(listenerID) {\r\n this._myClearEmitter.remove(listenerID);\r\n }\r\n\r\n registerDeleteEventListener(listenerID, listener) {\r\n this._myDeleteEmitter.add(listener, { id: listenerID });\r\n }\r\n\r\n unregisterDeleteEventListener(listenerID) {\r\n this._myDeleteEmitter.remove(listenerID);\r\n }\r\n\r\n registerDeleteIDEventListener(valueID, listenerID, listener) {\r\n let valueIDEmitter = this._myDeleteIDEmitters.get(valueID);\r\n if (valueIDEmitter == null) {\r\n this._myDeleteIDEmitters.set(valueID, new Map());\r\n valueIDEmitter = this._myDeleteIDEmitters.get(valueID);\r\n }\r\n\r\n valueIDEmitter.add(listener, { id: listenerID });\r\n }\r\n\r\n unregisterDeleteIDEventListener(valueID, listenerID) {\r\n let valueIDEmitter = this._myDeleteIDEmitters.get(valueID);\r\n if (valueIDEmitter != null) {\r\n valueIDEmitter.remove(listenerID);\r\n\r\n if (valueIDEmitter.size <= 0) {\r\n this._myDeleteIDEmitters.delete(valueID);\r\n }\r\n }\r\n }\r\n\r\n registerSaveEventListener(listenerID, listener) {\r\n this._mySaveEmitter.add(listener, { id: listenerID });\r\n }\r\n\r\n unregisterSaveEventListener(listenerID) {\r\n this._mySaveEmitter.remove(listenerID);\r\n }\r\n\r\n registerSaveIDEventListener(valueID, listenerID, listener) {\r\n let valueIDEmitter = this._mySaveIDEmitters.get(valueID);\r\n if (valueIDEmitter == null) {\r\n this._mySaveIDEmitters.set(valueID, new Map());\r\n valueIDEmitter = this._mySaveIDEmitters.get(valueID);\r\n }\r\n\r\n valueIDEmitter.add(listener, { id: listenerID });\r\n }\r\n\r\n unregisterSaveIDEventListener(valueID, listenerID) {\r\n let valueIDEmitter = this._mySaveIDEmitters.get(valueID);\r\n if (valueIDEmitter != null) {\r\n valueIDEmitter.remove(listenerID);\r\n\r\n if (valueIDEmitter.size <= 0) {\r\n this._mySaveIDEmitters.delete(valueID);\r\n }\r\n }\r\n }\r\n\r\n registerSaveValueChangedEventListener(listenerID, listener) {\r\n this._mySaveValueChangedEmitter.add(listener, { id: listenerID });\r\n }\r\n\r\n unregisterSaveValueChangedEventListener(listenerID) {\r\n this._mySaveValueChangedEmitter.remove(listenerID);\r\n }\r\n\r\n registerSaveValueChangedIDEventListener(valueID, listenerID, listener) {\r\n let valueIDEmitter = this._mySaveValueChangedIDEmitters.get(valueID);\r\n if (valueIDEmitter == null) {\r\n this._mySaveValueChangedIDEmitters.set(valueID, new Map());\r\n valueIDEmitter = this._mySaveValueChangedIDEmitters.get(valueID);\r\n }\r\n\r\n valueIDEmitter.add(listener, { id: listenerID });\r\n }\r\n\r\n unregisterSaveValueChangedIDEventListener(valueID, listenerID) {\r\n let valueIDEmitter = this._mySaveValueChangedIDEmitters.get(valueID);\r\n if (valueIDEmitter != null) {\r\n valueIDEmitter.remove(listenerID);\r\n\r\n if (valueIDEmitter.size <= 0) {\r\n this._mySaveValueChangedIDEmitters.delete(valueID);\r\n }\r\n }\r\n }\r\n\r\n registerCommitSavesEventListener(listenerID, listener) {\r\n this._myCommitSavesEmitter.add(listener, { id: listenerID });\r\n }\r\n\r\n unregisterCommitSavesEventListener(listenerID) {\r\n this._myCommitSavesEmitter.remove(listenerID);\r\n }\r\n\r\n registerLoadEventListener(listenerID, listener) {\r\n this._myLoadEmitter.add(listener, { id: listenerID });\r\n }\r\n\r\n unregisterLoadEventListener(listenerID) {\r\n this._myLoadEmitter.remove(listenerID);\r\n }\r\n\r\n registerLoadIDEventListener(valueID, listenerID, listener) {\r\n let valueIDEmitter = this._myLoadIDEmitters.get(valueID);\r\n if (valueIDEmitter == null) {\r\n this._myLoadIDEmitters.set(valueID, new Map());\r\n valueIDEmitter = this._myLoadIDEmitters.get(valueID);\r\n }\r\n\r\n valueIDEmitter.add(listener, { id: listenerID });\r\n }\r\n\r\n unregisterLoadIDEventListener(valueID, listenerID) {\r\n let valueIDEmitter = this._myLoadIDEmitters.get(valueID);\r\n if (valueIDEmitter != null) {\r\n valueIDEmitter.remove(listenerID);\r\n\r\n if (valueIDEmitter.size <= 0) {\r\n this._myLoadIDEmitters.delete(valueID);\r\n }\r\n }\r\n }\r\n\r\n registerLoadSavesEventListener(listenerID, listener) {\r\n this._myLoadSavesEmitter.add(listener, { id: listenerID });\r\n }\r\n\r\n unregisterLoadSavesEventListener(listenerID) {\r\n this._myLoadSavesEmitter.remove(listenerID);\r\n }\r\n\r\n setActive(active) {\r\n if (this._myActive != active) {\r\n this._myActive = active;\r\n\r\n if (active) {\r\n XRUtils.registerSessionStartEndEventListeners(this, this._onXRSessionStart.bind(this), this._onXRSessionEnd.bind(this), true, false, this._myEngine);\r\n window.addEventListener(\"visibilitychange\", this._myWindowVisibilityChangeEventListener);\r\n } else {\r\n XRUtils.getSession(this._myEngine)?.removeEventListener(\"visibilitychange\", this._myXRVisibilityChangeEventListener);\r\n XRUtils.unregisterSessionStartEndEventListeners(this, this._myEngine);\r\n\r\n window.removeEventListener(\"visibilitychange\", this._myWindowVisibilityChangeEventListener);\r\n }\r\n }\r\n }\r\n\r\n isActive() {\r\n return this._myActive;\r\n }\r\n\r\n destroy() {\r\n this._myDestroyed = true;\r\n\r\n this.setActive(false);\r\n }\r\n\r\n isDestroyed() {\r\n return this._myDestroyed;\r\n }\r\n}", "import { Vector } from \"../type_definitions/array_type_definitions.js\";\r\n\r\nexport function save(id: string, value: string): void {\r\n if (value != null) {\r\n localStorage.setItem(id, value);\r\n }\r\n}\r\n\r\nexport function has(id: string): boolean {\r\n return SaveUtils.loadString(id) != null;\r\n}\r\n\r\nexport function remove(id: string): void {\r\n return localStorage.removeItem(id);\r\n}\r\n\r\nexport function clear(): void {\r\n return localStorage.clear();\r\n}\r\n\r\nexport function load(id: string, defaultValue: string | null): string;\r\nexport function load(id: string): string | null;\r\nexport function load(id: string, defaultValue: string | null = null): string | null {\r\n return SaveUtils.loadString(id, defaultValue!);\r\n}\r\n\r\nexport function loadString(id: string, defaultValue: string): string;\r\nexport function loadString(id: string): string | null;\r\nexport function loadString(id: string, defaultValue: string | null = null): string | null {\r\n const item = localStorage.getItem(id);\r\n\r\n if (item != null) {\r\n return item;\r\n }\r\n\r\n return defaultValue;\r\n}\r\n\r\nexport function loadNumber(id: string, defaultValue: number): number;\r\nexport function loadNumber(id: string): number | null;\r\nexport function loadNumber(id: string, defaultValue: number | null = null): number | null {\r\n const item = SaveUtils.loadString(id);\r\n\r\n if (item != null && item.trim() != \"\" && (item == \"NaN\" || !isNaN(Number(item)))) {\r\n return Number(item);\r\n }\r\n\r\n return defaultValue;\r\n}\r\n\r\nexport function loadBool(id: string, defaultValue: boolean): boolean;\r\nexport function loadBool(id: string): boolean | null;\r\nexport function loadBool(id: string, defaultValue: boolean | null = null): boolean | null {\r\n const item = SaveUtils.loadString(id);\r\n\r\n if (item == \"true\") {\r\n return true;\r\n } else if (item == \"false\") {\r\n return false;\r\n }\r\n\r\n return defaultValue;\r\n}\r\n\r\nexport function loadObject(id: string, defaultValue: Readonly): object;\r\nexport function loadObject(id: string): object | null;\r\nexport function loadObject(id: string, defaultValue: Readonly | null = null): object | null {\r\n const item = SaveUtils.loadString(id);\r\n\r\n if (item != null) {\r\n try {\r\n const parsedObject = JSON.parse(item);\r\n if (parsedObject.constructor == Object) {\r\n return parsedObject;\r\n }\r\n } catch (error) {\r\n // Do nothing\r\n }\r\n }\r\n\r\n return defaultValue;\r\n}\r\n\r\nexport function loadArray(id: string, defaultValue: Readonly): T[];\r\nexport function loadArray(id: string): T[] | null;\r\nexport function loadArray(id: string, defaultValue: Readonly | null = null): T[] | null {\r\n const item = SaveUtils.loadString(id);\r\n\r\n if (item != null) {\r\n try {\r\n const parsedArray = JSON.parse(item);\r\n if (Array.isArray(parsedArray)) {\r\n return parsedArray;\r\n }\r\n } catch (error) {\r\n // Do nothing\r\n }\r\n }\r\n\r\n return defaultValue as T[] | null;\r\n}\r\n\r\nexport function loadVector(id: string, defaultValue: Readonly): Vector;\r\nexport function loadVector(id: string): Vector | null;\r\nexport function loadVector(id: string, defaultValue: Readonly | null = null): Vector | null {\r\n const item = SaveUtils.loadString(id);\r\n\r\n if (item != null) {\r\n try {\r\n const parsedVector = JSON.parse(item);\r\n if (Array.isArray(parsedVector)) {\r\n let areAllNumbers = true;\r\n for (const value of parsedVector) {\r\n if (typeof value != \"number\") {\r\n areAllNumbers = false;\r\n break;\r\n }\r\n }\r\n\r\n if (areAllNumbers) {\r\n return parsedVector;\r\n }\r\n }\r\n } catch (error) {\r\n // Do nothing\r\n }\r\n }\r\n\r\n return defaultValue as Vector | null;\r\n}\r\n\r\nexport const SaveUtils = {\r\n save,\r\n has,\r\n remove,\r\n clear,\r\n load,\r\n loadString,\r\n loadNumber,\r\n loadBool,\r\n loadObject,\r\n loadArray,\r\n loadVector\r\n} as const;", "import { Emitter } from \"@wonderlandengine/api\";\r\nimport { MathUtils } from \"../utils/math_utils.js\";\r\n\r\nexport class Timer {\r\n private _myDuration: number = 0;\r\n private _myTimeLeft: number = 0;\r\n\r\n private _myDone: boolean = false;\r\n private _myJustDone: boolean = false;\r\n private _myStarted: boolean = false;\r\n\r\n private readonly _myOnEndEmitter: Emitter = new Emitter();\r\n\r\n constructor(duration: number, autoStart: boolean = true) {\r\n this._myDuration = duration;\r\n\r\n if (autoStart) {\r\n this.start();\r\n } else {\r\n this.reset();\r\n }\r\n }\r\n\r\n public start(duration?: number): void {\r\n this.reset(duration);\r\n this._myStarted = true;\r\n }\r\n\r\n public end(): void {\r\n this._done();\r\n }\r\n\r\n public reset(duration?: number): void {\r\n if (duration != null) {\r\n this._myDuration = Math.max(0, duration);\r\n }\r\n\r\n this._myTimeLeft = this._myDuration;\r\n this._myDone = false;\r\n this._myJustDone = false;\r\n this._myStarted = false;\r\n }\r\n\r\n public update(dt: number): void {\r\n this._myJustDone = false;\r\n\r\n if (this.isRunning()) {\r\n this._myTimeLeft = Math.max(0, this._myTimeLeft - dt);\r\n if (this._myTimeLeft == 0) {\r\n this._done();\r\n }\r\n }\r\n }\r\n\r\n public isDone(): boolean {\r\n return this._myDone;\r\n }\r\n\r\n public isJustDone(): boolean {\r\n return this._myJustDone;\r\n }\r\n\r\n public isStarted(): boolean {\r\n return this._myStarted;\r\n }\r\n\r\n public isRunning(): boolean {\r\n return this.isStarted() && !this.isDone();\r\n }\r\n\r\n public getDuration(): number {\r\n return this._myDuration;\r\n }\r\n\r\n public setDuration(duration: number): void {\r\n const newDuration = Math.max(0, duration);\r\n\r\n if (this.isRunning()) {\r\n const timeElapsed = Math.max(0, this._myDuration - this._myTimeLeft);\r\n this._myTimeLeft = Math.max(0, newDuration - timeElapsed);\r\n }\r\n\r\n this._myDuration = newDuration;\r\n }\r\n\r\n public getTimeLeft(): number {\r\n return this._myTimeLeft;\r\n }\r\n\r\n public setTimeLeft(timeLeft: number, keepPercentage: boolean = false): void {\r\n if (this.isRunning()) {\r\n const currentPercentage = this.getPercentage();\r\n\r\n this._myTimeLeft = Math.max(0, timeLeft);\r\n\r\n if (this._myTimeLeft > this._myDuration) {\r\n this._myDuration = this._myTimeLeft;\r\n }\r\n\r\n if (keepPercentage && this._myTimeLeft > MathUtils.EPSILON) {\r\n this._myDuration = this._myTimeLeft / Math.max(MathUtils.EPSILON, (1 - currentPercentage));\r\n }\r\n }\r\n }\r\n\r\n public getTimeElapsed(): number {\r\n let timeElapsed = 0;\r\n if (this.isRunning()) {\r\n timeElapsed = this._myDuration - this._myTimeLeft;\r\n }\r\n return Math.max(0, timeElapsed);\r\n }\r\n\r\n public setTimeElapsed(timeElapsed: number): void {\r\n this.setTimeLeft(this._myDuration - Math.max(0, timeElapsed));\r\n }\r\n\r\n public getPercentage(): number {\r\n let percentage = 1;\r\n if (this._myTimeLeft > 0 && this._myDuration > 0) {\r\n percentage = (this._myDuration - this._myTimeLeft) / this._myDuration;\r\n }\r\n return Math.pp_clamp(percentage, 0, 1);\r\n }\r\n\r\n public setPercentage(percentage: number): void {\r\n if (this.isRunning()) {\r\n const durationPercentage = Math.pp_clamp(1 - percentage, 0, 1);\r\n this._myTimeLeft = this._myDuration * durationPercentage;\r\n }\r\n }\r\n\r\n public onEnd(listener: () => void, id?: unknown): void {\r\n this._myOnEndEmitter.add(listener, { id: id });\r\n }\r\n\r\n public unregisterOnEnd(id?: unknown): void {\r\n this._myOnEndEmitter.remove(id);\r\n }\r\n\r\n private _done(): void {\r\n this._myTimeLeft = 0;\r\n this._myDone = true;\r\n this._myJustDone = true;\r\n\r\n this._myOnEndEmitter.notify();\r\n }\r\n}", "import { Component } from \"@wonderlandengine/api\";\r\nimport { Globals } from \"../../../pp/globals.js\";\r\nimport { ObjectPoolManager } from \"../object_pool_manager.js\";\r\n\r\nexport class ObjectPoolManagerComponent extends Component {\r\n static TypeName = \"pp-object-pools-manager\";\r\n\r\n init() {\r\n this._myObjectPoolManager = new ObjectPoolManager();\r\n }\r\n\r\n onActivate() {\r\n if (!Globals.hasObjectPoolManager(this.engine)) {\r\n Globals.setObjectPoolManager(this._myObjectPoolManager, this.engine);\r\n }\r\n }\r\n\r\n onDeactivate() {\r\n if (Globals.getObjectPoolManager(this.engine) == this._myObjectPoolManager) {\r\n this._myObjectPoolManager.releaseAll();\r\n\r\n Globals.removeObjectPoolManager(this.engine);\r\n }\r\n }\r\n\r\n onDestroy() {\r\n this._myObjectPoolManager.destroy();\r\n }\r\n}", "import { BaseObjectPool } from \"./object_pool.js\";\r\n\r\nexport class ObjectPoolManager {\r\n\r\n private readonly _myPools: Map = new Map();\r\n\r\n private _myDestroyed: boolean = false;\r\n\r\n constructor() {\r\n this._myPools = new Map();\r\n\r\n this._myDestroyed = false;\r\n }\r\n\r\n public addPool(poolID: unknown, pool: BaseObjectPool): void {\r\n if (!this._myPools.has(poolID)) {\r\n this._myPools.set(poolID, pool);\r\n } else {\r\n console.warn(\"Trying to add a Pool with an ID that has been already used:\", poolID);\r\n }\r\n }\r\n\r\n public destroyPool(poolID: unknown): void {\r\n const poolToRemove = this._myPools.get(poolID);\r\n if (poolToRemove != null) {\r\n this._myPools.delete(poolID);\r\n poolToRemove.destroy();\r\n }\r\n }\r\n\r\n public getPool(poolID: unknown): ObjectPoolType | null {\r\n const objectPool = this._myPools.get(poolID);\r\n return objectPool != null ? objectPool as ObjectPoolType : null;\r\n }\r\n\r\n public hasPool(poolID: unknown): boolean {\r\n return this._myPools.has(poolID);\r\n }\r\n\r\n public get(poolID: unknown): PoolObjectType | null {\r\n if (this._myPools.has(poolID)) {\r\n return this._myPools.get(poolID)!.get() as PoolObjectType | null;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n public has(poolID: unknown, object: PoolObjectType): boolean;\r\n public has(object: PoolObjectType): boolean;\r\n public has(poolIDOrObject: unknown | PoolObjectType, object?: PoolObjectType): boolean {\r\n let hasObject = false;\r\n\r\n if (object == null) {\r\n for (const pool of this._myPools.values()) {\r\n if (pool.has(poolIDOrObject)) {\r\n hasObject = true;\r\n break;\r\n }\r\n }\r\n } else if (this._myPools.has(poolIDOrObject)) {\r\n hasObject = this._myPools.get(poolIDOrObject)!.has(object);\r\n }\r\n\r\n return hasObject;\r\n }\r\n\r\n public isBusy(poolID: unknown, object: PoolObjectType): boolean;\r\n public isBusy(object: PoolObjectType): boolean;\r\n public isBusy(poolIDOrObject: unknown | PoolObjectType, object?: PoolObjectType): boolean {\r\n let busy = false;\r\n\r\n if (object == null) {\r\n for (const pool of this._myPools.values()) {\r\n if (pool.isBusy(poolIDOrObject)) {\r\n busy = true;\r\n break;\r\n }\r\n }\r\n } else if (this._myPools.has(poolIDOrObject)) {\r\n busy = this._myPools.get(poolIDOrObject)!.isBusy(object);\r\n }\r\n\r\n return busy;\r\n }\r\n\r\n public isAvailable(poolID: unknown, object: PoolObjectType): boolean;\r\n public isAvailable(object: PoolObjectType): boolean;\r\n public isAvailable(poolIDOrObject: unknown | PoolObjectType, object?: PoolObjectType): boolean {\r\n let available = false;\r\n\r\n if (object == null) {\r\n for (const pool of this._myPools.values()) {\r\n if (pool.isAvailable(poolIDOrObject)) {\r\n available = true;\r\n break;\r\n }\r\n }\r\n } else if (this._myPools.has(poolIDOrObject)) {\r\n available = this._myPools.get(poolIDOrObject)!.isAvailable(object);\r\n }\r\n\r\n return available;\r\n }\r\n\r\n public release(poolID: unknown, object: PoolObjectType): void;\r\n public release(object: PoolObjectType): void;\r\n public release(poolIDOrObject: unknown | PoolObjectType, object?: PoolObjectType): void {\r\n if (object == null) {\r\n for (const pool of this._myPools.values()) {\r\n pool.release(poolIDOrObject);\r\n }\r\n } else if (this._myPools.has(poolIDOrObject)) {\r\n this._myPools.get(poolIDOrObject)!.release(object);\r\n }\r\n }\r\n\r\n public releaseAll(poolID?: unknown): void {\r\n if (poolID == null) {\r\n for (const pool of this._myPools.values()) {\r\n pool.releaseAll();\r\n }\r\n } else if (this._myPools.has(poolID)) {\r\n this._myPools.get(poolID)!.releaseAll();\r\n }\r\n }\r\n\r\n public increase(poolID: unknown, amount: number): void {\r\n const pool = this._myPools.get(poolID);\r\n if (pool) {\r\n pool.increase(amount);\r\n }\r\n }\r\n\r\n public increasePercentage(poolID: unknown, percentage: number): void {\r\n const pool = this._myPools.get(poolID);\r\n if (pool) {\r\n pool.increasePercentage(percentage);\r\n }\r\n }\r\n\r\n public getSize(poolID: unknown): number {\r\n if (this._myPools.has(poolID)) {\r\n return this._myPools.get(poolID)!.getSize();\r\n }\r\n\r\n return 0;\r\n }\r\n\r\n public getAvailableSize(poolID: unknown): number {\r\n if (this._myPools.has(poolID)) {\r\n return this._myPools.get(poolID)!.getAvailableSize();\r\n }\r\n\r\n return 0;\r\n }\r\n\r\n public getBusySize(poolID: unknown): number {\r\n if (this._myPools.has(poolID)) {\r\n return this._myPools.get(poolID)!.getBusySize();\r\n }\r\n\r\n return 0;\r\n }\r\n\r\n public destroy(): void {\r\n this._myDestroyed = true;\r\n\r\n for (const pool of this._myPools.values()) {\r\n pool.destroy();\r\n }\r\n }\r\n\r\n public isDestroyed(): boolean {\r\n return this._myDestroyed;\r\n }\r\n}", "import { Component } from \"@wonderlandengine/api\";\r\nimport { vec4_create } from \"../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Globals } from \"../../../pp/globals.js\";\r\nimport { VisualManager } from \"../visual_manager.js\";\r\nimport { VisualResources } from \"../visual_resources.js\";\r\n\r\nexport class VisualManagerComponent extends Component {\r\n static TypeName = \"pp-visual-manager\";\r\n\r\n init() {\r\n this._myVisualManager = new VisualManager(this.engine);\r\n\r\n this._myVisualResources = new VisualResources();\r\n }\r\n\r\n start() {\r\n this._myVisualResources.myDefaultMaterials.myMesh = Globals.getDefaultMaterials(this.engine).myFlatOpaque.clone();\r\n\r\n this._myVisualResources.myDefaultMaterials.myText = Globals.getDefaultMaterials(this.engine).myText.clone();\r\n\r\n this._myVisualResources.myDefaultMaterials.myRight = Globals.getDefaultMaterials(this.engine).myFlatOpaque.clone();\r\n this._myVisualResources.myDefaultMaterials.myRight.color = vec4_create(1, 0, 0, 1);\r\n this._myVisualResources.myDefaultMaterials.myUp = Globals.getDefaultMaterials(this.engine).myFlatOpaque.clone();\r\n this._myVisualResources.myDefaultMaterials.myUp.color = vec4_create(0, 1, 0, 1);\r\n this._myVisualResources.myDefaultMaterials.myForward = Globals.getDefaultMaterials(this.engine).myFlatOpaque.clone();\r\n this._myVisualResources.myDefaultMaterials.myForward.color = vec4_create(0, 0, 1, 1);\r\n\r\n this._myVisualResources.myDefaultMaterials.myRay = Globals.getDefaultMaterials(this.engine).myFlatOpaque.clone();\r\n this._myVisualResources.myDefaultMaterials.myRay.color = vec4_create(0, 1, 0, 1);\r\n this._myVisualResources.myDefaultMaterials.myHitNormal = Globals.getDefaultMaterials(this.engine).myFlatOpaque.clone();\r\n this._myVisualResources.myDefaultMaterials.myHitNormal.color = vec4_create(1, 0, 0, 1);\r\n\r\n this._myVisualManager.start();\r\n }\r\n\r\n update(dt) {\r\n if (Globals.getVisualManager(this.engine) == this._myVisualManager) {\r\n this._myVisualManager.update(dt);\r\n }\r\n }\r\n\r\n onActivate() {\r\n if (!Globals.hasVisualManager(this.engine)) {\r\n this._myVisualManager.setActive(true);\r\n\r\n Globals.setVisualManager(this._myVisualManager, this.engine);\r\n }\r\n\r\n if (!Globals.hasVisualResources(this.engine)) {\r\n Globals.setVisualResources(this._myVisualResources, this.engine);\r\n }\r\n }\r\n\r\n onDeactivate() {\r\n this._myVisualManager.setActive(false);\r\n\r\n if (Globals.getVisualManager(this.engine) == this._myVisualManager) {\r\n Globals.removeVisualManager(this.engine);\r\n }\r\n\r\n if (Globals.getVisualResources(this.engine) == this._myVisualResources) {\r\n Globals.removeVisualResources(this.engine);\r\n }\r\n }\r\n\r\n onDestroy() {\r\n if (this._myVisualManager != null) {\r\n this._myVisualManager.destroy();\r\n }\r\n }\r\n}", "import { Object3D } from \"@wonderlandengine/api\";\r\nimport { ObjectCloneParams, ObjectUtils } from \"../wl/utils/object_utils.js\";\r\n\r\n/** For the Wonderland Engine `Object3D` you can omit the callbacks (like `myCloneCallback`), since they are already handled directly as a speciale case */\r\nexport class ObjectPoolParams {\r\n\r\n public myInitialPoolSize: number = 0;\r\n\r\n /** If all the objects are busy, this amount will be added to the pool */\r\n public myAmountToAddWhenEmpty: number = 0;\r\n\r\n /** If all the objects are busy, this percentage of the current pool size will be added to the pool */\r\n public myPercentageToAddWhenEmpty: number = 0;\r\n\r\n\r\n public myCloneParams: Readonly | null = null;\r\n\r\n\r\n /** For the Wonderland Engine `Object3D` you can omit this, since it's already handled directly as a speciale case */\r\n public myCloneCallback: ((object: Readonly, cloneParams?: Readonly) => PoolObjectType) | null = null;\r\n\r\n /** For the Wonderland Engine `Object3D` you can omit this, since it's already handled directly as a speciale case */\r\n public mySetActiveCallback: ((object: PoolObjectType, active: boolean) => void) | null = null;\r\n\r\n /** For the Wonderland Engine `Object3D` you can omit this, since it's already handled directly as a speciale case */\r\n public myEqualCallback: ((first: Readonly, second: Readonly) => boolean) | null = null;\r\n\r\n /** For the Wonderland Engine `Object3D` you can omit this, since it's already handled directly as a speciale case */\r\n public myDestroyCallback: ((object: PoolObjectType) => void) | null = null;\r\n\r\n /** For the Wonderland Engine `Object3D` you can omit this, since it's already handled directly as a speciale case */\r\n public myOptimizeObjectsAllocationCallback: ((object: Readonly, numberOfObjectsToAllocate: number) => void) | null = null;\r\n\r\n\r\n public myLogEnabled: boolean = false;\r\n}\r\n\r\nexport interface BaseObjectPool {\r\n get(): unknown | null;\r\n\r\n has(object: unknown): boolean;\r\n\r\n isBusy(object: unknown): boolean;\r\n isAvailable(object: unknown): boolean;\r\n\r\n release(object: unknown): void;\r\n releaseAll(): void;\r\n\r\n increase(amount: number): void;\r\n increasePercentage(percentage: number): void;\r\n\r\n getObjects(): Readonly;\r\n getSize(): number;\r\n\r\n getAvailableObjects(): Readonly;\r\n getAvailableSize(): number;\r\n\r\n getBusyObjects(): Readonly;\r\n getBusySize(): number;\r\n\r\n destroy(): void;\r\n}\r\n\r\nexport class ObjectPool implements BaseObjectPool {\r\n\r\n private readonly _myObjectPrototype: Readonly;\r\n private readonly _myObjectPoolParams: Readonly>;\r\n\r\n private readonly _myAvailableObjects: PoolObjectType[] = [];\r\n private readonly _myBusyObjects: PoolObjectType[] = [];\r\n\r\n private _myDestroyed: boolean = false;\r\n\r\n private _myIsObject3D = false;\r\n private _myIsObject3DCloneParams = false;\r\n\r\n constructor(objectPrototype: Readonly, objectPoolParams: Readonly>) {\r\n this._myObjectPrototype = objectPrototype;\r\n this._myObjectPoolParams = objectPoolParams;\r\n\r\n if (objectPrototype instanceof Object3D) {\r\n this._myIsObject3D = true;\r\n\r\n if (this._myObjectPoolParams.myCloneParams == null || this._myObjectPoolParams.myCloneParams instanceof ObjectCloneParams) {\r\n this._myIsObject3DCloneParams = true;\r\n }\r\n }\r\n\r\n this._addToPool(objectPoolParams.myInitialPoolSize, false);\r\n }\r\n\r\n public get(): PoolObjectType | null {\r\n let object = this._myAvailableObjects.shift();\r\n\r\n if (object == null) {\r\n let amountToAdd = Math.ceil(this._myBusyObjects.length * this._myObjectPoolParams.myPercentageToAddWhenEmpty);\r\n amountToAdd += this._myObjectPoolParams.myAmountToAddWhenEmpty;\r\n this._addToPool(amountToAdd, this._myObjectPoolParams.myLogEnabled);\r\n object = this._myAvailableObjects.shift();\r\n }\r\n\r\n // Object could still be null if the amountToAdd is 0\r\n if (object != null) {\r\n this._myBusyObjects.push(object);\r\n }\r\n\r\n return object != null ? object : null;\r\n }\r\n\r\n public has(object: Readonly): boolean {\r\n let hasObject = false;\r\n\r\n if (this.isBusy(object) || this.isAvailable(object)) {\r\n hasObject = true;\r\n }\r\n\r\n return hasObject;\r\n }\r\n\r\n public isBusy(object: Readonly): boolean {\r\n return this._myBusyObjects.pp_has(this._equals.bind(this, object));\r\n }\r\n\r\n public isAvailable(object: Readonly): boolean {\r\n return this._myAvailableObjects.pp_has(this._equals.bind(this, object));\r\n }\r\n\r\n public release(object: Readonly): void {\r\n const released = this._myBusyObjects.pp_remove(this._equals.bind(this, object));\r\n if (released != null) {\r\n this._setActive(released, false);\r\n this._myAvailableObjects.push(released);\r\n }\r\n }\r\n\r\n public releaseAll(): void {\r\n for (const busyObject of this._myBusyObjects) {\r\n this._setActive(busyObject, false);\r\n this._myAvailableObjects.push(busyObject);\r\n }\r\n }\r\n\r\n public increase(amount: number): void {\r\n this._addToPool(amount, false);\r\n }\r\n\r\n public increasePercentage(percentage: number): void {\r\n const amount = Math.ceil((this.getSize()) * percentage);\r\n this._addToPool(amount, false);\r\n }\r\n\r\n public getObjects(): Readonly {\r\n const objects = [];\r\n objects.push(...this._myAvailableObjects);\r\n objects.push(...this._myBusyObjects);\r\n\r\n return objects;\r\n }\r\n\r\n public getSize(): number {\r\n return this._myBusyObjects.length + this._myAvailableObjects.length;\r\n }\r\n\r\n public getAvailableObjects(): Readonly {\r\n return this._myAvailableObjects;\r\n }\r\n\r\n public getAvailableSize(): number {\r\n return this._myAvailableObjects.length;\r\n }\r\n\r\n public getBusyObjects(): Readonly {\r\n return this._myBusyObjects;\r\n }\r\n\r\n public getBusySize(): number {\r\n return this._myBusyObjects.length;\r\n }\r\n\r\n private _addToPool(size: number, logEnabled: boolean): void {\r\n if (size <= 0) {\r\n return;\r\n }\r\n\r\n if (this._myObjectPoolParams.myOptimizeObjectsAllocationCallback != null) {\r\n this._myObjectPoolParams.myOptimizeObjectsAllocationCallback(this._myObjectPrototype, size);\r\n } else if (this._myIsObject3D) {\r\n const object3DPrototype = this._myObjectPrototype as unknown as Object3D;\r\n ObjectUtils.reserveObjects(object3DPrototype, size);\r\n }\r\n\r\n for (let i = 0; i < size; i++) {\r\n const clonedObject = this._clonePrototype();\r\n if (clonedObject != null) {\r\n this._myAvailableObjects.push(clonedObject);\r\n }\r\n }\r\n\r\n if (logEnabled) {\r\n console.warn(\"Added new elements to the pool:\", size);\r\n }\r\n }\r\n\r\n private _clonePrototype(): PoolObjectType | null {\r\n let clone: PoolObjectType | null = null;\r\n\r\n const cloneParams = this._myObjectPoolParams.myCloneParams != null ? this._myObjectPoolParams.myCloneParams! : undefined;\r\n if (this._myObjectPoolParams.myCloneCallback != null) {\r\n clone = this._myObjectPoolParams.myCloneCallback(this._myObjectPrototype, cloneParams);\r\n } else if (this._myIsObject3D && this._myIsObject3DCloneParams) {\r\n const object3DPrototype = this._myObjectPrototype as unknown as Object3D;\r\n clone = ObjectUtils.clone(object3DPrototype, cloneParams as unknown as ObjectCloneParams) as PoolObjectType;\r\n } else {\r\n console.error(\"No way have been provided to clone the object\");\r\n }\r\n\r\n if (clone != null) {\r\n this._setActive(clone, false);\r\n }\r\n\r\n return clone;\r\n }\r\n\r\n private _setActive(object: PoolObjectType, active: boolean): void {\r\n if (this._myObjectPoolParams.mySetActiveCallback != null) {\r\n this._myObjectPoolParams.mySetActiveCallback(object, active);\r\n } else if (this._myIsObject3D) {\r\n const object3D = object as unknown as Object3D;\r\n ObjectUtils.setActive(object3D, active);\r\n } else {\r\n console.error(\"No way have been provided to set the active state of the object\");\r\n }\r\n }\r\n\r\n private _equals(first: Readonly, second: Readonly): boolean {\r\n let equals = false;\r\n\r\n if (this._myObjectPoolParams.myEqualCallback != null) {\r\n equals = this._myObjectPoolParams.myEqualCallback(first, second);\r\n } else if (this._myIsObject3D) {\r\n const firstObject3D = first as unknown as Object3D;\r\n const secondObject3D = second as unknown as Object3D;\r\n equals = firstObject3D == secondObject3D;\r\n } else {\r\n equals = first == second;\r\n }\r\n\r\n return equals;\r\n }\r\n\r\n public destroy(): void {\r\n this._myDestroyed = true;\r\n\r\n for (const object of this._myAvailableObjects) {\r\n this._destroyObject(object);\r\n }\r\n\r\n for (const object of this._myBusyObjects) {\r\n this._destroyObject(object);\r\n }\r\n }\r\n\r\n public isDestroyed(): boolean {\r\n return this._myDestroyed;\r\n }\r\n\r\n private _destroyObject(object: PoolObjectType): void {\r\n if (this._myObjectPoolParams.myDestroyCallback != null) {\r\n this._myObjectPoolParams.myDestroyCallback(object);\r\n } else if (this._myIsObject3D) {\r\n const object3D = object as unknown as Object3D;\r\n ObjectUtils.destroy(object3D);\r\n } else {\r\n console.error(\"No way have been provided to destroy the object\");\r\n }\r\n }\r\n}", "import { MeshComponent } from \"@wonderlandengine/api\";\r\nimport { vec3_create } from \"../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Globals } from \"../../../pp/globals.js\";\r\nimport { AbstractVisualElement, AbstractVisualElementParams } from \"./visual_element.js\";\r\nimport { VisualElementDefaultType } from \"./visual_element_types.js\";\r\nimport { VisualLine, VisualLineParams } from \"./visual_line.js\";\r\n\r\nexport class VisualArrowParams extends AbstractVisualElementParams {\r\n\r\n /**\r\n * TS type inference helper\r\n * \r\n * @param {any} engine\r\n */\r\n constructor(engine = Globals.getMainEngine()) {\r\n super(engine);\r\n\r\n this.myStart = vec3_create();\r\n this.myDirection = vec3_create(0, 0, 1);\r\n this.myLength = 0;\r\n\r\n this.myThickness = 0.005;\r\n\r\n this.myArrowThickness = null; // null means this.myThickness * 1.5 will be used\r\n this.myArrowLength = null; // null means this.myThickness * 3.5 will be used\r\n\r\n this.myShareArrowLengthWithLineWhenArrowLongerThanLength = true;\r\n\r\n this.myLineMesh = null; // The mesh is scaled along up axis, null means it will default on myDefaultResources.myMeshes.myCylinder\r\n this.myArrowMesh = null; // The mesh is scaled along up axis, null means it will default on myDefaultResources.myMeshes.myCone\r\n\r\n this.myMaterial = null; // null means it will default on myDefaultResources.myMaterials.myFlatOpaque\r\n this.myColor = null; // If this is set and material is null, it will use the default flat opaque material with this color\r\n\r\n this.myLocal = false;\r\n\r\n this.myType = VisualElementDefaultType.ARROW;\r\n }\r\n\r\n setStartEnd(start, end) {\r\n end.vec3_sub(start, this.myDirection);\r\n this.myLength = this.myDirection.vec3_length();\r\n this.myDirection.vec3_normalize(this.myDirection);\r\n this.myStart.vec3_copy(start);\r\n\r\n return this;\r\n }\r\n\r\n _copyHook(other, deepCopy) {\r\n // Implemented outside class definition\r\n }\r\n\r\n _new() {\r\n return new VisualArrowParams(this.myParent.pp_getEngine());\r\n }\r\n\r\n _equalsHook(other) {\r\n return this.myThickness == other.myThickness &&\r\n this.myLength == other.myLength &&\r\n this.myLineMesh == other.myLineMesh &&\r\n this.myArrowMesh == other.myArrowMesh &&\r\n this.myMaterial == other.myMaterial &&\r\n this.myLocal == other.myLocal &&\r\n this.myArrowThickness == other.myArrowThickness &&\r\n this.myArrowLength == other.myArrowLength &&\r\n this.myShareArrowLengthWithLineWhenArrowLongerThanLength == other.myShareArrowLengthWithLineWhenArrowLongerThanLength &&\r\n (this.myColor == other.myColor || (this.myColor != null && other.myColor != null && this.myColor.vec_equals(other.myColor))) &&\r\n this.myStart.vec3_equals(other.myStart) &&\r\n this.myDirection.vec3_equals(other.myDirection);\r\n }\r\n}\r\n\r\n/**\r\n * Example:\r\n * \r\n * ```js \r\n * const visualParams = new VisualArrowParams();\r\n * visualParams.myStart.vec3_copy(start);\r\n * visualParams.myDirection.vec3_copy(direction);\r\n * visualParams.myLength = 0.2;\r\n * visualParams.myMaterial = Globals.getDefaultMaterials().myFlatOpaque.clone();\r\n * visualParams.myMaterial.color = vec4_create(1, 1, 1, 1);\r\n * const visualArrow = new VisualArrow(visualParams);\r\n * Globals.getVisualManager().draw(visualParams);\r\n * \r\n * // OR\r\n * \r\n * Globals.getVisualManager().draw(visualParams);\r\n * ```\r\n*/\r\nexport class VisualArrow extends AbstractVisualElement {\r\n\r\n constructor(params = new VisualArrowParams()) {\r\n super(params);\r\n\r\n this._myVisualLine = new VisualLine(new VisualLineParams(this._myParams.myParent.pp_getEngine()));\r\n this._myVisualLine.setAutoRefresh(false);\r\n\r\n this._myArrowParentObject = null;\r\n this._myArrowObject = null;\r\n this._myArrowMeshComponent = null;\r\n\r\n this._myFlatOpaqueMaterial = null;\r\n\r\n this._prepare();\r\n }\r\n\r\n _visibleChanged() {\r\n this._myVisualLine.setVisible(this._myVisible);\r\n this._myArrowParentObject.pp_setActive(this._myVisible);\r\n }\r\n\r\n _updateHook(dt) {\r\n this._myVisualLine.update(dt);\r\n }\r\n\r\n _build() {\r\n this._myArrowParentObject = Globals.getSceneObjects(this._myParams.myParent.pp_getEngine()).myVisualElements.pp_addChild();\r\n this._myArrowObject = this._myArrowParentObject.pp_addChild();\r\n\r\n this._myArrowMeshComponent = this._myArrowObject.pp_addComponent(MeshComponent);\r\n }\r\n\r\n _refreshHook() {\r\n // Implemented outside class definition\r\n }\r\n\r\n _new(params) {\r\n return new VisualArrow(params);\r\n }\r\n\r\n _destroyHook() {\r\n this._myVisualLine.destroy();\r\n this._myArrowParentObject.pp_destroy();\r\n }\r\n}\r\n\r\n\r\n\r\n// IMPLEMENTATION\r\n\r\nVisualArrow.prototype._refreshHook = function () {\r\n let arrowPosition = vec3_create();\r\n let parentTranslate = vec3_create();\r\n let arrowScale = vec3_create();\r\n\r\n let forward = vec3_create(0, 1, 0);\r\n return function _refreshHook() {\r\n this._myArrowParentObject.pp_setParent(this._myParams.myParent, false);\r\n\r\n let arrowThickness = (this._myParams.myArrowThickness != null) ? this._myParams.myArrowThickness : this._myParams.myThickness * 1.5;\r\n let arrowLength = (this._myParams.myArrowLength != null) ? this._myParams.myArrowLength : this._myParams.myThickness * 3.5;\r\n\r\n if (this._myParams.myShareArrowLengthWithLineWhenArrowLongerThanLength && arrowLength > this._myParams.myLength / 2) {\r\n arrowLength = this._myParams.myLength / 2;\r\n }\r\n\r\n arrowLength = Math.min(arrowLength, this._myParams.myLength);\r\n\r\n arrowScale.vec3_set(arrowThickness, arrowLength / 2, arrowThickness);\r\n\r\n let lineLength = this._myParams.myLength - arrowLength;\r\n\r\n this._myParams.myDirection.vec3_scale(lineLength, arrowPosition);\r\n arrowPosition.vec3_add(this._myParams.myStart, arrowPosition);\r\n\r\n if (this._myParams.myLocal) {\r\n this._myArrowParentObject.pp_setPositionLocal(arrowPosition);\r\n this._myArrowParentObject.pp_setUpLocal(this._myParams.myDirection, forward);\r\n } else {\r\n this._myArrowParentObject.pp_setPosition(arrowPosition);\r\n this._myArrowParentObject.pp_setUp(this._myParams.myDirection, forward);\r\n }\r\n\r\n parentTranslate.vec3_set(0, (arrowLength / 2) - 0.00001, 0);\r\n this._myArrowParentObject.pp_translateObject(parentTranslate);\r\n\r\n if (this._myParams.myLocal) {\r\n this._myArrowObject.pp_setScaleLocal(arrowScale);\r\n } else {\r\n this._myArrowObject.pp_setScale(arrowScale);\r\n }\r\n\r\n if (this._myParams.myArrowMesh != null) {\r\n this._myArrowMeshComponent.mesh = this._myParams.myArrowMesh;\r\n } else {\r\n this._myArrowMeshComponent.mesh = Globals.getDefaultMeshes(this._myParams.myParent.pp_getEngine()).myCone;\r\n }\r\n\r\n if (this._myParams.myMaterial == null) {\r\n if (this._myParams.myColor == null) {\r\n this._myArrowMeshComponent.material = Globals.getVisualResources(this._myParams.myParent.pp_getEngine()).myDefaultMaterials.myMesh;\r\n } else {\r\n if (this._myFlatOpaqueMaterial == null) {\r\n this._myFlatOpaqueMaterial = Globals.getDefaultMaterials(this._myParams.myParent.pp_getEngine()).myFlatOpaque.clone();\r\n }\r\n this._myArrowMeshComponent.material = this._myFlatOpaqueMaterial;\r\n this._myFlatOpaqueMaterial.color = this._myParams.myColor;\r\n }\r\n } else {\r\n this._myArrowMeshComponent.material = this._myParams.myMaterial;\r\n }\r\n\r\n let visualLineParams = this._myVisualLine.getParams();\r\n visualLineParams.myStart.vec3_copy(this._myParams.myStart);\r\n visualLineParams.myDirection.vec3_copy(this._myParams.myDirection);\r\n visualLineParams.myLength = lineLength;\r\n visualLineParams.myThickness = this._myParams.myThickness;\r\n visualLineParams.myMesh = this._myParams.myLineMesh;\r\n\r\n visualLineParams.myMaterial = this._myArrowMeshComponent.material;\r\n\r\n visualLineParams.myParent = this._myParams.myParent;\r\n visualLineParams.myLocal = this._myParams.myLocal;\r\n\r\n this._myVisualLine.paramsUpdated();\r\n };\r\n}();\r\n\r\nVisualArrowParams.prototype._copyHook = function _copyHook(other, deepCopy) {\r\n this.myStart.vec3_copy(other.myStart);\r\n this.myDirection.vec3_copy(other.myDirection);\r\n this.myLength = other.myLength;\r\n this.myThickness = other.myThickness;\r\n\r\n this.myArrowThickness = other.myArrowThickness;\r\n this.myArrowLength = other.myArrowLength;\r\n\r\n this.myShareArrowLengthWithLineWhenArrowLongerThanLength = other.myShareArrowLengthWithLineWhenArrowLongerThanLength;\r\n\r\n this.myArrowMesh = other.myArrowMesh;\r\n this.myLineMesh = other.myLineMesh;\r\n\r\n if (other.myMaterial != null && deepCopy) {\r\n this.myMaterial = other.myMaterial.clone();\r\n } else {\r\n this.myMaterial = other.myMaterial;\r\n }\r\n\r\n if (other.myColor != null) {\r\n if (this.myColor != null) {\r\n this.myColor.vec4_copy(other.myColor);\r\n } else {\r\n this.myColor = other.myColor.vec4_clone();\r\n }\r\n } else {\r\n this.myColor = null;\r\n }\r\n\r\n this.myLocal = other.myLocal;\r\n};", "import { Object3D, WonderlandEngine } from \"@wonderlandengine/api\";\r\nimport { Globals } from \"../../../pp/globals.js\";\r\nimport { VisualElementDefaultType } from \"./visual_element_types.js\";\r\n\r\nexport interface VisualElementParams {\r\n myType: unknown | VisualElementDefaultType;\r\n\r\n /** If not specified it will default to `Globals.getSceneObjects().myVisualElements` */\r\n myParent: Object3D;\r\n\r\n copyGeneric(other: Readonly, deepCopy: boolean): void;\r\n cloneGeneric(deepClone: boolean): VisualElementParams;\r\n\r\n equalsGeneric(other: Readonly): boolean;\r\n}\r\n\r\nexport abstract class AbstractVisualElementParams> implements VisualElementParams {\r\n public abstract myType: unknown | VisualElementDefaultType;\r\n\r\n public myParent: Object3D;\r\n\r\n constructor(engine: Readonly = Globals.getMainEngine()!) {\r\n this.myParent = Globals.getSceneObjects(engine)!.myVisualElements!;\r\n }\r\n\r\n public copy(other: Readonly, deepCopy: boolean = true): void {\r\n this.myParent = other.myParent;\r\n\r\n this._copyHook(other, deepCopy);\r\n }\r\n\r\n public clone(deepClone: boolean = true): T {\r\n const clonedParams = this._new();\r\n clonedParams.copyGeneric(this, deepClone);\r\n return clonedParams;\r\n }\r\n\r\n public equals(other: Readonly): boolean {\r\n if (this as unknown as T == other) return true;\r\n\r\n if (this.myParent != other.myParent) return false;\r\n\r\n return this._equalsHook(other);\r\n }\r\n\r\n public copyGeneric(other: Readonly, deepCopy: boolean = true): void {\r\n if (other.myType != this.myType) {\r\n throw new Error(\"Trying to copy from params with a different type - From Type: \" + other.myType + \" - To Type: \" + this.myType);\r\n }\r\n\r\n this.copy(other as Readonly, deepCopy);\r\n }\r\n\r\n public cloneGeneric(deepClone: boolean = true): VisualElementParams {\r\n return this.clone(deepClone);\r\n }\r\n\r\n public equalsGeneric(other: Readonly): boolean {\r\n return this.equals(other as Readonly);\r\n }\r\n\r\n protected abstract _copyHook(other: Readonly, deepCopy: boolean): void;\r\n protected abstract _new(): T;\r\n\r\n protected abstract _equalsHook(other: Readonly): boolean;\r\n}\r\n\r\nexport interface VisualElement {\r\n update(dt: number): void;\r\n\r\n setVisible(visible: boolean): void;\r\n\r\n refresh(): void;\r\n setAutoRefresh(autoRefresh: boolean): void;\r\n\r\n getParamsGeneric(): VisualElementParams;\r\n setParamsGeneric(params: VisualElementParams): void;\r\n copyParamsGeneric(params: VisualElementParams): void;\r\n\r\n paramsUpdated(): void;\r\n\r\n clone(): VisualElement;\r\n\r\n destroy(): void;\r\n}\r\n\r\nexport abstract class AbstractVisualElement, VisualElementParamsType extends AbstractVisualElementParams> implements VisualElement {\r\n\r\n protected _myParams: VisualElementParamsType;\r\n protected _myPrevParams: VisualElementParamsType;\r\n\r\n protected _myVisible: boolean = false;\r\n protected _myAutoRefresh: boolean = true;\r\n\r\n protected _myDirty: boolean = false;\r\n\r\n protected _myDestroyed: boolean = false;\r\n\r\n constructor(params: VisualElementParamsType) {\r\n this._myParams = params;\r\n this._myPrevParams = this._myParams.clone();\r\n }\r\n\r\n public update(dt: number): void {\r\n if (this._myDirty) {\r\n this._refresh();\r\n\r\n this._myDirty = false;\r\n }\r\n\r\n this._updateHook(dt);\r\n }\r\n\r\n public setVisible(visible: boolean): void {\r\n if (this._myVisible != visible) {\r\n this._myVisible = visible;\r\n\r\n this._visibleChanged();\r\n }\r\n }\r\n\r\n public refresh(): void {\r\n this.update(0);\r\n }\r\n\r\n public setAutoRefresh(autoRefresh: boolean): void {\r\n this._myAutoRefresh = autoRefresh;\r\n }\r\n\r\n public getParams(): VisualElementParamsType {\r\n return this._myParams;\r\n }\r\n\r\n public setParams(params: VisualElementParamsType): void {\r\n this._myParams = params;\r\n this.paramsUpdated();\r\n }\r\n\r\n public copyParams(params: VisualElementParamsType): void {\r\n this._myParams.copy(params);\r\n this.paramsUpdated();\r\n }\r\n\r\n public getParamsGeneric(): VisualElementParams {\r\n return this._myParams;\r\n }\r\n\r\n public setParamsGeneric(params: VisualElementParams): void {\r\n if (params.myType != this._myParams.myType) {\r\n throw new Error(\"Trying to set params with a different type - Current Type: \" + params.myType + \" - New Type: \" + this._myParams.myType);\r\n }\r\n\r\n this.setParams(params as VisualElementParamsType);\r\n }\r\n\r\n public copyParamsGeneric(params: VisualElementParams): void {\r\n if (params.myType != this._myParams.myType) {\r\n throw new Error(\"Trying to copy from params with a different type - From Type: \" + params.myType + \" - To Type: \" + this._myParams.myType);\r\n }\r\n\r\n this.copyParams(params as VisualElementParamsType);\r\n }\r\n\r\n public paramsUpdated(): void {\r\n if (!this._myParams.equals(this._myPrevParams)) {\r\n this._markDirty();\r\n }\r\n }\r\n\r\n private _markDirty(): void {\r\n this._myDirty = true;\r\n\r\n if (this._myAutoRefresh) {\r\n this.update(0);\r\n }\r\n }\r\n\r\n public clone(): VisualElementType {\r\n const clonedParams = this._myParams.clone();\r\n\r\n const clone = this._new(clonedParams);\r\n clone.setAutoRefresh(this._myAutoRefresh);\r\n clone.setVisible(this._myVisible);\r\n clone._myDirty = this._myDirty;\r\n\r\n return clone;\r\n }\r\n\r\n protected _prepare(): void {\r\n this._myPrevParams.copy(this._myParams, false);\r\n\r\n this._build();\r\n\r\n this._myDirty = true;\r\n this.refresh();\r\n\r\n this.setVisible(true);\r\n }\r\n\r\n private _refresh(): void {\r\n this._myPrevParams.copy(this._myParams, false);\r\n\r\n this._refreshHook();\r\n }\r\n\r\n protected _updateHook(dt: number): void { }\r\n\r\n protected _visibleChanged(): void { }\r\n\r\n protected abstract _build(): void;\r\n protected abstract _refreshHook(): void;\r\n\r\n protected abstract _new(params: VisualElementParamsType): VisualElementType;\r\n\r\n protected _destroyHook(): void { }\r\n\r\n public destroy(): void {\r\n this._myDestroyed = true;\r\n\r\n this._destroyHook();\r\n }\r\n\r\n public isDestroyed(): boolean {\r\n return this._myDestroyed;\r\n }\r\n}", "export enum VisualElementDefaultType {\r\n MESH = \"mesh\",\r\n LINE = \"line\",\r\n POINT = \"point\",\r\n TEXT = \"text\",\r\n ARROW = \"arrow\",\r\n TRANSFORM = \"transform\",\r\n RAYCAST = \"raycast\",\r\n TORUS = \"torus\"\r\n}", "import { MeshComponent } from \"@wonderlandengine/api\";\r\nimport { vec3_create } from \"../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Globals } from \"../../../pp/globals.js\";\r\nimport { AbstractVisualElement, AbstractVisualElementParams } from \"./visual_element.js\";\r\nimport { VisualElementDefaultType } from \"./visual_element_types.js\";\r\n\r\nexport class VisualLineParams extends AbstractVisualElementParams {\r\n\r\n /**\r\n * TS type inference helper\r\n * \r\n * @param {any} engine\r\n */\r\n constructor(engine = Globals.getMainEngine()) {\r\n super(engine);\r\n\r\n this.myStart = vec3_create();\r\n this.myDirection = vec3_create(0, 0, 1);\r\n this.myLength = 0;\r\n\r\n this.myThickness = 0.005;\r\n\r\n this.myMesh = null; // The mesh is scaled along up axis, null means it will default on myDefaultResources.myMeshes.myCylinder\r\n\r\n this.myMaterial = null; // null means it will default on myDefaultResources.myMaterials.myFlatOpaque\r\n this.myColor = null; // If this is set and material is null, it will use the default flat opaque material with this color\r\n\r\n this.myLocal = false;\r\n\r\n this.myType = VisualElementDefaultType.LINE;\r\n }\r\n\r\n setStartEnd(start, end) {\r\n end.vec3_sub(start, this.myDirection);\r\n this.myLength = this.myDirection.vec3_length();\r\n this.myDirection.vec3_normalize(this.myDirection);\r\n this.myStart.vec3_copy(start);\r\n\r\n return this;\r\n }\r\n\r\n _copyHook(other, deepCopy) {\r\n // Implemented outside class definition\r\n }\r\n\r\n _new() {\r\n return new VisualLineParams(this.myParent.pp_getEngine());\r\n }\r\n\r\n _equalsHook(other) {\r\n return this.myThickness == other.myThickness &&\r\n this.myLength == other.myLength &&\r\n this.myMesh == other.myMesh &&\r\n this.myMaterial == other.myMaterial &&\r\n this.myLocal == other.myLocal &&\r\n (this.myColor == other.myColor || (this.myColor != null && other.myColor != null && this.myColor.vec_equals(other.myColor))) &&\r\n this.myStart.vec3_equals(other.myStart) &&\r\n this.myDirection.vec3_equals(other.myDirection);\r\n }\r\n}\r\n\r\n/**\r\n * Example:\r\n * \r\n * ```js \r\n * const visualParams = new VisualLineParams();\r\n * visualParams.myStart.vec3_copy(start);\r\n * visualParams.myDirection.vec3_copy(direction);\r\n * visualParams.myLength = 0.2;\r\n * visualParams.myMaterial = Globals.getDefaultMaterials().myFlatOpaque.clone();\r\n * visualParams.myMaterial.color = vec4_create(1, 1, 1, 1);\r\n * const visualLine = new VisualLine(visualParams);\r\n * \r\n * // OR\r\n * \r\n * Globals.getVisualManager().draw(visualParams);\r\n * ```\r\n*/\r\nexport class VisualLine extends AbstractVisualElement {\r\n\r\n constructor(params = new VisualLineParams()) {\r\n super(params);\r\n\r\n this._myLineParentObject = null;\r\n this._myLineObject = null;\r\n this._myLineMeshComponent = null;\r\n\r\n this._myFlatOpaqueMaterial = null;\r\n\r\n this._prepare();\r\n }\r\n\r\n _visibleChanged() {\r\n this._myLineParentObject.pp_setActive(this._myVisible);\r\n }\r\n\r\n _build() {\r\n this._myLineParentObject = Globals.getSceneObjects(this._myParams.myParent.pp_getEngine()).myVisualElements.pp_addChild();\r\n this._myLineObject = this._myLineParentObject.pp_addChild();\r\n\r\n this._myLineMeshComponent = this._myLineObject.pp_addComponent(MeshComponent);\r\n }\r\n\r\n _refreshHook() {\r\n // Implemented outside class definition\r\n }\r\n\r\n _new(params) {\r\n return new VisualLine(params);\r\n }\r\n\r\n _destroyHook() {\r\n this._myLineParentObject.pp_destroy();\r\n }\r\n}\r\n\r\n\r\n\r\n// IMPLEMENTATION\r\n\r\nVisualLine.prototype._refreshHook = function () {\r\n let scaleLine = vec3_create();\r\n let translateLine = vec3_create();\r\n\r\n let forward = vec3_create(0, 1, 0);\r\n return function _refreshHook() {\r\n this._myLineParentObject.pp_setParent(this._myParams.myParent, false);\r\n\r\n if (this._myParams.myLocal) {\r\n this._myLineParentObject.pp_setPositionLocal(this._myParams.myStart);\r\n } else {\r\n this._myLineParentObject.pp_setPosition(this._myParams.myStart);\r\n }\r\n\r\n scaleLine.vec3_set(this._myParams.myThickness / 2, this._myParams.myLength / 2, this._myParams.myThickness / 2);\r\n if (this._myParams.myLocal) {\r\n this._myLineObject.pp_setScaleLocal(scaleLine);\r\n } else {\r\n this._myLineObject.pp_setScale(scaleLine);\r\n }\r\n\r\n if (this._myParams.myLocal) {\r\n this._myLineObject.pp_setUpLocal(this._myParams.myDirection, forward);\r\n } else {\r\n this._myLineObject.pp_setUp(this._myParams.myDirection, forward);\r\n }\r\n\r\n this._myLineObject.pp_resetPositionLocal();\r\n translateLine.vec3_set(0, this._myParams.myLength / 2, 0);\r\n this._myLineObject.pp_translateObject(translateLine);\r\n\r\n if (this._myParams.myMesh != null) {\r\n this._myLineMeshComponent.mesh = this._myParams.myMesh;\r\n } else {\r\n this._myLineMeshComponent.mesh = Globals.getDefaultMeshes(this._myParams.myParent.pp_getEngine()).myCylinder;\r\n }\r\n\r\n if (this._myParams.myMaterial == null) {\r\n if (this._myParams.myColor == null) {\r\n this._myLineMeshComponent.material = Globals.getVisualResources(this._myParams.myParent.pp_getEngine()).myDefaultMaterials.myMesh;\r\n } else {\r\n if (this._myFlatOpaqueMaterial == null) {\r\n this._myFlatOpaqueMaterial = Globals.getDefaultMaterials(this._myParams.myParent.pp_getEngine()).myFlatOpaque.clone();\r\n }\r\n this._myLineMeshComponent.material = this._myFlatOpaqueMaterial;\r\n this._myFlatOpaqueMaterial.color = this._myParams.myColor;\r\n }\r\n } else {\r\n this._myLineMeshComponent.material = this._myParams.myMaterial;\r\n }\r\n };\r\n}();\r\n\r\nVisualLineParams.prototype._copyHook = function _copyHook(other, deepCopy) {\r\n this.myStart.vec3_copy(other.myStart);\r\n this.myDirection.vec3_copy(other.myDirection);\r\n this.myLength = other.myLength;\r\n this.myThickness = other.myThickness;\r\n\r\n this.myMesh = other.myMesh;\r\n\r\n if (other.myMaterial != null && deepCopy) {\r\n this.myMaterial = other.myMaterial.clone();\r\n } else {\r\n this.myMaterial = other.myMaterial;\r\n }\r\n\r\n if (other.myColor != null) {\r\n if (this.myColor != null) {\r\n this.myColor.vec4_copy(other.myColor);\r\n } else {\r\n this.myColor = other.myColor.vec4_clone();\r\n }\r\n } else {\r\n this.myColor = null;\r\n }\r\n\r\n this.myLocal = other.myLocal;\r\n};", "import { Material, Mesh, MeshComponent, Object3D } from \"@wonderlandengine/api\";\r\nimport { Matrix4 } from \"../../../cauldron/type_definitions/array_type_definitions.js\";\r\nimport { mat4_create } from \"../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Globals } from \"../../../pp/globals.js\";\r\nimport { AbstractVisualElement, AbstractVisualElementParams } from \"./visual_element.js\";\r\nimport { VisualElementDefaultType } from \"./visual_element_types.js\";\r\n\r\nexport class VisualMeshParams extends AbstractVisualElementParams {\r\n\r\n public readonly myType: unknown | VisualElementDefaultType = VisualElementDefaultType.MESH;\r\n\r\n public myTransform: Matrix4 = mat4_create();\r\n public myLocal: boolean = false;\r\n\r\n\r\n /** `null` means it will default to `Globals.getDefaultMeshes().mySphere` */\r\n public myMesh: Mesh | null = null;\r\n\r\n /** `null` means it will default to `Globals.getVisualResources().myDefaultMaterials.myMesh` */\r\n public myMaterial: Material | null = null;\r\n\r\n\r\n protected _copyHook(other: Readonly, deepCopy: boolean): void {\r\n this.myTransform.pp_copy(other.myTransform);\r\n\r\n if (other.myMesh != null) {\r\n this.myMesh = other.myMesh;\r\n } else {\r\n this.myMesh = null;\r\n }\r\n\r\n if (other.myMaterial != null && deepCopy) {\r\n this.myMaterial = other.myMaterial.clone();\r\n } else {\r\n this.myMaterial = other.myMaterial;\r\n }\r\n\r\n this.myLocal = other.myLocal;\r\n }\r\n\r\n protected _new(): VisualMeshParams {\r\n return new VisualMeshParams(this.myParent.pp_getEngine());\r\n }\r\n\r\n protected _equalsHook(other: Readonly): boolean {\r\n return this.myMesh == other.myMesh &&\r\n this.myMaterial == other.myMaterial &&\r\n this.myLocal == other.myLocal &&\r\n this.myTransform.vec_equals(other.myTransform);\r\n }\r\n}\r\n\r\n/**\r\n * Example:\r\n * \r\n * ```js \r\n * const visualParams = new VisualMeshParams();\r\n * visualParams.myTransform = transform;\r\n * visualParams.myMesh = Globals.getDefaultMeshes().mySphere;\r\n * visualParams.myMaterial = Globals.getDefaultMaterials().myFlatOpaque.clone();\r\n * visualParams.myMaterial.color = vec4_create(1, 1, 1, 1);\r\n * \r\n * const visualMesh = new VisualMesh(visualParams);\r\n * \r\n * // OR\r\n * \r\n * Globals.getVisualManager().draw(visualParams);\r\n * ```\r\n */\r\nexport class VisualMesh extends AbstractVisualElement {\r\n\r\n private readonly _myMeshObject!: Object3D;\r\n private readonly _myMeshComponent!: MeshComponent;\r\n\r\n constructor(params: VisualMeshParams = new VisualMeshParams()) {\r\n super(params);\r\n this._prepare();\r\n }\r\n\r\n protected override _visibleChanged(): void {\r\n this._myMeshObject.pp_setActive(this._myVisible);\r\n }\r\n\r\n protected _build(): void {\r\n (this._myMeshObject as Object3D) = Globals.getSceneObjects(this._myParams.myParent.pp_getEngine())!.myVisualElements!.pp_addChild();\r\n\r\n (this._myMeshComponent as MeshComponent) = this._myMeshObject.pp_addComponent(MeshComponent)!;\r\n }\r\n\r\n protected _refreshHook(): void {\r\n this._myMeshObject.pp_setParent(this._myParams.myParent, false);\r\n\r\n if (this._myParams.myLocal) {\r\n this._myMeshObject.pp_setTransformLocal(this._myParams.myTransform);\r\n } else {\r\n this._myMeshObject.pp_setTransform(this._myParams.myTransform);\r\n }\r\n\r\n if (this._myParams.myMesh == null) {\r\n this._myMeshComponent.mesh = Globals.getDefaultMeshes(this._myParams.myParent.pp_getEngine())!.mySphere;\r\n } else {\r\n this._myMeshComponent.mesh = this._myParams.myMesh;\r\n }\r\n\r\n if (this._myParams.myMaterial == null) {\r\n this._myMeshComponent.material = Globals.getVisualResources(this._myParams.myParent.pp_getEngine())!.myDefaultMaterials.myMesh;\r\n } else {\r\n this._myMeshComponent.material = this._myParams.myMaterial;\r\n }\r\n }\r\n\r\n protected _new(params: VisualMeshParams): VisualMesh {\r\n return new VisualMesh(params);\r\n }\r\n\r\n protected override _destroyHook(): void {\r\n this._myMeshObject.pp_destroy();\r\n }\r\n}", "import { MeshComponent } from \"@wonderlandengine/api\";\r\nimport { vec3_create } from \"../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Globals } from \"../../../pp/globals.js\";\r\nimport { AbstractVisualElement, AbstractVisualElementParams } from \"./visual_element.js\";\r\nimport { VisualElementDefaultType } from \"./visual_element_types.js\";\r\n\r\nexport class VisualPointParams extends AbstractVisualElementParams {\r\n\r\n /**\r\n * TS type inference helper\r\n * \r\n * @param {any} engine\r\n */\r\n constructor(engine = Globals.getMainEngine()) {\r\n super(engine);\r\n\r\n this.myPosition = vec3_create();\r\n this.myRadius = 0.005;\r\n\r\n this.myMesh = null; // The mesh is scaled along up axis, null means it will default on myDefaultResources.myMeshes.mySphere\r\n\r\n this.myMaterial = null; // null means it will default on myDefaultResources.myMaterials.myFlatOpaque\r\n this.myColor = null; // If this is set and material is null, it will use the default flat opaque material with this color\r\n\r\n this.myLocal = false;\r\n\r\n this.myType = VisualElementDefaultType.POINT;\r\n }\r\n\r\n _copyHook(other, deepCopy) {\r\n // Implemented outside class definition\r\n }\r\n\r\n _new() {\r\n return new VisualPointParams(this.myParent.pp_getEngine());\r\n }\r\n\r\n _equalsHook(other) {\r\n return this.myRadius == other.myRadius &&\r\n this.myMesh == other.myMesh &&\r\n this.myMaterial == other.myMaterial &&\r\n this.myLocal == other.myLocal &&\r\n (this.myColor == other.myColor || (this.myColor != null && other.myColor != null && this.myColor.vec_equals(other.myColor))) &&\r\n this.myPosition.vec3_equals(other.myPosition);\r\n }\r\n}\r\n\r\n/**\r\n * Example:\r\n * \r\n * ```js \r\n * const visualParams = new VisualPointParams();\r\n * visualParams.myPosition.vec3_copy(position);\r\n * visualParams.myRadius = 0.005;\r\n * visualParams.myMaterial = Globals.getDefaultMaterials().myFlatOpaque.clone();\r\n * visualParams.myMaterial.color = vec4_create(1, 1, 1, 1);\r\n * const visualPoint = new VisualPoint(visualParams);\r\n * \r\n * // OR\r\n * \r\n * Globals.getVisualManager().draw(visualParams);\r\n * ```\r\n*/\r\nexport class VisualPoint extends AbstractVisualElement {\r\n\r\n constructor(params = new VisualPointParams()) {\r\n super(params);\r\n\r\n this._myPointObject = null;\r\n this._myPointMeshComponent = null;\r\n\r\n this._myFlatOpaqueMaterial = null;\r\n\r\n this._prepare();\r\n }\r\n\r\n _visibleChanged() {\r\n this._myPointObject.pp_setActive(this._myVisible);\r\n }\r\n\r\n _build() {\r\n this._myPointObject = Globals.getSceneObjects(this._myParams.myParent.pp_getEngine()).myVisualElements.pp_addChild();\r\n\r\n this._myPointMeshComponent = this._myPointObject.pp_addComponent(MeshComponent);\r\n }\r\n\r\n _refreshHook() {\r\n // Implemented outside class definition\r\n }\r\n\r\n _new(params) {\r\n return new VisualPoint(params);\r\n }\r\n\r\n _destroyHook() {\r\n this._myPointObject.pp_destroy();\r\n }\r\n}\r\n\r\n\r\n\r\n// IMPLEMENTATION\r\n\r\nVisualPoint.prototype._refreshHook = function () {\r\n let rotation = vec3_create(0, 0, 0);\r\n return function _refreshHook() {\r\n this._myPointObject.pp_setParent(this._myParams.myParent, false);\r\n\r\n if (this._myParams.myLocal) {\r\n this._myPointObject.pp_setPositionLocal(this._myParams.myPosition);\r\n this._myPointObject.pp_setRotationLocal(rotation);\r\n this._myPointObject.pp_setScaleLocal(this._myParams.myRadius);\r\n } else {\r\n this._myPointObject.pp_setPosition(this._myParams.myPosition);\r\n this._myPointObject.pp_setRotation(rotation);\r\n this._myPointObject.pp_setScale(this._myParams.myRadius);\r\n }\r\n\r\n if (this._myParams.myMesh != null) {\r\n this._myPointMeshComponent.mesh = this._myParams.myMesh;\r\n } else {\r\n this._myPointMeshComponent.mesh = Globals.getDefaultMeshes(this._myParams.myParent.pp_getEngine()).mySphere;\r\n }\r\n\r\n if (this._myParams.myMaterial == null) {\r\n if (this._myParams.myColor == null) {\r\n this._myPointMeshComponent.material = Globals.getVisualResources(this._myParams.myParent.pp_getEngine()).myDefaultMaterials.myMesh;\r\n } else {\r\n if (this._myFlatOpaqueMaterial == null) {\r\n this._myFlatOpaqueMaterial = Globals.getDefaultMaterials(this._myParams.myParent.pp_getEngine()).myFlatOpaque.clone();\r\n }\r\n this._myPointMeshComponent.material = this._myFlatOpaqueMaterial;\r\n this._myFlatOpaqueMaterial.color = this._myParams.myColor;\r\n }\r\n } else {\r\n this._myPointMeshComponent.material = this._myParams.myMaterial;\r\n }\r\n };\r\n}();\r\n\r\nVisualPointParams.prototype._copyHook = function _copyHook(other, deepCopy) {\r\n this.myPosition.vec3_copy(other.myPosition);\r\n this.myRadius = other.myRadius;\r\n\r\n this.myMesh = other.myMesh;\r\n\r\n if (other.myMaterial != null && deepCopy) {\r\n this.myMaterial = other.myMaterial.clone();\r\n } else {\r\n this.myMaterial = other.myMaterial;\r\n }\r\n\r\n if (other.myColor != null) {\r\n if (this.myColor != null) {\r\n this.myColor.vec4_copy(other.myColor);\r\n } else {\r\n this.myColor = other.myColor.vec4_clone();\r\n }\r\n } else {\r\n this.myColor = null;\r\n }\r\n\r\n this.myLocal = other.myLocal;\r\n};", "import { Object3D, PhysXComponent, Physics } from \"@wonderlandengine/api\";\r\nimport { vec3_create } from \"../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Globals } from \"../../pp/globals.js\";\r\nimport { RaycastBlockColliderType, RaycastHit, RaycastParams, RaycastResults } from \"./physics_raycast_params.js\";\r\n\r\nlet _myLayerFlagsNames = [\"0\", \"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\"];\r\n\r\nconst _myRaycastCount: WeakMap, number> = new WeakMap();\r\nconst _myRaycastVisualDebugEnabled: WeakMap, boolean> = new WeakMap();\r\n\r\nexport function setLayerFlagsNames(layerFlagsNames: string[]): void {\r\n _myLayerFlagsNames = layerFlagsNames;\r\n}\r\n\r\nexport function getLayerFlagsNames(): string[] {\r\n return _myLayerFlagsNames;\r\n}\r\n\r\nexport function getRaycastCount(physics: Readonly = Globals.getPhysics()!): number {\r\n const raycastCount = _myRaycastCount.get(physics);\r\n return raycastCount != null ? raycastCount : 0;\r\n}\r\n\r\nexport function resetRaycastCount(physics: Readonly = Globals.getPhysics()!): void {\r\n _myRaycastCount.set(physics, 0);\r\n}\r\n\r\nexport function isRaycastVisualDebugEnabled(physics: Readonly = Globals.getPhysics()!): boolean {\r\n return _myRaycastVisualDebugEnabled.get(physics) || false;\r\n}\r\n\r\nexport function setRaycastVisualDebugEnabled(visualDebugEnabled: boolean, physics: Readonly = Globals.getPhysics()!): void {\r\n _myRaycastVisualDebugEnabled.set(physics, visualDebugEnabled);\r\n}\r\n\r\nexport const raycast = function () {\r\n // These initializations assume that there can't be more than @maxHitCount hits within a single rayCast call\r\n // if the hitCount is greater, these arrays will be allocated again\r\n let maxHitCount: number = 20;\r\n let objects: Object3D[] = new Array(maxHitCount);\r\n let distances: Float32Array = new Float32Array(maxHitCount);\r\n let locations: Float32Array[] = Array.from({ length: maxHitCount }, () => new Float32Array(3));\r\n let normals: Float32Array[] = Array.from({ length: maxHitCount }, () => new Float32Array(3));\r\n\r\n const insideCheckSubVector = vec3_create();\r\n const invertedRaycastDirection = vec3_create();\r\n const objectsEqualCallback = (first: Readonly, second: Readonly): boolean => first == second;\r\n return function raycast(raycastParams: Readonly, raycastResults: RaycastResults = new RaycastResults()): RaycastResults {\r\n const internalRaycastResults = raycastParams.myPhysics.rayCast(raycastParams.myOrigin, raycastParams.myDirection, raycastParams.myBlockLayerFlags.getMask(), raycastParams.myDistance);\r\n\r\n if (raycastResults.myRaycastParams == null) {\r\n raycastResults.myRaycastParams = new RaycastParams(raycastParams.myPhysics);\r\n }\r\n\r\n raycastResults.myRaycastParams.copy(raycastParams);\r\n\r\n let currentValidHitIndex = 0;\r\n let validHitsCount = 0;\r\n\r\n const hitCount = internalRaycastResults.hitCount;\r\n if (hitCount != 0) {\r\n if (hitCount > maxHitCount) {\r\n console.warn(\"Raycast hitcount is more than the expected one: \" + hitCount + \" - Allocation of needed resources performed\");\r\n\r\n maxHitCount = Math.ceil(hitCount + hitCount * 0.5);\r\n objects = new Array(maxHitCount);\r\n distances = new Float32Array(maxHitCount);\r\n locations = Array.from({ length: maxHitCount }, () => new Float32Array(3));\r\n normals = Array.from({ length: maxHitCount }, () => new Float32Array(3));\r\n }\r\n\r\n let objectsAlreadyGet = false;\r\n let distancesAlreadyGet = false;\r\n let locationsAlreadyGet = false;\r\n let normalsAlreadyGet = false;\r\n\r\n raycastParams.myDirection.vec3_negate(invertedRaycastDirection);\r\n\r\n for (let i = 0; i < hitCount; i++) {\r\n if (raycastParams.myObjectsToIgnore.length != 0) {\r\n if (!objectsAlreadyGet) {\r\n objectsAlreadyGet = true;\r\n internalRaycastResults.getObjects(objects);\r\n }\r\n\r\n if (raycastParams.myObjectsToIgnore.pp_hasEqual(objects[i], objectsEqualCallback)) {\r\n continue;\r\n }\r\n }\r\n\r\n if (!distancesAlreadyGet) {\r\n distancesAlreadyGet = true;\r\n internalRaycastResults.getDistances(distances);\r\n }\r\n\r\n let colliderTypeValid = true;\r\n if (raycastParams.myBlockColliderType != RaycastBlockColliderType.BOTH) {\r\n colliderTypeValid = false;\r\n\r\n if (!objectsAlreadyGet) {\r\n objectsAlreadyGet = true;\r\n internalRaycastResults.getObjects(objects);\r\n }\r\n\r\n const physXComponent = objects[i].pp_getComponentSelf(PhysXComponent)!;\r\n colliderTypeValid = (physXComponent.trigger && raycastParams.myBlockColliderType == RaycastBlockColliderType.TRIGGER) || (!physXComponent.trigger && raycastParams.myBlockColliderType == RaycastBlockColliderType.NORMAL);\r\n }\r\n\r\n if (colliderTypeValid) {\r\n let hitInsideCollision = distances[i] == 0;\r\n if (hitInsideCollision) {\r\n if (!locationsAlreadyGet) {\r\n locationsAlreadyGet = true;\r\n internalRaycastResults.getLocations(locations);\r\n }\r\n\r\n hitInsideCollision &&= raycastParams.myOrigin.vec3_sub(locations[i], insideCheckSubVector).vec3_isZero(Math.PP_EPSILON);\r\n\r\n if (hitInsideCollision) {\r\n if (!normalsAlreadyGet) {\r\n normalsAlreadyGet = true;\r\n internalRaycastResults.getNormals(normals);\r\n }\r\n\r\n hitInsideCollision &&= invertedRaycastDirection.vec3_equals(normals[i], Math.PP_EPSILON_DEGREES);\r\n }\r\n }\r\n\r\n if ((!raycastParams.myIgnoreHitsInsideCollision || !hitInsideCollision)) {\r\n let hit: RaycastHit | null = null;\r\n\r\n const raycastResultsUnusedHits = (raycastResults as unknown as { _myUnusedHits: RaycastHit[] | null })._myUnusedHits;\r\n if (currentValidHitIndex < raycastResults.myHits.length) {\r\n hit = raycastResults.myHits[currentValidHitIndex];\r\n } else if (raycastResultsUnusedHits != null && raycastResultsUnusedHits.length > 0) {\r\n hit = raycastResultsUnusedHits.pop()!;\r\n raycastResults.myHits.push(hit!);\r\n } else {\r\n hit = new RaycastHit();\r\n raycastResults.myHits.push(hit);\r\n }\r\n\r\n if (!objectsAlreadyGet) {\r\n objectsAlreadyGet = true;\r\n internalRaycastResults.getObjects(objects);\r\n }\r\n\r\n if (!locationsAlreadyGet) {\r\n locationsAlreadyGet = true;\r\n internalRaycastResults.getLocations(locations);\r\n }\r\n\r\n if (!normalsAlreadyGet) {\r\n normalsAlreadyGet = true;\r\n internalRaycastResults.getNormals(normals);\r\n }\r\n\r\n hit!.myPosition.vec3_copy(locations[i]);\r\n hit!.myNormal.vec3_copy(normals[i]);\r\n hit!.myDistance = distances[i];\r\n hit!.myObject = objects[i];\r\n hit!.myInsideCollision = hitInsideCollision;\r\n\r\n validHitsCount++;\r\n currentValidHitIndex++;\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (raycastResults.myHits.length > validHitsCount) {\r\n let raycastResultsUnusedHits = (raycastResults as unknown as { _myUnusedHits: RaycastHit[] | null })._myUnusedHits;\r\n if (raycastResultsUnusedHits == null) {\r\n raycastResultsUnusedHits = [];\r\n (raycastResults as unknown as { _myUnusedHits: RaycastHit[] | null })._myUnusedHits = raycastResultsUnusedHits;\r\n\r\n }\r\n\r\n const hitsToRemove = raycastResults.myHits.length - validHitsCount;\r\n for (let i = 0; i < hitsToRemove; i++) {\r\n raycastResultsUnusedHits!.push(raycastResults.myHits.pop()!);\r\n }\r\n }\r\n\r\n if (Globals.isDebugEnabled(raycastParams.myPhysics.engine)) {\r\n if (PhysicsUtils.isRaycastVisualDebugEnabled(raycastParams.myPhysics)) {\r\n Globals.getDebugVisualManager(raycastParams.myPhysics.engine)!.drawRaycast(0, raycastResults);\r\n }\r\n\r\n _increaseRaycastCount(raycastParams.myPhysics);\r\n }\r\n\r\n return raycastResults;\r\n };\r\n}();\r\n\r\nexport const PhysicsUtils = {\r\n setLayerFlagsNames,\r\n getLayerFlagsNames,\r\n getRaycastCount,\r\n resetRaycastCount,\r\n isRaycastVisualDebugEnabled,\r\n setRaycastVisualDebugEnabled,\r\n raycast\r\n} as const;\r\n\r\n\r\n\r\nfunction _increaseRaycastCount(physics: Readonly = Globals.getPhysics()!): void {\r\n const raycastCount = _myRaycastCount.get(physics);\r\n\r\n if (raycastCount == null) {\r\n _myRaycastCount.set(physics, 1);\r\n } else {\r\n _myRaycastCount.set(physics, raycastCount + 1);\r\n }\r\n}", "import { PhysicsUtils } from \"./physics_utils.js\";\r\n\r\nexport class PhysicsLayerFlags {\r\n\r\n constructor() {\r\n this._myLayerMask = 0;\r\n }\r\n\r\n setFlagActive(indexOrName, active) {\r\n let index = indexOrName;\r\n if (isNaN(indexOrName)) {\r\n index = PhysicsUtils.getLayerFlagsNames().pp_findIndexEqual(indexOrName);\r\n }\r\n\r\n if (index >= 0 && index < PhysicsUtils.getLayerFlagsNames().length) {\r\n let mask = 1 << index;\r\n\r\n if (active) {\r\n this._myLayerMask = this._myLayerMask | mask;\r\n } else {\r\n this._myLayerMask = this._myLayerMask & ~mask;\r\n }\r\n }\r\n }\r\n\r\n isFlagActive(indexOrName) {\r\n let index = indexOrName;\r\n if (isNaN(indexOrName)) {\r\n index = PhysicsUtils.getLayerFlagsNames().pp_findIndexEqual(indexOrName);\r\n }\r\n\r\n let active = false;\r\n\r\n if (index >= 0 && index < PhysicsUtils.getLayerFlagsNames().length) {\r\n let mask = 1 << index;\r\n active = !!(this._myLayerMask & mask);\r\n }\r\n\r\n return active;\r\n }\r\n\r\n setAllFlagsActive(active) {\r\n if (!active) {\r\n this._myLayerMask = 0;\r\n } else {\r\n this._myLayerMask = Math.pow(2, PhysicsUtils.getLayerFlagsNames().length) - 1;\r\n }\r\n }\r\n\r\n add(layerFlags) {\r\n this._myLayerMask = this._myLayerMask | layerFlags.getMask();\r\n }\r\n\r\n remove(layerFlags) {\r\n this._myLayerMask = this._myLayerMask & ~(layerFlags.getMask());\r\n }\r\n\r\n intersect(layerFlags) {\r\n this._myLayerMask = this._myLayerMask & layerFlags.getMask();\r\n }\r\n\r\n copy(layerFlags) {\r\n this._myLayerMask = layerFlags._myLayerMask;\r\n }\r\n\r\n getMask() {\r\n return this._myLayerMask;\r\n }\r\n\r\n setMask(layerMask) {\r\n this._myLayerMask = layerMask;\r\n }\r\n\r\n equals(other) {\r\n return this._myLayerMask == other._myLayerMask;\r\n }\r\n}", "import { Object3D, Physics } from \"@wonderlandengine/api\";\r\nimport { vec3_create } from \"../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Globals } from \"../../pp/globals.js\";\r\nimport { Vector3 } from \"../type_definitions/array_type_definitions.js\";\r\nimport { PhysicsLayerFlags } from \"./physics_layer_flags.js\";\r\n\r\nexport enum RaycastBlockColliderType {\r\n NORMAL,\r\n TRIGGER,\r\n BOTH\r\n}\r\n\r\nexport class RaycastParams {\r\n\r\n public myOrigin: Vector3 = vec3_create();\r\n public myDirection: Vector3 = vec3_create();\r\n public myDistance: number = 0;\r\n\r\n public myBlockLayerFlags: Readonly = new PhysicsLayerFlags();\r\n public myBlockColliderType: RaycastBlockColliderType = RaycastBlockColliderType.NORMAL;\r\n\r\n public myObjectsToIgnore: Readonly[] = [];\r\n public myIgnoreHitsInsideCollision: boolean = false;\r\n\r\n public myPhysics: Readonly;\r\n\r\n constructor(physics: Readonly = Globals.getPhysics()!) {\r\n this.myPhysics = physics;\r\n }\r\n\r\n public copy(other: Readonly): void {\r\n this.myOrigin.vec3_copy(other.myOrigin);\r\n this.myDirection.vec3_copy(other.myDirection);\r\n this.myDistance = other.myDistance;\r\n\r\n this.myBlockLayerFlags.copy(other.myBlockLayerFlags);\r\n\r\n this.myObjectsToIgnore.pp_copy(other.myObjectsToIgnore);\r\n this.myIgnoreHitsInsideCollision = other.myIgnoreHitsInsideCollision;\r\n\r\n (this.myPhysics as Readonly) = other.myPhysics;\r\n }\r\n\r\n public reset(): void {\r\n this.myOrigin.vec3_zero();\r\n this.myDirection.vec3_zero();\r\n this.myDistance = 0;\r\n\r\n this.myBlockLayerFlags.setAllFlagsActive(false);\r\n\r\n this.myObjectsToIgnore.pp_clear();\r\n this.myIgnoreHitsInsideCollision = false;\r\n }\r\n\r\n public equals(other: Readonly): boolean {\r\n if (this == other) return true;\r\n\r\n return this.myOrigin.vec3_equals(other.myOrigin) &&\r\n this.myDirection.vec3_equals(other.myDirection) &&\r\n this.myDistance == other.myDistance &&\r\n this.myBlockLayerFlags.equals(other.myBlockLayerFlags) &&\r\n this.myBlockColliderType == other.myBlockColliderType &&\r\n this.myObjectsToIgnore.pp_equals(other.myObjectsToIgnore) &&\r\n this.myIgnoreHitsInsideCollision == other.myIgnoreHitsInsideCollision &&\r\n this.myPhysics == other.myPhysics;\r\n }\r\n}\r\n\r\nexport class RaycastResults {\r\n\r\n public myRaycastParams: Readonly | null = null;\r\n public myHits: Readonly[] = [];\r\n\r\n private _myUnusedHits: RaycastHit[] | null = null;\r\n\r\n public isColliding(ignoreHitsInsideCollision = false): boolean {\r\n return ignoreHitsInsideCollision ? this.getFirstHitOutsideCollision() != null : this.myHits.length > 0;\r\n }\r\n\r\n public getFirstHitInsideCollision(): Readonly | null {\r\n let firstHit = null;\r\n\r\n for (let i = 0; i < this.myHits.length; i++) {\r\n const hit = this.myHits[i];\r\n if (hit.myInsideCollision) {\r\n firstHit = hit;\r\n break;\r\n }\r\n }\r\n\r\n return firstHit;\r\n }\r\n\r\n public getFirstHitOutsideCollision(): Readonly | null {\r\n let firstHit = null;\r\n\r\n for (let i = 0; i < this.myHits.length; i++) {\r\n const hit = this.myHits[i];\r\n if (!hit.myInsideCollision) {\r\n firstHit = hit;\r\n break;\r\n }\r\n }\r\n\r\n return firstHit;\r\n }\r\n\r\n public getHitsInsideCollision(): Readonly[] {\r\n const hits = [];\r\n\r\n for (let i = 0; i < this.myHits.length; i++) {\r\n const hit = this.myHits[i];\r\n if (hit.myInsideCollision) {\r\n hits.push(hit);\r\n }\r\n }\r\n\r\n return hits;\r\n }\r\n\r\n public getHitsOutsideCollision(): Readonly[] {\r\n const hits = [];\r\n\r\n for (let i = 0; i < this.myHits.length; i++) {\r\n const hit = this.myHits[i];\r\n if (!hit.myInsideCollision) {\r\n hits.push(hit);\r\n }\r\n }\r\n\r\n return hits;\r\n }\r\n\r\n public removeHit(hitIndex: number): Readonly | null {\r\n const removedHit = this.myHits.pp_removeIndex(hitIndex);\r\n\r\n if (removedHit != null) {\r\n if (this._myUnusedHits == null) {\r\n this._myUnusedHits = [];\r\n }\r\n\r\n this._myUnusedHits.push(removedHit);\r\n }\r\n\r\n return removedHit ?? null;\r\n }\r\n\r\n public removeAllHits(): void {\r\n if (this._myUnusedHits == null) {\r\n this._myUnusedHits = [];\r\n }\r\n\r\n for (let i = 0; i < this.myHits.length; i++) {\r\n this._myUnusedHits.push(this.myHits[i]);\r\n }\r\n\r\n this.myHits.pp_clear();\r\n }\r\n\r\n\r\n private static readonly _copySV =\r\n {\r\n copyHitCallback(elementToCopy: Readonly, currentElement: RaycastHit | null): RaycastHit {\r\n if (currentElement == null) {\r\n currentElement = new RaycastHit();\r\n }\r\n\r\n currentElement.copy(elementToCopy);\r\n\r\n return currentElement;\r\n }\r\n };\r\n public copy(other: Readonly): void {\r\n if (other.myRaycastParams == null) {\r\n this.myRaycastParams = null;\r\n } else {\r\n if (this.myRaycastParams == null) {\r\n this.myRaycastParams = new RaycastParams(other.myRaycastParams.myPhysics);\r\n }\r\n\r\n this.myRaycastParams.copy(other.myRaycastParams);\r\n }\r\n\r\n if (this.myHits.length > other.myHits.length) {\r\n if (this._myUnusedHits == null) {\r\n this._myUnusedHits = [];\r\n }\r\n\r\n for (let i = 0; i < this.myHits.length - other.myHits.length; i++) {\r\n this._myUnusedHits.push(this.myHits.pop()!);\r\n }\r\n } else if (this.myHits.length < other.myHits.length) {\r\n if (this._myUnusedHits != null) {\r\n const length = Math.min(this._myUnusedHits.length, other.myHits.length - this.myHits.length);\r\n\r\n for (let i = 0; i < length; i++) {\r\n this.myHits.push(this._myUnusedHits.pop()!);\r\n }\r\n }\r\n }\r\n\r\n const copyHitCallback = RaycastResults._copySV.copyHitCallback;\r\n this.myHits.pp_copy(other.myHits, copyHitCallback);\r\n }\r\n\r\n public reset(): void {\r\n if (this.myRaycastParams != null) {\r\n this.myRaycastParams.reset();\r\n }\r\n\r\n this.removeAllHits();\r\n }\r\n\r\n private static readonly _equalsSV =\r\n {\r\n hitsEqualCallback: (first: Readonly, second: Readonly): boolean => first.equals(second)\r\n };\r\n public equals(other: Readonly): boolean {\r\n if (this == other) return true;\r\n\r\n const hitsEqualCallback = RaycastResults._equalsSV.hitsEqualCallback;\r\n return (this.myRaycastParams == other.myRaycastParams ||\r\n (this.myRaycastParams != null && other.myRaycastParams != null && this.myRaycastParams.equals(other.myRaycastParams))) &&\r\n this.myHits.pp_equals(other.myHits, hitsEqualCallback);\r\n }\r\n}\r\n\r\nexport class RaycastHit {\r\n\r\n public myPosition: Vector3 = vec3_create();\r\n public myNormal: Vector3 = vec3_create();\r\n public myDistance: number = 0;\r\n public myObject: Object3D | null = null;\r\n\r\n public myInsideCollision: boolean = false;\r\n\r\n public isValid(): boolean {\r\n return this.myObject != null;\r\n }\r\n\r\n public copy(other: Readonly): void {\r\n this.myPosition.vec3_copy(other.myPosition);\r\n this.myNormal.vec3_copy(other.myNormal);\r\n this.myDistance = other.myDistance;\r\n this.myObject = other.myObject;\r\n this.myInsideCollision = other.myInsideCollision;\r\n }\r\n\r\n public reset(): void {\r\n this.myPosition.vec3_zero();\r\n this.myNormal.vec3_zero();\r\n this.myDistance = 0;\r\n this.myObject = null;\r\n this.myInsideCollision = false;\r\n }\r\n\r\n public equals(other: Readonly): boolean {\r\n if (this == other) return true;\r\n\r\n return this.myPosition.vec3_equals(other.myPosition) &&\r\n this.myNormal.vec3_equals(other.myNormal) &&\r\n this.myDistance == other.myDistance &&\r\n this.myObject == other.myObject &&\r\n this.myInsideCollision == other.myInsideCollision;\r\n }\r\n}", "import { Globals } from \"../../../pp/globals.js\";\r\nimport { RaycastResults } from \"../../physics/physics_raycast_params.js\";\r\nimport { VisualArrow, VisualArrowParams } from \"./visual_arrow.js\";\r\nimport { AbstractVisualElement, AbstractVisualElementParams } from \"./visual_element.js\";\r\nimport { VisualElementDefaultType } from \"./visual_element_types.js\";\r\n\r\nexport class VisualRaycastParams extends AbstractVisualElementParams {\r\n\r\n /**\r\n * TS type inference helper\r\n * \r\n * @param {any} engine\r\n */\r\n constructor(engine = Globals.getMainEngine()) {\r\n super(engine);\r\n\r\n this._myRaycastResults = new RaycastResults();\r\n\r\n this.myHitNormalLength = 0.2;\r\n this.myThickness = 0.005;\r\n\r\n this.myShowOnlyFirstHit = true;\r\n\r\n this.myRayMaterial = null;\r\n this.myHitNormalMaterial = null;\r\n\r\n this.myLocal = false;\r\n\r\n this.myType = VisualElementDefaultType.RAYCAST;\r\n }\r\n\r\n get myRaycastResults() {\r\n return this._myRaycastResults;\r\n }\r\n\r\n set myRaycastResults(result) {\r\n this._myRaycastResults.copy(result);\r\n }\r\n\r\n _copyHook(other, deepCopy) {\r\n // Implemented outside class definition\r\n }\r\n\r\n _new() {\r\n return new VisualRaycastParams(this.myParent.pp_getEngine());\r\n }\r\n\r\n _equalsHook(other) {\r\n return this.myHitNormalLength == other.myHitNormalLength &&\r\n this.myThickness == other.myThickness &&\r\n this.myShowOnlyFirstHit == other.myShowOnlyFirstHit &&\r\n this.myRayMaterial == other.myRayMaterial &&\r\n this.myHitNormalMaterial == other.myHitNormalMaterial &&\r\n this.myLocal == other.myLocal &&\r\n this._myRaycastResults.equals(other._myRaycastResults);\r\n }\r\n}\r\n\r\n/**\r\n * Example:\r\n * \r\n * ```js \r\n * const visualParams = new VisualRaycastParams();\r\n * visualParams.myRaycastResults = raycastResults;\r\n * const visualRaycast = new VisualRaycast(visualParams);\r\n * \r\n * // OR\r\n * \r\n * Globals.getVisualManager().draw(visualParams);\r\n * ```\r\n*/\r\nexport class VisualRaycast extends AbstractVisualElement {\r\n\r\n constructor(params = new VisualRaycastParams()) {\r\n super(params);\r\n\r\n this._myVisualRaycast = new VisualArrow(new VisualArrowParams(this._myParams.myParent.pp_getEngine()));\r\n\r\n this._myVisualRaycast.setAutoRefresh(false);\r\n\r\n this._myVisualRaycastHitList = [];\r\n\r\n this._addVisualRaycastHit();\r\n\r\n this._prepare();\r\n }\r\n\r\n _updateHook(dt) {\r\n this._myVisualRaycast.update(dt);\r\n for (let visualRaycastHit of this._myVisualRaycastHitList) {\r\n visualRaycastHit.update(dt);\r\n }\r\n }\r\n\r\n _visibleChanged() {\r\n if (this._myVisible) {\r\n if (this._myParams.myRaycastResults.myRaycastParams != null) {\r\n this._myVisualRaycast.setVisible(true);\r\n }\r\n\r\n if (this._myParams.myRaycastResults.myHits.length > 0) {\r\n let hitsToShow = Math.min(this._myParams.myRaycastResults.myHits.length, this._myVisualRaycastHitList.length);\r\n\r\n for (let i = 0; i < hitsToShow; i++) {\r\n let visualRaycastHit = this._myVisualRaycastHitList[i];\r\n visualRaycastHit.setVisible(true);\r\n }\r\n }\r\n } else {\r\n this._myVisualRaycast.setVisible(false);\r\n\r\n for (let visualRaycastHit of this._myVisualRaycastHitList) {\r\n visualRaycastHit.setVisible(false);\r\n }\r\n }\r\n }\r\n\r\n _build() {\r\n\r\n }\r\n\r\n _refreshHook() {\r\n for (let visualRaycastHit of this._myVisualRaycastHitList) {\r\n visualRaycastHit.setVisible(false);\r\n }\r\n\r\n if (this._myParams.myRaycastResults.myHits.length > 0) {\r\n let raycastDistance = this._myParams.myShowOnlyFirstHit ?\r\n this._myParams.myRaycastResults.myHits.pp_first().myDistance :\r\n this._myParams.myRaycastResults.myHits.pp_last().myDistance;\r\n\r\n {\r\n let visualRaycastParams = this._myVisualRaycast.getParams();\r\n visualRaycastParams.myStart.vec3_copy(this._myParams.myRaycastResults.myRaycastParams.myOrigin);\r\n visualRaycastParams.myDirection.vec3_copy(this._myParams.myRaycastResults.myRaycastParams.myDirection);\r\n visualRaycastParams.myLength = raycastDistance;\r\n visualRaycastParams.myThickness = this._myParams.myThickness;\r\n\r\n if (this._myParams.myRayMaterial == null) {\r\n visualRaycastParams.myMaterial = Globals.getVisualResources(this._myParams.myParent.pp_getEngine()).myDefaultMaterials.myRay;\r\n } else {\r\n visualRaycastParams.myMaterial = this._myParams.myRayMaterial;\r\n }\r\n\r\n visualRaycastParams.myParent = this._myParams.myParent;\r\n visualRaycastParams.myLocal = this._myParams.myLocal;\r\n\r\n this._myVisualRaycast.paramsUpdated();\r\n\r\n this._myVisualRaycast.setVisible(this._myVisible);\r\n }\r\n\r\n let hitsToShow = this._myParams.myShowOnlyFirstHit ? 1 : this._myParams.myRaycastResults.myHits.length;\r\n while (hitsToShow > this._myVisualRaycastHitList.length) {\r\n this._addVisualRaycastHit();\r\n }\r\n\r\n for (let i = 0; i < hitsToShow; i++) {\r\n let visualRaycastHit = this._myVisualRaycastHitList[i];\r\n\r\n {\r\n let visualRaycastHitParams = visualRaycastHit.getParams();\r\n visualRaycastHitParams.myStart.vec3_copy(this._myParams.myRaycastResults.myHits[i].myPosition);\r\n visualRaycastHitParams.myDirection.vec3_copy(this._myParams.myRaycastResults.myHits[i].myNormal);\r\n visualRaycastHitParams.myLength = this._myParams.myHitNormalLength;\r\n visualRaycastHitParams.myThickness = this._myParams.myThickness;\r\n\r\n if (this._myParams.myHitNormalMaterial == null) {\r\n visualRaycastHitParams.myMaterial = Globals.getVisualResources(this._myParams.myParent.pp_getEngine()).myDefaultMaterials.myHitNormal;\r\n } else {\r\n visualRaycastHitParams.myMaterial = this._myParams.myHitNormalMaterial;\r\n }\r\n\r\n visualRaycastHitParams.myParent = this._myParams.myParent;\r\n visualRaycastHitParams.myLocal = this._myParams.myLocal;\r\n\r\n visualRaycastHit.paramsUpdated();\r\n\r\n visualRaycastHit.setVisible(this._myVisible);\r\n }\r\n }\r\n\r\n } else if (this._myParams.myRaycastResults.myRaycastParams != null) {\r\n {\r\n let visualRaycastParams = this._myVisualRaycast.getParams();\r\n visualRaycastParams.myStart.vec3_copy(this._myParams.myRaycastResults.myRaycastParams.myOrigin);\r\n visualRaycastParams.myDirection.vec3_copy(this._myParams.myRaycastResults.myRaycastParams.myDirection);\r\n visualRaycastParams.myLength = this._myParams.myRaycastResults.myRaycastParams.myDistance;\r\n visualRaycastParams.myThickness = this._myParams.myThickness;\r\n\r\n if (this._myParams.myRayMaterial == null) {\r\n visualRaycastParams.myMaterial = Globals.getVisualResources(this._myParams.myParent.pp_getEngine()).myDefaultMaterials.myRay;\r\n } else {\r\n visualRaycastParams.myMaterial = this._myParams.myRayMaterial;\r\n }\r\n\r\n visualRaycastParams.myParent = this._myParams.myParent;\r\n visualRaycastParams.myLocal = this._myParams.myLocal;\r\n\r\n this._myVisualRaycast.paramsUpdated();\r\n\r\n this._myVisualRaycast.setVisible(this._myVisible);\r\n }\r\n } else {\r\n this._myVisualRaycast.setVisible(false);\r\n }\r\n }\r\n\r\n _new(params) {\r\n return new VisualRaycast(params);\r\n }\r\n\r\n _addVisualRaycastHit() {\r\n let visualRaycastHit = new VisualArrow(new VisualArrowParams(this._myParams.myParent.pp_getEngine()));\r\n\r\n visualRaycastHit.setAutoRefresh(false);\r\n visualRaycastHit.setVisible(false);\r\n\r\n this._myVisualRaycastHitList.push(visualRaycastHit);\r\n }\r\n\r\n _destroyHook() {\r\n this._myVisualRaycast.destroy();\r\n for (let visualRaycastHit of this._myVisualRaycastHitList) {\r\n visualRaycastHit.destroy();\r\n }\r\n }\r\n}\r\n\r\n\r\n\r\n// IMPLEMENTATION\r\n\r\nVisualRaycastParams.prototype._copyHook = function _copyHook(other, deepCopy) {\r\n this.myRaycastResults = other.myRaycastResults;\r\n this.myHitNormalLength = other.myHitNormalLength;\r\n this.myThickness = other.myThickness;\r\n this.myShowOnlyFirstHit = other.myShowOnlyFirstHit;\r\n\r\n if (other.myRayMaterial != null && deepCopy) {\r\n this.myRayMaterial = other.myRayMaterial.clone();\r\n } else {\r\n this.myRayMaterial = other.myRayMaterial;\r\n }\r\n\r\n if (other.myHitNormalMaterial != null && deepCopy) {\r\n this.myHitNormalMaterial = other.myForwardMaterial.clone();\r\n } else {\r\n this.myHitNormalMaterial = other.myHitNormalMaterial;\r\n }\r\n\r\n this.myParent = other.myParent;\r\n this.myLocal = other.myLocal;\r\n\r\n this.myType = other.myType;\r\n};", "import { Alignment, TextComponent, VerticalAlignment } from \"@wonderlandengine/api\";\r\nimport { mat4_create, vec3_create } from \"../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Globals } from \"../../../pp/globals.js\";\r\nimport { AbstractVisualElement, AbstractVisualElementParams } from \"./visual_element.js\";\r\nimport { VisualElementDefaultType } from \"./visual_element_types.js\";\r\n\r\nexport class VisualTextParams extends AbstractVisualElementParams {\r\n\r\n /**\r\n * TS type inference helper\r\n * \r\n * @param {any} engine\r\n */\r\n constructor(engine = Globals.getMainEngine()) {\r\n super(engine);\r\n\r\n this.myText = \"\";\r\n this.myAlignment = Alignment.Center;\r\n this.myVerticalAlignment = VerticalAlignment.Middle;\r\n\r\n this.myTransform = mat4_create();\r\n\r\n this.myMaterial = null; // null means it will default on myDefaultResources.myMaterials.myDefaultTextMaterial\r\n\r\n this.myColor = null; // If this is set and material is null, it will use the default text material with this color\r\n\r\n this.myLocal = false;\r\n\r\n this.myLookAtObject = null;\r\n\r\n this.myType = VisualElementDefaultType.TEXT;\r\n }\r\n\r\n _copyHook(other, deepCopy) {\r\n // Implemented outside class definition\r\n }\r\n\r\n _new() {\r\n return new VisualTextParams(this.myParent.pp_getEngine());\r\n }\r\n\r\n _equalsHook(other) {\r\n return this.myText == other.myText &&\r\n this.myAlignment == other.myAlignment &&\r\n this.myVerticalAlignment == other.myVerticalAlignment &&\r\n this.myMaterial == other.myMaterial &&\r\n this.myLookAtObject == other.myLookAtObject &&\r\n this.myLocal == other.myLocal &&\r\n (this.myColor == other.myColor || (this.myColor != null && other.myColor != null && this.myColor.vec_equals(other.myColor))) &&\r\n this.myTransform.vec_equals(other.myTransform);\r\n }\r\n}\r\n\r\n/**\r\n * Example:\r\n * \r\n * ```js \r\n * const visualParams = new VisualTextParams();\r\n * visualParams.myText = text;\r\n * visualParams.myTransform.mat4_copy(transform);\r\n * visualParams.myMaterial = myDefaultResources.myMaterials.myText.clone();\r\n * visualParams.myMaterial.color = vec4_create(1, 1, 1, 1);\r\n * const visualText = new VisualText(visualParams);\r\n * \r\n * // OR\r\n * \r\n * Globals.getVisualManager().draw(visualParams);\r\n * ```\r\n*/\r\nexport class VisualText extends AbstractVisualElement {\r\n\r\n constructor(params = new VisualTextParams()) {\r\n super(params);\r\n\r\n this._myTextObject = null;\r\n this._myTextComponent = null;\r\n\r\n this._myTextMaterial = null;\r\n\r\n this._prepare();\r\n }\r\n\r\n _visibleChanged() {\r\n this._myTextObject.pp_setActive(this._myVisible);\r\n }\r\n\r\n _build() {\r\n this._myTextObject = Globals.getSceneObjects(this._myParams.myParent.pp_getEngine()).myVisualElements.pp_addChild();\r\n this._myTextComponent = this._myTextObject.pp_addComponent(TextComponent);\r\n }\r\n\r\n _refreshHook() {\r\n // Implemented outside class definition\r\n }\r\n\r\n _new(params) {\r\n return new VisualText(params);\r\n }\r\n\r\n _destroyHook() {\r\n this._myTextObject.pp_destroy();\r\n }\r\n}\r\n\r\n\r\n\r\n// IMPLEMENTATION\r\n\r\nVisualTextParams.prototype._copyHook = function _copyHook(other, deepCopy) {\r\n this.myText = other.myText;\r\n this.myAlignment = other.myAlignment;\r\n this.myVerticalAlignment = other.myVerticalAlignment;\r\n\r\n this.myTransform.mat4_copy(other.myTransform);\r\n\r\n if (other.myMaterial != null && deepCopy) {\r\n this.myMaterial = other.myMaterial.clone();\r\n } else {\r\n this.myMaterial = other.myMaterial;\r\n }\r\n\r\n if (other.myColor != null) {\r\n if (this.myColor != null) {\r\n this.myColor.vec4_copy(other.myColor);\r\n } else {\r\n this.myColor = other.myColor.vec4_clone();\r\n }\r\n } else {\r\n this.myColor = null;\r\n }\r\n\r\n this.myLocal = other.myLocal;\r\n\r\n this.myLookAtObject = other.myLookAtObject;\r\n};\r\n\r\nVisualText.prototype._refreshHook = function () {\r\n let lookAtPosition = vec3_create();\r\n return function _refreshHook() {\r\n this._myTextObject.pp_setParent(this._myParams.myParent, false);\r\n\r\n if (this._myParams.myLocal) {\r\n this._myTextObject.pp_setTransformLocal(this._myParams.myTransform);\r\n } else {\r\n this._myTextObject.pp_setTransform(this._myParams.myTransform);\r\n }\r\n\r\n if (this._myParams.myLookAtObject != null) {\r\n this._myParams.myLookAtObject.pp_getPosition(lookAtPosition);\r\n this._myTextObject.pp_lookAt(lookAtPosition);\r\n }\r\n\r\n if (this._myParams.myMaterial == null) {\r\n if (this._myParams.myColor == null) {\r\n this._myTextComponent.material = Globals.getVisualResources(this._myParams.myParent.pp_getEngine()).myDefaultMaterials.myText;\r\n } else {\r\n if (this._myTextMaterial == null) {\r\n this._myTextMaterial = Globals.getDefaultMaterials(this._myParams.myParent.pp_getEngine()).myText.clone();\r\n }\r\n this._myTextComponent.material = this._myTextMaterial;\r\n this._myTextMaterial.color = this._myParams.myColor;\r\n }\r\n } else {\r\n this._myTextComponent.material = this._myParams.myMaterial;\r\n }\r\n\r\n this._myTextComponent.text = this._myParams.myText;\r\n this._myTextComponent.alignment = this._myParams.myAlignment;\r\n this._myTextComponent.verticalAlignment = this._myParams.myVerticalAlignment;\r\n\r\n this._myDirty = false;\r\n };\r\n}();", "import { mat4_create, vec3_create } from \"../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Globals } from \"../../../pp/globals.js\";\r\nimport { AbstractVisualElement, AbstractVisualElementParams } from \"./visual_element.js\";\r\nimport { VisualElementDefaultType } from \"./visual_element_types.js\";\r\nimport { VisualLine, VisualLineParams } from \"./visual_line.js\";\r\n\r\nexport class VisualTorusParams extends AbstractVisualElementParams {\r\n\r\n /**\r\n * TS type inference helper\r\n * \r\n * @param {any} engine\r\n */\r\n constructor(engine = Globals.getMainEngine()) {\r\n super(engine);\r\n\r\n this.myTransform = mat4_create();\r\n this.myRadius = 0;\r\n\r\n this.mySegmentsAmount = 12;\r\n this.mySegmentThickness = 0.05;\r\n\r\n this.mySegmentMesh = null; // The mesh is scaled along up axis, null means it will default on myDefaultResources.myMeshes.myCylinder\r\n\r\n this.myMaterial = null; // null means it will default on myDefaultResources.myMaterials.myFlatOpaque\r\n this.myColor = null; // If this is set and material is null, it will use the default flat opaque material with this color\r\n\r\n this.myLocal = false;\r\n\r\n this.myType = VisualElementDefaultType.TORUS;\r\n }\r\n\r\n _copyHook(other, deepCopy) {\r\n // Implemented outside class definition\r\n }\r\n\r\n _new() {\r\n return new VisualTorusParams(this.myParent.pp_getEngine());\r\n }\r\n\r\n _equalsHook(other) {\r\n return this.myRadius == other.myRadius &&\r\n this.mySegmentsAmount == other.mySegmentsAmount &&\r\n this.mySegmentThickness == other.mySegmentThickness &&\r\n this.mySegmentMesh == other.mySegmentMesh &&\r\n this.myMaterial == other.myMaterial &&\r\n this.myLocal == other.myLocal &&\r\n (this.myColor == other.myColor || (this.myColor != null && other.myColor != null && this.myColor.vec_equals(other.myColor))) &&\r\n this.myTransform.vec_equals(other.myTransform);\r\n }\r\n}\r\n\r\n/**\r\n * Example:\r\n * \r\n * ```js \r\n * const visualParams = new VisualTorusParams();\r\n * visualParams.myRadius = 1;\r\n * visualParams.mySegmentsAmount = 12;\r\n * visualParams.mySegmentThickness = 0.05;\r\n * visualParams.myTransform.mat4_copy(transform);\r\n * visualParams.myMaterial = Globals.getDefaultMaterials().myFlatOpaque.clone();\r\n * visualParams.myMaterial.color = vec4_create(1, 1, 1, 1);\r\n * const visualTorus = new VisualTorus(visualParams);\r\n * \r\n * // OR\r\n * \r\n * Globals.getVisualManager().draw(visualParams);\r\n * ```\r\n*/\r\nexport class VisualTorus extends AbstractVisualElement {\r\n\r\n constructor(params = new VisualTorusParams()) {\r\n super(params);\r\n\r\n this._myTorusParentObject = null;\r\n\r\n this._myVisualSegmentList = [];\r\n\r\n this._myFlatOpaqueMaterial = null;\r\n\r\n this._prepare();\r\n }\r\n\r\n _visibleChanged() {\r\n if (this._myVisible) {\r\n let segmentToShow = Math.min(this._myParams.mySegmentsAmount, this._myVisualSegmentList.length);\r\n\r\n for (let i = 0; i < segmentToShow; i++) {\r\n let visualSegment = this._myVisualSegmentList[i];\r\n visualSegment.setVisible(true);\r\n }\r\n } else {\r\n for (let visualSegment of this._myVisualSegmentList) {\r\n visualSegment.setVisible(false);\r\n }\r\n }\r\n }\r\n\r\n _updateHook(dt) {\r\n for (let visualSegment of this._myVisualSegmentList) {\r\n visualSegment.update(dt);\r\n }\r\n }\r\n\r\n _build() {\r\n this._myTorusParentObject = Globals.getSceneObjects(this._myParams.myParent.pp_getEngine()).myVisualElements.pp_addChild();\r\n\r\n this._fillSegmentList();\r\n }\r\n\r\n _fillSegmentList() {\r\n while (this._myVisualSegmentList.length < this._myParams.mySegmentsAmount) {\r\n let visualSegment = new VisualLine(new VisualLineParams(this._myParams.myParent.pp_getEngine()));\r\n\r\n visualSegment.setAutoRefresh(false);\r\n visualSegment.setVisible(false);\r\n\r\n visualSegment.getParams().myParent = this._myTorusParentObject;\r\n visualSegment.getParams().myLocal = true;\r\n\r\n this._myVisualSegmentList.push(visualSegment);\r\n }\r\n }\r\n\r\n _refreshHook() {\r\n // Implemented outside class definition\r\n }\r\n\r\n _new(params) {\r\n return new VisualTorus(params);\r\n }\r\n\r\n _destroyHook() {\r\n for (let visualSegment of this._myVisualSegmentList) {\r\n visualSegment.destroy();\r\n }\r\n this._myTorusParentObject.pp_destroy();\r\n }\r\n}\r\n\r\n\r\n\r\n// IMPLEMENTATION\r\n\r\nVisualTorus.prototype._refreshHook = function () {\r\n let segmentStart = vec3_create();\r\n let segmentEnd = vec3_create();\r\n\r\n let segmentDirection = vec3_create();\r\n\r\n let fixedSegmentStart = vec3_create();\r\n let fixedSegmentEnd = vec3_create();\r\n\r\n let up = vec3_create(0, 1, 0);\r\n return function _refreshHook() {\r\n this._fillSegmentList();\r\n\r\n for (let i = this._myParams.mySegmentsAmount; i < this._myVisualSegmentList.length; i++) {\r\n let visualSegment = this._myVisualSegmentList[i];\r\n visualSegment.setVisible(false);\r\n }\r\n\r\n this._myTorusParentObject.pp_setParent(this._myParams.myParent, false);\r\n\r\n if (this._myParams.myLocal) {\r\n this._myTorusParentObject.pp_setTransformLocal(this._myParams.myTransform);\r\n } else {\r\n this._myTorusParentObject.pp_setTransform(this._myParams.myTransform);\r\n }\r\n\r\n let sliceAngle = 2 * Math.PI / this._myParams.mySegmentsAmount;\r\n segmentStart.vec3_set(this._myParams.myRadius, 0, 0);\r\n for (let i = 0; i < this._myParams.mySegmentsAmount; i++) {\r\n segmentEnd = segmentStart.vec3_rotateAxisRadians(sliceAngle, up, segmentEnd);\r\n\r\n segmentDirection = segmentEnd.vec3_sub(segmentStart, segmentDirection).vec3_normalize(segmentDirection);\r\n\r\n let extraLength = Math.tan(sliceAngle / 2) * this._myParams.mySegmentThickness / 2;\r\n\r\n fixedSegmentStart = segmentStart.vec3_sub(segmentDirection.vec3_scale(extraLength, fixedSegmentStart), fixedSegmentStart);\r\n fixedSegmentEnd = segmentEnd.vec3_add(segmentDirection.vec3_scale(extraLength, fixedSegmentEnd), fixedSegmentEnd);\r\n\r\n let visualSegment = this._myVisualSegmentList[i];\r\n\r\n let visualSegmentParams = visualSegment.getParams();\r\n visualSegmentParams.setStartEnd(fixedSegmentStart, fixedSegmentEnd);\r\n visualSegmentParams.myThickness = this._myParams.mySegmentThickness;\r\n\r\n visualSegmentParams.myMesh = this._myParams.mySegmentMesh;\r\n\r\n if (this._myParams.myMaterial == null) {\r\n if (this._myParams.myColor == null) {\r\n visualSegmentParams.myMaterial = Globals.getVisualResources(this._myParams.myParent.pp_getEngine()).myDefaultMaterials.myMesh;\r\n } else {\r\n if (this._myFlatOpaqueMaterial == null) {\r\n this._myFlatOpaqueMaterial = Globals.getDefaultMaterials(this._myParams.myParent.pp_getEngine()).myFlatOpaque.clone();\r\n }\r\n visualSegmentParams.myMaterial = this._myFlatOpaqueMaterial;\r\n this._myFlatOpaqueMaterial.color = this._myParams.myColor;\r\n }\r\n } else {\r\n visualSegmentParams.myMaterial = this._myParams.myMaterial;\r\n }\r\n\r\n visualSegment.paramsUpdated();\r\n\r\n visualSegment.setVisible(this._myVisible);\r\n\r\n segmentStart.vec3_copy(segmentEnd);\r\n }\r\n };\r\n}();\r\n\r\nVisualTorusParams.prototype._copyHook = function _copyHook(other, deepCopy) {\r\n this.myRadius = other.myRadius;\r\n this.mySegmentsAmount = other.mySegmentsAmount;\r\n this.mySegmentThickness = other.mySegmentThickness;\r\n\r\n this.myTransform.mat4_copy(other.myTransform);\r\n\r\n this.mySegmentMesh = other.mySegmentMesh;\r\n\r\n if (other.myMaterial != null && deepCopy) {\r\n this.myMaterial = other.myMaterial.clone();\r\n } else {\r\n this.myMaterial = other.myMaterial;\r\n }\r\n\r\n if (other.myColor != null) {\r\n if (this.myColor != null) {\r\n this.myColor.vec4_copy(other.myColor);\r\n } else {\r\n this.myColor = other.myColor.vec4_clone();\r\n }\r\n } else {\r\n this.myColor = null;\r\n }\r\n\r\n this.myLocal = other.myLocal;\r\n};", "import { mat4_create, vec3_create } from \"../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Globals } from \"../../../pp/globals.js\";\r\nimport { VisualArrow, VisualArrowParams } from \"./visual_arrow.js\";\r\nimport { AbstractVisualElement, AbstractVisualElementParams } from \"./visual_element.js\";\r\nimport { VisualElementDefaultType } from \"./visual_element_types.js\";\r\n\r\nexport class VisualTransformParams extends AbstractVisualElementParams {\r\n\r\n /**\r\n * TS type inference helper\r\n * \r\n * @param {any} engine\r\n */\r\n constructor(engine = Globals.getMainEngine()) {\r\n super(engine);\r\n\r\n this.myTransform = mat4_create();\r\n this.myLength = 0.2;\r\n this.myThickness = 0.005;\r\n\r\n this.myForwardMaterial = null;\r\n this.myUpMaterial = null;\r\n this.myRightMaterial = null;\r\n\r\n this.myLocal = false;\r\n\r\n this.myType = VisualElementDefaultType.TRANSFORM;\r\n }\r\n\r\n _copyHook(other, deepCopy) {\r\n // Implemented outside class definition\r\n }\r\n\r\n _new() {\r\n return new VisualTransformParams(this.myParent.pp_getEngine());\r\n }\r\n\r\n _equalsHook(other) {\r\n return this.myThickness == other.myThickness &&\r\n this.myLength == other.myLength &&\r\n this.myForwardMaterial == other.myForwardMaterial &&\r\n this.myUpMaterial == other.myUpMaterial &&\r\n this.myRightMaterial == other.myRightMaterial &&\r\n this.myLocal == other.myLocal &&\r\n this.myTransform.vec_equals(other.myTransform);\r\n }\r\n}\r\n\r\n/**\r\n * Example:\r\n * \r\n * ```js \r\n * const visualParams = new VisualTransformParams();\r\n * visualParams.myTransform.mat4_copy(transform);\r\n * visualParams.myLength = 0.2;\r\n * const visualTransform = new VisualTransform(visualParams);\r\n * \r\n * // OR\r\n * \r\n * Globals.getVisualManager().draw(visualParams);\r\n * ```\r\n*/\r\nexport class VisualTransform extends AbstractVisualElement {\r\n\r\n constructor(params = new VisualTransformParams()) {\r\n super(params);\r\n\r\n this._myVisualRight = new VisualArrow(new VisualArrowParams(this._myParams.myParent.pp_getEngine()));\r\n this._myVisualUp = new VisualArrow(new VisualArrowParams(this._myParams.myParent.pp_getEngine()));\r\n this._myVisualForward = new VisualArrow(new VisualArrowParams(this._myParams.myParent.pp_getEngine()));\r\n\r\n this._myVisualRight.setAutoRefresh(false);\r\n this._myVisualUp.setAutoRefresh(false);\r\n this._myVisualForward.setAutoRefresh(false);\r\n\r\n this._prepare();\r\n }\r\n\r\n _updateHook(dt) {\r\n this._myVisualRight.update(dt);\r\n this._myVisualUp.update(dt);\r\n this._myVisualForward.update(dt);\r\n }\r\n\r\n _visibleChanged() {\r\n this._myVisualRight.setVisible(this._myVisible);\r\n this._myVisualUp.setVisible(this._myVisible);\r\n this._myVisualForward.setVisible(this._myVisible);\r\n }\r\n\r\n _build() {\r\n\r\n }\r\n\r\n _refreshHook() {\r\n // Implemented outside class definition\r\n }\r\n\r\n _new(params) {\r\n return new VisualTransform(params);\r\n }\r\n\r\n _destroyHook() {\r\n this._myVisualRight.destroy();\r\n this._myVisualUp.destroy();\r\n this._myVisualForward.destroy();\r\n }\r\n}\r\n\r\n\r\n\r\n// IMPLEMENTATION\r\n\r\nVisualTransform.prototype._refreshHook = function () {\r\n let axes = [vec3_create(), vec3_create(), vec3_create()];\r\n let scale = vec3_create();\r\n let position = vec3_create();\r\n return function _refreshHook() {\r\n axes = this._myParams.myTransform.mat4_getAxes(axes);\r\n scale = this._myParams.myTransform.mat4_getScale(scale);\r\n let maxValue = 0;\r\n for (let value of scale) {\r\n maxValue = Math.max(value, maxValue);\r\n }\r\n\r\n if (maxValue == 0) {\r\n scale[0] = 1;\r\n scale[1] = 1;\r\n scale[2] = 1;\r\n } else {\r\n scale[0] = scale[0] / maxValue;\r\n scale[1] = scale[1] / maxValue;\r\n scale[2] = scale[2] / maxValue;\r\n }\r\n\r\n position = this._myParams.myTransform.mat4_getPosition(position);\r\n\r\n {\r\n let visualArrowParams = this._myVisualRight.getParams();\r\n visualArrowParams.myStart.vec3_copy(position);\r\n visualArrowParams.myDirection = axes[0].vec3_negate(visualArrowParams.myDirection).vec3_normalize(visualArrowParams.myDirection);\r\n visualArrowParams.myLength = Math.max(this._myParams.myLength * scale[0], 0.001);\r\n visualArrowParams.myThickness = this._myParams.myThickness;\r\n\r\n if (this._myParams.myRightMaterial == null) {\r\n visualArrowParams.myMaterial = Globals.getVisualResources(this._myParams.myParent.pp_getEngine()).myDefaultMaterials.myRight;\r\n } else {\r\n visualArrowParams.myMaterial = this._myParams.myRightMaterial;\r\n }\r\n\r\n visualArrowParams.myParent = this._myParams.myParent;\r\n visualArrowParams.myLocal = this._myParams.myLocal;\r\n\r\n this._myVisualRight.paramsUpdated();\r\n }\r\n\r\n {\r\n let visualArrowParams = this._myVisualUp.getParams();\r\n visualArrowParams.myStart.vec3_copy(position);\r\n visualArrowParams.myDirection = axes[1].vec3_normalize(visualArrowParams.myDirection);\r\n visualArrowParams.myLength = Math.max(this._myParams.myLength * scale[1], 0.001);\r\n visualArrowParams.myThickness = this._myParams.myThickness;\r\n\r\n if (this._myParams.myUpMaterial == null) {\r\n visualArrowParams.myMaterial = Globals.getVisualResources(this._myParams.myParent.pp_getEngine()).myDefaultMaterials.myUp;\r\n } else {\r\n visualArrowParams.myMaterial = this._myParams.myUpMaterial;\r\n }\r\n\r\n visualArrowParams.myParent = this._myParams.myParent;\r\n visualArrowParams.myLocal = this._myParams.myLocal;\r\n\r\n this._myVisualUp.paramsUpdated();\r\n }\r\n\r\n {\r\n let visualArrowParams = this._myVisualForward.getParams();\r\n visualArrowParams.myStart.vec3_copy(position);\r\n visualArrowParams.myDirection = axes[2].vec3_normalize(visualArrowParams.myDirection);\r\n visualArrowParams.myLength = Math.max(this._myParams.myLength * scale[2], 0.001);\r\n visualArrowParams.myThickness = this._myParams.myThickness;\r\n\r\n if (this._myParams.myForwardMaterial == null) {\r\n visualArrowParams.myMaterial = Globals.getVisualResources(this._myParams.myParent.pp_getEngine()).myDefaultMaterials.myForward;\r\n } else {\r\n visualArrowParams.myMaterial = this._myParams.myForwardMaterial;\r\n }\r\n\r\n visualArrowParams.myParent = this._myParams.myParent;\r\n visualArrowParams.myLocal = this._myParams.myLocal;\r\n\r\n this._myVisualForward.paramsUpdated();\r\n }\r\n };\r\n}();\r\n\r\nVisualTransformParams.prototype._copyHook = function _copyHook(other, deepCopy) {\r\n this.myTransform.mat4_copy(other.myTransform);\r\n this.myLength = other.myLength;\r\n this.myThickness = other.myThickness;\r\n\r\n if (other.myRightMaterial != null && deepCopy) {\r\n this.myRightMaterial = other.myRightMaterial.clone();\r\n } else {\r\n this.myRightMaterial = other.myRightMaterial;\r\n }\r\n\r\n if (other.myUpMaterial != null && deepCopy) {\r\n this.myUpMaterial = other.myUpMaterial.clone();\r\n } else {\r\n this.myUpMaterial = other.myUpMaterial;\r\n }\r\n\r\n if (other.myForwardMaterial != null && deepCopy) {\r\n this.myForwardMaterial = other.myForwardMaterial.clone();\r\n } else {\r\n this.myForwardMaterial = other.myForwardMaterial;\r\n }\r\n\r\n this.myLocal = other.myLocal;\r\n};", "import { Object3D, WonderlandEngine } from \"@wonderlandengine/api\";\r\nimport { Globals } from \"../../pp/globals.js\";\r\nimport { Timer } from \"../cauldron/timer.js\";\r\nimport { ObjectPool, ObjectPoolParams } from \"../object_pool/object_pool.js\";\r\nimport { VisualArrow, VisualArrowParams } from \"./elements/visual_arrow.js\";\r\nimport { VisualElement, VisualElementParams } from \"./elements/visual_element.js\";\r\nimport { VisualElementDefaultType } from \"./elements/visual_element_types.js\";\r\nimport { VisualLine, VisualLineParams } from \"./elements/visual_line.js\";\r\nimport { VisualMesh, VisualMeshParams } from \"./elements/visual_mesh.js\";\r\nimport { VisualPoint, VisualPointParams } from \"./elements/visual_point.js\";\r\nimport { VisualRaycast, VisualRaycastParams } from \"./elements/visual_raycast.js\";\r\nimport { VisualText, VisualTextParams } from \"./elements/visual_text.js\";\r\nimport { VisualTorus, VisualTorusParams } from \"./elements/visual_torus.js\";\r\nimport { VisualTransform, VisualTransformParams } from \"./elements/visual_transform.js\";\r\n\r\nexport class VisualManager {\r\n\r\n private readonly _myVisualElementPrototypeCreationCallbacks: Map VisualElement> = new Map();\r\n\r\n private readonly _myVisualElementsTypeMap: Map> = new Map();\r\n private _myVisualElementLastID: number = 0;\r\n private readonly _myVisualElementsToShow: VisualElement[] = [];\r\n\r\n private _myVisualElementsParent: Object3D | null = null;\r\n private _myActive: boolean = true;\r\n\r\n private readonly _myObjectPoolManagerPrefix: string;\r\n private readonly _myTypePoolIDs: Map = new Map();\r\n\r\n private readonly _myEngine: Readonly;\r\n\r\n private _myDestroyed: boolean = false;\r\n\r\n constructor(engine: Readonly = Globals.getMainEngine()!) {\r\n this._myEngine = engine;\r\n\r\n this._myObjectPoolManagerPrefix = this._getClassName() + \"_\" + Math.pp_randomUUID() + \"_visual_element_type_\";\r\n\r\n this._addDefaultVisualElementTypes();\r\n }\r\n\r\n public setActive(active: boolean): void {\r\n if (this._myActive != active) {\r\n if (!active) {\r\n this.clearAllVisualElements();\r\n } else {\r\n this._myVisualElementsParent = Globals.getSceneObjects(this._myEngine)?.myVisualElements ?? null;\r\n }\r\n\r\n this._myActive = active;\r\n }\r\n }\r\n\r\n public isActive(): boolean {\r\n return this._myActive && this._myVisualElementsParent != null;\r\n }\r\n\r\n public start(): void {\r\n if (this._myActive) {\r\n this._myVisualElementsParent = Globals.getSceneObjects(this._myEngine)?.myVisualElements ?? null;\r\n }\r\n }\r\n\r\n public update(dt: number): void {\r\n if (this._myActive) {\r\n this._myVisualElementsParent = Globals.getSceneObjects(this._myEngine)?.myVisualElements ?? null;\r\n\r\n this._updateDraw(dt);\r\n }\r\n }\r\n\r\n /** `lifetimeSeconds` can be `null`, in that case the element will be drawn until cleared */\r\n public draw(visualElementParams: VisualElementParams, lifetimeSeconds: number | null = 0, idToReuse?: unknown): unknown | null {\r\n if (!this.isActive()) {\r\n return null;\r\n }\r\n\r\n let visualElement = null;\r\n let idReused = false;\r\n if (idToReuse != null) {\r\n if (this._myVisualElementsTypeMap.has(visualElementParams.myType)) {\r\n const visualElements = this._myVisualElementsTypeMap.get(visualElementParams.myType)!;\r\n if (visualElements.has(idToReuse)) {\r\n visualElement = visualElements.get(idToReuse)![0];\r\n visualElement.copyParamsGeneric(visualElementParams);\r\n visualElement.setVisible(false);\r\n idReused = true;\r\n }\r\n }\r\n }\r\n\r\n if (visualElement == null) {\r\n visualElement = this._getVisualElementFromPool(visualElementParams);\r\n }\r\n\r\n if (visualElement == null) {\r\n console.error(\"Couldn't create the requested visual element\");\r\n return null;\r\n }\r\n\r\n if (!this._myVisualElementsTypeMap.has(visualElementParams.myType)) {\r\n this._myVisualElementsTypeMap.set(visualElementParams.myType, new Map());\r\n }\r\n const visualElements = this._myVisualElementsTypeMap.get(visualElementParams.myType)!;\r\n\r\n let elementID = null;\r\n if (!idReused) {\r\n elementID = this._myVisualElementLastID + 1;\r\n this._myVisualElementLastID = elementID;\r\n\r\n visualElements.set(elementID, [visualElement, new Timer(lifetimeSeconds != null ? lifetimeSeconds : 0, lifetimeSeconds != null)]);\r\n } else {\r\n elementID = idToReuse;\r\n const visualElementPair = visualElements.get(elementID)!;\r\n visualElementPair[0] = visualElement;\r\n if (lifetimeSeconds != null) {\r\n visualElementPair[1].reset(lifetimeSeconds);\r\n visualElementPair[1].start();\r\n } else {\r\n visualElementPair[1].reset();\r\n }\r\n }\r\n\r\n this._myVisualElementsToShow.push(visualElement);\r\n\r\n return elementID;\r\n }\r\n\r\n public getVisualElement(elementID: unknown): VisualElement | null {\r\n let visualElement = null;\r\n\r\n for (const visualElements of this._myVisualElementsTypeMap.values()) {\r\n if (visualElements.has(elementID)) {\r\n const visualElementPair = visualElements.get(elementID)!;\r\n visualElement = visualElementPair[0];\r\n break;\r\n }\r\n }\r\n\r\n return visualElement;\r\n }\r\n\r\n public getVisualElementParams(elementID: unknown): VisualElementParams | null {\r\n const visualElement = this.getVisualElement(elementID);\r\n return visualElement != null ? visualElement.getParamsGeneric() : null;\r\n }\r\n\r\n public getVisualElementID(visualElement: Readonly): unknown {\r\n let elementID = null;\r\n for (const currentVisualElements of this._myVisualElementsTypeMap.values()) {\r\n for (const [currentElementID, currentVisualElement] of currentVisualElements.entries()) {\r\n if (currentVisualElement[0] == visualElement) {\r\n elementID = currentElementID;\r\n break;\r\n }\r\n }\r\n\r\n if (elementID != null) {\r\n break;\r\n }\r\n }\r\n\r\n return elementID;\r\n }\r\n\r\n public clearAllVisualElements(): void {\r\n if (!this.isActive()) return;\r\n\r\n for (const visualElements of this._myVisualElementsTypeMap.values()) {\r\n for (const visualElement of visualElements.values()) {\r\n this._releaseElement(visualElement[0]);\r\n }\r\n }\r\n\r\n this._myVisualElementsToShow.pp_clear();\r\n this._myVisualElementsTypeMap.clear();\r\n this._myVisualElementLastID = 0;\r\n }\r\n\r\n public clearVisualElement(elementID: unknown): void {\r\n if (!this.isActive()) return;\r\n\r\n for (const visualElements of this._myVisualElementsTypeMap.values()) {\r\n if (visualElements.has(elementID)) {\r\n const visualElementPair = visualElements.get(elementID)!;\r\n this._releaseElement(visualElementPair[0]);\r\n visualElements.delete(elementID);\r\n\r\n this._myVisualElementsToShow.pp_removeEqual(visualElementPair[0]);\r\n break;\r\n }\r\n }\r\n }\r\n\r\n public allocateVisualElementType(visualElementType: unknown | VisualElementDefaultType, amount: number): void {\r\n if (!this.isActive()) return;\r\n\r\n if (!Globals.getObjectPoolManager(this._myEngine)!.hasPool(this._getTypePoolID(visualElementType))) {\r\n this._addVisualElementTypeToPool(visualElementType);\r\n }\r\n\r\n const pool = Globals.getObjectPoolManager(this._myEngine)!.getPool(this._getTypePoolID(visualElementType))!;\r\n\r\n const difference = pool.getAvailableSize() - amount;\r\n if (difference < 0) {\r\n pool.increase(-difference);\r\n }\r\n }\r\n\r\n public addVisualElementType(visualElementType: unknown | VisualElementDefaultType, visuaElementPrototypeCreationCallback: () => VisualElement): void {\r\n this._myVisualElementPrototypeCreationCallbacks.set(visualElementType, visuaElementPrototypeCreationCallback);\r\n }\r\n\r\n public removeVisualElementType(visualElementType: unknown | VisualElementDefaultType): void {\r\n this._myVisualElementPrototypeCreationCallbacks.delete(visualElementType);\r\n }\r\n\r\n private _updateDraw(dt: number): void {\r\n for (const visualElement of this._myVisualElementsToShow) {\r\n visualElement.setVisible(true);\r\n }\r\n this._myVisualElementsToShow.pp_clear();\r\n\r\n for (const visualElements of this._myVisualElementsTypeMap.values()) {\r\n const idsToRemove = [];\r\n for (const visualElementsEntry of visualElements.entries()) {\r\n const visualElement = visualElementsEntry[1];\r\n if (visualElement[1].isDone()) {\r\n this._releaseElement(visualElement[0]);\r\n idsToRemove.push(visualElementsEntry[0]);\r\n } else {\r\n visualElement[0].update(dt);\r\n visualElement[1].update(dt);\r\n }\r\n }\r\n\r\n for (const id of idsToRemove) {\r\n visualElements.delete(id);\r\n }\r\n }\r\n }\r\n\r\n private _getVisualElementFromPool(params: VisualElementParams): VisualElement | null {\r\n let element = null;\r\n\r\n if (!Globals.getObjectPoolManager(this._myEngine)!.hasPool(this._getTypePoolID(params.myType))) {\r\n this._addVisualElementTypeToPool(params.myType);\r\n }\r\n\r\n element = Globals.getObjectPoolManager(this._myEngine)!.get(this._getTypePoolID(params.myType));\r\n\r\n if (element != null) {\r\n element.copyParamsGeneric(params);\r\n }\r\n\r\n return element;\r\n }\r\n\r\n private _addVisualElementTypeToPool(visualElementType: unknown | VisualElementDefaultType): void {\r\n const objectPoolParams = new ObjectPoolParams();\r\n objectPoolParams.myInitialPoolSize = 10;\r\n objectPoolParams.myAmountToAddWhenEmpty = 0;\r\n objectPoolParams.myPercentageToAddWhenEmpty = 0.5;\r\n objectPoolParams.myCloneCallback = function (visualElement: VisualElement): VisualElement {\r\n return visualElement.clone();\r\n };\r\n objectPoolParams.mySetActiveCallback = function (visualElement: VisualElement, active: boolean): void {\r\n visualElement.setVisible(active);\r\n };\r\n objectPoolParams.myDestroyCallback = function (visualElement: VisualElement): void {\r\n visualElement.destroy();\r\n };\r\n\r\n let visualElementPrototype = null;\r\n if (this._myVisualElementPrototypeCreationCallbacks.has(visualElementType)) {\r\n visualElementPrototype = this._myVisualElementPrototypeCreationCallbacks.get(visualElementType)!();\r\n }\r\n\r\n if (visualElementPrototype != null) {\r\n visualElementPrototype.setVisible(false);\r\n visualElementPrototype.setAutoRefresh(true);\r\n\r\n Globals.getObjectPoolManager(this._myEngine)!.addPool(this._getTypePoolID(visualElementType), new ObjectPool(visualElementPrototype, objectPoolParams));\r\n } else {\r\n console.error(\"Visual element type not supported: \" + visualElementType);\r\n }\r\n }\r\n\r\n private _addDefaultVisualElementTypes(): void {\r\n this.addVisualElementType(VisualElementDefaultType.LINE, () => new VisualLine(new VisualLineParams(this._myEngine)));\r\n this.addVisualElementType(VisualElementDefaultType.MESH, () => new VisualMesh(new VisualMeshParams(this._myEngine)));\r\n this.addVisualElementType(VisualElementDefaultType.POINT, () => new VisualPoint(new VisualPointParams(this._myEngine)));\r\n this.addVisualElementType(VisualElementDefaultType.ARROW, () => new VisualArrow(new VisualArrowParams(this._myEngine)));\r\n this.addVisualElementType(VisualElementDefaultType.TEXT, () => new VisualText(new VisualTextParams(this._myEngine)));\r\n this.addVisualElementType(VisualElementDefaultType.TRANSFORM, () => new VisualTransform(new VisualTransformParams(this._myEngine)));\r\n this.addVisualElementType(VisualElementDefaultType.RAYCAST, () => new VisualRaycast(new VisualRaycastParams(this._myEngine)));\r\n this.addVisualElementType(VisualElementDefaultType.TORUS, () => new VisualTorus(new VisualTorusParams(this._myEngine)));\r\n }\r\n\r\n private _getTypePoolID(visualElementType: unknown | VisualElementDefaultType): string {\r\n let typePoolID = this._myTypePoolIDs.get(visualElementType);\r\n\r\n if (typePoolID == null) {\r\n typePoolID = this._myObjectPoolManagerPrefix + visualElementType;\r\n this._myTypePoolIDs.set(visualElementType, typePoolID);\r\n }\r\n\r\n return typePoolID;\r\n }\r\n\r\n private _releaseElement(visualElement: VisualElement): void {\r\n if (this._myVisualElementsParent != null) {\r\n if (visualElement.getParamsGeneric().myParent != this._myVisualElementsParent) {\r\n visualElement.getParamsGeneric().myParent = this._myVisualElementsParent;\r\n visualElement.paramsUpdated();\r\n visualElement.refresh(); // just used to trigger the parent change, I'm lazy\r\n }\r\n }\r\n\r\n Globals.getObjectPoolManager(this._myEngine)?.release(this._getTypePoolID(visualElement.getParamsGeneric().myType), visualElement);\r\n }\r\n\r\n private _getClassName(): string {\r\n return \"visual_manager\";\r\n }\r\n\r\n public destroy(): void {\r\n this._myDestroyed = true;\r\n\r\n this.setActive(false);\r\n\r\n for (const poolID of this._myTypePoolIDs.values()) {\r\n Globals.getObjectPoolManager(this._myEngine)?.destroyPool(poolID);\r\n }\r\n }\r\n\r\n public isDestroyed(): boolean {\r\n return this._myDestroyed;\r\n }\r\n}", "import { Material } from \"@wonderlandengine/api\";\r\n\r\nexport class VisualResources {\r\n\r\n public myDefaultMaterials: VisualResourcesMaterials = new VisualResourcesMaterials();\r\n}\r\n\r\nexport class VisualResourcesMaterials {\r\n\r\n public myMesh: Material | null = null;\r\n public myText: Material | null = null;\r\n public myRight: Material | null = null;\r\n public myUp: Material | null = null;\r\n public myForward: Material | null = null;\r\n public myRay: Material | null = null;\r\n public myHitNormal: Material | null = null;\r\n}", "import * as WLAPI from \"@wonderlandengine/api\";\r\nimport { Component, Property } from \"@wonderlandengine/api\";\r\nimport * as WLComponents from \"@wonderlandengine/components\";\r\n\r\nexport class AddWLToWindowComponent extends Component {\r\n static TypeName = \"pp-add-wl-to-window\";\r\n static Properties = {\r\n _myAdd: Property.bool(true)\r\n };\r\n\r\n init() {\r\n if (this._myAdd) {\r\n this._myWL = {};\r\n this._addProperties(WLAPI);\r\n this._addProperties(WLComponents);\r\n\r\n window.WL = this._myWL;\r\n }\r\n }\r\n\r\n _addProperties(object) {\r\n let propertyNames = Object.getOwnPropertyNames(object);\r\n for (let propertyName of propertyNames) {\r\n if (object[propertyName] != undefined) {\r\n this._myWL[propertyName] = object[propertyName];\r\n }\r\n }\r\n }\r\n\r\n onActivate() {\r\n if (this._myWL != null) {\r\n window.WL = this._myWL;\r\n }\r\n }\r\n\r\n onDeactivate() {\r\n if (this._myWL != null) {\r\n delete window.WL;\r\n }\r\n }\r\n}", "import { Component, Property } from \"@wonderlandengine/api\";\r\nimport { Globals } from \"../../../../pp/globals.js\";\r\nimport { MeshUtils } from \"../../utils/mesh_utils.js\";\r\nimport { DefaultResources } from \"../default_resources.js\";\r\n\r\nexport class GetDefaultResourcesComponent extends Component {\r\n static TypeName = \"pp-get-default-resources\";\r\n static Properties = {\r\n _myPlane: Property.mesh(),\r\n _myCube: Property.mesh(),\r\n _mySphere: Property.mesh(),\r\n _myCone: Property.mesh(),\r\n _myCylinder: Property.mesh(),\r\n _myCircle: Property.mesh(),\r\n\r\n _myFlatOpaque: Property.material(),\r\n _myFlatTransparentNoDepth: Property.material(),\r\n _myPhongOpaque: Property.material(),\r\n _myText: Property.material()\r\n };\r\n\r\n init() {\r\n this._myDefaultResources = new DefaultResources();\r\n this._myDefaultResources.myMeshes.myPlane = MeshUtils.clone(this._myPlane);\r\n this._myDefaultResources.myMeshes.myCube = MeshUtils.clone(this._myCube);\r\n this._myDefaultResources.myMeshes.mySphere = MeshUtils.clone(this._mySphere);\r\n this._myDefaultResources.myMeshes.myCone = MeshUtils.clone(this._myCone);\r\n this._myDefaultResources.myMeshes.myCylinder = MeshUtils.clone(this._myCylinder);\r\n this._myDefaultResources.myMeshes.myCircle = MeshUtils.clone(this._myCircle);\r\n\r\n this._myDefaultResources.myMeshes.myInvertedCube = MeshUtils.invert(this._myCube);\r\n this._myDefaultResources.myMeshes.myInvertedSphere = MeshUtils.invert(this._mySphere);\r\n this._myDefaultResources.myMeshes.myInvertedCone = MeshUtils.invert(this._myCone);\r\n this._myDefaultResources.myMeshes.myInvertedCylinder = MeshUtils.invert(this._myCylinder);\r\n\r\n this._myDefaultResources.myMeshes.myDoubleSidedPlane = MeshUtils.makeDoubleSided(this._myPlane);\r\n this._myDefaultResources.myMeshes.myDoubleSidedCube = MeshUtils.makeDoubleSided(this._myCube);\r\n this._myDefaultResources.myMeshes.myDoubleSidedSphere = MeshUtils.makeDoubleSided(this._mySphere);\r\n this._myDefaultResources.myMeshes.myDoubleSidedCone = MeshUtils.makeDoubleSided(this._myCone);\r\n this._myDefaultResources.myMeshes.myDoubleSidedCylinder = MeshUtils.makeDoubleSided(this._myCylinder);\r\n this._myDefaultResources.myMeshes.myDoubleSidedCircle = MeshUtils.makeDoubleSided(this._myCircle);\r\n\r\n if (this._myFlatOpaque != null) {\r\n this._myDefaultResources.myMaterials.myFlatOpaque = this._myFlatOpaque.clone();\r\n }\r\n\r\n if (this._myFlatTransparentNoDepth != null) {\r\n this._myDefaultResources.myMaterials.myFlatTransparentNoDepth = this._myFlatTransparentNoDepth.clone();\r\n }\r\n\r\n if (this._myPhongOpaque != null) {\r\n this._myDefaultResources.myMaterials.myPhongOpaque = this._myPhongOpaque.clone();\r\n }\r\n\r\n if (this._myText != null) {\r\n this._myDefaultResources.myMaterials.myText = this._myText.clone();\r\n }\r\n }\r\n\r\n onActivate() {\r\n if (!Globals.hasDefaultResources(this.engine)) {\r\n Globals.setDefaultResources(this._myDefaultResources, this.engine);\r\n }\r\n }\r\n\r\n onDeactivate() {\r\n if (Globals.getDefaultResources(this.engine) == this._myDefaultResources) {\r\n Globals.removeDefaultResources(this.engine);\r\n }\r\n }\r\n}", "import { Material, Mesh } from \"@wonderlandengine/api\";\r\n\r\nexport class DefaultResources {\r\n\r\n public myMeshes: DefaultResourcesMeshes = new DefaultResourcesMeshes();\r\n public myMaterials: DefaultResourcesMaterials = new DefaultResourcesMaterials();\r\n}\r\n\r\nexport class DefaultResourcesMeshes {\r\n\r\n public myPlane: Mesh | null = null;\r\n public myCube: Mesh | null = null;\r\n public mySphere: Mesh | null = null;\r\n public myCone: Mesh | null = null;\r\n public myCylinder: Mesh | null = null;\r\n public myCircle: Mesh | null = null;\r\n\r\n public myInvertedCube: Mesh | null = null;\r\n public myInvertedSphere: Mesh | null = null;\r\n public myInvertedCone: Mesh | null = null;\r\n public myInvertedCylinder: Mesh | null = null;\r\n\r\n public myDoubleSidedPlane: Mesh | null = null;\r\n public myDoubleSidedCube: Mesh | null = null;\r\n public myDoubleSidedSphere: Mesh | null = null;\r\n public myDoubleSidedCone: Mesh | null = null;\r\n public myDoubleSidedCylinder: Mesh | null = null;\r\n public myDoubleSidedCircle: Mesh | null = null;\r\n}\r\n\r\nexport class DefaultResourcesMaterials {\r\n\r\n public myFlatOpaque: Material | null = null;\r\n /** For now, the pipeline associated to this material needs to be the last one to make it work properly */\r\n public myFlatTransparentNoDepth: Material | null = null;\r\n public myPhongOpaque: Material | null = null;\r\n public myText: Material | null = null;\r\n}", "import { Component, Property } from \"@wonderlandengine/api\";\r\nimport { Handedness } from \"../../../../input/cauldron/input_types.js\";\r\nimport { Globals } from \"../../../../pp/globals.js\";\r\nimport { SceneObjects } from \"../scene_objects.js\";\r\n\r\nexport class GetSceneObjectsComponent extends Component {\r\n static TypeName = \"pp-get-scene-objects\";\r\n static Properties = {\r\n _myRoot: Property.object(),\r\n\r\n _myScene: Property.object(),\r\n\r\n _myPlayer: Property.object(),\r\n _myReferenceSpace: Property.object(), // If u don't have a pivot under the player you set this to null, by default will be the same as the player\r\n _myCameraNonXR: Property.object(),\r\n _myEyeLeft: Property.object(),\r\n _myEyeRight: Property.object(),\r\n _myHandLeft: Property.object(),\r\n _myHandRight: Property.object(),\r\n _myHead: Property.object()\r\n };\r\n\r\n init() {\r\n this._mySceneObjects = new SceneObjects();\r\n\r\n this._mySceneObjects.myRoot = this._myRoot;\r\n\r\n this._mySceneObjects.myScene = this._myScene;\r\n\r\n this._mySceneObjects.myPlayerObjects.myPlayer = this._myPlayer;\r\n this._mySceneObjects.myPlayerObjects.myReferenceSpace = this._myReferenceSpace;\r\n\r\n this._mySceneObjects.myPlayerObjects.myCameraNonXR = this._myCameraNonXR;\r\n\r\n this._mySceneObjects.myPlayerObjects.myEyeLeft = this._myEyeLeft;\r\n this._mySceneObjects.myPlayerObjects.myEyeRight = this._myEyeRight;\r\n\r\n this._mySceneObjects.myPlayerObjects.myHandLeft = this._myHandLeft;\r\n this._mySceneObjects.myPlayerObjects.myHandRight = this._myHandRight;\r\n\r\n this._mySceneObjects.myPlayerObjects.myEyes[Handedness.LEFT] = this._myEyeLeft;\r\n this._mySceneObjects.myPlayerObjects.myEyes[Handedness.RIGHT] = this._myEyeRight;\r\n\r\n this._mySceneObjects.myPlayerObjects.myHands[Handedness.LEFT] = this._myHandLeft;\r\n this._mySceneObjects.myPlayerObjects.myHands[Handedness.RIGHT] = this._myHandRight;\r\n\r\n this._mySceneObjects.myPlayerObjects.myHead = this._myHead;\r\n\r\n if (this._mySceneObjects.myPlayerObjects.myReferenceSpace == null) {\r\n this._mySceneObjects.myPlayerObjects.myReferenceSpace = this._mySceneObjects.myPlayerObjects.myPlayer;\r\n }\r\n\r\n this._mySceneObjects.myCauldron = this._mySceneObjects.myScene.pp_addChild();\r\n this._mySceneObjects.myCauldron.pp_setName(\"Cauldron\");\r\n this._mySceneObjects.myDynamics = this._mySceneObjects.myScene.pp_addChild();\r\n this._mySceneObjects.myDynamics.pp_setName(\"Dynamics\");\r\n this._mySceneObjects.myParticles = this._mySceneObjects.myScene.pp_addChild();\r\n this._mySceneObjects.myParticles.pp_setName(\"Particles\");\r\n this._mySceneObjects.myVisualElements = this._mySceneObjects.myScene.pp_addChild();\r\n this._mySceneObjects.myVisualElements.pp_setName(\"Visual Elements\");\r\n this._mySceneObjects.myTools = this._mySceneObjects.myScene.pp_addChild();\r\n this._mySceneObjects.myTools.pp_setName(\"Tools\");\r\n\r\n this._mySceneObjects.myPlayerObjects.myCauldron = this._mySceneObjects.myPlayerObjects.myPlayer.pp_addChild();\r\n this._mySceneObjects.myPlayerObjects.myCauldron.pp_setName(\"Cauldron\");\r\n this._mySceneObjects.myPlayerObjects.myHeadDebugs = this._mySceneObjects.myPlayerObjects.myHead.pp_addChild();\r\n this._mySceneObjects.myPlayerObjects.myHeadDebugs.pp_setName(\"Head Debugs\");\r\n }\r\n\r\n onActivate() {\r\n if (!Globals.hasSceneObjects(this.engine)) {\r\n Globals.setSceneObjects(this._mySceneObjects, this.engine);\r\n }\r\n }\r\n\r\n onDeactivate() {\r\n if (Globals.getSceneObjects(this.engine) == this._mySceneObjects) {\r\n Globals.removeSceneObjects(this.engine);\r\n }\r\n }\r\n}", "export enum Handedness {\r\n LEFT = \"left\",\r\n RIGHT = \"right\"\r\n}\r\n\r\nexport enum HandednessIndex {\r\n LEFT = 0,\r\n RIGHT = 1\r\n}\r\n\r\nexport enum InputSourceType {\r\n GAMEPAD = 0,\r\n TRACKED_HAND = 1\r\n}\r\n\r\nexport enum TrackedHandJointID {\r\n WRIST = \"wrist\",\r\n\r\n THUMB_METACARPAL = \"thumb-metacarpal\",\r\n THUMB_PHALANX_PROXIMAL = \"thumb-phalanx-proximal\",\r\n THUMB_PHALANX_DISTAL = \"thumb-phalanx-distal\",\r\n THUMB_TIP = \"thumb-tip\",\r\n\r\n INDEX_FINGER_METACARPAL = \"index-finger-metacarpal\",\r\n INDEX_FINGER_PHALANX_PROXIMAL = \"index-finger-phalanx-proximal\",\r\n INDEX_FINGER_PHALANX_INTERMEDIATE = \"index-finger-phalanx-intermediate\",\r\n INDEX_FINGER_PHALANX_DISTAL = \"index-finger-phalanx-distal\",\r\n INDEX_FINGER_TIP = \"index-finger-tip\",\r\n\r\n MIDDLE_FINGER_METACARPAL = \"middle-finger-metacarpal\",\r\n MIDDLE_FINGER_PHALANX_PROXIMAL = \"middle-finger-phalanx-proximal\",\r\n MIDDLE_FINGER_PHALANX_INTERMEDIATE = \"middle-finger-phalanx-intermediate\",\r\n MIDDLE_FINGER_PHALANX_DISTAL = \"middle-finger-phalanx-distal\",\r\n MIDDLE_FINGER_TIP = \"middle-finger-tip\",\r\n\r\n RING_FINGER_METACARPAL = \"ring-finger-metacarpal\",\r\n RING_FINGER_PHALANX_PROXIMAL = \"ring-finger-phalanx-proximal\",\r\n RING_FINGER_PHALANX_INTERMEDIATE = \"ring-finger-phalanx-intermediate\",\r\n RING_FINGER_PHALANX_DISTAL = \"ring-finger-phalanx-distal\",\r\n RING_FINGER_TIP = \"ring-finger-tip\",\r\n\r\n PINKY_FINGER_METACARPAL = \"pinky-finger-metacarpal\",\r\n PINKY_FINGER_PHALANX_PROXIMAL = \"pinky-finger-phalanx-proximal\",\r\n PINKY_FINGER_PHALANX_INTERMEDIATE = \"pinky-finger-phalanx-intermediate\",\r\n PINKY_FINGER_PHALANX_DISTAL = \"pinky-finger-phalanx-distal\",\r\n PINKY_FINGER_TIP = \"pinky-finger-tip\"\r\n}\r\n\r\nexport enum TrackedHandJointIDIndex {\r\n WRIST = 0,\r\n\r\n THUMB_METACARPAL = 1,\r\n THUMB_PHALANX_PROXIMAL = 2,\r\n THUMB_PHALANX_DISTAL = 3,\r\n THUMB_TIP = 4,\r\n\r\n INDEX_FINGER_METACARPAL = 5,\r\n INDEX_FINGER_PHALANX_PROXIMAL = 6,\r\n INDEX_FINGER_PHALANX_INTERMEDIATE = 7,\r\n INDEX_FINGER_PHALANX_DISTAL = 8,\r\n INDEX_FINGER_TIP = 9,\r\n\r\n MIDDLE_FINGER_METACARPAL = 10,\r\n MIDDLE_FINGER_PHALANX_PROXIMAL = 11,\r\n MIDDLE_FINGER_PHALANX_INTERMEDIATE = 12,\r\n MIDDLE_FINGER_PHALANX_DISTAL = 13,\r\n MIDDLE_FINGER_TIP = 14,\r\n\r\n RING_FINGER_METACARPAL = 15,\r\n RING_FINGER_PHALANX_PROXIMAL = 16,\r\n RING_FINGER_PHALANX_INTERMEDIATE = 17,\r\n RING_FINGER_PHALANX_DISTAL = 18,\r\n RING_FINGER_TIP = 19,\r\n\r\n PINKY_FINGER_METACARPAL = 20,\r\n PINKY_FINGER_PHALANX_PROXIMAL = 21,\r\n PINKY_FINGER_PHALANX_INTERMEDIATE = 22,\r\n PINKY_FINGER_PHALANX_DISTAL = 23,\r\n PINKY_FINGER_TIP = 24\r\n}", "import { Object3D } from \"@wonderlandengine/api\";\r\nimport { Handedness } from \"../../../input/cauldron/input_types.js\";\r\n\r\nexport class SceneObjects {\r\n\r\n public myRoot: Object3D | null = null;\r\n\r\n public myScene: Object3D | null = null;\r\n\r\n public myCauldron: Object3D | null = null;\r\n public myDynamics: Object3D | null = null;\r\n public myParticles: Object3D | null = null;\r\n public myVisualElements: Object3D | null = null;\r\n public myTools: Object3D | null = null;\r\n\r\n public myPlayerObjects: PlayerObjects = new PlayerObjects();\r\n}\r\n\r\nexport class PlayerObjects {\r\n\r\n public myPlayer: Object3D | null = null;\r\n\r\n public myCauldron: Object3D | null = null;\r\n public myReferenceSpace: Object3D | null = null;\r\n\r\n public myCameraNonXR: Object3D | null = null;\r\n\r\n public myEyes: Record = { [Handedness.LEFT]: null, [Handedness.RIGHT]: null };\r\n public myEyeLeft: Object3D | null = null;\r\n public myEyeRight: Object3D | null = null;\r\n\r\n public myHands: Record = { [Handedness.LEFT]: null, [Handedness.RIGHT]: null };\r\n public myHandLeft: Object3D | null = null;\r\n public myHandRight: Object3D | null = null;\r\n\r\n public myHead: Object3D | null = null;\r\n public myHeadDebugs: Object3D | null = null;\r\n}", "import { Component } from \"@wonderlandengine/api\";\r\nimport { Globals } from \"../../pp/globals.js\";\r\nimport { DebugManager } from \"../debug_manager.js\";\r\n\r\nexport class DebugManagerComponent extends Component {\r\n static TypeName = \"pp-debug-manager\";\r\n\r\n init() {\r\n this._myDebugManager = null;\r\n this._myCurrentActive = false;\r\n\r\n this._myInitDone = false;\r\n }\r\n\r\n _init() {\r\n this._myDebugManager = new DebugManager(this.engine);\r\n this._myDebugManager.setActive(this._myCurrentActive);\r\n\r\n this._myDebugManager.start();\r\n\r\n this._myInitDone = true;\r\n }\r\n\r\n update(dt) {\r\n if (!this._myInitDone && Globals.isDebugEnabled(this.engine)) {\r\n this._init();\r\n\r\n if (this._myDebugManager != null && !Globals.hasDebugManager(this.engine)) {\r\n Globals.setDebugManager(this._myDebugManager, this.engine);\r\n }\r\n } else if (this._myDebugManager != null && !Globals.hasDebugManager(this.engine) &&\r\n Globals.isDebugEnabled(this.engine) && this._myCurrentActive != Globals.isDebugEnabled(this.engine)) {\r\n Globals.setDebugManager(this._myDebugManager, this.engine);\r\n }\r\n\r\n if (this._myDebugManager != null && Globals.getDebugManager(this.engine) == this._myDebugManager) {\r\n if (this._myCurrentActive != Globals.isDebugEnabled(this.engine)) {\r\n this._myCurrentActive = Globals.isDebugEnabled(this.engine);\r\n\r\n this._myDebugManager.setActive(this._myCurrentActive);\r\n\r\n if (this._myCurrentActive) {\r\n if (!Globals.hasDebugManager(this.engine)) {\r\n Globals.setDebugManager(this._myDebugManager, this.engine);\r\n }\r\n } else {\r\n if (Globals.getDebugManager(this.engine) == this._myDebugManager) {\r\n Globals.removeDebugManager(this.engine);\r\n }\r\n }\r\n }\r\n\r\n this._myDebugManager.update(dt);\r\n }\r\n }\r\n\r\n onDeactivate() {\r\n if (this._myDebugManager != null) {\r\n this._myCurrentActive = false;\r\n this._myDebugManager.setActive(false);\r\n\r\n if (Globals.getDebugManager(this.engine) == this._myDebugManager) {\r\n Globals.removeDebugManager(this.engine);\r\n }\r\n }\r\n }\r\n\r\n onDestroy() {\r\n if (this._myDebugManager != null) {\r\n this._myDebugManager.destroy();\r\n }\r\n }\r\n}", "import { Alignment, VerticalAlignment } from \"@wonderlandengine/api\";\r\nimport { XRUtils } from \"../cauldron/utils/xr_utils.js\";\r\nimport { VisualArrowParams } from \"../cauldron/visual/elements/visual_arrow.js\";\r\nimport { VisualLineParams } from \"../cauldron/visual/elements/visual_line.js\";\r\nimport { VisualPointParams } from \"../cauldron/visual/elements/visual_point.js\";\r\nimport { VisualRaycastParams } from \"../cauldron/visual/elements/visual_raycast.js\";\r\nimport { VisualTextParams } from \"../cauldron/visual/elements/visual_text.js\";\r\nimport { VisualTransformParams } from \"../cauldron/visual/elements/visual_transform.js\";\r\nimport { VisualManager } from \"../cauldron/visual/visual_manager.js\";\r\nimport { quat_create, vec3_create, vec4_create } from \"../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Globals } from \"../pp/globals.js\";\r\n\r\nexport class DebugVisualManager extends VisualManager {\r\n\r\n constructor(engine) {\r\n super(engine);\r\n\r\n this._myDefaultColor = vec4_create(1, 0, 1, 1);\r\n this._myDefaultLineThickness = 0.005;\r\n this._myDefaultPointRadius = 0.01;\r\n this._myDefaultAxisLength = 0.2;\r\n\r\n this._myDefaultTextLookAtPlayer = true;\r\n this._myDefaultTextAlignment = Alignment.Center;\r\n this._myDefaultTextVerticalAlignment = VerticalAlignment.Middle;\r\n\r\n this._myDefaultUITextAlignment = Alignment.Center;\r\n this._myDefaultUITextVerticalAlignment = VerticalAlignment.Middle;\r\n this._myDefaultUITextScale = 1;\r\n\r\n this._myDefaultUITextScreenPosition = vec3_create(1, 1, 1);\r\n }\r\n\r\n setActive(active) {\r\n active = active && Globals.isDebugEnabled(this._myEngine);\r\n super.setActive(active);\r\n }\r\n\r\n drawLine(lifetimeSeconds, start, direction, length, color = this._myDefaultColor, thickness = this._myDefaultLineThickness) {\r\n let elementID = null;\r\n\r\n if (this.isActive()) {\r\n let visualParams = new VisualLineParams(this._myEngine);\r\n visualParams.myStart.vec3_copy(start);\r\n visualParams.myDirection.vec3_copy(direction);\r\n visualParams.myLength = length;\r\n visualParams.myThickness = thickness;\r\n visualParams.myColor = vec4_create();\r\n visualParams.myColor.vec4_copy(color);\r\n elementID = this.draw(visualParams, lifetimeSeconds);\r\n }\r\n\r\n return elementID;\r\n }\r\n\r\n drawLineEnd(lifetimeSeconds, start, end, color = this._myDefaultColor, thickness = this._myDefaultLineThickness) {\r\n // Implemented outside class definition\r\n }\r\n\r\n drawArrow(lifetimeSeconds, start, direction, length, color = this._myDefaultColor, thickness = this._myDefaultLineThickness) {\r\n let elementID = null;\r\n\r\n if (this.isActive()) {\r\n let visualParams = new VisualArrowParams(this._myEngine);\r\n visualParams.myStart.vec3_copy(start);\r\n visualParams.myDirection.vec3_copy(direction);\r\n visualParams.myLength = length;\r\n visualParams.myThickness = thickness;\r\n visualParams.myColor = vec4_create();\r\n visualParams.myColor.vec4_copy(color);\r\n elementID = this.draw(visualParams, lifetimeSeconds);\r\n }\r\n\r\n return elementID;\r\n }\r\n\r\n drawArrowEnd(lifetimeSeconds, start, end, color = this._myDefaultColor, thickness = this._myDefaultLineThickness) {\r\n // Implemented outside class definition\r\n }\r\n\r\n drawPoint(lifetimeSeconds, position, color = this._myDefaultColor, radius = this._myDefaultPointRadius) {\r\n let elementID = null;\r\n\r\n if (this.isActive()) {\r\n let visualParams = new VisualPointParams(this._myEngine);\r\n visualParams.myPosition.vec3_copy(position);\r\n visualParams.myRadius = radius;\r\n visualParams.myColor = vec4_create();\r\n visualParams.myColor.vec4_copy(color);\r\n elementID = this.draw(visualParams, lifetimeSeconds);\r\n }\r\n\r\n return elementID;\r\n }\r\n\r\n drawText(lifetimeSeconds, text, transform, color = this._myDefaultColor, lookAtPlayer = this._myDefaultTextLookAtPlayer, alignment = this._myDefaultTextAlignment, verticalAlignment = this._myDefaultTextVerticalAlignment) {\r\n let elementID = null;\r\n\r\n if (this.isActive()) {\r\n let visualParams = new VisualTextParams(this._myEngine);\r\n visualParams.myText = text;\r\n visualParams.myAlignment = alignment;\r\n visualParams.myVerticalAlignment = verticalAlignment;\r\n visualParams.myTransform.mat4_copy(transform);\r\n visualParams.myColor = vec4_create();\r\n visualParams.myColor.vec4_copy(color);\r\n\r\n if (lookAtPlayer) {\r\n visualParams.myLookAtObject = Globals.getPlayerObjects(this._myEngine).myHead;\r\n }\r\n\r\n elementID = this.draw(visualParams, lifetimeSeconds);\r\n }\r\n\r\n return elementID;\r\n }\r\n\r\n drawRaycast(lifetimeSeconds, raycastResult, showOnlyFirstHit = true, hitNormalLength = this._myDefaultAxisLength, thickness = this._myDefaultLineThickness) {\r\n let elementID = null;\r\n\r\n if (this.isActive()) {\r\n let visualParams = new VisualRaycastParams(this._myEngine);\r\n visualParams.myRaycastResults = raycastResult;\r\n visualParams.myShowOnlyFirstHit = showOnlyFirstHit;\r\n visualParams.myHitNormalLength = hitNormalLength;\r\n visualParams.myThickness = thickness;\r\n elementID = this.draw(visualParams, lifetimeSeconds);\r\n }\r\n\r\n return elementID;\r\n }\r\n\r\n drawTransform(lifetimeSeconds, transform, length = this._myDefaultAxisLength, thickness = this._myDefaultLineThickness) {\r\n let elementID = null;\r\n\r\n if (this.isActive()) {\r\n let visualParams = new VisualTransformParams(this._myEngine);\r\n visualParams.myTransform.mat4_copy(transform);\r\n visualParams.myLength = length;\r\n visualParams.myThickness = thickness;\r\n elementID = this.draw(visualParams, lifetimeSeconds);\r\n }\r\n\r\n return elementID;\r\n }\r\n\r\n drawUIText(lifetimeSeconds, text, screenPosition, scale = this._myDefaultUITextScale, color = this._myDefaultColor, alignment = this._myDefaultUITextAlignment, verticalAlignment = this._myDefaultUITextVerticalAlignment) {\r\n // Implemented outside class definition\r\n }\r\n\r\n _getClassName() {\r\n return \"debug_visual_manager\";\r\n }\r\n}\r\n\r\n\r\n\r\n// IMPLEMENTATION\r\n\r\nDebugVisualManager.prototype.drawLineEnd = function () {\r\n let direction = vec3_create();\r\n return function drawLineEnd(lifetimeSeconds, start, end, color = this._myDefaultColor, thickness = this._myDefaultLineThickness) {\r\n let elementID = null;\r\n\r\n if (this.isActive()) {\r\n direction = end.vec3_sub(start, direction);\r\n let length = direction.vec3_length();\r\n direction.vec3_normalize(direction);\r\n elementID = this.drawLine(lifetimeSeconds, start, direction, length, color, thickness);\r\n }\r\n\r\n return elementID;\r\n };\r\n}();\r\n\r\nDebugVisualManager.prototype.drawArrowEnd = function () {\r\n let direction = vec3_create();\r\n return function drawArrowEnd(lifetimeSeconds, start, end, color = this._myDefaultColor, thickness = this._myDefaultLineThickness) {\r\n let elementID = null;\r\n\r\n if (this.isActive()) {\r\n direction = end.vec3_sub(start, direction);\r\n let length = direction.vec3_length();\r\n direction.vec3_normalize(direction);\r\n elementID = this.drawArrow(lifetimeSeconds, start, direction, length, color, thickness);\r\n }\r\n\r\n return elementID;\r\n };\r\n}();\r\n\r\nDebugVisualManager.prototype.drawUIText = function () {\r\n let textRotationQuat = quat_create();\r\n let up = vec3_create(0, 1, 0);\r\n let lookToForward = vec3_create();\r\n\r\n let screenPositionNormalizedXR = vec3_create(-0.12 * 1, 0.12 * 1, 0.35);\r\n let screenPositionNormalizedNonXR = vec3_create(-0.27 * 1.15, 0.13 * 1.05, 0.35);\r\n\r\n let textPosition = vec3_create();\r\n let textRotation = vec3_create();\r\n let textScale = vec3_create();\r\n return function drawUIText(lifetimeSeconds, text, screenPosition = this._myDefaultUITextScreenPosition, scale = this._myDefaultUITextScale, color = this._myDefaultColor, alignment = this._myDefaultUITextAlignment, verticalAlignment = this._myDefaultUITextVerticalAlignment) {\r\n let elementID = null;\r\n\r\n if (this.isActive()) {\r\n let visualParams = new VisualTextParams(this._myEngine);\r\n visualParams.myText = text;\r\n visualParams.myAlignment = alignment;\r\n visualParams.myVerticalAlignment = verticalAlignment;\r\n visualParams.myColor = vec4_create();\r\n visualParams.myColor.vec4_copy(color);\r\n\r\n let scaleNormalized = 0.2;\r\n\r\n if (XRUtils.isSessionActive(this._myEngine)) {\r\n visualParams.myTransform.mat4_setPositionRotationScale(\r\n screenPositionNormalizedXR.vec3_mul(screenPosition, textPosition),\r\n textRotation.vec3_set(0, 180, 0),\r\n textScale.vec3_set(scaleNormalized * scale, scaleNormalized * scale, scaleNormalized * scale));\r\n\r\n lookToForward = visualParams.myTransform.mat4_getPosition(lookToForward).vec3_negate(lookToForward).vec3_normalize(lookToForward);\r\n textRotationQuat = visualParams.myTransform.mat4_getRotationQuat(textRotationQuat);\r\n textRotationQuat.quat_setForward(lookToForward, up, textRotationQuat);\r\n visualParams.myTransform.mat4_setRotationQuat(textRotationQuat);\r\n } else {\r\n visualParams.myTransform.mat4_setPositionRotationScale(\r\n screenPositionNormalizedNonXR.vec3_mul(screenPosition, textPosition),\r\n textRotation.vec3_set(0, 180, 0),\r\n textScale.vec3_set(scaleNormalized * scale, scaleNormalized * scale, scaleNormalized * scale));\r\n }\r\n\r\n visualParams.myParent = Globals.getPlayerObjects(this._myEngine).myHeadDebugs;\r\n visualParams.myLocal = true;\r\n\r\n elementID = this.draw(visualParams, lifetimeSeconds);\r\n }\r\n\r\n return elementID;\r\n };\r\n}();", "import { Globals } from \"../pp/globals.js\";\r\nimport { DebugVisualManager } from \"./debug_visual_manager.js\";\r\n\r\nexport class DebugManager {\r\n\r\n constructor(engine = Globals.getMainEngine()) {\r\n this._myEngine = engine;\r\n\r\n this._myDebugVisualManager = new DebugVisualManager(this._myEngine);\r\n\r\n this._myActive = true;\r\n this._myDestroyed = false;\r\n }\r\n\r\n getDebugVisualManager() {\r\n return this._myDebugVisualManager;\r\n }\r\n\r\n start() {\r\n this._myDebugVisualManager.start();\r\n }\r\n\r\n update(dt) {\r\n if (!this._myActive) return;\r\n\r\n this._myDebugVisualManager.update(dt);\r\n }\r\n\r\n setActive(active) {\r\n active = active && Globals.isDebugEnabled(this._myEngine);\r\n\r\n if (this._myActive != active) {\r\n this._myActive = active;\r\n }\r\n\r\n this._myDebugVisualManager.setActive(active);\r\n }\r\n\r\n isActive() {\r\n return this._myActive;\r\n }\r\n\r\n destroy() {\r\n this._myDestroyed = true;\r\n\r\n this.setActive(false);\r\n\r\n this._myDebugVisualManager.destroy();\r\n }\r\n\r\n isDestroyed() {\r\n return this._myDestroyed;\r\n }\r\n}", "import { Component, Property } from \"@wonderlandengine/api\";\r\nimport { Globals } from \"../../pp/globals.js\";\r\n\r\nexport class EnableDebugComponent extends Component {\r\n static TypeName = \"pp-enable-debug\";\r\n static Properties = {\r\n _myEnable: Property.bool(true)\r\n };\r\n\r\n start() {\r\n this._myHasDebugEnabled = this._myEnable;\r\n this._myDebugEnabled = this._myEnable;\r\n }\r\n\r\n onActivate() {\r\n if (this._myHasDebugEnabled) {\r\n Globals.setDebugEnabled(this._myDebugEnabled, this.engine);\r\n }\r\n }\r\n\r\n onDeactivate() {\r\n this._myHasDebugEnabled = Globals.hasDebugEnabled();\r\n this._myDebugEnabled = Globals.isDebugEnabled();\r\n Globals.removeDebugEnabled(this.engine);\r\n }\r\n}", "import { Component } from \"@wonderlandengine/api\";\r\nimport { Globals } from \"../../../../../pp/globals.js\";\r\nimport { CharacterCollisionSystem } from \"../character_collision_system.js\";\r\n\r\nexport class CharacterCollisionSystemComponent extends Component {\r\n static TypeName = \"pp-character-collision-system\";\r\n\r\n init() {\r\n this._myCharacterCollisionSystem = new CharacterCollisionSystem(this.engine);\r\n }\r\n\r\n update(dt) {\r\n if (Globals.getCharacterCollisionSystem(this.engine) == this._myCharacterCollisionSystem) {\r\n this._myCharacterCollisionSystem.update(dt);\r\n }\r\n }\r\n\r\n onActivate() {\r\n if (!Globals.hasCharacterCollisionSystem(this.engine)) {\r\n Globals.setCharacterCollisionSystem(this._myCharacterCollisionSystem, this.engine);\r\n }\r\n }\r\n\r\n onDeactivate() {\r\n if (Globals.getCharacterCollisionSystem(this.engine) == this._myCharacterCollisionSystem) {\r\n Globals.removeCharacterCollisionSystem(this.engine);\r\n }\r\n }\r\n}", "import { RaycastHit } from \"../../../../cauldron/physics/physics_raycast_params.js\";\r\nimport { quat2_create, vec3_create } from \"../../../../plugin/js/extensions/array/vec_create_extension.js\";\r\n\r\nexport class CharacterCollisionResults {\r\n\r\n constructor() {\r\n this.myCheckType = null;\r\n\r\n this.myTransformResults = new CharacterCollisionTransformResults();\r\n\r\n this.myMovementResults = new CharacterCollisionMovementResults();\r\n this.myHorizontalMovementResults = new CharacterCollisionMovementResults();\r\n this.myVerticalMovementResults = new CharacterCollisionMovementResults();\r\n\r\n this.myTeleportResults = new CharacterCollisionTeleportResults();\r\n\r\n this.myCheckTransformResults = new CharacterCollisionCheckTransformResults();\r\n\r\n this.myWallSlideResults = new CharacterCollisionWallSlideResults();\r\n\r\n this.myGroundInfo = new CharacterCollisionSurfaceInfo();\r\n this.myCeilingInfo = new CharacterCollisionSurfaceInfo();\r\n\r\n this.myGroundResults = new CharacterCollisionSurfaceResults();\r\n this.myCeilingResults = new CharacterCollisionSurfaceResults();\r\n\r\n this.mySplitMovementResults = new CharacterCollisionSplitMovementResults();\r\n\r\n this.myDebugResults = new CharacterCollisionDebugResults();\r\n\r\n this.myInternalResults = new CharacterCollisionInternalResults();\r\n }\r\n\r\n reset() {\r\n // Implemented outside class definition\r\n }\r\n\r\n copy(other) {\r\n // Implemented outside class definition\r\n }\r\n}\r\n\r\nexport let CharacterCollisionCheckType = {\r\n CHECK_MOVEMENT: 0,\r\n CHECK_TELEPORT: 1,\r\n CHECK_TRANSFORM: 2,\r\n UPDATE_SURFACE_INFO: 3,\r\n UPDATE_GROUND_INFO: 4,\r\n UPDATE_CEILING_INFO: 5\r\n};\r\n\r\nexport class CharacterCollisionSurfaceInfo {\r\n\r\n constructor() {\r\n this.myOnSurface = false;\r\n\r\n this.mySurfaceReferenceCollisionHit = new RaycastHit();\r\n\r\n this.mySurfaceAngle = 0;\r\n this.mySurfacePerceivedAngle = 0;\r\n this.mySurfaceNormal = vec3_create();\r\n\r\n this.mySurfaceHitMaxAngle = 0;\r\n this.mySurfaceHitMaxNormal = vec3_create();\r\n\r\n this.mySurfaceDistance = null;\r\n\r\n this.myBaseInsideCollision = false;\r\n this.myOnSurfaceDueToBasePartiallyInsideCollision = false;\r\n }\r\n\r\n reset() {\r\n // Implemented outside class definition\r\n }\r\n\r\n copy(other) {\r\n // Implemented outside class definition\r\n }\r\n}\r\n\r\nexport class CharacterCollisionWallSlideResults {\r\n\r\n constructor() {\r\n this.myHasSlid = false;\r\n this.mySlideMovementAngle = 0; // Signed angle between the start movement and the wall slide movement, basically telling you how much u had to change direction to slide\r\n this.mySlideMovementWallAngle = 0; // Signed angle between the inverted surface normal and the wall slide movement\r\n this.myWallNormal = vec3_create();\r\n }\r\n\r\n reset() {\r\n // Implemented outside class definition\r\n }\r\n\r\n copy(other) {\r\n // Implemented outside class definition\r\n }\r\n}\r\n\r\nexport class CharacterCollisionTransformResults {\r\n\r\n constructor() {\r\n this.myInitialTransformQuat = quat2_create();\r\n this.myFinalTransformQuat = quat2_create();\r\n }\r\n\r\n reset() {\r\n // Implemented outside class definition\r\n }\r\n\r\n copy(other) {\r\n // Implemented outside class definition\r\n }\r\n}\r\n\r\nexport class CharacterCollisionMovementResults {\r\n\r\n constructor() {\r\n this.myInitialMovement = vec3_create();\r\n this.myFinalMovement = vec3_create();\r\n this.myMovementFailed = false;\r\n this.myMovementCollided = false;\r\n this.myReferenceCollisionHit = new RaycastHit();\r\n }\r\n\r\n reset() {\r\n // Implemented outside class definition\r\n }\r\n\r\n copy(other) {\r\n // Implemented outside class definition\r\n }\r\n}\r\n\r\nexport class CharacterCollisionTeleportResults {\r\n\r\n constructor() {\r\n this.myInitialTeleportTransformQuat = quat2_create();\r\n this.myFinalTeleportTransformQuat = quat2_create();\r\n this.myTeleportFailed = false;\r\n }\r\n\r\n reset() {\r\n // Implemented outside class definition\r\n }\r\n\r\n copy(other) {\r\n // Implemented outside class definition\r\n }\r\n}\r\n\r\nexport class CharacterCollisionCheckTransformResults {\r\n\r\n constructor() {\r\n this.myInitialCheckTransformQuat = quat2_create();\r\n this.myFinalCheckTransformQuat = quat2_create();\r\n this.myCheckTransformFailed = false;\r\n }\r\n\r\n reset() {\r\n // Implemented outside class definition\r\n }\r\n\r\n copy(other) {\r\n // Implemented outside class definition\r\n }\r\n}\r\n\r\nexport class CharacterCollisionSurfaceResults {\r\n\r\n constructor() {\r\n this.myHasSnappedOnSurface = false;\r\n this.myHasPoppedOutSurface = false;\r\n this.myHasHorizontalMovementAdjustedVerticalMovementOverSurfacePerceivedAngleDownhill = false;\r\n this.myHasHorizontalMovementAdjustedVerticalMovementOverSurfacePerceivedAngleUphill = false;\r\n this.myHasVerticalMovementAdjustedHorizontalMovementOverSurfaceAngleDownhill = false;\r\n }\r\n\r\n reset() {\r\n // Implemented outside class definition\r\n }\r\n\r\n copy(other) {\r\n // Implemented outside class definition\r\n }\r\n}\r\n\r\nexport class CharacterCollisionSplitMovementResults {\r\n\r\n constructor() {\r\n this.myStepsToPerform = 0;\r\n this.myStepsPerformed = 0;\r\n this.myMovementInterrupted = false;\r\n this.myMovementReduced = false;\r\n this.myLastStepLongerThanMaxStepLength = false;\r\n this.myMovementChecked = vec3_create();\r\n }\r\n\r\n reset() {\r\n // Implemented outside class definition\r\n }\r\n\r\n copy(other) {\r\n // Implemented outside class definition\r\n }\r\n}\r\n\r\nexport class CharacterCollisionDebugResults {\r\n\r\n constructor() {\r\n this._myRaycastsPerformed = 0;\r\n }\r\n\r\n reset() {\r\n // Implemented outside class definition\r\n }\r\n\r\n copy(other) {\r\n // Implemented outside class definition\r\n }\r\n}\r\n\r\nexport class CharacterCollisionInternalResults {\r\n\r\n constructor() {\r\n this.myLastRelevantInitialHorizontalMovement = vec3_create();\r\n this.myLastRelevantAdjustedInitialHorizontalMovement = vec3_create();\r\n this.myLastRelevantFinalHorizontalMovement = vec3_create();\r\n\r\n this.myLastRelevantInitialVerticalMovement = vec3_create();\r\n this.myLastRelevantAdjustedInitialVerticalMovement = vec3_create();\r\n this.myLastRelevantFinalVerticalMovement = vec3_create();\r\n\r\n this.myLastRelevantHasWallSlid = false;\r\n this.myHasWallSlidTowardOppositeDirection = false;\r\n this.myLastRelevantWallSlideFlickerPrevented = false;\r\n this.myWallSlideFlickerPreventionForceCheckCounter = 0;\r\n this.myWallSlide90DegreesDirectionSign = 0;\r\n this.myWallSlide90DegreesRecomputeDirectionSign = true;\r\n }\r\n\r\n reset() {\r\n // Implemented outside class definition\r\n }\r\n\r\n copy(other) {\r\n // Implemented outside class definition\r\n }\r\n}\r\n\r\n\r\n\r\n// IMPLEMENTATION\r\n\r\nCharacterCollisionResults.prototype.reset = function reset() {\r\n this.myCheckType = null;\r\n\r\n this.myTransformResults.reset();\r\n\r\n this.myMovementResults.reset();\r\n this.myHorizontalMovementResults.reset();\r\n this.myVerticalMovementResults.reset();\r\n\r\n this.myTeleportResults.reset();\r\n\r\n this.myCheckTransformResults.reset();\r\n\r\n this.myWallSlideResults.reset();\r\n\r\n this.myGroundInfo.reset();\r\n this.myCeilingInfo.reset();\r\n\r\n this.myGroundResults.reset();\r\n this.myCeilingResults.reset();\r\n\r\n this.mySplitMovementResults.reset();\r\n\r\n this.myInternalResults.reset();\r\n};\r\n\r\nCharacterCollisionResults.prototype.copy = function copy(other) {\r\n this.myCheckType = other.myCheckType;\r\n\r\n this.myTransformResults.copy(other.myTransformResults);\r\n\r\n this.myMovementResults.copy(other.myMovementResults);\r\n this.myHorizontalMovementResults.copy(other.myHorizontalMovementResults);\r\n this.myVerticalMovementResults.copy(other.myVerticalMovementResults);\r\n\r\n this.myTeleportResults.copy(other.myTeleportResults);\r\n\r\n this.myCheckTransformResults.copy(other.myCheckTransformResults);\r\n\r\n this.myWallSlideResults.copy(other.myWallSlideResults);\r\n\r\n this.myGroundInfo.copy(other.myGroundInfo);\r\n this.myCeilingInfo.copy(other.myCeilingInfo);\r\n\r\n this.myGroundResults.copy(other.myGroundResults);\r\n this.myCeilingResults.copy(other.myCeilingResults);\r\n\r\n this.mySplitMovementResults.copy(other.mySplitMovementResults);\r\n\r\n this.myInternalResults.copy(other.myInternalResults);\r\n};\r\n\r\nCharacterCollisionSurfaceInfo.prototype.reset = function reset() {\r\n this.myOnSurface = false;\r\n\r\n this.mySurfaceAngle = 0;\r\n this.mySurfacePerceivedAngle = 0;\r\n this.mySurfaceNormal.vec3_zero();\r\n\r\n this.mySurfaceReferenceCollisionHit.reset();\r\n\r\n this.mySurfaceHitMaxAngle = 0;\r\n this.mySurfaceHitMaxNormal.vec3_zero();\r\n\r\n this.mySurfaceDistance = null;\r\n\r\n this.myBaseInsideCollision = false;\r\n this.myOnSurfaceDueToBasePartiallyInsideCollision = false;\r\n};\r\n\r\nCharacterCollisionSurfaceInfo.prototype.copy = function copy(other) {\r\n this.myOnSurface = other.myOnSurface;\r\n\r\n this.mySurfaceAngle = other.mySurfaceAngle;\r\n this.mySurfacePerceivedAngle = other.mySurfacePerceivedAngle;\r\n this.mySurfaceNormal.vec3_copy(other.mySurfaceNormal);\r\n\r\n this.mySurfaceReferenceCollisionHit.copy(other.mySurfaceReferenceCollisionHit);\r\n\r\n this.mySurfaceHitMaxAngle = other.mySurfaceHitMaxAngle;\r\n this.mySurfaceHitMaxNormal.vec3_copy(other.mySurfaceHitMaxNormal);\r\n\r\n this.mySurfaceDistance = other.mySurfaceDistance;\r\n\r\n this.myBaseInsideCollision = other.myBaseInsideCollision;\r\n this.myOnSurfaceDueToBasePartiallyInsideCollision = other.myOnSurfaceDueToBasePartiallyInsideCollision;\r\n};\r\n\r\nCharacterCollisionWallSlideResults.prototype.reset = function reset() {\r\n this.myHasSlid = false;\r\n this.mySlideMovementAngle = 0;\r\n this.mySlideMovementWallAngle = 0;\r\n this.myWallNormal.vec3_zero();\r\n};\r\n\r\nCharacterCollisionWallSlideResults.prototype.copy = function copy(other) {\r\n this.myHasSlid = other.myHasSlid;\r\n this.mySlideMovementAngle = other.mySlideMovementAngle;\r\n this.mySlideMovementWallAngle = other.mySlideMovementWallAngle;\r\n this.myWallNormal.vec3_copy(other.myWallNormal);\r\n};\r\n\r\nCharacterCollisionTransformResults.prototype.reset = function reset() {\r\n this.myInitialTransformQuat.quat2_identity();\r\n this.myFinalTransformQuat.quat2_identity();\r\n};\r\n\r\nCharacterCollisionTransformResults.prototype.copy = function copy(other) {\r\n this.myInitialTransformQuat.quat2_copy(other.myInitialTransformQuat);\r\n this.myFinalTransformQuat.quat2_copy(other.myFinalTransformQuat);\r\n};\r\n\r\nCharacterCollisionMovementResults.prototype.reset = function reset() {\r\n this.myInitialMovement.vec3_zero();\r\n this.myFinalMovement.vec3_zero();\r\n this.myMovementFailed = false;\r\n this.myMovementCollided = false;\r\n this.myReferenceCollisionHit.reset();\r\n};\r\n\r\nCharacterCollisionMovementResults.prototype.copy = function copy(other) {\r\n this.myInitialMovement.vec3_copy(other.myInitialMovement);\r\n this.myFinalMovement.vec3_copy(other.myFinalMovement);\r\n this.myMovementFailed = other.myMovementFailed;\r\n this.myMovementCollided = other.myMovementCollided;\r\n this.myReferenceCollisionHit.copy(other.myReferenceCollisionHit);\r\n};\r\n\r\nCharacterCollisionTeleportResults.prototype.reset = function reset() {\r\n this.myInitialTeleportTransformQuat.quat2_identity();\r\n this.myFinalTeleportTransformQuat.quat2_identity();\r\n this.myTeleportFailed = false;\r\n};\r\n\r\nCharacterCollisionTeleportResults.prototype.copy = function copy(other) {\r\n this.myInitialTeleportTransformQuat.quat2_copy(other.myInitialTeleportTransformQuat);\r\n this.myFinalTeleportTransformQuat.quat2_copy(other.myFinalTeleportTransformQuat);\r\n this.myTeleportFailed = other.myTeleportFailed;\r\n};\r\n\r\nCharacterCollisionCheckTransformResults.prototype.reset = function reset() {\r\n this.myInitialCheckTransformQuat.quat2_identity();\r\n this.myFinalCheckTransformQuat.quat2_identity();\r\n this.myCheckTransformFailed = false;\r\n};\r\n\r\nCharacterCollisionCheckTransformResults.prototype.copy = function copy(other) {\r\n this.myInitialCheckTransformQuat.quat2_copy(other.myInitialCheckTransformQuat);\r\n this.myFinalCheckTransformQuat.quat2_copy(other.myFinalCheckTransformQuat);\r\n this.myCheckTransformFailed = other.myCheckTransformFailed;\r\n};\r\n\r\nCharacterCollisionSurfaceResults.prototype.reset = function reset() {\r\n this.myHasSnappedOnSurface = false;\r\n this.myHasPoppedOutSurface = false;\r\n this.myHasHorizontalMovementAdjustedVerticalMovementOverSurfacePerceivedAngleDownhill = false;\r\n this.myHasHorizontalMovementAdjustedVerticalMovementOverSurfacePerceivedAngleUphill = false;\r\n this.myHasVerticalMovementAdjustedHorizontalMovementOverSurfaceAngleDownhill = false;\r\n};\r\n\r\nCharacterCollisionSurfaceResults.prototype.copy = function copy(other) {\r\n this.myHasSnappedOnSurface = other.myHasSnappedOnSurface;\r\n this.myHasPoppedOutSurface = other.myHasPoppedOutSurface;\r\n this.myHasHorizontalMovementAdjustedVerticalMovementOverSurfacePerceivedAngleDownhill = other.myHasHorizontalMovementAdjustedVerticalMovementOverSurfacePerceivedAngleDownhill;\r\n this.myHasHorizontalMovementAdjustedVerticalMovementOverSurfacePerceivedAngleUphill = other.myHasHorizontalMovementAdjustedVerticalMovementOverSurfacePerceivedAngleUphill;\r\n this.myHasVerticalMovementAdjustedHorizontalMovementOverSurfaceAngleDownhill = other.myHasVerticalMovementAdjustedHorizontalMovementOverSurfaceAngleDownhill;\r\n};\r\n\r\nCharacterCollisionSplitMovementResults.prototype.reset = function reset() {\r\n this.myStepsToPerform = 0;\r\n this.myStepsPerformed = 0;\r\n this.myMovementInterrupted = false;\r\n this.myMovementReduced = false;\r\n this.myLastStepLongerThanMaxStepLength = false;\r\n this.myMovementChecked.vec3_zero();\r\n};\r\n\r\nCharacterCollisionSplitMovementResults.prototype.copy = function copy(other) {\r\n this.myStepsToPerform = other.myStepsToPerform;\r\n this.myStepsPerformed = other.myStepsPerformed;\r\n this.myMovementInterrupted = other.myMovementInterrupted;\r\n this.myMovementReduced = other.myMovementReduced;\r\n this.myLastStepLongerThanMaxStepLength = other.myLastStepLongerThanMaxStepLength;\r\n this.myMovementChecked.vec3_copy(other.myMovementChecked);\r\n};\r\n\r\nCharacterCollisionDebugResults.prototype.reset = function reset() {\r\n this._myRaycastsPerformed = 0;\r\n};\r\n\r\nCharacterCollisionDebugResults.prototype.copy = function copy(other) {\r\n this._myRaycastsPerformed = other._myRaycastsPerformed;\r\n};\r\n\r\nCharacterCollisionInternalResults.prototype.reset = function reset() {\r\n};\r\n\r\nCharacterCollisionInternalResults.prototype.copy = function copy(other) {\r\n this.myLastRelevantInitialHorizontalMovement.vec3_copy(other.myLastRelevantInitialHorizontalMovement);\r\n this.myLastRelevantAdjustedInitialHorizontalMovement.vec3_copy(other.myLastRelevantAdjustedInitialHorizontalMovement);\r\n this.myLastRelevantFinalHorizontalMovement.vec3_copy(other.myLastRelevantFinalHorizontalMovement);\r\n\r\n this.myLastRelevantInitialVerticalMovement.vec3_copy(other.myLastRelevantInitialVerticalMovement);\r\n this.myLastRelevantAdjustedInitialVerticalMovement.vec3_copy(other.myLastRelevantAdjustedInitialVerticalMovement);\r\n this.myLastRelevantFinalVerticalMovement.vec3_copy(other.myLastRelevantFinalVerticalMovement);\r\n\r\n this.myLastRelevantHasWallSlid = other.myLastRelevantHasWallSlid;\r\n this.myHasWallSlidTowardOppositeDirection = other.myHasWallSlidTowardOppositeDirection;\r\n this.myLastRelevantWallSlideFlickerPrevented = other.myLastRelevantWallSlideFlickerPrevented;\r\n this.myWallSlideFlickerPreventionForceCheckCounter = other.myWallSlideFlickerPreventionForceCheckCounter;\r\n this.myWallSlide90DegreesDirectionSign = other.myWallSlide90DegreesDirectionSign;\r\n this.myWallSlide90DegreesRecomputeDirectionSign = other.myWallSlide90DegreesRecomputeDirectionSign;\r\n};", "import { PhysicsLayerFlags } from \"../../../../../../cauldron/physics/physics_layer_flags.js\";\r\nimport { RaycastBlockColliderType, RaycastHit } from \"../../../../../../cauldron/physics/physics_raycast_params.js\";\r\nimport { quat_create, vec3_create } from \"../../../../../../plugin/js/extensions/array/vec_create_extension.js\";\r\n\r\nexport class CollisionCheckParams {\r\n\r\n constructor() {\r\n this.mySplitMovementEnabled = false;\r\n this.mySplitMovementMaxLength = 0;\r\n this.mySplitMovementMaxLengthEnabled = false;\r\n this.mySplitMovementMaxLengthLastStepCanBeLonger = false;\r\n this.mySplitMovementMaxSteps = 0;\r\n this.mySplitMovementMaxStepsEnabled = false;\r\n this.mySplitMovementMinLength = 0;\r\n this.mySplitMovementMinLengthEnabled = false;\r\n this.mySplitMovementStopWhenHorizontalMovementCanceled = false;\r\n this.mySplitMovementStopWhenVerticalMovementCanceled = false;\r\n this.mySplitMovementStopWhenVerticalMovementReduced = false;\r\n this.mySplitMovementStopCallback = null; // Signature: callback(collisionRuntimeParams)\r\n this.mySplitMovementStopReturnPrevious = false;\r\n this.mySplitMovementStopAndFailIfMovementWouldBeReduced = false; // It means the overall movement would be reduced due to max steps for example\r\n\r\n this.myRadius = 0;\r\n this.myDistanceFromFeetToIgnore = 0;\r\n this.myDistanceFromHeadToIgnore = 0;\r\n\r\n this.myPositionOffsetLocal = vec3_create();\r\n this.myRotationOffsetLocalQuat = quat_create();\r\n\r\n this.myHorizontalMovementCheckEnabled = false;\r\n\r\n // Usually the horizontal movement is very small and it could be simply skipped has a check, the horizontal position check will be enough\r\n // With small I mean that it's very unlikely that in 10 cm of movement in a frame u are going to hit something in between but not in the final position\r\n // If u feel like the movement is bigger or want to be sure u can always enabled this\r\n // If the movement is really that big it's probably better to use the mySplitMovementEnabled flag and split the movement check into smaller movements\r\n this.myHorizontalMovementStepEnabled = false;\r\n this.myHorizontalMovementStepMaxLength = 0;\r\n\r\n this.myHorizontalMovementRadialStepAmount = 0;\r\n this.myHorizontalMovementCheckDiagonalOutward = false;\r\n this.myHorizontalMovementCheckDiagonalInward = false;\r\n this.myHorizontalMovementCheckStraight = false;\r\n this.myHorizontalMovementCheckHorizontalBorder = false;\r\n this.myHorizontalMovementCheckVerticalStraight = false;\r\n this.myHorizontalMovementCheckVerticalDiagonalUpwardOutward = false;\r\n this.myHorizontalMovementCheckVerticalDiagonalUpwardInward = false;\r\n this.myHorizontalMovementCheckVerticalDiagonalDownwardOutward = false;\r\n this.myHorizontalMovementCheckVerticalDiagonalDownwardInward = false;\r\n this.myHorizontalMovementCheckVerticalStraightDiagonalUpward = false;\r\n this.myHorizontalMovementCheckVerticalStraightDiagonalDownward = false;\r\n this.myHorizontalMovementCheckVerticalHorizontalBorderDiagonalOutward = false;\r\n this.myHorizontalMovementCheckVerticalHorizontalBorderDiagonalInward = false;\r\n this.myHorizontalMovementHorizontalStraightCentralCheckEnabled = false;\r\n this.myHorizontalMovementVerticalStraightCentralCheckEnabled = false;\r\n this.myHorizontalMovementVerticalStraightDiagonalUpwardCentralCheckEnabled = false;\r\n this.myHorizontalMovementVerticalStraightDiagonalDownwardCentralCheckEnabled = false;\r\n\r\n this.myHorizontalPositionCheckEnabled = false;\r\n\r\n this.myHalfConeAngle = 0;\r\n this.myHalfConeSliceAmount = 0;\r\n this.myCheckConeBorder = false;\r\n this.myCheckConeRay = false;\r\n this.myHorizontalPositionCheckVerticalIgnoreHitsInsideCollision = true; // True gives less issues(tm), but may also collide a bit more, resulting in less sliding\r\n this.myHorizontalPositionCheckVerticalDirectionType = 0; // Somewhat expensive, 2 times the check for the vertical check of the horizontal movement!\r\n // 0: check upward, gives less issues(tm) (hitting a very small step at the end of a slope /-) with a grounded movement (not fly or snapped to ceiling), but may also collide a bit more, resulting in less sliding\r\n // 1: check downard, gives less issues(tm) with a ceiling-ed movement (not fly or snapped to ground), but may also collide a bit more, resulting in less sliding and more stuck in front of a wall\r\n // 2: check both directions, more expensive and better prevent collision, sliding more, but is more expensive and gives more issues \r\n // ___\r\n // The issues(tm) means that a small step at the end of a slope, maybe due to 2 rectangles, one for the floor and the other for the slope like this -> / \r\n // can create a small step if the floor rectangle is a bit above the end of the slope, this will make the character get stuck thinking it's a wall\r\n // 0 avoid this issue for a grounded movement, 2 instead do a more \"aggressive\" vertical check that makes the character get less stuck in other situations, but can get stuck in this one\r\n // The better solution is to properly create the level, and if possible combine the 2 rectangles by having the floor a little below the end of the slope\r\n // The step that is created \"on the other side\" in fact can easily be ignored thanks to the myDistanceFromFeetToIgnore field\r\n // If the level is properly created the best solution should be myHorizontalPositionCheckVerticalIgnoreHitsInsideCollision = false and myHorizontalPositionCheckVerticalDirectionType = 0\r\n\r\n this.myCheckHorizontalFixedForwardEnabled = false; // This is basically only useful if the cone angle is 180 degrees\r\n this.myCheckHorizontalFixedForward = vec3_create();\r\n\r\n this.myVerticalMovementCheckEnabled = false;\r\n this.myVerticalPositionCheckEnabled = false;\r\n this.myFeetRadius = 0;\r\n\r\n this.myAdjustVerticalMovementWithGroundAngleDownhill = false;\r\n this.myAdjustVerticalMovementWithGroundAngleUphill = false;\r\n this.myAdjustVerticalMovementWithGroundAngleDownhillMaxAngle = null;\r\n this.myAdjustVerticalMovementWithGroundAngleUphillMaxAngle = null;\r\n this.myAdjustVerticalMovementWithGroundAngleDownhillMaxPerceivedAngle = null;\r\n this.myAdjustVerticalMovementWithGroundAngleUphillMaxPerceivedAngle = null;\r\n this.myAdjustHorizontalMovementWithGroundAngleDownhill = false;\r\n this.myAdjustHorizontalMovementWithGroundAngleDownhillMinAngle = null;\r\n\r\n this.myAdjustVerticalMovementWithCeilingAngleDownhill = false;\r\n this.myAdjustVerticalMovementWithCeilingAngleUphill = false;\r\n this.myAdjustVerticalMovementWithCeilingAngleDownhillMaxAngle = null;\r\n this.myAdjustVerticalMovementWithCeilingAngleUphillMaxAngle = null;\r\n this.myAdjustVerticalMovementWithCeilingAngleDownhillMaxAngle = null;\r\n this.myAdjustVerticalMovementWithCeilingAngleUphillMaxAngle = null;\r\n this.myAdjustHorizontalMovementWithCeilingAngleDownhill = false;\r\n this.myAdjustHorizontalMovementWithCeilingAngleDownhillMinAngle = null;\r\n\r\n this.myCheckVerticalFixedForwardEnabled = false;\r\n this.myCheckVerticalFixedForward = vec3_create();\r\n this.myCheckVerticalBothDirection = false;\r\n this.myCheckVerticalPositionBothDirection = false;\r\n\r\n this.mySnapOnGroundEnabled = false;\r\n this.mySnapOnGroundExtraDistance = 0;\r\n this.mySnapOnCeilingEnabled = false;\r\n this.mySnapOnCeilingExtraDistance = 0;\r\n\r\n this.myGroundPopOutEnabled = false;\r\n this.myGroundPopOutExtraDistance = 0;\r\n this.myCeilingPopOutEnabled = false;\r\n this.myCeilingPopOutExtraDistance = 0;\r\n\r\n this.myVerticalMovementReduceEnabled = false;\r\n\r\n this.myGroundCircumferenceAddCenter = false;\r\n this.myGroundCircumferenceSliceAmount = 0;\r\n this.myGroundCircumferenceStepAmount = 0;\r\n this.myGroundCircumferenceRotationPerStep = 0;\r\n this.myVerticalAllowHitInsideCollisionIfOneOk = false;\r\n\r\n this.myCheckHeight = false;\r\n this.myCheckHeightVerticalMovement = false;\r\n this.myCheckHeightVerticalPosition = false;\r\n this.myCheckHeightTopMovement = false;\r\n this.myCheckHeightTopPosition = false;\r\n this.myCheckHeightConeOnCollision = false;\r\n this.myCheckHeightConeOnCollisionKeepHit = false;\r\n // If true and myCheckHeightConeOnCollision is true, if the cone does not hit the height hit will be restored\r\n // The fact that the cone does not hit could be due to the fact that it thinks that the collision can be ignored though, sop restoring can be a bit safer but also collide more\r\n\r\n this.myHeightCheckStepAmountMovement = 0;\r\n this.myHeightCheckStepAmountPosition = 0;\r\n this.myCheckVerticalStraight = false;\r\n this.myCheckVerticalDiagonalRayOutward = false;\r\n this.myCheckVerticalDiagonalRayInward = false;\r\n this.myCheckVerticalDiagonalBorderOutward = false;\r\n this.myCheckVerticalDiagonalBorderInward = false;\r\n this.myCheckVerticalDiagonalBorderRayOutward = false;\r\n this.myCheckVerticalDiagonalBorderRayInward = false;\r\n this.myCheckVerticalSearchFartherVerticalHit = false; // Somewhat expensive, but can help fix sime sliding issues\r\n\r\n this.myGroundAngleToIgnore = 0;\r\n this.myGroundAngleToIgnoreWithPerceivedAngle = null;\r\n this.myCeilingAngleToIgnore = 0;\r\n this.myCeilingAngleToIgnoreWithPerceivedAngle = null;\r\n\r\n this.myHorizontalMovementGroundAngleIgnoreHeight = null;\r\n this.myHorizontalMovementCeilingAngleIgnoreHeight = null;\r\n this.myHorizontalPositionGroundAngleIgnoreHeight = null;\r\n this.myHorizontalPositionCeilingAngleIgnoreHeight = null;\r\n\r\n this.myHorizontalMovementGroundAngleIgnoreMaxMovementLeft = null;\r\n this.myHorizontalMovementCeilingAngleIgnoreMaxMovementLeft = null;\r\n\r\n this.myHeight = 0;\r\n\r\n this.myComputeGroundInfoEnabled = false;\r\n this.myComputeCeilingInfoEnabled = false;\r\n this.myDistanceToBeOnGround = 0;\r\n this.myDistanceToComputeGroundInfo = 0;\r\n this.myDistanceToBeOnCeiling = 0;\r\n this.myDistanceToComputeCeilingInfo = 0;\r\n this.myVerticalFixToBeOnGround = 0;\r\n this.myVerticalFixToComputeGroundInfo = 0;\r\n this.myVerticalFixToBeOnCeiling = 0;\r\n this.myVerticalFixToComputeCeilingInfo = 0;\r\n this.myGroundIsBaseInsideCollisionCheckEnabled = false;\r\n this.myCeilingIsBaseInsideCollisionCheckEnabled = false;\r\n this.myIsOnGroundIfInsideHit = false;\r\n this.myIsOnCeilingIfInsideHit = false;\r\n this.myIsOnGroundMaxSurfaceAngle = null;\r\n this.myIsOnCeilingMaxSurfaceAngle = null;\r\n this.myFindGroundDistanceMaxOutsideDistance = 0;\r\n this.myFindGroundDistanceMaxInsideDistance = 0;\r\n this.myFindCeilingDistanceMaxOutsideDistance = 0;\r\n this.myFindCeilingDistanceMaxInsideDistance = 0;\r\n this.myCollectGroundCollisionHitOutsideDistance = 0;\r\n this.myCollectGroundCollisionHitInsideDistance = 0;\r\n this.myCollectCeilingCollisionHitOutsideDistance = 0;\r\n this.myCollectCeilingCollisionHitInsideDistance = 0;\r\n\r\n this.myAllowGroundSteepFix = false;\r\n this.myAllowCeilingSteepFix = false;\r\n this.myMustStayOnGround = false;\r\n this.myMustStayOnCeiling = false;\r\n this.myMustStayOnValidGroundAngleDownhill = false;\r\n this.myMustStayOnValidCeilingAngleDownhill = false;\r\n this.myRegatherGroundInfoOnSurfaceCheckFail = false;\r\n this.myRegatherCeilingInfoOnSurfaceCheckFail = false;\r\n this.myMustStayBelowIgnorableGroundAngleDownhill = false;\r\n this.myMustStayBelowIgnorableCeilingAngleDownhill = false;\r\n this.myMustStayBelowGroundAngleDownhill = null;\r\n this.myMustStayBelowCeilingAngleDownhill = null;\r\n this.myMovementMustStayOnGroundHitAngle = null;\r\n this.myMovementMustStayOnCeilingHitAngle = null;\r\n\r\n this.myTeleportMustBeOnIgnorableGroundAngle = false;\r\n this.myCheckTransformMustBeOnIgnorableGroundAngle = false;\r\n this.myTeleportMustBeOnIgnorableCeilingAngle = false;\r\n this.myCheckTransformMustBeOnIgnorableCeilingAngle = false;\r\n\r\n this.myTeleportMustBeOnGroundAngle = null;\r\n this.myCheckTransformMustBeOnGroundAngle = null;\r\n this.myTeleportMustBeOnCeilingAngle = null;\r\n this.myCheckTransformMustBeOnCeilingAngle = null;\r\n\r\n this.myTeleportMustBeOnGround = false;\r\n this.myCheckTransformMustBeOnGround = false;\r\n this.myTeleportMustBeOnCeiling = false;\r\n this.myCheckTransformMustBeOnCeiling = false;\r\n\r\n this.mySlidingEnabled = false;\r\n this.mySlidingHorizontalMovementCheckBetterNormal = false;\r\n this.mySlidingMaxAttempts = 0;\r\n this.mySlidingCheckBothDirections = false; // Expensive, 2 times the check for the whole horizontal movement!\r\n // This can fix some edge cases in which u can get stuck instead of sliding\r\n // It basically require that u also add flicker prevention\r\n\r\n this.mySlidingFlickeringPreventionType = 0; // Expensive, 2 times the check for the whole horizontal movement!\r\n // 0: no prevention\r\n // 1: use previous frame data to understand if the sliding could flicker, this avoid stopping the movement when the flicker would just last some frames, \r\n // but also allows a bit of flicker that stabilize after 2-3 frames\r\n // 2: check when sliding collision angle is more then 90 degrees, prevents most flicker apart those on almost flat surfaces\r\n // 3: check 2 + check when sliding movement angle is more then 85 degrees, prevents almost all flicker, even on almost flat surfaces\r\n // 4: check every time\r\n //\r\n // From 3 and above you could have that the flicker prevents the movement when u expect it, because it's a more aggressive prevention\r\n // In case a fluid movement is more important than a bit of flicker from time to time, 1 is a better choice (which is also less expensive than 3 and above)\r\n // 2 is just a less expensive version of 3 (check less times) but also less precise, allowing more flickering\r\n\r\n this.mySlidingFlickeringPreventionCheckOnlyIfAlreadySliding = false;\r\n // This flag make it so the prevention is done only if it was already sliding, this can lead to a few frames of flicker if u go toward a corner directly\r\n // but allow the movement to be more fluid, avoiding getting stuck\r\n\r\n this.mySlidingFlickerPreventionCheckAnywayCounter = 0;\r\n // If the collision think it needs to check for flicker, it will keep checking for the next X frames based on this value even if the condition are not met anymore\r\n // This help in catching the flicker when the direction is not changing every frame but every 2-3 for example\r\n // It's especially useful if combo-ed with mySlidingFlickeringPreventionType == 1, making it a bit less fluid but also less flickering\r\n\r\n this.mySlidingAdjustSign90Degrees = false;\r\n\r\n this.myHorizontalBlockLayerFlags = new PhysicsLayerFlags();\r\n this.myHorizontalObjectsToIgnore = [];\r\n\r\n // #TODO it should just hit NORMAL colliders, but for perf reasons since I need to get the component from the object it's better to keep it like this\r\n // When changing this to NORMAL, do also remember to update the other place like player teleport where BOTH is also used to NORMAL\r\n this.myHorizontalBlockColliderType = RaycastBlockColliderType.BOTH;\r\n\r\n this.myVerticalBlockLayerFlags = new PhysicsLayerFlags();\r\n this.myVerticalObjectsToIgnore = [];\r\n\r\n // #TODO it should just hit NORMAL colliders, but for perf reasons since I need to get the component from the object it's better to keep it like this\r\n // When changing this to NORMAL, do also remember to update the other place like player teleport where BOTH is also used to NORMAL\r\n this.myVerticalBlockColliderType = RaycastBlockColliderType.BOTH;\r\n\r\n this.myExtraMovementCheckCallback = null; // Signature: callback(startMovement, endMovement, currentPosition, currentTransformUp, currentTransformForward, currentHeight, collisionCheckParams, prevCollisionRuntimeParams, outCollisionRuntimeParams, outFixedMovement) -> outFixedMovement\r\n this.myExtraTeleportCheckCallback = null; // Signature: callback(collisionRuntimeParams) -> bool\r\n this.myExtraCheckTransformCheckCallback = null; // Signature: callback(collisionRuntimeParams) -> bool\r\n\r\n this.myDebugEnabled = false;\r\n\r\n this.myDebugHorizontalMovementEnabled = false;\r\n this.myDebugHorizontalPositionEnabled = false;\r\n this.myDebugVerticalMovementEnabled = false;\r\n this.myDebugVerticalPositionEnabled = false;\r\n this.myDebugSlidingEnabled = false;\r\n this.myDebugGroundInfoEnabled = false;\r\n this.myDebugCeilingInfoEnabled = false;\r\n this.myDebugRuntimeParamsEnabled = false;\r\n this.myDebugMovementEnabled = false;\r\n\r\n /** Internal Flags */\r\n\r\n this._myInternalSplitMovementMaxStepsDisabled = false; // Specifically used when the movement should be tested completely and not stop on max steps\r\n }\r\n\r\n copy(other) {\r\n if (this == other) return;\r\n\r\n this.mySplitMovementEnabled = other.mySplitMovementEnabled;\r\n this.mySplitMovementMaxLength = other.mySplitMovementMaxLength;\r\n this.mySplitMovementMaxLengthEnabled = other.mySplitMovementMaxLengthEnabled;\r\n this.mySplitMovementMaxLengthLastStepCanBeLonger = other.mySplitMovementMaxLengthLastStepCanBeLonger;\r\n this.mySplitMovementMaxSteps = other.mySplitMovementMaxSteps;\r\n this.mySplitMovementMaxStepsEnabled = other.mySplitMovementMaxStepsEnabled;\r\n this.mySplitMovementMinLength = other.mySplitMovementMinLength;\r\n this.mySplitMovementMinLengthEnabled = other.mySplitMovementMinLengthEnabled;\r\n this.mySplitMovementStopWhenHorizontalMovementCanceled = other.mySplitMovementStopWhenHorizontalMovementCanceled;\r\n this.mySplitMovementStopWhenVerticalMovementCanceled = other.mySplitMovementStopWhenVerticalMovementCanceled;\r\n this.mySplitMovementStopWhenVerticalMovementReduced = other.mySplitMovementStopWhenVerticalMovementReduced;\r\n this.mySplitMovementStopCallback = other.mySplitMovementStopCallback;\r\n this.mySplitMovementStopReturnPrevious = other.mySplitMovementStopReturnPrevious;\r\n this.mySplitMovementStopAndFailIfMovementWouldBeReduced = other.mySplitMovementStopAndFailIfMovementWouldBeReduced;\r\n\r\n this.myRadius = other.myRadius;\r\n this.myDistanceFromFeetToIgnore = other.myDistanceFromFeetToIgnore;\r\n this.myDistanceFromHeadToIgnore = other.myDistanceFromHeadToIgnore;\r\n\r\n this.myPositionOffsetLocal.vec3_copy(other.myPositionOffsetLocal);\r\n this.myRotationOffsetLocalQuat.quat_copy(other.myRotationOffsetLocalQuat);\r\n\r\n this.myHorizontalMovementCheckEnabled = other.myHorizontalMovementCheckEnabled;\r\n this.myHorizontalMovementStepEnabled = other.myHorizontalMovementStepEnabled;\r\n this.myHorizontalMovementStepMaxLength = other.myHorizontalMovementStepMaxLength;\r\n this.myHorizontalMovementRadialStepAmount = other.myHorizontalMovementRadialStepAmount;\r\n this.myHorizontalMovementCheckDiagonalOutward = other.myHorizontalMovementCheckDiagonalOutward;\r\n this.myHorizontalMovementCheckDiagonalInward = other.myHorizontalMovementCheckDiagonalInward;\r\n this.myHorizontalMovementCheckStraight = other.myHorizontalMovementCheckStraight;\r\n this.myHorizontalMovementCheckHorizontalBorder = other.myHorizontalMovementCheckHorizontalBorder;\r\n this.myHorizontalMovementCheckVerticalStraight = other.myHorizontalMovementCheckVerticalStraight;\r\n this.myHorizontalMovementCheckVerticalDiagonalUpwardOutward = other.myHorizontalMovementCheckVerticalDiagonalUpwardOutward;\r\n this.myHorizontalMovementCheckVerticalDiagonalUpwardInward = other.myHorizontalMovementCheckVerticalDiagonalUpwardInward;\r\n this.myHorizontalMovementCheckVerticalDiagonalDownwardOutward = other.myHorizontalMovementCheckVerticalDiagonalDownwardOutward;\r\n this.myHorizontalMovementCheckVerticalDiagonalDownwardInward = other.myHorizontalMovementCheckVerticalDiagonalDownwardInward;\r\n this.myHorizontalMovementCheckVerticalStraightDiagonalUpward = other.myHorizontalMovementCheckVerticalStraightDiagonalUpward;\r\n this.myHorizontalMovementCheckVerticalStraightDiagonalDownward = other.myHorizontalMovementCheckVerticalStraightDiagonalDownward;\r\n this.myHorizontalMovementCheckVerticalHorizontalBorderDiagonalOutward = other.myHorizontalMovementCheckVerticalHorizontalBorderDiagonalOutward;\r\n this.myHorizontalMovementCheckVerticalHorizontalBorderDiagonalInward = other.myHorizontalMovementCheckVerticalHorizontalBorderDiagonalInward;\r\n this.myHorizontalMovementHorizontalStraightCentralCheckEnabled = other.myHorizontalMovementHorizontalStraightCentralCheckEnabled;\r\n this.myHorizontalMovementVerticalStraightCentralCheckEnabled = other.myHorizontalMovementVerticalStraightCentralCheckEnabled;\r\n this.myHorizontalMovementVerticalStraightDiagonalUpwardCentralCheckEnabled = other.myHorizontalMovementVerticalStraightDiagonalUpwardCentralCheckEnabled;\r\n this.myHorizontalMovementVerticalStraightDiagonalDownwardCentralCheckEnabled = other.myHorizontalMovementVerticalStraightDiagonalDownwardCentralCheckEnabled;\r\n\r\n this.myHorizontalPositionCheckEnabled = other.myHorizontalPositionCheckEnabled;\r\n this.myHalfConeAngle = other.myHalfConeAngle;\r\n this.myHalfConeSliceAmount = other.myHalfConeSliceAmount;\r\n this.myCheckConeBorder = other.myCheckConeBorder;\r\n this.myCheckConeRay = other.myCheckConeRay;\r\n this.myHorizontalPositionCheckVerticalIgnoreHitsInsideCollision = other.myHorizontalPositionCheckVerticalIgnoreHitsInsideCollision;\r\n this.myHorizontalPositionCheckVerticalDirectionType = other.myHorizontalPositionCheckVerticalDirectionType;\r\n\r\n this.myVerticalMovementCheckEnabled = other.myVerticalMovementCheckEnabled;\r\n this.myVerticalPositionCheckEnabled = other.myVerticalPositionCheckEnabled;\r\n this.myFeetRadius = other.myFeetRadius;\r\n\r\n this.myAdjustVerticalMovementWithGroundAngleDownhill = other.myAdjustVerticalMovementWithGroundAngleDownhill;\r\n this.myAdjustVerticalMovementWithGroundAngleUphill = other.myAdjustVerticalMovementWithGroundAngleUphill;\r\n this.myAdjustVerticalMovementWithGroundAngleDownhillMaxAngle = other.myAdjustVerticalMovementWithGroundAngleDownhillMaxAngle;\r\n this.myAdjustVerticalMovementWithGroundAngleUphillMaxAngle = other.myAdjustVerticalMovementWithGroundAngleUphillMaxAngle;\r\n this.myAdjustVerticalMovementWithGroundAngleDownhillMaxPerceivedAngle = other.myAdjustVerticalMovementWithGroundAngleDownhillMaxPerceivedAngle;\r\n this.myAdjustVerticalMovementWithGroundAngleUphillMaxPerceivedAngle = other.myAdjustVerticalMovementWithGroundAngleUphillMaxPerceivedAngle;\r\n this.myAdjustHorizontalMovementWithGroundAngleDownhill = other.myAdjustHorizontalMovementWithGroundAngleDownhill;\r\n this.myAdjustHorizontalMovementWithGroundAngleDownhillMinAngle = other.myAdjustHorizontalMovementWithGroundAngleDownhillMinAngle;\r\n\r\n this.myAdjustVerticalMovementWithCeilingAngleDownhill = other.myAdjustVerticalMovementWithCeilingAngleDownhill;\r\n this.myAdjustVerticalMovementWithCeilingAngleUphill = other.myAdjustVerticalMovementWithCeilingAngleUphill;\r\n this.myAdjustVerticalMovementWithCeilingAngleDownhillMaxAngle = other.myAdjustVerticalMovementWithCeilingAngleDownhillMaxAngle;\r\n this.myAdjustVerticalMovementWithCeilingAngleUphillMaxAngle = other.myAdjustVerticalMovementWithCeilingAngleUphillMaxAngle;\r\n this.myAdjustVerticalMovementWithCeilingAngleDownhillMaxAngle = other.myAdjustVerticalMovementWithCeilingAngleDownhillMaxAngle;\r\n this.myAdjustVerticalMovementWithCeilingAngleUphillMaxAngle = other.myAdjustVerticalMovementWithCeilingAngleUphillMaxAngle;\r\n this.myAdjustHorizontalMovementWithCeilingAngleDownhill = other.myAdjustHorizontalMovementWithCeilingAngleDownhill;\r\n this.myAdjustHorizontalMovementWithCeilingAngleDownhillMinAngle = other.myAdjustHorizontalMovementWithCeilingAngleDownhillMinAngle;\r\n\r\n this.myCheckVerticalFixedForwardEnabled = other.myCheckVerticalFixedForwardEnabled;\r\n this.myCheckVerticalFixedForward.vec3_copy(other.myCheckVerticalFixedForward);\r\n this.myCheckVerticalBothDirection = other.myCheckVerticalBothDirection;\r\n this.myCheckVerticalPositionBothDirection = other.myCheckVerticalPositionBothDirection;\r\n\r\n this.mySnapOnGroundEnabled = other.mySnapOnGroundEnabled;\r\n this.mySnapOnGroundExtraDistance = other.mySnapOnGroundExtraDistance;\r\n this.mySnapOnCeilingEnabled = other.mySnapOnCeilingEnabled;\r\n this.mySnapOnCeilingExtraDistance = other.mySnapOnCeilingExtraDistance;\r\n\r\n this.myGroundPopOutEnabled = other.myGroundPopOutEnabled;\r\n this.myGroundPopOutExtraDistance = other.myGroundPopOutExtraDistance;\r\n this.myCeilingPopOutEnabled = other.myCeilingPopOutEnabled;\r\n this.myCeilingPopOutExtraDistance = other.myCeilingPopOutExtraDistance;\r\n\r\n this.myVerticalMovementReduceEnabled = other.myVerticalMovementReduceEnabled;\r\n\r\n this.myGroundCircumferenceAddCenter = other.myGroundCircumferenceAddCenter;\r\n this.myGroundCircumferenceSliceAmount = other.myGroundCircumferenceSliceAmount;\r\n this.myGroundCircumferenceStepAmount = other.myGroundCircumferenceStepAmount;\r\n this.myGroundCircumferenceRotationPerStep = other.myGroundCircumferenceRotationPerStep;\r\n this.myVerticalAllowHitInsideCollisionIfOneOk = other.myVerticalAllowHitInsideCollisionIfOneOk;\r\n\r\n this.myCheckHeight = other.myCheckHeight;\r\n this.myCheckHeightVerticalMovement = other.myCheckHeightVerticalMovement;\r\n this.myCheckHeightVerticalPosition = other.myCheckHeightVerticalPosition;\r\n this.myCheckHeightTopMovement = other.myCheckHeightTopMovement;\r\n this.myCheckHeightTopPosition = other.myCheckHeightTopPosition;\r\n this.myCheckHeightConeOnCollision = other.myCheckHeightConeOnCollision;\r\n this.myCheckHeightConeOnCollisionKeepHit = other.myCheckHeightConeOnCollisionKeepHit;\r\n this.myHeightCheckStepAmountMovement = other.myHeightCheckStepAmountMovement;\r\n this.myHeightCheckStepAmountPosition = other.myHeightCheckStepAmountPosition;\r\n this.myCheckVerticalStraight = other.myCheckVerticalStraight;\r\n this.myCheckVerticalDiagonalRayOutward = other.myCheckVerticalDiagonalRayOutward;\r\n this.myCheckVerticalDiagonalRayInward = other.myCheckVerticalDiagonalRayInward;\r\n this.myCheckVerticalDiagonalBorderOutward = other.myCheckVerticalDiagonalBorderOutward;\r\n this.myCheckVerticalDiagonalBorderInward = other.myCheckVerticalDiagonalBorderInward;\r\n this.myCheckVerticalDiagonalBorderRayOutward = other.myCheckVerticalDiagonalBorderRayOutward;\r\n this.myCheckVerticalDiagonalBorderRayInward = other.myCheckVerticalDiagonalBorderRayInward;\r\n this.myCheckVerticalSearchFartherVerticalHit = other.myCheckVerticalSearchFartherVerticalHit;\r\n\r\n this.myGroundAngleToIgnore = other.myGroundAngleToIgnore;\r\n this.myGroundAngleToIgnoreWithPerceivedAngle = other.myGroundAngleToIgnoreWithPerceivedAngle;\r\n this.myCeilingAngleToIgnore = other.myCeilingAngleToIgnore;\r\n this.myCeilingAngleToIgnoreWithPerceivedAngle = other.myCeilingAngleToIgnoreWithPerceivedAngle;\r\n\r\n this.myHorizontalMovementGroundAngleIgnoreHeight = other.myHorizontalMovementGroundAngleIgnoreHeight;\r\n this.myHorizontalMovementCeilingAngleIgnoreHeight = other.myHorizontalMovementCeilingAngleIgnoreHeight;\r\n this.myHorizontalPositionGroundAngleIgnoreHeight = other.myHorizontalPositionGroundAngleIgnoreHeight;\r\n this.myHorizontalPositionCeilingAngleIgnoreHeight = other.myHorizontalPositionCeilingAngleIgnoreHeight;\r\n\r\n this.myHorizontalMovementGroundAngleIgnoreMaxMovementLeft = other.myHorizontalMovementGroundAngleIgnoreMaxMovementLeft;\r\n this.myHorizontalMovementCeilingAngleIgnoreMaxMovementLeft = other.myHorizontalMovementCeilingAngleIgnoreMaxMovementLeft;\r\n\r\n this.myHeight = other.myHeight;\r\n\r\n this.myComputeGroundInfoEnabled = other.myComputeGroundInfoEnabled;\r\n this.myComputeCeilingInfoEnabled = other.myComputeCeilingInfoEnabled;\r\n this.myDistanceToBeOnGround = other.myDistanceToBeOnGround;\r\n this.myDistanceToComputeGroundInfo = other.myDistanceToComputeGroundInfo;\r\n this.myDistanceToBeOnCeiling = other.myDistanceToBeOnCeiling;\r\n this.myDistanceToComputeCeilingInfo = other.myDistanceToComputeCeilingInfo;\r\n this.myVerticalFixToBeOnGround = other.myVerticalFixToBeOnGround;\r\n this.myVerticalFixToComputeGroundInfo = other.myVerticalFixToComputeGroundInfo;\r\n this.myVerticalFixToBeOnCeiling = other.myVerticalFixToBeOnCeiling;\r\n this.myVerticalFixToComputeCeilingInfo = other.myVerticalFixToComputeCeilingInfo;\r\n this.myGroundIsBaseInsideCollisionCheckEnabled = other.myGroundIsBaseInsideCollisionCheckEnabled;\r\n this.myCeilingIsBaseInsideCollisionCheckEnabled = other.myCeilingIsBaseInsideCollisionCheckEnabled;\r\n this.myIsOnGroundIfInsideHit = other.myIsOnGroundIfInsideHit;\r\n this.myIsOnCeilingIfInsideHit = other.myIsOnCeilingIfInsideHit;\r\n this.myIsOnGroundMaxSurfaceAngle = other.myIsOnGroundMaxSurfaceAngle;\r\n this.myIsOnCeilingMaxSurfaceAngle = other.myIsOnCeilingMaxSurfaceAngle;\r\n this.myFindGroundDistanceMaxOutsideDistance = other.myFindGroundDistanceMaxOutsideDistance;\r\n this.myFindGroundDistanceMaxInsideDistance = other.myFindGroundDistanceMaxInsideDistance;\r\n this.myFindCeilingDistanceMaxOutsideDistance = other.myFindCeilingDistanceMaxOutsideDistance;\r\n this.myFindCeilingDistanceMaxInsideDistance = other.myFindCeilingDistanceMaxInsideDistance;\r\n this.myCollectGroundCollisionHitOutsideDistance = other.myCollectGroundCollisionHitOutsideDistance;\r\n this.myCollectGroundCollisionHitInsideDistance = other.myCollectGroundCollisionHitInsideDistance;\r\n this.myCollectCeilingCollisionHitOutsideDistance = other.myCollectCeilingCollisionHitOutsideDistance;\r\n this.myCollectCeilingCollisionHitInsideDistance = other.myCollectCeilingCollisionHitInsideDistance;\r\n\r\n this.myAllowGroundSteepFix = other.myAllowGroundSteepFix;\r\n this.myAllowCeilingSteepFix = other.myAllowCeilingSteepFix;\r\n this.myMustStayOnGround = other.myMustStayOnGround;\r\n this.myMustStayOnCeiling = other.myMustStayOnCeiling;\r\n this.myMustStayOnValidGroundAngleDownhill = other.myMustStayOnValidGroundAngleDownhill;\r\n this.myMustStayOnValidCeilingAngleDownhill = other.myMustStayOnValidCeilingAngleDownhill;\r\n this.myRegatherGroundInfoOnSurfaceCheckFail = other.myRegatherGroundInfoOnSurfaceCheckFail;\r\n this.myRegatherCeilingInfoOnSurfaceCheckFail = other.myRegatherCeilingInfoOnSurfaceCheckFail;\r\n this.myMustStayBelowGroundAngleDownhill = other.myMustStayBelowGroundAngleDownhill;\r\n this.myMustStayBelowCeilingAngleDownhill = other.myMustStayBelowCeilingAngleDownhill;\r\n this.myMustStayBelowIgnorableGroundAngleDownhill = other.myMustStayBelowIgnorableGroundAngleDownhill;\r\n this.myMustStayBelowIgnorableCeilingAngleDownhill = other.myMustStayBelowIgnorableCeilingAngleDownhill;\r\n this.myMovementMustStayOnGroundHitAngle = other.myMovementMustStayOnGroundHitAngle;\r\n this.myMovementMustStayOnCeilingHitAngle = other.myMovementMustStayOnCeilingHitAngle;\r\n\r\n this.myTeleportMustBeOnIgnorableGroundAngle = other.myTeleportMustBeOnIgnorableGroundAngle;\r\n this.myCheckTransformMustBeOnIgnorableGroundAngle = other.myCheckTransformMustBeOnIgnorableGroundAngle;\r\n this.myTeleportMustBeOnIgnorableCeilingAngle = other.myTeleportMustBeOnIgnorableCeilingAngle;\r\n this.myCheckTransformMustBeOnIgnorableCeilingAngle = other.myCheckTransformMustBeOnIgnorableCeilingAngle;\r\n\r\n this.myTeleportMustBeOnGroundAngle = other.myTeleportMustBeOnGroundAngle;\r\n this.myCheckTransformMustBeOnGroundAngle = other.myCheckTransformMustBeOnGroundAngle;\r\n this.myTeleportMustBeOnCeilingAngle = other.myTeleportMustBeOnCeilingAngle;\r\n this.myCheckTransformMustBeOnCeilingAngle = other.myCheckTransformMustBeOnCeilingAngle;\r\n\r\n this.myTeleportMustBeOnGround = other.myTeleportMustBeOnGround;\r\n this.myCheckTransformMustBeOnGround = other.myCheckTransformMustBeOnGround;\r\n this.myTeleportMustBeOnCeiling = other.myTeleportMustBeOnCeiling;\r\n this.myCheckTransformMustBeOnCeiling = other.myCheckTransformMustBeOnCeiling;\r\n\r\n this.mySlidingEnabled = other.mySlidingEnabled;\r\n this.mySlidingHorizontalMovementCheckBetterNormal = other.mySlidingHorizontalMovementCheckBetterNormal;\r\n this.mySlidingMaxAttempts = other.mySlidingMaxAttempts;\r\n this.mySlidingCheckBothDirections = other.mySlidingCheckBothDirections;\r\n this.mySlidingFlickeringPreventionType = other.mySlidingFlickeringPreventionType;\r\n this.mySlidingFlickeringPreventionCheckOnlyIfAlreadySliding = other.mySlidingFlickeringPreventionCheckOnlyIfAlreadySliding;\r\n this.mySlidingFlickerPreventionCheckAnywayCounter = other.mySlidingFlickerPreventionCheckAnywayCounter;\r\n\r\n this.mySlidingAdjustSign90Degrees = other.mySlidingAdjustSign90Degrees;\r\n\r\n this.myHorizontalBlockLayerFlags.copy(other.myHorizontalBlockLayerFlags);\r\n this.myHorizontalObjectsToIgnore.pp_copy(other.myHorizontalObjectsToIgnore);\r\n this.myHorizontalBlockColliderType = other.myHorizontalBlockColliderType;\r\n\r\n this.myVerticalBlockLayerFlags.copy(other.myVerticalBlockLayerFlags);\r\n this.myVerticalObjectsToIgnore.pp_copy(other.myVerticalObjectsToIgnore);\r\n this.myVerticalBlockColliderType = other.myVerticalBlockColliderType;\r\n\r\n this.myExtraMovementCheckCallback = other.myExtraMovementCheckCallback;\r\n this.myExtraTeleportCheckCallback = other.myExtraTeleportCheckCallback;\r\n this.myExtraCheckTransformCheckCallback = other.myExtraCheckTransformCheckCallback;\r\n\r\n this.myDebugEnabled = other.myDebugEnabled;\r\n\r\n this.myDebugHorizontalMovementEnabled = other.myDebugHorizontalMovementEnabled;\r\n this.myDebugHorizontalPositionEnabled = other.myDebugHorizontalPositionEnabled;\r\n this.myDebugVerticalMovementEnabled = other.myDebugVerticalMovementEnabled;\r\n this.myDebugVerticalPositionEnabled = other.myDebugVerticalPositionEnabled;\r\n this.myDebugSlidingEnabled = other.myDebugSlidingEnabled;\r\n this.myDebugGroundInfoEnabled = other.myDebugGroundInfoEnabled;\r\n this.myDebugCeilingInfoEnabled = other.myDebugCeilingInfoEnabled;\r\n this.myDebugRuntimeParamsEnabled = other.myDebugRuntimeParamsEnabled;\r\n this.myDebugMovementEnabled = other.myDebugMovementEnabled;\r\n\r\n this._myInternalSplitMovementMaxStepsDisabled = other._myInternalSplitMovementMaxStepsDisabled;\r\n }\r\n}\r\n\r\nexport class CollisionRuntimeParams {\r\n\r\n constructor() {\r\n this.myOriginalPosition = vec3_create();\r\n this.myNewPosition = vec3_create();\r\n\r\n this.myOriginalHeight = 0;\r\n\r\n this.myOriginalForward = vec3_create();\r\n this.myOriginalUp = vec3_create();\r\n\r\n this.myOffsetUp = vec3_create();\r\n this.myTeleportForward = vec3_create();\r\n\r\n this.myOriginalMovement = vec3_create();\r\n this.myFixedMovement = vec3_create();\r\n\r\n this.myLastValidOriginalHorizontalMovement = vec3_create();\r\n this.myLastValidOriginalVerticalMovement = vec3_create();\r\n this.myLastValidSurfaceAdjustedHorizontalMovement = vec3_create();\r\n this.myLastValidSurfaceAdjustedVerticalMovement = vec3_create();\r\n this.myLastValidEndHorizontalMovement = vec3_create();\r\n this.myLastValidEndVerticalMovement = vec3_create();\r\n\r\n this.myIsOnGround = false;\r\n this.myGroundCollisionHit = new RaycastHit();\r\n this.myGroundAngle = 0;\r\n this.myGroundPerceivedAngle = 0;\r\n this.myGroundNormal = vec3_create();\r\n this.myGroundHitMaxAngle = 0;\r\n this.myGroundHitMaxNormal = vec3_create();\r\n this.myGroundDistance = null;\r\n this.myGroundIsBaseInsideCollision = false;\r\n\r\n this.myIsOnCeiling = false;\r\n this.myCeilingCollisionHit = new RaycastHit();\r\n this.myCeilingAngle = 0;\r\n this.myCeilingPerceivedAngle = 0;\r\n this.myCeilingNormal = vec3_create();\r\n this.myCeilingHitMaxAngle = 0;\r\n this.myCeilingHitMaxNormal = vec3_create();\r\n this.myCeilingDistance = null;\r\n this.myCeilingIsBaseInsideCollision = false;\r\n\r\n this.myHorizontalMovementCanceled = false; // Could add HorizontalMovementCanceledReason\r\n this.myIsCollidingHorizontally = false;\r\n this.myHorizontalCollisionHit = new RaycastHit();\r\n\r\n this.myVerticalMovementCanceled = false;\r\n this.myIsCollidingVertically = false;\r\n this.myVerticalCollisionHit = new RaycastHit();\r\n\r\n this.myHasSnappedOnGround = false;\r\n this.myHasSnappedOnCeiling = false;\r\n this.myHasPoppedOutGround = false;\r\n this.myHasPoppedOutCeiling = false;\r\n this.myHasReducedVerticalMovement = false;\r\n\r\n this.myHorizontalMovementHasAdjustedVerticalMovementOverGroundPerceivedAngleDownhill = false;\r\n this.myHorizontalMovementHasAdjustedVerticalMovementOverGroundPerceivedAngleUphill = false;\r\n this.myVerticalMovementHasAdjustedHorizontalMovementOverGroundAngleDownhill = false;\r\n\r\n this.myHorizontalMovementHasAdjustedVerticalMovementOverCeilingPerceivedAngleDownhill = false;\r\n this.myHorizontalMovementHasAdjustedVerticalMovementOverCeilingPerceivedAngleUphill = false;\r\n this.myVerticalMovementHasAdjustedHorizontalMovementOverCeilingAngleDownhill = false;\r\n\r\n this.myIsSliding = false;\r\n this.myIsSlidingIntoOppositeDirection = false;\r\n this.myIsSlidingFlickerPrevented = false;\r\n this.mySlidingFlickerPreventionCheckAnywayCounter = 0;\r\n this.mySlidingMovementAngle = 0;\r\n this.mySlidingCollisionAngle = 0;\r\n this.mySlidingCollisionHit = new RaycastHit();\r\n this.mySlidingWallNormal = new vec3_create();\r\n this.mySliding90DegreesSign = 0;\r\n this.mySlidingRecompute90DegreesSign = true;\r\n this.myLastValidIsSliding = false;\r\n this.mySlidingPreviousHorizontalMovement = vec3_create();\r\n\r\n this.myOriginalTeleportPosition = vec3_create();\r\n this.myFixedTeleportPosition = vec3_create();\r\n\r\n this.myOriginalPositionCheckPosition = vec3_create();\r\n this.myFixedPositionCheckPosition = vec3_create();\r\n\r\n this.myTeleportCanceled = false;\r\n\r\n this.myIsPositionOk = false;\r\n\r\n this.myIsTeleport = false; // Could be a single bool but not sure if there should be an option and don't want to create an enum for now\r\n this.myIsMove = false;\r\n this.myIsPositionCheck = false;\r\n this.myIsPositionCheckAllowAdjustments = false;\r\n\r\n this.mySplitMovementSteps = 0;\r\n this.mySplitMovementStepsPerformed = 0;\r\n this.mySplitMovementStop = false;\r\n this.mySplitMovementLastStepLongerThanMaxLength = false;\r\n this.mySplitMovementReduced = false;\r\n this.mySplitMovementMovementChecked = vec3_create();\r\n\r\n this.myRealIsOnGround = false;\r\n this.myRealIsOnCeiling = false;\r\n }\r\n\r\n reset() {\r\n this.myOriginalPosition.vec3_zero();\r\n this.myNewPosition.vec3_zero();\r\n\r\n this.myOriginalHeight = 0;\r\n\r\n this.myOriginalForward.vec3_zero();\r\n this.myOriginalUp.vec3_zero();\r\n\r\n this.myOffsetUp.vec3_zero();\r\n this.myTeleportForward.vec3_zero();\r\n\r\n this.myOriginalMovement.vec3_zero();\r\n this.myFixedMovement.vec3_zero();\r\n\r\n this.myLastValidOriginalHorizontalMovement.vec3_zero();\r\n this.myLastValidOriginalVerticalMovement.vec3_zero();\r\n this.myLastValidSurfaceAdjustedHorizontalMovement.vec3_zero();\r\n this.myLastValidSurfaceAdjustedVerticalMovement.vec3_zero();\r\n this.myLastValidEndHorizontalMovement.vec3_zero();\r\n this.myLastValidEndVerticalMovement.vec3_zero();\r\n\r\n\r\n this.myIsOnGround = false;\r\n this.myGroundCollisionHit.reset();\r\n this.myGroundAngle = 0;\r\n this.myGroundPerceivedAngle = 0;\r\n this.myGroundNormal.vec3_zero();\r\n this.myGroundHitMaxAngle = 0;\r\n this.myGroundHitMaxNormal.vec3_zero();\r\n this.myGroundDistance = null;\r\n this.myGroundIsBaseInsideCollision = false;\r\n\r\n this.myIsOnCeiling = false;\r\n this.myCeilingCollisionHit.reset();\r\n this.myCeilingAngle = 0;\r\n this.myCeilingPerceivedAngle = 0;\r\n this.myCeilingNormal.vec3_zero();\r\n this.myCeilingHitMaxAngle = 0;\r\n this.myCeilingHitMaxNormal.vec3_zero();\r\n this.myCeilingDistance = null;\r\n this.myCeilingIsBaseInsideCollision = false;\r\n\r\n this.myHorizontalMovementCanceled = false;\r\n this.myIsCollidingHorizontally = false;\r\n this.myHorizontalCollisionHit.reset();\r\n\r\n this.myVerticalMovementCanceled = false;\r\n this.myIsCollidingVertically = false;\r\n this.myVerticalCollisionHit.reset();\r\n\r\n this.myHasSnappedOnGround = false;\r\n this.myHasSnappedOnCeiling = false;\r\n this.myHasPoppedOutGround = false;\r\n this.myHasPoppedOutCeiling = false;\r\n this.myHasReducedVerticalMovement = false;\r\n\r\n this.myHorizontalMovementHasAdjustedVerticalMovementOverGroundPerceivedAngleDownhill = false;\r\n this.myHorizontalMovementHasAdjustedVerticalMovementOverGroundPerceivedAngleUphill = false;\r\n this.myVerticalMovementHasAdjustedHorizontalMovementOverGroundAngleDownhill = false;\r\n\r\n this.myHorizontalMovementHasAdjustedVerticalMovementOverCeilingPerceivedAngleDownhill = false;\r\n this.myHorizontalMovementHasAdjustedVerticalMovementOverCeilingPerceivedAngleUphill = false;\r\n this.myVerticalMovementHasAdjustedHorizontalMovementOverCeilingAngleDownhill = false;\r\n\r\n this.myIsSliding = false;\r\n this.myIsSlidingIntoOppositeDirection = false;\r\n this.myIsSlidingFlickerPrevented = false;\r\n this.mySlidingFlickerPreventionCheckAnywayCounter = 0;\r\n this.mySlidingMovementAngle = 0;\r\n this.mySlidingCollisionAngle = 0;\r\n this.mySlidingCollisionHit.reset();\r\n this.mySliding90DegreesSign = 0;\r\n this.mySlidingRecompute90DegreesSign = true;\r\n this.myLastValidIsSliding = false;\r\n this.mySlidingPreviousHorizontalMovement.vec3_zero();\r\n this.mySlidingWallNormal.vec3_zero();\r\n\r\n this.myOriginalTeleportPosition.vec3_zero();\r\n this.myFixedTeleportPosition.vec3_zero();\r\n\r\n this.myOriginalPositionCheckPosition.vec3_zero();\r\n this.myFixedPositionCheckPosition.vec3_zero();\r\n\r\n this.myTeleportCanceled = false;\r\n\r\n this.myIsPositionOk = false;\r\n\r\n this.myIsTeleport = false;\r\n this.myIsMove = false;\r\n this.myIsPositionCheck = false;\r\n this.myIsPositionCheckAllowAdjustments = false;\r\n\r\n this.mySplitMovementSteps = 0;\r\n this.mySplitMovementStepsPerformed = 0;\r\n this.mySplitMovementStop = false;\r\n this.mySplitMovementLastStepLongerThanMaxLength = false;\r\n this.mySplitMovementReduced = false;\r\n this.mySplitMovementMovementChecked.vec3_zero();\r\n\r\n this.myRealIsOnGround = false;\r\n this.myRealIsOnCeiling = false;\r\n }\r\n\r\n copy(other) {\r\n if (this == other) return;\r\n\r\n this.myOriginalPosition.vec3_copy(other.myOriginalPosition);\r\n this.myNewPosition.vec3_copy(other.myNewPosition);\r\n\r\n this.myOriginalHeight = other.myOriginalHeight;\r\n\r\n this.myOriginalForward.vec3_copy(other.myOriginalForward);\r\n this.myOriginalUp.vec3_copy(other.myOriginalUp);\r\n\r\n this.myOffsetUp.vec3_copy(other.myOffsetUp);\r\n this.myTeleportForward.vec3_copy(other.myTeleportForward);\r\n\r\n this.myOriginalMovement.vec3_copy(other.myOriginalMovement);\r\n this.myFixedMovement.vec3_copy(other.myFixedMovement);\r\n\r\n this.myLastValidOriginalHorizontalMovement.vec3_copy(other.myLastValidOriginalHorizontalMovement);\r\n this.myLastValidOriginalVerticalMovement.vec3_copy(other.myLastValidOriginalVerticalMovement);\r\n this.myLastValidSurfaceAdjustedHorizontalMovement.vec3_copy(other.myLastValidSurfaceAdjustedHorizontalMovement);\r\n this.myLastValidSurfaceAdjustedVerticalMovement.vec3_copy(other.myLastValidSurfaceAdjustedVerticalMovement);\r\n this.myLastValidEndHorizontalMovement.vec3_copy(other.myLastValidEndHorizontalMovement);\r\n this.myLastValidEndVerticalMovement.vec3_copy(other.myLastValidEndVerticalMovement);\r\n\r\n this.myIsOnGround = other.myIsOnGround;\r\n this.myGroundCollisionHit.copy(other.myGroundCollisionHit);\r\n this.myGroundAngle = other.myGroundAngle;\r\n this.myGroundPerceivedAngle = other.myGroundPerceivedAngle;\r\n this.myGroundNormal.vec3_copy(other.myGroundNormal);\r\n this.myGroundHitMaxAngle = other.myGroundHitMaxAngle;\r\n this.myGroundHitMaxNormal.vec3_copy(other.myGroundHitMaxNormal);\r\n this.myGroundDistance = other.myGroundDistance;\r\n this.myGroundIsBaseInsideCollision = other.myGroundIsBaseInsideCollision;\r\n\r\n this.myIsOnCeiling = other.myIsOnCeiling;\r\n this.myCeilingCollisionHit.copy(other.myCeilingCollisionHit);\r\n this.myCeilingAngle = other.myCeilingAngle;\r\n this.myCeilingPerceivedAngle = other.myCeilingPerceivedAngle;\r\n this.myCeilingNormal.vec3_copy(other.myCeilingNormal);\r\n this.myCeilingHitMaxAngle = other.myCeilingHitMaxAngle;\r\n this.myCeilingHitMaxNormal.vec3_copy(other.myCeilingHitMaxNormal);\r\n this.myCeilingDistance = other.myCeilingDistance;\r\n this.myCeilingIsBaseInsideCollision = other.myCeilingIsBaseInsideCollision;\r\n\r\n this.myHorizontalMovementCanceled = other.myHorizontalMovementCanceled;\r\n this.myIsCollidingHorizontally = other.myIsCollidingHorizontally;\r\n this.myHorizontalCollisionHit.copy(other.myHorizontalCollisionHit);\r\n\r\n this.myVerticalMovementCanceled = other.myVerticalMovementCanceled;\r\n this.myIsCollidingVertically = other.myIsCollidingVertically;\r\n this.myVerticalCollisionHit.copy(other.myVerticalCollisionHit);\r\n\r\n this.myHasSnappedOnGround = other.myHasSnappedOnGround;\r\n this.myHasSnappedOnCeiling = other.myHasSnappedOnCeiling;\r\n this.myHasPoppedOutGround = other.myHasPoppedOutGround;\r\n this.myHasPoppedOutCeiling = other.myHasPoppedOutCeiling;\r\n this.myHasReducedVerticalMovement = other.myHasReducedVerticalMovement;\r\n\r\n this.myHorizontalMovementHasAdjustedVerticalMovementOverGroundPerceivedAngleDownhill = other.myHorizontalMovementHasAdjustedVerticalMovementOverGroundPerceivedAngleDownhill;\r\n this.myHorizontalMovementHasAdjustedVerticalMovementOverGroundPerceivedAngleUphill = other.myHorizontalMovementHasAdjustedVerticalMovementOverGroundPerceivedAngleUphill;\r\n this.myVerticalMovementHasAdjustedHorizontalMovementOverGroundAngleDownhill = other.myVerticalMovementHasAdjustedHorizontalMovementOverGroundAngleDownhill;\r\n\r\n this.myHorizontalMovementHasAdjustedVerticalMovementOverCeilingPerceivedAngleDownhill = other.myHorizontalMovementHasAdjustedVerticalMovementOverCeilingPerceivedAngleDownhill;\r\n this.myHorizontalMovementHasAdjustedVerticalMovementOverCeilingPerceivedAngleUphill = other.myHorizontalMovementHasAdjustedVerticalMovementOverCeilingPerceivedAngleUphill;\r\n this.myVerticalMovementHasAdjustedHorizontalMovementOverCeilingAngleDownhill = other.myVerticalMovementHasAdjustedHorizontalMovementOverCeilingAngleDownhill;\r\n\r\n this.myIsSliding = other.myIsSliding;\r\n this.myIsSlidingIntoOppositeDirection = other.myIsSlidingIntoOppositeDirection;\r\n this.myIsSlidingFlickerPrevented = other.myIsSlidingFlickerPrevented;\r\n this.mySlidingFlickerPreventionCheckAnywayCounter = other.mySlidingFlickerPreventionCheckAnywayCounter;\r\n this.mySlidingMovementAngle = other.mySlidingMovementAngle;\r\n this.mySlidingCollisionAngle = other.mySlidingCollisionAngle;\r\n this.mySlidingCollisionHit.copy(other.mySlidingCollisionHit);\r\n this.mySliding90DegreesSign = other.mySliding90DegreesSign;\r\n this.mySlidingRecompute90DegreesSign = other.mySlidingRecompute90DegreesSign;\r\n this.myLastValidIsSliding = other.myLastValidIsSliding;\r\n this.mySlidingPreviousHorizontalMovement.vec3_copy(other.mySlidingPreviousHorizontalMovement);\r\n this.mySlidingWallNormal.vec3_copy(other.mySlidingWallNormal);\r\n\r\n this.myOriginalTeleportPosition.vec3_copy(other.myOriginalTeleportPosition);\r\n this.myFixedTeleportPosition.vec3_copy(other.myFixedTeleportPosition);\r\n this.myTeleportCanceled = other.myTeleportCanceled;\r\n\r\n this.myIsPositionOk = other.myIsPositionOk;\r\n\r\n this.myOriginalPositionCheckPosition.vec3_copy(other.myOriginalPositionCheckPosition);\r\n this.myFixedPositionCheckPosition.vec3_copy(other.myFixedPositionCheckPosition);\r\n\r\n this.myIsTeleport = other.myIsTeleport;\r\n this.myIsMove = other.myIsMove;\r\n this.myIsPositionCheck = other.myIsPositionCheck;\r\n this.myIsPositionCheckAllowAdjustments = other.myIsPositionCheckAllowAdjustments;\r\n\r\n this.mySplitMovementSteps = other.mySplitMovementSteps;\r\n this.mySplitMovementStepsPerformed = other.mySplitMovementStepsPerformed;\r\n this.mySplitMovementStop = other.mySplitMovementStop;\r\n this.mySplitMovementLastStepLongerThanMaxLength = other.mySplitMovementLastStepLongerThanMaxLength;\r\n this.mySplitMovementReduced = other.mySplitMovementReduced;\r\n this.mySplitMovementMovementChecked.vec3_copy(other.mySplitMovementMovementChecked);\r\n\r\n this.myRealIsOnGround = other.myRealIsOnGround;\r\n this.myRealIsOnCeiling = other.myRealIsOnCeiling;\r\n }\r\n}", "import { RaycastHit, RaycastParams, RaycastResults } from \"../../../../../../cauldron/physics/physics_raycast_params.js\";\r\nimport { PhysicsUtils } from \"../../../../../../cauldron/physics/physics_utils.js\";\r\nimport { quat2_create, vec3_create, vec4_create } from \"../../../../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Globals } from \"../../../../../../pp/globals.js\";\r\nimport { CollisionRuntimeParams } from \"./collision_params.js\";\r\n\r\nexport class CollisionCheckBase {\r\n\r\n constructor(engine = Globals.getMainEngine()) {\r\n this._myEngine = engine;\r\n\r\n this._myRaycastParams = new RaycastParams(Globals.getPhysics(this._myEngine));\r\n this._myRaycastResult = new RaycastResults();\r\n this._myFixRaycastResult = new RaycastResults();\r\n\r\n this._myBackupRaycastHit = new RaycastHit();\r\n\r\n this._myPrevCollisionRuntimeParams = new CollisionRuntimeParams();\r\n\r\n this._mySlidingCollisionRuntimeParams = new CollisionRuntimeParams();\r\n this._myCheckBetterSlidingNormalCollisionRuntimeParams = new CollisionRuntimeParams();\r\n this._myInternalSlidingCollisionRuntimeParams = new CollisionRuntimeParams();\r\n this._mySlidingFlickeringFixCollisionRuntimeParams = new CollisionRuntimeParams();\r\n this._mySlidingFlickeringFixSlidingCollisionRuntimeParams = new CollisionRuntimeParams();\r\n this._mySlidingOppositeDirectionCollisionRuntimeParams = new CollisionRuntimeParams();\r\n this._mySlidingOnVerticalCheckCollisionRuntimeParams = new CollisionRuntimeParams();\r\n\r\n this._myCollisionCheckDisabled = false;\r\n\r\n this._myDebugEnabled = false;\r\n\r\n this._myTotalRaycasts = 0;\r\n }\r\n\r\n isCollisionCheckDisabled() {\r\n return this._myCollisionCheckDisabled;\r\n }\r\n\r\n setCollisionCheckDisabled(collisionCheckDisabled) {\r\n this._myCollisionCheckDisabled = collisionCheckDisabled;\r\n }\r\n\r\n _raycastAndDebug(origin, direction, distance, ignoreHitsInsideCollision, isHorizontal, collisionCheckParams, collisionRuntimeParams) {\r\n // Implemented outside class definition\r\n }\r\n\r\n _setRuntimeParamsForMoveCollisionCheckDisabled(movement, transformQuat, collisionCheckParams, collisionRuntimeParams) {\r\n // Implemented outside class definition\r\n }\r\n\r\n _setRuntimeParamsForTeleportCollisionCheckDisabled(position, transformQuat, collisionCheckParams, collisionRuntimeParams) {\r\n // Implemented outside class definition\r\n }\r\n\r\n _setRuntimeParamsForPositionCheckCollisionCheckDisabled(allowFix, transformQuat, collisionCheckParams, collisionRuntimeParams) {\r\n // Implemented outside class definition\r\n }\r\n\r\n _setRuntimeParamsForUpdateSurfaceInfoCollisionCheckDisabled(transformQuat, collisionCheckParams, collisionRuntimeParams) {\r\n // Implemented outside class definition\r\n }\r\n\r\n _debugMovement(movement, fixedMovement, feetPosition, up, collisionCheckParams) {\r\n let originalHorizontalMovement = movement.vec3_removeComponentAlongAxis(up);\r\n\r\n let horizontalMovement = fixedMovement.vec3_removeComponentAlongAxis(up);\r\n let verticalMovement = fixedMovement.vec3_componentAlongAxis(up);\r\n\r\n let feetPositionPlusOffset = feetPosition.vec3_add(up.vec3_scale(collisionCheckParams.myDistanceFromFeetToIgnore + 0.001));\r\n\r\n if (!originalHorizontalMovement.vec3_isZero()) {\r\n originalHorizontalMovement.vec3_normalize(originalHorizontalMovement);\r\n\r\n Globals.getDebugVisualManager(this._myEngine).drawArrow(0, feetPositionPlusOffset, originalHorizontalMovement, 0.2, vec4_create(0.5, 0.5, 1, 1));\r\n }\r\n\r\n if (!horizontalMovement.vec3_isZero()) {\r\n horizontalMovement.vec3_normalize(horizontalMovement);\r\n\r\n Globals.getDebugVisualManager(this._myEngine).drawArrow(0, feetPositionPlusOffset, horizontalMovement, 0.2, vec4_create(0, 0, 1, 1));\r\n }\r\n\r\n if (!verticalMovement.vec3_isZero()) {\r\n verticalMovement.vec3_normalize(verticalMovement);\r\n\r\n Globals.getDebugVisualManager(this._myEngine).drawArrow(0, feetPosition, verticalMovement, 0.2, vec4_create(0, 0, 1, 1));\r\n }\r\n }\r\n\r\n _debugRuntimeParams(collisionRuntimeParams) {\r\n if (collisionRuntimeParams.myHorizontalCollisionHit.isValid()) {\r\n Globals.getDebugVisualManager(this._myEngine).drawArrow(0,\r\n collisionRuntimeParams.myHorizontalCollisionHit.myPosition,\r\n collisionRuntimeParams.myHorizontalCollisionHit.myNormal, 0.2, vec4_create(1, 0, 0, 1));\r\n }\r\n\r\n if (collisionRuntimeParams.mySlidingCollisionHit.isValid()) {\r\n Globals.getDebugVisualManager(this._myEngine).drawArrow(0,\r\n collisionRuntimeParams.mySlidingCollisionHit.myPosition,\r\n collisionRuntimeParams.mySlidingCollisionHit.myNormal, 0.2, vec4_create(1, 0, 0, 1));\r\n }\r\n\r\n if (collisionRuntimeParams.myVerticalCollisionHit.isValid()) {\r\n Globals.getDebugVisualManager(this._myEngine).drawArrow(0,\r\n collisionRuntimeParams.myVerticalCollisionHit.myPosition,\r\n collisionRuntimeParams.myVerticalCollisionHit.myNormal, 0.2, vec4_create(1, 0, 0, 1));\r\n }\r\n }\r\n}\r\n\r\n\r\n\r\n// IMPLEMENTATION\r\n\r\nCollisionCheckBase.prototype._raycastAndDebug = function () {\r\n let tempRaycastResult = new RaycastResults();\r\n return function _raycastAndDebug(origin, direction, distance, ignoreHitsInsideCollision, isHorizontal, collisionCheckParams, collisionRuntimeParams) {\r\n this._myRaycastParams.myOrigin.vec3_copy(origin);\r\n this._myRaycastParams.myDirection.vec3_copy(direction);\r\n this._myRaycastParams.myDistance = distance;\r\n\r\n if (isHorizontal) {\r\n this._myRaycastParams.myBlockLayerFlags.copy(collisionCheckParams.myHorizontalBlockLayerFlags);\r\n this._myRaycastParams.myObjectsToIgnore = collisionCheckParams.myHorizontalObjectsToIgnore;\r\n this._myRaycastParams.myBlockColliderType = collisionCheckParams.myHorizontalBlockColliderType;\r\n } else {\r\n this._myRaycastParams.myBlockLayerFlags.copy(collisionCheckParams.myVerticalBlockLayerFlags);\r\n this._myRaycastParams.myObjectsToIgnore = collisionCheckParams.myVerticalObjectsToIgnore;\r\n this._myRaycastParams.myBlockColliderType = collisionCheckParams.myVerticalBlockColliderType;\r\n }\r\n\r\n this._myRaycastParams.myIgnoreHitsInsideCollision = ignoreHitsInsideCollision;\r\n\r\n let raycastResult = null;\r\n\r\n let raycastPerformanceDebugEnabled = false;\r\n if (raycastPerformanceDebugEnabled && Globals.isDebugEnabled(this._myEngine)) {\r\n // Quick debug to remove raycasts and/or let all raycasts fail\r\n\r\n let raycastAlways = false;\r\n if (raycastAlways || !this._myRaycastResult.isColliding()) {\r\n raycastResult = PhysicsUtils.raycast(this._myRaycastParams, tempRaycastResult);\r\n }\r\n\r\n if (!this._myRaycastResult.isColliding() && tempRaycastResult.isColliding()) {\r\n this._myRaycastResult.copy(tempRaycastResult);\r\n }\r\n\r\n raycastResult = this._myRaycastResult;\r\n } else {\r\n raycastResult = PhysicsUtils.raycast(this._myRaycastParams, this._myRaycastResult);\r\n }\r\n\r\n\r\n this._myTotalRaycasts++;\r\n\r\n if (this._myDebugEnabled && Globals.isDebugEnabled(this._myEngine)) {\r\n Globals.getDebugVisualManager(this._myEngine).drawRaycast(0, raycastResult);\r\n }\r\n\r\n return raycastResult;\r\n };\r\n}();\r\n\r\nCollisionCheckBase.prototype._setRuntimeParamsForMoveCollisionCheckDisabled = function () {\r\n let transformOffsetLocalQuat = quat2_create();\r\n let offsetTransformQuat = quat2_create();\r\n return function _setRuntimeParamsForMoveCollisionCheckDisabled(movement, transformQuat, collisionCheckParams, collisionRuntimeParams) {\r\n collisionRuntimeParams.reset();\r\n\r\n collisionRuntimeParams.myRealIsOnGround = true;\r\n collisionRuntimeParams.myIsOnGround = true;\r\n collisionRuntimeParams.myGroundCollisionHit.reset();\r\n collisionRuntimeParams.myGroundAngle = 0;\r\n collisionRuntimeParams.myGroundPerceivedAngle = 0;\r\n collisionRuntimeParams.myGroundNormal.vec3_set(0, 1, 0);\r\n collisionRuntimeParams.myGroundHitMaxAngle = collisionRuntimeParams.myGroundAngle;\r\n collisionRuntimeParams.myGroundHitMaxNormal.vec3_copy(collisionRuntimeParams.myGroundNormal);\r\n collisionRuntimeParams.myGroundDistance = 0;\r\n collisionRuntimeParams.myGroundIsBaseInsideCollision = false;\r\n collisionRuntimeParams.myOnGroundDueToBasePartiallyInsideCollision = false;\r\n\r\n collisionRuntimeParams.myRealIsOnCeiling = false;\r\n collisionRuntimeParams.myIsOnCeiling = false;\r\n collisionRuntimeParams.myCeilingCollisionHit.reset();\r\n collisionRuntimeParams.myCeilingAngle = 0;\r\n collisionRuntimeParams.myCeilingPerceivedAngle = 0;\r\n collisionRuntimeParams.myCeilingNormal.vec3_set(0, 1, 0);\r\n collisionRuntimeParams.myCeilingHitMaxAngle = collisionRuntimeParams.myCeilingAngle;\r\n collisionRuntimeParams.myCeilingHitMaxNormal.vec3_copy(collisionRuntimeParams.myCeilingNormal);\r\n collisionRuntimeParams.myCeilingDistance = 0;\r\n collisionRuntimeParams.myCeilingIsBaseInsideCollision = false;\r\n collisionRuntimeParams.myOnCeilingDueToBasePartiallyInsideCollision = false;\r\n\r\n collisionRuntimeParams.mySplitMovementSteps = 1;\r\n collisionRuntimeParams.mySplitMovementStepsPerformed = 1;\r\n collisionRuntimeParams.mySplitMovementStop = false;\r\n collisionRuntimeParams.mySplitMovementMovementChecked.vec3_copy(movement);\r\n\r\n collisionRuntimeParams.myOriginalUp = transformQuat.quat2_getUp(collisionRuntimeParams.myOriginalUp);\r\n collisionRuntimeParams.myOriginalForward = transformQuat.quat2_getForward(collisionRuntimeParams.myOriginalForward);\r\n collisionRuntimeParams.myOriginalPosition = transformQuat.quat2_getPosition(collisionRuntimeParams.myOriginalPosition);\r\n\r\n transformOffsetLocalQuat.quat2_setPositionRotationQuat(collisionCheckParams.myPositionOffsetLocal, collisionCheckParams.myRotationOffsetLocalQuat);\r\n offsetTransformQuat = transformOffsetLocalQuat.quat2_toWorld(transformQuat, offsetTransformQuat);\r\n if (transformQuat.vec_equals(offsetTransformQuat, 0.00001)) {\r\n offsetTransformQuat.quat2_copy(transformQuat);\r\n }\r\n collisionRuntimeParams.myOffsetUp = offsetTransformQuat.quat2_getUp(collisionRuntimeParams.myOffsetUp);\r\n\r\n collisionRuntimeParams.myOriginalHeight = collisionCheckParams.myHeight;\r\n\r\n collisionRuntimeParams.myOriginalMovement.vec3_copy(movement);\r\n collisionRuntimeParams.myFixedMovement.vec3_copy(movement);\r\n\r\n collisionRuntimeParams.myNewPosition = collisionRuntimeParams.myOriginalPosition.vec3_add(collisionRuntimeParams.myFixedMovement, collisionRuntimeParams.myNewPosition);\r\n\r\n collisionRuntimeParams.myIsMove = true;\r\n };\r\n}();\r\n\r\nCollisionCheckBase.prototype._setRuntimeParamsForTeleportCollisionCheckDisabled = function () {\r\n let transformOffsetLocalQuat = quat2_create();\r\n let offsetTransformQuat = quat2_create();\r\n return function _setRuntimeParamsForTeleportCollisionCheckDisabled(position, transformQuat, collisionCheckParams, collisionRuntimeParams) {\r\n collisionRuntimeParams.reset();\r\n\r\n collisionRuntimeParams.myRealIsOnGround = true;\r\n collisionRuntimeParams.myIsOnGround = true;\r\n collisionRuntimeParams.myGroundCollisionHit.reset();\r\n collisionRuntimeParams.myGroundAngle = 0;\r\n collisionRuntimeParams.myGroundPerceivedAngle = 0;\r\n collisionRuntimeParams.myGroundNormal.vec3_set(0, 1, 0);\r\n collisionRuntimeParams.myGroundHitMaxAngle = collisionRuntimeParams.myGroundAngle;\r\n collisionRuntimeParams.myGroundHitMaxNormal.vec3_copy(collisionRuntimeParams.myGroundNormal);\r\n collisionRuntimeParams.myGroundDistance = 0;\r\n collisionRuntimeParams.myGroundIsBaseInsideCollision = false;\r\n collisionRuntimeParams.myOnGroundDueToBasePartiallyInsideCollision = false;\r\n\r\n collisionRuntimeParams.myRealIsOnCeiling = false;\r\n collisionRuntimeParams.myIsOnCeiling = false;\r\n collisionRuntimeParams.myCeilingCollisionHit.reset();\r\n collisionRuntimeParams.myCeilingAngle = 0;\r\n collisionRuntimeParams.myCeilingPerceivedAngle = 0;\r\n collisionRuntimeParams.myCeilingNormal.vec3_set(0, 1, 0);\r\n collisionRuntimeParams.myCeilingHitMaxAngle = collisionRuntimeParams.myCeilingAngle;\r\n collisionRuntimeParams.myCeilingHitMaxNormal.vec3_copy(collisionRuntimeParams.myCeilingNormal);\r\n collisionRuntimeParams.myCeilingDistance = 0;\r\n collisionRuntimeParams.myCeilingIsBaseInsideCollision = false;\r\n collisionRuntimeParams.myOnCeilingDueToBasePartiallyInsideCollision = false;\r\n\r\n collisionRuntimeParams.myOriginalUp = transformQuat.quat2_getUp(collisionRuntimeParams.myOriginalUp);\r\n collisionRuntimeParams.myOriginalForward = transformQuat.quat2_getForward(collisionRuntimeParams.myOriginalForward);\r\n collisionRuntimeParams.myOriginalPosition = transformQuat.quat2_getPosition(collisionRuntimeParams.myOriginalPosition);\r\n\r\n transformOffsetLocalQuat.quat2_setPositionRotationQuat(collisionCheckParams.myPositionOffsetLocal, collisionCheckParams.myRotationOffsetLocalQuat);\r\n offsetTransformQuat = transformOffsetLocalQuat.quat2_toWorld(transformQuat, offsetTransformQuat);\r\n if (transformQuat.vec_equals(offsetTransformQuat, 0.00001)) {\r\n offsetTransformQuat.quat2_copy(transformQuat);\r\n }\r\n collisionRuntimeParams.myOffsetUp = offsetTransformQuat.quat2_getUp(collisionRuntimeParams.myOffsetUp);\r\n\r\n collisionRuntimeParams.myOriginalHeight = collisionCheckParams.myHeight;\r\n\r\n collisionRuntimeParams.myOriginalTeleportPosition.vec3_copy(position);\r\n collisionRuntimeParams.myFixedTeleportPosition.vec3_copy(position);\r\n\r\n collisionRuntimeParams.myNewPosition.vec3_copy(collisionRuntimeParams.myFixedTeleportPosition);\r\n\r\n collisionRuntimeParams.myIsTeleport = true;\r\n };\r\n}();\r\n\r\nCollisionCheckBase.prototype._setRuntimeParamsForPositionCheckCollisionCheckDisabled = function () {\r\n let feetPosition = vec3_create();\r\n return function _setRuntimeParamsForPositionCheckCollisionCheckDisabled(allowFix, transformQuat, collisionCheckParams, collisionRuntimeParams) {\r\n feetPosition = transformQuat.quat2_getPosition(feetPosition);\r\n this._setRuntimeParamsForTeleportCollisionCheckDisabled(feetPosition, transformQuat, collisionCheckParams, collisionRuntimeParams);\r\n\r\n collisionRuntimeParams.myIsPositionOk = true;\r\n collisionRuntimeParams.myIsPositionCheck = true;\r\n\r\n collisionRuntimeParams.myOriginalPositionCheckPosition.vec3_copy(collisionRuntimeParams.myOriginalTeleportPosition);\r\n collisionRuntimeParams.myFixedPositionCheckPosition.vec3_copy(collisionRuntimeParams.myFixedTeleportPosition);\r\n collisionRuntimeParams.myIsPositionCheckAllowAdjustments = allowFix;\r\n\r\n collisionRuntimeParams.myOriginalTeleportPosition.vec3_zero();\r\n collisionRuntimeParams.myFixedTeleportPosition.vec3_zero();\r\n collisionRuntimeParams.myTeleportCanceled = false;\r\n collisionRuntimeParams.myIsTeleport = false;\r\n };\r\n}();\r\n\r\nCollisionCheckBase.prototype._setRuntimeParamsForUpdateSurfaceInfoCollisionCheckDisabled = function () {\r\n return function _setRuntimeParamsForUpdateSurfaceInfoCollisionCheckDisabled(transformQuat, collisionCheckParams, collisionRuntimeParams) {\r\n collisionRuntimeParams.myRealIsOnGround = true;\r\n collisionRuntimeParams.myIsOnGround = true;\r\n collisionRuntimeParams.myGroundCollisionHit.reset();\r\n collisionRuntimeParams.myGroundAngle = 0;\r\n collisionRuntimeParams.myGroundPerceivedAngle = 0;\r\n collisionRuntimeParams.myGroundNormal.vec3_set(0, 1, 0);\r\n collisionRuntimeParams.myGroundHitMaxAngle = collisionRuntimeParams.myGroundAngle;\r\n collisionRuntimeParams.myGroundHitMaxNormal.vec3_copy(collisionRuntimeParams.myGroundNormal);\r\n collisionRuntimeParams.myGroundDistance = 0;\r\n collisionRuntimeParams.myGroundIsBaseInsideCollision = false;\r\n collisionRuntimeParams.myOnGroundDueToBasePartiallyInsideCollision = false;\r\n\r\n collisionRuntimeParams.myRealIsOnCeiling = false;\r\n collisionRuntimeParams.myIsOnCeiling = false;\r\n collisionRuntimeParams.myCeilingCollisionHit.reset();\r\n collisionRuntimeParams.myCeilingAngle = 0;\r\n collisionRuntimeParams.myCeilingPerceivedAngle = 0;\r\n collisionRuntimeParams.myCeilingNormal.vec3_set(0, 1, 0);\r\n collisionRuntimeParams.myCeilingHitMaxAngle = collisionRuntimeParams.myCeilingAngle;\r\n collisionRuntimeParams.myCeilingHitMaxNormal.vec3_copy(collisionRuntimeParams.myCeilingNormal);\r\n collisionRuntimeParams.myCeilingDistance = 0;\r\n collisionRuntimeParams.myCeilingIsBaseInsideCollision = false;\r\n collisionRuntimeParams.myOnCeilingDueToBasePartiallyInsideCollision = false;\r\n };\r\n}();", "import { RaycastHit } from \"../../../../../../cauldron/physics/physics_raycast_params.js\";\r\nimport { quat2_create, vec3_create } from \"../../../../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Globals } from \"../../../../../../pp/globals.js\";\r\nimport { CollisionCheckBase } from \"./collision_check_base.js\";\r\n\r\nexport class CollisionCheckSurface extends CollisionCheckBase {\r\n\r\n updateSurfaceInfo(transformQuat, collisionCheckParams, collisionRuntimeParams) {\r\n if (this.isCollisionCheckDisabled() && Globals.isDebugEnabled(this._myEngine)) {\r\n this._setRuntimeParamsForUpdateSurfaceInfoCollisionCheckDisabled(transformQuat, collisionCheckParams, collisionRuntimeParams);\r\n return;\r\n }\r\n\r\n this._updateSurfaceInfo(transformQuat, collisionCheckParams, collisionRuntimeParams);\r\n }\r\n\r\n computeSurfacePerceivedAngle(surfaceNormal, forward, up, isGround = true) {\r\n // Implemented outside class definition\r\n }\r\n\r\n _updateSurfaceInfo(transformQuat, collisionCheckParams, collisionRuntimeParams) {\r\n // Implemented outside class definition\r\n }\r\n\r\n _postSurfaceCheck(fixedHorizontalMovement, originalVerticalMovement, transformUp, collisionCheckParams, collisionRuntimeParams, previousCollisionRuntimeParams) {\r\n // Implemented outside class definition\r\n }\r\n\r\n _surfaceTooSteep(up, direction, collisionCheckParams, collisionRuntimeParams) {\r\n // Implemented outside class definition\r\n }\r\n\r\n _adjustVerticalMovementWithSurface(horizontalMovement, verticalMovement, up, collisionCheckParams, collisionRuntimeParams, previousCollisionRuntimeParams, outAdjustedVerticalMovement) {\r\n // Implemented outside class definition\r\n }\r\n\r\n _adjustHorizontalMovementWithSurface(horizontalMovement, verticalMovement, up, collisionCheckParams, collisionRuntimeParams, previousCollisionRuntimeParams, outAdjustedHorizontalMovement) {\r\n // Implemented outside class definition\r\n }\r\n\r\n _computeExtraSurfaceVerticalMovement(horizontalMovement, up, collisionCheckParams, collisionRuntimeParams, outExtraSurfaceVerticalMovement) {\r\n // Implemented outside class definition\r\n }\r\n\r\n _gatherSurfaceInfo(feetPosition, height, up, forwardForPerceivedAngle, forwardForVertical, isGround, collisionCheckParams, collisionRuntimeParams) {\r\n // Implemented outside class definition\r\n }\r\n}\r\n\r\n\r\n\r\n// IMPLEMENTATION\r\n\r\nCollisionCheckSurface.prototype._updateSurfaceInfo = function () {\r\n let transformUp = vec3_create();\r\n let transformForward = vec3_create();\r\n let feetPosition = vec3_create();\r\n\r\n let transformOffsetLocalQuat = quat2_create();\r\n let offsetTransformQuat = quat2_create();\r\n\r\n let forwardForPerceivedAngle = vec3_create();\r\n let forwardForVertical = vec3_create();\r\n\r\n let zAxis = vec3_create(0, 0, 1);\r\n let xAxis = vec3_create(1, 0, 0);\r\n return function _updateSurfaceInfo(transformQuat, collisionCheckParams, collisionRuntimeParams) {\r\n transformOffsetLocalQuat.quat2_setPositionRotationQuat(collisionCheckParams.myPositionOffsetLocal, collisionCheckParams.myRotationOffsetLocalQuat);\r\n offsetTransformQuat = transformOffsetLocalQuat.quat2_toWorld(transformQuat, offsetTransformQuat);\r\n if (transformQuat.vec_equals(offsetTransformQuat, 0.00001)) {\r\n offsetTransformQuat.quat2_copy(transformQuat);\r\n }\r\n\r\n transformUp = offsetTransformQuat.quat2_getUp(transformUp);\r\n transformForward = offsetTransformQuat.quat2_getForward(transformForward);\r\n feetPosition = offsetTransformQuat.quat2_getPosition(feetPosition);\r\n\r\n let height = collisionCheckParams.myHeight;\r\n height = height - 0.00001; // This makes it easier to setup things at the same exact height of a character so that it can go under it\r\n if (height < 0.00001) {\r\n height = 0;\r\n }\r\n\r\n forwardForPerceivedAngle.vec3_copy(transformForward);\r\n\r\n forwardForVertical.vec3_copy(collisionCheckParams.myCheckVerticalFixedForward);\r\n if (!collisionCheckParams.myCheckVerticalFixedForwardEnabled) {\r\n forwardForVertical.vec3_copy(transformForward);\r\n } else {\r\n if (collisionCheckParams.myCheckVerticalFixedForward.vec3_isOnAxis(transformUp)) {\r\n if (zAxis.vec3_isOnAxis(transformUp)) {\r\n forwardForVertical.vec3_copy(xAxis);\r\n } else {\r\n forwardForVertical.vec3_copy(zAxis);\r\n }\r\n }\r\n\r\n forwardForVertical = forwardForVertical.vec3_removeComponentAlongAxis(transformUp, forwardForVertical);\r\n forwardForVertical = forwardForVertical.vec3_normalize(forwardForVertical);\r\n\r\n if (forwardForVertical.vec_equals(collisionCheckParams.myCheckVerticalFixedForward, 0.00001)) {\r\n forwardForVertical.vec3_copy(collisionCheckParams.myCheckVerticalFixedForward);\r\n }\r\n }\r\n\r\n if (collisionCheckParams.myComputeGroundInfoEnabled) {\r\n this._gatherSurfaceInfo(feetPosition, height, transformUp, forwardForPerceivedAngle, forwardForVertical, true, collisionCheckParams, collisionRuntimeParams);\r\n }\r\n\r\n if (collisionCheckParams.myComputeCeilingInfoEnabled) {\r\n this._gatherSurfaceInfo(feetPosition, height, transformUp, forwardForPerceivedAngle, forwardForVertical, false, collisionCheckParams, collisionRuntimeParams);\r\n }\r\n };\r\n}();\r\n\r\nCollisionCheckSurface.prototype._postSurfaceCheck = function () {\r\n let horizontalDirection = vec3_create();\r\n return function _postSurfaceCheck(fixedHorizontalMovement, originalVerticalMovement, transformUp, collisionCheckParams, collisionRuntimeParams, previousCollisionRuntimeParams) {\r\n\r\n let isVerticalMovementZero = originalVerticalMovement.vec3_isZero(0.00001);\r\n let isVerticalMovemenDownward = Math.pp_sign(originalVerticalMovement.vec3_lengthSigned(transformUp), -1) < 0;\r\n\r\n let horizontalMovementIsZero = fixedHorizontalMovement.vec3_isZero(0.00001);\r\n horizontalDirection = fixedHorizontalMovement.vec3_normalize(horizontalDirection);\r\n\r\n let groundPerceivedAngle = this.computeSurfacePerceivedAngle(collisionRuntimeParams.myGroundNormal, horizontalDirection, transformUp, true);\r\n let ceilingPerceivedAngle = this.computeSurfacePerceivedAngle(collisionRuntimeParams.myCeilingNormal, horizontalDirection, transformUp, false);\r\n\r\n let mustRemainOnGroundOk = true;\r\n if (collisionCheckParams.myMustStayOnGround) {\r\n if (previousCollisionRuntimeParams.myIsOnGround && !collisionRuntimeParams.myIsOnGround && (isVerticalMovementZero || isVerticalMovemenDownward)) {\r\n mustRemainOnGroundOk = false;\r\n }\r\n }\r\n\r\n let mustRemainOnCeilingOk = true;\r\n if (collisionCheckParams.myMustStayOnCeiling) {\r\n if (previousCollisionRuntimeParams.myIsOnCeiling && !collisionRuntimeParams.myIsOnCeiling && (isVerticalMovementZero || isVerticalMovemenDownward)) {\r\n mustRemainOnCeilingOk = false;\r\n }\r\n }\r\n\r\n let mustStayBelowGroundAngleOk = true;\r\n if (collisionCheckParams.myMustStayBelowGroundAngleDownhill != null || collisionCheckParams.myMustStayBelowIgnorableGroundAngleDownhill) {\r\n let minAngle = null;\r\n if (!collisionCheckParams.myMustStayBelowIgnorableGroundAngleDownhill) {\r\n minAngle = collisionCheckParams.myMustStayBelowGroundAngleDownhill;\r\n } else if (collisionCheckParams.myMustStayBelowGroundAngleDownhill == null) {\r\n minAngle = collisionCheckParams.myGroundAngleToIgnore;\r\n } else {\r\n minAngle = Math.min(collisionCheckParams.myMustStayBelowGroundAngleDownhill, collisionCheckParams.myGroundAngleToIgnore);\r\n }\r\n\r\n if (!horizontalMovementIsZero && groundPerceivedAngle < 0 && previousCollisionRuntimeParams.myIsOnGround &&\r\n previousCollisionRuntimeParams.myGroundAngle <= minAngle &&\r\n collisionRuntimeParams.myIsOnGround && collisionRuntimeParams.myGroundAngle > minAngle + 0.0001) {\r\n mustStayBelowGroundAngleOk = false;\r\n }\r\n }\r\n\r\n let mustStayBelowCeilingAngleOk = true;\r\n if (collisionCheckParams.myMustStayBelowCeilingAngleDownhill != null || collisionCheckParams.myMustStayBelowIgnorableCeilingAngleDownhill) {\r\n let minAngle = null;\r\n if (!collisionCheckParams.myMustStayBelowIgnorableCeilingAngleDownhill) {\r\n minAngle = collisionCheckParams.myMustStayBelowCeilingAngleDownhill;\r\n } else if (collisionCheckParams.myMustStayBelowCeilingAngleDownhill == null) {\r\n minAngle = collisionCheckParams.myCeilingAngleToIgnore;\r\n } else {\r\n minAngle = Math.min(collisionCheckParams.myMustStayBelowCeilingAngleDownhill, collisionCheckParams.myCeilingAngleToIgnore);\r\n }\r\n\r\n if (!horizontalMovementIsZero && groundPerceivedAngle < 0 && previousCollisionRuntimeParams.myIsOnCeiling &&\r\n previousCollisionRuntimeParams.myCeilingAngle <= minAngle &&\r\n collisionRuntimeParams.myIsOnCeiling && collisionRuntimeParams.myCeilingAngle > minAngle + 0.0001) {\r\n mustStayBelowCeilingAngleOk = false;\r\n }\r\n }\r\n\r\n let mustStayOnGroundHitAngleOk = true;\r\n if (collisionCheckParams.myMovementMustStayOnGroundHitAngle != null) {\r\n if (!horizontalMovementIsZero && previousCollisionRuntimeParams.myIsOnGround &&\r\n previousCollisionRuntimeParams.myGroundHitMaxAngle <= collisionCheckParams.myMovementMustStayOnGroundHitAngle &&\r\n collisionRuntimeParams.myIsOnGround && collisionRuntimeParams.myGroundHitMaxAngle > collisionCheckParams.myMovementMustStayOnGroundHitAngle + 0.0001) {\r\n mustStayOnGroundHitAngleOk = false;\r\n }\r\n }\r\n\r\n let mustStayOnCeilingHitAngleOk = true;\r\n if (collisionCheckParams.myMovementMustStayOnCeilingHitAngle != null) {\r\n if (!horizontalMovementIsZero && previousCollisionRuntimeParams.myIsOnCeiling &&\r\n previousCollisionRuntimeParams.myCeilingHitMaxAngle <= collisionCheckParams.myMovementMustStayOnCeilingHitAngle &&\r\n collisionRuntimeParams.myIsOnCeiling && collisionRuntimeParams.myCeilingHitMaxAngle > collisionCheckParams.myMovementMustStayOnCeilingHitAngle + 0.0001) {\r\n mustStayOnCeilingHitAngleOk = false;\r\n }\r\n }\r\n\r\n let isOnValidGroundAngleUphill = true;\r\n let isOnValidGroundAngleDownhill = true;\r\n if (collisionRuntimeParams.myIsOnGround && collisionRuntimeParams.myGroundAngle > collisionCheckParams.myGroundAngleToIgnore + 0.0001) {\r\n if (previousCollisionRuntimeParams.myIsOnGround && !horizontalMovementIsZero) {\r\n if (groundPerceivedAngle > 0) {\r\n isOnValidGroundAngleUphill = false;\r\n if (collisionCheckParams.myGroundAngleToIgnoreWithPerceivedAngle != null &&\r\n collisionRuntimeParams.myGroundAngle <= collisionCheckParams.myGroundAngleToIgnoreWithPerceivedAngle + 0.0001) {\r\n isOnValidGroundAngleUphill = Math.abs(groundPerceivedAngle) <= collisionCheckParams.myGroundAngleToIgnore + 0.0001;\r\n }\r\n } else if (groundPerceivedAngle < 0) {\r\n if (previousCollisionRuntimeParams.myGroundAngle <= collisionCheckParams.myGroundAngleToIgnore + 0.0001) {\r\n if (collisionCheckParams.myMustStayOnValidGroundAngleDownhill) {\r\n isOnValidGroundAngleDownhill = false;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n let isOnValidCeilingAngleUphill = true;\r\n let isOnValidCeilingAngleDownhill = true;\r\n if (collisionRuntimeParams.myIsOnCeiling && collisionRuntimeParams.myCeilingAngle > collisionCheckParams.myCeilingAngleToIgnore + 0.0001) {\r\n if (previousCollisionRuntimeParams.myIsOnCeiling && !horizontalMovementIsZero) {\r\n if (ceilingPerceivedAngle > 0) {\r\n isOnValidCeilingAngleUphill = false;\r\n if (collisionCheckParams.myCeilingAngleToIgnoreWithPerceivedAngle != null &&\r\n collisionRuntimeParams.myCeilingAngle <= collisionCheckParams.myCeilingAngleToIgnoreWithPerceivedAngle + 0.0001) {\r\n isOnValidCeilingAngleUphill = Math.abs(ceilingPerceivedAngle) <= collisionCheckParams.myCeilingAngleToIgnore + 0.0001;\r\n }\r\n } else if (ceilingPerceivedAngle < 0) {\r\n if (previousCollisionRuntimeParams.myCeilingAngle <= collisionCheckParams.myCeilingAngleToIgnore + 0.0001) {\r\n if (collisionCheckParams.myMustStayOnValidCeilingAngleDownhill) {\r\n isOnValidCeilingAngleDownhill = false;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n return mustRemainOnGroundOk && mustRemainOnCeilingOk && mustStayBelowGroundAngleOk && mustStayBelowCeilingAngleOk && mustStayOnGroundHitAngleOk && mustStayOnCeilingHitAngleOk && isOnValidGroundAngleUphill && isOnValidGroundAngleDownhill && isOnValidCeilingAngleUphill && isOnValidCeilingAngleDownhill;\r\n };\r\n}();\r\n\r\nCollisionCheckSurface.prototype._surfaceTooSteep = function () {\r\n let surfaceSteepResults = [false, false];\r\n return function _surfaceTooSteep(up, direction, collisionCheckParams, collisionRuntimeParams) {\r\n let groundTooSteep = false;\r\n let ceilingTooSteep = false;\r\n\r\n if (collisionRuntimeParams.myIsOnGround && collisionRuntimeParams.myGroundAngle > collisionCheckParams.myGroundAngleToIgnore + 0.0001) {\r\n let groundPerceivedAngle = this.computeSurfacePerceivedAngle(\r\n collisionRuntimeParams.myGroundNormal,\r\n direction, up, true);\r\n\r\n groundTooSteep = groundPerceivedAngle > 0;\r\n if (groundTooSteep &&\r\n collisionCheckParams.myGroundAngleToIgnoreWithPerceivedAngle != null &&\r\n collisionRuntimeParams.myGroundAngle <= collisionCheckParams.myGroundAngleToIgnoreWithPerceivedAngle + 0.0001) {\r\n groundTooSteep = Math.abs(groundPerceivedAngle) > collisionCheckParams.myGroundAngleToIgnore + 0.0001;\r\n }\r\n }\r\n\r\n if (!groundTooSteep) {\r\n if (collisionRuntimeParams.myIsOnCeiling && collisionRuntimeParams.myCeilingAngle > collisionCheckParams.myCeilingAngleToIgnore + 0.0001) {\r\n let ceilingPerceivedAngle = this.computeSurfacePerceivedAngle(\r\n collisionRuntimeParams.myCeilingNormal,\r\n direction, up, false);\r\n\r\n ceilingTooSteep = ceilingPerceivedAngle > 0;\r\n if (ceilingTooSteep &&\r\n collisionCheckParams.myCeilingAngleToIgnoreWithPerceivedAngle != null &&\r\n collisionRuntimeParams.myCeilingAngle <= collisionCheckParams.myCeilingAngleToIgnoreWithPerceivedAngle + 0.0001) {\r\n ceilingTooSteep = Math.abs(ceilingPerceivedAngle) > collisionCheckParams.myCeilingAngleToIgnore + 0.0001;\r\n }\r\n }\r\n }\r\n\r\n surfaceSteepResults[0] = groundTooSteep;\r\n surfaceSteepResults[1] = ceilingTooSteep;\r\n return surfaceSteepResults;\r\n };\r\n}();\r\n\r\nCollisionCheckSurface.prototype._adjustVerticalMovementWithSurface = function () {\r\n let horizontalDirection = vec3_create();\r\n let extraVerticalMovement = vec3_create();\r\n return function _adjustVerticalMovementWithSurface(horizontalMovement, verticalMovement, up, collisionCheckParams, collisionRuntimeParams, previousCollisionRuntimeParams, outAdjustedVerticalMovement) {\r\n outAdjustedVerticalMovement.vec3_copy(verticalMovement);\r\n\r\n if (horizontalMovement.vec3_isZero(0.00001)) {\r\n return outAdjustedVerticalMovement;\r\n }\r\n\r\n let extraVerticalLength = 0;\r\n horizontalDirection = horizontalMovement.vec3_normalize(horizontalDirection);\r\n\r\n if (previousCollisionRuntimeParams.myIsOnGround) {\r\n let groundPerceivedAngle = this.computeSurfacePerceivedAngle(\r\n previousCollisionRuntimeParams.myGroundNormal,\r\n horizontalDirection, up, true);\r\n\r\n let groundExtraVerticalLength = horizontalMovement.vec3_length() * Math.tan(Math.pp_toRadians(Math.abs(groundPerceivedAngle)));\r\n groundExtraVerticalLength *= Math.pp_sign(groundPerceivedAngle);\r\n\r\n if (Math.abs(groundExtraVerticalLength) > 0.00001) {\r\n if (groundPerceivedAngle > 0) {\r\n if (collisionCheckParams.myAdjustVerticalMovementWithGroundAngleUphill &&\r\n (collisionCheckParams.myAdjustVerticalMovementWithGroundAngleUphillMaxPerceivedAngle == null || Math.abs(groundPerceivedAngle) <= collisionCheckParams.myAdjustVerticalMovementWithGroundAngleUphillMaxPerceivedAngle) &&\r\n (collisionCheckParams.myAdjustVerticalMovementWithGroundAngleUphillMaxAngle == null || previousCollisionRuntimeParams.myGroundAngle <= collisionCheckParams.myAdjustVerticalMovementWithGroundAngleUphillMaxAngle)) {\r\n extraVerticalLength = groundExtraVerticalLength;\r\n collisionRuntimeParams.myHorizontalMovementHasAdjustedVerticalMovementOverGroundPerceivedAngleUphill = true;\r\n }\r\n } else if (groundPerceivedAngle < 0) {\r\n if (collisionCheckParams.myAdjustVerticalMovementWithGroundAngleDownhill &&\r\n (collisionCheckParams.myAdjustVerticalMovementWithGroundAngleDownhillMaxPerceivedAngle == null || Math.abs(groundPerceivedAngle) <= collisionCheckParams.myAdjustVerticalMovementWithGroundAngleDownhillMaxPerceivedAngle) &&\r\n (collisionCheckParams.myAdjustVerticalMovementWithGroundAngleDownhillMaxAngle == null || previousCollisionRuntimeParams.myGroundAngle <= collisionCheckParams.myAdjustVerticalMovementWithGroundAngleDownhillMaxAngle)) {\r\n extraVerticalLength = groundExtraVerticalLength;\r\n collisionRuntimeParams.myHorizontalMovementHasAdjustedVerticalMovementOverGroundPerceivedAngleDownhill = true;\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (previousCollisionRuntimeParams.myIsOnCeiling) {\r\n let ceilingPerceivedAngle = this.computeSurfacePerceivedAngle(\r\n previousCollisionRuntimeParams.myCeilingNormal,\r\n horizontalDirection, up, false);\r\n\r\n let ceilingExtraVerticalLength = horizontalMovement.vec3_length() * Math.tan(Math.pp_toRadians(Math.abs(ceilingPerceivedAngle)));\r\n ceilingExtraVerticalLength *= Math.pp_sign(ceilingPerceivedAngle);\r\n\r\n if (Math.abs(ceilingExtraVerticalLength) > 0.00001) {\r\n let sameSignThanGround = Math.pp_sign(extraVerticalLength) == Math.pp_sign(ceilingExtraVerticalLength);\r\n if (extraVerticalLength == 0 || (sameSignThanGround && Math.abs(ceilingExtraVerticalLength) > Math.abs(extraVerticalLength))) {\r\n if (ceilingPerceivedAngle > 0) {\r\n if (collisionCheckParams.myAdjustVerticalMovementWithCeilingAngleUphill &&\r\n (collisionCheckParams.myAdjustVerticalMovementWithCeilingAngleUphillMaxPerceivedAngle == null || Math.abs(ceilingPerceivedAngle) <= collisionCheckParams.myAdjustVerticalMovementWithCeilingAngleUphillMaxPerceivedAngle) &&\r\n (collisionCheckParams.myAdjustVerticalMovementWithCeilingAngleUphillMaxAngle == null || previousCollisionRuntimeParams.myCeilingAngle <= collisionCheckParams.myAdjustVerticalMovementWithCeilingAngleUphillMaxAngle)) {\r\n extraVerticalLength = ceilingExtraVerticalLength;\r\n collisionRuntimeParams.myHorizontalMovementHasAdjustedVerticalMovementOverCeilingPerceivedAngleUphill = true;\r\n collisionRuntimeParams.myHorizontalMovementHasAdjustedVerticalMovementOverGroundPerceivedAngleUphill = false;\r\n }\r\n } else if (ceilingPerceivedAngle < 0) {\r\n if (collisionCheckParams.myAdjustVerticalMovementWithCeilingAngleDownhill &&\r\n (collisionCheckParams.myAdjustVerticalMovementWithCeilingAngleDownhillMaxPerceivedAngle == null || Math.abs(ceilingPerceivedAngle) <= collisionCheckParams.myAdjustVerticalMovementWithCeilingAngleDownhillMaxPerceivedAngle) &&\r\n (collisionCheckParams.myAdjustVerticalMovementWithCeilingAngleDownhillMaxAngle == null || previousCollisionRuntimeParams.myCeilingAngle <= collisionCheckParams.myAdjustVerticalMovementWithCeilingAngleDownhillMaxAngle)) {\r\n extraVerticalLength = ceilingExtraVerticalLength;\r\n collisionRuntimeParams.myHorizontalMovementHasAdjustedVerticalMovementOverCeilingPerceivedAngleDownhill = true;\r\n collisionRuntimeParams.myHorizontalMovementHasAdjustedVerticalMovementOverGroundPerceivedAngleDownhill = false;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (Math.abs(extraVerticalLength) > 0.00001) {\r\n let verticalMovementLength = verticalMovement.vec3_lengthSigned(up);\r\n let sameSignThanExtra = Math.pp_sign(extraVerticalLength) == Math.pp_sign(verticalMovementLength);\r\n extraVerticalMovement = up.vec3_scale(extraVerticalLength, extraVerticalMovement);\r\n if (verticalMovement.vec3_isZero(0.00001)) {\r\n outAdjustedVerticalMovement.vec3_copy(extraVerticalMovement);\r\n } else if (sameSignThanExtra) {\r\n outAdjustedVerticalMovement = verticalMovement.vec3_add(extraVerticalMovement, outAdjustedVerticalMovement);\r\n } else if (!sameSignThanExtra && (\r\n collisionRuntimeParams.myHorizontalMovementHasAdjustedVerticalMovementOverGroundPerceivedAngleUphill ||\r\n collisionRuntimeParams.myHorizontalMovementHasAdjustedVerticalMovementOverCeilingPerceivedAngleUphill)) {\r\n // Do not add for downhill, since it means the vertical movement was about to go away from surface and u should not cancel that\r\n outAdjustedVerticalMovement = verticalMovement.vec3_add(extraVerticalMovement, outAdjustedVerticalMovement);\r\n } else {\r\n collisionRuntimeParams.myHorizontalMovementHasAdjustedVerticalMovementOverCeilingPerceivedAngleUphill = false;\r\n collisionRuntimeParams.myHorizontalMovementHasAdjustedVerticalMovementOverGroundPerceivedAngleUphill = false;\r\n collisionRuntimeParams.myHorizontalMovementHasAdjustedVerticalMovementOverCeilingPerceivedAngleDownhill = false;\r\n collisionRuntimeParams.myHorizontalMovementHasAdjustedVerticalMovementOverGroundPerceivedAngleDownhill = false;\r\n }\r\n }\r\n\r\n if (outAdjustedVerticalMovement.vec3_isZero(0.000001)) {\r\n outAdjustedVerticalMovement.vec3_zero();\r\n }\r\n\r\n return outAdjustedVerticalMovement;\r\n };\r\n}();\r\n\r\nCollisionCheckSurface.prototype._adjustHorizontalMovementWithSurface = function () {\r\n let extraHorizontalMovement = vec3_create();\r\n let groundHorizontalDirection = vec3_create();\r\n let ceilingHorizontalDirection = vec3_create();\r\n let scaledCeilingHorizontalDirection = vec3_create();\r\n let scaledCeilingHorizontalDirectionAlongGroundHorizontalDirection = vec3_create();\r\n let scaledCeilingHorizontalDirectionWithoutGroundHorizontalDirection = vec3_create();\r\n return function _adjustHorizontalMovementWithSurface(horizontalMovement, verticalMovement, up, collisionCheckParams, collisionRuntimeParams, previousCollisionRuntimeParams, outAdjustedHorizontalMovement) {\r\n outAdjustedHorizontalMovement.vec3_copy(horizontalMovement);\r\n\r\n if (verticalMovement.vec3_isZero(0.00001)) {\r\n return outAdjustedHorizontalMovement;\r\n }\r\n\r\n let isMovementDownward = !verticalMovement.vec3_isConcordant(up);\r\n\r\n extraHorizontalMovement.vec3_zero();\r\n groundHorizontalDirection.vec3_zero();\r\n\r\n if (previousCollisionRuntimeParams.myIsOnGround) {\r\n groundHorizontalDirection = previousCollisionRuntimeParams.myGroundNormal.vec3_removeComponentAlongAxis(up, groundHorizontalDirection);\r\n if (!groundHorizontalDirection.vec3_isZero(0.00001)) {\r\n groundHorizontalDirection.vec3_normalize(groundHorizontalDirection);\r\n\r\n let groundExtraHorizontalLength = verticalMovement.vec3_length() / Math.tan(Math.pp_toRadians(previousCollisionRuntimeParams.myGroundAngle));\r\n groundExtraHorizontalLength *= (isMovementDownward) ? 1 : -1;\r\n\r\n if (Math.abs(groundExtraHorizontalLength) > 0.00001) {\r\n if (isMovementDownward) {\r\n if (collisionCheckParams.myAdjustHorizontalMovementWithGroundAngleDownhill &&\r\n (collisionCheckParams.myAdjustHorizontalMovementWithGroundAngleDownhillMinAngle == null || previousCollisionRuntimeParams.myGroundAngle >= collisionCheckParams.myAdjustHorizontalMovementWithGroundAngleDownhillMinAngle)) {\r\n extraHorizontalMovement = groundHorizontalDirection.vec3_scale(groundExtraHorizontalLength, extraHorizontalMovement);\r\n collisionRuntimeParams.myVerticalMovementHasAdjustedHorizontalMovementOverGroundAngleDownhill = true;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (previousCollisionRuntimeParams.myIsOnCeiling) {\r\n ceilingHorizontalDirection = previousCollisionRuntimeParams.myCeilingNormal.vec3_removeComponentAlongAxis(up, ceilingHorizontalDirection);\r\n if (!ceilingHorizontalDirection.vec3_isZero(0.00001)) {\r\n ceilingHorizontalDirection.vec3_normalize(ceilingHorizontalDirection);\r\n\r\n let ceilingExtraHorizontalLength = verticalMovement.vec3_length() / Math.tan(Math.pp_toRadians(previousCollisionRuntimeParams.myCeilingAngle));\r\n ceilingExtraHorizontalLength *= (isMovementDownward) ? -1 : 1;\r\n\r\n if (Math.abs(ceilingExtraHorizontalLength) > 0.00001) {\r\n let sameDirectionAsGround = ceilingHorizontalDirection.vec3_isConcordant(groundHorizontalDirection);\r\n if (extraHorizontalMovement.vec3_isZero() || sameDirectionAsGround) {\r\n if (!isMovementDownward) {\r\n if (collisionCheckParams.myAdjustHorizontalMovementWithCeilingAngleDownhill &&\r\n (collisionCheckParams.myAdjustHorizontalMovementWithCeilingAngleDownhillMinAngle == null || previousCollisionRuntimeParams.myCeilingAngle >= collisionCheckParams.myAdjustHorizontalMovementWithCeilingAngleDownhillMinAngle)) {\r\n scaledCeilingHorizontalDirection = ceilingHorizontalDirection.vec3_scale(ceilingExtraHorizontalLength, scaledCeilingHorizontalDirection);\r\n if (!groundHorizontalDirection.vec3_isZero()) {\r\n scaledCeilingHorizontalDirectionWithoutGroundHorizontalDirection = scaledCeilingHorizontalDirection.vec3_removeComponentAlongAxis(scaledCeilingHorizontalDirectionWithoutGroundHorizontalDirection);\r\n scaledCeilingHorizontalDirectionAlongGroundHorizontalDirection = scaledCeilingHorizontalDirection.vec3_componentAlongAxis(scaledCeilingHorizontalDirectionWithoutGroundHorizontalDirection);\r\n\r\n if (scaledCeilingHorizontalDirectionAlongGroundHorizontalDirection.vec3_isFartherAlongAxis(extraHorizontalMovement, groundHorizontalDirection)) {\r\n collisionRuntimeParams.myVerticalMovementHasAdjustedHorizontalMovementOverGroundAngleDownhill = false;\r\n extraHorizontalMovement.vec3_copy(scaledCeilingHorizontalDirection);\r\n collisionRuntimeParams.myVerticalMovementHasAdjustedHorizontalMovementOverCeilingAngleDownhill = true;\r\n } else if (!scaledCeilingHorizontalDirectionWithoutGroundHorizontalDirection.vec3_isZero(0.00001)) {\r\n extraHorizontalMovement = extraHorizontalMovement.vec3_add(scaledCeilingHorizontalDirectionWithoutGroundHorizontalDirection, extraHorizontalMovement);\r\n collisionRuntimeParams.myVerticalMovementHasAdjustedHorizontalMovementOverCeilingAngleDownhill = true;\r\n }\r\n } else {\r\n extraHorizontalMovement.vec3_copy(scaledCeilingHorizontalDirection);\r\n collisionRuntimeParams.myVerticalMovementHasAdjustedHorizontalMovementOverCeilingAngleDownhill = true;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (!extraHorizontalMovement.vec3_isZero()) {\r\n if (horizontalMovement.vec3_isZero(0.00001)) {\r\n outAdjustedHorizontalMovement.vec3_copy(extraHorizontalMovement);\r\n } else if (extraHorizontalMovement.vec3_isConcordant(horizontalMovement)) {\r\n outAdjustedHorizontalMovement = horizontalMovement.vec3_add(extraHorizontalMovement, outAdjustedHorizontalMovement);\r\n } else {\r\n outAdjustedHorizontalMovement = horizontalMovement.vec3_add(extraHorizontalMovement, outAdjustedHorizontalMovement);\r\n }\r\n }\r\n\r\n if (outAdjustedHorizontalMovement.vec3_isZero(0.000001)) {\r\n outAdjustedHorizontalMovement.vec3_zero();\r\n }\r\n\r\n return outAdjustedHorizontalMovement;\r\n };\r\n}();\r\n\r\n// Useless now\r\nCollisionCheckSurface.prototype._computeExtraSurfaceVerticalMovement = function () {\r\n let direction = vec3_create();\r\n let tempVector = vec3_create();\r\n return function _computeExtraSurfaceVerticalMovement(horizontalMovement, up, collisionCheckParams, collisionRuntimeParams, outExtraSurfaceVerticalMovement) {\r\n outExtraSurfaceVerticalMovement.vec3_zero();\r\n\r\n if (!horizontalMovement.vec3_isZero()) {\r\n if (collisionRuntimeParams.myIsOnGround && collisionRuntimeParams.myGroundAngle != 0) {\r\n direction = horizontalMovement.vec3_normalize(direction);\r\n let groundPerceivedAngle = this.computeSurfacePerceivedAngle(\r\n collisionRuntimeParams.myGroundNormal,\r\n direction, up, true);\r\n\r\n let extraVerticalLength = horizontalMovement.vec3_length() * Math.tan(Math.pp_toRadians(Math.abs(groundPerceivedAngle)));\r\n extraVerticalLength *= Math.pp_sign(groundPerceivedAngle);\r\n\r\n if (Math.abs(extraVerticalLength) > 0.00001 && (collisionCheckParams.mySnapOnGroundEnabled || extraVerticalLength > 0)) {\r\n outExtraSurfaceVerticalMovement.vec3_add(up.vec3_scale(extraVerticalLength, tempVector), outExtraSurfaceVerticalMovement);\r\n }\r\n } else if (collisionRuntimeParams.myIsOnCeiling && collisionRuntimeParams.myCeilingAngle != 0) {\r\n direction = horizontalMovement.vec3_normalize(direction);\r\n let ceilingPerceivedAngle = this.computeSurfacePerceivedAngle(\r\n collisionRuntimeParams.myCeilingNormal,\r\n direction, up, false);\r\n\r\n let extraVerticalLength = horizontalMovement.vec3_length() * Math.tan(Math.pp_toRadians(Math.abs(ceilingPerceivedAngle)));\r\n extraVerticalLength *= Math.pp_sign(ceilingPerceivedAngle);\r\n extraVerticalLength *= -1;\r\n\r\n if (Math.abs(extraVerticalLength) > 0.00001 && (collisionCheckParams.mySnapOnCeilingEnabled || extraVerticalLength < 0)) {\r\n outExtraSurfaceVerticalMovement.vec3_add(up.vec3_scale(extraVerticalLength, tempVector), outExtraSurfaceVerticalMovement);\r\n }\r\n }\r\n }\r\n\r\n return outExtraSurfaceVerticalMovement;\r\n };\r\n}();\r\n\r\nCollisionCheckSurface.prototype._gatherSurfaceInfo = function () {\r\n let verticalDirection = vec3_create();\r\n let startOffset = vec3_create();\r\n let endOffset = vec3_create();\r\n let heightOffset = vec3_create();\r\n let smallOffset = vec3_create();\r\n let smallStartPosition = vec3_create();\r\n let smallEndPosition = vec3_create();\r\n let surfaceNormal = vec3_create();\r\n let surfaceHitMaxNormal = vec3_create();\r\n let hitFromCurrentPosition = vec3_create();\r\n let startPosition = vec3_create();\r\n let endPosition = vec3_create();\r\n let direction = vec3_create();\r\n\r\n let surfaceCollisionHit = new RaycastHit();\r\n let surfaceCollisionHitForBaseInsideCollision = new RaycastHit();\r\n return function _gatherSurfaceInfo(feetPosition, height, up, forwardForPerceivedAngle, forwardForVertical, isGround, collisionCheckParams, collisionRuntimeParams) {\r\n this._myDebugEnabled = collisionCheckParams.myDebugEnabled && ((isGround && collisionCheckParams.myDebugGroundInfoEnabled) || (!isGround && collisionCheckParams.myDebugCeilingInfoEnabled));\r\n\r\n let checkPositions = this._getVerticalCheckPositions(feetPosition, up, forwardForVertical, collisionCheckParams, collisionRuntimeParams);\r\n\r\n verticalDirection.vec3_copy(up);\r\n let distanceToBeOnSurface = collisionCheckParams.myDistanceToBeOnGround;\r\n let distanceToComputeSurfaceInfo = collisionCheckParams.myDistanceToComputeGroundInfo;\r\n let distanceToFindSurfaceDistance = collisionCheckParams.myFindGroundDistanceMaxOutsideDistance;\r\n let distanceToCollectCollisionHit = collisionCheckParams.myCollectGroundCollisionHitOutsideDistance;\r\n let verticalFixToBeOnSurface = collisionCheckParams.myVerticalFixToBeOnGround;\r\n let verticalFixToComputeSurfaceInfo = collisionCheckParams.myVerticalFixToComputeGroundInfo;\r\n let verticalFixToFindSurfaceDistance = collisionCheckParams.myFindGroundDistanceMaxInsideDistance;\r\n let verticalFixToCollectCollisionHit = collisionCheckParams.myCollectGroundCollisionHitInsideDistance;\r\n let isOnSurfaceIfInsideHit = collisionCheckParams.myIsOnGroundIfInsideHit;\r\n let isBaseInsideCollisionCheckEnabled = collisionCheckParams.myGroundIsBaseInsideCollisionCheckEnabled;\r\n if (!isGround) {\r\n verticalDirection.vec3_negate(verticalDirection);\r\n distanceToBeOnSurface = collisionCheckParams.myDistanceToBeOnCeiling;\r\n distanceToComputeSurfaceInfo = collisionCheckParams.myDistanceToComputeCeilingInfo;\r\n distanceToFindSurfaceDistance = collisionCheckParams.myFindCeilingDistanceMaxOutsideDistance;\r\n distanceToCollectCollisionHit = collisionCheckParams.myCollectCeilingCollisionHitOutsideDistance;\r\n verticalFixToBeOnSurface = collisionCheckParams.myVerticalFixToBeOnCeiling;\r\n verticalFixToComputeSurfaceInfo = collisionCheckParams.myVerticalFixToComputeCeilingInfo;\r\n verticalFixToFindSurfaceDistance = collisionCheckParams.myFindCeilingDistanceMaxInsideDistance;\r\n verticalFixToCollectCollisionHit = collisionCheckParams.myCollectCeilingCollisionHitInsideDistance;\r\n isOnSurfaceIfInsideHit = collisionCheckParams.myIsOnCeilingIfInsideHit;\r\n isBaseInsideCollisionCheckEnabled = collisionCheckParams.myCeilingIsBaseInsideCollisionCheckEnabled;\r\n }\r\n\r\n startOffset = verticalDirection.vec3_scale(Math.max(verticalFixToBeOnSurface, verticalFixToComputeSurfaceInfo, verticalFixToFindSurfaceDistance, 0.00001), startOffset);\r\n endOffset = verticalDirection.vec3_negate(endOffset).vec3_scale(Math.max(distanceToBeOnSurface, distanceToComputeSurfaceInfo, distanceToFindSurfaceDistance, 0.00001), endOffset);\r\n\r\n heightOffset.vec3_zero();\r\n if (!isGround) {\r\n heightOffset = up.vec3_scale(height, heightOffset);\r\n }\r\n\r\n smallOffset = verticalDirection.vec3_scale(0.0001, smallOffset);\r\n\r\n let isOnSurface = false;\r\n let isActuallyOnSurface = false;\r\n let surfaceAngle = 0;\r\n let surfacePerceivedAngle = 0;\r\n surfaceNormal.vec3_zero();\r\n surfaceCollisionHit.reset();\r\n surfaceCollisionHitForBaseInsideCollision.reset();\r\n\r\n let surfaceHitMaxAngle = 0;\r\n surfaceHitMaxNormal.vec3_zero();\r\n\r\n let surfaceDistance = null;\r\n let surfaceDistanceForCollectCollisionHit = null;\r\n let isBaseInsideCollision = checkPositions.length > 0;\r\n\r\n for (let i = 0; i < checkPositions.length; i++) {\r\n let currentPosition = checkPositions[i];\r\n currentPosition.vec3_add(heightOffset, currentPosition);\r\n\r\n let baseHitIsInsideCollision = false;\r\n if (isBaseInsideCollisionCheckEnabled) {\r\n smallStartPosition = currentPosition.vec3_add(smallOffset, smallStartPosition);\r\n smallEndPosition = currentPosition.vec3_sub(smallOffset, smallEndPosition);\r\n\r\n let origin = smallStartPosition;\r\n direction = smallEndPosition.vec3_sub(origin, direction);\r\n let distance = direction.vec3_length();\r\n direction.vec3_normalize(direction);\r\n let raycastResult = this._raycastAndDebug(origin, direction, distance, false, false, collisionCheckParams, collisionRuntimeParams);\r\n\r\n if (raycastResult.isColliding()) {\r\n baseHitIsInsideCollision = raycastResult.myHits[0].myInsideCollision;\r\n surfaceCollisionHitForBaseInsideCollision.copy(raycastResult.myHits[0]);\r\n }\r\n }\r\n\r\n isBaseInsideCollision &&= baseHitIsInsideCollision;\r\n\r\n if (!baseHitIsInsideCollision) {\r\n startPosition = currentPosition.vec3_add(startOffset, startPosition);\r\n endPosition = currentPosition.vec3_add(endOffset, endPosition);\r\n\r\n let origin = startPosition;\r\n direction = endPosition.vec3_sub(origin, direction);\r\n let distance = direction.vec3_length();\r\n direction.vec3_normalize(direction);\r\n let raycastResult = this._raycastAndDebug(origin, direction, distance, true, false, collisionCheckParams, collisionRuntimeParams);\r\n\r\n if (raycastResult.isColliding()) {\r\n hitFromCurrentPosition = raycastResult.myHits[0].myPosition.vec3_sub(currentPosition, hitFromCurrentPosition);\r\n let hitFromCurrentPositionLength = hitFromCurrentPosition.vec3_lengthSigned(verticalDirection);\r\n\r\n if ((hitFromCurrentPositionLength >= 0 && hitFromCurrentPositionLength <= verticalFixToBeOnSurface + 0.00001) ||\r\n (hitFromCurrentPositionLength < 0 && Math.abs(hitFromCurrentPositionLength) <= distanceToBeOnSurface + 0.00001)) {\r\n isOnSurface = true;\r\n isActuallyOnSurface = true;\r\n }\r\n\r\n if ((hitFromCurrentPositionLength >= 0 && hitFromCurrentPositionLength <= verticalFixToComputeSurfaceInfo + 0.00001) ||\r\n (hitFromCurrentPositionLength < 0 && Math.abs(hitFromCurrentPositionLength) <= distanceToComputeSurfaceInfo + 0.00001)) {\r\n let currentSurfaceNormal = raycastResult.myHits[0].myNormal;\r\n surfaceNormal.vec3_add(currentSurfaceNormal, surfaceNormal);\r\n\r\n let surfaceHitAngle = currentSurfaceNormal.vec3_angle(verticalDirection);\r\n if (surfaceHitAngle > surfaceHitMaxAngle) {\r\n surfaceHitMaxAngle = surfaceHitAngle;\r\n surfaceHitMaxNormal.vec3_copy(currentSurfaceNormal);\r\n }\r\n }\r\n\r\n if ((hitFromCurrentPositionLength >= 0 && hitFromCurrentPositionLength <= verticalFixToFindSurfaceDistance + 0.00001) ||\r\n (hitFromCurrentPositionLength < 0 && Math.abs(hitFromCurrentPositionLength) <= distanceToFindSurfaceDistance + 0.00001)) {\r\n if (surfaceDistance == null) {\r\n surfaceDistance = -hitFromCurrentPositionLength;\r\n } else {\r\n if (Math.abs(hitFromCurrentPositionLength) < Math.abs(surfaceDistance)) {\r\n surfaceDistance = -hitFromCurrentPositionLength;\r\n }\r\n }\r\n }\r\n\r\n if ((hitFromCurrentPositionLength >= 0 && hitFromCurrentPositionLength <= verticalFixToCollectCollisionHit + 0.00001) ||\r\n (hitFromCurrentPositionLength < 0 && Math.abs(hitFromCurrentPositionLength) <= distanceToCollectCollisionHit + 0.00001)) {\r\n if (surfaceDistanceForCollectCollisionHit == null) {\r\n surfaceDistanceForCollectCollisionHit = -hitFromCurrentPositionLength;\r\n surfaceCollisionHit.copy(raycastResult.myHits[0]);\r\n } else {\r\n if (Math.abs(hitFromCurrentPositionLength) < Math.abs(surfaceDistanceForCollectCollisionHit)) {\r\n surfaceDistanceForCollectCollisionHit = -hitFromCurrentPositionLength;\r\n surfaceCollisionHit.copy(raycastResult.myHits[0]);\r\n }\r\n }\r\n }\r\n }\r\n } else if (isOnSurfaceIfInsideHit) {\r\n if (!isOnSurface) {\r\n isOnSurface = true;\r\n if (!surfaceCollisionHit.isValid()) {\r\n surfaceCollisionHit.copy(surfaceCollisionHitForBaseInsideCollision);\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (!surfaceNormal.vec3_isZero()) {\r\n surfaceNormal.vec3_normalize(surfaceNormal);\r\n surfaceAngle = surfaceNormal.vec3_angle(verticalDirection);\r\n\r\n if (surfaceAngle <= 0.0001) {\r\n surfaceAngle = 0;\r\n surfaceNormal.vec3_copy(verticalDirection);\r\n } else if (surfaceAngle >= 180 - 0.0001) {\r\n surfaceAngle = 180;\r\n surfaceNormal = verticalDirection.vec3_negate(surfaceNormal);\r\n }\r\n\r\n surfacePerceivedAngle = this.computeSurfacePerceivedAngle(surfaceNormal, forwardForPerceivedAngle, up, isGround);\r\n }\r\n\r\n if (isGround) {\r\n collisionRuntimeParams.myRealIsOnGround = isOnSurface;\r\n\r\n collisionRuntimeParams.myGroundCollisionHit.copy(surfaceCollisionHit);\r\n\r\n collisionRuntimeParams.myGroundAngle = surfaceAngle;\r\n collisionRuntimeParams.myGroundPerceivedAngle = surfacePerceivedAngle;\r\n collisionRuntimeParams.myGroundNormal.vec3_copy(surfaceNormal);\r\n\r\n collisionRuntimeParams.myGroundHitMaxAngle = surfaceHitMaxAngle;\r\n collisionRuntimeParams.myGroundHitMaxNormal.vec3_copy(surfaceHitMaxNormal);\r\n\r\n collisionRuntimeParams.myGroundDistance = surfaceDistance;\r\n\r\n collisionRuntimeParams.myGroundIsBaseInsideCollision = isBaseInsideCollision;\r\n\r\n if (isOnSurface && (collisionCheckParams.myIsOnGroundMaxSurfaceAngle == null || collisionRuntimeParams.myGroundAngle <= collisionCheckParams.myIsOnGroundMaxSurfaceAngle)) {\r\n collisionRuntimeParams.myIsOnGround = true;\r\n } else {\r\n collisionRuntimeParams.myIsOnGround = false;\r\n }\r\n\r\n collisionRuntimeParams.myOnGroundDueToBasePartiallyInsideCollision = isOnSurface && !isActuallyOnSurface;\r\n } else {\r\n collisionRuntimeParams.myRealIsOnCeiling = isOnSurface;\r\n\r\n collisionRuntimeParams.myCeilingCollisionHit.copy(surfaceCollisionHit);\r\n\r\n collisionRuntimeParams.myCeilingAngle = surfaceAngle;\r\n collisionRuntimeParams.myCeilingPerceivedAngle = surfacePerceivedAngle;\r\n collisionRuntimeParams.myCeilingNormal.vec3_copy(surfaceNormal);\r\n\r\n collisionRuntimeParams.myCeilingHitMaxAngle = surfaceHitMaxAngle;\r\n collisionRuntimeParams.myCeilingHitMaxNormal.vec3_copy(surfaceHitMaxNormal);\r\n\r\n collisionRuntimeParams.myCeilingDistance = surfaceDistance;\r\n\r\n collisionRuntimeParams.myCeilingIsBaseInsideCollision = isBaseInsideCollision;\r\n\r\n if (isOnSurface && (collisionCheckParams.myIsOnCeilingMaxSurfaceAngle == null || collisionRuntimeParams.myCeilingAngle <= collisionCheckParams.myIsOnCeilingMaxSurfaceAngle)) {\r\n collisionRuntimeParams.myIsOnCeiling = true;\r\n } else {\r\n collisionRuntimeParams.myIsOnCeiling = false;\r\n }\r\n\r\n collisionRuntimeParams.myOnCeilingDueToBasePartiallyInsideCollision = isOnSurface && !isActuallyOnSurface;\r\n }\r\n };\r\n}();\r\n\r\nCollisionCheckSurface.prototype.computeSurfacePerceivedAngle = function () {\r\n let forwardOnSurface = vec3_create();\r\n let verticalDirection = vec3_create();\r\n return function computeSurfacePerceivedAngle(surfaceNormal, forward, up, isGround = true) {\r\n let surfacePerceivedAngle = 0;\r\n\r\n verticalDirection.vec3_copy(up);\r\n if (!isGround) {\r\n verticalDirection.vec3_negate(verticalDirection);\r\n }\r\n\r\n let surfaceAngle = surfaceNormal.vec3_angle(verticalDirection);\r\n if (surfaceAngle <= Math.PP_EPSILON_DEGREES) {\r\n surfaceAngle = 0;\r\n } else if (surfaceAngle >= 180 - Math.PP_EPSILON_DEGREES) {\r\n surfaceAngle = 180;\r\n }\r\n\r\n forwardOnSurface = forward.vec3_projectOnPlaneAlongAxis(surfaceNormal, up, forwardOnSurface);\r\n surfacePerceivedAngle = forwardOnSurface.vec3_angle(forward);\r\n\r\n let isFartherOnUp = forwardOnSurface.vec3_isFartherAlongAxis(forward, up);\r\n if ((!isFartherOnUp && isGround) || (isFartherOnUp && !isGround)) {\r\n surfacePerceivedAngle *= -1;\r\n }\r\n\r\n if (Math.abs(surfacePerceivedAngle) >= surfaceAngle) {\r\n if (surfaceAngle != 0 && surfaceAngle != 180) {\r\n surfacePerceivedAngle = surfaceAngle * Math.pp_sign(surfacePerceivedAngle);\r\n } else {\r\n surfacePerceivedAngle = surfaceAngle;\r\n }\r\n }\r\n\r\n return surfacePerceivedAngle;\r\n };\r\n}();", "import { vec3_create } from \"../../../../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { CollisionCheckSurface } from \"./collision_check_surface.js\";\r\n\r\nexport class CollisionCheckHorizontalBase extends CollisionCheckSurface {\r\n\r\n _horizontalCheckRaycast(startPosition, endPosition, movementDirection, up,\r\n ignoreHitsInsideCollision, ignoreGroundAngleCallback, ignoreCeilingAngleCallback,\r\n feetPosition, fixHitOnCollision,\r\n collisionCheckParams, collisionRuntimeParams, checkAllHits = false, ignoreHitsInsideCollisionIfObjectToIgnore = false) {\r\n // Implemented outside class definition\r\n }\r\n\r\n _ignoreSurfaceAngle(feetPosition, height, movementOrForward, objectsToIgnore, outIgnoredObjects, isGround, isMovementCheck, up, collisionCheckParams, hit, ignoreHitsInsideCollisionIfObjectToIgnore) {\r\n // Implemented outside class definition\r\n }\r\n}\r\n\r\n\r\n\r\n// IMPLEMENTATION\r\n\r\nCollisionCheckHorizontalBase.prototype._horizontalCheckRaycast = function () {\r\n let direction = vec3_create();\r\n let fixedFeetPosition = vec3_create();\r\n let fixedHitPosition = vec3_create();\r\n return function _horizontalCheckRaycast(startPosition, endPosition, movementDirection, up,\r\n ignoreHitsInsideCollision, ignoreGroundAngleCallback, ignoreCeilingAngleCallback,\r\n feetPosition, fixHitOnCollision,\r\n collisionCheckParams, collisionRuntimeParams, checkAllHits = false, ignoreHitsInsideCollisionIfObjectToIgnore = false) {\r\n\r\n let origin = startPosition;\r\n direction = endPosition.vec3_sub(origin, direction);\r\n\r\n if (movementDirection != null && !direction.vec3_isConcordant(movementDirection)) {\r\n direction.vec3_negate(direction);\r\n origin = endPosition;\r\n }\r\n\r\n let distance = direction.vec3_length();\r\n direction.vec3_normalize(direction);\r\n let raycastResult = this._raycastAndDebug(origin, direction, distance, ignoreHitsInsideCollision, true, collisionCheckParams, collisionRuntimeParams);\r\n\r\n let isOk = true;\r\n\r\n if (raycastResult.isColliding()) {\r\n let hitsToControl = checkAllHits ? raycastResult.myHits.length : 1;\r\n let validHitIndex = 0;\r\n for (let i = 0; i < hitsToControl; i++) {\r\n let hit = raycastResult.myHits[i];\r\n if ((ignoreGroundAngleCallback == null || !ignoreGroundAngleCallback(hit, ignoreHitsInsideCollisionIfObjectToIgnore)) &&\r\n (ignoreCeilingAngleCallback == null || !ignoreCeilingAngleCallback(hit, ignoreHitsInsideCollisionIfObjectToIgnore))) {\r\n isOk = false;\r\n validHitIndex = i;\r\n break;\r\n }\r\n }\r\n\r\n if (!isOk && validHitIndex > 0) {\r\n for (let i = 0; i < validHitIndex; i++) {\r\n raycastResult.removeHit(0);\r\n }\r\n }\r\n }\r\n\r\n if (!isOk && fixHitOnCollision) {\r\n let hitPosition = raycastResult.myHits[0].myPosition;\r\n\r\n fixedFeetPosition = feetPosition.vec3_copyComponentAlongAxis(hitPosition, up, fixedFeetPosition);\r\n fixedHitPosition.vec3_copy(hitPosition);\r\n\r\n let directionOffsetEpsilonValue = 0.0001;\r\n direction = direction.vec3_componentAlongAxis(up, direction);\r\n if (!direction.vec3_isZero(0.000001)) {\r\n // If the check has an up part move the hit a bit on the that direction\r\n direction.vec3_normalize(direction);\r\n direction.vec3_scale(directionOffsetEpsilonValue, direction);\r\n\r\n // This offset is a workaround for objects that in the editor are aligned but due to clamp get a bit tilted when in the game\r\n // and therefore trying an horizontal cast on the vertical hit position could result in hitting the bottom which in theory should be parallel and therefore not possible\r\n fixedFeetPosition.vec3_add(direction, fixedFeetPosition);\r\n fixedHitPosition.vec3_add(direction, fixedHitPosition);\r\n }\r\n\r\n // Move the hit a bit further to prevent miss\r\n direction = fixedHitPosition.vec3_sub(fixedFeetPosition, direction);\r\n direction.vec3_normalize(direction);\r\n direction.vec3_scale(directionOffsetEpsilonValue, direction);\r\n fixedHitPosition = fixedHitPosition.vec3_add(direction, fixedHitPosition);\r\n\r\n let swapRaycastResult = this._myRaycastResult;\r\n this._myRaycastResult = this._myFixRaycastResult;\r\n\r\n isOk = this._horizontalCheckRaycast(fixedFeetPosition, fixedHitPosition, null, up,\r\n false, ignoreGroundAngleCallback, ignoreCeilingAngleCallback,\r\n feetPosition, false,\r\n collisionCheckParams, collisionRuntimeParams);\r\n\r\n if (this._myRaycastResult.isColliding()) {\r\n this._myFixRaycastResult = swapRaycastResult;\r\n } else {\r\n isOk = false;\r\n this._myRaycastResult = swapRaycastResult;\r\n }\r\n }\r\n\r\n return isOk;\r\n };\r\n}();\r\n\r\nCollisionCheckHorizontalBase.prototype._ignoreSurfaceAngle = function () {\r\n let objectsEqualCallback = (first, second) => first == second;\r\n\r\n let movementDirection = vec3_create();\r\n let hitDirection = vec3_create();\r\n let hitMovement = vec3_create();\r\n let projectAlongAxis = vec3_create();\r\n return function _ignoreSurfaceAngle(feetPosition, height, movementOrForward, objectsToIgnore, outIgnoredObjects, isGround, isMovementCheck, up, collisionCheckParams, hit, ignoreHitsInsideCollisionIfObjectToIgnore) {\r\n let isIgnorable = false;\r\n\r\n let surfaceIgnoreHeight = null;\r\n let groundIgnoreHeight = isMovementCheck ? collisionCheckParams.myHorizontalMovementGroundAngleIgnoreHeight : collisionCheckParams.myHorizontalPositionGroundAngleIgnoreHeight;\r\n let ceilingIgnoreHeight = isMovementCheck ? collisionCheckParams.myHorizontalMovementCeilingAngleIgnoreHeight : collisionCheckParams.myHorizontalPositionCeilingAngleIgnoreHeight;\r\n if (isGround && groundIgnoreHeight != null) {\r\n surfaceIgnoreHeight = Math.pp_clamp(groundIgnoreHeight + 0.0002, 0, height);\r\n } else if (!isGround && ceilingIgnoreHeight != null) {\r\n surfaceIgnoreHeight = Math.pp_clamp(height - ceilingIgnoreHeight - 0.0002, 0, height);\r\n }\r\n\r\n let surfaceIgnoreMaxMovementLeft = null;\r\n if (isMovementCheck) {\r\n if (isGround && collisionCheckParams.myHorizontalMovementGroundAngleIgnoreMaxMovementLeft != null) {\r\n surfaceIgnoreMaxMovementLeft = collisionCheckParams.myHorizontalMovementGroundAngleIgnoreMaxMovementLeft;\r\n } else if (!isGround && collisionCheckParams.myHorizontalMovementCeilingAngleIgnoreMaxMovementLeft != null) {\r\n surfaceIgnoreMaxMovementLeft = collisionCheckParams.myHorizontalMovementCeilingAngleIgnoreMaxMovementLeft;\r\n }\r\n }\r\n\r\n if (!hit.myInsideCollision) {\r\n movementDirection = movementOrForward.vec3_normalize(movementDirection);\r\n\r\n let surfaceAngle = hit.myNormal.vec3_angle(up);\r\n if (!isGround) {\r\n surfaceAngle = 180 - surfaceAngle;\r\n }\r\n\r\n if (isGround && collisionCheckParams.myGroundAngleToIgnore > 0 && (surfaceAngle > collisionCheckParams.myGroundAngleToIgnore + 0.0001)) {\r\n if (collisionCheckParams.myGroundAngleToIgnoreWithPerceivedAngle != null &&\r\n surfaceAngle <= collisionCheckParams.myGroundAngleToIgnoreWithPerceivedAngle + 0.0001) {\r\n let perceivedAngle = this.computeSurfacePerceivedAngle(\r\n hit.myNormal,\r\n movementDirection, up, true);\r\n surfaceAngle = Math.abs(perceivedAngle);\r\n }\r\n } else if (!isGround && collisionCheckParams.myCeilingAngleToIgnore > 0 && surfaceAngle > collisionCheckParams.myCeilingAngleToIgnore + 0.0001) {\r\n if (collisionCheckParams.myCeilingAngleToIgnoreWithPerceivedAngle != null &&\r\n surfaceAngle <= collisionCheckParams.myCeilingAngleToIgnoreWithPerceivedAngle + 0.0001) {\r\n let perceivedAngle = this.computeSurfacePerceivedAngle(\r\n hit.myNormal,\r\n movementDirection, up, false);\r\n surfaceAngle = Math.abs(perceivedAngle);\r\n }\r\n }\r\n\r\n if ((isGround && (collisionCheckParams.myGroundAngleToIgnore > 0 && surfaceAngle <= collisionCheckParams.myGroundAngleToIgnore + 0.0001)) ||\r\n (!isGround && (collisionCheckParams.myCeilingAngleToIgnore > 0 && surfaceAngle <= collisionCheckParams.myCeilingAngleToIgnore + 0.0001))) {\r\n if (objectsToIgnore == null || objectsToIgnore.pp_hasEqual(hit.myObject, objectsEqualCallback)) {\r\n let surfaceHeightCheckOk = true;\r\n let maxMovementLeftCheckOk = true;\r\n\r\n if (surfaceIgnoreHeight != null) {\r\n surfaceHeightCheckOk = false;\r\n\r\n let feetPositionUp = feetPosition.vec3_valueAlongAxis(up);\r\n let hitUp = hit.myPosition.vec3_valueAlongAxis(up);\r\n let hitHeight = hitUp - feetPositionUp;\r\n if ((isGround && hitHeight <= surfaceIgnoreHeight) || (!isGround && hitHeight >= surfaceIgnoreHeight)) {\r\n surfaceHeightCheckOk = true;\r\n } else {\r\n //console.error(hitHeight.toFixed(6));\r\n }\r\n }\r\n\r\n if (surfaceHeightCheckOk && isMovementCheck) {\r\n if (surfaceIgnoreMaxMovementLeft != null) {\r\n let movementLength = movementOrForward.vec3_length();\r\n if (movementLength > surfaceIgnoreMaxMovementLeft) {\r\n maxMovementLeftCheckOk = false;\r\n\r\n let hitPosition = hit.myPosition;\r\n let halfConeAngle = Math.min(collisionCheckParams.myHalfConeAngle, 90);\r\n hitDirection = hitPosition.vec3_sub(feetPosition, hitDirection);\r\n\r\n if (hitDirection.vec3_isToTheRight(movementDirection, up)) {\r\n projectAlongAxis = movementDirection.vec3_rotateAxis(-halfConeAngle, up, projectAlongAxis);\r\n } else {\r\n projectAlongAxis = movementDirection.vec3_rotateAxis(halfConeAngle, up, projectAlongAxis);\r\n }\r\n\r\n hitMovement = hitDirection.vec3_projectOnAxisAlongAxis(movementDirection, projectAlongAxis, hitMovement);\r\n\r\n let hitMovementLength = hitMovement.vec3_length();\r\n let movementLeft = movementLength - hitMovementLength;\r\n\r\n if (movementLeft <= surfaceIgnoreMaxMovementLeft) {\r\n maxMovementLeftCheckOk = true;\r\n } else {\r\n //console.error(movementLeft.toFixed(3));\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (surfaceHeightCheckOk && maxMovementLeftCheckOk) {\r\n isIgnorable = true;\r\n }\r\n }\r\n }\r\n } else if (ignoreHitsInsideCollisionIfObjectToIgnore) {\r\n // #TODO When raycast pierce will work, if it gives the normal even when inside check if the angle is ok and only ignore if that's the case\r\n if (objectsToIgnore == null || objectsToIgnore.pp_hasEqual(hit.myObject, objectsEqualCallback)) {\r\n isIgnorable = true;\r\n }\r\n }\r\n\r\n if (isIgnorable) {\r\n if (outIgnoredObjects != null) {\r\n outIgnoredObjects.pp_pushUnique(hit.myObject, objectsEqualCallback);\r\n }\r\n }\r\n\r\n\r\n return isIgnorable;\r\n };\r\n}();", "import { RaycastHit } from \"../../../../../../cauldron/physics/physics_raycast_params.js\";\r\nimport { vec3_create } from \"../../../../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { CollisionCheckHorizontalBase } from \"./collision_check_horizontal_base.js\";\r\n\r\nexport class CollisionCheckHorizontalPosition extends CollisionCheckHorizontalBase {\r\n\r\n _horizontalPositionCheck(originalFeetPosition, originalHeight, feetPosition, height, up, forward, collisionCheckParams, collisionRuntimeParams) {\r\n // Implemented outside class definition\r\n }\r\n\r\n _horizontalPositionHorizontalCheck(feetPosition, checkPositions, heightOffset, up, forward, ignoreGroundAngleCallback, ignoreCeilingAngleCallback, collisionCheckParams, collisionRuntimeParams) {\r\n // Implemented outside class definition\r\n }\r\n\r\n _horizontalPositionVerticalCheck(feetPosition, checkPositions, heightOffset, heightStep, verticalDirection, up, ignoreGroundAngleCallback, ignoreCeilingAngleCallback, collisionCheckParams, collisionRuntimeParams) {\r\n // Implemented outside class definition\r\n }\r\n}\r\n\r\n\r\n\r\n// IMPLEMENTATION\r\n\r\nCollisionCheckHorizontalPosition.prototype._horizontalPositionCheck = function () {\r\n let checkPositions = [];\r\n let cachedCheckPositions = [];\r\n let currentCachedCheckPositionIndex = 0;\r\n let _localGetCachedCheckPosition = function () {\r\n let item = null;\r\n while (cachedCheckPositions.length <= currentCachedCheckPositionIndex) {\r\n cachedCheckPositions.push(vec3_create());\r\n }\r\n\r\n item = cachedCheckPositions[currentCachedCheckPositionIndex];\r\n currentCachedCheckPositionIndex++;\r\n return item;\r\n };\r\n\r\n let _localGroundObjectsToIgnore = [];\r\n let _localCeilingObjectsToIgnore = [];\r\n let _localGroundCeilingObjectsToIgnore = [];\r\n\r\n let objectsEqualCallback = (first, second) => first == second;\r\n\r\n let heightOffset = vec3_create();\r\n let heightStep = vec3_create();\r\n let currentHeightOffset = vec3_create();\r\n let hitHeightOffset = vec3_create();\r\n let hitHeightOffsetEpsilon = vec3_create();\r\n let downwardHeightOffset = vec3_create();\r\n let downwardHeightStep = vec3_create();\r\n\r\n let verticalDirection = vec3_create();\r\n\r\n let vertilCheckHit = new RaycastHit();\r\n\r\n return function _horizontalPositionCheck(originalFeetPosition, originalHeight, feetPosition, height, up, forward, collisionCheckParams, collisionRuntimeParams) {\r\n this._myDebugEnabled = collisionCheckParams.myDebugEnabled && collisionCheckParams.myDebugHorizontalPositionEnabled;\r\n\r\n checkPositions.length = 0;\r\n currentCachedCheckPositionIndex = 0;\r\n\r\n let halfConeAngle = Math.min(collisionCheckParams.myHalfConeAngle, 180);\r\n let sliceAngle = halfConeAngle / collisionCheckParams.myHalfConeSliceAmount;\r\n let tempCheckPosition = _localGetCachedCheckPosition();\r\n checkPositions.push(feetPosition.vec3_add(forward.vec3_scale(collisionCheckParams.myRadius, tempCheckPosition), tempCheckPosition));\r\n for (let i = 1; i <= collisionCheckParams.myHalfConeSliceAmount; i++) {\r\n let currentAngle = i * sliceAngle;\r\n\r\n tempCheckPosition = _localGetCachedCheckPosition();\r\n let radialDirection = forward.vec3_rotateAxis(-currentAngle, up, tempCheckPosition);\r\n checkPositions.push(feetPosition.vec3_add(radialDirection.vec3_scale(collisionCheckParams.myRadius, radialDirection), radialDirection));\r\n\r\n tempCheckPosition = _localGetCachedCheckPosition();\r\n radialDirection = forward.vec3_rotateAxis(currentAngle, up, tempCheckPosition);\r\n checkPositions.push(feetPosition.vec3_add(radialDirection.vec3_scale(collisionCheckParams.myRadius, radialDirection), radialDirection));\r\n }\r\n\r\n let groundObjectsToIgnore = null;\r\n let ceilingObjectsToIgnore = null;\r\n let groundCeilingObjectsToIgnore = null;\r\n\r\n if (collisionCheckParams.myGroundAngleToIgnore > 0) {\r\n // Gather ground objects to ignore\r\n groundObjectsToIgnore = _localGroundObjectsToIgnore;\r\n groundObjectsToIgnore.length = 0;\r\n groundCeilingObjectsToIgnore = _localGroundCeilingObjectsToIgnore;\r\n groundCeilingObjectsToIgnore.length = 0;\r\n\r\n let ignoreGroundAngleCallback = this._ignoreSurfaceAngle.bind(this, originalFeetPosition, originalHeight, forward, null, groundObjectsToIgnore, true, false, up, collisionCheckParams);\r\n\r\n let ignoreCeilingAngleCallback = null;\r\n if (collisionCheckParams.myCeilingAngleToIgnore > 0) {\r\n ignoreCeilingAngleCallback = this._ignoreSurfaceAngle.bind(this, originalFeetPosition, originalHeight, forward, null, groundCeilingObjectsToIgnore, false, false, up, collisionCheckParams);\r\n }\r\n\r\n heightOffset.vec3_zero();\r\n this._horizontalPositionHorizontalCheck(feetPosition, checkPositions, heightOffset, up, forward, ignoreGroundAngleCallback, ignoreCeilingAngleCallback, collisionCheckParams, collisionRuntimeParams);\r\n }\r\n\r\n if (collisionCheckParams.myCeilingAngleToIgnore > 0) {\r\n // Gather ceiling objects to ignore\r\n if (!collisionRuntimeParams.myIsCollidingHorizontally && collisionCheckParams.myCheckHeight) {\r\n ceilingObjectsToIgnore = _localCeilingObjectsToIgnore;\r\n ceilingObjectsToIgnore.length = 0;\r\n\r\n let ignoreGroundAngleCallback = null;\r\n if (collisionCheckParams.myGroundAngleToIgnore > 0) {\r\n ignoreGroundAngleCallback = this._ignoreSurfaceAngle.bind(this, originalFeetPosition, originalHeight, forward, groundObjectsToIgnore, null, true, false, up, collisionCheckParams);\r\n }\r\n\r\n let ignoreCeilingAngleCallback = this._ignoreSurfaceAngle.bind(this, originalFeetPosition, originalHeight, forward, null, ceilingObjectsToIgnore, false, false, up, collisionCheckParams);\r\n\r\n heightOffset = up.vec3_scale(height, heightOffset);\r\n this._horizontalPositionHorizontalCheck(feetPosition, checkPositions, heightOffset, up, forward, ignoreGroundAngleCallback, ignoreCeilingAngleCallback, collisionCheckParams, collisionRuntimeParams);\r\n }\r\n }\r\n\r\n if (!collisionRuntimeParams.myIsCollidingHorizontally) {\r\n\r\n let groundCeilingCheckIsFine = true;\r\n\r\n if (groundCeilingObjectsToIgnore != null) {\r\n // Check that the ceiling objects ignored by the ground are the correct ones, that is the one ignored by the upper check\r\n for (let object of groundCeilingObjectsToIgnore) {\r\n if (!ceilingObjectsToIgnore.pp_hasEqual(object, objectsEqualCallback)) {\r\n groundCeilingCheckIsFine = false;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n let ignoreGroundAngleCallback = null;\r\n let ignoreCeilingAngleCallback = null;\r\n\r\n if (collisionCheckParams.myGroundAngleToIgnore > 0) {\r\n ignoreGroundAngleCallback = this._ignoreSurfaceAngle.bind(this, originalFeetPosition, originalHeight, forward, groundObjectsToIgnore, null, true, false, up, collisionCheckParams);\r\n }\r\n\r\n if (collisionCheckParams.myCeilingAngleToIgnore > 0) {\r\n ignoreCeilingAngleCallback = this._ignoreSurfaceAngle.bind(this, originalFeetPosition, originalHeight, forward, ceilingObjectsToIgnore, null, false, false, up, collisionCheckParams);\r\n }\r\n\r\n let heightStepAmount = 0;\r\n if (collisionCheckParams.myCheckHeight && collisionCheckParams.myHeightCheckStepAmountPosition > 0 && height > 0) {\r\n heightStepAmount = collisionCheckParams.myHeightCheckStepAmountPosition;\r\n up.vec3_scale(height / heightStepAmount, heightStep);\r\n }\r\n\r\n for (let i = 0; i <= heightStepAmount; i++) {\r\n currentHeightOffset = heightStep.vec3_scale(i, currentHeightOffset);\r\n\r\n // We can skip the ground check since we have already done that, but if there was an error do it again with the proper set of objects to ignore\r\n // The ceiling check can always be ignored, it used the proper ground objects already\r\n if (collisionCheckParams.myCheckHeightTopPosition || i == 0) {\r\n if ((i != 0 && i != heightStepAmount) ||\r\n (i == 0 && !groundCeilingCheckIsFine) ||\r\n (i == 0 && collisionCheckParams.myGroundAngleToIgnore == 0) ||\r\n (i != 0 && i == heightStepAmount && collisionCheckParams.myCeilingAngleToIgnore == 0)) {\r\n this._horizontalPositionHorizontalCheck(feetPosition, checkPositions, currentHeightOffset, up, forward, ignoreGroundAngleCallback, ignoreCeilingAngleCallback, collisionCheckParams, collisionRuntimeParams);\r\n\r\n if (collisionRuntimeParams.myIsCollidingHorizontally) {\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if (i > 0) {\r\n if (collisionCheckParams.myCheckHeightVerticalPosition) {\r\n // This offset is a workaround for objects that in the editor are aligned but due to clamp get a bit tilted when in the game\r\n // and therefore trying an horizontal cast on the vertical hit position could result in hitting the bottom which in theory should be parallel and therefore not possible\r\n let hitHeightOffsetEpsilonValue = 0.0001;\r\n\r\n if (collisionCheckParams.myHorizontalPositionCheckVerticalDirectionType == 0 || collisionCheckParams.myHorizontalPositionCheckVerticalDirectionType == 2) {\r\n verticalDirection.vec3_copy(up);\r\n this._horizontalPositionVerticalCheck(feetPosition, checkPositions, currentHeightOffset, heightStep, verticalDirection, up, ignoreGroundAngleCallback, ignoreCeilingAngleCallback, collisionCheckParams, collisionRuntimeParams);\r\n\r\n if (collisionRuntimeParams.myIsCollidingHorizontally && collisionCheckParams.myCheckHeightConeOnCollision) {\r\n hitHeightOffset = collisionRuntimeParams.myHorizontalCollisionHit.myPosition.vec3_sub(feetPosition, hitHeightOffset).vec3_componentAlongAxis(up, hitHeightOffset);\r\n hitHeightOffset.vec3_add(verticalDirection.vec3_scale(hitHeightOffsetEpsilonValue, hitHeightOffsetEpsilon), hitHeightOffset);\r\n\r\n collisionRuntimeParams.myIsCollidingHorizontally = false;\r\n if (collisionCheckParams.myCheckHeightConeOnCollisionKeepHit) {\r\n vertilCheckHit.copy(collisionRuntimeParams.myHorizontalCollisionHit);\r\n }\r\n collisionRuntimeParams.myHorizontalCollisionHit.reset();\r\n this._horizontalPositionHorizontalCheck(feetPosition, checkPositions, hitHeightOffset, up, forward, ignoreGroundAngleCallback, ignoreCeilingAngleCallback, collisionCheckParams, collisionRuntimeParams);\r\n\r\n if (collisionRuntimeParams.myIsCollidingHorizontally) {\r\n break;\r\n } else if (collisionCheckParams.myCheckHeightConeOnCollisionKeepHit) {\r\n collisionRuntimeParams.myIsCollidingHorizontally = true;\r\n collisionRuntimeParams.myHorizontalCollisionHit.copy(vertilCheckHit);\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if (!collisionRuntimeParams.myIsCollidingHorizontally) {\r\n if (collisionCheckParams.myHorizontalPositionCheckVerticalDirectionType == 1 || collisionCheckParams.myHorizontalPositionCheckVerticalDirectionType == 2) {\r\n verticalDirection = up.vec3_negate(verticalDirection);\r\n downwardHeightOffset = currentHeightOffset.vec3_sub(heightStep, downwardHeightOffset);\r\n downwardHeightStep = heightStep.vec3_negate(downwardHeightStep);\r\n this._horizontalPositionVerticalCheck(feetPosition, checkPositions, downwardHeightOffset, downwardHeightStep, verticalDirection, up, ignoreGroundAngleCallback, ignoreCeilingAngleCallback, collisionCheckParams, collisionRuntimeParams);\r\n }\r\n\r\n if (collisionRuntimeParams.myIsCollidingHorizontally && collisionCheckParams.myCheckHeightConeOnCollision) {\r\n hitHeightOffset = collisionRuntimeParams.myHorizontalCollisionHit.myPosition.vec3_sub(feetPosition, hitHeightOffset).vec3_componentAlongAxis(up, hitHeightOffset);\r\n hitHeightOffset.vec3_add(verticalDirection.vec3_scale(hitHeightOffsetEpsilonValue, hitHeightOffsetEpsilon), hitHeightOffset);\r\n\r\n collisionRuntimeParams.myIsCollidingHorizontally = false;\r\n if (collisionCheckParams.myCheckHeightConeOnCollisionKeepHit) {\r\n vertilCheckHit.copy(collisionRuntimeParams.myHorizontalCollisionHit);\r\n }\r\n collisionRuntimeParams.myHorizontalCollisionHit.reset();\r\n this._horizontalPositionHorizontalCheck(feetPosition, checkPositions, hitHeightOffset, up, forward, ignoreGroundAngleCallback, ignoreCeilingAngleCallback, collisionCheckParams, collisionRuntimeParams);\r\n\r\n if (collisionRuntimeParams.myIsCollidingHorizontally) {\r\n break;\r\n } else if (collisionCheckParams.myCheckHeightConeOnCollisionKeepHit) {\r\n collisionRuntimeParams.myIsCollidingHorizontally = true;\r\n collisionRuntimeParams.myHorizontalCollisionHit.copy(vertilCheckHit);\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n return !collisionRuntimeParams.myIsCollidingHorizontally;\r\n };\r\n}();\r\n\r\nCollisionCheckHorizontalPosition.prototype._horizontalPositionHorizontalCheck = function () {\r\n let basePosition = vec3_create();\r\n let forwardNegate = vec3_create();\r\n let currentRadialPosition = vec3_create();\r\n let previousRadialPosition = vec3_create();\r\n return function _horizontalPositionHorizontalCheck(feetPosition, checkPositions, heightOffset, up, forward, ignoreGroundAngleCallback, ignoreCeilingAngleCallback, collisionCheckParams, collisionRuntimeParams) {\r\n let isHorizontalCheckOk = true;\r\n\r\n basePosition = feetPosition.vec3_add(heightOffset, basePosition);\r\n\r\n let halfRadialPositions = Math.floor(checkPositions.length / 2) + 1;\r\n for (let j = 0; j < halfRadialPositions; j++) {\r\n if (j > 0) {\r\n let leftIndex = Math.max(0, j * 2);\r\n let rightIndex = Math.max(0, (j * 2 - 1));\r\n let leftAndRightEqual = checkPositions[leftIndex].vec_equals(checkPositions[rightIndex], 0.000001);\r\n\r\n if (collisionCheckParams.myCheckConeBorder) {\r\n for (let r = 0; r < 2; r++) {\r\n let currentIndex = r == 0 ? leftIndex : rightIndex;\r\n\r\n currentRadialPosition = checkPositions[currentIndex].vec3_add(heightOffset, currentRadialPosition);\r\n\r\n let previousIndex = Math.max(0, currentIndex - 2);\r\n previousRadialPosition = checkPositions[previousIndex].vec3_add(heightOffset, previousRadialPosition);\r\n\r\n isHorizontalCheckOk = this._horizontalCheckRaycast(previousRadialPosition, currentRadialPosition, forward.vec3_negate(forwardNegate), up,\r\n true, ignoreGroundAngleCallback, ignoreCeilingAngleCallback,\r\n feetPosition, true,\r\n collisionCheckParams, collisionRuntimeParams);\r\n\r\n if (!isHorizontalCheckOk) break;\r\n }\r\n }\r\n\r\n if (collisionCheckParams.myCheckConeRay && isHorizontalCheckOk) {\r\n for (let r = 0; r < 2; r++) {\r\n if (r == 1 && leftAndRightEqual) {\r\n break;\r\n }\r\n\r\n let currentIndex = r == 0 ? leftIndex : rightIndex;\r\n\r\n currentRadialPosition = checkPositions[currentIndex].vec3_add(heightOffset, currentRadialPosition);\r\n\r\n isHorizontalCheckOk = this._horizontalCheckRaycast(basePosition, currentRadialPosition, null, up,\r\n false, ignoreGroundAngleCallback, ignoreCeilingAngleCallback,\r\n feetPosition, false,\r\n collisionCheckParams, collisionRuntimeParams);\r\n\r\n if (!isHorizontalCheckOk) break;\r\n }\r\n }\r\n } else {\r\n if (collisionCheckParams.myCheckConeRay) {\r\n currentRadialPosition = checkPositions[j].vec3_add(heightOffset, currentRadialPosition);\r\n\r\n isHorizontalCheckOk = this._horizontalCheckRaycast(basePosition, currentRadialPosition, null, up,\r\n false, ignoreGroundAngleCallback, ignoreCeilingAngleCallback,\r\n feetPosition, false,\r\n collisionCheckParams, collisionRuntimeParams);\r\n\r\n if (!isHorizontalCheckOk) break;\r\n }\r\n }\r\n\r\n if (!isHorizontalCheckOk) {\r\n break;\r\n }\r\n }\r\n\r\n if (!isHorizontalCheckOk) {\r\n collisionRuntimeParams.myIsCollidingHorizontally = true;\r\n collisionRuntimeParams.myHorizontalCollisionHit.copy(this._myRaycastResult.myHits[0]);\r\n }\r\n\r\n return isHorizontalCheckOk;\r\n };\r\n}();\r\n\r\nCollisionCheckHorizontalPosition.prototype._horizontalPositionVerticalCheck = function () {\r\n let basePosition = vec3_create();\r\n let previousBasePosition = vec3_create();\r\n let currentRadialPosition = vec3_create();\r\n let previousRadialPosition = vec3_create();\r\n let previousCurrentRadialPosition = vec3_create();\r\n let previousPreviousRadialPosition = vec3_create();\r\n return function _horizontalPositionVerticalCheck(feetPosition, checkPositions, heightOffset, heightStep, verticalDirection, up, ignoreGroundAngleCallback, ignoreCeilingAngleCallback, collisionCheckParams, collisionRuntimeParams) {\r\n let isHorizontalCheckOk = true;\r\n\r\n basePosition = feetPosition.vec3_add(heightOffset, basePosition);\r\n previousBasePosition = basePosition.vec3_sub(heightStep, previousBasePosition);\r\n\r\n for (let j = 0; j <= checkPositions.length; j++) {\r\n let previousCheckPositionIsEqual = false;\r\n\r\n if (j == checkPositions.length) {\r\n currentRadialPosition.vec3_copy(basePosition);\r\n previousRadialPosition.vec3_copy(previousBasePosition);\r\n } else {\r\n currentRadialPosition = checkPositions[j].vec3_add(heightOffset, currentRadialPosition);\r\n previousRadialPosition = currentRadialPosition.vec3_sub(heightStep, previousRadialPosition);\r\n\r\n if (j > 0) {\r\n previousCheckPositionIsEqual = checkPositions[j].vec_equals(checkPositions[j - 1], 0.000001);\r\n }\r\n }\r\n\r\n if (collisionCheckParams.myCheckVerticalStraight && !previousCheckPositionIsEqual) {\r\n isHorizontalCheckOk = this._horizontalCheckRaycast(previousRadialPosition, currentRadialPosition, null, up,\r\n collisionCheckParams.myHorizontalPositionCheckVerticalIgnoreHitsInsideCollision, ignoreGroundAngleCallback, ignoreCeilingAngleCallback,\r\n feetPosition, true,\r\n collisionCheckParams, collisionRuntimeParams, true, true);\r\n\r\n if (!isHorizontalCheckOk) {\r\n if (!collisionRuntimeParams.myIsCollidingHorizontally) {\r\n collisionRuntimeParams.myIsCollidingHorizontally = true;\r\n collisionRuntimeParams.myHorizontalCollisionHit.copy(this._myRaycastResult.myHits[0]);\r\n } else if (this._myRaycastResult.myHits[0].myPosition.vec3_isFartherAlongAxis(collisionRuntimeParams.myHorizontalCollisionHit.myPosition, verticalDirection)) {\r\n collisionRuntimeParams.myHorizontalCollisionHit.copy(this._myRaycastResult.myHits[0]);\r\n }\r\n\r\n if (!collisionCheckParams.myCheckVerticalSearchFartherVerticalHit) {\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if (j < checkPositions.length) {\r\n if ((collisionCheckParams.myCheckVerticalDiagonalRayOutward ||\r\n (collisionCheckParams.myCheckVerticalDiagonalBorderRayOutward && (j == checkPositions.length - 2 || j == checkPositions.length - 1))) &&\r\n !previousCheckPositionIsEqual) {\r\n isHorizontalCheckOk = this._horizontalCheckRaycast(previousBasePosition, currentRadialPosition, null, up,\r\n collisionCheckParams.myHorizontalPositionCheckVerticalIgnoreHitsInsideCollision, ignoreGroundAngleCallback, ignoreCeilingAngleCallback,\r\n feetPosition, true,\r\n collisionCheckParams, collisionRuntimeParams, true, true);\r\n\r\n if (!isHorizontalCheckOk) {\r\n if (!collisionRuntimeParams.myIsCollidingHorizontally) {\r\n collisionRuntimeParams.myIsCollidingHorizontally = true;\r\n collisionRuntimeParams.myHorizontalCollisionHit.copy(this._myRaycastResult.myHits[0]);\r\n } else if (this._myRaycastResult.myHits[0].myPosition.vec3_isFartherAlongAxis(collisionRuntimeParams.myHorizontalCollisionHit.myPosition, verticalDirection)) {\r\n collisionRuntimeParams.myHorizontalCollisionHit.copy(this._myRaycastResult.myHits[0]);\r\n }\r\n\r\n if (!collisionCheckParams.myCheckVerticalSearchFartherVerticalHit) {\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if ((collisionCheckParams.myCheckVerticalDiagonalRayInward ||\r\n (collisionCheckParams.myCheckVerticalDiagonalBorderRayInward && (j == checkPositions.length - 2 || j == checkPositions.length - 1))) &&\r\n !previousCheckPositionIsEqual) {\r\n isHorizontalCheckOk = this._horizontalCheckRaycast(previousRadialPosition, basePosition, null, up,\r\n collisionCheckParams.myHorizontalPositionCheckVerticalIgnoreHitsInsideCollision, ignoreGroundAngleCallback, ignoreCeilingAngleCallback,\r\n feetPosition, true,\r\n collisionCheckParams, collisionRuntimeParams, true, true);\r\n\r\n if (!isHorizontalCheckOk) {\r\n if (!collisionRuntimeParams.myIsCollidingHorizontally) {\r\n collisionRuntimeParams.myIsCollidingHorizontally = true;\r\n collisionRuntimeParams.myHorizontalCollisionHit.copy(this._myRaycastResult.myHits[0]);\r\n } else if (this._myRaycastResult.myHits[0].myPosition.vec3_isFartherAlongAxis(collisionRuntimeParams.myHorizontalCollisionHit.myPosition, verticalDirection)) {\r\n collisionRuntimeParams.myHorizontalCollisionHit.copy(this._myRaycastResult.myHits[0]);\r\n }\r\n\r\n if (!collisionCheckParams.myCheckVerticalSearchFartherVerticalHit) {\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if (j > 0) {\r\n if (collisionCheckParams.myCheckVerticalDiagonalBorderOutward || collisionCheckParams.myCheckVerticalDiagonalBorderInward) {\r\n let previousIndex = Math.max(0, j - 2);\r\n previousCurrentRadialPosition = checkPositions[previousIndex].vec3_add(heightOffset, previousCurrentRadialPosition);\r\n previousPreviousRadialPosition = previousCurrentRadialPosition.vec3_sub(heightStep, previousPreviousRadialPosition);\r\n\r\n if (collisionCheckParams.myCheckVerticalDiagonalBorderOutward) {\r\n isHorizontalCheckOk = this._horizontalCheckRaycast(previousPreviousRadialPosition, currentRadialPosition, null, up,\r\n collisionCheckParams.myHorizontalPositionCheckVerticalIgnoreHitsInsideCollision, ignoreGroundAngleCallback, ignoreCeilingAngleCallback,\r\n feetPosition, true,\r\n collisionCheckParams, collisionRuntimeParams, true, true);\r\n\r\n if (!isHorizontalCheckOk) {\r\n if (!collisionRuntimeParams.myIsCollidingHorizontally) {\r\n collisionRuntimeParams.myIsCollidingHorizontally = true;\r\n collisionRuntimeParams.myHorizontalCollisionHit.copy(this._myRaycastResult.myHits[0]);\r\n } else if (this._myRaycastResult.myHits[0].myPosition.vec3_isFartherAlongAxis(collisionRuntimeParams.myHorizontalCollisionHit.myPosition, verticalDirection)) {\r\n collisionRuntimeParams.myHorizontalCollisionHit.copy(this._myRaycastResult.myHits[0]);\r\n }\r\n\r\n if (!collisionCheckParams.myCheckVerticalSearchFartherVerticalHit) {\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if (collisionCheckParams.myCheckVerticalDiagonalBorderInward) {\r\n isHorizontalCheckOk = this._horizontalCheckRaycast(previousRadialPosition, previousCurrentRadialPosition, null, up,\r\n collisionCheckParams.myHorizontalPositionCheckVerticalIgnoreHitsInsideCollision, ignoreGroundAngleCallback, ignoreCeilingAngleCallback,\r\n feetPosition, true,\r\n collisionCheckParams, collisionRuntimeParams, true, true);\r\n\r\n if (!isHorizontalCheckOk) {\r\n if (!collisionRuntimeParams.myIsCollidingHorizontally) {\r\n collisionRuntimeParams.myIsCollidingHorizontally = true;\r\n collisionRuntimeParams.myHorizontalCollisionHit.copy(this._myRaycastResult.myHits[0]);\r\n } else if (this._myRaycastResult.myHits[0].myPosition.vec3_isFartherAlongAxis(collisionRuntimeParams.myHorizontalCollisionHit.myPosition, verticalDirection)) {\r\n collisionRuntimeParams.myHorizontalCollisionHit.copy(this._myRaycastResult.myHits[0]);\r\n }\r\n\r\n if (!collisionCheckParams.myCheckVerticalSearchFartherVerticalHit) {\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n return !collisionRuntimeParams.myIsCollidingHorizontally;\r\n };\r\n}();", "import { vec3_create } from \"../../../../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { CollisionCheckHorizontalPosition } from \"./collision_check_horizontal_position.js\";\r\n\r\nexport class CollisionCheckHorizontalMovement extends CollisionCheckHorizontalPosition {\r\n\r\n _horizontalMovementCheck(movement, originalFeetPosition, originalHeight, feetPosition, height, up, collisionCheckParams, collisionRuntimeParams) {\r\n // Implemented outside class definition\r\n }\r\n\r\n _horizontalMovementVerticalCheck(movement, feetPosition, checkPositions, heightOffset, heightStep, up, ignoreGroundAngleCallback, ignoreCeilingAngleCallback, collisionCheckParams, collisionRuntimeParams) {\r\n // Implemented outside class definition\r\n }\r\n\r\n _horizontalMovementHorizontalCheck(movement, feetPosition, checkPositions, heightOffset, up, ignoreGroundAngleCallback, ignoreCeilingAngleCallback, collisionCheckParams, collisionRuntimeParams) {\r\n // Implemented outside class definition\r\n }\r\n}\r\n\r\n\r\n\r\n// IMPLEMENTATION\r\n\r\nCollisionCheckHorizontalMovement.prototype._horizontalMovementCheck = function () {\r\n let checkPositions = [];\r\n let cachedCheckPositions = [];\r\n let currentCachedCheckPositionIndex = 0;\r\n let _localGetCachedCheckPosition = function () {\r\n let item = null;\r\n while (cachedCheckPositions.length <= currentCachedCheckPositionIndex) {\r\n cachedCheckPositions.push(vec3_create());\r\n }\r\n\r\n item = cachedCheckPositions[currentCachedCheckPositionIndex];\r\n currentCachedCheckPositionIndex++;\r\n return item;\r\n };\r\n\r\n let _localGroundObjectsToIgnore = [];\r\n let _localCeilingObjectsToIgnore = [];\r\n let _localGroundCeilingObjectsToIgnore = [];\r\n\r\n let objectsEqualCallback = (first, second) => first == second;\r\n\r\n let movementDirection = vec3_create();\r\n let heightOffset = vec3_create();\r\n let heightStep = vec3_create();\r\n let currentHeightOffset = vec3_create();\r\n let leftRadialDirection = vec3_create();\r\n let rightRadialDirection = vec3_create();\r\n return function _horizontalMovementCheck(movement, originalFeetPosition, originalHeight, feetPosition, height, up, collisionCheckParams, collisionRuntimeParams) {\r\n // #TODO Add a flag in the params to specify if u want to allow movement inside collision (to hope that it will end up in a non collision position)\r\n // Also vertical check should check all hits like the position check\r\n // For now is ok as it is, the movement check is not as important and could also be disabled it the movement per frame is very small\r\n\r\n this._myDebugEnabled = collisionCheckParams.myDebugEnabled && collisionCheckParams.myDebugHorizontalMovementEnabled;\r\n\r\n let halfConeAngle = Math.min(collisionCheckParams.myHalfConeAngle, 90);\r\n movementDirection = movement.vec3_normalize(movementDirection);\r\n\r\n checkPositions.length = 0;\r\n currentCachedCheckPositionIndex = 0;\r\n\r\n let steplength = collisionCheckParams.myRadius / collisionCheckParams.myHorizontalMovementRadialStepAmount;\r\n\r\n {\r\n let tempCheckPosition = _localGetCachedCheckPosition();\r\n tempCheckPosition.vec3_copy(feetPosition);\r\n checkPositions.push(tempCheckPosition);\r\n }\r\n\r\n {\r\n leftRadialDirection = movementDirection.vec3_rotateAxis(halfConeAngle, up, leftRadialDirection);\r\n rightRadialDirection = movementDirection.vec3_rotateAxis(-halfConeAngle, up, rightRadialDirection);\r\n for (let i = 1; i <= collisionCheckParams.myHorizontalMovementRadialStepAmount; i++) {\r\n // Left\r\n {\r\n let currentStep = i * steplength;\r\n let tempCheckPosition = _localGetCachedCheckPosition();\r\n let currentRadialPosition = leftRadialDirection.vec3_scale(currentStep, tempCheckPosition);\r\n let currentCheckPosition = currentRadialPosition.vec3_add(feetPosition, currentRadialPosition);\r\n checkPositions.push(currentCheckPosition);\r\n }\r\n\r\n // Right\r\n {\r\n let currentStep = i * steplength;\r\n let tempCheckPosition = _localGetCachedCheckPosition();\r\n let currentRadialPosition = rightRadialDirection.vec3_scale(currentStep, tempCheckPosition);\r\n let currentCheckPosition = currentRadialPosition.vec3_add(feetPosition, currentRadialPosition);\r\n checkPositions.push(currentCheckPosition);\r\n }\r\n }\r\n }\r\n\r\n // If result is inside a collision it's ignored, so that at least you can exit it before seeing if the new position works now\r\n\r\n let groundObjectsToIgnore = null;\r\n let ceilingObjectsToIgnore = null;\r\n let groundCeilingObjectsToIgnore = null;\r\n\r\n if (collisionCheckParams.myGroundAngleToIgnore > 0) {\r\n // Gather ground objects to ignore\r\n groundObjectsToIgnore = _localGroundObjectsToIgnore;\r\n groundObjectsToIgnore.length = 0;\r\n groundCeilingObjectsToIgnore = _localGroundCeilingObjectsToIgnore;\r\n groundCeilingObjectsToIgnore.length = 0;\r\n\r\n let ignoreGroundAngleCallback = this._ignoreSurfaceAngle.bind(this, originalFeetPosition, originalHeight, movement, null, groundObjectsToIgnore, true, true, up, collisionCheckParams);\r\n\r\n let ignoreCeilingAngleCallback = null;\r\n if (collisionCheckParams.myCeilingAngleToIgnore > 0) {\r\n ignoreCeilingAngleCallback = this._ignoreSurfaceAngle.bind(this, originalFeetPosition, originalHeight, movement, null, groundCeilingObjectsToIgnore, false, true, up, collisionCheckParams);\r\n }\r\n\r\n heightOffset.vec3_zero();\r\n this._horizontalMovementHorizontalCheck(movement, feetPosition, checkPositions, heightOffset, up, ignoreGroundAngleCallback, ignoreCeilingAngleCallback, collisionCheckParams, collisionRuntimeParams);\r\n }\r\n\r\n if (collisionCheckParams.myCeilingAngleToIgnore > 0) {\r\n // Gather ceiling objects to ignore\r\n if (!collisionRuntimeParams.myIsCollidingHorizontally && collisionCheckParams.myCheckHeight) {\r\n ceilingObjectsToIgnore = _localCeilingObjectsToIgnore;\r\n ceilingObjectsToIgnore.length = 0;\r\n\r\n let ignoreGroundAngleCallback = null;\r\n if (collisionCheckParams.myGroundAngleToIgnore > 0) {\r\n ignoreGroundAngleCallback = this._ignoreSurfaceAngle.bind(this, originalFeetPosition, originalHeight, movement, groundObjectsToIgnore, null, true, true, up, collisionCheckParams);\r\n }\r\n\r\n let ignoreCeilingAngleCallback = this._ignoreSurfaceAngle.bind(this, originalFeetPosition, originalHeight, movement, null, ceilingObjectsToIgnore, false, true, up, collisionCheckParams);\r\n\r\n heightOffset = up.vec3_scale(height, heightOffset);\r\n this._horizontalMovementHorizontalCheck(movement, feetPosition, checkPositions, heightOffset, up, ignoreGroundAngleCallback, ignoreCeilingAngleCallback, collisionCheckParams, collisionRuntimeParams);\r\n }\r\n }\r\n\r\n if (!collisionRuntimeParams.myIsCollidingHorizontally) {\r\n\r\n let groundCeilingCheckIsFine = true;\r\n\r\n if (groundCeilingObjectsToIgnore != null) {\r\n // Check that the ceiling objects ignored by the ground are the correct ones, that is the one ignored by the upper check\r\n for (let object of groundCeilingObjectsToIgnore) {\r\n if (!ceilingObjectsToIgnore.pp_hasEqual(object, objectsEqualCallback)) {\r\n groundCeilingCheckIsFine = false;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n let ignoreGroundAngleCallback = null;\r\n let ignoreCeilingAngleCallback = null;\r\n\r\n if (collisionCheckParams.myGroundAngleToIgnore > 0) {\r\n ignoreGroundAngleCallback = this._ignoreSurfaceAngle.bind(this, originalFeetPosition, originalHeight, movement, groundObjectsToIgnore, null, true, true, up, collisionCheckParams);\r\n }\r\n\r\n if (collisionCheckParams.myCeilingAngleToIgnore > 0) {\r\n ignoreCeilingAngleCallback = this._ignoreSurfaceAngle.bind(this, originalFeetPosition, originalHeight, movement, ceilingObjectsToIgnore, null, false, true, up, collisionCheckParams);\r\n }\r\n\r\n let heightStepAmount = 0;\r\n if (collisionCheckParams.myCheckHeight && collisionCheckParams.myHeightCheckStepAmountMovement > 0 && height > 0.000001) {\r\n heightStepAmount = collisionCheckParams.myHeightCheckStepAmountMovement;\r\n heightStep = up.vec3_scale(height / heightStepAmount, heightStep);\r\n }\r\n\r\n for (let i = 0; i <= heightStepAmount; i++) {\r\n currentHeightOffset = heightStep.vec3_scale(i, currentHeightOffset);\r\n\r\n // We can skip the ground check since we have already done that, but if there was an error do it again with the proper set of objects to ignore\r\n // The ceiling check can always be ignored, it used the proper ground objects already\r\n if (collisionCheckParams.myCheckHeightTopMovement || i == 0) {\r\n if ((i != 0 && i != heightStepAmount) ||\r\n (i == 0 && !groundCeilingCheckIsFine) ||\r\n (i == 0 && collisionCheckParams.myGroundAngleToIgnore == 0) ||\r\n (i == heightStepAmount && collisionCheckParams.myCeilingAngleToIgnore == 0)) {\r\n this._horizontalMovementHorizontalCheck(movement, feetPosition, checkPositions, currentHeightOffset, up, ignoreGroundAngleCallback, ignoreCeilingAngleCallback, collisionCheckParams, collisionRuntimeParams);\r\n\r\n if (collisionRuntimeParams.myIsCollidingHorizontally) {\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if (i > 0) {\r\n if (collisionCheckParams.myCheckHeightVerticalMovement) {\r\n this._horizontalMovementVerticalCheck(movement, feetPosition, checkPositions, currentHeightOffset, heightStep, up, ignoreGroundAngleCallback, ignoreCeilingAngleCallback, collisionCheckParams, collisionRuntimeParams);\r\n }\r\n\r\n if (collisionRuntimeParams.myIsCollidingHorizontally) {\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n return !collisionRuntimeParams.myIsCollidingHorizontally;\r\n };\r\n}();\r\n\r\nCollisionCheckHorizontalMovement.prototype._horizontalMovementVerticalCheck = function () {\r\n let movementStep = vec3_create();\r\n let movementDirection = vec3_create();\r\n let firstPosition = vec3_create();\r\n let secondPosition = vec3_create();\r\n let firstMovementPosition = vec3_create();\r\n let secondMovementPosition = vec3_create();\r\n let firstHeightPosition = vec3_create();\r\n let secondHeightPosition = vec3_create();\r\n let firstHeightMovementPosition = vec3_create();\r\n let secondHeightMovementPosition = vec3_create();\r\n return function _horizontalMovementVerticalCheck(movement, feetPosition, checkPositions, heightOffset, heightStep, up, ignoreGroundAngleCallback, ignoreCeilingAngleCallback, collisionCheckParams, collisionRuntimeParams) {\r\n let isHorizontalCheckOk = true;\r\n\r\n let movementStepAmount = 1;\r\n movementStep.vec3_copy(movement);\r\n\r\n if (collisionCheckParams.myHorizontalMovementStepEnabled) {\r\n movementStepAmount = Math.max(1, Math.ceil(movement.vec3_length() / collisionCheckParams.myHorizontalMovementStepMaxLength));\r\n movement.vec3_scale(1 / movementStepAmount, movementStep);\r\n }\r\n\r\n movementDirection = movement.vec3_normalize(movementDirection);\r\n\r\n for (let m = 0; m < movementStepAmount; m++) {\r\n for (let j = 0; j < checkPositions.length; j++) {\r\n firstPosition = checkPositions[j].vec3_add(movementStep.vec3_scale(m, firstPosition), firstPosition).vec3_add(heightOffset, firstPosition);\r\n\r\n if (j > 0) {\r\n let secondIndex = Math.max(0, j - 2);\r\n secondPosition = checkPositions[secondIndex].vec3_add(movementStep.vec3_scale(m, secondPosition), secondPosition).vec3_add(heightOffset, secondPosition);\r\n\r\n if (collisionCheckParams.myHorizontalMovementCheckVerticalDiagonalUpwardOutward) {\r\n firstMovementPosition = firstPosition.vec3_add(movementStep, firstMovementPosition);\r\n secondHeightPosition = secondPosition.vec3_sub(heightStep, secondHeightPosition);\r\n\r\n isHorizontalCheckOk = this._horizontalCheckRaycast(secondHeightPosition, firstMovementPosition, movementDirection, up,\r\n true, ignoreGroundAngleCallback, ignoreCeilingAngleCallback,\r\n feetPosition, true,\r\n collisionCheckParams, collisionRuntimeParams);\r\n\r\n if (!isHorizontalCheckOk) break;\r\n }\r\n\r\n if (collisionCheckParams.myHorizontalMovementCheckVerticalDiagonalUpwardInward) {\r\n secondMovementPosition = secondPosition.vec3_add(movementStep, secondMovementPosition);\r\n firstHeightPosition = firstPosition.vec3_sub(heightStep, firstHeightPosition);\r\n\r\n isHorizontalCheckOk = this._horizontalCheckRaycast(firstHeightPosition, secondMovementPosition, movementDirection, up,\r\n true, ignoreGroundAngleCallback, ignoreCeilingAngleCallback,\r\n feetPosition, true,\r\n collisionCheckParams, collisionRuntimeParams);\r\n\r\n if (!isHorizontalCheckOk) break;\r\n }\r\n\r\n if (collisionCheckParams.myHorizontalMovementCheckVerticalDiagonalDownwardOutward) {\r\n firstHeightMovementPosition = firstPosition.vec3_add(movementStep, firstHeightMovementPosition);\r\n firstHeightMovementPosition = firstHeightMovementPosition.vec3_sub(heightStep, firstHeightMovementPosition);\r\n\r\n isHorizontalCheckOk = this._horizontalCheckRaycast(secondPosition, firstHeightMovementPosition, movementDirection, up,\r\n true, ignoreGroundAngleCallback, ignoreCeilingAngleCallback,\r\n feetPosition, true,\r\n collisionCheckParams, collisionRuntimeParams);\r\n\r\n if (!isHorizontalCheckOk) break;\r\n }\r\n\r\n if (collisionCheckParams.myHorizontalMovementCheckVerticalDiagonalDownwardInward) {\r\n secondHeightMovementPosition = secondPosition.vec3_add(movementStep, secondHeightMovementPosition);\r\n secondHeightMovementPosition = secondHeightMovementPosition.vec3_sub(heightStep, secondHeightMovementPosition);\r\n\r\n isHorizontalCheckOk = this._horizontalCheckRaycast(firstPosition, secondHeightMovementPosition, movementDirection, up,\r\n true, ignoreGroundAngleCallback, ignoreCeilingAngleCallback,\r\n feetPosition, true,\r\n collisionCheckParams, collisionRuntimeParams);\r\n\r\n if (!isHorizontalCheckOk) break;\r\n }\r\n\r\n if (m == 0) {\r\n if (collisionCheckParams.myHorizontalMovementCheckVerticalHorizontalBorderDiagonalOutward) {\r\n secondHeightPosition = secondPosition.vec3_sub(heightStep, secondHeightPosition);\r\n\r\n isHorizontalCheckOk = this._horizontalCheckRaycast(secondHeightPosition, firstPosition, movementDirection, up,\r\n true, ignoreGroundAngleCallback, ignoreCeilingAngleCallback,\r\n feetPosition, true,\r\n collisionCheckParams, collisionRuntimeParams);\r\n\r\n if (!isHorizontalCheckOk) break;\r\n }\r\n\r\n if (collisionCheckParams.myHorizontalMovementCheckVerticalHorizontalBorderDiagonalInward) {\r\n let firstHeightPosition = firstPosition.vec3_sub(heightStep);\r\n\r\n isHorizontalCheckOk = this._horizontalCheckRaycast(firstHeightPosition, secondPosition, movementDirection, up,\r\n true, ignoreGroundAngleCallback, ignoreCeilingAngleCallback,\r\n feetPosition, true,\r\n collisionCheckParams, collisionRuntimeParams);\r\n\r\n if (!isHorizontalCheckOk) break;\r\n }\r\n }\r\n\r\n if (collisionCheckParams.myHorizontalMovementCheckVerticalHorizontalBorderDiagonalOutward) {\r\n firstMovementPosition = firstPosition.vec3_add(movementStep, firstMovementPosition);\r\n secondHeightMovementPosition = secondPosition.vec3_sub(heightStep, secondHeightMovementPosition).vec3_add(movementStep, secondHeightMovementPosition);\r\n\r\n isHorizontalCheckOk = this._horizontalCheckRaycast(secondHeightMovementPosition, firstMovementPosition, movementDirection, up,\r\n true, ignoreGroundAngleCallback, ignoreCeilingAngleCallback,\r\n feetPosition, true,\r\n collisionCheckParams, collisionRuntimeParams);\r\n\r\n if (!isHorizontalCheckOk) break;\r\n }\r\n\r\n if (collisionCheckParams.myHorizontalMovementCheckVerticalHorizontalBorderDiagonalInward) {\r\n secondMovementPosition = secondPosition.vec3_add(movementStep, secondMovementPosition);\r\n firstHeightMovementPosition = firstPosition.vec3_sub(heightStep, firstHeightMovementPosition).vec3_add(movementStep, firstHeightMovementPosition);\r\n\r\n isHorizontalCheckOk = this._horizontalCheckRaycast(firstHeightMovementPosition, secondMovementPosition, movementDirection, up,\r\n true, ignoreGroundAngleCallback, ignoreCeilingAngleCallback,\r\n feetPosition, true,\r\n collisionCheckParams, collisionRuntimeParams);\r\n\r\n if (!isHorizontalCheckOk) break;\r\n }\r\n }\r\n\r\n if (collisionCheckParams.myHorizontalMovementCheckVerticalStraight ||\r\n (collisionCheckParams.myHorizontalMovementHorizontalStraightCentralCheckEnabled && j == 0)) {\r\n if (m == 0) {\r\n firstHeightPosition = firstPosition.vec3_sub(heightStep, firstHeightPosition);\r\n\r\n isHorizontalCheckOk = this._horizontalCheckRaycast(firstHeightPosition, firstPosition, movementDirection, up,\r\n true, ignoreGroundAngleCallback, ignoreCeilingAngleCallback,\r\n feetPosition, true,\r\n collisionCheckParams, collisionRuntimeParams);\r\n\r\n if (!isHorizontalCheckOk) break;\r\n }\r\n\r\n {\r\n firstMovementPosition = firstPosition.vec3_add(movementStep, firstMovementPosition);\r\n firstHeightMovementPosition = firstMovementPosition.vec3_sub(heightStep, firstHeightMovementPosition);\r\n\r\n isHorizontalCheckOk = this._horizontalCheckRaycast(firstHeightMovementPosition, firstMovementPosition, movementDirection, up,\r\n true, ignoreGroundAngleCallback, ignoreCeilingAngleCallback,\r\n feetPosition, true,\r\n collisionCheckParams, collisionRuntimeParams);\r\n\r\n if (!isHorizontalCheckOk) break;\r\n }\r\n }\r\n\r\n if (collisionCheckParams.myHorizontalMovementCheckVerticalStraightDiagonalUpward ||\r\n (collisionCheckParams.myHorizontalMovementVerticalStraightDiagonalUpwardCentralCheckEnabled && j == 0)) {\r\n firstMovementPosition = firstPosition.vec3_add(movementStep, firstMovementPosition);\r\n firstHeightPosition = firstPosition.vec3_sub(heightStep, firstHeightPosition);\r\n\r\n isHorizontalCheckOk = this._horizontalCheckRaycast(firstHeightPosition, firstMovementPosition, movementDirection, up,\r\n true, ignoreGroundAngleCallback, ignoreCeilingAngleCallback,\r\n feetPosition, true,\r\n collisionCheckParams, collisionRuntimeParams);\r\n\r\n if (!isHorizontalCheckOk) break;\r\n }\r\n\r\n if (collisionCheckParams.myHorizontalMovementCheckVerticalStraightDiagonalDownward ||\r\n (collisionCheckParams.myHorizontalMovementVerticalStraightDiagonalDownwardCentralCheckEnabled && j == 0)) {\r\n firstHeightMovementPosition = firstPosition.vec3_sub(heightStep, firstHeightMovementPosition).vec3_add(movementStep, firstHeightMovementPosition);\r\n\r\n isHorizontalCheckOk = this._horizontalCheckRaycast(firstPosition, firstHeightMovementPosition, movementDirection, up,\r\n true, ignoreGroundAngleCallback, ignoreCeilingAngleCallback,\r\n feetPosition, true,\r\n collisionCheckParams, collisionRuntimeParams);\r\n\r\n if (!isHorizontalCheckOk) break;\r\n }\r\n\r\n if (!isHorizontalCheckOk) {\r\n collisionRuntimeParams.myIsCollidingHorizontally = true;\r\n collisionRuntimeParams.myHorizontalCollisionHit.copy(this._myRaycastResult.myHits[0]);\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return isHorizontalCheckOk;\r\n };\r\n}();\r\n\r\nCollisionCheckHorizontalMovement.prototype._horizontalMovementHorizontalCheck = function () {\r\n let movementStep = vec3_create();\r\n let movementDirection = vec3_create();\r\n let firstPosition = vec3_create();\r\n let secondPosition = vec3_create();\r\n let firstMovementPosition = vec3_create();\r\n let secondMovementPosition = vec3_create();\r\n return function _horizontalMovementHorizontalCheck(movement, feetPosition, checkPositions, heightOffset, up, ignoreGroundAngleCallback, ignoreCeilingAngleCallback, collisionCheckParams, collisionRuntimeParams) {\r\n let isHorizontalCheckOk = true;\r\n\r\n let movementStepAmount = 1;\r\n movementStep.vec3_copy(movement);\r\n\r\n if (collisionCheckParams.myHorizontalMovementStepEnabled) {\r\n movementStepAmount = Math.max(1, Math.ceil(movement.vec3_length() / collisionCheckParams.myHorizontalMovementStepMaxLength));\r\n movement.vec3_scale(1 / movementStepAmount, movementStep);\r\n }\r\n\r\n movementDirection = movement.vec3_normalize(movementDirection);\r\n\r\n for (let m = 0; m < movementStepAmount; m++) {\r\n for (let j = 0; j < checkPositions.length; j++) {\r\n firstPosition = checkPositions[j].vec3_add(movementStep.vec3_scale(m, firstPosition), firstPosition).vec3_add(heightOffset, firstPosition);\r\n\r\n if (j > 0) {\r\n let secondIndex = Math.max(0, j - 2);\r\n secondPosition = checkPositions[secondIndex].vec3_add(movementStep.vec3_scale(m, secondPosition), secondPosition).vec3_add(heightOffset, secondPosition);\r\n\r\n if (collisionCheckParams.myHorizontalMovementCheckDiagonalOutward) {\r\n firstMovementPosition = firstPosition.vec3_add(movementStep, firstMovementPosition);\r\n\r\n // #TODO Ignore hits if inside could be a paramter, so you can specify if u want to be able to exit from a collision\r\n isHorizontalCheckOk = this._horizontalCheckRaycast(secondPosition, firstMovementPosition, movementDirection, up,\r\n true, ignoreGroundAngleCallback, ignoreCeilingAngleCallback,\r\n feetPosition, true,\r\n collisionCheckParams, collisionRuntimeParams);\r\n\r\n if (!isHorizontalCheckOk) break;\r\n }\r\n\r\n if (collisionCheckParams.myHorizontalMovementCheckDiagonalInward) {\r\n secondMovementPosition = secondPosition.vec3_add(movementStep, secondMovementPosition);\r\n\r\n isHorizontalCheckOk = this._horizontalCheckRaycast(firstPosition, secondMovementPosition, movementDirection, up,\r\n true, ignoreGroundAngleCallback, ignoreCeilingAngleCallback,\r\n feetPosition, true,\r\n collisionCheckParams, collisionRuntimeParams);\r\n\r\n if (!isHorizontalCheckOk) break;\r\n }\r\n\r\n if (collisionCheckParams.myHorizontalMovementCheckHorizontalBorder) {\r\n if (m == 0) {\r\n isHorizontalCheckOk = this._horizontalCheckRaycast(secondPosition, firstPosition, movementDirection, up,\r\n true, ignoreGroundAngleCallback, ignoreCeilingAngleCallback,\r\n feetPosition, true,\r\n collisionCheckParams, collisionRuntimeParams);\r\n\r\n if (!isHorizontalCheckOk) break;\r\n }\r\n\r\n {\r\n firstMovementPosition = firstPosition.vec3_add(movementStep, firstMovementPosition);\r\n secondMovementPosition = secondPosition.vec3_add(movementStep, secondMovementPosition);\r\n\r\n isHorizontalCheckOk = this._horizontalCheckRaycast(secondMovementPosition, firstMovementPosition, movementDirection, up,\r\n true, ignoreGroundAngleCallback, ignoreCeilingAngleCallback,\r\n feetPosition, true,\r\n collisionCheckParams, collisionRuntimeParams);\r\n\r\n if (!isHorizontalCheckOk) break;\r\n }\r\n }\r\n }\r\n\r\n if (collisionCheckParams.myHorizontalMovementCheckStraight ||\r\n (collisionCheckParams.myHorizontalMovementVerticalStraightCentralCheckEnabled && j == 0)) {\r\n firstMovementPosition = firstPosition.vec3_add(movementStep, firstMovementPosition);\r\n\r\n isHorizontalCheckOk = this._horizontalCheckRaycast(firstPosition, firstMovementPosition, null, up,\r\n true, ignoreGroundAngleCallback, ignoreCeilingAngleCallback,\r\n feetPosition, true,\r\n collisionCheckParams, collisionRuntimeParams);\r\n\r\n if (!isHorizontalCheckOk) break;\r\n }\r\n }\r\n\r\n if (!isHorizontalCheckOk) {\r\n collisionRuntimeParams.myIsCollidingHorizontally = true;\r\n collisionRuntimeParams.myHorizontalCollisionHit.copy(this._myRaycastResult.myHits[0]);\r\n break;\r\n }\r\n }\r\n\r\n return isHorizontalCheckOk;\r\n };\r\n}();", "import { vec3_create, vec4_create } from \"../../../../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Globals } from \"../../../../../../pp/globals.js\";\r\nimport { CollisionCheckHorizontalMovement } from \"./collision_check_horizontal_movement.js\";\r\n\r\nexport class CollisionCheckHorizontalSliding extends CollisionCheckHorizontalMovement {\r\n\r\n _horizontalSlide(movement, feetPosition, height, up, forward, allowSurfaceSteepFix, collisionCheckParams, collisionRuntimeParams, previousCollisionRuntimeParams, outSlideMovement) {\r\n // Implemented outside class definition\r\n }\r\n\r\n _horizontalSlideCheckOpposite(movement, feetPosition, height, up, forward, previousHorizontalMovement, previousIsSliding, allowSurfaceSteepFix, collisionCheckParams, preSlideCollisionRuntimeParams, postSlideCollisionRuntimeParams, previousCollisionRuntimeParams, outSlideMovement) {\r\n // Implemented outside class definition\r\n }\r\n\r\n _horizontalSlideFlickerCheck(movement, slideMovement, feetPosition, height, up, forward, allowSurfaceSteepFix, collisionCheckParams, collisionRuntimeParams, previousCollisionRuntimeParams) {\r\n // Implemented outside class definition\r\n }\r\n\r\n _internalHorizontalSlide(movement, feetPosition, height, up, forward, previousHorizontalMovement, allowSurfaceSteepFix, collisionCheckParams, collisionRuntimeParams, previousCollisionRuntimeParams, checkOppositeDirection, outSlideMovement) {\r\n // Implemented outside class definition\r\n }\r\n\r\n _horizontalCheckBetterSlideNormal(movement, originalFeetPosition, originalHeight, feetPosition, height, up, forward, collisionCheckParams, collisionRuntimeParams) {\r\n // Implemented outside class definition\r\n }\r\n\r\n _isSlidingNormalValid(movement, up, collisionRuntimeParams) {\r\n // Implemented outside class definition\r\n }\r\n}\r\n\r\n\r\n\r\n// IMPLEMENTATION\r\n\r\nCollisionCheckHorizontalSliding.prototype._horizontalSlide = function () {\r\n let previousHorizontalMovement = vec3_create();\r\n return function _horizontalSlide(movement, feetPosition, height, up, forward, allowSurfaceSteepFix, collisionCheckParams, collisionRuntimeParams, previousCollisionRuntimeParams, outSlideMovement) {\r\n if (movement.vec3_isZero(0.00001)) {\r\n return outSlideMovement.vec3_zero();\r\n }\r\n\r\n this._mySlidingCollisionRuntimeParams.copy(collisionRuntimeParams);\r\n\r\n previousHorizontalMovement.vec3_copy(collisionRuntimeParams.mySlidingPreviousHorizontalMovement);\r\n outSlideMovement = this._internalHorizontalSlide(movement, feetPosition, height, up, forward, previousHorizontalMovement, allowSurfaceSteepFix, collisionCheckParams, this._mySlidingCollisionRuntimeParams, previousCollisionRuntimeParams, false, outSlideMovement);\r\n\r\n if (collisionCheckParams.mySlidingCheckBothDirections) {\r\n this._horizontalSlideCheckOpposite(movement, feetPosition, height, up, forward, previousHorizontalMovement, this._myPrevCollisionRuntimeParams.myIsSliding, allowSurfaceSteepFix, collisionCheckParams, collisionRuntimeParams, this._mySlidingCollisionRuntimeParams, previousCollisionRuntimeParams, outSlideMovement);\r\n\r\n //console.error(\"post oppo:\", outSlideMovement.vec_toString());\r\n }\r\n\r\n //console.error(\" \");\r\n\r\n if (this._mySlidingCollisionRuntimeParams.myIsSliding && collisionCheckParams.mySlidingFlickeringPreventionType > 0) {\r\n let isFlickering = this._horizontalSlideFlickerCheck(movement, outSlideMovement, feetPosition, height, up, forward, allowSurfaceSteepFix, collisionCheckParams, this._mySlidingCollisionRuntimeParams, previousCollisionRuntimeParams);\r\n this._mySlidingCollisionRuntimeParams.myIsSliding = !isFlickering;\r\n }\r\n\r\n if (this._mySlidingCollisionRuntimeParams.myIsSliding) {\r\n let backupFlickerPrevented = collisionRuntimeParams.myIsSlidingFlickerPrevented;\r\n collisionRuntimeParams.copy(this._mySlidingCollisionRuntimeParams);\r\n collisionRuntimeParams.myIsSlidingFlickerPrevented = backupFlickerPrevented || this._mySlidingCollisionRuntimeParams.myIsSlidingFlickerPrevented;\r\n } else {\r\n collisionRuntimeParams.myIsSlidingFlickerPrevented = collisionRuntimeParams.myIsSlidingFlickerPrevented || this._mySlidingCollisionRuntimeParams.myIsSlidingFlickerPrevented;\r\n //console.error(\"slide cancel\");\r\n outSlideMovement.vec3_zero();\r\n }\r\n\r\n return outSlideMovement;\r\n };\r\n}();\r\n\r\nCollisionCheckHorizontalSliding.prototype._horizontalSlideCheckOpposite = function () {\r\n let horizontalCollisionNormal = vec3_create();\r\n let oppositeSlideMovement = vec3_create();\r\n //let hitNormal = vec3_create();\r\n return function _horizontalSlideCheckOpposite(movement, feetPosition, height, up, forward, previousHorizontalMovement, previousIsSliding, allowSurfaceSteepFix, collisionCheckParams, preSlideCollisionRuntimeParams, postSlideCollisionRuntimeParams, previousCollisionRuntimeParams, outSlideMovement) {\r\n horizontalCollisionNormal = preSlideCollisionRuntimeParams.myHorizontalCollisionHit.myNormal.vec3_removeComponentAlongAxis(up, horizontalCollisionNormal);\r\n horizontalCollisionNormal.vec3_normalize(horizontalCollisionNormal);\r\n\r\n //console.error(\"oppo\", outSlideMovement.vec_toString(), movement.vec_toString(15));\r\n let angleNormalWithMovementThreshold = 20;\r\n if (horizontalCollisionNormal.vec3_angle(movement) > 180 - angleNormalWithMovementThreshold) {\r\n //console.error(\"opposite normal ok\");\r\n return;\r\n } else if (previousIsSliding && postSlideCollisionRuntimeParams.myIsSliding && outSlideMovement.vec3_isConcordant(previousHorizontalMovement)) {\r\n //console.error(\"previous direction ok\");\r\n //console.error(postSlideCollisionRuntimeParams.myIsSliding, outSlideMovement.vec3_isConcordant(previousHorizontalMovement), outSlideMovement.vec_toString(), previousHorizontalMovement.vec_toString());\r\n return;\r\n } else {\r\n //console.error(\"no fast exit\");\r\n }\r\n\r\n //console.error(horizontalCollisionNormal.vec3_angle(movement));\r\n\r\n this._mySlidingOppositeDirectionCollisionRuntimeParams.copy(preSlideCollisionRuntimeParams);\r\n\r\n oppositeSlideMovement = this._internalHorizontalSlide(movement, feetPosition, height, up, forward, previousHorizontalMovement, allowSurfaceSteepFix, collisionCheckParams, this._mySlidingOppositeDirectionCollisionRuntimeParams, previousCollisionRuntimeParams, true, oppositeSlideMovement);\r\n\r\n //console.error(previousHorizontalMovement.vec_toString(), outSlideMovement.vec_toString(), oppositeSlideMovement.vec_toString());\r\n if (this._mySlidingOppositeDirectionCollisionRuntimeParams.myIsSliding) {\r\n\r\n let isOppositeBetter = false;\r\n if (postSlideCollisionRuntimeParams.myIsSliding) {\r\n if (movement.vec3_angle(oppositeSlideMovement) < movement.vec3_angle(outSlideMovement) - 0.0001) {\r\n //console.error(\"oppo minor\");\r\n isOppositeBetter = true;\r\n } else {\r\n if (Math.abs(movement.vec3_angle(oppositeSlideMovement) - movement.vec3_angle(outSlideMovement)) <= 0.0001) {\r\n if (previousHorizontalMovement.vec3_angle(oppositeSlideMovement) < previousHorizontalMovement.vec3_angle(outSlideMovement) - 0.0001) {\r\n let angleNormalWithMovementThreshold = 5;\r\n if (horizontalCollisionNormal.vec3_angle(movement) < 90 + angleNormalWithMovementThreshold) {\r\n //console.error(\"oppo equal\");\r\n isOppositeBetter = true;\r\n }\r\n }\r\n }\r\n }\r\n //console.error(movement.vec3_angle(outSlideMovement), movement.vec3_angle(oppositeSlideMovement));\r\n\r\n } else {\r\n let angleEpsilon = 0.001;\r\n if (movement.vec3_isConcordant(oppositeSlideMovement) && movement.vec3_angle(oppositeSlideMovement) < 90 - angleEpsilon) {\r\n //console.error(\"oppo not\");\r\n isOppositeBetter = true;\r\n } else {\r\n //console.error(\"oppo not prevention\");\r\n }\r\n }\r\n\r\n if (isOppositeBetter) {\r\n /* {\r\n hitNormal.vec3_copy(preSlideCollisionRuntimeParams.myHorizontalCollisionHit.myNormal);\r\n \r\n let visualParams = new VisualArrowParams();\r\n visualParams.myStart = feetPosition;\r\n visualParams.myDirection = slideMovement.vec3_normalize();\r\n visualParams.myLength = 0.2;\r\n visualParams.myMaterial = Globals.getDefaultMaterials(this._myEngine).myFlatOpaque.clone();\r\n visualParams.myMaterial.color = vec4_create(0, 0, 1, 1);\r\n Globals.getDebugVisualManager(this._myEngine).draw(visualParams, 1);\r\n }\r\n \r\n {\r\n let visualParams = new VisualArrowParams();\r\n visualParams.myStart = feetPosition;\r\n visualParams.myDirection = oppositeSlideMovement.vec3_normalize();\r\n visualParams.myLength = 0.2;\r\n visualParams.myMaterial = Globals.getDefaultMaterials(this._myEngine).myFlatOpaque.clone();\r\n visualParams.myMaterial.color = vec4_create(1, 0, 1, 1);\r\n Globals.getDebugVisualManager(this._myEngine).draw(visualParams, 1);\r\n }\r\n \r\n {\r\n let visualParams = new VisualArrowParams();\r\n visualParams.myStart = feetPosition;\r\n visualParams.myDirection = hitNormal.vec3_normalize();\r\n visualParams.myLength = 0.2;\r\n visualParams.myMaterial = Globals.getDefaultMaterials(this._myEngine).myFlatOpaque.clone();\r\n visualParams.myMaterial.color = vec4_create(1, 1, 1, 1);\r\n Globals.getDebugVisualManager(this._myEngine).draw(visualParams, 1);\r\n } */\r\n\r\n outSlideMovement.vec3_copy(oppositeSlideMovement);\r\n postSlideCollisionRuntimeParams.copy(this._mySlidingOppositeDirectionCollisionRuntimeParams);\r\n } else {\r\n //console.error(\"normal\", previousHorizontalMovement.vec_toString(), outSlideMovement.vec_toString(), oppositeSlideMovement.vec_toString());\r\n }\r\n } else {\r\n //console.error(\"oppo not sliding\");\r\n }\r\n };\r\n}();\r\n\r\nCollisionCheckHorizontalSliding.prototype._horizontalSlideFlickerCheck = function () {\r\n let previousHorizontalMovement = vec3_create();\r\n let newFeetPosition = vec3_create();\r\n let fixedMovement = vec3_create();\r\n let flickerFixSlideMovement = vec3_create();\r\n return function _horizontalSlideFlickerCheck(movement, slideMovement, feetPosition, height, up, forward, allowSurfaceSteepFix, collisionCheckParams, collisionRuntimeParams, previousCollisionRuntimeParams) {\r\n let isFlickering = false;\r\n\r\n previousHorizontalMovement.vec3_copy(collisionRuntimeParams.mySlidingPreviousHorizontalMovement);\r\n let shouldCheckFlicker =\r\n this._myPrevCollisionRuntimeParams.myIsSlidingFlickerPrevented ||\r\n previousHorizontalMovement.vec3_isZero(0.00001);\r\n\r\n if (!shouldCheckFlicker) {\r\n if (this._myPrevCollisionRuntimeParams.myIsSliding || !collisionCheckParams.mySlidingFlickeringPreventionCheckOnlyIfAlreadySliding) {\r\n let flickerCollisionAngle = 90;\r\n let flickerMovementAngle = 85;\r\n switch (collisionCheckParams.mySlidingFlickeringPreventionType) {\r\n case 1:\r\n shouldCheckFlicker = previousHorizontalMovement.vec3_signTo(movement, up, 0) != slideMovement.vec3_signTo(movement, up, 0);\r\n break;\r\n case 2:\r\n shouldCheckFlicker = collisionCheckParams.mySlidingCheckBothDirections && collisionRuntimeParams.myIsSlidingIntoOppositeDirection;\r\n shouldCheckFlicker = shouldCheckFlicker || Math.abs(collisionRuntimeParams.mySlidingCollisionAngle) > flickerCollisionAngle + 0.00001;\r\n break;\r\n case 3:\r\n shouldCheckFlicker = collisionCheckParams.mySlidingCheckBothDirections && collisionRuntimeParams.myIsSlidingIntoOppositeDirection;\r\n shouldCheckFlicker = shouldCheckFlicker || Math.abs(collisionRuntimeParams.mySlidingCollisionAngle) > flickerCollisionAngle + 0.00001;\r\n\r\n shouldCheckFlicker = shouldCheckFlicker || (\r\n Math.abs(Math.abs(collisionRuntimeParams.mySlidingCollisionAngle) - flickerCollisionAngle) < 0.00001 &&\r\n Math.abs(collisionRuntimeParams.mySlidingMovementAngle) > flickerMovementAngle + 0.00001);\r\n break;\r\n case 4:\r\n shouldCheckFlicker = true;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n //console.error(this._myPrevCollisionRuntimeParams.myIsSlidingFlickerPrevented);\r\n if (shouldCheckFlicker || this._myPrevCollisionRuntimeParams.mySlidingFlickerPreventionCheckAnywayCounter > 0) {\r\n if (shouldCheckFlicker) {\r\n collisionRuntimeParams.mySlidingFlickerPreventionCheckAnywayCounter = collisionCheckParams.mySlidingFlickerPreventionCheckAnywayCounter;\r\n } else {\r\n collisionRuntimeParams.mySlidingFlickerPreventionCheckAnywayCounter = Math.max(0, this._myPrevCollisionRuntimeParams.mySlidingFlickerPreventionCheckAnywayCounter - 1);\r\n //console.error(collisionRuntimeParams.mySlidingFlickerPreventionCheckAnywayCounter);\r\n }\r\n\r\n //console.error(previousHorizontalMovement.vec3_signTo(movement, up, 0), slideMovement.vec3_signTo(movement, up, 0));\r\n if ((collisionCheckParams.mySlidingFlickeringPreventionType != 1 || collisionRuntimeParams.myIsSlidingFlickerPrevented || this._myPrevCollisionRuntimeParams.mySlidingFlickerPreventionCheckAnywayCounter > 0) &&\r\n (this._myPrevCollisionRuntimeParams.myIsSliding && previousHorizontalMovement.vec3_signTo(movement, up, 0) != slideMovement.vec3_signTo(movement, up, 0))) {\r\n isFlickering = true;\r\n collisionRuntimeParams.myIsSlidingFlickerPrevented = true;\r\n //console.error(\"quick flicker fix\");\r\n } else {\r\n this._mySlidingFlickeringFixCollisionRuntimeParams.reset();\r\n this._mySlidingFlickeringFixCollisionRuntimeParams.mySliding90DegreesSign = collisionRuntimeParams.mySliding90DegreesSign;\r\n this._mySlidingFlickeringFixCollisionRuntimeParams.mySlidingRecompute90DegreesSign = false;\r\n\r\n //console.error(\"slide movement\", slideMovement.vec_toString(), feetPosition.vec_toString());\r\n newFeetPosition = feetPosition.vec3_add(slideMovement, newFeetPosition);\r\n\r\n let backupDebugEnabled = collisionCheckParams.myDebugEnabled;\r\n collisionCheckParams.myDebugEnabled = collisionCheckParams.myDebugEnabled && collisionCheckParams.myDebugSlidingEnabled;\r\n\r\n fixedMovement.vec3_zero();\r\n fixedMovement = this._horizontalCheck(movement, newFeetPosition, height, up, forward, allowSurfaceSteepFix, collisionCheckParams, this._mySlidingFlickeringFixCollisionRuntimeParams, previousCollisionRuntimeParams, false, fixedMovement);\r\n collisionCheckParams.myDebugEnabled = backupDebugEnabled;\r\n\r\n if (fixedMovement.vec3_isZero(0.00001)) {\r\n this._mySlidingFlickeringFixSlidingCollisionRuntimeParams.copy(this._mySlidingFlickeringFixCollisionRuntimeParams);\r\n\r\n flickerFixSlideMovement = this._internalHorizontalSlide(movement, newFeetPosition, height, up, forward, slideMovement, allowSurfaceSteepFix, collisionCheckParams, this._mySlidingFlickeringFixSlidingCollisionRuntimeParams, previousCollisionRuntimeParams, false, flickerFixSlideMovement);\r\n\r\n if (collisionCheckParams.mySlidingCheckBothDirections) {\r\n this._horizontalSlideCheckOpposite(movement, newFeetPosition, height, up, forward, slideMovement, true, allowSurfaceSteepFix, collisionCheckParams, this._mySlidingFlickeringFixCollisionRuntimeParams, this._mySlidingFlickeringFixSlidingCollisionRuntimeParams, previousCollisionRuntimeParams, flickerFixSlideMovement);\r\n }\r\n\r\n if (this._mySlidingFlickeringFixSlidingCollisionRuntimeParams.myIsSliding) {\r\n if (slideMovement.vec3_signTo(movement, up, 0) != flickerFixSlideMovement.vec3_signTo(movement, up, 0)) {\r\n\r\n /* {\r\n hitNormal.vec3_copy(collisionRuntimeParams.mySlidingCollisionHit.myNormal);\r\n \r\n let visualParams = new VisualArrowParams();\r\n visualParams.myStart = feetPosition;\r\n visualParams.myDirection = slideMovement.vec3_normalize();\r\n visualParams.myLength = 0.2;\r\n visualParams.myMaterial = Globals.getDefaultMaterials(this._myEngine).myFlatOpaque.clone();\r\n visualParams.myMaterial.color = vec4_create(0.5, 0.5, 0.5, 1);\r\n Globals.getDebugVisualManager(this._myEngine).draw(visualParams, 2);\r\n }\r\n \r\n {\r\n let visualParams = new VisualArrowParams();\r\n visualParams.myStart = feetPosition;\r\n visualParams.myDirection = flickerFixSlideMovement.vec3_normalize();\r\n visualParams.myLength = 0.2;\r\n visualParams.myMaterial = Globals.getDefaultMaterials(this._myEngine).myFlatOpaque.clone();\r\n visualParams.myMaterial.color = vec4_create(1, 1, 1, 1);\r\n Globals.getDebugVisualManager(this._myEngine).draw(visualParams, 2);\r\n }\r\n \r\n {\r\n let visualParams = new VisualArrowParams();\r\n visualParams.myStart = feetPosition;\r\n visualParams.myDirection = hitNormal.vec3_normalize();\r\n visualParams.myLength = 0.2;\r\n visualParams.myMaterial = Globals.getDefaultMaterials(this._myEngine).myFlatOpaque.clone();\r\n visualParams.myMaterial.color = vec4_create(1, 0, 0.5, 1);\r\n Globals.getDebugVisualManager(this._myEngine).draw(visualParams, 2);\r\n } */\r\n\r\n isFlickering = true;\r\n collisionRuntimeParams.myIsSlidingFlickerPrevented = true;\r\n //console.error(\"expensive flicker fix\");\r\n }\r\n }\r\n }\r\n }\r\n } else {\r\n //console.error(\"no flicker check\");\r\n }\r\n\r\n if (isFlickering) {\r\n //console.error(\"flicker\", shouldCheckFlicker, slideMovement.vec_toString(), \"\\n\");\r\n } else {\r\n //console.error(\"no flicker\", shouldCheckFlicker, slideMovement.vec_toString(), \"\\n\");\r\n }\r\n\r\n return isFlickering;\r\n };\r\n}();\r\n\r\nCollisionCheckHorizontalSliding.prototype._internalHorizontalSlide = function () {\r\n let invertedNormal = vec3_create();\r\n let slidingMovement = vec3_create();\r\n let movement90 = vec3_create();\r\n let currentMovement = vec3_create();\r\n let slideMovementForward = vec3_create();\r\n let fixedMovement = vec3_create();\r\n return function _internalHorizontalSlide(movement, feetPosition, height, up, forward, previousHorizontalMovement, allowSurfaceSteepFix, collisionCheckParams, collisionRuntimeParams, previousCollisionRuntimeParams, checkOppositeDirection, outSlideMovement) {\r\n if (movement.vec3_isZero(0.00001)) {\r\n return outSlideMovement.vec3_zero();\r\n }\r\n\r\n //let copiedNormal = collisionRuntimeParams.myHorizontalCollisionHit.myNormal.pp_clone();\r\n invertedNormal = collisionRuntimeParams.myHorizontalCollisionHit.myNormal.vec3_negate(invertedNormal);\r\n invertedNormal.vec3_removeComponentAlongAxis(up, invertedNormal);\r\n invertedNormal[0] = Math.abs(invertedNormal[0]) < 0.01 ? 0 : invertedNormal[0];\r\n invertedNormal[2] = Math.abs(invertedNormal[2]) < 0.01 ? 0 : invertedNormal[2];\r\n invertedNormal.vec3_normalize(invertedNormal);\r\n\r\n collisionRuntimeParams.mySlidingCollisionHit.copy(collisionRuntimeParams.myHorizontalCollisionHit);\r\n collisionRuntimeParams.mySlidingWallNormal.vec3_copy(collisionRuntimeParams.myHorizontalCollisionHit.myNormal);\r\n\r\n outSlideMovement.vec3_zero();\r\n\r\n slidingMovement.vec3_copy(invertedNormal);\r\n if (checkOppositeDirection) {\r\n slidingMovement.vec3_copy(movement);\r\n slidingMovement.vec3_normalize(slidingMovement);\r\n }\r\n\r\n if (!slidingMovement.vec3_isZero(0.00001)) {\r\n\r\n slidingMovement.vec3_scale(movement.vec3_length(), slidingMovement);\r\n\r\n let slidingSign = invertedNormal.vec3_signTo(movement, up);\r\n\r\n if (collisionCheckParams.mySlidingAdjustSign90Degrees) {\r\n let angleThreshold = 0.1;\r\n if (invertedNormal.vec3_angle(movement) < angleThreshold && collisionRuntimeParams.mySliding90DegreesSign != 0) {\r\n //console.error(slidingSign, collisionRuntimeParams.mySliding90DegreesSign);\r\n slidingSign = collisionRuntimeParams.mySliding90DegreesSign;\r\n } else if (collisionRuntimeParams.mySliding90DegreesSign == 0 || collisionRuntimeParams.mySlidingRecompute90DegreesSign) {\r\n collisionRuntimeParams.mySliding90DegreesSign = slidingSign;\r\n } else {\r\n //console.error(\"no fix\");\r\n }\r\n\r\n collisionRuntimeParams.mySlidingRecompute90DegreesSign = false;\r\n }\r\n\r\n if (checkOppositeDirection) {\r\n slidingSign *= -1;\r\n }\r\n\r\n let currentAngle = 90 * slidingSign;\r\n let maxAngle = Math.pp_angleClamp(slidingMovement.vec3_angleSigned(movement.vec3_rotateAxis(90 * slidingSign, up, movement90), up) * slidingSign, true) * slidingSign;\r\n let minAngle = Math.pp_angleClamp(slidingMovement.vec3_angleSigned(movement, up) * slidingSign, true) * slidingSign;\r\n\r\n if (checkOppositeDirection) {\r\n maxAngle = currentAngle;\r\n minAngle = 0;\r\n } else {\r\n if (Math.abs(maxAngle) < Math.abs(minAngle)) {\r\n // This should only happens because of the 90 degrees adjustment\r\n //console.error(\"90 adjust\");\r\n minAngle = 0;\r\n }\r\n\r\n if (Math.abs(Math.abs(maxAngle) - Math.abs(minAngle)) < 0.0001) {\r\n minAngle = maxAngle;\r\n }\r\n\r\n if (Math.abs(maxAngle) < Math.abs(currentAngle) || Math.abs(Math.abs(maxAngle) - Math.abs(currentAngle)) < 0.0001) {\r\n //console.error(\"max\", currentAngle.toFixed(15), maxAngle.toFixed(15));\r\n currentAngle = maxAngle;\r\n }\r\n\r\n if (Math.abs(currentAngle) < Math.abs(minAngle) || Math.abs(Math.abs(minAngle) - Math.abs(currentAngle)) < 0.0001) {\r\n //console.error(\"min\", currentAngle.toFixed(3), minAngle.toFixed(3));\r\n currentAngle = minAngle;\r\n }\r\n\r\n //console.error(maxAngle.toFixed(3), minAngle.toFixed(3));\r\n }\r\n\r\n if (checkOppositeDirection && !previousHorizontalMovement.vec3_isZero(0.000001)) {\r\n let angleWithPrevious = movement.vec3_angleSigned(previousHorizontalMovement, up);\r\n if (Math.pp_sign(angleWithPrevious) == Math.pp_sign(maxAngle) && Math.abs(maxAngle) > Math.abs(angleWithPrevious)) {\r\n currentAngle = angleWithPrevious;\r\n //console.error(\"better angle\", currentAngle, previousHorizontalMovement.vec_toString(10), movement.vec_toString(10));\r\n }\r\n }\r\n\r\n currentMovement.vec3_zero();\r\n\r\n let backupDebugEnabled = collisionCheckParams.myDebugEnabled;\r\n collisionCheckParams.myDebugEnabled = collisionCheckParams.myDebugEnabled && collisionCheckParams.myDebugSlidingEnabled;\r\n\r\n //let originalCurrentAngle = currentAngle;\r\n for (let i = 0; i < collisionCheckParams.mySlidingMaxAttempts; i++) {\r\n this._myInternalSlidingCollisionRuntimeParams.copy(collisionRuntimeParams);\r\n\r\n currentMovement = slidingMovement.vec3_rotateAxis(currentAngle, up, currentMovement);\r\n\r\n slideMovementForward.vec3_copy(forward);\r\n if (!collisionCheckParams.myCheckHorizontalFixedForwardEnabled) {\r\n if (!currentMovement.vec3_isZero()) {\r\n slideMovementForward = currentMovement.vec3_normalize(slideMovementForward);\r\n }\r\n }\r\n\r\n fixedMovement.vec3_zero();\r\n fixedMovement = this._horizontalCheck(currentMovement, feetPosition, height, up, slideMovementForward, allowSurfaceSteepFix, collisionCheckParams, this._myInternalSlidingCollisionRuntimeParams, previousCollisionRuntimeParams, true, fixedMovement);\r\n if (!fixedMovement.vec3_isZero(0.00001)) {\r\n outSlideMovement.vec3_copy(currentMovement);\r\n collisionRuntimeParams.copy(this._myInternalSlidingCollisionRuntimeParams);\r\n collisionRuntimeParams.myIsSliding = true;\r\n collisionRuntimeParams.myIsSlidingIntoOppositeDirection = checkOppositeDirection;\r\n collisionRuntimeParams.mySlidingMovementAngle = movement.vec3_angleSigned(currentMovement, up);\r\n collisionRuntimeParams.mySlidingCollisionAngle = invertedNormal.vec3_angleSigned(currentMovement, up);\r\n\r\n maxAngle = currentAngle;\r\n currentAngle = (maxAngle + minAngle) / 2;\r\n } else {\r\n if (currentAngle != maxAngle) {\r\n minAngle = currentAngle;\r\n }\r\n\r\n if (i == 0 && currentAngle != maxAngle) {\r\n currentAngle = maxAngle;\r\n } else {\r\n currentAngle = (minAngle + maxAngle) / 2;\r\n }\r\n }\r\n\r\n if (Math.abs(Math.abs(maxAngle) - Math.abs(minAngle)) < 0.0001) {\r\n //console.error(\"fast slide exit\", maxAngle, minAngle, originalCurrentAngle, collisionRuntimeParams.myIsSliding, checkOppositeDirection);\r\n break;\r\n }\r\n }\r\n\r\n collisionCheckParams.myDebugEnabled = backupDebugEnabled;\r\n }\r\n\r\n if (!collisionRuntimeParams.myIsSliding) {\r\n collisionRuntimeParams.mySlidingCollisionHit.reset();\r\n } else {\r\n //console.error(\"slide angle\", movement.vec3_angleSigned(invertedNormal, up), invertedNormal.vec_toString(), copiedNormal.vec_toString());\r\n }\r\n\r\n return outSlideMovement;\r\n };\r\n}();\r\n\r\nCollisionCheckHorizontalSliding.prototype._horizontalCheckBetterSlideNormal = function () {\r\n let movementDirection = vec3_create();\r\n let hitDirection = vec3_create();\r\n let projectAlongAxis = vec3_create();\r\n let fixedMovement = vec3_create();\r\n let newFixedFeetPosition = vec3_create();\r\n let newFeetPosition = vec3_create();\r\n return function _horizontalCheckBetterSlideNormal(movement, originalFeetPosition, originalHeight, feetPosition, height, up, forward, collisionCheckParams, collisionRuntimeParams) {\r\n // Check for a better slide hit position and normal\r\n\r\n movementDirection = movement.vec3_normalize(movementDirection);\r\n\r\n let hitPosition = collisionRuntimeParams.myHorizontalCollisionHit.myPosition;\r\n let halfConeAngle = Math.min(collisionCheckParams.myHalfConeAngle, 90);\r\n hitDirection = hitPosition.vec3_sub(feetPosition, hitDirection);\r\n if (hitDirection.vec3_isToTheRight(movementDirection, up)) {\r\n projectAlongAxis = movementDirection.vec3_rotateAxis(-halfConeAngle, up, projectAlongAxis);\r\n } else {\r\n projectAlongAxis = movementDirection.vec3_rotateAxis(halfConeAngle, up, projectAlongAxis);\r\n }\r\n\r\n fixedMovement = hitDirection.vec3_projectOnAxisAlongAxis(movementDirection, projectAlongAxis, fixedMovement);\r\n /* if (fixedMovement.vec3_angle(movementDirection) >= 0.00001 || fixedMovement.vec3_length() > movement.vec3_length() + 0.00001) {\r\n console.error(\"ERROR, project function should return a smaller movement in the same direction\",\r\n fixedMovement.vec3_angle(movementDirection), fixedMovement.vec3_length(), movement.vec3_length());\r\n // Maybe epsilon could be 0.0001? is higher but still 10 times less then a millimiter\r\n } */\r\n\r\n if (fixedMovement.vec3_isConcordant(movementDirection)) {\r\n fixedMovement = movementDirection.vec3_scale(Math.min(fixedMovement.vec3_length(), movement.vec3_length()), fixedMovement);\r\n } else {\r\n fixedMovement.vec3_zero();\r\n }\r\n\r\n if (collisionCheckParams.myDebugEnabled && collisionCheckParams.myDebugHorizontalMovementEnabled && Globals.isDebugEnabled(this._myEngine)) {\r\n Globals.getDebugVisualManager(this._myEngine).drawArrow(0, feetPosition, movementDirection, fixedMovement.vec3_length(), vec4_create(1, 0, 1, 1));\r\n }\r\n\r\n this._myCheckBetterSlidingNormalCollisionRuntimeParams.copy(collisionRuntimeParams);\r\n this._myCheckBetterSlidingNormalCollisionRuntimeParams.myIsCollidingHorizontally = false;\r\n this._myCheckBetterSlidingNormalCollisionRuntimeParams.myHorizontalCollisionHit.reset();\r\n\r\n newFixedFeetPosition = feetPosition.vec3_add(fixedMovement, newFixedFeetPosition);\r\n newFeetPosition = feetPosition.vec3_add(fixedMovement, newFeetPosition);\r\n\r\n let backupDebugEnabled = collisionCheckParams.myDebugEnabled;\r\n collisionCheckParams.myDebugEnabled = collisionCheckParams.myDebugEnabled && collisionCheckParams.myDebugSlidingEnabled;\r\n\r\n if (collisionCheckParams.myHorizontalPositionCheckEnabled) {\r\n this._horizontalPositionCheck(originalFeetPosition, originalHeight, newFixedFeetPosition, height, up, forward, collisionCheckParams, this._myCheckBetterSlidingNormalCollisionRuntimeParams);\r\n }\r\n\r\n collisionCheckParams.myDebugEnabled = backupDebugEnabled;\r\n\r\n if (this._myCheckBetterSlidingNormalCollisionRuntimeParams.myIsCollidingHorizontally &&\r\n !this._myCheckBetterSlidingNormalCollisionRuntimeParams.myHorizontalCollisionHit.myInsideCollision) {\r\n collisionRuntimeParams.copy(this._myCheckBetterSlidingNormalCollisionRuntimeParams);\r\n }\r\n };\r\n}();\r\n\r\nCollisionCheckHorizontalSliding.prototype._isSlidingNormalValid = function () {\r\n let flatNormal = vec3_create();\r\n return function _isSlidingNormalValid(movement, up, collisionRuntimeParams) {\r\n let isValid = false;\r\n\r\n flatNormal = collisionRuntimeParams.myHorizontalCollisionHit.myNormal.vec3_removeComponentAlongAxis(up, flatNormal);\r\n flatNormal.vec3_normalize(flatNormal);\r\n\r\n if (!flatNormal.vec3_isZero(0.000001)) {\r\n isValid = true;\r\n }\r\n\r\n // I wanted to check if the normal angle was not concordant and thought that in that case it shouldn't slide but it turns out it makes sense\r\n // even for back hits which either can't resolve or at least makes me slide out of collision\r\n // At least a check for the normal to be not up is ok\r\n\r\n return isValid;\r\n };\r\n}();", "import { vec3_create } from \"../../../../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { CollisionCheckHorizontalSliding } from \"./collision_check_horizontal_sliding.js\";\r\n\r\nexport class CollisionCheckHorizontal extends CollisionCheckHorizontalSliding {\r\n\r\n _horizontalCheck(movement, feetPosition, height, up, forward, allowSurfaceSteepFix, collisionCheckParams, collisionRuntimeParams, previousCollisionRuntimeParams, avoidSlidingExtraCheck, outFixedMovement) {\r\n // Implemented outside class definition\r\n }\r\n}\r\n\r\n\r\n\r\n// IMPLEMENTATION\r\n\r\nCollisionCheckHorizontal.prototype._horizontalCheck = function () {\r\n let fixedFeetPosition = vec3_create();\r\n let newFixedFeetPosition = vec3_create();\r\n let newFeetPosition = vec3_create();\r\n let horizontalDirection = vec3_create();\r\n return function _horizontalCheck(movement, feetPosition, height, up, forward, allowSurfaceSteepFix, collisionCheckParams, collisionRuntimeParams, previousCollisionRuntimeParams, avoidSlidingExtraCheck, outFixedMovement) {\r\n collisionRuntimeParams.myIsCollidingHorizontally = false;\r\n collisionRuntimeParams.myHorizontalCollisionHit.reset();\r\n outFixedMovement.vec3_zero();\r\n\r\n horizontalDirection = movement.vec3_normalize(horizontalDirection);\r\n let surfaceTooSteepResults = this._surfaceTooSteep(up, horizontalDirection, collisionCheckParams, previousCollisionRuntimeParams);\r\n if (movement.vec3_isZero(0.000001) ||\r\n ((!surfaceTooSteepResults[0] || (allowSurfaceSteepFix && collisionCheckParams.myAllowGroundSteepFix)) &&\r\n (!surfaceTooSteepResults[1] || (allowSurfaceSteepFix && collisionCheckParams.myAllowCeilingSteepFix)))) {\r\n fixedFeetPosition = feetPosition.vec3_add(up.vec3_scale(collisionCheckParams.myDistanceFromFeetToIgnore + 0.0001, fixedFeetPosition), fixedFeetPosition);\r\n let fixedHeight = Math.max(0, height - collisionCheckParams.myDistanceFromFeetToIgnore - collisionCheckParams.myDistanceFromHeadToIgnore - 0.0001 * 2);\r\n\r\n let canMove = true;\r\n if (collisionCheckParams.myHorizontalMovementCheckEnabled && !movement.vec3_isZero(0.000001)) {\r\n canMove = this._horizontalMovementCheck(movement, feetPosition, height, fixedFeetPosition, fixedHeight, up, collisionCheckParams, collisionRuntimeParams);\r\n }\r\n\r\n if (canMove) {\r\n if (collisionCheckParams.myHorizontalPositionCheckEnabled) {\r\n newFixedFeetPosition = fixedFeetPosition.vec3_add(movement, newFixedFeetPosition);\r\n newFeetPosition = feetPosition.vec3_add(movement, newFeetPosition);\r\n let canStay = this._horizontalPositionCheck(newFeetPosition, height, newFixedFeetPosition, fixedHeight, up, forward, collisionCheckParams, collisionRuntimeParams);\r\n if (canStay) {\r\n outFixedMovement.vec3_copy(movement);\r\n }\r\n\r\n if (outFixedMovement.vec3_isZero(0.000001)) {\r\n outFixedMovement.vec3_zero();\r\n }\r\n } else {\r\n outFixedMovement.vec3_copy(movement);\r\n }\r\n } else if (!avoidSlidingExtraCheck && collisionCheckParams.mySlidingEnabled && collisionCheckParams.mySlidingHorizontalMovementCheckBetterNormal) {\r\n this._horizontalCheckBetterSlideNormal(movement, feetPosition, height, fixedFeetPosition, fixedHeight, up, forward, collisionCheckParams, collisionRuntimeParams);\r\n }\r\n }\r\n\r\n return outFixedMovement;\r\n };\r\n}();", "import { RaycastHit } from \"../../../../../../cauldron/physics/physics_raycast_params.js\";\r\nimport { vec3_create } from \"../../../../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { CollisionCheckHorizontal } from \"./collision_check_horizontal.js\";\r\n\r\nexport class CollisionCheckVertical extends CollisionCheckHorizontal {\r\n\r\n _verticalCheck(verticalMovement, originalMovementSign, feetPosition, height, up, forward, collisionCheckParams, collisionRuntimeParams, outFixedMovement) {\r\n // Implemented outside class definition\r\n }\r\n\r\n _verticalMovementAdjustment(verticalMovement, isMovementDownward, originalMovementSign, feetPosition, height, up, forward, collisionCheckParams, collisionRuntimeParams, outFixedMovement) {\r\n // Implemented outside class definition\r\n }\r\n\r\n _verticalPositionCheck(feetPosition, checkUpward, height, up, forward, collisionCheckParams, collisionRuntimeParams) {\r\n // Implemented outside class definition\r\n }\r\n\r\n _getVerticalCheckPositions(feetPosition, up, forward, collisionCheckParams, collisionRuntimeParams) {\r\n // Implemented outside class definition\r\n }\r\n}\r\n\r\n\r\n\r\n// IMPLEMENTATION\r\n\r\nCollisionCheckVertical.prototype._verticalCheck = function () {\r\n let newFeetPosition = vec3_create();\r\n let additionalFixedMovement = vec3_create();\r\n let zero = vec3_create(0, 0, 0);\r\n return function _verticalCheck(verticalMovement, originalMovementSign, feetPosition, height, up, forward, collisionCheckParams, collisionRuntimeParams, outFixedMovement) {\r\n collisionRuntimeParams.myIsCollidingVertically = false;\r\n collisionRuntimeParams.myVerticalCollisionHit.reset();\r\n\r\n // #TODO the sign of 0 is by default downward, but it should probably be based on if u previously were on Ground or Ceiling\r\n // If none, ok downward, if on Ground downward, if on Ceiling upward, so that even without @myCheckVerticalBothDirection\r\n // if u were snapped to the ceiling u will keep snap on it even when 0 vertical movement\r\n let movementSign = Math.pp_sign(verticalMovement.vec3_lengthSigned(up), -1);\r\n let isMovementDownward = movementSign < 0;\r\n\r\n outFixedMovement.vec3_copy(verticalMovement);\r\n if (collisionCheckParams.myVerticalMovementCheckEnabled) {\r\n const firstRaycastPerformed = this._verticalMovementAdjustment(verticalMovement, isMovementDownward, originalMovementSign, feetPosition, height, up, forward, collisionCheckParams, collisionRuntimeParams, outFixedMovement);\r\n\r\n if (!collisionRuntimeParams.myIsCollidingVertically && collisionCheckParams.myCheckVerticalBothDirection &&\r\n (outFixedMovement.vec_equals(verticalMovement, 0.00001) || originalMovementSign == 0 || (movementSign != originalMovementSign))) {\r\n newFeetPosition = feetPosition.vec3_add(outFixedMovement, newFeetPosition);\r\n let isOppositeMovementDownward = !isMovementDownward;\r\n const secondRaycastPerformed = this._verticalMovementAdjustment(zero, isOppositeMovementDownward, originalMovementSign, newFeetPosition, height, up, forward, collisionCheckParams, collisionRuntimeParams, additionalFixedMovement);\r\n\r\n if (!additionalFixedMovement.vec3_isZero() || (secondRaycastPerformed && !firstRaycastPerformed)) {\r\n outFixedMovement.vec3_add(additionalFixedMovement, outFixedMovement);\r\n isMovementDownward = !isMovementDownward;\r\n }\r\n }\r\n }\r\n\r\n // #TODO Here, if there is no vertical movement and there is no horizontal movement (or it has been canceled)\r\n // it would probably make more sense to skip this check, and if it is vertically colliding, but the movement is 0,0,0\r\n // we can say that the movement is, after all, fine\r\n // For now I will keep it as it is because i'm not sure if some feature (like the transform manager) could make assumption\r\n // on the fact that even a 0,0,0 movement can fail thanks to this (like the head colliding check)\r\n // Is not a big problem anyway, u can just check if the movement is 0 before checking the collision, and if it is 0\r\n // u won't move anyway\r\n if (!collisionRuntimeParams.myIsCollidingVertically && collisionCheckParams.myVerticalPositionCheckEnabled) {\r\n newFeetPosition = feetPosition.vec3_add(outFixedMovement, newFeetPosition);\r\n let canStay = this._verticalPositionCheck(newFeetPosition, isMovementDownward, height, up, forward, collisionCheckParams, collisionRuntimeParams);\r\n if (canStay && collisionCheckParams.myCheckVerticalPositionBothDirection) {\r\n canStay = this._verticalPositionCheck(newFeetPosition, !isMovementDownward, height, up, forward, collisionCheckParams, collisionRuntimeParams);\r\n }\r\n\r\n if (!canStay) {\r\n outFixedMovement.vec3_zero();\r\n\r\n // #TODO Probably this should not be reset, you should be required to check if the movement was ok to be sure this values have a meaning\r\n collisionRuntimeParams.myHasSnappedOnGround = false;\r\n collisionRuntimeParams.myHasSnappedOnCeiling = false;\r\n collisionRuntimeParams.myHasPoppedOutGround = false;\r\n collisionRuntimeParams.myHasPoppedOutCeiling = false;\r\n collisionRuntimeParams.myHasReducedVerticalMovement = false;\r\n }\r\n } else if (collisionRuntimeParams.myIsCollidingVertically) {\r\n outFixedMovement.vec3_zero();\r\n }\r\n\r\n return outFixedMovement;\r\n };\r\n}();\r\n\r\nCollisionCheckVertical.prototype._verticalMovementAdjustment = function () {\r\n let startOffset = vec3_create();\r\n let endOffset = vec3_create();\r\n let tempVector = vec3_create();\r\n let furtherDirection = vec3_create();\r\n let furtherDirectionPosition = vec3_create();\r\n let upNegate = vec3_create();\r\n let origin = vec3_create();\r\n let direction = vec3_create();\r\n\r\n let verticalCollisionHit = new RaycastHit();\r\n return function _verticalMovementAdjustment(verticalMovement, isMovementDownward, originalMovementSign, feetPosition, height, up, forward, collisionCheckParams, collisionRuntimeParams, outFixedMovement) {\r\n this._myDebugEnabled = collisionCheckParams.myDebugEnabled && collisionCheckParams.myDebugVerticalMovementEnabled;\r\n\r\n startOffset.vec3_zero();\r\n endOffset.vec3_zero();\r\n\r\n let raycastPerformed = false;\r\n\r\n let popOutEnabled = false;\r\n let snapEnabled = false;\r\n\r\n if (isMovementDownward) {\r\n startOffset.vec3_zero();\r\n endOffset.vec3_copy(verticalMovement);\r\n\r\n if (collisionCheckParams.myGroundPopOutExtraDistance > 0 && collisionCheckParams.myGroundPopOutEnabled) {\r\n startOffset.vec3_add(up.vec3_scale(collisionCheckParams.myGroundPopOutExtraDistance + 0.00001, tempVector), startOffset);\r\n popOutEnabled = true;\r\n }\r\n } else {\r\n startOffset = up.vec3_scale(height, startOffset);\r\n endOffset = up.vec3_scale(height, endOffset).vec3_add(verticalMovement, endOffset);\r\n\r\n if (collisionCheckParams.myCeilingPopOutExtraDistance > 0 && collisionCheckParams.myCeilingPopOutEnabled) {\r\n startOffset.vec3_add(up.vec3_scale(-collisionCheckParams.myCeilingPopOutExtraDistance - 0.00001, tempVector), startOffset);\r\n popOutEnabled = true;\r\n }\r\n }\r\n\r\n if (isMovementDownward && originalMovementSign <= 0 && this._myPrevCollisionRuntimeParams.myIsOnGround && collisionCheckParams.mySnapOnGroundEnabled && collisionCheckParams.mySnapOnGroundExtraDistance > 0) {\r\n endOffset.vec3_add(up.vec3_scale(-collisionCheckParams.mySnapOnGroundExtraDistance - 0.00001, tempVector), endOffset);\r\n snapEnabled = true;\r\n } else if (!isMovementDownward && this._myPrevCollisionRuntimeParams.myIsOnCeiling && collisionCheckParams.mySnapOnCeilingEnabled && collisionCheckParams.mySnapOnCeilingExtraDistance > 0 &&\r\n (originalMovementSign > 0 || (originalMovementSign == 0 && (!this._myPrevCollisionRuntimeParams.myIsOnGround || !collisionCheckParams.mySnapOnGroundEnabled)))) {\r\n endOffset.vec3_add(up.vec3_scale(collisionCheckParams.mySnapOnCeilingExtraDistance + 0.00001, tempVector), endOffset);\r\n snapEnabled = true;\r\n }\r\n\r\n outFixedMovement.vec3_zero();\r\n if (startOffset.vec3_distance(endOffset) > 0.00001) {\r\n let checkPositions = this._getVerticalCheckPositions(feetPosition, up, forward, collisionCheckParams, collisionRuntimeParams);\r\n\r\n furtherDirection.vec3_copy(up);\r\n if (!isMovementDownward) {\r\n furtherDirection.vec3_negate(furtherDirection);\r\n }\r\n\r\n let furtherDirectionPositionSet = false;\r\n let atLeastOneIsOk = false;\r\n let insideHitSet = false;\r\n\r\n for (let i = 0; i < checkPositions.length; i++) {\r\n let currentPosition = checkPositions[i];\r\n\r\n origin = currentPosition.vec3_add(startOffset, origin);\r\n direction = currentPosition.vec3_add(endOffset, direction).vec3_sub(origin, direction);\r\n let distance = direction.vec3_length();\r\n direction.vec3_normalize(direction);\r\n\r\n let raycastResult = this._raycastAndDebug(origin, direction, distance, false, false, collisionCheckParams, collisionRuntimeParams);\r\n raycastPerformed = true;\r\n\r\n if (raycastResult.isColliding()) {\r\n let hit = raycastResult.myHits[0];\r\n if (!hit.myInsideCollision) {\r\n atLeastOneIsOk = true;\r\n\r\n if (furtherDirectionPositionSet) {\r\n if (hit.myPosition.vec3_isFartherAlongAxis(furtherDirectionPosition, furtherDirection)) {\r\n furtherDirectionPosition.vec3_copy(hit.myPosition);\r\n verticalCollisionHit.copy(hit);\r\n }\r\n } else {\r\n furtherDirectionPositionSet = true;\r\n furtherDirectionPosition.vec3_copy(hit.myPosition);\r\n verticalCollisionHit.copy(hit);\r\n }\r\n } else if (!insideHitSet) {\r\n insideHitSet = true;\r\n verticalCollisionHit.copy(hit);\r\n if (!collisionCheckParams.myVerticalAllowHitInsideCollisionIfOneOk) {\r\n break;\r\n }\r\n }\r\n } else {\r\n atLeastOneIsOk = true;\r\n }\r\n }\r\n\r\n if (!atLeastOneIsOk) {\r\n outFixedMovement.vec3_zero();\r\n\r\n // #TODO Probably this should not be reset, you should be required to check if the movement was ok to be sure this values have a meaning\r\n collisionRuntimeParams.myHasSnappedOnGround = false;\r\n collisionRuntimeParams.myHasSnappedOnCeiling = false;\r\n collisionRuntimeParams.myHasPoppedOutGround = false;\r\n collisionRuntimeParams.myHasPoppedOutCeiling = false;\r\n collisionRuntimeParams.myHasReducedVerticalMovement = false;\r\n\r\n collisionRuntimeParams.myIsCollidingVertically = true;\r\n collisionRuntimeParams.myVerticalCollisionHit.copy(verticalCollisionHit);\r\n } else {\r\n if (furtherDirectionPositionSet) {\r\n upNegate = up.vec3_negate(upNegate);\r\n if (isMovementDownward) {\r\n outFixedMovement = furtherDirectionPosition.vec3_sub(feetPosition, outFixedMovement).vec3_componentAlongAxis(up, outFixedMovement);\r\n\r\n if (!outFixedMovement.vec3_equals(verticalMovement, 0.00001)) {\r\n const outFixedMovementValueAlongUp = outFixedMovement.vec3_valueAlongAxis(up);\r\n const verticalMovementValueAlongUp = verticalMovement.vec3_valueAlongAxis(up);\r\n if (snapEnabled && outFixedMovementValueAlongUp < verticalMovementValueAlongUp) {\r\n collisionRuntimeParams.myHasSnappedOnGround = true;\r\n } else if (popOutEnabled && outFixedMovementValueAlongUp > 0.00001) {\r\n collisionRuntimeParams.myHasPoppedOutGround = true;\r\n } else if (outFixedMovementValueAlongUp > verticalMovementValueAlongUp) {\r\n collisionRuntimeParams.myHasReducedVerticalMovement = true;\r\n }\r\n }\r\n } else {\r\n outFixedMovement = furtherDirectionPosition.vec3_sub(feetPosition.vec3_add(up.vec3_scale(height, outFixedMovement), outFixedMovement), outFixedMovement).\r\n vec3_componentAlongAxis(up, outFixedMovement);\r\n\r\n if (!outFixedMovement.vec3_equals(verticalMovement, 0.00001)) {\r\n const outFixedMovementValueAlongUp = outFixedMovement.vec3_valueAlongAxis(up);\r\n const verticalMovementValueAlongUp = verticalMovement.vec3_valueAlongAxis(up);\r\n if (snapEnabled && outFixedMovementValueAlongUp > verticalMovementValueAlongUp) {\r\n collisionRuntimeParams.myHasSnappedOnCeiling = true;\r\n } else if (popOutEnabled && outFixedMovementValueAlongUp < -0.00001) {\r\n collisionRuntimeParams.myHasPoppedOutCeiling = true;\r\n } else if (outFixedMovementValueAlongUp < verticalMovementValueAlongUp) {\r\n collisionRuntimeParams.myHasReducedVerticalMovement = true;\r\n }\r\n }\r\n }\r\n\r\n if (!popOutEnabled && !outFixedMovement.vec3_isConcordant(verticalMovement)) {\r\n outFixedMovement.vec3_zero();\r\n }\r\n\r\n if (!collisionCheckParams.myVerticalMovementReduceEnabled && collisionRuntimeParams.myHasReducedVerticalMovement) {\r\n outFixedMovement.vec3_zero();\r\n\r\n // #TODO Probably this should not be reset, you should be required to check if the movement was ok to be sure this values have a meaning\r\n collisionRuntimeParams.myHasSnappedOnGround = false;\r\n collisionRuntimeParams.myHasSnappedOnCeiling = false;\r\n collisionRuntimeParams.myHasPoppedOutGround = false;\r\n collisionRuntimeParams.myHasPoppedOutCeiling = false;\r\n collisionRuntimeParams.myHasReducedVerticalMovement = false;\r\n\r\n collisionRuntimeParams.myIsCollidingVertically = true;\r\n collisionRuntimeParams.myVerticalCollisionHit.copy(verticalCollisionHit);\r\n }\r\n } else {\r\n outFixedMovement.vec3_copy(verticalMovement);\r\n }\r\n }\r\n } else {\r\n outFixedMovement.vec3_copy(verticalMovement);\r\n }\r\n\r\n if (outFixedMovement.vec3_length() < 0.00001) {\r\n outFixedMovement.vec3_zero();\r\n }\r\n\r\n return raycastPerformed;\r\n };\r\n}();\r\n\r\nCollisionCheckVertical.prototype._verticalPositionCheck = function () {\r\n let smallHeightFixOffset = vec3_create();\r\n let heightOffset = vec3_create();\r\n let startPosition = vec3_create();\r\n let endPosition = vec3_create();\r\n let direction = vec3_create();\r\n return function _verticalPositionCheck(feetPosition, checkUpward, height, up, forward, collisionCheckParams, collisionRuntimeParams) {\r\n if (height < 0.00001) {\r\n return true;\r\n }\r\n\r\n this._myDebugEnabled = collisionCheckParams.myDebugEnabled && collisionCheckParams.myDebugVerticalPositionEnabled;\r\n\r\n let checkPositions = this._getVerticalCheckPositions(feetPosition, up, forward, collisionCheckParams, collisionRuntimeParams);\r\n\r\n let isVerticalPositionOk = true;\r\n let atLeastOneIsOk = false;\r\n\r\n let adjustmentEpsilon = 0.0001; // Small offset to prevent hitting with the surface where u are on\r\n smallHeightFixOffset = up.vec3_scale(adjustmentEpsilon, smallHeightFixOffset);\r\n heightOffset = up.vec3_scale(height - adjustmentEpsilon, heightOffset);\r\n if (height - adjustmentEpsilon < adjustmentEpsilon * 10) {\r\n heightOffset = up.vec3_scale(adjustmentEpsilon * 10, heightOffset);\r\n }\r\n\r\n let insideHitSet = false;\r\n for (let i = 0; i < checkPositions.length; i++) {\r\n let currentPosition = checkPositions[i];\r\n\r\n if (checkUpward) {\r\n startPosition = currentPosition.vec3_add(smallHeightFixOffset, startPosition);\r\n endPosition = currentPosition.vec3_add(heightOffset, endPosition);\r\n } else {\r\n startPosition = currentPosition.vec3_add(heightOffset, startPosition);\r\n endPosition = currentPosition.vec3_add(smallHeightFixOffset, endPosition);\r\n }\r\n\r\n let origin = startPosition;\r\n direction = endPosition.vec3_sub(origin, direction);\r\n let distance = direction.vec3_length();\r\n direction.vec3_normalize(direction);\r\n\r\n let raycastResult = this._raycastAndDebug(origin, direction, distance, false, false, collisionCheckParams, collisionRuntimeParams);\r\n\r\n if (raycastResult.isColliding()) {\r\n let firstHitOutsideCollision = raycastResult.getFirstHitOutsideCollision();\r\n if (firstHitOutsideCollision != null) {\r\n isVerticalPositionOk = false;\r\n collisionRuntimeParams.myVerticalCollisionHit.copy(firstHitOutsideCollision);\r\n break;\r\n } else if (!insideHitSet) {\r\n insideHitSet = true;\r\n collisionRuntimeParams.myVerticalCollisionHit.copy(raycastResult.myHits[0]);\r\n if (!collisionCheckParams.myVerticalAllowHitInsideCollisionIfOneOk) {\r\n isVerticalPositionOk = false;\r\n break;\r\n }\r\n }\r\n } else {\r\n atLeastOneIsOk = true;\r\n }\r\n }\r\n\r\n collisionRuntimeParams.myIsCollidingVertically = !isVerticalPositionOk || !atLeastOneIsOk;\r\n\r\n return !collisionRuntimeParams.myIsCollidingVertically;\r\n };\r\n}();\r\n\r\nCollisionCheckVertical.prototype._getVerticalCheckPositions = function () {\r\n let checkPositions = [];\r\n let cachedCheckPositions = [];\r\n let currentCachedCheckPositionIndex = 0;\r\n let _localGetCachedCheckPosition = function () {\r\n let item = null;\r\n while (cachedCheckPositions.length <= currentCachedCheckPositionIndex) {\r\n cachedCheckPositions.push(vec3_create());\r\n }\r\n\r\n item = cachedCheckPositions[currentCachedCheckPositionIndex];\r\n currentCachedCheckPositionIndex++;\r\n return item;\r\n };\r\n\r\n let currentDirection = vec3_create();\r\n return function _getVerticalCheckPositions(feetPosition, up, forward, collisionCheckParams, collisionRuntimeParams) {\r\n checkPositions.length = 0;\r\n currentCachedCheckPositionIndex = 0;\r\n\r\n if (collisionCheckParams.myGroundCircumferenceAddCenter) {\r\n let tempCheckPosition = _localGetCachedCheckPosition();\r\n tempCheckPosition.vec3_copy(feetPosition);\r\n checkPositions.push(tempCheckPosition);\r\n }\r\n\r\n let radiusStep = collisionCheckParams.myFeetRadius / collisionCheckParams.myGroundCircumferenceStepAmount;\r\n let sliceAngle = 360 / collisionCheckParams.myGroundCircumferenceSliceAmount;\r\n let currentStepRotation = -collisionCheckParams.myGroundCircumferenceRotationPerStep * (collisionCheckParams.myGroundCircumferenceStepAmount - 1);\r\n for (let i = 0; i < collisionCheckParams.myGroundCircumferenceStepAmount; i++) {\r\n let currentRadius = radiusStep * (i + 1);\r\n\r\n currentDirection = forward.vec3_rotateAxis(currentStepRotation, up, currentDirection);\r\n for (let j = 0; j < collisionCheckParams.myGroundCircumferenceSliceAmount; j++) {\r\n let tempCheckPosition = _localGetCachedCheckPosition();\r\n let sliceDirection = currentDirection.vec3_rotateAxis(sliceAngle * j, up, tempCheckPosition);\r\n checkPositions.push(feetPosition.vec3_add(sliceDirection.vec3_scale(currentRadius, sliceDirection), sliceDirection));\r\n }\r\n\r\n currentStepRotation += collisionCheckParams.myGroundCircumferenceRotationPerStep;\r\n }\r\n\r\n return checkPositions;\r\n };\r\n}();", "import { quat2_create, vec3_create } from \"../../../../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Globals } from \"../../../../../../pp/globals.js\";\r\nimport { CollisionCheckVertical } from \"./collision_check_vertical.js\";\r\nimport { CollisionRuntimeParams } from \"./collision_params.js\";\r\n\r\nexport class CollisionCheckMove extends CollisionCheckVertical {\r\n\r\n move(movement, transformQuat, collisionCheckParams, collisionRuntimeParams) {\r\n if (this.isCollisionCheckDisabled() && Globals.isDebugEnabled(this._myEngine)) {\r\n this._setRuntimeParamsForMoveCollisionCheckDisabled(movement, transformQuat, collisionCheckParams, collisionRuntimeParams);\r\n return;\r\n }\r\n\r\n this._move(movement, transformQuat, collisionCheckParams, collisionRuntimeParams);\r\n }\r\n\r\n _move(movement, transformQuat, collisionCheckParams, collisionRuntimeParams) {\r\n // Implemented outside class definition\r\n }\r\n\r\n _moveStep(movement, feetPosition, transformUp, transformForward, height, allowSurfaceSteepFix, collisionCheckParams, collisionRuntimeParams, outFixedMovement) {\r\n // Implemented outside class definition\r\n }\r\n\r\n _syncCollisionRuntimeParamsWithPrevious(surfaceAdjustedHorizontalMovement, verticalMovement, up, collisionCheckParams, collisionRuntimeParams, previousCollisionRuntimeParams) {\r\n // Implemented outside class definition\r\n }\r\n}\r\n\r\n\r\n\r\n// IMPLEMENTATION\r\n\r\nCollisionCheckMove.prototype._move = function () {\r\n let transformUp = vec3_create();\r\n let transformForward = vec3_create();\r\n let feetPosition = vec3_create();\r\n\r\n let transformOffsetLocalQuat = quat2_create();\r\n let offsetTransformQuat = quat2_create();\r\n\r\n let horizontalMovement = vec3_create();\r\n let verticalMovement = vec3_create();\r\n\r\n let movementStep = vec3_create();\r\n let currentMovementStep = vec3_create();\r\n let movementChecked = vec3_create();\r\n let fixedMovement = vec3_create();\r\n let newFeetPosition = vec3_create();\r\n let fixedMovementStep = vec3_create();\r\n\r\n let previousCollisionRuntimeParams = new CollisionRuntimeParams();\r\n let previousFixedMovement = vec3_create();\r\n let previousMovementChecked = vec3_create();\r\n return function _move(movement, transformQuat, collisionCheckParams, collisionRuntimeParams) {\r\n //return vec3_create();\r\n //movement = vec3_create(0, 0, -1);\r\n\r\n transformOffsetLocalQuat.quat2_setPositionRotationQuat(collisionCheckParams.myPositionOffsetLocal, collisionCheckParams.myRotationOffsetLocalQuat);\r\n offsetTransformQuat = transformOffsetLocalQuat.quat2_toWorld(transformQuat, offsetTransformQuat);\r\n if (transformQuat.vec_equals(offsetTransformQuat, 0.00001)) {\r\n offsetTransformQuat.quat2_copy(transformQuat);\r\n }\r\n\r\n transformUp = offsetTransformQuat.quat2_getUp(transformUp);\r\n transformForward = offsetTransformQuat.quat2_getForward(transformForward);\r\n feetPosition = offsetTransformQuat.quat2_getPosition(feetPosition);\r\n\r\n let height = collisionCheckParams.myHeight;\r\n height = height - 0.00001; // This makes it easier to setup things at the same exact height of a character so that it can go under it\r\n if (height < 0.00001) {\r\n height = 0;\r\n }\r\n //height = 1.70;\r\n\r\n horizontalMovement = movement.vec3_removeComponentAlongAxis(transformUp, horizontalMovement);\r\n if (horizontalMovement.vec3_isZero(0.000001)) {\r\n horizontalMovement.vec3_zero();\r\n }\r\n\r\n verticalMovement = movement.vec3_componentAlongAxis(transformUp, verticalMovement);\r\n if (verticalMovement.vec3_isZero(0.000001)) {\r\n verticalMovement.vec3_zero();\r\n }\r\n\r\n //feetPosition = feetPosition.vec3_add(horizontalMovement.vec3_normalize().vec3_scale(0.5));\r\n //height = height / 2;\r\n //horizontalMovement.vec3_normalize(horizontalMovement).vec3_scale(0.3, horizontalMovement); movement = horizontalMovement.vec3_add(verticalMovement);\r\n\r\n let movementStepAmount = 1;\r\n movementStep.vec3_copy(movement);\r\n\r\n let lastStepLongerThanMaxLength = false;\r\n\r\n if (!movement.vec3_isZero(0.00001) && collisionCheckParams.mySplitMovementEnabled) {\r\n let minLength = collisionCheckParams.mySplitMovementMinLengthEnabled ? collisionCheckParams.mySplitMovementMinLength : undefined;\r\n let maxLength = collisionCheckParams.mySplitMovementMaxLengthEnabled && collisionCheckParams.mySplitMovementMaxLength > 0 ? collisionCheckParams.mySplitMovementMaxLength : undefined;\r\n let maxSteps = collisionCheckParams.mySplitMovementMaxStepsEnabled && collisionCheckParams.mySplitMovementMaxSteps > 0 ? collisionCheckParams.mySplitMovementMaxSteps : 1;\r\n\r\n let movementLength = movement.vec3_length();\r\n let equalStepLength = movementLength / maxSteps;\r\n\r\n let stepLength = Math.pp_clamp(equalStepLength, minLength, maxLength);\r\n if (stepLength != equalStepLength) {\r\n movementStepAmount = Math.ceil(movementLength / stepLength);\r\n movementStep = movementStep.vec3_normalize(movementStep).vec3_scale(stepLength, movementStep);\r\n\r\n if (collisionCheckParams.mySplitMovementMaxStepsEnabled && (collisionCheckParams.mySplitMovementMaxLengthLastStepCanBeLonger || !collisionCheckParams._myInternalSplitMovementMaxStepsDisabled)) {\r\n if (movementStepAmount > maxSteps) {\r\n lastStepLongerThanMaxLength = true;\r\n }\r\n\r\n movementStepAmount = Math.min(movementStepAmount, maxSteps);\r\n }\r\n } else {\r\n movementStepAmount = maxSteps;\r\n movementStep = movementStep.vec3_normalize(movementStep).vec3_scale(equalStepLength, movementStep);\r\n }\r\n\r\n movementStepAmount = Math.max(1, movementStepAmount);\r\n\r\n if (movementStepAmount == 1) {\r\n movementStep.vec3_copy(movement);\r\n }\r\n }\r\n\r\n fixedMovement.vec3_zero();\r\n movementChecked.vec3_zero();\r\n\r\n previousCollisionRuntimeParams.copy(collisionRuntimeParams);\r\n previousFixedMovement.vec3_copy(fixedMovement);\r\n previousMovementChecked.vec3_copy(movementChecked);\r\n\r\n let stepsPerformed = 0;\r\n let splitMovementStop = false;\r\n let splitMovementLastStepLongerThanMaxLength = false;\r\n let splitMovementReduced = false;\r\n\r\n if (collisionCheckParams.mySplitMovementStopAndFailIfMovementWouldBeReduced && (!collisionCheckParams.mySplitMovementMaxLengthLastStepCanBeLonger && lastStepLongerThanMaxLength)) {\r\n fixedMovement.vec3_zero();\r\n this._moveStep(fixedMovement, feetPosition, transformUp, transformForward, height, true, collisionCheckParams, collisionRuntimeParams, fixedMovementStep);\r\n\r\n collisionRuntimeParams.myHorizontalMovementCanceled = true;\r\n collisionRuntimeParams.myVerticalMovementCanceled = true;\r\n\r\n splitMovementStop = true;\r\n } else {\r\n for (let i = 0; i < movementStepAmount; i++) {\r\n if (movementStepAmount == 1 || i != movementStepAmount - 1) {\r\n currentMovementStep.vec3_copy(movementStep);\r\n } else {\r\n if (collisionCheckParams.mySplitMovementMaxLengthLastStepCanBeLonger || !lastStepLongerThanMaxLength) {\r\n splitMovementLastStepLongerThanMaxLength = lastStepLongerThanMaxLength;\r\n\r\n currentMovementStep = movement.vec3_sub(movementChecked, currentMovementStep);\r\n } else {\r\n splitMovementReduced = true;\r\n\r\n currentMovementStep.vec3_copy(movementStep);\r\n }\r\n }\r\n\r\n newFeetPosition = feetPosition.vec3_add(fixedMovement, newFeetPosition);\r\n fixedMovementStep.vec3_zero();\r\n fixedMovementStep = this._moveStep(currentMovementStep, newFeetPosition, transformUp, transformForward, height, true, collisionCheckParams, collisionRuntimeParams, fixedMovementStep);\r\n fixedMovement.vec3_add(fixedMovementStep, fixedMovement);\r\n\r\n movementChecked = movementChecked.vec3_add(currentMovementStep, movementChecked);\r\n\r\n stepsPerformed = i + 1;\r\n\r\n if ((collisionRuntimeParams.myHorizontalMovementCanceled && collisionRuntimeParams.myVerticalMovementCanceled) ||\r\n (collisionRuntimeParams.myHorizontalMovementCanceled && (collisionCheckParams.mySplitMovementStopWhenHorizontalMovementCanceled || (verticalMovement.vec3_isZero() && fixedMovementStep.vec3_isZero()))) ||\r\n (collisionRuntimeParams.myVerticalMovementCanceled && (collisionCheckParams.mySplitMovementStopWhenVerticalMovementCanceled || (horizontalMovement.vec3_isZero() && fixedMovementStep.vec3_isZero()))) ||\r\n (collisionRuntimeParams.myHasReducedVerticalMovement && collisionCheckParams.mySplitMovementStopWhenVerticalMovementReduced) ||\r\n (collisionCheckParams.mySplitMovementStopCallback != null && collisionCheckParams.mySplitMovementStopCallback(collisionRuntimeParams))) {\r\n\r\n if (collisionCheckParams.mySplitMovementStopReturnPrevious) {\r\n collisionRuntimeParams.copy(previousCollisionRuntimeParams);\r\n fixedMovement.vec3_copy(previousFixedMovement);\r\n movementChecked.vec3_copy(previousMovementChecked);\r\n stepsPerformed -= 1;\r\n }\r\n\r\n splitMovementStop = true;\r\n\r\n break;\r\n }\r\n\r\n previousCollisionRuntimeParams.copy(collisionRuntimeParams);\r\n previousFixedMovement.vec3_copy(fixedMovement);\r\n previousMovementChecked.vec3_copy(movementChecked);\r\n }\r\n }\r\n\r\n //fixedMovement.vec3_zero();\r\n\r\n collisionRuntimeParams.mySplitMovementSteps = movementStepAmount;\r\n collisionRuntimeParams.mySplitMovementStepsPerformed = stepsPerformed;\r\n collisionRuntimeParams.mySplitMovementStop = splitMovementStop;\r\n collisionRuntimeParams.mySplitMovementLastStepLongerThanMaxLength = splitMovementLastStepLongerThanMaxLength;\r\n collisionRuntimeParams.mySplitMovementReduced = splitMovementReduced;\r\n collisionRuntimeParams.mySplitMovementMovementChecked.vec3_copy(movementChecked);\r\n\r\n collisionRuntimeParams.myOriginalUp = transformQuat.quat2_getUp(collisionRuntimeParams.myOriginalUp);\r\n collisionRuntimeParams.myOriginalForward = transformQuat.quat2_getForward(collisionRuntimeParams.myOriginalForward);\r\n collisionRuntimeParams.myOriginalPosition = transformQuat.quat2_getPosition(collisionRuntimeParams.myOriginalPosition);\r\n\r\n collisionRuntimeParams.myOffsetUp.vec3_copy(transformUp);\r\n\r\n //console.error(collisionRuntimeParams.myOriginalPosition.vec3_sub(feetPosition)[1].toFixed(3));\r\n\r\n collisionRuntimeParams.myOriginalHeight = collisionCheckParams.myHeight;\r\n\r\n collisionRuntimeParams.myOriginalMovement.vec3_copy(movement);\r\n collisionRuntimeParams.myFixedMovement.vec3_copy(fixedMovement);\r\n\r\n collisionRuntimeParams.myNewPosition = collisionRuntimeParams.myOriginalPosition.vec3_add(collisionRuntimeParams.myFixedMovement, collisionRuntimeParams.myNewPosition);\r\n\r\n collisionRuntimeParams.myIsMove = true;\r\n };\r\n}();\r\n\r\nCollisionCheckMove.prototype._moveStep = function () {\r\n let horizontalMovement = vec3_create();\r\n let verticalMovement = vec3_create();\r\n let fixedHorizontalMovement = vec3_create();\r\n let fixedVerticalMovement = vec3_create();\r\n let horizontalDirection = vec3_create();\r\n let forwardForHorizontal = vec3_create();\r\n let forwardForVertical = vec3_create();\r\n let forwardForPerceivedAngle = vec3_create();\r\n let newFeetPosition = vec3_create();\r\n let surfaceAdjustedVerticalMovement = vec3_create();\r\n let surfaceAdjustedHorizontalMovement = vec3_create();\r\n let fixedMovement = vec3_create();\r\n\r\n let zAxis = vec3_create(0, 0, 1);\r\n let xAxis = vec3_create(1, 0, 0);\r\n return function _moveStep(movement, feetPosition, transformUp, transformForward, height, allowSurfaceSteepFix, collisionCheckParams, collisionRuntimeParams, outFixedMovement) {\r\n // #TODO Refactor and split horizontal check and vertical check into: hMovement + vMovement + hPosition + vPosition?\r\n // Will make the sliding heavier, if I slide repeating all the 4 steps instead of 2 as now, but would be more correct\r\n\r\n // #TODO When on high slopes where u are not allowed to move the check does not manage to slide\r\n\r\n // #TODO When moving upward on the edge of a slope, the edge can be detected as a wall and prevent movement, while it should just keep moving\r\n\r\n horizontalMovement = movement.vec3_removeComponentAlongAxis(transformUp, horizontalMovement);\r\n if (horizontalMovement.vec3_isZero(0.000001)) {\r\n horizontalMovement.vec3_zero();\r\n }\r\n\r\n verticalMovement = movement.vec3_componentAlongAxis(transformUp, verticalMovement);\r\n if (verticalMovement.vec3_isZero(0.000001)) {\r\n verticalMovement.vec3_zero();\r\n }\r\n\r\n if (horizontalMovement.vec3_isZero()) {\r\n //return vec3_create();\r\n }\r\n\r\n //collisionCheckParams.myDebugEnabled = true;\r\n\r\n this._myPrevCollisionRuntimeParams.copy(collisionRuntimeParams);\r\n collisionRuntimeParams.reset();\r\n\r\n surfaceAdjustedHorizontalMovement = this._adjustHorizontalMovementWithSurface(horizontalMovement, verticalMovement, transformUp, collisionCheckParams, collisionRuntimeParams, this._myPrevCollisionRuntimeParams, surfaceAdjustedHorizontalMovement);\r\n if (surfaceAdjustedHorizontalMovement.vec3_isZero(0.00001)) {\r\n surfaceAdjustedHorizontalMovement.vec3_zero();\r\n }\r\n\r\n this._syncCollisionRuntimeParamsWithPrevious(surfaceAdjustedHorizontalMovement, verticalMovement, transformUp, collisionCheckParams, collisionRuntimeParams, this._myPrevCollisionRuntimeParams);\r\n\r\n {\r\n forwardForHorizontal.vec3_copy(collisionCheckParams.myCheckHorizontalFixedForward);\r\n if (!collisionCheckParams.myCheckHorizontalFixedForwardEnabled) {\r\n if (!surfaceAdjustedHorizontalMovement.vec3_isZero()) {\r\n forwardForHorizontal = surfaceAdjustedHorizontalMovement.vec3_normalize(forwardForHorizontal);\r\n } else if (!horizontalMovement.vec3_isZero()) {\r\n forwardForHorizontal = horizontalMovement.vec3_normalize(forwardForHorizontal);\r\n } else {\r\n forwardForHorizontal.vec3_copy(transformForward);\r\n }\r\n } else {\r\n if (collisionCheckParams.myCheckHorizontalFixedForward.vec3_isOnAxis(transformUp)) {\r\n if (zAxis.vec3_isOnAxis(transformUp)) {\r\n forwardForHorizontal.vec3_copy(xAxis);\r\n } else {\r\n forwardForHorizontal.vec3_copy(zAxis);\r\n }\r\n }\r\n\r\n forwardForHorizontal = forwardForHorizontal.vec3_removeComponentAlongAxis(transformUp, forwardForHorizontal);\r\n forwardForHorizontal = forwardForHorizontal.vec3_normalize(forwardForHorizontal);\r\n\r\n if (forwardForHorizontal.vec_equals(collisionCheckParams.myCheckHorizontalFixedForward, 0.00001)) {\r\n forwardForHorizontal.vec3_copy(collisionCheckParams.myCheckHorizontalFixedForward);\r\n }\r\n }\r\n\r\n fixedHorizontalMovement.vec3_zero();\r\n\r\n if (!surfaceAdjustedHorizontalMovement.vec3_isZero()) {\r\n fixedHorizontalMovement = this._horizontalCheck(surfaceAdjustedHorizontalMovement, feetPosition, height, transformUp, forwardForHorizontal, allowSurfaceSteepFix, collisionCheckParams, collisionRuntimeParams, this._myPrevCollisionRuntimeParams, false, fixedHorizontalMovement);\r\n //collisionRuntimeParams.myIsCollidingHorizontally = true;\r\n //collisionRuntimeParams.myHorizontalCollisionHit.myNormal = vec3_create(0, 0, 1);\r\n if (collisionCheckParams.mySlidingEnabled && collisionRuntimeParams.myIsCollidingHorizontally && this._isSlidingNormalValid(surfaceAdjustedHorizontalMovement, transformUp, collisionRuntimeParams)) {\r\n fixedHorizontalMovement = this._horizontalSlide(surfaceAdjustedHorizontalMovement, feetPosition, height, transformUp, forwardForHorizontal, allowSurfaceSteepFix, collisionCheckParams, collisionRuntimeParams, this._myPrevCollisionRuntimeParams, fixedHorizontalMovement);\r\n } else {\r\n //console.error(\"no slide\");\r\n }\r\n }\r\n\r\n if (fixedHorizontalMovement.vec3_isZero(0.000001)) {\r\n fixedHorizontalMovement.vec3_zero();\r\n }\r\n\r\n if (!surfaceAdjustedHorizontalMovement.vec3_isZero() && fixedHorizontalMovement.vec3_isZero()) {\r\n collisionRuntimeParams.myHorizontalMovementCanceled = true;\r\n }\r\n }\r\n\r\n {\r\n forwardForVertical.vec3_copy(collisionCheckParams.myCheckVerticalFixedForward);\r\n if (!collisionCheckParams.myCheckVerticalFixedForwardEnabled) {\r\n if (fixedHorizontalMovement.vec3_isZero()) {\r\n if (!surfaceAdjustedHorizontalMovement.vec3_isZero()) {\r\n forwardForVertical = surfaceAdjustedHorizontalMovement.vec3_normalize(forwardForVertical);\r\n } else if (!horizontalMovement.vec3_isZero()) {\r\n forwardForVertical = horizontalMovement.vec3_normalize(forwardForVertical);\r\n } else {\r\n forwardForVertical.vec3_copy(transformForward);\r\n }\r\n } else {\r\n forwardForVertical = fixedHorizontalMovement.vec3_normalize(forwardForVertical);\r\n }\r\n } else {\r\n if (collisionCheckParams.myCheckVerticalFixedForward.vec3_isOnAxis(transformUp)) {\r\n if (zAxis.vec3_isOnAxis(transformUp)) {\r\n forwardForVertical.vec3_copy(xAxis);\r\n } else {\r\n forwardForVertical.vec3_copy(zAxis);\r\n }\r\n }\r\n\r\n forwardForVertical = forwardForVertical.vec3_removeComponentAlongAxis(transformUp, forwardForVertical);\r\n forwardForVertical = forwardForVertical.vec3_normalize(forwardForVertical);\r\n\r\n if (forwardForVertical.vec_equals(collisionCheckParams.myCheckVerticalFixedForward, 0.00001)) {\r\n forwardForVertical.vec3_copy(collisionCheckParams.myCheckVerticalFixedForward);\r\n }\r\n }\r\n\r\n //collisionCheckParams.myDebugEnabled = false;\r\n\r\n surfaceAdjustedVerticalMovement = this._adjustVerticalMovementWithSurface(fixedHorizontalMovement, verticalMovement, transformUp, collisionCheckParams, collisionRuntimeParams, this._myPrevCollisionRuntimeParams, surfaceAdjustedVerticalMovement);\r\n\r\n newFeetPosition = feetPosition.vec3_add(fixedHorizontalMovement, newFeetPosition);\r\n let originalMovementSign = Math.pp_sign(verticalMovement.vec3_lengthSigned(transformUp), 0);\r\n\r\n fixedVerticalMovement.vec3_zero();\r\n fixedVerticalMovement = this._verticalCheck(surfaceAdjustedVerticalMovement, originalMovementSign, newFeetPosition, height, transformUp, forwardForVertical, collisionCheckParams, collisionRuntimeParams, fixedVerticalMovement);\r\n\r\n if (fixedVerticalMovement.vec3_isZero(0.000001)) {\r\n fixedVerticalMovement.vec3_zero();\r\n }\r\n }\r\n\r\n outFixedMovement.vec3_zero();\r\n if (!collisionRuntimeParams.myIsCollidingVertically) {\r\n outFixedMovement = fixedHorizontalMovement.vec3_add(fixedVerticalMovement, outFixedMovement);\r\n } else {\r\n collisionRuntimeParams.myHorizontalMovementCanceled = true;\r\n collisionRuntimeParams.myVerticalMovementCanceled = true;\r\n fixedHorizontalMovement.vec3_zero();\r\n fixedVerticalMovement.vec3_zero();\r\n\r\n if (!collisionCheckParams.myCheckVerticalFixedForwardEnabled) {\r\n if (!surfaceAdjustedHorizontalMovement.vec3_isZero()) {\r\n forwardForVertical = surfaceAdjustedHorizontalMovement.vec3_normalize(forwardForVertical);\r\n } else if (!horizontalMovement.vec3_isZero()) {\r\n forwardForVertical = horizontalMovement.vec3_normalize(forwardForVertical);\r\n } else {\r\n forwardForVertical.vec3_copy(transformForward);\r\n }\r\n }\r\n }\r\n\r\n newFeetPosition = feetPosition.vec3_add(outFixedMovement, newFeetPosition);\r\n\r\n forwardForPerceivedAngle.vec3_copy(transformForward);\r\n\r\n if (!fixedHorizontalMovement.vec3_isZero()) {\r\n forwardForPerceivedAngle = fixedHorizontalMovement.vec3_normalize(forwardForPerceivedAngle);\r\n } else if (!surfaceAdjustedHorizontalMovement.vec3_isZero()) {\r\n forwardForPerceivedAngle = surfaceAdjustedHorizontalMovement.vec3_normalize(forwardForPerceivedAngle);\r\n } else if (!horizontalMovement.vec3_isZero()) {\r\n forwardForPerceivedAngle = horizontalMovement.vec3_normalize(forwardForPerceivedAngle);\r\n }\r\n\r\n if (collisionCheckParams.myComputeGroundInfoEnabled) {\r\n this._gatherSurfaceInfo(newFeetPosition, height, transformUp, forwardForPerceivedAngle, forwardForVertical, true, collisionCheckParams, collisionRuntimeParams);\r\n }\r\n\r\n if (collisionCheckParams.myComputeCeilingInfoEnabled) {\r\n this._gatherSurfaceInfo(newFeetPosition, height, transformUp, forwardForPerceivedAngle, forwardForVertical, false, collisionCheckParams, collisionRuntimeParams);\r\n }\r\n\r\n if (!surfaceAdjustedHorizontalMovement.vec3_isZero() && !collisionRuntimeParams.myHorizontalMovementCanceled) {\r\n let surfaceCheckOk = this._postSurfaceCheck(fixedHorizontalMovement, fixedVerticalMovement, transformUp, collisionCheckParams, collisionRuntimeParams, this._myPrevCollisionRuntimeParams);\r\n\r\n if (!surfaceCheckOk) {\r\n collisionRuntimeParams.myHorizontalMovementCanceled = true;\r\n collisionRuntimeParams.myVerticalMovementCanceled = true;\r\n fixedHorizontalMovement.vec3_zero();\r\n fixedVerticalMovement.vec3_zero();\r\n outFixedMovement.vec3_zero();\r\n newFeetPosition = feetPosition.vec3_add(outFixedMovement, newFeetPosition);\r\n\r\n if (!surfaceAdjustedHorizontalMovement.vec3_isZero()) {\r\n forwardForPerceivedAngle = surfaceAdjustedHorizontalMovement.vec3_normalize(forwardForPerceivedAngle);\r\n } else if (!horizontalMovement.vec3_isZero()) {\r\n forwardForPerceivedAngle = horizontalMovement.vec3_normalize(forwardForPerceivedAngle);\r\n } else {\r\n forwardForPerceivedAngle.vec3_copy(transformForward);\r\n }\r\n\r\n if (collisionCheckParams.myComputeGroundInfoEnabled && collisionCheckParams.myRegatherGroundInfoOnSurfaceCheckFail) {\r\n this._gatherSurfaceInfo(newFeetPosition, height, transformUp, forwardForPerceivedAngle, forwardForVertical, true, collisionCheckParams, collisionRuntimeParams);\r\n } else {\r\n collisionRuntimeParams.myRealIsOnGround = this._myPrevCollisionRuntimeParams.myRealIsOnGround;\r\n collisionRuntimeParams.myIsOnGround = this._myPrevCollisionRuntimeParams.myIsOnGround;\r\n collisionRuntimeParams.myGroundCollisionHit.copy(this._myPrevCollisionRuntimeParams.myGroundCollisionHit);\r\n collisionRuntimeParams.myGroundAngle = this._myPrevCollisionRuntimeParams.myGroundAngle;\r\n collisionRuntimeParams.myGroundPerceivedAngle = this._myPrevCollisionRuntimeParams.myGroundPerceivedAngle;\r\n collisionRuntimeParams.myGroundNormal.vec3_copy(this._myPrevCollisionRuntimeParams.myGroundNormal);\r\n collisionRuntimeParams.myGroundHitMaxAngle = this._myPrevCollisionRuntimeParams.myGroundHitMaxAngle;\r\n collisionRuntimeParams.myGroundHitMaxNormal.vec3_copy(this._myPrevCollisionRuntimeParams.myGroundHitMaxNormal);\r\n collisionRuntimeParams.myGroundDistance = this._myPrevCollisionRuntimeParams.myGroundDistance;\r\n collisionRuntimeParams.myGroundIsBaseInsideCollision = this._myPrevCollisionRuntimeParams.myGroundIsBaseInsideCollision;\r\n collisionRuntimeParams.myOnGroundDueToBasePartiallyInsideCollision = this._myPrevCollisionRuntimeParams.myOnGroundDueToBasePartiallyInsideCollision;\r\n }\r\n\r\n if (collisionCheckParams.myComputeCeilingInfoEnabled && collisionCheckParams.myRegatherCeilingInfoOnSurfaceCheckFail) {\r\n this._gatherSurfaceInfo(newFeetPosition, height, transformUp, forwardForPerceivedAngle, forwardForVertical, false, collisionCheckParams, collisionRuntimeParams);\r\n } else {\r\n collisionRuntimeParams.myRealIsOnCeiling = this._myPrevCollisionRuntimeParams.myRealIsOnCeiling;\r\n collisionRuntimeParams.myIsOnCeiling = this._myPrevCollisionRuntimeParams.myIsOnCeiling;\r\n collisionRuntimeParams.myCeilingCollisionHit.copy(this._myPrevCollisionRuntimeParams.myCeilingCollisionHit);\r\n collisionRuntimeParams.myCeilingAngle = this._myPrevCollisionRuntimeParams.myCeilingAngle;\r\n collisionRuntimeParams.myCeilingPerceivedAngle = this._myPrevCollisionRuntimeParams.myCeilingPerceivedAngle;\r\n collisionRuntimeParams.myCeilingNormal.vec3_copy(this._myPrevCollisionRuntimeParams.myCeilingNormal);\r\n collisionRuntimeParams.myCeilingHitMaxAngle = this._myPrevCollisionRuntimeParams.myCeilingHitMaxAngle;\r\n collisionRuntimeParams.myCeilingHitMaxNormal.vec3_copy(this._myPrevCollisionRuntimeParams.myCeilingHitMaxNormal);\r\n collisionRuntimeParams.myCeilingDistance = this._myPrevCollisionRuntimeParams.myCeilingDistance;\r\n collisionRuntimeParams.myCeilingIsBaseInsideCollision = this._myPrevCollisionRuntimeParams.myCeilingIsBaseInsideCollision;\r\n collisionRuntimeParams.myOnCeilingDueToBasePartiallyInsideCollision = this._myPrevCollisionRuntimeParams.myOnCeilingDueToBasePartiallyInsideCollision;\r\n }\r\n }\r\n }\r\n\r\n //return outFixedMovement.vec3_zero(); \r\n\r\n if (collisionCheckParams.myExtraMovementCheckCallback != null) {\r\n fixedMovement.vec3_copy(outFixedMovement);\r\n outFixedMovement = collisionCheckParams.myExtraMovementCheckCallback(\r\n movement, fixedMovement, feetPosition, transformUp, transformForward, height,\r\n collisionCheckParams, this._myPrevCollisionRuntimeParams, collisionRuntimeParams, outFixedMovement);\r\n\r\n fixedHorizontalMovement = outFixedMovement.vec3_removeComponentAlongAxis(transformUp, fixedHorizontalMovement);\r\n fixedVerticalMovement = outFixedMovement.vec3_componentAlongAxis(transformUp, fixedVerticalMovement);\r\n }\r\n\r\n {\r\n if (collisionCheckParams.mySlidingAdjustSign90Degrees) {\r\n if (!collisionRuntimeParams.myHorizontalMovementCanceled && !collisionRuntimeParams.myIsSliding && !fixedHorizontalMovement.vec3_isZero()) {\r\n /* let angleWithPreviousThreshold = 0.5;\r\n check use surfaceAdjustedHorizontalMovement instead of horizontalMovement if re-enable this\r\n \r\n if (!this._myPrevCollisionRuntimeParams.myLastValidOriginalHorizontalMovement.vec3_isZero() && !horizontalMovement.vec3_isZero() &&\r\n horizontalMovement.vec3_angle(this._myPrevCollisionRuntimeParams.myLastValidOriginalHorizontalMovement) > angleWithPreviousThreshold) {\r\n collisionRuntimeParams.mySliding90DegreesSign = horizontalMovement.vec3_signTo(this._myPrevCollisionRuntimeParams.myLastValidOriginalHorizontalMovement, transformUp);\r\n console.error(\"sp\", collisionRuntimeParams.mySliding90DegreesSign, collisionRuntimeParams.myIsSliding);\r\n } */\r\n collisionRuntimeParams.mySlidingRecompute90DegreesSign = true;\r\n //console.error(\"empty renew\");\r\n }\r\n }\r\n\r\n if (!horizontalMovement.vec3_isZero()) {\r\n collisionRuntimeParams.myLastValidOriginalHorizontalMovement.vec3_copy(horizontalMovement);\r\n }\r\n\r\n if (!surfaceAdjustedHorizontalMovement.vec3_isZero()) {\r\n collisionRuntimeParams.myLastValidSurfaceAdjustedHorizontalMovement.vec3_copy(surfaceAdjustedHorizontalMovement);\r\n }\r\n\r\n if (!verticalMovement.vec3_isZero()) {\r\n collisionRuntimeParams.myLastValidOriginalVerticalMovement.vec3_copy(verticalMovement);\r\n }\r\n\r\n if (!surfaceAdjustedVerticalMovement.vec3_isZero()) {\r\n collisionRuntimeParams.myLastValidSurfaceAdjustedVerticalMovement.vec3_copy(surfaceAdjustedVerticalMovement);\r\n }\r\n\r\n if (!fixedHorizontalMovement.vec3_isZero(0.000001)) {\r\n collisionRuntimeParams.myLastValidIsSliding = collisionRuntimeParams.myIsSliding;\r\n collisionRuntimeParams.myIsSlidingFlickerPrevented = false;\r\n collisionRuntimeParams.myLastValidEndHorizontalMovement.vec3_copy(fixedHorizontalMovement);\r\n //fixedHorizontalMovement.vec_error();\r\n\r\n if (!collisionRuntimeParams.myIsSliding) {\r\n //console.error(\"not sliding\");\r\n } else {\r\n //console.error(\"sliding\", collisionRuntimeParams.myIsSlidingFlickerPrevented, collisionRuntimeParams.mySlidingFlickerPreventionCheckAnywayCounter);\r\n }\r\n } else {\r\n //console.error(\"still\", collisionRuntimeParams.myIsSlidingFlickerPrevented, collisionRuntimeParams.mySlidingFlickerPreventionCheckAnywayCounter);\r\n }\r\n\r\n if (!fixedVerticalMovement.vec3_isZero(0.000001)) {\r\n collisionRuntimeParams.myLastValidEndVerticalMovement.vec3_copy(fixedVerticalMovement);\r\n }\r\n }\r\n\r\n let moveStepFixed = false;\r\n if (!collisionRuntimeParams.myHorizontalMovementCanceled && !fixedHorizontalMovement.vec3_isZero(0.000001)) {\r\n horizontalDirection = fixedHorizontalMovement.vec3_normalize(horizontalDirection);\r\n let surfaceTooSteepResults = this._surfaceTooSteep(transformUp, horizontalDirection, collisionCheckParams, this._myPrevCollisionRuntimeParams);\r\n if (surfaceTooSteepResults[0] || surfaceTooSteepResults[1]) {\r\n horizontalDirection = fixedHorizontalMovement.vec3_normalize(horizontalDirection);\r\n let newSurfaceTooSteepResults = this._surfaceTooSteep(transformUp, horizontalDirection, collisionCheckParams, collisionRuntimeParams);\r\n\r\n if ((surfaceTooSteepResults[0] && newSurfaceTooSteepResults[0]) ||\r\n (surfaceTooSteepResults[1] && newSurfaceTooSteepResults[1]) ||\r\n !allowSurfaceSteepFix ||\r\n (surfaceTooSteepResults[0] && !collisionCheckParams.myAllowGroundSteepFix) ||\r\n (surfaceTooSteepResults[1] && !collisionCheckParams.myAllowCeilingSteepFix)) {\r\n outFixedMovement.vec3_zero();\r\n collisionRuntimeParams.copy(this._myPrevCollisionRuntimeParams);\r\n this._moveStep(movement, feetPosition, transformUp, transformForward, height, false, collisionCheckParams, collisionRuntimeParams, outFixedMovement);\r\n moveStepFixed = true;\r\n }\r\n }\r\n }\r\n\r\n if (!moveStepFixed) {\r\n if (collisionCheckParams.myDebugEnabled && collisionCheckParams.myDebugMovementEnabled && Globals.isDebugEnabled(this._myEngine)) {\r\n this._debugMovement(movement, outFixedMovement, newFeetPosition, transformUp, collisionCheckParams);\r\n }\r\n\r\n if (collisionCheckParams.myDebugEnabled && collisionCheckParams.myDebugRuntimeParamsEnabled && Globals.isDebugEnabled(this._myEngine)) {\r\n this._debugRuntimeParams(collisionRuntimeParams);\r\n }\r\n }\r\n\r\n return outFixedMovement;\r\n };\r\n}();\r\n\r\nCollisionCheckMove.prototype._syncCollisionRuntimeParamsWithPrevious = function () {\r\n let previousFixedHorizontalMovement = vec3_create();\r\n return function _syncCollisionRuntimeParamsWithPrevious(surfaceAdjustedHorizontalMovement, verticalMovement, up, collisionCheckParams, collisionRuntimeParams, previousCollisionRuntimeParams) {\r\n collisionRuntimeParams.myIsSlidingFlickerPrevented = previousCollisionRuntimeParams.myIsSlidingFlickerPrevented;\r\n //console.error(\"prevented\", collisionRuntimeParams.myIsSlidingFlickerPrevented);\r\n\r\n collisionRuntimeParams.myLastValidOriginalHorizontalMovement.vec3_copy(previousCollisionRuntimeParams.myLastValidOriginalHorizontalMovement);\r\n collisionRuntimeParams.myLastValidOriginalVerticalMovement.vec3_copy(previousCollisionRuntimeParams.myLastValidOriginalVerticalMovement);\r\n collisionRuntimeParams.myLastValidSurfaceAdjustedHorizontalMovement.vec3_copy(previousCollisionRuntimeParams.myLastValidSurfaceAdjustedHorizontalMovement);\r\n collisionRuntimeParams.myLastValidSurfaceAdjustedVerticalMovement.vec3_copy(previousCollisionRuntimeParams.myLastValidSurfaceAdjustedVerticalMovement);\r\n collisionRuntimeParams.myLastValidIsSliding = previousCollisionRuntimeParams.myLastValidIsSliding;\r\n\r\n collisionRuntimeParams.mySliding90DegreesSign = previousCollisionRuntimeParams.mySliding90DegreesSign;\r\n collisionRuntimeParams.mySlidingRecompute90DegreesSign = previousCollisionRuntimeParams.mySlidingRecompute90DegreesSign;\r\n if (collisionCheckParams.mySlidingAdjustSign90Degrees) {\r\n let angleWithPreviousThreshold = 0.5;\r\n if (!previousCollisionRuntimeParams.myLastValidSurfaceAdjustedHorizontalMovement.vec3_isZero() && !surfaceAdjustedHorizontalMovement.vec3_isZero() &&\r\n surfaceAdjustedHorizontalMovement.vec3_angle(previousCollisionRuntimeParams.myLastValidSurfaceAdjustedHorizontalMovement) > angleWithPreviousThreshold) {\r\n //previousFixedHorizontalMovement = previousCollisionRuntimeParams.myFixedMovement.vec3_removeComponentAlongAxis(up, previousFixedHorizontalMovement);\r\n if (!previousCollisionRuntimeParams.myLastValidIsSliding) {\r\n let angleSigned = surfaceAdjustedHorizontalMovement.vec3_angleSigned(previousCollisionRuntimeParams.myLastValidSurfaceAdjustedHorizontalMovement, up);\r\n let angleSignedThreshold = 10;\r\n if (Math.abs(angleSigned) < 180 - angleSignedThreshold) {\r\n collisionRuntimeParams.mySliding90DegreesSign = Math.pp_sign(angleSigned);\r\n //console.error(\"special sign\");\r\n }\r\n }\r\n collisionRuntimeParams.mySlidingRecompute90DegreesSign = true;\r\n //console.error(\"direction new\");\r\n }\r\n }\r\n\r\n previousFixedHorizontalMovement = previousCollisionRuntimeParams.myFixedMovement.vec3_removeComponentAlongAxis(up, previousFixedHorizontalMovement);\r\n if (previousFixedHorizontalMovement.vec3_isZero(0.000001)) {\r\n collisionRuntimeParams.mySlidingPreviousHorizontalMovement.vec3_copy(previousCollisionRuntimeParams.mySlidingPreviousHorizontalMovement);\r\n } else {\r\n collisionRuntimeParams.mySlidingPreviousHorizontalMovement.vec3_copy(previousFixedHorizontalMovement);\r\n }\r\n };\r\n}();", "import { quat2_create, vec3_create } from \"../../../../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Globals } from \"../../../../../../pp/globals.js\";\r\nimport { CollisionCheckMove } from \"./collision_check_move.js\";\r\n\r\nexport class CollisionCheckTeleport extends CollisionCheckMove {\r\n\r\n // #TODO Add teleport position/transform and return originalteleportransform\r\n // instead of position old transform / new transform\r\n teleport(position, transformQuat, collisionCheckParams, collisionRuntimeParams) {\r\n if (this.isCollisionCheckDisabled() && Globals.isDebugEnabled(this._myEngine)) {\r\n this._setRuntimeParamsForTeleportCollisionCheckDisabled(position, transformQuat, collisionCheckParams, collisionRuntimeParams);\r\n return;\r\n }\r\n\r\n this._teleport(position, transformQuat, collisionCheckParams, collisionRuntimeParams);\r\n }\r\n\r\n _teleport(teleportPosition, transformQuat, collisionCheckParams, collisionRuntimeParams, isPositionCheck = false) {\r\n // Implemented outside class definition\r\n }\r\n}\r\n\r\n\r\n\r\n// IMPLEMENTATION\r\n\r\nCollisionCheckTeleport.prototype._teleport = function () {\r\n let transformUp = vec3_create();\r\n let transformForward = vec3_create();\r\n let feetPosition = vec3_create();\r\n let originalFeetPosition = vec3_create();\r\n\r\n let transformOffsetLocalQuat = quat2_create();\r\n let offsetTransformQuat = quat2_create();\r\n\r\n let feetPositionOffsetToOriginal = vec3_create();\r\n let offsetTeleportPosition = vec3_create();\r\n\r\n let zero = vec3_create();\r\n let forwardForHorizontal = vec3_create();\r\n let forwardForVertical = vec3_create();\r\n let forwardForPerceivedAngle = vec3_create();\r\n let fixedHorizontalMovement = vec3_create();\r\n let fixedVerticalMovement = vec3_create();\r\n let newFeetPosition = vec3_create();\r\n let endPosition = vec3_create();\r\n\r\n let zAxis = vec3_create(0, 0, 1);\r\n let xAxis = vec3_create(1, 0, 0);\r\n return function _teleport(teleportPosition, transformQuat, collisionCheckParams, collisionRuntimeParams, isPositionCheck = false) {\r\n transformOffsetLocalQuat.quat2_setPositionRotationQuat(collisionCheckParams.myPositionOffsetLocal, collisionCheckParams.myRotationOffsetLocalQuat);\r\n offsetTransformQuat = transformOffsetLocalQuat.quat2_toWorld(transformQuat, offsetTransformQuat);\r\n if (transformQuat.vec_equals(offsetTransformQuat, 0.00001)) {\r\n offsetTransformQuat.quat2_copy(transformQuat);\r\n }\r\n\r\n transformUp = offsetTransformQuat.quat2_getUp(transformUp);\r\n transformForward = offsetTransformQuat.quat2_getForward(transformForward);\r\n feetPosition = offsetTransformQuat.quat2_getPosition(feetPosition);\r\n\r\n offsetTeleportPosition.vec3_copy(teleportPosition);\r\n originalFeetPosition = transformQuat.quat2_getPosition(originalFeetPosition);\r\n feetPositionOffsetToOriginal = originalFeetPosition.vec3_sub(feetPosition, feetPositionOffsetToOriginal);\r\n if (feetPositionOffsetToOriginal.vec3_isZero(0.00001)) {\r\n feetPositionOffsetToOriginal.vec3_zero();\r\n } else {\r\n offsetTeleportPosition = offsetTeleportPosition.vec3_sub(feetPositionOffsetToOriginal, offsetTeleportPosition);\r\n }\r\n\r\n\r\n let height = collisionCheckParams.myHeight;\r\n height = height - 0.00001; // This makes it easier to setup things at the same exact height of a character so that it can go under it\r\n if (height < 0.00001) {\r\n height = 0;\r\n }\r\n //height = 1.70;\r\n\r\n this._myPrevCollisionRuntimeParams.copy(collisionRuntimeParams);\r\n collisionRuntimeParams.reset();\r\n\r\n forwardForHorizontal.vec3_copy(collisionCheckParams.myCheckHorizontalFixedForward);\r\n if (!collisionCheckParams.myCheckHorizontalFixedForwardEnabled) {\r\n forwardForHorizontal.vec3_copy(transformForward);\r\n } else {\r\n if (collisionCheckParams.myCheckHorizontalFixedForward.vec3_isOnAxis(transformUp)) {\r\n if (zAxis.vec3_isOnAxis(transformUp)) {\r\n forwardForHorizontal.vec3_copy(xAxis);\r\n } else {\r\n forwardForHorizontal.vec3_copy(zAxis);\r\n }\r\n }\r\n\r\n forwardForHorizontal = forwardForHorizontal.vec3_removeComponentAlongAxis(transformUp, forwardForHorizontal);\r\n forwardForHorizontal = forwardForHorizontal.vec3_normalize(forwardForHorizontal);\r\n\r\n if (forwardForHorizontal.vec_equals(collisionCheckParams.myCheckHorizontalFixedForward, 0.00001)) {\r\n forwardForHorizontal.vec3_copy(collisionCheckParams.myCheckHorizontalFixedForward);\r\n }\r\n }\r\n\r\n fixedHorizontalMovement = this._horizontalCheck(zero, offsetTeleportPosition, height, transformUp, forwardForHorizontal, false, collisionCheckParams, collisionRuntimeParams, this._myPrevCollisionRuntimeParams, false, fixedHorizontalMovement);\r\n if (!collisionRuntimeParams.myIsCollidingHorizontally) {\r\n newFeetPosition = offsetTeleportPosition.vec3_add(fixedHorizontalMovement, newFeetPosition);\r\n\r\n forwardForVertical.vec3_copy(collisionCheckParams.myCheckVerticalFixedForward);\r\n if (!collisionCheckParams.myCheckVerticalFixedForwardEnabled) {\r\n forwardForVertical.vec3_copy(transformForward);\r\n } else {\r\n if (collisionCheckParams.myCheckVerticalFixedForward.vec3_isOnAxis(transformUp)) {\r\n if (zAxis.vec3_isOnAxis(transformUp)) {\r\n forwardForVertical.vec3_copy(xAxis);\r\n } else {\r\n forwardForVertical.vec3_copy(zAxis);\r\n }\r\n }\r\n\r\n forwardForVertical = forwardForVertical.vec3_removeComponentAlongAxis(transformUp, forwardForVertical);\r\n forwardForVertical = forwardForVertical.vec3_normalize(forwardForVertical);\r\n\r\n if (forwardForVertical.vec_equals(collisionCheckParams.myCheckVerticalFixedForward, 0.00001)) {\r\n forwardForVertical.vec3_copy(collisionCheckParams.myCheckVerticalFixedForward);\r\n }\r\n }\r\n\r\n let downward = -1;\r\n fixedVerticalMovement = this._verticalCheck(zero, downward, newFeetPosition, height, transformUp, forwardForVertical, collisionCheckParams, collisionRuntimeParams, fixedVerticalMovement);\r\n if (!collisionRuntimeParams.myIsCollidingVertically) {\r\n newFeetPosition = newFeetPosition.vec3_add(fixedVerticalMovement, newFeetPosition);\r\n\r\n forwardForPerceivedAngle.vec3_copy(transformForward);\r\n\r\n if (collisionCheckParams.myComputeGroundInfoEnabled) {\r\n this._gatherSurfaceInfo(newFeetPosition, height, transformUp, forwardForPerceivedAngle, forwardForVertical, true, collisionCheckParams, collisionRuntimeParams);\r\n }\r\n\r\n if (collisionCheckParams.myComputeCeilingInfoEnabled) {\r\n this._gatherSurfaceInfo(newFeetPosition, height, transformUp, forwardForPerceivedAngle, forwardForVertical, false, collisionCheckParams, collisionRuntimeParams);\r\n }\r\n\r\n if (!collisionRuntimeParams.myIsOnGround) {\r\n if ((collisionCheckParams.myTeleportMustBeOnGround && !isPositionCheck)\r\n || (collisionCheckParams.myCheckTransformMustBeOnGround && isPositionCheck)) {\r\n collisionRuntimeParams.myTeleportCanceled = true;\r\n }\r\n }\r\n\r\n if (!collisionRuntimeParams.myIsOnCeiling) {\r\n if ((collisionCheckParams.myTeleportMustBeOnCeiling && !isPositionCheck)\r\n || (collisionCheckParams.myCheckTransformMustBeOnCeiling && isPositionCheck)) {\r\n collisionRuntimeParams.myTeleportCanceled = true;\r\n }\r\n }\r\n\r\n if (collisionRuntimeParams.myIsOnGround) {\r\n let minAngle = null;\r\n if (!isPositionCheck) {\r\n if (collisionCheckParams.myTeleportMustBeOnIgnorableGroundAngle) {\r\n minAngle = collisionCheckParams.myGroundAngleToIgnore;\r\n }\r\n\r\n if (collisionCheckParams.myTeleportMustBeOnGroundAngle != null) {\r\n minAngle = Math.min(minAngle, collisionCheckParams.myTeleportMustBeOnGroundAngle);\r\n }\r\n } else {\r\n if (collisionCheckParams.myCheckTransformMustBeOnIgnorableGroundAngle) {\r\n minAngle = collisionCheckParams.myGroundAngleToIgnore;\r\n }\r\n\r\n if (collisionCheckParams.myCheckTransformMustBeOnGroundAngle != null) {\r\n minAngle = Math.min(minAngle, collisionCheckParams.myCheckTransformMustBeOnGroundAngle);\r\n }\r\n }\r\n\r\n if (minAngle != null && collisionRuntimeParams.myGroundAngle > minAngle + 0.0001) {\r\n collisionRuntimeParams.myTeleportCanceled = true;\r\n }\r\n }\r\n\r\n if (collisionRuntimeParams.myIsOnCeiling) {\r\n let minAngle = null;\r\n if (!isPositionCheck) {\r\n if (collisionCheckParams.myTeleportMustBeOnIgnorableCeilingAngle) {\r\n minAngle = collisionCheckParams.myCeilingAngleToIgnore;\r\n }\r\n\r\n if (collisionCheckParams.myTeleportMustBeOnCeilingAngle != null) {\r\n minAngle = Math.min(minAngle, collisionCheckParams.myTeleportMustBeOnCeilingAngle);\r\n }\r\n } else {\r\n if (collisionCheckParams.myCheckTransformMustBeOnIgnorableCeilingAngle) {\r\n minAngle = collisionCheckParams.myCeilingAngleToIgnore;\r\n }\r\n\r\n if (collisionCheckParams.myCheckTransformMustBeOnCeilingAngle != null) {\r\n minAngle = Math.min(minAngle, collisionCheckParams.myCheckTransformMustBeOnCeilingAngle);\r\n }\r\n }\r\n\r\n if (minAngle != null && collisionRuntimeParams.myCeilingAngle > minAngle + 0.0001) {\r\n collisionRuntimeParams.myTeleportCanceled = true;\r\n }\r\n }\r\n\r\n if (collisionRuntimeParams.myTeleportCanceled) {\r\n if (collisionCheckParams.myComputeGroundInfoEnabled && collisionCheckParams.myRegatherGroundInfoOnSurfaceCheckFail) {\r\n this._gatherSurfaceInfo(newFeetPosition, height, transformUp, forwardForPerceivedAngle, forwardForVertical, true, collisionCheckParams, collisionRuntimeParams);\r\n } else {\r\n collisionRuntimeParams.myRealIsOnGround = this._myPrevCollisionRuntimeParams.myRealIsOnGround;\r\n collisionRuntimeParams.myIsOnGround = this._myPrevCollisionRuntimeParams.myIsOnGround;\r\n collisionRuntimeParams.myGroundCollisionHit.copy(this._myPrevCollisionRuntimeParams.myGroundCollisionHit);\r\n collisionRuntimeParams.myGroundAngle = this._myPrevCollisionRuntimeParams.myGroundAngle;\r\n collisionRuntimeParams.myGroundPerceivedAngle = this._myPrevCollisionRuntimeParams.myGroundPerceivedAngle;\r\n collisionRuntimeParams.myGroundNormal.vec3_copy(this._myPrevCollisionRuntimeParams.myGroundNormal);\r\n collisionRuntimeParams.myGroundHitMaxAngle = this._myPrevCollisionRuntimeParams.myGroundHitMaxAngle;\r\n collisionRuntimeParams.myGroundHitMaxNormal.vec3_copy(this._myPrevCollisionRuntimeParams.myGroundHitMaxNormal);\r\n collisionRuntimeParams.myGroundDistance = this._myPrevCollisionRuntimeParams.myGroundDistance;\r\n collisionRuntimeParams.myGroundIsBaseInsideCollision = this._myPrevCollisionRuntimeParams.myGroundIsBaseInsideCollision;\r\n collisionRuntimeParams.myOnGroundDueToBasePartiallyInsideCollision = this._myPrevCollisionRuntimeParams.myOnGroundDueToBasePartiallyInsideCollision;\r\n }\r\n\r\n if (collisionCheckParams.myComputeCeilingInfoEnabled && collisionCheckParams.myRegatherCeilingInfoOnSurfaceCheckFail) {\r\n this._gatherSurfaceInfo(newFeetPosition, height, transformUp, forwardForPerceivedAngle, forwardForVertical, false, collisionCheckParams, collisionRuntimeParams);\r\n } else {\r\n collisionRuntimeParams.myRealIsOnCeiling = this._myPrevCollisionRuntimeParams.myRealIsOnCeiling;\r\n collisionRuntimeParams.myIsOnCeiling = this._myPrevCollisionRuntimeParams.myIsOnCeiling;\r\n collisionRuntimeParams.myCeilingCollisionHit.copy(this._myPrevCollisionRuntimeParams.myCeilingCollisionHit);\r\n collisionRuntimeParams.myCeilingAngle = this._myPrevCollisionRuntimeParams.myCeilingAngle;\r\n collisionRuntimeParams.myCeilingPerceivedAngle = this._myPrevCollisionRuntimeParams.myCeilingPerceivedAngle;\r\n collisionRuntimeParams.myCeilingNormal.vec3_copy(this._myPrevCollisionRuntimeParams.myCeilingNormal);\r\n collisionRuntimeParams.myCeilingHitMaxAngle = this._myPrevCollisionRuntimeParams.myCeilingHitMaxAngle;\r\n collisionRuntimeParams.myCeilingHitMaxNormal.vec3_copy(this._myPrevCollisionRuntimeParams.myCeilingHitMaxNormal);\r\n collisionRuntimeParams.myCeilingDistance = this._myPrevCollisionRuntimeParams.myCeilingDistance;\r\n collisionRuntimeParams.myCeilingIsBaseInsideCollision = this._myPrevCollisionRuntimeParams.myCeilingIsBaseInsideCollision;\r\n collisionRuntimeParams.myOnCeilingDueToBasePartiallyInsideCollision = this._myPrevCollisionRuntimeParams.myOnCeilingDueToBasePartiallyInsideCollision;\r\n }\r\n }\r\n\r\n // Regather surface if invalid else use before\r\n } else {\r\n collisionRuntimeParams.myTeleportCanceled = true;\r\n }\r\n } else {\r\n collisionRuntimeParams.myTeleportCanceled = true;\r\n }\r\n\r\n if (!isPositionCheck) {\r\n if (collisionCheckParams.myExtraTeleportCheckCallback != null) {\r\n endPosition.vec3_copy(newFeetPosition);\r\n newFeetPosition = collisionCheckParams.myExtraTeleportCheckCallback(\r\n offsetTeleportPosition, endPosition, feetPosition, transformUp, transformForward, height,\r\n collisionCheckParams, this._myPrevCollisionRuntimeParams, collisionRuntimeParams, newFeetPosition);\r\n }\r\n } else {\r\n if (collisionCheckParams.myExtraCheckTransformCheckCallback != null) {\r\n endPosition.vec3_copy(newFeetPosition);\r\n newFeetPosition = collisionCheckParams.myExtraCheckTransformCheckCallback(\r\n endPosition, feetPosition, transformUp, transformForward, height,\r\n collisionCheckParams, this._myPrevCollisionRuntimeParams, collisionRuntimeParams, newFeetPosition);\r\n }\r\n }\r\n\r\n collisionRuntimeParams.myOriginalUp = transformQuat.quat2_getUp(collisionRuntimeParams.myOriginalUp);\r\n collisionRuntimeParams.myOriginalForward = transformQuat.quat2_getForward(collisionRuntimeParams.myOriginalForward);\r\n collisionRuntimeParams.myOriginalPosition = transformQuat.quat2_getPosition(collisionRuntimeParams.myOriginalPosition);\r\n\r\n collisionRuntimeParams.myOffsetUp.vec3_copy(transformUp);\r\n collisionRuntimeParams.myTeleportForward.vec3_copy(forwardForHorizontal);\r\n\r\n collisionRuntimeParams.myOriginalHeight = collisionCheckParams.myHeight;\r\n\r\n collisionRuntimeParams.myOriginalTeleportPosition.vec3_copy(teleportPosition);\r\n\r\n if (!collisionRuntimeParams.myTeleportCanceled) {\r\n collisionRuntimeParams.myFixedTeleportPosition.vec3_copy(newFeetPosition);\r\n if (!feetPositionOffsetToOriginal.vec3_isZero(0.00001)) {\r\n collisionRuntimeParams.myFixedTeleportPosition = collisionRuntimeParams.myFixedTeleportPosition.vec3_add(feetPositionOffsetToOriginal, collisionRuntimeParams.myFixedTeleportPosition);\r\n }\r\n\r\n collisionRuntimeParams.myNewPosition.vec3_copy(collisionRuntimeParams.myFixedTeleportPosition);\r\n } else {\r\n collisionRuntimeParams.myNewPosition.vec3_copy(collisionRuntimeParams.myOriginalPosition);\r\n }\r\n\r\n collisionRuntimeParams.myIsTeleport = true;\r\n\r\n if (collisionCheckParams.myDebugEnabled && collisionCheckParams.myDebugRuntimeParamsEnabled && Globals.isDebugEnabled(this._myEngine)) {\r\n this._debugRuntimeParams(collisionRuntimeParams);\r\n }\r\n };\r\n}();", "import { vec3_create } from \"../../../../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Globals } from \"../../../../../../pp/globals.js\";\r\nimport { CollisionCheckTeleport } from \"./collision_check_teleport.js\";\r\n\r\nexport class CollisionCheckPosition extends CollisionCheckTeleport {\r\n\r\n positionCheck(allowFix, transformQuat, collisionCheckParams, collisionRuntimeParams) {\r\n if (this.isCollisionCheckDisabled() && Globals.isDebugEnabled(this._myEngine)) {\r\n this._setRuntimeParamsForPositionCheckCollisionCheckDisabled(allowFix, transformQuat, collisionCheckParams, collisionRuntimeParams);\r\n return;\r\n }\r\n\r\n this._positionCheck(allowFix, transformQuat, collisionCheckParams, collisionRuntimeParams);\r\n }\r\n\r\n _positionCheck(allowAdjustments, transformQuat, collisionCheckParams, collisionRuntimeParams) {\r\n // Implemented outside class definition\r\n }\r\n}\r\n\r\n\r\n\r\n// IMPLEMENTATION\r\n\r\nCollisionCheckPosition.prototype._positionCheck = function () {\r\n let feetPosition = vec3_create();\r\n return function _positionCheck(allowAdjustments, transformQuat, collisionCheckParams, collisionRuntimeParams) {\r\n feetPosition = transformQuat.quat2_getPosition(feetPosition);\r\n\r\n this._teleport(feetPosition, transformQuat, collisionCheckParams, collisionRuntimeParams, true);\r\n\r\n collisionRuntimeParams.myIsPositionOk = !collisionRuntimeParams.myTeleportCanceled;\r\n collisionRuntimeParams.myIsPositionCheck = true;\r\n collisionRuntimeParams.myOriginalPositionCheckPosition.vec3_copy(collisionRuntimeParams.myOriginalTeleportPosition);\r\n collisionRuntimeParams.myFixedPositionCheckPosition.vec3_copy(collisionRuntimeParams.myFixedTeleportPosition);\r\n collisionRuntimeParams.myIsPositionCheckAllowAdjustments = allowAdjustments;\r\n\r\n if (!allowAdjustments) {\r\n collisionRuntimeParams.myIsPositionOk = collisionRuntimeParams.myIsPositionOk &&\r\n collisionRuntimeParams.myOriginalPositionCheckPosition.vec_equals(collisionRuntimeParams.myFixedPositionCheckPosition, 0.00001);\r\n }\r\n\r\n collisionRuntimeParams.myOriginalTeleportPosition.vec3_zero();\r\n collisionRuntimeParams.myFixedTeleportPosition.vec3_zero();\r\n collisionRuntimeParams.myTeleportCanceled = false;\r\n collisionRuntimeParams.myIsTeleport = false;\r\n };\r\n}();", "import { CollisionCheckPosition } from \"./collision_check_position.js\";\r\n\r\nexport class CollisionCheck extends CollisionCheckPosition {\r\n\r\n}", "import { quat_create, vec3_create } from \"../../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Globals } from \"../../../../pp/globals.js\";\r\nimport { CharacterCollisionCheckType, CharacterCollisionResults } from \"./character_collision_results.js\";\r\nimport { CollisionCheck } from \"./legacy/collision_check/collision_check.js\";\r\nimport { CollisionCheckParams, CollisionRuntimeParams } from \"./legacy/collision_check/collision_params.js\";\r\n\r\nlet _myCollisionChecks = new WeakMap();\r\n\r\nexport function getCollisionCheck(engine = Globals.getMainEngine()) {\r\n return _myCollisionChecks.get(engine);\r\n}\r\n\r\nexport function setCollisionCheck(collisionCheck, engine = Globals.getMainEngine()) {\r\n _myCollisionChecks.set(engine, collisionCheck);\r\n}\r\n\r\nexport function isCollisionCheckDisabled(engine = Globals.getMainEngine()) {\r\n let collisionCheck = CollisionCheckBridge.getCollisionCheck(engine);\r\n\r\n if (collisionCheck != null) {\r\n return collisionCheck.isCollisionCheckDisabled();\r\n }\r\n\r\n return false;\r\n}\r\n\r\nexport function setCollisionCheckDisabled(collisionCheckDisabled, engine = Globals.getMainEngine()) {\r\n let collisionCheck = CollisionCheckBridge.getCollisionCheck(engine);\r\n\r\n if (collisionCheck != null) {\r\n collisionCheck.setCollisionCheckDisabled(collisionCheckDisabled);\r\n }\r\n}\r\n\r\nexport function initBridge(engine = Globals.getMainEngine()) {\r\n if (!_myCollisionChecks.has(engine)) {\r\n CollisionCheckBridge.setCollisionCheck(new CollisionCheck(engine), engine);\r\n }\r\n}\r\n\r\nexport let checkMovement = function () {\r\n let collisionCheckParams = new CollisionCheckParams();\r\n let collisionRuntimeParams = new CollisionRuntimeParams();\r\n return function checkMovement(movement, currentTransformQuat, characterColliderSetup, prevCharacterCollisionResults, outCharacterCollisionResults = new CharacterCollisionResults(), engine = Globals.getMainEngine()) {\r\n CollisionCheckBridge.convertCharacterColliderSetupToCollisionCheckParams(characterColliderSetup, collisionCheckParams);\r\n CollisionCheckBridge.convertCharacterCollisionResultsToCollisionRuntimeParams(prevCharacterCollisionResults, collisionRuntimeParams);\r\n CollisionCheckBridge.getCollisionCheck(engine).move(movement, currentTransformQuat, collisionCheckParams, collisionRuntimeParams);\r\n CollisionCheckBridge.convertCollisionRuntimeParamsToCharacterCollisionResults(collisionRuntimeParams, currentTransformQuat, outCharacterCollisionResults);\r\n };\r\n}();\r\n\r\nexport let checkTeleportToTransform = function () {\r\n let teleportPosition = vec3_create();\r\n let collisionCheckParams = new CollisionCheckParams();\r\n let collisionRuntimeParams = new CollisionRuntimeParams();\r\n return function checkTeleportToTransform(teleportTransformQuat, currentTransformQuat, characterColliderSetup, prevCharacterCollisionResults, outCharacterCollisionResults = new CharacterCollisionResults(), engine = Globals.getMainEngine()) {\r\n CollisionCheckBridge.convertCharacterColliderSetupToCollisionCheckParams(characterColliderSetup, collisionCheckParams);\r\n CollisionCheckBridge.convertCharacterCollisionResultsToCollisionRuntimeParams(prevCharacterCollisionResults, collisionRuntimeParams);\r\n teleportPosition = teleportTransformQuat.quat2_getPosition(teleportPosition);\r\n CollisionCheckBridge.getCollisionCheck(engine).teleport(teleportPosition, teleportTransformQuat, collisionCheckParams, collisionRuntimeParams);\r\n CollisionCheckBridge.convertCollisionRuntimeParamsToCharacterCollisionResults(collisionRuntimeParams, currentTransformQuat, outCharacterCollisionResults);\r\n };\r\n}();\r\n\r\nexport let checkTransform = function () {\r\n let collisionCheckParams = new CollisionCheckParams();\r\n let collisionRuntimeParams = new CollisionRuntimeParams();\r\n return function checkTransform(checkTransformQuat, characterColliderSetup, prevCharacterCollisionResults, outCharacterCollisionResults = new CharacterCollisionResults(), engine = Globals.getMainEngine()) {\r\n CollisionCheckBridge.convertCharacterColliderSetupToCollisionCheckParams(characterColliderSetup, collisionCheckParams);\r\n CollisionCheckBridge.convertCharacterCollisionResultsToCollisionRuntimeParams(prevCharacterCollisionResults, collisionRuntimeParams);\r\n CollisionCheckBridge.getCollisionCheck(engine).positionCheck(true, checkTransformQuat, collisionCheckParams, collisionRuntimeParams);\r\n CollisionCheckBridge.convertCollisionRuntimeParamsToCharacterCollisionResults(collisionRuntimeParams, checkTransformQuat, outCharacterCollisionResults);\r\n };\r\n}();\r\n\r\nexport let updateGroundInfo = function () {\r\n let collisionCheckParams = new CollisionCheckParams();\r\n let collisionRuntimeParams = new CollisionRuntimeParams();\r\n return function updateGroundInfo(currentTransformQuat, characterColliderSetup, prevCharacterCollisionResults, outCharacterCollisionResults = new CharacterCollisionResults(), engine = Globals.getMainEngine()) {\r\n CollisionCheckBridge.convertCharacterColliderSetupToCollisionCheckParams(characterColliderSetup, collisionCheckParams);\r\n CollisionCheckBridge.convertCharacterCollisionResultsToCollisionRuntimeParams(prevCharacterCollisionResults, collisionRuntimeParams);\r\n collisionCheckParams.myComputeCeilingInfoEnabled = false;\r\n CollisionCheckBridge.getCollisionCheck(engine).updateSurfaceInfo(currentTransformQuat, collisionCheckParams, collisionRuntimeParams);\r\n CollisionCheckBridge.convertCollisionRuntimeParamsToCharacterCollisionResults(collisionRuntimeParams, currentTransformQuat, outCharacterCollisionResults);\r\n };\r\n}();\r\n\r\nexport let updateCeilingInfo = function () {\r\n let collisionCheckParams = new CollisionCheckParams();\r\n let collisionRuntimeParams = new CollisionRuntimeParams();\r\n return function updateCeilingInfo(currentTransformQuat, characterColliderSetup, prevCharacterCollisionResults, outCharacterCollisionResults = new CharacterCollisionResults(), engine = Globals.getMainEngine()) {\r\n CollisionCheckBridge.convertCharacterColliderSetupToCollisionCheckParams(characterColliderSetup, collisionCheckParams);\r\n CollisionCheckBridge.convertCharacterCollisionResultsToCollisionRuntimeParams(prevCharacterCollisionResults, collisionRuntimeParams);\r\n collisionCheckParams.myComputeGroundInfoEnabled = false;\r\n CollisionCheckBridge.getCollisionCheck(engine).updateSurfaceInfo(currentTransformQuat, collisionCheckParams, collisionRuntimeParams);\r\n CollisionCheckBridge.convertCollisionRuntimeParamsToCharacterCollisionResults(collisionRuntimeParams, currentTransformQuat, outCharacterCollisionResults);\r\n };\r\n}();\r\n\r\nexport function convertCharacterCollisionResultsToCollisionRuntimeParams(characterCollisionResults, outCollisionRuntimeParams = new CollisionRuntimeParams()) {\r\n outCollisionRuntimeParams.reset();\r\n\r\n characterCollisionResults.myTransformResults.myInitialTransformQuat.quat2_getPosition(outCollisionRuntimeParams.myOriginalPosition);\r\n characterCollisionResults.myTransformResults.myFinalTransformQuat.quat2_getPosition(outCollisionRuntimeParams.myNewPosition);\r\n\r\n characterCollisionResults.myTransformResults.myInitialTransformQuat.quat2_getForward(outCollisionRuntimeParams.myOriginalForward);\r\n characterCollisionResults.myTransformResults.myInitialTransformQuat.quat2_getUp(outCollisionRuntimeParams.myOriginalUp);\r\n\r\n // Ok: outCollisionRuntimeParams.myOriginalHeight = characterCollisionResults.myOriginalHeight;\r\n\r\n outCollisionRuntimeParams.myOriginalMovement.vec3_copy(characterCollisionResults.myMovementResults.myInitialMovement);\r\n outCollisionRuntimeParams.myFixedMovement.vec3_copy(characterCollisionResults.myMovementResults.myFinalMovement);\r\n\r\n outCollisionRuntimeParams.myLastValidOriginalHorizontalMovement.vec3_copy(characterCollisionResults.myInternalResults.myLastRelevantInitialHorizontalMovement);\r\n outCollisionRuntimeParams.myLastValidOriginalVerticalMovement.vec3_copy(characterCollisionResults.myInternalResults.myLastRelevantInitialVerticalMovement);\r\n\r\n outCollisionRuntimeParams.myLastValidEndHorizontalMovement.vec3_copy(characterCollisionResults.myInternalResults.myLastRelevantFinalHorizontalMovement);\r\n outCollisionRuntimeParams.myLastValidEndVerticalMovement.vec3_copy(characterCollisionResults.myInternalResults.myLastRelevantFinalVerticalMovement);\r\n\r\n outCollisionRuntimeParams.myLastValidSurfaceAdjustedHorizontalMovement.vec3_copy(characterCollisionResults.myInternalResults.myLastRelevantAdjustedInitialHorizontalMovement);\r\n outCollisionRuntimeParams.myLastValidSurfaceAdjustedVerticalMovement.vec3_copy(characterCollisionResults.myInternalResults.myLastRelevantAdjustedInitialVerticalMovement);\r\n\r\n outCollisionRuntimeParams.myIsOnGround = characterCollisionResults.myGroundInfo.myOnSurface;\r\n outCollisionRuntimeParams.myGroundCollisionHit.copy(characterCollisionResults.myGroundInfo.mySurfaceReferenceCollisionHit);\r\n outCollisionRuntimeParams.myGroundAngle = characterCollisionResults.myGroundInfo.mySurfaceAngle;\r\n outCollisionRuntimeParams.myGroundPerceivedAngle = characterCollisionResults.myGroundInfo.mySurfacePerceivedAngle;\r\n outCollisionRuntimeParams.myGroundNormal.vec3_copy(characterCollisionResults.myGroundInfo.mySurfaceNormal);\r\n outCollisionRuntimeParams.myGroundHitMaxAngle = characterCollisionResults.myGroundInfo.mySurfaceHitMaxAngle;\r\n outCollisionRuntimeParams.myGroundHitMaxNormal.vec3_copy(characterCollisionResults.myGroundInfo.mySurfaceHitMaxNormal);\r\n outCollisionRuntimeParams.myGroundDistance = characterCollisionResults.myGroundInfo.mySurfaceDistance;\r\n outCollisionRuntimeParams.myGroundIsBaseInsideCollision = characterCollisionResults.myGroundInfo.myBaseInsideCollision;\r\n outCollisionRuntimeParams.myOnGroundDueToBasePartiallyInsideCollision = characterCollisionResults.myGroundInfo.myOnSurfaceDueToBasePartiallyInsideCollision;\r\n\r\n outCollisionRuntimeParams.myIsOnCeiling = characterCollisionResults.myCeilingInfo.myOnSurface;\r\n outCollisionRuntimeParams.myCeilingCollisionHit.copy(characterCollisionResults.myCeilingInfo.mySurfaceReferenceCollisionHit);\r\n outCollisionRuntimeParams.myCeilingAngle = characterCollisionResults.myCeilingInfo.mySurfaceAngle;\r\n outCollisionRuntimeParams.myCeilingPerceivedAngle = characterCollisionResults.myCeilingInfo.mySurfacePerceivedAngle;\r\n outCollisionRuntimeParams.myCeilingNormal.vec3_copy(characterCollisionResults.myCeilingInfo.mySurfaceNormal);\r\n outCollisionRuntimeParams.myCeilingHitMaxAngle = characterCollisionResults.myCeilingInfo.mySurfaceHitMaxAngle;\r\n outCollisionRuntimeParams.myCeilingHitMaxNormal.vec3_copy(characterCollisionResults.myCeilingInfo.mySurfaceHitMaxNormal);\r\n outCollisionRuntimeParams.myCeilingDistance = characterCollisionResults.myCeilingInfo.mySurfaceDistance;\r\n outCollisionRuntimeParams.myCeilingIsBaseInsideCollision = characterCollisionResults.myCeilingInfo.myBaseInsideCollision;\r\n outCollisionRuntimeParams.myOnCeilingDueToBasePartiallyInsideCollision = characterCollisionResults.myCeilingInfo.myOnSurfaceDueToBasePartiallyInsideCollision;\r\n\r\n outCollisionRuntimeParams.myHorizontalMovementCanceled = characterCollisionResults.myHorizontalMovementResults.myMovementFailed;\r\n outCollisionRuntimeParams.myIsCollidingHorizontally = characterCollisionResults.myHorizontalMovementResults.myMovementCollided;\r\n outCollisionRuntimeParams.myHorizontalCollisionHit.copy(characterCollisionResults.myHorizontalMovementResults.myReferenceCollisionHit);\r\n\r\n outCollisionRuntimeParams.myVerticalMovementCanceled = characterCollisionResults.myVerticalMovementResults.myMovementFailed;\r\n outCollisionRuntimeParams.myIsCollidingVertically = characterCollisionResults.myVerticalMovementResults.myMovementCollided;\r\n outCollisionRuntimeParams.myVerticalCollisionHit.copy(characterCollisionResults.myVerticalMovementResults.myReferenceCollisionHit);\r\n\r\n outCollisionRuntimeParams.myHasSnappedOnGround = characterCollisionResults.myGroundResults.myHasSnappedOnSurface;\r\n outCollisionRuntimeParams.myHasSnappedOnCeiling = characterCollisionResults.myCeilingResults.myHasSnappedOnSurface;\r\n outCollisionRuntimeParams.myHasPoppedOutGround = characterCollisionResults.myGroundResults.myHasPoppedOutSurface;\r\n outCollisionRuntimeParams.myHasPoppedOutCeiling = characterCollisionResults.myCeilingResults.myHasPoppedOutSurface;\r\n\r\n outCollisionRuntimeParams.myHorizontalMovementHasAdjustedVerticalMovementOverGroundPerceivedAngleDownhill = characterCollisionResults.myGroundResults.myHasHorizontalMovementAdjustedVerticalMovementOverSurfacePerceivedAngleDownhill;\r\n outCollisionRuntimeParams.myHorizontalMovementHasAdjustedVerticalMovementOverGroundPerceivedAngleUphill = characterCollisionResults.myGroundResults.myHasHorizontalMovementAdjustedVerticalMovementOverSurfacePerceivedAngleUphill;\r\n outCollisionRuntimeParams.myVerticalMovementHasAdjustedHorizontalMovementOverGroundAngleDownhill = characterCollisionResults.myGroundResults.myHasVerticalMovementAdjustedHorizontalMovementOverSurfaceAngleDownhill;\r\n\r\n outCollisionRuntimeParams.myHorizontalMovementHasAdjustedVerticalMovementOverCeilingPerceivedAngleDownhill = characterCollisionResults.myCeilingResults.myHasHorizontalMovementAdjustedVerticalMovementOverSurfacePerceivedAngleDownhill;\r\n outCollisionRuntimeParams.myHorizontalMovementHasAdjustedVerticalMovementOverCeilingPerceivedAngleUphill = characterCollisionResults.myCeilingResults.myHasHorizontalMovementAdjustedVerticalMovementOverSurfacePerceivedAngleUphill;\r\n outCollisionRuntimeParams.myVerticalMovementHasAdjustedHorizontalMovementOverCeilingAngleDownhill = characterCollisionResults.myCeilingResults.myHasVerticalMovementAdjustedHorizontalMovementOverSurfaceAngleDownhill;\r\n\r\n // Ok: outCollisionRuntimeParams.myHasReducedVerticalMovement = characterCollisionResults.myVerticalMovementResults.myHasMovementBeenReduced;\r\n\r\n outCollisionRuntimeParams.myIsSliding = characterCollisionResults.myWallSlideResults.myHasSlid;\r\n outCollisionRuntimeParams.mySlidingMovementAngle = characterCollisionResults.myWallSlideResults.mySlideMovementAngle;\r\n outCollisionRuntimeParams.mySlidingCollisionAngle = characterCollisionResults.myWallSlideResults.mySlideMovementWallAngle;\r\n outCollisionRuntimeParams.mySlidingWallNormal.vec3_copy(characterCollisionResults.myWallSlideResults.myWallNormal);\r\n\r\n outCollisionRuntimeParams.myIsSlidingIntoOppositeDirection = characterCollisionResults.myInternalResults.myHasWallSlidTowardOppositeDirection;\r\n outCollisionRuntimeParams.myIsSlidingFlickerPrevented = characterCollisionResults.myInternalResults.myLastRelevantWallSlideFlickerPrevented;\r\n outCollisionRuntimeParams.mySlidingFlickerPreventionCheckAnywayCounter = characterCollisionResults.myInternalResults.myWallSlideFlickerPreventionForceCheckCounter;\r\n outCollisionRuntimeParams.mySliding90DegreesSign = characterCollisionResults.myInternalResults.myWallSlide90DegreesDirectionSign;\r\n outCollisionRuntimeParams.mySlidingRecompute90DegreesSign = characterCollisionResults.myInternalResults.myWallSlide90DegreesRecomputeDirectionSign;\r\n outCollisionRuntimeParams.myLastValidIsSliding = characterCollisionResults.myInternalResults.myLastRelevantHasWallSlid;\r\n outCollisionRuntimeParams.mySlidingPreviousHorizontalMovement.vec3_copy(characterCollisionResults.myInternalResults.myLastRelevantFinalHorizontalMovement);\r\n\r\n outCollisionRuntimeParams.myOriginalTeleportPosition.vec3_copy(characterCollisionResults.myTeleportResults.myInitialTeleportTransformQuat);\r\n outCollisionRuntimeParams.myFixedTeleportPosition.vec3_copy(characterCollisionResults.myTeleportResults.myFinalTeleportTransformQuat);\r\n outCollisionRuntimeParams.myTeleportCanceled = characterCollisionResults.myTeleportResults.myTeleportFailed;\r\n\r\n outCollisionRuntimeParams.myIsPositionOk = characterCollisionResults.myCheckTransformResults.myCheckTransformFailed;\r\n characterCollisionResults.myCheckTransformResults.myInitialCheckTransformQuat.quat2_getPosition(outCollisionRuntimeParams.myOriginalPositionCheckPosition);\r\n characterCollisionResults.myCheckTransformResults.myFinalCheckTransformQuat.quat2_getPosition(outCollisionRuntimeParams.myFixedPositionCheckPosition);\r\n\r\n outCollisionRuntimeParams.myIsTeleport = characterCollisionResults.myCheckType == CharacterCollisionCheckType.CHECK_TELEPORT;\r\n outCollisionRuntimeParams.myIsMove = characterCollisionResults.myCheckType == CharacterCollisionCheckType.CHECK_MOVEMENT;\r\n outCollisionRuntimeParams.myIsPositionCheck = characterCollisionResults.myCheckType == CharacterCollisionCheckType.CHECK_TRANSFORM;\r\n\r\n outCollisionRuntimeParams.mySplitMovementSteps = characterCollisionResults.mySplitMovementResults.myStepsToPerform;\r\n outCollisionRuntimeParams.mySplitMovementStepsPerformed = characterCollisionResults.mySplitMovementResults.myStepsPerformed;\r\n outCollisionRuntimeParams.mySplitMovementStop = characterCollisionResults.mySplitMovementResults.myMovementInterrupted;\r\n outCollisionRuntimeParams.mySplitMovementReduced = characterCollisionResults.mySplitMovementResults.myMovementReduced;\r\n outCollisionRuntimeParams.mySplitMovementLastStepLongerThanMaxLength = characterCollisionResults.mySplitMovementResults.myLastStepLongerThanMaxStepLength;\r\n outCollisionRuntimeParams.mySplitMovementMovementChecked.vec3_copy(characterCollisionResults.mySplitMovementResults.myMovementChecked);\r\n\r\n return outCollisionRuntimeParams;\r\n}\r\n\r\nexport let convertCollisionRuntimeParamsToCharacterCollisionResults = function () {\r\n let rotationQuat = quat_create();\r\n return function convertCollisionRuntimeParamsToCharacterCollisionResults(collisionRuntimeParams, currentTransformQuat, outCharacterCollisionResults = new CharacterCollisionResults()) {\r\n outCharacterCollisionResults.reset();\r\n\r\n if (collisionRuntimeParams.myIsMove) {\r\n outCharacterCollisionResults.myCheckType = CharacterCollisionCheckType.CHECK_MOVEMENT;\r\n } else if (collisionRuntimeParams.myIsTeleport) {\r\n outCharacterCollisionResults.myCheckType = CharacterCollisionCheckType.CHECK_TELEPORT;\r\n } else if (collisionRuntimeParams.myIsPositionCheck) {\r\n outCharacterCollisionResults.myCheckType = CharacterCollisionCheckType.CHECK_TRANSFORM;\r\n }\r\n\r\n rotationQuat.quat_setForward(collisionRuntimeParams.myOriginalForward, collisionRuntimeParams.myOriginalUp);\r\n outCharacterCollisionResults.myTransformResults.myInitialTransformQuat.quat2_setPositionRotationQuat(collisionRuntimeParams.myOriginalPosition, rotationQuat);\r\n outCharacterCollisionResults.myTransformResults.myFinalTransformQuat.quat2_setPositionRotationQuat(collisionRuntimeParams.myNewPosition, rotationQuat);\r\n\r\n outCharacterCollisionResults.myMovementResults.myInitialMovement.vec3_copy(collisionRuntimeParams.myOriginalMovement);\r\n outCharacterCollisionResults.myMovementResults.myFinalMovement.vec3_copy(collisionRuntimeParams.myFixedMovement);\r\n outCharacterCollisionResults.myMovementResults.myMovementFailed = collisionRuntimeParams.myHorizontalMovementCanceled && collisionRuntimeParams.myVerticalMovementCanceled;\r\n outCharacterCollisionResults.myMovementResults.myMovementCollided = collisionRuntimeParams.myIsCollidingHorizontally || collisionRuntimeParams.myIsCollidingVertically;\r\n if (collisionRuntimeParams.myIsCollidingHorizontally) {\r\n outCharacterCollisionResults.myMovementResults.myReferenceCollisionHit.copy(collisionRuntimeParams.myHorizontalCollisionHit);\r\n } else if (collisionRuntimeParams.myIsCollidingVertically) {\r\n outCharacterCollisionResults.myMovementResults.myReferenceCollisionHit.copy(collisionRuntimeParams.myVerticalCollisionHit);\r\n }\r\n\r\n outCharacterCollisionResults.myHorizontalMovementResults.myMovementFailed = collisionRuntimeParams.myHorizontalMovementCanceled;\r\n outCharacterCollisionResults.myHorizontalMovementResults.myMovementCollided = collisionRuntimeParams.myIsCollidingHorizontally;\r\n outCharacterCollisionResults.myHorizontalMovementResults.myReferenceCollisionHit.copy(collisionRuntimeParams.myHorizontalCollisionHit);\r\n outCharacterCollisionResults.myHorizontalMovementResults.myInitialMovement = collisionRuntimeParams.myOriginalMovement.vec3_removeComponentAlongAxis(collisionRuntimeParams.myOffsetUp, outCharacterCollisionResults.myHorizontalMovementResults.myInitialMovement);\r\n outCharacterCollisionResults.myHorizontalMovementResults.myFinalMovement = collisionRuntimeParams.myFixedMovement.vec3_removeComponentAlongAxis(collisionRuntimeParams.myOffsetUp, outCharacterCollisionResults.myHorizontalMovementResults.myFinalMovement);\r\n\r\n outCharacterCollisionResults.myVerticalMovementResults.myMovementFailed = collisionRuntimeParams.myVerticalMovementCanceled;\r\n outCharacterCollisionResults.myVerticalMovementResults.myMovementCollided = collisionRuntimeParams.myIsCollidingVertically;\r\n outCharacterCollisionResults.myVerticalMovementResults.myReferenceCollisionHit.copy(collisionRuntimeParams.myVerticalCollisionHit);\r\n outCharacterCollisionResults.myVerticalMovementResults.myInitialMovement = collisionRuntimeParams.myOriginalMovement.vec3_componentAlongAxis(collisionRuntimeParams.myOffsetUp, outCharacterCollisionResults.myVerticalMovementResults.myInitialMovement);\r\n outCharacterCollisionResults.myVerticalMovementResults.myFinalMovement = collisionRuntimeParams.myFixedMovement.vec3_componentAlongAxis(collisionRuntimeParams.myOffsetUp, outCharacterCollisionResults.myVerticalMovementResults.myFinalMovement);\r\n\r\n outCharacterCollisionResults.myTeleportResults.myInitialTeleportTransformQuat.quat2_copy(outCharacterCollisionResults.myTransformResults.myInitialTransformQuat);\r\n outCharacterCollisionResults.myTeleportResults.myInitialTeleportTransformQuat.quat2_setPosition(collisionRuntimeParams.myOriginalTeleportPosition);\r\n outCharacterCollisionResults.myTeleportResults.myFinalTeleportTransformQuat.quat2_copy(outCharacterCollisionResults.myTransformResults.myFinalTransformQuat);\r\n outCharacterCollisionResults.myTeleportResults.myFinalTeleportTransformQuat.quat2_setPosition(collisionRuntimeParams.myFixedTeleportPosition);\r\n outCharacterCollisionResults.myTeleportResults.myTeleportFailed = collisionRuntimeParams.myTeleportCanceled;\r\n\r\n outCharacterCollisionResults.myCheckTransformResults.myInitialCheckTransformQuat.quat2_copy(outCharacterCollisionResults.myTransformResults.myInitialTransformQuat);\r\n outCharacterCollisionResults.myCheckTransformResults.myInitialCheckTransformQuat.quat2_setPosition(collisionRuntimeParams.myOriginalPositionCheckPosition);\r\n outCharacterCollisionResults.myCheckTransformResults.myFinalCheckTransformQuat.quat2_copy(outCharacterCollisionResults.myTransformResults.myFinalTransformQuat);\r\n outCharacterCollisionResults.myCheckTransformResults.myFinalCheckTransformQuat.quat2_setPosition(collisionRuntimeParams.myFixedPositionCheckPosition);\r\n outCharacterCollisionResults.myCheckTransformResults.myCheckTransformFailed = !collisionRuntimeParams.myIsPositionOk;\r\n\r\n outCharacterCollisionResults.myWallSlideResults.myHasSlid = collisionRuntimeParams.myIsSliding;\r\n outCharacterCollisionResults.myWallSlideResults.mySlideMovementAngle = collisionRuntimeParams.mySlidingMovementAngle;\r\n outCharacterCollisionResults.myWallSlideResults.mySlideMovementWallAngle = collisionRuntimeParams.mySlidingCollisionAngle;\r\n outCharacterCollisionResults.myWallSlideResults.myWallNormal.vec3_copy(collisionRuntimeParams.mySlidingWallNormal);\r\n\r\n outCharacterCollisionResults.myGroundInfo.myOnSurface = collisionRuntimeParams.myIsOnGround;\r\n outCharacterCollisionResults.myGroundInfo.mySurfaceReferenceCollisionHit.copy(collisionRuntimeParams.myGroundCollisionHit);\r\n outCharacterCollisionResults.myGroundInfo.mySurfaceAngle = collisionRuntimeParams.myGroundAngle;\r\n outCharacterCollisionResults.myGroundInfo.mySurfacePerceivedAngle = collisionRuntimeParams.myGroundPerceivedAngle;\r\n outCharacterCollisionResults.myGroundInfo.mySurfaceNormal.vec3_copy(collisionRuntimeParams.myGroundNormal);\r\n outCharacterCollisionResults.myGroundInfo.mySurfaceHitMaxAngle = collisionRuntimeParams.myGroundHitMaxAngle;\r\n outCharacterCollisionResults.myGroundInfo.mySurfaceHitMaxNormal.vec3_copy(collisionRuntimeParams.myGroundHitMaxNormal);\r\n outCharacterCollisionResults.myGroundInfo.mySurfaceDistance = collisionRuntimeParams.myGroundDistance;\r\n outCharacterCollisionResults.myGroundInfo.myBaseInsideCollision = collisionRuntimeParams.myGroundIsBaseInsideCollision;\r\n\r\n outCharacterCollisionResults.myCeilingInfo.myOnSurface = collisionRuntimeParams.myIsOnCeiling;\r\n outCharacterCollisionResults.myCeilingInfo.mySurfaceReferenceCollisionHit.copy(collisionRuntimeParams.myCeilingCollisionHit);\r\n outCharacterCollisionResults.myCeilingInfo.mySurfaceAngle = collisionRuntimeParams.myCeilingAngle;\r\n outCharacterCollisionResults.myCeilingInfo.mySurfacePerceivedAngle = collisionRuntimeParams.myCeilingPerceivedAngle;\r\n outCharacterCollisionResults.myCeilingInfo.mySurfaceNormal.vec3_copy(collisionRuntimeParams.myCeilingNormal);\r\n outCharacterCollisionResults.myCeilingInfo.mySurfaceHitMaxAngle = collisionRuntimeParams.myCeilingHitMaxAngle;\r\n outCharacterCollisionResults.myCeilingInfo.mySurfaceHitMaxNormal.vec3_copy(collisionRuntimeParams.myCeilingHitMaxNormal);\r\n outCharacterCollisionResults.myCeilingInfo.mySurfaceDistance = collisionRuntimeParams.myCeilingDistance;\r\n outCharacterCollisionResults.myCeilingInfo.myBaseInsideCollision = collisionRuntimeParams.myCeilingIsBaseInsideCollision;\r\n\r\n outCharacterCollisionResults.myGroundResults.myHasSnappedOnSurface = collisionRuntimeParams.myHasSnappedOnGround;\r\n outCharacterCollisionResults.myGroundResults.myHasPoppedOutSurface = collisionRuntimeParams.myHasPoppedOutGround;\r\n outCharacterCollisionResults.myCeilingResults.myHasSnappedOnSurface = collisionRuntimeParams.myHasSnappedOnCeiling;\r\n outCharacterCollisionResults.myCeilingResults.myHasPoppedOutSurface = collisionRuntimeParams.myHasPoppedOutCeiling;\r\n\r\n outCharacterCollisionResults.myGroundResults.myHasHorizontalMovementAdjustedVerticalMovementOverSurfacePerceivedAngleDownhill = collisionRuntimeParams.myHorizontalMovementHasAdjustedVerticalMovementOverGroundPerceivedAngleDownhill;\r\n outCharacterCollisionResults.myGroundResults.myHasHorizontalMovementAdjustedVerticalMovementOverSurfacePerceivedAngleUphill = collisionRuntimeParams.myHorizontalMovementHasAdjustedVerticalMovementOverGroundPerceivedAngleUphill;\r\n outCharacterCollisionResults.myGroundResults.myHasVerticalMovementAdjustedHorizontalMovementOverSurfaceAngleDownhill = collisionRuntimeParams.myVerticalMovementHasAdjustedHorizontalMovementOverGroundAngleDownhill;\r\n\r\n outCharacterCollisionResults.myCeilingResults.myHasHorizontalMovementAdjustedVerticalMovementOverSurfacePerceivedAngleDownhill = collisionRuntimeParams.myHorizontalMovementHasAdjustedVerticalMovementOverCeilingPerceivedAngleDownhill;\r\n outCharacterCollisionResults.myCeilingResults.myHasHorizontalMovementAdjustedVerticalMovementOverSurfacePerceivedAngleUphill = collisionRuntimeParams.myHorizontalMovementHasAdjustedVerticalMovementOverCeilingPerceivedAngleUphill;\r\n outCharacterCollisionResults.myCeilingResults.myHasVerticalMovementAdjustedHorizontalMovementOverSurfaceAngleDownhill = collisionRuntimeParams.myVerticalMovementHasAdjustedHorizontalMovementOverCeilingAngleDownhill;\r\n\r\n outCharacterCollisionResults.mySplitMovementResults.myStepsToPerform = collisionRuntimeParams.mySplitMovementSteps;\r\n outCharacterCollisionResults.mySplitMovementResults.myStepsPerformed = collisionRuntimeParams.mySplitMovementStepsPerformed;\r\n outCharacterCollisionResults.mySplitMovementResults.myMovementInterrupted = collisionRuntimeParams.mySplitMovementStop;\r\n outCharacterCollisionResults.mySplitMovementResults.myMovementReduced = collisionRuntimeParams.mySplitMovementReduced;\r\n outCharacterCollisionResults.mySplitMovementResults.myLastStepLongerThanMaxStepLength = collisionRuntimeParams.mySplitMovementLastStepLongerThanMaxLength;\r\n outCharacterCollisionResults.mySplitMovementResults.myMovementChecked.vec3_copy(collisionRuntimeParams.mySplitMovementMovementChecked);\r\n\r\n outCharacterCollisionResults.myInternalResults.myLastRelevantInitialHorizontalMovement.vec3_copy(collisionRuntimeParams.myLastValidOriginalHorizontalMovement);\r\n outCharacterCollisionResults.myInternalResults.myLastRelevantFinalHorizontalMovement.vec3_copy(collisionRuntimeParams.myLastValidEndHorizontalMovement);\r\n outCharacterCollisionResults.myInternalResults.myLastRelevantInitialVerticalMovement.vec3_copy(collisionRuntimeParams.myLastValidOriginalVerticalMovement);\r\n outCharacterCollisionResults.myInternalResults.myLastRelevantFinalVerticalMovement.vec3_copy(collisionRuntimeParams.myLastValidEndVerticalMovement);\r\n\r\n outCharacterCollisionResults.myInternalResults.myLastRelevantAdjustedInitialHorizontalMovement.vec3_copy(collisionRuntimeParams.myLastValidSurfaceAdjustedHorizontalMovement);\r\n outCharacterCollisionResults.myInternalResults.myLastRelevantAdjustedInitialVerticalMovement.vec3_copy(collisionRuntimeParams.myLastValidSurfaceAdjustedVerticalMovement);\r\n\r\n outCharacterCollisionResults.myInternalResults.myLastRelevantHasWallSlid = collisionRuntimeParams.myLastValidIsSliding;\r\n outCharacterCollisionResults.myInternalResults.myHasWallSlidTowardOppositeDirection = collisionRuntimeParams.myIsSlidingIntoOppositeDirection;\r\n outCharacterCollisionResults.myInternalResults.myLastRelevantWallSlideFlickerPrevented = collisionRuntimeParams.myIsSlidingFlickerPrevented;\r\n outCharacterCollisionResults.myInternalResults.myWallSlideFlickerPreventionForceCheckCounter = collisionRuntimeParams.mySlidingFlickerPreventionCheckAnywayCounter;\r\n outCharacterCollisionResults.myInternalResults.myWallSlide90DegreesDirectionSign = collisionRuntimeParams.mySliding90DegreesSign;\r\n outCharacterCollisionResults.myInternalResults.myWallSlide90DegreesRecomputeDirectionSign = collisionRuntimeParams.mySlidingRecompute90DegreesSign;\r\n\r\n outCharacterCollisionResults.myTransformResults.myInitialTransformQuat.quat2_copy(currentTransformQuat);\r\n\r\n return outCharacterCollisionResults;\r\n };\r\n}();\r\n\r\nexport let convertCharacterColliderSetupToCollisionCheckParams = function () {\r\n return function convertCharacterColliderSetupToCollisionCheckParams(characterColliderSetup, outCollisionCheckParams = new CollisionCheckParams()) {\r\n outCollisionCheckParams.myHeight = characterColliderSetup.myHeight;\r\n\r\n outCollisionCheckParams.myRadius = characterColliderSetup.myHorizontalCheckParams.myHorizontalCheckConeRadius;\r\n outCollisionCheckParams.myDistanceFromFeetToIgnore = characterColliderSetup.myHorizontalCheckParams.myHorizontalCheckFeetDistanceToIgnore;\r\n outCollisionCheckParams.myDistanceFromHeadToIgnore = characterColliderSetup.myHorizontalCheckParams.myHorizontalCheckHeadDistanceToIgnore;\r\n\r\n outCollisionCheckParams.myHorizontalMovementCheckEnabled = characterColliderSetup.myHorizontalCheckParams.myHorizontalMovementCheckEnabled;\r\n\r\n outCollisionCheckParams.myHorizontalMovementStepEnabled = characterColliderSetup.myHorizontalCheckParams.myHorizontalMovementCheckSplitMovementEnabled;\r\n outCollisionCheckParams.myHorizontalMovementStepMaxLength = characterColliderSetup.myHorizontalCheckParams.myHorizontalMovementCheckSplitMovementMaxStepLength == null ? 0 : characterColliderSetup.myHorizontalCheckParams.myHorizontalMovementCheckSplitMovementMaxStepLength;\r\n\r\n outCollisionCheckParams.myHorizontalMovementRadialStepAmount = characterColliderSetup.myHorizontalCheckParams.myHorizontalMovementCheckRadialSteps;\r\n\r\n outCollisionCheckParams.myHorizontalMovementCheckDiagonalOutward = characterColliderSetup.myHorizontalCheckParams.myHorizontalMovementHorizontalDiagonalOutwardCheckEnabled;\r\n outCollisionCheckParams.myHorizontalMovementCheckDiagonalInward = characterColliderSetup.myHorizontalCheckParams.myHorizontalMovementHorizontalDiagonalInwardCheckEnabled;\r\n outCollisionCheckParams.myHorizontalMovementCheckStraight = characterColliderSetup.myHorizontalCheckParams.myHorizontalMovementHorizontalStraightCheckEnabled;\r\n outCollisionCheckParams.myHorizontalMovementCheckHorizontalBorder = characterColliderSetup.myHorizontalCheckParams.myHorizontalMovementHorizontalRadialCheckEnabled;\r\n outCollisionCheckParams.myHorizontalMovementCheckVerticalStraight = characterColliderSetup.myHorizontalCheckParams.myHorizontalMovementVerticalStraightCheckEnabled;\r\n outCollisionCheckParams.myHorizontalMovementCheckVerticalDiagonalUpwardOutward = characterColliderSetup.myHorizontalCheckParams.myHorizontalMovementVerticalDiagonalOutwardUpwardCheckEnabled;\r\n outCollisionCheckParams.myHorizontalMovementCheckVerticalDiagonalUpwardInward = characterColliderSetup.myHorizontalCheckParams.myHorizontalMovementVerticalDiagonalInwardUpwardCheckEnabled;\r\n outCollisionCheckParams.myHorizontalMovementCheckVerticalDiagonalDownwardOutward = characterColliderSetup.myHorizontalCheckParams.myHorizontalMovementVerticalDiagonalOutwardDownwardCheckEnabled;\r\n outCollisionCheckParams.myHorizontalMovementCheckVerticalDiagonalDownwardInward = characterColliderSetup.myHorizontalCheckParams.myHorizontalMovementVerticalDiagonalInwardDownwardCheckEnabled;\r\n outCollisionCheckParams.myHorizontalMovementCheckVerticalStraightDiagonalUpward = characterColliderSetup.myHorizontalCheckParams.myHorizontalMovementVerticalStraightDiagonalUpwardCheckEnabled;\r\n outCollisionCheckParams.myHorizontalMovementCheckVerticalStraightDiagonalDownward = characterColliderSetup.myHorizontalCheckParams.myHorizontalMovementVerticalStraightDiagonalDownwardCheckEnabled;\r\n outCollisionCheckParams.myHorizontalMovementCheckVerticalHorizontalBorderDiagonalOutward = characterColliderSetup.myHorizontalCheckParams.myHorizontalMovementVerticalRadialDiagonalOutwardCheckEnabled;\r\n outCollisionCheckParams.myHorizontalMovementCheckVerticalHorizontalBorderDiagonalInward = characterColliderSetup.myHorizontalCheckParams.myHorizontalMovementVerticalRadialDiagonalInwardCheckEnabled;\r\n\r\n outCollisionCheckParams.myHorizontalMovementHorizontalStraightCentralCheckEnabled = characterColliderSetup.myHorizontalCheckParams.myHorizontalMovementHorizontalStraightCentralCheckEnabled;\r\n outCollisionCheckParams.myHorizontalMovementVerticalStraightCentralCheckEnabled = characterColliderSetup.myHorizontalCheckParams.myHorizontalMovementVerticalStraightCentralCheckEnabled;\r\n outCollisionCheckParams.myHorizontalMovementVerticalStraightDiagonalUpwardCentralCheckEnabled = characterColliderSetup.myHorizontalCheckParams.myHorizontalMovementVerticalStraightDiagonalUpwardCentralCheckEnabled;\r\n outCollisionCheckParams.myHorizontalMovementVerticalStraightDiagonalDownwardCentralCheckEnabled = characterColliderSetup.myHorizontalCheckParams.myHorizontalMovementVerticalStraightDiagonalDownwardCentralCheckEnabled;\r\n\r\n outCollisionCheckParams.myHorizontalPositionCheckEnabled = characterColliderSetup.myHorizontalCheckParams.myHorizontalPositionCheckEnabled;\r\n\r\n outCollisionCheckParams.myHalfConeAngle = characterColliderSetup.myHorizontalCheckParams.myHorizontalCheckConeHalfAngle;\r\n outCollisionCheckParams.myHalfConeSliceAmount = characterColliderSetup.myHorizontalCheckParams.myHorizontalPositionCheckConeHalfSlices;\r\n outCollisionCheckParams.myCheckConeBorder = characterColliderSetup.myHorizontalCheckParams.myHorizontalPositionHorizontalBorderCheckEnabled;\r\n outCollisionCheckParams.myCheckConeRay = characterColliderSetup.myHorizontalCheckParams.myHorizontalPositionHorizontalRadialCheckEnabled;\r\n outCollisionCheckParams.myHorizontalPositionCheckVerticalIgnoreHitsInsideCollision = characterColliderSetup.myHorizontalCheckParams.myHorizontalPositionVerticalCheckIgnoreHitsInsideCollision;\r\n outCollisionCheckParams.myHorizontalPositionCheckVerticalDirectionType = characterColliderSetup.myHorizontalCheckParams.myHorizontalPositionVerticalCheckDirection;\r\n\r\n outCollisionCheckParams.myCheckHeight = characterColliderSetup.myHorizontalCheckParams.myHorizontalHeightCheckEnabled;\r\n\r\n outCollisionCheckParams.myCheckHeightVerticalMovement = characterColliderSetup.myHorizontalCheckParams.myHorizontalMovementHeightVerticalCheckEnabled;\r\n outCollisionCheckParams.myCheckHeightVerticalPosition = characterColliderSetup.myHorizontalCheckParams.myHorizontalPositionHeightVerticalCheckEnabled;\r\n outCollisionCheckParams.myCheckHeightTopMovement = characterColliderSetup.myHorizontalCheckParams.myHorizontalMovementHeightHorizontalCheckEnabled;\r\n outCollisionCheckParams.myCheckHeightTopPosition = characterColliderSetup.myHorizontalCheckParams.myHorizontalPositionHeightHorizontalCheckEnabled;\r\n outCollisionCheckParams.myCheckHeightConeOnCollision = characterColliderSetup.myHorizontalCheckParams.myHorizontalPositionVerticalCheckPerformHorizontalCheckOnHit;\r\n outCollisionCheckParams.myCheckHeightConeOnCollisionKeepHit = characterColliderSetup.myHorizontalCheckParams.myHorizontalPositionVerticalCheckPerformHorizontalCheckOnHitKeepVerticalHitIfNoHorizontalHit;\r\n\r\n outCollisionCheckParams.myHeightCheckStepAmountMovement = characterColliderSetup.myHorizontalCheckParams.myHorizontalMovementHeightCheckSteps;\r\n outCollisionCheckParams.myHeightCheckStepAmountPosition = characterColliderSetup.myHorizontalCheckParams.myHorizontalPositionHeightCheckSteps;\r\n outCollisionCheckParams.myCheckVerticalStraight = characterColliderSetup.myHorizontalCheckParams.myHorizontalPositionVerticalStraightCheckEnabled;\r\n outCollisionCheckParams.myCheckVerticalDiagonalRayOutward = characterColliderSetup.myHorizontalCheckParams.myHorizontalPositionVerticalRadialDiagonalOutwardCheckEnabled;\r\n outCollisionCheckParams.myCheckVerticalDiagonalRayInward = characterColliderSetup.myHorizontalCheckParams.myHorizontalPositionVerticalRadialDiagonalInwardCheckEnabled;\r\n outCollisionCheckParams.myCheckVerticalDiagonalBorderOutward = characterColliderSetup.myHorizontalCheckParams.myHorizontalPositionVerticalBorderDiagonalOutwardCheckEnabled;\r\n outCollisionCheckParams.myCheckVerticalDiagonalBorderInward = characterColliderSetup.myHorizontalCheckParams.myHorizontalPositionVerticalBorderDiagonalInwardCheckEnabled;\r\n outCollisionCheckParams.myCheckVerticalDiagonalBorderRayOutward = characterColliderSetup.myHorizontalCheckParams.myHorizontalPositionVerticalRadialBorderDiagonalOutwardCheckEnabled;\r\n outCollisionCheckParams.myCheckVerticalDiagonalBorderRayInward = characterColliderSetup.myHorizontalCheckParams.myHorizontalPositionVerticalRadialBorderDiagonalInwardCheckEnabled;\r\n outCollisionCheckParams.myCheckVerticalSearchFartherVerticalHit = characterColliderSetup.myHorizontalCheckParams.myHorizontalPositionVerticalCheckGetFarthestHit;\r\n\r\n outCollisionCheckParams.myCheckHorizontalFixedForwardEnabled = characterColliderSetup.myHorizontalCheckParams.myHorizontalCheckFixedForwardEnabled;\r\n outCollisionCheckParams.myCheckHorizontalFixedForward.vec3_copy(characterColliderSetup.myHorizontalCheckParams.myHorizontalCheckFixedForward);\r\n\r\n outCollisionCheckParams.myVerticalMovementCheckEnabled = characterColliderSetup.myVerticalCheckParams.myVerticalMovementCheckEnabled;\r\n outCollisionCheckParams.myVerticalPositionCheckEnabled = characterColliderSetup.myVerticalCheckParams.myVerticalPositionCheckEnabled;\r\n outCollisionCheckParams.myFeetRadius = characterColliderSetup.myVerticalCheckParams.myVerticalCheckCircumferenceRadius;\r\n\r\n outCollisionCheckParams.myAdjustVerticalMovementWithGroundAngleDownhill = characterColliderSetup.myGroundParams.myHorizontalMovementAdjustVerticalMovementOverSurfacePerceivedAngleDownhill;\r\n outCollisionCheckParams.myAdjustVerticalMovementWithGroundAngleUphill = characterColliderSetup.myGroundParams.myHorizontalMovementAdjustVerticalMovementOverSurfacePerceivedAngleUphill;\r\n outCollisionCheckParams.myAdjustVerticalMovementWithGroundAngleDownhillMaxAngle = characterColliderSetup.myGroundParams.myHorizontalMovementAdjustVerticalMovementOverSurfacePerceivedAngleDownhillMaxSurfaceAngle;\r\n outCollisionCheckParams.myAdjustVerticalMovementWithGroundAngleUphillMaxAngle = characterColliderSetup.myGroundParams.myHorizontalMovementAdjustVerticalMovementOverSurfacePerceivedAngleUphillMaxSurfaceAngle;\r\n outCollisionCheckParams.myAdjustVerticalMovementWithGroundAngleDownhillMaxPerceivedAngle = characterColliderSetup.myGroundParams.myHorizontalMovementAdjustVerticalMovementOverSurfacePerceivedAngleDownhillMaxSurfacePerceivedAngle;\r\n outCollisionCheckParams.myAdjustVerticalMovementWithGroundAngleUphillMaxPerceivedAngle = characterColliderSetup.myGroundParams.myHorizontalMovementAdjustVerticalMovementOverSurfacePerceivedAngleUphillMaxSurfacePerceivedAngle;\r\n outCollisionCheckParams.myAdjustHorizontalMovementWithGroundAngleDownhill = characterColliderSetup.myGroundParams.myVerticalMovementAdjustHorizontalMovementOverSurfaceAngleDownhill;\r\n outCollisionCheckParams.myAdjustHorizontalMovementWithGroundAngleDownhillMinAngle = characterColliderSetup.myGroundParams.myVerticalMovementAdjustHorizontalMovementOverSurfaceAngleDownhillMinSurfaceAngle;\r\n\r\n outCollisionCheckParams.myAdjustVerticalMovementWithCeilingAngleDownhill = characterColliderSetup.myCeilingParams.myHorizontalMovementAdjustVerticalMovementOverSurfacePerceivedAngleDownhill;\r\n outCollisionCheckParams.myAdjustVerticalMovementWithCeilingAngleUphill = characterColliderSetup.myCeilingParams.myHorizontalMovementAdjustVerticalMovementOverSurfacePerceivedAngleUphill;\r\n outCollisionCheckParams.myAdjustVerticalMovementWithCeilingAngleDownhillMaxAngle = characterColliderSetup.myCeilingParams.myHorizontalMovementAdjustVerticalMovementOverSurfacePerceivedAngleDownhillMaxSurfaceAngle;\r\n outCollisionCheckParams.myAdjustVerticalMovementWithCeilingAngleUphillMaxAngle = characterColliderSetup.myCeilingParams.myHorizontalMovementAdjustVerticalMovementOverSurfacePerceivedAngleUphillMaxSurfaceAngle;\r\n outCollisionCheckParams.myAdjustVerticalMovementWithCeilingAngleDownhillMaxPerceivedAngle = characterColliderSetup.myCeilingParams.myHorizontalMovementAdjustVerticalMovementOverSurfacePerceivedAngleDownhillMaxSurfacePerceivedAngle;\r\n outCollisionCheckParams.myAdjustVerticalMovementWithCeilingAngleUphillMaxPerceivedAngle = characterColliderSetup.myCeilingParams.myHorizontalMovementAdjustVerticalMovementOverSurfacePerceivedAngleUphillMaxSurfacePerceivedAngle;\r\n outCollisionCheckParams.myAdjustHorizontalMovementWithCeilingAngleDownhill = characterColliderSetup.myCeilingParams.myVerticalMovementAdjustHorizontalMovementOverSurfaceAngleDownhill;\r\n outCollisionCheckParams.myAdjustHorizontalMovementWithCeilingAngleDownhillMinAngle = characterColliderSetup.myCeilingParams.myVerticalMovementAdjustHorizontalMovementOverSurfaceAngleDownhillMinSurfaceAngle;\r\n\r\n outCollisionCheckParams.myCheckVerticalFixedForwardEnabled = characterColliderSetup.myVerticalCheckParams.myVerticalCheckFixedForwardEnabled;\r\n outCollisionCheckParams.myCheckVerticalFixedForward.vec3_copy(characterColliderSetup.myVerticalCheckParams.myVerticalCheckFixedForward);\r\n outCollisionCheckParams.myCheckVerticalBothDirection = characterColliderSetup.myVerticalCheckParams.myVerticalMovementCheckPerformCheckOnBothSides;\r\n outCollisionCheckParams.myCheckVerticalPositionBothDirection = characterColliderSetup.myVerticalCheckParams.myVerticalPositionCheckPerformCheckOnBothSides;\r\n\r\n outCollisionCheckParams.myVerticalMovementReduceEnabled = characterColliderSetup.myVerticalCheckParams.myVerticalMovementCheckReductionEnabled;\r\n\r\n outCollisionCheckParams.myGroundCircumferenceAddCenter = characterColliderSetup.myVerticalCheckParams.myVerticalCheckCircumferenceCentralCheckEnabled;\r\n outCollisionCheckParams.myGroundCircumferenceSliceAmount = characterColliderSetup.myVerticalCheckParams.myVerticalCheckCircumferenceSlices;\r\n outCollisionCheckParams.myGroundCircumferenceStepAmount = characterColliderSetup.myVerticalCheckParams.myVerticalCheckCircumferenceRadialSteps;\r\n outCollisionCheckParams.myGroundCircumferenceRotationPerStep = characterColliderSetup.myVerticalCheckParams.myVerticalCheckCircumferenceRotationPerRadialStep;\r\n outCollisionCheckParams.myVerticalAllowHitInsideCollisionIfOneOk = characterColliderSetup.myVerticalCheckParams.myVerticalCheckAllowHitsInsideCollisionIfOneValid;\r\n\r\n outCollisionCheckParams.myHorizontalBlockLayerFlags.copy(characterColliderSetup.myHorizontalCheckParams.myHorizontalCheckBlockLayerFlags);\r\n outCollisionCheckParams.myVerticalBlockLayerFlags.copy(characterColliderSetup.myVerticalCheckParams.myVerticalCheckBlockLayerFlags);\r\n outCollisionCheckParams.myHorizontalObjectsToIgnore.pp_copy(characterColliderSetup.myHorizontalCheckParams.myHorizontalCheckObjectsToIgnore);\r\n outCollisionCheckParams.myVerticalObjectsToIgnore.pp_copy(characterColliderSetup.myVerticalCheckParams.myVerticalCheckObjectsToIgnore);\r\n outCollisionCheckParams.myHorizontalBlockColliderType = characterColliderSetup.myHorizontalCheckParams.myHorizontalBlockColliderType;\r\n outCollisionCheckParams.myVerticalBlockColliderType = characterColliderSetup.myVerticalCheckParams.myVerticalBlockColliderType;\r\n\r\n outCollisionCheckParams.mySnapOnGroundEnabled = characterColliderSetup.myGroundParams.mySurfaceSnapEnabled;\r\n outCollisionCheckParams.mySnapOnGroundExtraDistance = characterColliderSetup.myGroundParams.mySurfaceSnapMaxDistance;\r\n outCollisionCheckParams.mySnapOnCeilingEnabled = characterColliderSetup.myCeilingParams.mySurfaceSnapEnabled;\r\n outCollisionCheckParams.mySnapOnCeilingExtraDistance = characterColliderSetup.myCeilingParams.mySurfaceSnapMaxDistance;\r\n\r\n outCollisionCheckParams.myGroundPopOutEnabled = characterColliderSetup.myGroundParams.mySurfacePopOutEnabled;\r\n outCollisionCheckParams.myGroundPopOutExtraDistance = characterColliderSetup.myGroundParams.mySurfacePopOutMaxDistance;\r\n outCollisionCheckParams.myCeilingPopOutEnabled = characterColliderSetup.myCeilingParams.mySurfacePopOutEnabled;\r\n outCollisionCheckParams.myCeilingPopOutExtraDistance = characterColliderSetup.myCeilingParams.mySurfacePopOutMaxDistance;\r\n\r\n outCollisionCheckParams.myGroundAngleToIgnore = characterColliderSetup.myGroundParams.mySurfaceAngleToIgnore;\r\n outCollisionCheckParams.myGroundAngleToIgnoreWithPerceivedAngle = characterColliderSetup.myGroundParams.mySurfaceAngleToIgnoreWithSurfacePerceivedAngle;\r\n outCollisionCheckParams.myCeilingAngleToIgnore = characterColliderSetup.myCeilingParams.mySurfaceAngleToIgnore;\r\n outCollisionCheckParams.myCeilingAngleToIgnoreWithPerceivedAngle = characterColliderSetup.myCeilingParams.mySurfaceAngleToIgnoreWithSurfacePerceivedAngle;\r\n\r\n outCollisionCheckParams.myHorizontalMovementGroundAngleIgnoreHeight = characterColliderSetup.myGroundParams.myHorizontalMovementSurfaceAngleToIgnoreMaxVerticalDistance;\r\n outCollisionCheckParams.myHorizontalMovementCeilingAngleIgnoreHeight = characterColliderSetup.myCeilingParams.myHorizontalMovementSurfaceAngleToIgnoreMaxVerticalDistance;\r\n outCollisionCheckParams.myHorizontalPositionGroundAngleIgnoreHeight = characterColliderSetup.myGroundParams.myHorizontalPositionSurfaceAngleToIgnoreMaxVerticalDistance;\r\n outCollisionCheckParams.myHorizontalPositionCeilingAngleIgnoreHeight = characterColliderSetup.myCeilingParams.myHorizontalPositionSurfaceAngleToIgnoreMaxVerticalDistance;\r\n\r\n outCollisionCheckParams.myHorizontalMovementGroundAngleIgnoreMaxMovementLeft = characterColliderSetup.myGroundParams.myHorizontalMovementSurfaceAngleToIgnoreMaxHorizontalMovementLeft;\r\n outCollisionCheckParams.myHorizontalMovementCeilingAngleIgnoreMaxMovementLeft = characterColliderSetup.myCeilingParams.myHorizontalMovementSurfaceAngleToIgnoreMaxHorizontalMovementLeft;\r\n\r\n outCollisionCheckParams.myComputeGroundInfoEnabled = characterColliderSetup.myGroundParams.myCollectSurfaceInfo;\r\n outCollisionCheckParams.myComputeCeilingInfoEnabled = characterColliderSetup.myCeilingParams.myCollectSurfaceInfo;\r\n outCollisionCheckParams.myDistanceToBeOnGround = characterColliderSetup.myGroundParams.myOnSurfaceMaxOutsideDistance;\r\n outCollisionCheckParams.myDistanceToComputeGroundInfo = characterColliderSetup.myGroundParams.myCollectSurfaceNormalMaxOutsideDistance;\r\n outCollisionCheckParams.myDistanceToBeOnCeiling = characterColliderSetup.myCeilingParams.myOnSurfaceMaxOutsideDistance;\r\n outCollisionCheckParams.myDistanceToComputeCeilingInfo = characterColliderSetup.myCeilingParams.myCollectSurfaceNormalMaxOutsideDistance;\r\n outCollisionCheckParams.myVerticalFixToBeOnGround = characterColliderSetup.myGroundParams.myOnSurfaceMaxInsideDistance;\r\n outCollisionCheckParams.myVerticalFixToComputeGroundInfo = characterColliderSetup.myGroundParams.myCollectSurfaceNormalMaxInsideDistance;\r\n outCollisionCheckParams.myVerticalFixToBeOnCeiling = characterColliderSetup.myCeilingParams.myOnSurfaceMaxInsideDistance;\r\n outCollisionCheckParams.myVerticalFixToComputeCeilingInfo = characterColliderSetup.myCeilingParams.myCollectSurfaceNormalMaxInsideDistance;\r\n\r\n outCollisionCheckParams.myGroundIsBaseInsideCollisionCheckEnabled = characterColliderSetup.myGroundParams.myBaseInsideCollisionCheckEnabled;\r\n outCollisionCheckParams.myCeilingIsBaseInsideCollisionCheckEnabled = characterColliderSetup.myCeilingParams.myBaseInsideCollisionCheckEnabled;\r\n outCollisionCheckParams.myIsOnGroundIfInsideHit = characterColliderSetup.myGroundParams.myOnSurfaceIfBaseInsideCollision;\r\n outCollisionCheckParams.myIsOnCeilingIfInsideHit = characterColliderSetup.myCeilingParams.myOnSurfaceIfBaseInsideCollision;\r\n\r\n outCollisionCheckParams.myFindGroundDistanceMaxOutsideDistance = characterColliderSetup.myGroundParams.myCollectSurfaceDistanceOutsideDistance;\r\n outCollisionCheckParams.myFindGroundDistanceMaxInsideDistance = characterColliderSetup.myGroundParams.myCollectSurfaceDistanceInsideDistance;\r\n outCollisionCheckParams.myFindCeilingDistanceMaxOutsideDistance = characterColliderSetup.myCeilingParams.myCollectSurfaceDistanceOutsideDistance;\r\n outCollisionCheckParams.myFindCeilingDistanceMaxInsideDistance = characterColliderSetup.myCeilingParams.myCollectSurfaceDistanceInsideDistance;\r\n\r\n outCollisionCheckParams.myCollectGroundCollisionHitOutsideDistance = characterColliderSetup.myGroundParams.myCollectSurfaceCollisionHitOutsideDistance;\r\n outCollisionCheckParams.myCollectGroundCollisionHitInsideDistance = characterColliderSetup.myGroundParams.myCollectSurfaceCollisionHitInsideDistance;\r\n outCollisionCheckParams.myCollectCeilingCollisionHitOutsideDistance = characterColliderSetup.myCeilingParams.myCollectSurfaceCollisionHitOutsideDistance;\r\n outCollisionCheckParams.myCollectCeilingCollisionHitInsideDistance = characterColliderSetup.myCeilingParams.myCollectSurfaceCollisionHitInsideDistance;\r\n\r\n outCollisionCheckParams.myAllowGroundSteepFix = characterColliderSetup.myGroundParams.myHorizontalMovementAllowExitAttemptWhenOnNotIgnorableSurfacePerceivedAngle;\r\n outCollisionCheckParams.myAllowCeilingSteepFix = characterColliderSetup.myCeilingParams.myHorizontalMovementAllowExitAttemptWhenOnNotIgnorableSurfacePerceivedAngle;\r\n\r\n outCollisionCheckParams.myMustStayOnGround = characterColliderSetup.myGroundParams.myMovementMustStayOnSurface;\r\n outCollisionCheckParams.myMustStayOnCeiling = characterColliderSetup.myCeilingParams.myMovementMustStayOnSurface;\r\n outCollisionCheckParams.myRegatherGroundInfoOnSurfaceCheckFail = characterColliderSetup.myGroundParams.myRecollectSurfaceInfoOnSurfaceCheckFailed;\r\n outCollisionCheckParams.myRegatherCeilingInfoOnSurfaceCheckFail = characterColliderSetup.myCeilingParams.myRecollectSurfaceInfoOnSurfaceCheckFailed;\r\n outCollisionCheckParams.myMustStayBelowIgnorableGroundAngleDownhill = characterColliderSetup.myGroundParams.myMovementMustStayOnIgnorableSurfaceAngleDownhill;\r\n outCollisionCheckParams.myMustStayBelowIgnorableCeilingAngleDownhill = characterColliderSetup.myCeilingParams.myMovementMustStayOnIgnorableSurfaceAngleDownhill;\r\n outCollisionCheckParams.myMustStayBelowGroundAngleDownhill = characterColliderSetup.myGroundParams.myMovementMustStayOnSurfaceAngleDownhill;\r\n outCollisionCheckParams.myMustStayBelowCeilingAngleDownhill = characterColliderSetup.myCeilingParams.myMovementMustStayOnSurfaceAngleDownhill;\r\n outCollisionCheckParams.myMovementMustStayOnGroundHitAngle = characterColliderSetup.myGroundParams.myMovementMustStayOnSurfaceHitMaxAngle;\r\n outCollisionCheckParams.myMovementMustStayOnCeilingHitAngle = characterColliderSetup.myCeilingParams.myMovementMustStayOnSurfaceHitMaxAngle;\r\n\r\n outCollisionCheckParams.myTeleportMustBeOnIgnorableGroundAngle = characterColliderSetup.myGroundParams.myTeleportMustBeOnIgnorableSurfaceAngle;\r\n outCollisionCheckParams.myCheckTransformMustBeOnIgnorableGroundAngle = characterColliderSetup.myGroundParams.myCheckTransformMustBeOnIgnorableSurfaceAngle;\r\n outCollisionCheckParams.myTeleportMustBeOnIgnorableCeilingAngle = characterColliderSetup.myCeilingParams.myTeleportMustBeOnIgnorableSurfaceAngle;\r\n outCollisionCheckParams.myCheckTransformMustBeOnIgnorableCeilingAngle = characterColliderSetup.myCeilingParams.myCheckTransformMustBeOnIgnorableSurfaceAngle;\r\n\r\n outCollisionCheckParams.myTeleportMustBeOnGroundAngle = characterColliderSetup.myGroundParams.myTeleportMustBeOnSurfaceAngle;\r\n outCollisionCheckParams.myCheckTransformMustBeOnGroundAngle = characterColliderSetup.myGroundParams.myCheckTransformMustBeOnSurfaceAngle;\r\n outCollisionCheckParams.myTeleportMustBeOnCeilingAngle = characterColliderSetup.myCeilingParams.myTeleportMustBeOnSurfaceAngle;\r\n outCollisionCheckParams.myCheckTransformMustBeOnCeilingAngle = characterColliderSetup.myCeilingParams.myCheckTransformMustBeOnSurfaceAngle;\r\n\r\n outCollisionCheckParams.myTeleportMustBeOnGround = characterColliderSetup.myGroundParams.myTeleportMustBeOnSurface;\r\n outCollisionCheckParams.myCheckTransformMustBeOnGround = characterColliderSetup.myGroundParams.myCheckTransformMustBeOnSurface;\r\n outCollisionCheckParams.myTeleportMustBeOnCeiling = characterColliderSetup.myCeilingParams.myTeleportMustBeOnSurface;\r\n outCollisionCheckParams.myCheckTransformMustBeOnCeiling = characterColliderSetup.myCeilingParams.myCheckTransformMustBeOnSurface;\r\n\r\n outCollisionCheckParams.mySlidingEnabled = characterColliderSetup.myWallSlideParams.myWallSlideEnabled;\r\n outCollisionCheckParams.mySlidingHorizontalMovementCheckBetterNormal = characterColliderSetup.myHorizontalCheckParams.myHorizontalMovementCheckGetBetterReferenceHit;\r\n outCollisionCheckParams.mySlidingMaxAttempts = characterColliderSetup.myWallSlideParams.myWallSlideMaxAttempts;\r\n outCollisionCheckParams.mySlidingCheckBothDirections = characterColliderSetup.myWallSlideParams.myCheckBothWallSlideDirections;\r\n outCollisionCheckParams.mySlidingFlickeringPreventionType = characterColliderSetup.myWallSlideParams.myWallSlideFlickerPreventionMode;\r\n outCollisionCheckParams.mySlidingFlickeringPreventionCheckOnlyIfAlreadySliding = characterColliderSetup.myWallSlideParams.myWallSlideFlickerPreventionCheckOnlyIfAlreadySliding;\r\n outCollisionCheckParams.mySlidingFlickerPreventionCheckAnywayCounter = characterColliderSetup.myWallSlideParams.myWallSlideFlickerPreventionForceCheckCounter;\r\n outCollisionCheckParams.mySlidingAdjustSign90Degrees = characterColliderSetup.myWallSlideParams.my90DegreesWallSlideAdjustDirectionSign;\r\n\r\n outCollisionCheckParams.mySplitMovementEnabled = characterColliderSetup.mySplitMovementParams.mySplitMovementEnabled;\r\n outCollisionCheckParams.mySplitMovementMaxLength = characterColliderSetup.mySplitMovementParams.mySplitMovementMaxStepLength == null ? 0 : characterColliderSetup.mySplitMovementParams.mySplitMovementMaxStepLength;\r\n outCollisionCheckParams.mySplitMovementMaxLengthEnabled = characterColliderSetup.mySplitMovementParams.mySplitMovementMaxStepLength != null;\r\n outCollisionCheckParams.mySplitMovementMaxLengthLastStepCanBeLonger = characterColliderSetup.mySplitMovementParams.mySplitMovementLastStepCanBeLongerThanMaxStepLength;\r\n outCollisionCheckParams.mySplitMovementMaxSteps = characterColliderSetup.mySplitMovementParams.mySplitMovementMaxSteps == null ? 0 : characterColliderSetup.mySplitMovementParams.mySplitMovementMaxSteps;\r\n outCollisionCheckParams.mySplitMovementMaxStepsEnabled = characterColliderSetup.mySplitMovementParams.mySplitMovementMaxSteps != null;\r\n outCollisionCheckParams.mySplitMovementMinLength = characterColliderSetup.mySplitMovementParams.mySplitMovementMinStepLength == null ? 0 : characterColliderSetup.mySplitMovementParams.mySplitMovementMinStepLength;\r\n outCollisionCheckParams.mySplitMovementMinLengthEnabled = characterColliderSetup.mySplitMovementParams.mySplitMovementMinStepLength != null;\r\n outCollisionCheckParams.mySplitMovementStopWhenHorizontalMovementCanceled = characterColliderSetup.mySplitMovementParams.mySplitMovementStopOnHorizontalMovementFailed;\r\n outCollisionCheckParams.mySplitMovementStopAndFailIfMovementWouldBeReduced = characterColliderSetup.mySplitMovementParams.mySplitMovementStopAndFailIfMovementWouldBeReduced;\r\n outCollisionCheckParams.mySplitMovementStopWhenVerticalMovementCanceled = characterColliderSetup.mySplitMovementParams.mySplitMovementStopOnVerticalMovementFailed;\r\n outCollisionCheckParams.mySplitMovementStopWhenVerticalMovementReduced = characterColliderSetup.mySplitMovementParams.mySplitMovementStopOnVerticalMovementReduced;\r\n outCollisionCheckParams.mySplitMovementStopCallback = null;\r\n outCollisionCheckParams.mySplitMovementStopReturnPrevious = characterColliderSetup.mySplitMovementParams.mySplitMovementStopReturnPreviousResults;\r\n\r\n outCollisionCheckParams.myPositionOffsetLocal.vec3_copy(characterColliderSetup.myAdditionalParams.myPositionOffsetLocal);\r\n outCollisionCheckParams.myRotationOffsetLocalQuat.quat_copy(characterColliderSetup.myAdditionalParams.myRotationOffsetLocalQuat);\r\n\r\n outCollisionCheckParams.myDebugEnabled = characterColliderSetup.myDebugParams.myVisualDebugEnabled;\r\n\r\n outCollisionCheckParams.myDebugHorizontalMovementEnabled = characterColliderSetup.myDebugParams.myVisualDebugHorizontalMovementCheckEnabled;\r\n outCollisionCheckParams.myDebugHorizontalPositionEnabled = characterColliderSetup.myDebugParams.myVisualDebugHorizontalPositionCheckEnabled;\r\n outCollisionCheckParams.myDebugVerticalMovementEnabled = characterColliderSetup.myDebugParams.myVisualDebugVerticalMovementCheckEnabled;\r\n outCollisionCheckParams.myDebugVerticalPositionEnabled = characterColliderSetup.myDebugParams.myVisualDebugVerticalPositionCheckEnabled;\r\n outCollisionCheckParams.myDebugSlidingEnabled = characterColliderSetup.myDebugParams.myVisualDebugSlideEnabled;\r\n\r\n outCollisionCheckParams.myDebugGroundInfoEnabled = characterColliderSetup.myDebugParams.myVisualDebugGroundInfoEnabled;\r\n outCollisionCheckParams.myDebugCeilingInfoEnabled = characterColliderSetup.myDebugParams.myVisualDebugGroundInfoEnabled;\r\n outCollisionCheckParams.myDebugRuntimeParamsEnabled = characterColliderSetup.myDebugParams.myVisualDebugResultsEnabled;\r\n outCollisionCheckParams.myDebugMovementEnabled = characterColliderSetup.myDebugParams.myVisualDebugMovementEnabled;\r\n\r\n return outCollisionCheckParams;\r\n };\r\n}();\r\n\r\nexport let CollisionCheckBridge = {\r\n getCollisionCheck,\r\n setCollisionCheck,\r\n isCollisionCheckDisabled,\r\n setCollisionCheckDisabled,\r\n initBridge,\r\n checkMovement,\r\n checkTeleportToTransform,\r\n checkTransform,\r\n updateGroundInfo,\r\n updateCeilingInfo,\r\n convertCharacterCollisionResultsToCollisionRuntimeParams,\r\n convertCollisionRuntimeParamsToCharacterCollisionResults,\r\n convertCharacterColliderSetupToCollisionCheckParams\r\n};", "import { quat2_create } from \"../../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Globals } from \"../../../../pp/globals.js\";\r\nimport { CharacterCollisionResults } from \"./character_collision_results.js\";\r\nimport { CollisionCheckBridge } from \"./collision_check_bridge.js\";\r\n\r\nexport class CharacterCollisionSystem {\r\n\r\n constructor(engine = Globals.getMainEngine()) {\r\n this._myLastCheckRaycastsPerformed = 0;\r\n this._myCurrentFrameRaycastsPerformed = 0;\r\n this._myMaxFrameRaycastsPerformed = 0;\r\n\r\n this.myEngine = engine;\r\n\r\n CollisionCheckBridge.initBridge(this.myEngine);\r\n }\r\n\r\n update(dt) {\r\n this._myMaxFrameRaycastsPerformed = Math.max(this._myCurrentFrameRaycastsPerformed, this._myMaxFrameRaycastsPerformed);\r\n this._myCurrentFrameRaycastsPerformed = 0;\r\n CollisionCheckBridge.getCollisionCheck(this.myEngine)._myTotalRaycasts = 0;\r\n }\r\n\r\n checkMovement(movement, currentTransformQuat, characterColliderSetup, prevCharacterCollisionResults, outCharacterCollisionResults = new CharacterCollisionResults()) {\r\n CollisionCheckBridge.checkMovement(movement, currentTransformQuat, characterColliderSetup, prevCharacterCollisionResults, outCharacterCollisionResults, this.myEngine);\r\n\r\n this._myLastCheckRaycastsPerformed = CollisionCheckBridge.getCollisionCheck(this.myEngine)._myTotalRaycasts - this._myCurrentFrameRaycastsPerformed;\r\n this._myCurrentFrameRaycastsPerformed = CollisionCheckBridge.getCollisionCheck(this.myEngine)._myTotalRaycasts;\r\n this._myMaxFrameRaycastsPerformed = Math.max(this._myCurrentFrameRaycastsPerformed, this._myMaxFrameRaycastsPerformed);\r\n outCharacterCollisionResults.myDebugResults._myRaycastsPerformed = this._myLastCheckRaycastsPerformed;\r\n }\r\n\r\n checkTeleportToPosition(teleportPosition, currentTransformQuat, characterColliderSetup, prevCharacterCollisionResults, outCharacterCollisionResults = new CharacterCollisionResults()) {\r\n // Implemented outside class definition\r\n }\r\n\r\n checkTeleportToTransform(teleportTransformQuat, currentTransformQuat, characterColliderSetup, prevCharacterCollisionResults, outCharacterCollisionResults = new CharacterCollisionResults()) {\r\n CollisionCheckBridge.checkTeleportToTransform(teleportTransformQuat, currentTransformQuat, characterColliderSetup, prevCharacterCollisionResults, outCharacterCollisionResults, this.myEngine);\r\n\r\n this._myLastCheckRaycastsPerformed = CollisionCheckBridge.getCollisionCheck(this.myEngine)._myTotalRaycasts - this._myCurrentFrameRaycastsPerformed;\r\n this._myCurrentFrameRaycastsPerformed = CollisionCheckBridge.getCollisionCheck(this.myEngine)._myTotalRaycasts;\r\n this._myMaxFrameRaycastsPerformed = Math.max(this._myCurrentFrameRaycastsPerformed, this._myMaxFrameRaycastsPerformed);\r\n outCharacterCollisionResults.myDebugResults._myRaycastsPerformed = this._myLastCheckRaycastsPerformed;\r\n }\r\n\r\n checkTransform(checkTransformQuat, characterColliderSetup, prevCharacterCollisionResults, outCharacterCollisionResults = new CharacterCollisionResults()) {\r\n CollisionCheckBridge.checkTransform(checkTransformQuat, characterColliderSetup, prevCharacterCollisionResults, outCharacterCollisionResults, this.myEngine);\r\n\r\n this._myLastCheckRaycastsPerformed = CollisionCheckBridge.getCollisionCheck(this.myEngine)._myTotalRaycasts - this._myCurrentFrameRaycastsPerformed;\r\n this._myCurrentFrameRaycastsPerformed = CollisionCheckBridge.getCollisionCheck(this.myEngine)._myTotalRaycasts;\r\n this._myMaxFrameRaycastsPerformed = Math.max(this._myCurrentFrameRaycastsPerformed, this._myMaxFrameRaycastsPerformed);\r\n outCharacterCollisionResults.myDebugResults._myRaycastsPerformed = this._myLastCheckRaycastsPerformed;\r\n }\r\n\r\n updateSurfaceInfo(currentTransformQuat, characterColliderSetup, prevCharacterCollisionResults, outCharacterCollisionResults = new CharacterCollisionResults()) {\r\n let currentFramePerformedRaycasts = this._myCurrentFrameRaycastsPerformed;\r\n\r\n this.updateGroundInfo(currentTransformQuat, characterColliderSetup, prevCharacterCollisionResults, outCharacterCollisionResults);\r\n this.updateCeilingInfo(currentTransformQuat, characterColliderSetup, prevCharacterCollisionResults, outCharacterCollisionResults);\r\n\r\n this._myLastCheckRaycastsPerformed = CollisionCheckBridge.getCollisionCheck(this.myEngine)._myTotalRaycasts - currentFramePerformedRaycasts;\r\n this._myCurrentFrameRaycastsPerformed = CollisionCheckBridge.getCollisionCheck(this.myEngine)._myTotalRaycasts;\r\n this._myMaxFrameRaycastsPerformed = Math.max(this._myCurrentFrameRaycastsPerformed, this._myMaxFrameRaycastsPerformed);\r\n outCharacterCollisionResults.myDebugResults._myRaycastsPerformed = this._myLastCheckRaycastsPerformed;\r\n }\r\n\r\n updateGroundInfo(currentTransformQuat, characterColliderSetup, prevCharacterCollisionResults, outCharacterCollisionResults = new CharacterCollisionResults()) {\r\n CollisionCheckBridge.updateGroundInfo(currentTransformQuat, characterColliderSetup, prevCharacterCollisionResults, outCharacterCollisionResults, this.myEngine);\r\n\r\n this._myLastCheckRaycastsPerformed = CollisionCheckBridge.getCollisionCheck(this.myEngine)._myTotalRaycasts - this._myCurrentFrameRaycastsPerformed;\r\n this._myCurrentFrameRaycastsPerformed = CollisionCheckBridge.getCollisionCheck(this.myEngine)._myTotalRaycasts;\r\n this._myMaxFrameRaycastsPerformed = Math.max(this._myCurrentFrameRaycastsPerformed, this._myMaxFrameRaycastsPerformed);\r\n outCharacterCollisionResults.myDebugResults._myRaycastsPerformed = this._myLastCheckRaycastsPerformed;\r\n }\r\n\r\n updateCeilingInfo(currentTransformQuat, characterColliderSetup, prevCharacterCollisionResults, outCharacterCollisionResults = new CharacterCollisionResults()) {\r\n CollisionCheckBridge.updateCeilingInfo(currentTransformQuat, characterColliderSetup, prevCharacterCollisionResults, outCharacterCollisionResults, this.myEngine);\r\n\r\n this._myLastCheckRaycastsPerformed = CollisionCheckBridge.getCollisionCheck(this.myEngine)._myTotalRaycasts - this._myCurrentFrameRaycastsPerformed;\r\n this._myCurrentFrameRaycastsPerformed = CollisionCheckBridge.getCollisionCheck(this.myEngine)._myTotalRaycasts;\r\n this._myMaxFrameRaycastsPerformed = Math.max(this._myCurrentFrameRaycastsPerformed, this._myMaxFrameRaycastsPerformed);\r\n outCharacterCollisionResults.myDebugResults._myRaycastsPerformed = this._myLastCheckRaycastsPerformed;\r\n }\r\n}\r\n\r\n\r\n\r\n// IMPLEMENTATION\r\n\r\nCharacterCollisionSystem.prototype.checkTeleportToPosition = function () {\r\n let teleportTransformQuat = quat2_create();\r\n return function checkTeleportToPosition(teleportPosition, currentTransformQuat, characterColliderSetup, prevCharacterCollisionResults, outCharacterCollisionResults) {\r\n teleportTransformQuat.quat2_copy(currentTransformQuat);\r\n teleportTransformQuat.quat2_setPosition(teleportPosition);\r\n this.checkTeleportToTransform(teleportTransformQuat, currentTransformQuat, characterColliderSetup, prevCharacterCollisionResults, outCharacterCollisionResults);\r\n };\r\n}();", "import { Component, Property } from \"@wonderlandengine/api\";\r\nimport { Globals } from \"../../../pp/globals.js\";\r\nimport { ClassicGamepadCore } from \"../../gamepad/gamepad_cores/classic_gamepad_core.js\";\r\nimport { KeyboardGamepadCore } from \"../../gamepad/gamepad_cores/keyboard_gamepad_core.js\";\r\nimport { XRGamepadCore } from \"../../gamepad/gamepad_cores/xr_gamepad_core.js\";\r\nimport { InputManager } from \"../input_manager.js\";\r\n\r\nexport class InputManagerComponent extends Component {\r\n static TypeName = \"pp-input-manager\";\r\n static Properties = {\r\n _myPoseForwardFixed: Property.bool(true),\r\n _myPreventMouseContextMenu: Property.bool(true),\r\n _myPreventMouseMiddleButtonScroll: Property.bool(true),\r\n _myEnableTrackedHandPoses: Property.bool(true)\r\n };\r\n\r\n init() {\r\n this._myInputManager = null;\r\n\r\n this._myPoseForwardFixedGlobal = this._myPoseForwardFixed;\r\n }\r\n\r\n update(dt) {\r\n if (Globals.getInputManager(this.engine) == this._myInputManager) {\r\n this._myInputManager.update(dt);\r\n }\r\n }\r\n\r\n _setupMousePrevent() {\r\n if (this._myPreventMouseContextMenu) {\r\n this._myInputManager.getMouse().setContextMenuActive(false);\r\n }\r\n\r\n if (this._myPreventMouseMiddleButtonScroll) {\r\n this._myInputManager.getMouse().setMiddleButtonScrollActive(false);\r\n }\r\n }\r\n\r\n _addGamepadCores() {\r\n let leftHandPose = this._myInputManager.getLeftHandPose();\r\n let rightHandPose = this._myInputManager.getRightHandPose();\r\n\r\n let leftXRGamepadCore = new XRGamepadCore(leftHandPose);\r\n let rightXRGamepadCore = new XRGamepadCore(rightHandPose);\r\n\r\n this._myInputManager.getGamepadsManager().getLeftGamepad().addGamepadCore(\"pp_left_xr_gamepad\", leftXRGamepadCore);\r\n this._myInputManager.getGamepadsManager().getRightGamepad().addGamepadCore(\"pp_right_xr_gamepad\", rightXRGamepadCore);\r\n\r\n let leftKeyboardGamepadCore = new KeyboardGamepadCore(leftHandPose);\r\n let rightKeyboardGamepadCore = new KeyboardGamepadCore(rightHandPose);\r\n\r\n this._myInputManager.getGamepadsManager().getLeftGamepad().addGamepadCore(\"pp_left_keyboard_gamepad\", leftKeyboardGamepadCore);\r\n this._myInputManager.getGamepadsManager().getRightGamepad().addGamepadCore(\"pp_right_keyboard_gamepad\", rightKeyboardGamepadCore);\r\n\r\n let leftClassicGamepadCore = new ClassicGamepadCore(null, leftHandPose);\r\n let rightClassicGamepadCore = new ClassicGamepadCore(null, rightHandPose);\r\n\r\n this._myInputManager.getGamepadsManager().getLeftGamepad().addGamepadCore(\"pp_left_classic_gamepad\", leftClassicGamepadCore);\r\n this._myInputManager.getGamepadsManager().getRightGamepad().addGamepadCore(\"pp_right_classic_gamepad\", rightClassicGamepadCore);\r\n }\r\n\r\n onActivate() {\r\n if (this._myInputManager == null) {\r\n this._myInputManager = new InputManager(this.engine);\r\n this._myInputManager.setTrackedHandPosesEnabled(this._myEnableTrackedHandPoses);\r\n\r\n this._myInputManager.start();\r\n\r\n this._setupMousePrevent();\r\n\r\n this._addGamepadCores();\r\n }\r\n\r\n if (!Globals.hasInputManager(this.engine)) {\r\n this._myInputManager.setActive(true);\r\n\r\n Globals.setInputManager(this._myInputManager, this.engine);\r\n }\r\n\r\n if (!Globals.hasPoseForwardFixed(this.engine)) {\r\n Globals.setPoseForwardFixed(this._myPoseForwardFixedGlobal, this.engine);\r\n }\r\n }\r\n\r\n onDeactivate() {\r\n if (this._myInputManager != null) {\r\n this._myInputManager.setActive(false);\r\n\r\n if (Globals.getInputManager(this.engine) == this._myInputManager) {\r\n Globals.removeInputManager(this.engine);\r\n }\r\n }\r\n\r\n if (Globals.isPoseForwardFixed(this.engine) == this._myPoseForwardFixedGlobal) {\r\n Globals.removePoseForwardFixed(this.engine);\r\n }\r\n }\r\n\r\n onDestroy() {\r\n if (this._myInputManager != null) {\r\n this._myInputManager.destroy();\r\n }\r\n }\r\n}", "import { Emitter } from \"@wonderlandengine/api\";\r\nimport { Vector2 } from \"../../cauldron/type_definitions/array_type_definitions.js\";\r\nimport { vec2_create } from \"../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Handedness } from \"../cauldron/input_types.js\";\r\nimport { HandPose } from \"../pose/hand_pose.js\";\r\nimport { GamepadAxesEvent, GamepadAxesID, GamepadAxesInfo, GamepadButtonEvent, GamepadButtonID, GamepadButtonInfo, GamepadPulseInfo } from \"./gamepad_buttons.js\";\r\n\r\nexport class GamepadRawButtonData {\r\n public myValue: number = 0;\r\n\r\n public myPressed: boolean = false;\r\n public myTouched: boolean = false;\r\n\r\n public reset(): void {\r\n this.myValue = 0;\r\n\r\n this.myPressed = false;\r\n this.myTouched = false;\r\n }\r\n}\r\n\r\nexport class GamepadRawAxesData {\r\n public myAxes: Vector2 = vec2_create(0);\r\n\r\n public reset(): void {\r\n this.myAxes.vec2_zero();\r\n }\r\n}\r\n\r\nexport abstract class Gamepad {\r\n\r\n private readonly _myHandedness: Handedness;\r\n\r\n // Switched to `object` instead of `Map` for memory optimization reasons since iterating allocates a lot\r\n private readonly _myButtonInfos: Partial> = {};\r\n private readonly _myButtonInfosIDs: GamepadButtonID[] = [];\r\n\r\n private readonly _myAxesInfos: Partial> = {};\r\n private readonly _myAxesInfosIDs: GamepadAxesID[] = [];\r\n\r\n private readonly _myButtonEmitters: Partial>>>> = {};\r\n\r\n private readonly _myAxesEmitters: Partial>>>> = {};\r\n\r\n private readonly _myPulseInfo: GamepadPulseInfo = new GamepadPulseInfo();\r\n\r\n private _myActive: boolean = true;\r\n\r\n // Config\r\n private _myMultiplePressMaxDelay: number = 0.4;\r\n private _myMultipleTouchMaxDelay: number = 0.4;\r\n\r\n private _myDestroyed: boolean = false;\r\n\r\n constructor(handedness: Handedness) {\r\n this._myHandedness = handedness;\r\n\r\n this._myButtonInfos = {};\r\n this._myButtonInfosIDs = [];\r\n for (const key in GamepadButtonID) {\r\n const gamepadButtonID = GamepadButtonID[key as keyof typeof GamepadButtonID];\r\n this._myButtonInfos[gamepadButtonID] = new GamepadButtonInfo(gamepadButtonID, this._myHandedness);\r\n this._myButtonInfosIDs.push(gamepadButtonID);\r\n }\r\n\r\n this._myAxesInfos = {};\r\n this._myAxesInfosIDs = [];\r\n for (const key in GamepadAxesID) {\r\n const gamepadAxesID = GamepadAxesID[key as keyof typeof GamepadAxesID];\r\n this._myAxesInfos[gamepadAxesID] = new GamepadAxesInfo(gamepadAxesID, this._myHandedness);\r\n this._myAxesInfosIDs.push(gamepadAxesID);\r\n }\r\n\r\n for (const key in GamepadButtonID) {\r\n const gamepadButtonID = GamepadButtonID[key as keyof typeof GamepadButtonID];\r\n this._myButtonEmitters[gamepadButtonID] = {};\r\n for (const eventKey in GamepadButtonEvent) {\r\n const gamepadButtonEvent = GamepadButtonEvent[eventKey as keyof typeof GamepadButtonEvent];\r\n this._myButtonEmitters[gamepadButtonID]![gamepadButtonEvent] = new Emitter();\r\n }\r\n }\r\n\r\n for (const key in GamepadAxesID) {\r\n const gamepadAxesID = GamepadAxesID[key as keyof typeof GamepadAxesID];\r\n this._myAxesEmitters[gamepadAxesID] = {};\r\n for (const eventKey in GamepadAxesEvent) {\r\n const gamepadAxesEvent = GamepadAxesEvent[eventKey as keyof typeof GamepadAxesEvent];\r\n this._myAxesEmitters[gamepadAxesID]![gamepadAxesEvent] = new Emitter();\r\n }\r\n }\r\n }\r\n\r\n public setActive(active: boolean): void {\r\n this._setActiveHook(active);\r\n\r\n if (this._myActive != active) {\r\n this._myActive = active;\r\n\r\n if (!this._myActive) {\r\n\r\n // Quick way to trigger callbacks\r\n this._preUpdateButtonInfos();\r\n this._updateButtonInfos();\r\n this._postUpdateButtonInfos(0);\r\n\r\n this._preUpdateAxesInfos();\r\n this._updateAxesInfos();\r\n this._postUpdateAxesInfos();\r\n\r\n this.stopPulse();\r\n this._updatePulse(0);\r\n\r\n // Reset buttons\r\n for (let i = 0; i < this._myButtonInfosIDs.length; i++) {\r\n const id = this._myButtonInfosIDs[i];\r\n const info = this._myButtonInfos[id]!;\r\n info.reset();\r\n }\r\n\r\n for (let i = 0; i < this._myAxesInfosIDs.length; i++) {\r\n const id = this._myAxesInfosIDs[i];\r\n const info = this._myAxesInfos[id]!;\r\n info.reset();\r\n }\r\n }\r\n }\r\n }\r\n\r\n public isActive(): boolean {\r\n return this._myActive;\r\n }\r\n\r\n public getHandedness(): Handedness {\r\n return this._myHandedness;\r\n }\r\n\r\n public getButtonInfo(buttonID: GamepadButtonID): Readonly {\r\n return this._myButtonInfos[buttonID]!;\r\n }\r\n\r\n public registerButtonEventListener(buttonID: GamepadButtonID, buttonEvent: GamepadButtonEvent, id: unknown, listener: (buttonInfo: Readonly, gamepad: Gamepad) => void): void {\r\n this._myButtonEmitters[buttonID]![buttonEvent]!.add(listener, { id: id });\r\n }\r\n\r\n public unregisterButtonEventListener(buttonID: GamepadButtonID, buttonEvent: GamepadButtonEvent, id: unknown): void {\r\n this._myButtonEmitters[buttonID]![buttonEvent]!.remove(id);\r\n }\r\n\r\n public getAxesInfo(axesID: GamepadAxesID): Readonly {\r\n return this._myAxesInfos[axesID]!;\r\n }\r\n\r\n public registerAxesEventListener(axesID: GamepadAxesID, axesEvent: GamepadAxesEvent, id: unknown, listener: (axesInfo: Readonly, gamepad: Gamepad) => void): void {\r\n this._myAxesEmitters[axesID]![axesEvent]!.add(listener, { id: id });\r\n }\r\n\r\n public unregisterAxesEventListener(axesID: GamepadAxesID, axesEvent: GamepadAxesEvent, id: unknown): void {\r\n this._myAxesEmitters[axesID]![axesEvent]!.remove(id);\r\n }\r\n\r\n public pulse(intensity: number, duration: number = 0): void {\r\n this._myPulseInfo.myIntensity = Math.pp_clamp(intensity, 0, 1);\r\n this._myPulseInfo.myDuration = Math.max(duration, 0);\r\n }\r\n\r\n public stopPulse(): void {\r\n this._myPulseInfo.myIntensity = 0;\r\n this._myPulseInfo.myDuration = 0;\r\n }\r\n\r\n public isPulsing(): boolean {\r\n return this._myPulseInfo.myIntensity > 0 || this._myPulseInfo.myDuration > 0;\r\n }\r\n\r\n public getPulseInfo(): Readonly {\r\n return this._myPulseInfo;\r\n }\r\n\r\n public getMultiplePressMaxDelay(): number {\r\n return this._myMultiplePressMaxDelay;\r\n }\r\n\r\n public setMultiplePressMaxDelay(maxDelay: number): void {\r\n this._myMultiplePressMaxDelay = maxDelay;\r\n }\r\n\r\n public getMultipleTouchMaxDelay(): number {\r\n return this._myMultipleTouchMaxDelay;\r\n }\r\n\r\n public setMultipleTouchMaxDelay(maxDelay: number): void {\r\n this._myMultipleTouchMaxDelay = maxDelay;\r\n }\r\n\r\n // Hooks\r\n\r\n public getHandPose(): HandPose | null {\r\n return null;\r\n }\r\n\r\n protected _setActiveHook(active: boolean): void {\r\n\r\n }\r\n\r\n protected _startHook(): void {\r\n\r\n }\r\n\r\n protected _preUpdate(dt: number): void {\r\n\r\n }\r\n\r\n protected _postUpdate(dt: number): void {\r\n\r\n }\r\n\r\n protected _getButtonData(buttonID: GamepadButtonID): Readonly {\r\n return new GamepadRawButtonData();\r\n }\r\n\r\n protected _getAxesData(axesID: GamepadAxesID): Readonly {\r\n return new GamepadRawAxesData();\r\n }\r\n\r\n protected _getHapticActuators(): GamepadHapticActuator[] {\r\n const hapticActuator: GamepadHapticActuator[] = [];\r\n return hapticActuator;\r\n }\r\n\r\n protected _destroyHook(): void {\r\n\r\n }\r\n\r\n // Hooks End\r\n\r\n public start(): void {\r\n this._startHook();\r\n }\r\n\r\n public update(dt: number): void {\r\n if (!this._myActive) return;\r\n\r\n this._preUpdate(dt);\r\n\r\n this._preUpdateButtonInfos();\r\n this._updateButtonInfos();\r\n this._postUpdateButtonInfos(dt);\r\n\r\n this._preUpdateAxesInfos();\r\n this._updateAxesInfos();\r\n this._postUpdateAxesInfos();\r\n\r\n this._updatePulse(dt);\r\n\r\n this._postUpdate(dt);\r\n }\r\n\r\n private _preUpdateButtonInfos(): void {\r\n for (let i = 0; i < this._myButtonInfosIDs.length; i++) {\r\n const id = this._myButtonInfosIDs[i];\r\n const info = this._myButtonInfos[id]!;\r\n info.myPrevIsPressed = info.myPressed;\r\n info.myPrevIsTouched = info.myTouched;\r\n info.myPrevValue = info.myValue;\r\n }\r\n }\r\n\r\n private _updateButtonInfos(): void {\r\n this._updateSingleButtonInfo(GamepadButtonID.SELECT);\r\n this._updateSingleButtonInfo(GamepadButtonID.SQUEEZE);\r\n this._updateSingleButtonInfo(GamepadButtonID.THUMBSTICK);\r\n this._updateSingleButtonInfo(GamepadButtonID.TOP_BUTTON);\r\n this._updateSingleButtonInfo(GamepadButtonID.BOTTOM_BUTTON);\r\n this._updateSingleButtonInfo(GamepadButtonID.LEFT_BUTTON);\r\n this._updateSingleButtonInfo(GamepadButtonID.RIGHT_BUTTON);\r\n this._updateSingleButtonInfo(GamepadButtonID.MENU);\r\n this._updateSingleButtonInfo(GamepadButtonID.TOUCHPAD);\r\n this._updateSingleButtonInfo(GamepadButtonID.THUMB_REST);\r\n }\r\n\r\n private _updateSingleButtonInfo(buttonID: GamepadButtonID): void {\r\n const buttonInfo = this._myButtonInfos[buttonID]!;\r\n const buttonData = this._getButtonData(buttonID);\r\n\r\n buttonInfo.myPressed = buttonData.myPressed;\r\n buttonInfo.myTouched = buttonData.myTouched;\r\n buttonInfo.myValue = buttonData.myValue;\r\n\r\n if (buttonInfo.myPressed) {\r\n buttonInfo.myTouched = true;\r\n\r\n if (buttonInfo.myValue == 0) {\r\n buttonInfo.myValue = 1;\r\n }\r\n }\r\n }\r\n\r\n private _postUpdateButtonInfos(dt: number): void {\r\n for (let i = 0; i < this._myButtonInfosIDs.length; i++) {\r\n const id = this._myButtonInfosIDs[i];\r\n const info = this._myButtonInfos[id]!;\r\n if (info.myPressed) {\r\n info.myTimePressed += dt;\r\n if (!info.myPrevIsPressed) {\r\n info.myMultiplePressStartCount += 1;\r\n\r\n info.myPrevTimeNotPressed = info.myTimeNotPressed;\r\n info.myTimeNotPressed = 0;\r\n }\r\n\r\n if (info.myPrevTimeNotPressed + info.myTimePressed > this._myMultiplePressMaxDelay && info.myMultiplePressEndCount > 0) {\r\n info.myPrevMultiplePressEndCount = info.myMultiplePressEndCount;\r\n info.myMultiplePressEndCount = 0;\r\n }\r\n\r\n if (info.myTimePressed > this._myMultiplePressMaxDelay && info.myMultiplePressStartCount > 0) {\r\n info.myPrevMultiplePressStartCount = info.myMultiplePressStartCount;\r\n info.myMultiplePressStartCount = 0;\r\n }\r\n } else {\r\n info.myTimeNotPressed += dt;\r\n if (info.myPrevIsPressed) {\r\n info.myMultiplePressEndCount += 1;\r\n\r\n info.myPrevTimePressed = info.myTimePressed;\r\n info.myTimePressed = 0;\r\n }\r\n\r\n if (info.myPrevTimePressed + info.myTimeNotPressed > this._myMultiplePressMaxDelay && info.myMultiplePressStartCount > 0) {\r\n info.myPrevMultiplePressStartCount = info.myMultiplePressStartCount;\r\n info.myMultiplePressStartCount = 0;\r\n }\r\n\r\n if (info.myTimeNotPressed > this._myMultiplePressMaxDelay && info.myMultiplePressEndCount > 0) {\r\n info.myPrevMultiplePressEndCount = info.myMultiplePressEndCount;\r\n info.myMultiplePressEndCount = 0;\r\n }\r\n }\r\n\r\n if (info.myTouched) {\r\n info.myTimeTouched += dt;\r\n if (!info.myPrevIsTouched) {\r\n info.myMultipleTouchStartCount += 1;\r\n\r\n info.myPrevTimeNotTouched = info.myTimeNotTouched;\r\n info.myTimeNotTouched = 0;\r\n }\r\n\r\n if (info.myPrevTimeNotTouched + info.myTimeTouched > this._myMultipleTouchMaxDelay && info.myMultipleTouchEndCount > 0) {\r\n info.myPrevMultipleTouchEndCount = info.myMultipleTouchEndCount;\r\n info.myMultipleTouchEndCount = 0;\r\n }\r\n\r\n if (info.myTimeTouched > this._myMultipleTouchMaxDelay && info.myMultipleTouchStartCount > 0) {\r\n info.myPrevMultipleTouchStartCount = info.myMultipleTouchStartCount;\r\n info.myMultipleTouchStartCount = 0;\r\n }\r\n } else {\r\n info.myTimeNotTouched += dt;\r\n if (info.myPrevIsTouched) {\r\n info.myMultipleTouchEndCount += 1;\r\n\r\n info.myPrevTimeTouched = info.myTimeTouched;\r\n info.myTimeTouched = 0;\r\n }\r\n\r\n if (info.myPrevTimeTouched + info.myTimeNotTouched > this._myMultipleTouchMaxDelay && info.myMultipleTouchStartCount > 0) {\r\n info.myPrevMultipleTouchStartCount = info.myMultipleTouchStartCount;\r\n info.myMultipleTouchStartCount = 0;\r\n }\r\n\r\n if (info.myTimeNotTouched > this._myMultipleTouchMaxDelay && info.myMultipleTouchEndCount > 0) {\r\n info.myPrevMultipleTouchEndCount = info.myMultipleTouchEndCount;\r\n info.myMultipleTouchEndCount = 0;\r\n }\r\n }\r\n }\r\n\r\n for (let i = 0; i < this._myButtonInfosIDs.length; i++) {\r\n const id = this._myButtonInfosIDs[i];\r\n const buttonInfo = this._myButtonInfos[id]!;\r\n const buttonEventEmitters = this._myButtonEmitters[id]!;\r\n\r\n // PRESSED\r\n if (buttonInfo.myPressed && !buttonInfo.myPrevIsPressed) {\r\n const emitter = buttonEventEmitters[GamepadButtonEvent.PRESS_START]!;\r\n emitter.notify(buttonInfo, this);\r\n }\r\n\r\n if (!buttonInfo.myPressed && buttonInfo.myPrevIsPressed) {\r\n const emitter = buttonEventEmitters[GamepadButtonEvent.PRESS_END]!;\r\n emitter.notify(buttonInfo, this);\r\n }\r\n\r\n if (buttonInfo.myPressed) {\r\n const emitter = buttonEventEmitters[GamepadButtonEvent.PRESSED]!;\r\n emitter.notify(buttonInfo, this);\r\n } else {\r\n const emitter = buttonEventEmitters[GamepadButtonEvent.NOT_PRESSED]!;\r\n emitter.notify(buttonInfo, this);\r\n }\r\n\r\n // TOUCHED\r\n if (buttonInfo.myTouched && !buttonInfo.myPrevIsTouched) {\r\n const emitter = buttonEventEmitters[GamepadButtonEvent.TOUCH_START]!;\r\n emitter.notify(buttonInfo, this);\r\n }\r\n\r\n if (!buttonInfo.myTouched && buttonInfo.myPrevIsTouched) {\r\n const emitter = buttonEventEmitters[GamepadButtonEvent.TOUCH_END]!;\r\n emitter.notify(buttonInfo, this);\r\n }\r\n\r\n if (buttonInfo.myTouched) {\r\n const emitter = buttonEventEmitters[GamepadButtonEvent.TOUCHED]!;\r\n emitter.notify(buttonInfo, this);\r\n } else {\r\n const emitter = buttonEventEmitters[GamepadButtonEvent.NOT_TOUCHED]!;\r\n emitter.notify(buttonInfo, this);\r\n }\r\n\r\n // VALUE\r\n if (buttonInfo.myValue != buttonInfo.myPrevValue) {\r\n const emitter = buttonEventEmitters[GamepadButtonEvent.VALUE_CHANGED]!;\r\n emitter.notify(buttonInfo, this);\r\n }\r\n\r\n // ALWAYS\r\n const emitter = buttonEventEmitters[GamepadButtonEvent.ALWAYS]!;\r\n emitter.notify(buttonInfo, this);\r\n }\r\n }\r\n\r\n private _preUpdateAxesInfos(): void {\r\n for (let i = 0; i < this._myAxesInfosIDs.length; i++) {\r\n const id = this._myAxesInfosIDs[i];\r\n const info = this._myAxesInfos[id]!;\r\n info.myPrevAxes[0] = info.myAxes[0];\r\n info.myPrevAxes[1] = info.myAxes[1];\r\n }\r\n }\r\n\r\n private _updateAxesInfos(): void {\r\n this._updateSingleAxesInfo(GamepadAxesID.THUMBSTICK);\r\n }\r\n\r\n private _updateSingleAxesInfo(axesID: GamepadAxesID): void {\r\n const axesInfo = this._myAxesInfos[axesID]!;\r\n const axesData = this._getAxesData(axesID);\r\n\r\n axesInfo.myAxes[0] = axesData.myAxes[0];\r\n axesInfo.myAxes[1] = axesData.myAxes[1];\r\n }\r\n\r\n private _postUpdateAxesInfos(): void {\r\n for (const key in GamepadAxesID) {\r\n const gamepadAxesID = GamepadAxesID[key as keyof typeof GamepadAxesID];\r\n const axesInfo = this._myAxesInfos[gamepadAxesID]!;\r\n const axesEventEmitters = this._myAxesEmitters[gamepadAxesID]!;\r\n\r\n // X CHANGED\r\n if (axesInfo.myAxes[0] != axesInfo.myPrevAxes[0]) {\r\n const emitter = axesEventEmitters[GamepadAxesEvent.X_CHANGED]!;\r\n emitter.notify(axesInfo, this);\r\n }\r\n\r\n // Y CHANGED\r\n if (axesInfo.myAxes[1] != axesInfo.myPrevAxes[1]) {\r\n const emitter = axesEventEmitters[GamepadAxesEvent.Y_CHANGED]!;\r\n emitter.notify(axesInfo, this);\r\n }\r\n\r\n // AXES CHANGED\r\n if (axesInfo.myAxes[0] != axesInfo.myPrevAxes[0] ||\r\n axesInfo.myAxes[1] != axesInfo.myPrevAxes[1]) {\r\n const emitter = axesEventEmitters[GamepadAxesEvent.AXES_CHANGED]!;\r\n emitter.notify(axesInfo, this);\r\n }\r\n\r\n // ALWAYS \r\n const emitter = axesEventEmitters[GamepadAxesEvent.ALWAYS]!;\r\n emitter.notify(axesInfo, this);\r\n }\r\n }\r\n\r\n private _updatePulse(dt: number): void {\r\n if (this._myPulseInfo.myDevicePulsing || this._myPulseInfo.myIntensity > 0) {\r\n const hapticActuators = this._getHapticActuators();\r\n if (hapticActuators.length > 0) {\r\n if (this._myPulseInfo.myIntensity > 0) {\r\n for (let i = 0; i < hapticActuators.length; i++) {\r\n const hapticActuator = hapticActuators[i];\r\n\r\n // Duration is managed by this class\r\n hapticActuator.playEffect(\"dual-rumble\", {\r\n startDelay: 0,\r\n duration: Math.max(250, this._myPulseInfo.myDuration * 1000),\r\n weakMagnitude: this._myPulseInfo.myIntensity,\r\n strongMagnitude: this._myPulseInfo.myIntensity\r\n });\r\n }\r\n this._myPulseInfo.myDevicePulsing = true;\r\n } else if (this._myPulseInfo.myDevicePulsing) {\r\n for (let i = 0; i < hapticActuators.length; i++) {\r\n const hapticActuator = hapticActuators[i];\r\n\r\n try {\r\n if (hapticActuator.reset != null) {\r\n hapticActuator.reset();\r\n }\r\n } catch (error) {\r\n // Do nothing\r\n }\r\n }\r\n\r\n this._myPulseInfo.myDevicePulsing = false;\r\n }\r\n } else {\r\n this._myPulseInfo.myDevicePulsing = false;\r\n }\r\n }\r\n\r\n this._myPulseInfo.myDuration -= dt;\r\n if (this._myPulseInfo.myDuration <= 0) {\r\n this._myPulseInfo.myIntensity = 0;\r\n this._myPulseInfo.myDuration = 0;\r\n }\r\n }\r\n\r\n public destroy(): void {\r\n this._myDestroyed = true;\r\n\r\n this.setActive(false);\r\n\r\n this._destroyHook();\r\n }\r\n\r\n public isDestroyed(): boolean {\r\n return this._myDestroyed;\r\n }\r\n}", "import { Vector2 } from \"../../cauldron/type_definitions/array_type_definitions.js\";\r\nimport { vec2_create } from \"../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Handedness } from \"../cauldron/input_types.js\";\r\n\r\nexport enum GamepadButtonID {\r\n /** Trigger */\r\n SELECT = 0,\r\n\r\n /** Grip */\r\n SQUEEZE = 1,\r\n\r\n THUMBSTICK = 2,\r\n\r\n /** B or Y button on oculus quest gamepad, reverts to `TOUCHPAD` button for gamepads that does not support `TOP_BUTTON` */\r\n TOP_BUTTON = 3,\r\n\r\n /** A or X button on oculus quest gamepad */\r\n BOTTOM_BUTTON = 4,\r\n\r\n /** Square button on a playstation gamepad */\r\n LEFT_BUTTON = 5,\r\n\r\n /** Circle button on a playstation gamepad */\r\n RIGHT_BUTTON = 6,\r\n\r\n MENU = 7,\r\n\r\n TOUCHPAD = 8,\r\n\r\n THUMB_REST = 9\r\n}\r\n\r\nexport enum GamepadButtonEvent {\r\n PRESS_START = 0,\r\n PRESS_END = 1,\r\n\r\n /** Every frame that it is pressed */\r\n PRESSED = 2,\r\n\r\n /** Every frame that it is not pressed */\r\n NOT_PRESSED = 3,\r\n\r\n TOUCH_START = 4,\r\n TOUCH_END = 5,\r\n\r\n /** Every frame that it is touched */\r\n TOUCHED = 6,\r\n\r\n /** Every frame that it is not touched */\r\n NOT_TOUCHED = 7,\r\n\r\n VALUE_CHANGED = 8,\r\n\r\n /** Every frame */\r\n ALWAYS = 9\r\n}\r\n\r\nexport enum GamepadAxesID {\r\n THUMBSTICK = 0\r\n}\r\n\r\nexport enum GamepadAxesEvent {\r\n X_CHANGED = 0,\r\n Y_CHANGED = 1,\r\n AXES_CHANGED = 2,\r\n ALWAYS = 3\r\n}\r\n\r\nexport class GamepadButtonInfo {\r\n\r\n public myID: GamepadButtonID;\r\n public myHandedness: Handedness;\r\n\r\n public myPressed: boolean = false;\r\n public myPrevIsPressed: boolean = false;\r\n\r\n public myTouched: boolean = false;\r\n public myPrevIsTouched: boolean = false;\r\n\r\n public myValue: number = 0;\r\n public myPrevValue: number = 0;\r\n\r\n public myTimePressed: number = 0;\r\n public myPrevTimePressed: number = 0;\r\n\r\n public myTimeNotPressed: number = 0;\r\n public myPrevTimeNotPressed: number = 0;\r\n\r\n public myTimeTouched: number = 0;\r\n public myPrevTimeTouched: number = 0;\r\n\r\n public myTimeNotTouched: number = 0;\r\n public myPrevTimeNotTouched: number = 0;\r\n\r\n public myMultiplePressStartCount: number = 0;\r\n public myPrevMultiplePressStartCount: number = 0;\r\n public myMultiplePressEndCount: number = 0;\r\n public myPrevMultiplePressEndCount: number = 0;\r\n\r\n public myMultipleTouchStartCount: number = 0;\r\n public myPrevMultipleTouchStartCount: number = 0;\r\n public myMultipleTouchEndCount: number = 0;\r\n public myPrevMultipleTouchEndCount: number = 0;\r\n\r\n constructor(id: GamepadButtonID, handedness: Handedness) {\r\n this.myID = id;\r\n this.myHandedness = handedness;\r\n }\r\n\r\n public getID(): GamepadButtonID {\r\n return this.myID;\r\n }\r\n\r\n public getHandedness(): Handedness {\r\n return this.myHandedness;\r\n }\r\n\r\n public getValue(): number {\r\n return this.myValue;\r\n }\r\n\r\n public isPressed(): boolean {\r\n return this.myPressed;\r\n }\r\n\r\n public isTouched(): boolean {\r\n return this.myTouched;\r\n }\r\n\r\n public isPressStart(multiplePressCount: number | null = null): boolean {\r\n return (this.myPressed && !this.myPrevIsPressed) && (multiplePressCount == null || this.myMultiplePressStartCount == multiplePressCount);\r\n }\r\n\r\n public isPressEnd(multiplePressCount: number | null = null): boolean {\r\n return (!this.myPressed && this.myPrevIsPressed) && (multiplePressCount == null || this.myMultiplePressEndCount == multiplePressCount);\r\n }\r\n\r\n public isTouchStart(multipleTouchCount: number | null = null): boolean {\r\n return (this.myTouched && !this.myPrevIsTouched) && (multipleTouchCount == null || this.myMultipleTouchStartCount == multipleTouchCount);\r\n }\r\n\r\n public isTouchEnd(multipleTouchCount: number | null = null): boolean {\r\n return (!this.myTouched && this.myPrevIsTouched) && (multipleTouchCount == null || this.myMultipleTouchEndCount == multipleTouchCount);\r\n }\r\n\r\n public reset(): void {\r\n this.myPressed = false;\r\n this.myPrevIsPressed = false;\r\n this.myTouched = false;\r\n this.myPrevIsTouched = false;\r\n this.myValue = 0;\r\n this.myPrevValue = 0;\r\n\r\n this.myTimePressed = 0;\r\n this.myPrevTimePressed = 0;\r\n this.myTimeNotPressed = 0;\r\n this.myPrevTimeNotPressed = 0;\r\n\r\n this.myTimeTouched = 0;\r\n this.myPrevTimeTouched = 0;\r\n this.myTimeNotTouched = 0;\r\n this.myPrevTimeNotTouched = 0;\r\n\r\n this.myMultiplePressStartCount = 0;\r\n this.myPrevMultiplePressStartCount = 0;\r\n this.myMultiplePressEndCount = 0;\r\n this.myPrevMultiplePressEndCount = 0;\r\n\r\n this.myMultipleTouchStartCount = 0;\r\n this.myPrevMultipleTouchStartCount = 0;\r\n this.myMultipleTouchEndCount = 0;\r\n this.myPrevMultipleTouchEndCount = 0;\r\n }\r\n\r\n public clone(): GamepadButtonInfo {\r\n const value = new GamepadButtonInfo(this.myID, this.myHandedness);\r\n\r\n value.myPressed = this.myPressed;\r\n value.myPrevIsPressed = this.myPrevIsPressed;\r\n value.myTouched = this.myTouched;\r\n value.myPrevIsTouched = this.myPrevIsTouched;\r\n value.myValue = this.myValue;\r\n value.myPrevValue = this.myPrevValue;\r\n\r\n value.myTimePressed = this.myTimePressed;\r\n value.myPrevTimePressed = this.myPrevTimePressed;\r\n value.myTimeNotPressed = this.myTimeNotPressed;\r\n value.myPrevTimeNotPressed = this.myPrevTimeNotPressed;\r\n\r\n value.myTimeTouched = this.myTimeTouched;\r\n value.myPrevTimeTouched = this.myPrevTimeTouched;\r\n value.myTimeNotTouched = this.myTimeNotTouched;\r\n value.myPrevTimeNotTouched = this.myPrevTimeNotTouched;\r\n\r\n value.myMultiplePressStartCount = this.myMultiplePressStartCount;\r\n value.myPrevMultiplePressStartCount = this.myPrevMultiplePressStartCount;\r\n value.myMultiplePressEndCount = this.myMultiplePressEndCount;\r\n value.myPrevMultiplePressEndCount = this.myPrevMultiplePressEndCount;\r\n\r\n value.myMultipleTouchStartCount = this.myMultipleTouchStartCount;\r\n value.myPrevMultipleTouchStartCount = this.myPrevMultipleTouchStartCount;\r\n value.myMultipleTouchEndCount = this.myMultipleTouchEndCount;\r\n value.myPrevMultipleTouchEndCount = this.myPrevMultipleTouchEndCount;\r\n\r\n return value;\r\n }\r\n}\r\n\r\nexport class GamepadAxesInfo {\r\n public myID: GamepadAxesID;\r\n\r\n public myHandedness: Handedness;\r\n\r\n /** `myAxes[0]` is X, `myAxes[1]` is Y */\r\n public myAxes = vec2_create(0);\r\n\r\n /** `myPrevAxes[0]` is X, `myPrevAxes[1]` is Y */\r\n public myPrevAxes = vec2_create(0);\r\n\r\n constructor(id: GamepadAxesID, handedness: Handedness) {\r\n this.myID = id;\r\n this.myHandedness = handedness;\r\n }\r\n\r\n public getID(): GamepadAxesID {\r\n return this.myID;\r\n }\r\n\r\n public getAxes(): Readonly {\r\n return this.myAxes;\r\n }\r\n\r\n public getHandedness(): Handedness {\r\n return this.myHandedness;\r\n }\r\n\r\n public reset(): void {\r\n this.myAxes.vec2_zero();\r\n this.myPrevAxes.vec2_zero();\r\n }\r\n\r\n public clone(): GamepadAxesInfo {\r\n const value = new GamepadAxesInfo(this.myID, this.myHandedness);\r\n\r\n value.myAxes.vec2_copy(this.myAxes);\r\n value.myPrevAxes.vec2_copy(this.myPrevAxes);\r\n\r\n return value;\r\n }\r\n}\r\n\r\nexport class GamepadPulseInfo {\r\n\r\n public myIntensity = 0;\r\n public myDuration = 0;\r\n\r\n /** `true` if the gamepad actually sent a request to pulse to the device */\r\n public myDevicePulsing: boolean = false;\r\n\r\n public clone(): GamepadPulseInfo {\r\n const value = new GamepadPulseInfo();\r\n\r\n value.myIntensity = this.myIntensity;\r\n value.myDuration = this.myDuration;\r\n value.myDevicePulsing = this.myDevicePulsing;\r\n\r\n return value;\r\n }\r\n}", "import { GamepadRawAxesData, GamepadRawButtonData } from \"../gamepad.js\";\r\n\r\nexport class GamepadCore {\r\n\r\n constructor(handPose) {\r\n this._myHandPose = handPose;\r\n\r\n this._myManagingHandPose = false;\r\n\r\n this._myActive = true;\r\n this._myStarted = false;\r\n\r\n this._myDestroyed = false;\r\n }\r\n\r\n setActive(active) {\r\n this._setActiveHook(active);\r\n\r\n this._myActive = active;\r\n }\r\n\r\n isActive() {\r\n return this._myActive;\r\n }\r\n\r\n getHandedness() {\r\n return this.getHandPose().getHandedness();\r\n }\r\n\r\n getHandPose() {\r\n return this._myHandPose;\r\n }\r\n\r\n getEngine() {\r\n return this.getHandPose().getEngine();\r\n }\r\n\r\n isGamepadCoreActive() {\r\n return true;\r\n }\r\n\r\n setManageHandPose(manageHandPose) {\r\n this._myManagingHandPose = manageHandPose;\r\n }\r\n\r\n isManagingHandPose() {\r\n return this._myManagingHandPose;\r\n }\r\n\r\n start() {\r\n if (this._myStarted) return;\r\n\r\n this._myStarted = true;\r\n\r\n if (this.getHandPose() && this.isManagingHandPose()) {\r\n this.getHandPose().start();\r\n }\r\n\r\n this._startHook();\r\n\r\n this._myActive = false;\r\n this.setActive(true);\r\n }\r\n\r\n preUpdate(dt) {\r\n if (!this._myActive) return;\r\n\r\n if (this.getHandPose() && this.isManagingHandPose()) {\r\n this.getHandPose().update(dt);\r\n }\r\n\r\n this._preUpdateHook(dt);\r\n }\r\n\r\n postUpdate(dt) {\r\n if (!this._myActive) return;\r\n\r\n this._postUpdateHook(dt);\r\n }\r\n\r\n getButtonData(buttonID) {\r\n return new GamepadRawButtonData();\r\n }\r\n\r\n getAxesData(axesID) {\r\n return new GamepadRawAxesData();\r\n }\r\n\r\n getHapticActuators() {\r\n let hapticActuators = [];\r\n return hapticActuators;\r\n }\r\n\r\n // Hooks\r\n\r\n _setActiveHook(active) {\r\n\r\n }\r\n\r\n _startHook() {\r\n\r\n }\r\n\r\n _preUpdateHook(dt) {\r\n\r\n }\r\n\r\n _postUpdateHook(dt) {\r\n\r\n }\r\n\r\n _destroyHook() {\r\n\r\n }\r\n\r\n // Hooks end\r\n\r\n destroy() {\r\n if (this._myDestroyed) return;\r\n\r\n this._myDestroyed = true;\r\n\r\n this.setActive(false);\r\n\r\n this._destroyHook();\r\n\r\n if (this.isManagingHandPose()) {\r\n this.getHandPose().destroy();\r\n }\r\n }\r\n\r\n isDestroyed() {\r\n return this._myDestroyed;\r\n }\r\n}", "import { Handedness } from \"../../cauldron/input_types.js\";\r\nimport { GamepadRawAxesData, GamepadRawButtonData } from \"../gamepad.js\";\r\nimport { GamepadButtonID } from \"../gamepad_buttons.js\";\r\nimport { GamepadCore } from \"./gamepad_core.js\";\r\n\r\nexport class ClassicGamepadCore extends GamepadCore {\r\n\r\n constructor(gamepadIndex, handPose) {\r\n super(handPose);\r\n\r\n this._myGamepadIndex = gamepadIndex; // null means any active gamepad\r\n\r\n this._myCurrentGamepads = null;\r\n\r\n // Support Variables\r\n this._myButtonData = new GamepadRawButtonData();\r\n this._myAxesData = new GamepadRawAxesData();\r\n this._myHapticActuators = [];\r\n }\r\n\r\n _preUpdateHook(dt) {\r\n this._myCurrentGamepads = navigator.getGamepads();\r\n }\r\n\r\n _setActiveHook(active) {\r\n if (this.isActive() != active) {\r\n if (!active) {\r\n this._myCurrentGamepads = null;\r\n }\r\n }\r\n }\r\n\r\n isGamepadCoreActive() {\r\n let classicGamepad = this._getClassicGamepad();\r\n return this.isActive() && classicGamepad != null && (classicGamepad.connected == null || classicGamepad.connected);\r\n }\r\n\r\n getButtonData(buttonID) {\r\n this._myButtonData.reset();\r\n\r\n let classicGamepad = this._getClassicGamepad();\r\n if (classicGamepad != null && this.isGamepadCoreActive()) {\r\n let button = null;\r\n if (this.getHandedness() == Handedness.LEFT) {\r\n switch (buttonID) {\r\n case GamepadButtonID.SELECT:\r\n button = classicGamepad.buttons[4];\r\n break;\r\n case GamepadButtonID.SQUEEZE:\r\n button = classicGamepad.buttons[6];\r\n break;\r\n case GamepadButtonID.THUMBSTICK:\r\n button = classicGamepad.buttons[10];\r\n break;\r\n case GamepadButtonID.TOP_BUTTON:\r\n button = classicGamepad.buttons[12];\r\n break;\r\n case GamepadButtonID.BOTTOM_BUTTON:\r\n button = classicGamepad.buttons[13];\r\n break;\r\n case GamepadButtonID.LEFT_BUTTON:\r\n button = classicGamepad.buttons[14];\r\n break;\r\n case GamepadButtonID.RIGHT_BUTTON:\r\n button = classicGamepad.buttons[15];\r\n break;\r\n case GamepadButtonID.MENU:\r\n button = classicGamepad.buttons[8];\r\n break;\r\n case GamepadButtonID.TOUCHPAD:\r\n button = null;\r\n break;\r\n case GamepadButtonID.THUMB_REST:\r\n button = null;\r\n break;\r\n }\r\n } else {\r\n switch (buttonID) {\r\n case GamepadButtonID.SELECT:\r\n button = classicGamepad.buttons[5];\r\n break;\r\n case GamepadButtonID.SQUEEZE:\r\n button = classicGamepad.buttons[7];\r\n break;\r\n case GamepadButtonID.THUMBSTICK:\r\n button = classicGamepad.buttons[11];\r\n break;\r\n case GamepadButtonID.TOP_BUTTON:\r\n button = classicGamepad.buttons[3];\r\n break;\r\n case GamepadButtonID.BOTTOM_BUTTON:\r\n button = classicGamepad.buttons[0];\r\n break;\r\n case GamepadButtonID.LEFT_BUTTON:\r\n button = classicGamepad.buttons[2];\r\n break;\r\n case GamepadButtonID.RIGHT_BUTTON:\r\n button = classicGamepad.buttons[1];\r\n break;\r\n case GamepadButtonID.MENU:\r\n button = classicGamepad.buttons[9];\r\n break;\r\n case GamepadButtonID.TOUCHPAD:\r\n button = null;\r\n break;\r\n case GamepadButtonID.THUMB_REST:\r\n button = null;\r\n break;\r\n }\r\n }\r\n\r\n if (button != null) {\r\n this._myButtonData.myPressed = button.pressed;\r\n this._myButtonData.myTouched = button.touched;\r\n this._myButtonData.myValue = button.value;\r\n }\r\n }\r\n\r\n return this._myButtonData;\r\n }\r\n\r\n getAxesData(axesID) {\r\n this._myAxesData.reset();\r\n\r\n let classicGamepad = this._getClassicGamepad();\r\n if (classicGamepad != null && this.isGamepadCoreActive()) {\r\n if (this.getHandedness() == Handedness.LEFT) {\r\n this._myAxesData.myAxes[0] = classicGamepad.axes[0];\r\n this._myAxesData.myAxes[1] = classicGamepad.axes[1];\r\n } else {\r\n this._myAxesData.myAxes[0] = classicGamepad.axes[2];\r\n this._myAxesData.myAxes[1] = classicGamepad.axes[3];\r\n }\r\n\r\n // Y axis is recorded negative when thumbstick is pressed forward for weird reasons\r\n this._myAxesData.myAxes[1] = -this._myAxesData.myAxes[1];\r\n }\r\n\r\n return this._myAxesData;\r\n }\r\n\r\n getHapticActuators() {\r\n this._myHapticActuators.pp_clear();\r\n\r\n let classicGamepad = this._getClassicGamepad();\r\n if (classicGamepad != null && this.isGamepadCoreActive()) {\r\n if (classicGamepad.hapticActuators != null) {\r\n for (let i = 0; i < classicGamepad.hapticActuators.length; i++) {\r\n this._myHapticActuators.push(classicGamepad.hapticActuators[i]);\r\n }\r\n }\r\n\r\n if (classicGamepad.vibrationActuator != null) {\r\n this._myHapticActuators.push(classicGamepad.vibrationActuator);\r\n }\r\n }\r\n\r\n return this._myHapticActuators;\r\n }\r\n\r\n _getClassicGamepad() {\r\n if (this._myCurrentGamepads == null) return null;\r\n\r\n let classicGamepad = null;\r\n\r\n if (this._myGamepadIndex != null) {\r\n if (this._myGamepadIndex < this._myCurrentGamepads.length) {\r\n classicGamepad = this._myCurrentGamepads[this._myGamepadIndex];\r\n }\r\n } else {\r\n for (let i = 0; i < this._myCurrentGamepads.length; i++) {\r\n let gamepad = this._myCurrentGamepads[i];\r\n if (gamepad != null && (gamepad.connected == null || gamepad.connected)) {\r\n classicGamepad = gamepad;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return classicGamepad;\r\n }\r\n}", "import { Globals } from \"../../pp/globals.js\";\r\n\r\nexport let KeyID = {\r\n /** These are when the number is pressed in some way */\r\n Number0: \"0\",\r\n Number1: \"1\",\r\n Number2: \"2\",\r\n Number3: \"3\",\r\n Number4: \"4\",\r\n Number5: \"5\",\r\n Number6: \"6\",\r\n Number7: \"7\",\r\n Number8: \"8\",\r\n Number9: \"9\",\r\n\r\n /** These are just the numbers above the letters on the keyboard */\r\n Digit0: \"Digit0\",\r\n Digit1: \"Digit1\",\r\n Digit2: \"Digit2\",\r\n Digit3: \"Digit3\",\r\n Digit4: \"Digit4\",\r\n Digit5: \"Digit5\",\r\n Digit6: \"Digit6\",\r\n Digit7: \"Digit7\",\r\n Digit8: \"Digit8\",\r\n Digit9: \"Digit9\",\r\n\r\n /** These are just the numbers on the numpad, but works even is num lock is disabled */\r\n Numpad0: \"Numpad0\",\r\n Numpad1: \"Numpad1\",\r\n Numpad2: \"Numpad2\",\r\n Numpad3: \"Numpad3\",\r\n Numpad4: \"Numpad4\",\r\n Numpad5: \"Numpad5\",\r\n Numpad6: \"Numpad6\",\r\n Numpad7: \"Numpad7\",\r\n Numpad8: \"Numpad8\",\r\n Numpad9: \"Numpad9\",\r\n\r\n KeyA: \"KeyA\",\r\n KeyB: \"KeyB\",\r\n KeyC: \"KeyC\",\r\n KeyD: \"KeyD\",\r\n KeyE: \"KeyE\",\r\n KeyF: \"KeyF\",\r\n KeyG: \"KeyG\",\r\n KeyH: \"KeyH\",\r\n KeyI: \"KeyI\",\r\n KeyJ: \"KeyJ\",\r\n KeyK: \"KeyK\",\r\n KeyL: \"KeyL\",\r\n KeyM: \"KeyM\",\r\n KeyN: \"KeyN\",\r\n KeyO: \"KeyO\",\r\n KeyP: \"KeyP\",\r\n KeyQ: \"KeyQ\",\r\n KeyR: \"KeyR\",\r\n KeyS: \"KeyS\",\r\n KeyT: \"KeyT\",\r\n KeyU: \"KeyU\",\r\n KeyV: \"KeyV\",\r\n KeyW: \"KeyW\",\r\n KeyX: \"KeyX\",\r\n KeyY: \"KeyY\",\r\n KeyZ: \"KeyZ\",\r\n\r\n A: \"A\",\r\n B: \"B\",\r\n C: \"C\",\r\n D: \"D\",\r\n E: \"E\",\r\n F: \"F\",\r\n G: \"G\",\r\n H: \"H\",\r\n I: \"I\",\r\n J: \"J\",\r\n K: \"K\",\r\n L: \"L\",\r\n M: \"M\",\r\n N: \"N\",\r\n O: \"O\",\r\n P: \"P\",\r\n Q: \"Q\",\r\n R: \"R\",\r\n S: \"S\",\r\n T: \"T\",\r\n U: \"U\",\r\n V: \"V\",\r\n W: \"W\",\r\n X: \"X\",\r\n Y: \"Y\",\r\n Z: \"Z\",\r\n\r\n a: \"a\",\r\n b: \"b\",\r\n c: \"c\",\r\n d: \"d\",\r\n e: \"e\",\r\n f: \"f\",\r\n g: \"g\",\r\n h: \"h\",\r\n i: \"i\",\r\n j: \"j\",\r\n k: \"k\",\r\n l: \"l\",\r\n m: \"m\",\r\n n: \"n\",\r\n o: \"o\",\r\n p: \"p\",\r\n q: \"q\",\r\n r: \"r\",\r\n s: \"s\",\r\n t: \"t\",\r\n u: \"u\",\r\n v: \"v\",\r\n w: \"w\",\r\n x: \"x\",\r\n y: \"y\",\r\n z: \"z\",\r\n\r\n UP: \"ArrowUp\",\r\n DOWN: \"ArrowDown\",\r\n LEFT: \"ArrowLeft\",\r\n RIGHT: \"ArrowRight\",\r\n\r\n SPACE: \"Space\",\r\n ENTER: \"Enter\",\r\n BACKSPACE: \"Backspace\",\r\n ESC: \"Escape\",\r\n\r\n SHIFT_LEFT: \"ShiftLeft\",\r\n SHIFT_RIGHT: \"ShiftRight\",\r\n CONTROL_LEFT: \"ControlLeft\",\r\n CONTROL_RIGHT: \"ControlRight\",\r\n ALT_LEFT: \"AltLeft\",\r\n ALT_RIGHT: \"AltRight\"\r\n};\r\n\r\nexport class Keyboard {\r\n\r\n constructor(engine = Globals.getMainEngine()) {\r\n this._myEngine = engine;\r\n\r\n this._myKeyInfos = {};\r\n this._myKeyInfosIDs = [];\r\n for (let key in KeyID) {\r\n this.addKey(KeyID[key]);\r\n }\r\n\r\n this._myOnKeyDownEventListener = null;\r\n this._myOnKeyUpEventListener = null;\r\n\r\n this._myActive = true;\r\n\r\n this._myDestroyed = false;\r\n }\r\n\r\n setActive(active) {\r\n if (this._myActive != active) {\r\n this._myActive = active;\r\n\r\n if (this._myActive) {\r\n this._myOnKeyDownEventListener = this._keyDown.bind(this);\r\n window.addEventListener(\"keydown\", this._myOnKeyDownEventListener);\r\n this._myOnKeyUpEventListener = this._keyUp.bind(this);\r\n window.addEventListener(\"keyup\", this._myOnKeyUpEventListener);\r\n } else {\r\n for (let i = 0; i < this._myKeyInfosIDs.length; i++) {\r\n let id = this._myKeyInfosIDs[i];\r\n let keyInfo = this._myKeyInfos[id];\r\n keyInfo.myPressed = false;\r\n keyInfo.myPressStart = false;\r\n keyInfo.myPressEnd = false;\r\n keyInfo.myPressStartToProcess = false;\r\n keyInfo.myPressEndToProcess = false;\r\n }\r\n\r\n window.removeEventListener(\"keydown\", this._myOnKeyDownEventListener);\r\n window.removeEventListener(\"keyup\", this._myOnKeyUpEventListener);\r\n\r\n this._myOnKeyDownEventListener = null;\r\n this._myOnKeyUpEventListener = null;\r\n\r\n }\r\n }\r\n }\r\n\r\n isActive() {\r\n return this._myActive;\r\n }\r\n\r\n isKeyPressed(keyID) {\r\n let pressed = false;\r\n\r\n if (this._myKeyInfos[keyID] != null) {\r\n pressed = this._myKeyInfos[keyID].myPressed;\r\n }\r\n\r\n return pressed;\r\n }\r\n\r\n isKeyPressStart(keyID) {\r\n let pressStart = false;\r\n\r\n if (this._myKeyInfos[keyID] != null) {\r\n pressStart = this._myKeyInfos[keyID].myPressStart;\r\n }\r\n\r\n return pressStart;\r\n }\r\n\r\n isKeyPressEnd(keyID) {\r\n let pressEnd = false;\r\n\r\n if (this._myKeyInfos[keyID] != null) {\r\n pressEnd = this._myKeyInfos[keyID].myPressEnd;\r\n }\r\n\r\n return pressEnd;\r\n }\r\n\r\n addKey(keyID) {\r\n this._myKeyInfos[keyID] = this._createKeyInfo();\r\n this._myKeyInfosIDs.push(keyID);\r\n }\r\n\r\n start() {\r\n this._myActive = false;\r\n this.setActive(true);\r\n }\r\n\r\n update(dt) {\r\n if (!this._myActive) return;\r\n\r\n if (!document.hasFocus()) {\r\n for (let i = 0; i < this._myKeyInfosIDs.length; i++) {\r\n let id = this._myKeyInfosIDs[i];\r\n let keyInfo = this._myKeyInfos[id];\r\n if (keyInfo.myPressed) {\r\n keyInfo.myPressed = false;\r\n keyInfo.myPressEndToProcess = true;\r\n }\r\n }\r\n }\r\n\r\n for (let i = 0; i < this._myKeyInfosIDs.length; i++) {\r\n let id = this._myKeyInfosIDs[i];\r\n let keyInfo = this._myKeyInfos[id];\r\n keyInfo.myPressStart = keyInfo.myPressStartToProcess;\r\n keyInfo.myPressEnd = keyInfo.myPressEndToProcess;\r\n keyInfo.myPressStartToProcess = false;\r\n keyInfo.myPressEndToProcess = false;\r\n }\r\n }\r\n\r\n _keyDown(event) {\r\n if (event.repeat) return;\r\n\r\n this._keyPressedChanged(event.key, true);\r\n if (event.key != event.code) {\r\n this._keyPressedChanged(event.code, true);\r\n }\r\n }\r\n\r\n _keyUp(event) {\r\n this._keyPressedChanged(event.key, false);\r\n if (event.key != event.code) {\r\n this._keyPressedChanged(event.code, false);\r\n }\r\n }\r\n\r\n _keyPressedChanged(keyID, pressed) {\r\n if (this._myKeyInfos[keyID] != null) {\r\n let keyInfo = this._myKeyInfos[keyID];\r\n\r\n if (pressed != keyInfo.myPressed) {\r\n if (pressed) {\r\n keyInfo.myPressed = true;\r\n keyInfo.myPressStartToProcess = true;\r\n } else {\r\n keyInfo.myPressed = false;\r\n keyInfo.myPressEndToProcess = true;\r\n }\r\n }\r\n }\r\n }\r\n\r\n _createKeyInfo() {\r\n return { myPressed: false, myPressStart: false, myPressStartToProcess: false, myPressEnd: false, myPressEndToProcess: false, };\r\n }\r\n\r\n destroy() {\r\n this._myDestroyed = true;\r\n\r\n this.setActive(false);\r\n }\r\n\r\n isDestroyed() {\r\n return this._myDestroyed;\r\n }\r\n}", "import { Globals } from \"../../../pp/globals.js\";\r\nimport { Handedness } from \"../../cauldron/input_types.js\";\r\nimport { KeyID } from \"../../cauldron/keyboard.js\";\r\nimport { GamepadRawAxesData, GamepadRawButtonData } from \"../gamepad.js\";\r\nimport { GamepadButtonID } from \"../gamepad_buttons.js\";\r\nimport { GamepadCore } from \"./gamepad_core.js\";\r\n\r\nexport class KeyboardGamepadCore extends GamepadCore {\r\n\r\n constructor(handPose) {\r\n super(handPose);\r\n\r\n // Support Variables\r\n this._myButtonData = new GamepadRawButtonData();\r\n this._myAxesData = new GamepadRawAxesData();\r\n this._myHapticActuators = [];\r\n }\r\n\r\n isGamepadCoreActive() {\r\n return this.isActive();\r\n }\r\n\r\n getButtonData(buttonID) {\r\n this._myButtonData.reset();\r\n\r\n let keyboard = Globals.getKeyboard(this.getEngine());\r\n\r\n if (this.isGamepadCoreActive()) {\r\n if (this.getHandedness() == Handedness.LEFT) {\r\n switch (buttonID) {\r\n case GamepadButtonID.SELECT:\r\n this._myButtonData.myPressed = keyboard.isKeyPressed(KeyID.KeyE);\r\n break;\r\n case GamepadButtonID.SQUEEZE:\r\n this._myButtonData.myPressed = keyboard.isKeyPressed(KeyID.KeyQ);\r\n break;\r\n case GamepadButtonID.THUMBSTICK:\r\n this._myButtonData.myPressed = keyboard.isKeyPressed(KeyID.KeyR);\r\n break;\r\n case GamepadButtonID.TOP_BUTTON:\r\n this._myButtonData.myPressed = keyboard.isKeyPressed(KeyID.KeyF);\r\n break;\r\n case GamepadButtonID.BOTTOM_BUTTON:\r\n this._myButtonData.myPressed = keyboard.isKeyPressed(KeyID.KeyC);\r\n break;\r\n case GamepadButtonID.LEFT_BUTTON:\r\n this._myButtonData.myPressed = keyboard.isKeyPressed(KeyID.KeyX);\r\n break;\r\n case GamepadButtonID.RIGHT_BUTTON:\r\n this._myButtonData.myPressed = keyboard.isKeyPressed(KeyID.KeyV);\r\n break;\r\n case GamepadButtonID.MENU:\r\n this._myButtonData.myPressed = keyboard.isKeyPressed(KeyID.Digit3);\r\n break;\r\n case GamepadButtonID.TOUCHPAD:\r\n this._myButtonData.myPressed = keyboard.isKeyPressed(KeyID.Digit2);\r\n break;\r\n case GamepadButtonID.THUMB_REST:\r\n this._myButtonData.myPressed = keyboard.isKeyPressed(KeyID.Digit1);\r\n break;\r\n }\r\n } else {\r\n switch (buttonID) {\r\n case GamepadButtonID.SELECT:\r\n this._myButtonData.myPressed = keyboard.isKeyPressed(KeyID.KeyU);\r\n break;\r\n case GamepadButtonID.SQUEEZE:\r\n this._myButtonData.myPressed = keyboard.isKeyPressed(KeyID.KeyO);\r\n break;\r\n case GamepadButtonID.THUMBSTICK:\r\n this._myButtonData.myPressed = keyboard.isKeyPressed(KeyID.KeyY);\r\n break;\r\n case GamepadButtonID.TOP_BUTTON:\r\n this._myButtonData.myPressed = keyboard.isKeyPressed(KeyID.KeyH);\r\n break;\r\n case GamepadButtonID.BOTTOM_BUTTON:\r\n this._myButtonData.myPressed = keyboard.isKeyPressed(KeyID.KeyN);\r\n break;\r\n case GamepadButtonID.LEFT_BUTTON:\r\n this._myButtonData.myPressed = keyboard.isKeyPressed(KeyID.KeyB);\r\n break;\r\n case GamepadButtonID.RIGHT_BUTTON:\r\n this._myButtonData.myPressed = keyboard.isKeyPressed(KeyID.KeyM);\r\n break;\r\n case GamepadButtonID.MENU:\r\n this._myButtonData.myPressed = keyboard.isKeyPressed(KeyID.Digit8);\r\n break;\r\n case GamepadButtonID.TOUCHPAD:\r\n this._myButtonData.myPressed = keyboard.isKeyPressed(KeyID.Digit9);\r\n break;\r\n case GamepadButtonID.THUMB_REST:\r\n this._myButtonData.myPressed = keyboard.isKeyPressed(KeyID.Digit0);\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if (this._myButtonData.myPressed) {\r\n this._myButtonData.myTouched = true;\r\n this._myButtonData.myValue = 1;\r\n }\r\n\r\n return this._myButtonData;\r\n }\r\n\r\n getAxesData(axesID) {\r\n this._myAxesData.reset();\r\n\r\n let keyboard = Globals.getKeyboard(this.getEngine());\r\n\r\n if (this.isGamepadCoreActive()) {\r\n if (this.getHandedness() == Handedness.LEFT) {\r\n if (keyboard.isKeyPressed(KeyID.KeyW)) this._myAxesData.myAxes[1] += 1.0;\r\n if (keyboard.isKeyPressed(KeyID.KeyS)) this._myAxesData.myAxes[1] += -1.0;\r\n if (keyboard.isKeyPressed(KeyID.KeyD)) this._myAxesData.myAxes[0] += 1.0;\r\n if (keyboard.isKeyPressed(KeyID.KeyA)) this._myAxesData.myAxes[0] += -1.0;\r\n } else {\r\n if (keyboard.isKeyPressed(KeyID.KeyI) || keyboard.isKeyPressed(KeyID.UP)) this._myAxesData.myAxes[1] += 1.0;\r\n if (keyboard.isKeyPressed(KeyID.KeyK) || keyboard.isKeyPressed(KeyID.DOWN)) this._myAxesData.myAxes[1] += -1.0;\r\n if (keyboard.isKeyPressed(KeyID.KeyL) || keyboard.isKeyPressed(KeyID.RIGHT)) this._myAxesData.myAxes[0] += 1.0;\r\n if (keyboard.isKeyPressed(KeyID.KeyJ) || keyboard.isKeyPressed(KeyID.LEFT)) this._myAxesData.myAxes[0] += -1.0;\r\n }\r\n }\r\n\r\n return this._myAxesData;\r\n }\r\n\r\n getHapticActuators() {\r\n return this._myHapticActuators;\r\n }\r\n}", "// xr-standard mapping is assumed\r\n\r\nimport { XRUtils } from \"../../../cauldron/utils/xr_utils.js\";\r\nimport { GamepadRawAxesData, GamepadRawButtonData } from \"../gamepad.js\";\r\nimport { GamepadButtonID } from \"../gamepad_buttons.js\";\r\nimport { GamepadCore } from \"./gamepad_core.js\";\r\n\r\nexport class XRGamepadCore extends GamepadCore {\r\n\r\n constructor(handPose) {\r\n super(handPose);\r\n\r\n this._mySelectPressed = false;\r\n this._mySqueezePressed = false;\r\n\r\n this._myXRSessionActive = false;\r\n this._myInputSource = null;\r\n this._myGamepad = null;\r\n\r\n this._mySelectStartEventListener = null;\r\n this._mySelectEndEventListener = null;\r\n this._mySqueezeStartEventListener = null;\r\n this._mySqueezeEndEventListener = null;\r\n\r\n // Support Variables\r\n this._myButtonData = new GamepadRawButtonData();\r\n this._myAxesData = new GamepadRawAxesData();\r\n this._myHapticActuators = [];\r\n }\r\n\r\n isGamepadCoreActive() {\r\n // connected == null is to fix webxr emulator that leaves that field undefined\r\n return this.isActive() && this._myXRSessionActive && this._myGamepad != null && (this._myGamepad.connected == null || this._myGamepad.connected);\r\n }\r\n\r\n _setActiveHook(active) {\r\n if (this.isActive() != active) {\r\n if (active) {\r\n XRUtils.registerSessionStartEndEventListeners(this, this._onXRSessionStart.bind(this), this._onXRSessionEnd.bind(this), true, false, this.getEngine());\r\n } else {\r\n this._mySelectPressed = false;\r\n this._mySqueezePressed = false;\r\n\r\n this._myXRSessionActive = false;\r\n this._myInputSource = null;\r\n this._myGamepad = null;\r\n\r\n XRUtils.getSession(this.getEngine())?.removeEventListener(\"selectstart\", this._mySelectStartEventListener);\r\n XRUtils.getSession(this.getEngine())?.removeEventListener(\"selectend\", this._mySelectEndEventListener);\r\n XRUtils.getSession(this.getEngine())?.removeEventListener(\"squeezestart\", this._mySqueezeStartEventListener);\r\n XRUtils.getSession(this.getEngine())?.removeEventListener(\"squeezeend\", this._mySqueezeEndEventListener);\r\n\r\n XRUtils.unregisterSessionStartEndEventListeners(this, this.getEngine());\r\n\r\n this._mySelectStartEventListener = null;\r\n this._mySelectEndEventListener = null;\r\n this._mySqueezeStartEventListener = null;\r\n this._mySqueezeEndEventListener = null;\r\n }\r\n }\r\n }\r\n\r\n _preUpdateHook(dt) {\r\n let prevInputSource = this._myInputSource;\r\n this._myInputSource = this.getHandPose().getInputSource();\r\n\r\n if (prevInputSource != this._myInputSource) {\r\n this._mySelectPressed = false;\r\n this._mySqueezePressed = false;\r\n }\r\n\r\n if (this._myInputSource != null) {\r\n this._myGamepad = this._myInputSource.gamepad;\r\n } else {\r\n this._myGamepad = null;\r\n }\r\n }\r\n\r\n getButtonData(buttonID) {\r\n this._myButtonData.reset();\r\n\r\n if (this.isGamepadCoreActive()) {\r\n let button = null;\r\n\r\n switch (buttonID) {\r\n case GamepadButtonID.SELECT:\r\n button = this._myGamepad.buttons[0];\r\n break;\r\n case GamepadButtonID.SQUEEZE:\r\n button = this._myGamepad.buttons[1];\r\n break;\r\n case GamepadButtonID.THUMBSTICK:\r\n button = this._myGamepad.buttons[3];\r\n break;\r\n case GamepadButtonID.TOP_BUTTON:\r\n button = this._myGamepad.buttons[5];\r\n break;\r\n case GamepadButtonID.BOTTOM_BUTTON:\r\n button = this._myGamepad.buttons[4];\r\n break;\r\n case GamepadButtonID.LEFT_BUTTON:\r\n button = null;\r\n break;\r\n case GamepadButtonID.RIGHT_BUTTON:\r\n button = null;\r\n break;\r\n case GamepadButtonID.MENU:\r\n {\r\n const inputSourceProfiles = this._myInputSource.profiles;\r\n if (inputSourceProfiles.includes(\"oculus-touch-v3\") || inputSourceProfiles.includes(\"meta-quest-touch-pro\")) {\r\n button = this._myGamepad.buttons[this._myGamepad.buttons.length - 1];\r\n }\r\n\r\n break;\r\n }\r\n case GamepadButtonID.TOUCHPAD:\r\n button = this._myGamepad.buttons[2];\r\n break;\r\n case GamepadButtonID.THUMB_REST:\r\n button = this._myGamepad.buttons[6];\r\n break;\r\n }\r\n\r\n if (button != null) {\r\n this._myButtonData.myPressed = button.pressed;\r\n this._myButtonData.myTouched = button.touched;\r\n this._myButtonData.myValue = button.value;\r\n }\r\n }\r\n\r\n return this._myButtonData;\r\n }\r\n\r\n getAxesData(axesID) {\r\n this._myAxesData.reset();\r\n\r\n if (this.isGamepadCoreActive()) {\r\n let internalAxes = this._myGamepad.axes;\r\n if (internalAxes.length == 4) {\r\n // In this case it could be both touch axes or thumbstick axes, that depends on the gamepad\r\n // to support both I simply choose the absolute max value (unused axes will always be 0)\r\n\r\n // X\r\n if (Math.abs(internalAxes[0]) > Math.abs(internalAxes[2])) {\r\n this._myAxesData.myAxes[0] = internalAxes[0];\r\n } else {\r\n this._myAxesData.myAxes[0] = internalAxes[2];\r\n }\r\n\r\n // Y\r\n if (Math.abs(internalAxes[1]) > Math.abs(internalAxes[3])) {\r\n this._myAxesData.myAxes[1] = internalAxes[1];\r\n } else {\r\n this._myAxesData.myAxes[1] = internalAxes[3];\r\n }\r\n\r\n } else if (internalAxes.length == 2) {\r\n this._myAxesData.myAxes[0] = internalAxes[0];\r\n this._myAxesData.myAxes[1] = internalAxes[1];\r\n }\r\n\r\n // Y axis is recorded negative when thumbstick is pressed forward for weird reasons\r\n this._myAxesData.myAxes[1] = -this._myAxesData.myAxes[1];\r\n }\r\n\r\n return this._myAxesData;\r\n }\r\n\r\n getHapticActuators() {\r\n this._myHapticActuators.pp_clear();\r\n\r\n if (this.isGamepadCoreActive()) {\r\n if (this._myGamepad.hapticActuators != null) {\r\n for (let i = 0; i < this._myGamepad.hapticActuators.length; i++) {\r\n this._myHapticActuators.push(this._myGamepad.hapticActuators[i]);\r\n }\r\n }\r\n\r\n if (this._myGamepad.vibrationActuator != null) {\r\n this._myHapticActuators.push(this._myGamepad.vibrationActuator);\r\n }\r\n }\r\n\r\n return this._myHapticActuators;\r\n }\r\n\r\n // This is to be more compatible\r\n _getSpecialButtonPressed(buttonID) {\r\n let pressed = false;\r\n\r\n if (this.isGamepadCoreActive()) {\r\n if (buttonID == GamepadButtonID.SELECT) {\r\n pressed = this._mySelectPressed;\r\n } else if (buttonID == GamepadButtonID.SQUEEZE) {\r\n pressed = this._mySqueezePressed;\r\n }\r\n }\r\n\r\n return pressed;\r\n }\r\n\r\n _onXRSessionStart(session) {\r\n this._mySelectStartEventListener = this._selectStart.bind(this);\r\n this._mySelectEndEventListener = this._selectEnd.bind(this);\r\n this._mySqueezeStartEventListener = this._squeezeStart.bind(this);\r\n this._mySqueezeEndEventListener = this._squeezeEnd.bind(this);\r\n\r\n session.addEventListener(\"selectstart\", this._mySelectStartEventListener);\r\n session.addEventListener(\"selectend\", this._mySelectEndEventListener);\r\n\r\n session.addEventListener(\"squeezestart\", this._mySqueezeStartEventListener);\r\n session.addEventListener(\"squeezeend\", this._mySqueezeEndEventListener);\r\n\r\n this._myXRSessionActive = true;\r\n }\r\n\r\n _onXRSessionEnd(session) {\r\n this._mySelectStartEventListener = null;\r\n this._mySelectEndEventListener = null;\r\n this._mySqueezeStartEventListener = null;\r\n this._mySqueezeEndEventListener = null;\r\n\r\n this._mySelectPressed = false;\r\n this._mySqueezePressed = false;\r\n\r\n this._myXRSessionActive = false;\r\n }\r\n\r\n // Select and Squeeze are managed this way to be more compatible\r\n _selectStart(event) {\r\n if (this._myInputSource != null && this._myInputSource == event.inputSource) {\r\n this._mySelectPressed = true;\r\n }\r\n }\r\n\r\n _selectEnd(event) {\r\n if (this._myInputSource != null && this._myInputSource == event.inputSource) {\r\n this._mySelectPressed = false;\r\n }\r\n }\r\n\r\n _squeezeStart(event) {\r\n if (this._myInputSource != null && this._myInputSource == event.inputSource) {\r\n this._mySqueezePressed = true;\r\n }\r\n }\r\n\r\n _squeezeEnd(event) {\r\n if (this._myInputSource != null && this._myInputSource == event.inputSource) {\r\n this._mySqueezePressed = false;\r\n }\r\n }\r\n}", "import { Emitter, WonderlandEngine } from \"@wonderlandengine/api\";\r\nimport { Globals } from \"../../pp/globals.js\";\r\nimport { GamepadsManager } from \"../gamepad/cauldron/gamepads_manager.js\";\r\nimport { BasePoseParams } from \"../pose/base_pose.js\";\r\nimport { HandPose, HandPoseParams } from \"../pose/hand_pose.js\";\r\nimport { HandRayPose, HandRayPoseParams } from \"../pose/hand_ray_pose.js\";\r\nimport { HeadPose } from \"../pose/head_pose.js\";\r\nimport { TrackedHandPose, TrackedHandPoseParams } from \"../pose/tracked_hand_pose.js\";\r\nimport { Handedness } from \"./input_types.js\";\r\nimport { Keyboard } from \"./keyboard.js\";\r\nimport { Mouse } from \"./mouse.js\";\r\n\r\nexport class InputManager {\r\n\r\n private readonly _myMouse: Mouse;\r\n private readonly _myKeyboard: Keyboard;\r\n\r\n private readonly _myHeadPose: HeadPose;\r\n\r\n private readonly _myHandPoses: Record;\r\n private readonly _myHandRayPoses: Record;\r\n\r\n private readonly _myTrackedHandPoses: Record;\r\n\r\n private readonly _myGamepadsManager: GamepadsManager = new GamepadsManager();\r\n\r\n private _myStarted: boolean = false;\r\n private _myActive: boolean = true;\r\n\r\n private _myTrackedHandPosesEnabled: boolean = true;\r\n private _myTrackedHandPosesStarted: boolean = false;\r\n\r\n private readonly _myPreUpdateEmitter: Emitter<[number, InputManager]> = new Emitter();\r\n private readonly _myPostUpdateEmitter: Emitter<[number, InputManager]> = new Emitter();\r\n\r\n private readonly _myEngine: Readonly;\r\n\r\n private _myDestroyed: boolean = false;\r\n\r\n constructor(engine: Readonly = Globals.getMainEngine()!) {\r\n this._myEngine = engine;\r\n\r\n this._myMouse = new Mouse(this._myEngine as any);\r\n this._myKeyboard = new Keyboard(this._myEngine as any);\r\n\r\n this._myHeadPose = new HeadPose(new BasePoseParams(this._myEngine as any));\r\n this._myHeadPose.setReferenceObject(Globals.getPlayerObjects(this._myEngine)!.myReferenceSpace);\r\n this._myHeadPose.setForwardFixed(Globals.isPoseForwardFixed(this._myEngine));\r\n\r\n this._myHandPoses = {\r\n [Handedness.LEFT]: new HandPose(Handedness.LEFT, new HandPoseParams(this._myEngine)),\r\n [Handedness.RIGHT]: new HandPose(Handedness.RIGHT, new HandPoseParams(this._myEngine))\r\n };\r\n this._myHandPoses[Handedness.LEFT].setReferenceObject(Globals.getPlayerObjects(this._myEngine)!.myReferenceSpace);\r\n this._myHandPoses[Handedness.RIGHT].setReferenceObject(Globals.getPlayerObjects(this._myEngine)!.myReferenceSpace);\r\n this._myHandPoses[Handedness.LEFT].setForwardFixed(Globals.isPoseForwardFixed(this._myEngine));\r\n this._myHandPoses[Handedness.RIGHT].setForwardFixed(Globals.isPoseForwardFixed(this._myEngine));\r\n\r\n this._myHandRayPoses = {\r\n [Handedness.LEFT]: new HandRayPose(Handedness.LEFT, new HandRayPoseParams(this._myEngine)),\r\n [Handedness.RIGHT]: new HandRayPose(Handedness.RIGHT, new HandRayPoseParams(this._myEngine))\r\n };\r\n this._myHandRayPoses[Handedness.LEFT].setReferenceObject(Globals.getPlayerObjects(this._myEngine)!.myReferenceSpace);\r\n this._myHandRayPoses[Handedness.RIGHT].setReferenceObject(Globals.getPlayerObjects(this._myEngine)!.myReferenceSpace);\r\n this._myHandRayPoses[Handedness.LEFT].setForwardFixed(Globals.isPoseForwardFixed(this._myEngine));\r\n this._myHandRayPoses[Handedness.RIGHT].setForwardFixed(Globals.isPoseForwardFixed(this._myEngine));\r\n\r\n this._myTrackedHandPoses = {\r\n [Handedness.LEFT]: new TrackedHandPose(Handedness.LEFT, new TrackedHandPoseParams(true, this._myEngine as any)),\r\n [Handedness.RIGHT]: new TrackedHandPose(Handedness.RIGHT, new TrackedHandPoseParams(true, this._myEngine as any))\r\n };\r\n this._myTrackedHandPoses[Handedness.LEFT].setReferenceObject(Globals.getPlayerObjects(this._myEngine)!.myReferenceSpace);\r\n this._myTrackedHandPoses[Handedness.RIGHT].setReferenceObject(Globals.getPlayerObjects(this._myEngine)!.myReferenceSpace);\r\n this._myTrackedHandPoses[Handedness.LEFT].setForwardFixed(Globals.isPoseForwardFixed(this._myEngine));\r\n this._myTrackedHandPoses[Handedness.RIGHT].setForwardFixed(Globals.isPoseForwardFixed(this._myEngine));\r\n }\r\n\r\n public setActive(active: boolean): void {\r\n this._myActive = active;\r\n\r\n this._myMouse.setActive(active);\r\n this._myKeyboard.setActive(active);\r\n\r\n this._myHeadPose.setActive(active);\r\n\r\n for (const rawHandedness in this._myHandPoses) {\r\n const handedness = rawHandedness as Handedness;\r\n this._myHandPoses[handedness].setActive(active);\r\n }\r\n\r\n for (const rawHandedness in this._myHandRayPoses) {\r\n const handedness = rawHandedness as Handedness;\r\n this._myHandRayPoses[handedness].setActive(active);\r\n }\r\n\r\n for (const rawHandedness in this._myTrackedHandPoses) {\r\n const handedness = rawHandedness as Handedness;\r\n this._myTrackedHandPoses[handedness].setActive(active);\r\n }\r\n\r\n this._myGamepadsManager.setActive(active);\r\n }\r\n\r\n public isActive(): boolean {\r\n return this._myActive;\r\n }\r\n\r\n public start(): void {\r\n this._myMouse.start();\r\n this._myKeyboard.start();\r\n\r\n this._myHeadPose.setReferenceObject(Globals.getPlayerObjects(this._myEngine)!.myReferenceSpace);\r\n this._myHeadPose.setForwardFixed(Globals.isPoseForwardFixed(this._myEngine));\r\n this._myHeadPose.start();\r\n\r\n for (const rawHandedness in this._myHandPoses) {\r\n const handedness = rawHandedness as Handedness;\r\n this._myHandPoses[handedness].setReferenceObject(Globals.getPlayerObjects(this._myEngine)!.myReferenceSpace);\r\n this._myHandPoses[handedness].setForwardFixed(Globals.isPoseForwardFixed(this._myEngine));\r\n this._myHandPoses[handedness].start();\r\n }\r\n\r\n for (const rawHandedness in this._myHandRayPoses) {\r\n const handedness = rawHandedness as Handedness;\r\n this._myHandRayPoses[handedness].setReferenceObject(Globals.getPlayerObjects(this._myEngine)!.myReferenceSpace);\r\n this._myHandRayPoses[handedness].setForwardFixed(Globals.isPoseForwardFixed(this._myEngine));\r\n this._myHandRayPoses[handedness].start();\r\n }\r\n\r\n if (this._myTrackedHandPosesEnabled) {\r\n this._startTrackedHandPoses();\r\n }\r\n\r\n this._myGamepadsManager.start();\r\n\r\n this._myStarted = true;\r\n }\r\n\r\n public update(dt: number): void {\r\n if (!this._myActive) return;\r\n\r\n this._myPreUpdateEmitter.notify(dt, this);\r\n\r\n this._myMouse.update(dt);\r\n this._myKeyboard.update(dt);\r\n\r\n this._myHeadPose.setReferenceObject(Globals.getPlayerObjects(this._myEngine)!.myReferenceSpace);\r\n this._myHeadPose.setForwardFixed(Globals.isPoseForwardFixed(this._myEngine));\r\n this._myHeadPose.update(dt);\r\n\r\n for (const rawHandedness in this._myHandPoses) {\r\n const handedness = rawHandedness as Handedness;\r\n this._myHandPoses[handedness].setReferenceObject(Globals.getPlayerObjects(this._myEngine)!.myReferenceSpace);\r\n this._myHandPoses[handedness].setForwardFixed(Globals.isPoseForwardFixed(this._myEngine));\r\n this._myHandPoses[handedness].update(dt);\r\n }\r\n\r\n\r\n for (const rawHandedness in this._myHandRayPoses) {\r\n const handedness = rawHandedness as Handedness;\r\n this._myHandRayPoses[handedness].setReferenceObject(Globals.getPlayerObjects(this._myEngine)!.myReferenceSpace);\r\n this._myHandRayPoses[handedness].setForwardFixed(Globals.isPoseForwardFixed(this._myEngine));\r\n this._myHandRayPoses[handedness].update(dt);\r\n }\r\n\r\n this._updateTrackedHandPoses(dt);\r\n\r\n this._myGamepadsManager.update(dt);\r\n\r\n this._myPostUpdateEmitter.notify(dt, this);\r\n }\r\n\r\n public getMouse(): Mouse {\r\n return this._myMouse;\r\n }\r\n\r\n public getKeyboard(): Keyboard {\r\n return this._myKeyboard;\r\n }\r\n\r\n public getGamepadsManager(): GamepadsManager {\r\n return this._myGamepadsManager;\r\n }\r\n\r\n public getHeadPose(): HeadPose {\r\n return this._myHeadPose;\r\n }\r\n\r\n public getLeftHandPose(): HandPose {\r\n return this._myHandPoses[Handedness.LEFT];\r\n }\r\n\r\n public getRightHandPose(): HandPose {\r\n return this._myHandPoses[Handedness.RIGHT];\r\n }\r\n\r\n public getHandPose(handedness: Handedness): HandPose {\r\n return this._myHandPoses[handedness];\r\n }\r\n\r\n public getHandPoses(): Record {\r\n return this._myHandPoses;\r\n }\r\n\r\n public getLeftHandRayPose(): HandPose {\r\n return this._myHandRayPoses[Handedness.LEFT];\r\n }\r\n\r\n public getRightHandRayPose(): HandPose {\r\n return this._myHandRayPoses[Handedness.RIGHT];\r\n }\r\n\r\n public getHandRayPose(handedness: Handedness): HandPose {\r\n return this._myHandRayPoses[handedness];\r\n }\r\n\r\n public getHandRayPoses(): Record {\r\n return this._myHandRayPoses;\r\n }\r\n\r\n public getLeftTrackedHandPose(): TrackedHandPose {\r\n return this._myTrackedHandPoses[Handedness.LEFT];\r\n }\r\n\r\n public getRightTrackedHandPose(): TrackedHandPose {\r\n return this._myTrackedHandPoses[Handedness.RIGHT];\r\n }\r\n\r\n public getTrackedHandPose(handedness: Handedness): TrackedHandPose {\r\n return this._myTrackedHandPoses[handedness];\r\n }\r\n\r\n public getTrackedHandPoses(): Record {\r\n return this._myTrackedHandPoses;\r\n }\r\n\r\n public areTrackedHandPosesEnabled(): boolean {\r\n return this._myTrackedHandPosesEnabled;\r\n }\r\n\r\n public setTrackedHandPosesEnabled(enabled: boolean): void {\r\n this._myTrackedHandPosesEnabled = enabled;\r\n\r\n if (this._myStarted && this._myTrackedHandPosesEnabled) {\r\n this._startTrackedHandPoses();\r\n }\r\n }\r\n\r\n public registerPreUpdateCallback(id: unknown, callback: (dt: number, inputManager: InputManager) => void): void {\r\n this._myPreUpdateEmitter.add(callback, { id: id });\r\n }\r\n\r\n public unregisterPreUpdateCallback(id: unknown): void {\r\n this._myPreUpdateEmitter.remove(id);\r\n }\r\n\r\n public registerPostUpdateCallback(id: unknown, callback: (dt: number, inputManager: InputManager) => void): void {\r\n this._myPostUpdateEmitter.add(callback, { id: id });\r\n }\r\n\r\n public unregisterPostUpdateCallback(id: unknown): void {\r\n this._myPostUpdateEmitter.remove(id);\r\n }\r\n\r\n private _startTrackedHandPoses(): void {\r\n if (!this._myTrackedHandPosesStarted) {\r\n for (const rawHandedness in this._myTrackedHandPoses) {\r\n const handedness = rawHandedness as Handedness;\r\n this._myTrackedHandPoses[handedness].setReferenceObject(Globals.getPlayerObjects(this._myEngine)!.myReferenceSpace);\r\n this._myTrackedHandPoses[handedness].setForwardFixed(Globals.isPoseForwardFixed(this._myEngine));\r\n this._myTrackedHandPoses[handedness].start();\r\n }\r\n\r\n this._myTrackedHandPosesStarted = true;\r\n }\r\n }\r\n\r\n private _updateTrackedHandPoses(dt: number): void {\r\n if (this._myTrackedHandPosesEnabled && this._myTrackedHandPosesStarted) {\r\n for (const rawHandedness in this._myTrackedHandPoses) {\r\n const handedness = rawHandedness as Handedness;\r\n this._myTrackedHandPoses[handedness].setReferenceObject(Globals.getPlayerObjects(this._myEngine)!.myReferenceSpace);\r\n this._myTrackedHandPoses[handedness].setForwardFixed(Globals.isPoseForwardFixed(this._myEngine));\r\n this._myTrackedHandPoses[handedness].update(dt);\r\n }\r\n }\r\n }\r\n\r\n public destroy(): void {\r\n this._myDestroyed = true;\r\n\r\n this.setActive(false);\r\n\r\n this._myMouse.destroy();\r\n this._myKeyboard.destroy();\r\n\r\n this._myHeadPose.destroy();\r\n\r\n for (const rawHandedness in this._myHandPoses) {\r\n const handedness = rawHandedness as Handedness;\r\n this._myHandPoses[handedness].destroy();\r\n }\r\n\r\n for (const rawHandedness in this._myHandRayPoses) {\r\n const handedness = rawHandedness as Handedness;\r\n this._myHandRayPoses[handedness].destroy();\r\n }\r\n\r\n for (const rawHandedness in this._myTrackedHandPoses) {\r\n const handedness = rawHandedness as Handedness;\r\n this._myTrackedHandPoses[handedness].destroy();\r\n }\r\n\r\n this._myGamepadsManager.destroy();\r\n }\r\n\r\n public isDestroyed(): boolean {\r\n return this._myDestroyed;\r\n }\r\n}", "import { Handedness } from \"../cauldron/input_types.js\";\r\nimport { HandPose } from \"../pose/hand_pose.js\";\r\nimport { Gamepad, GamepadRawAxesData, GamepadRawButtonData } from \"./gamepad.js\";\r\nimport { GamepadAxesID, GamepadButtonID } from \"./gamepad_buttons.js\";\r\nimport { GamepadCore } from \"./gamepad_cores/gamepad_core.js\";\r\n\r\nexport class UniversalGamepad extends Gamepad {\r\n\r\n // Switched to `object` instead of `Map` for memory optimization reasons since iterating allocates a lot\r\n private _myGamepadCores: Record = {};\r\n private _myGamepadCoresIDs: string[] = [];\r\n\r\n private _myStarted = false;\r\n\r\n // Support Variables\r\n private readonly _myButtonData = new GamepadRawButtonData();\r\n private readonly _myAxesData = new GamepadRawAxesData();\r\n private readonly _myHapticActuators: GamepadHapticActuator[] = [];\r\n\r\n constructor(handedness: Handedness) {\r\n super(handedness);\r\n }\r\n\r\n public addGamepadCore(id: string, gamepadCore: GamepadCore): void {\r\n if (gamepadCore.getHandedness() == this.getHandedness()) {\r\n this._myGamepadCores[id] = gamepadCore;\r\n this._myGamepadCoresIDs.pp_pushUnique(id);\r\n\r\n if (this._myStarted) {\r\n gamepadCore.start();\r\n gamepadCore.setActive(this.isActive());\r\n }\r\n }\r\n }\r\n\r\n public getGamepadCore(id: string): GamepadCore {\r\n return this._myGamepadCores[id];\r\n }\r\n\r\n public removeGamepadCore(id: string): void {\r\n const gamepadCore = this._myGamepadCores[id];\r\n if (gamepadCore != null) {\r\n delete this._myGamepadCores[id];\r\n this._myGamepadCoresIDs.pp_removeEqual(id);\r\n }\r\n }\r\n\r\n public removeAllGamepadCores(): void {\r\n this._myGamepadCores = {};\r\n this._myGamepadCoresIDs = [];\r\n }\r\n\r\n public override getHandPose(): HandPose {\r\n let handPose = null;\r\n\r\n for (let i = 0; i < this._myGamepadCoresIDs.length; i++) {\r\n const id = this._myGamepadCoresIDs[i];\r\n const core = this._myGamepadCores[id];\r\n if (core.isGamepadCoreActive()) {\r\n const currentCoreHandPose = core.getHandPose();\r\n if (handPose == null || (currentCoreHandPose != null && currentCoreHandPose.isValid())) {\r\n handPose = currentCoreHandPose;\r\n }\r\n }\r\n\r\n if (handPose != null && handPose.isValid()) {\r\n break;\r\n }\r\n }\r\n\r\n return handPose;\r\n }\r\n\r\n protected override _setActiveHook(active: boolean): void {\r\n for (let i = 0; i < this._myGamepadCoresIDs.length; i++) {\r\n const id = this._myGamepadCoresIDs[i];\r\n const core = this._myGamepadCores[id];\r\n core.setActive(active);\r\n }\r\n }\r\n\r\n protected override _startHook(): void {\r\n for (let i = 0; i < this._myGamepadCoresIDs.length; i++) {\r\n const id = this._myGamepadCoresIDs[i];\r\n const core = this._myGamepadCores[id];\r\n core.start();\r\n core.setActive(this.isActive());\r\n }\r\n\r\n this._myStarted = true;\r\n }\r\n\r\n protected override _preUpdate(dt: number): void {\r\n for (let i = 0; i < this._myGamepadCoresIDs.length; i++) {\r\n const id = this._myGamepadCoresIDs[i];\r\n const core = this._myGamepadCores[id];\r\n core.preUpdate(dt);\r\n }\r\n }\r\n\r\n protected override _postUpdate(dt: number): void {\r\n for (let i = 0; i < this._myGamepadCoresIDs.length; i++) {\r\n const id = this._myGamepadCoresIDs[i];\r\n const core = this._myGamepadCores[id];\r\n core.postUpdate(dt);\r\n }\r\n }\r\n\r\n protected override _getButtonData(buttonID: GamepadButtonID): GamepadRawButtonData {\r\n this._myButtonData.reset();\r\n\r\n for (let i = 0; i < this._myGamepadCoresIDs.length; i++) {\r\n const id = this._myGamepadCoresIDs[i];\r\n const core = this._myGamepadCores[id];\r\n if (core.isGamepadCoreActive()) {\r\n const coreButtonData = core.getButtonData(buttonID);\r\n this._myButtonData.myPressed = this._myButtonData.myPressed || coreButtonData.myPressed;\r\n this._myButtonData.myTouched = this._myButtonData.myTouched || coreButtonData.myTouched;\r\n if (Math.abs(coreButtonData.myValue) > Math.abs(this._myButtonData.myValue)) {\r\n this._myButtonData.myValue = coreButtonData.myValue;\r\n }\r\n }\r\n }\r\n\r\n return this._myButtonData;\r\n }\r\n\r\n protected override _getAxesData(axesID: GamepadAxesID): GamepadRawAxesData {\r\n this._myAxesData.reset();\r\n\r\n for (let i = 0; i < this._myGamepadCoresIDs.length; i++) {\r\n const id = this._myGamepadCoresIDs[i];\r\n const core = this._myGamepadCores[id];\r\n if (core.isGamepadCoreActive()) {\r\n const coreAxesData = core.getAxesData(axesID);\r\n\r\n if (Math.abs(coreAxesData.myAxes[0]) > Math.abs(this._myAxesData.myAxes[0])) {\r\n this._myAxesData.myAxes[0] = coreAxesData.myAxes[0];\r\n }\r\n\r\n if (Math.abs(coreAxesData.myAxes[1]) > Math.abs(this._myAxesData.myAxes[1])) {\r\n this._myAxesData.myAxes[1] = coreAxesData.myAxes[1];\r\n }\r\n }\r\n }\r\n\r\n return this._myAxesData;\r\n }\r\n\r\n protected override _getHapticActuators(): GamepadHapticActuator[] {\r\n this._myHapticActuators.pp_clear();\r\n\r\n for (let i = 0; i < this._myGamepadCoresIDs.length; i++) {\r\n const id = this._myGamepadCoresIDs[i];\r\n const core = this._myGamepadCores[id];\r\n if (core.isGamepadCoreActive()) {\r\n const coreHapticActuators = core.getHapticActuators();\r\n for (let j = 0; j < coreHapticActuators.length; j++) {\r\n this._myHapticActuators.push(coreHapticActuators[j]);\r\n }\r\n }\r\n }\r\n\r\n return this._myHapticActuators;\r\n }\r\n\r\n protected override _destroyHook(): void {\r\n for (let i = 0; i < this._myGamepadCoresIDs.length; i++) {\r\n const id = this._myGamepadCoresIDs[i];\r\n const core = this._myGamepadCores[id];\r\n core.destroy();\r\n }\r\n }\r\n}", "import { Handedness } from \"../../cauldron/input_types.js\";\r\nimport { Gamepad } from \"../gamepad.js\";\r\nimport { UniversalGamepad } from \"../universal_gamepad.js\";\r\n\r\nexport class GamepadsManager {\r\n\r\n private readonly _myUniversalGamepads: Record;\r\n\r\n private _myActive: boolean = true;\r\n private _myDestroyed: boolean = false;\r\n\r\n constructor() {\r\n this._myUniversalGamepads = {\r\n [Handedness.LEFT]: new UniversalGamepad(Handedness.LEFT),\r\n [Handedness.RIGHT]: new UniversalGamepad(Handedness.RIGHT)\r\n };\r\n\r\n this._myDestroyed = false;\r\n }\r\n\r\n public setActive(active: boolean): void {\r\n this._myActive = active;\r\n\r\n for (const rawHandedness in this._myUniversalGamepads) {\r\n const handedness = rawHandedness as Handedness;\r\n this._myUniversalGamepads[handedness].setActive(active);\r\n }\r\n }\r\n\r\n public isActive(): boolean {\r\n return this._myActive;\r\n }\r\n\r\n public start(): void {\r\n for (const rawHandedness in this._myUniversalGamepads) {\r\n const handedness = rawHandedness as Handedness;\r\n this._myUniversalGamepads[handedness].start();\r\n }\r\n }\r\n\r\n public update(dt: number): void {\r\n if (!this._myActive) return;\r\n\r\n for (const rawHandedness in this._myUniversalGamepads) {\r\n const handedness = rawHandedness as Handedness;\r\n this._myUniversalGamepads[handedness].update(dt);\r\n }\r\n }\r\n\r\n public getGamepad(handedness: Handedness): Gamepad {\r\n return this._myUniversalGamepads[handedness];\r\n }\r\n\r\n public getGamepads(): Record {\r\n return this._myUniversalGamepads;\r\n }\r\n\r\n public getLeftGamepad(): Gamepad {\r\n return this._myUniversalGamepads[Handedness.LEFT];\r\n }\r\n\r\n public getRightGamepad(): Gamepad {\r\n return this._myUniversalGamepads[Handedness.RIGHT];\r\n }\r\n\r\n public getUniversalGamepad(handedness: Handedness): UniversalGamepad {\r\n return this._myUniversalGamepads[handedness];\r\n }\r\n\r\n public getUniversalGamepads(): Record {\r\n return this._myUniversalGamepads;\r\n }\r\n\r\n public getLeftUniversalGamepad(): UniversalGamepad {\r\n return this._myUniversalGamepads[Handedness.LEFT];\r\n }\r\n\r\n public getRightUniversalGamepad(): UniversalGamepad {\r\n return this._myUniversalGamepads[Handedness.RIGHT];\r\n }\r\n\r\n public destroy(): void {\r\n this._myDestroyed = true;\r\n\r\n this.setActive(false);\r\n\r\n for (const rawHandedness in this._myUniversalGamepads) {\r\n const handedness = rawHandedness as Handedness;\r\n this._myUniversalGamepads[handedness].destroy();\r\n }\r\n }\r\n\r\n public isDestroyed(): boolean {\r\n return this._myDestroyed;\r\n }\r\n}", "import { Emitter } from \"@wonderlandengine/api\";\r\nimport { XRUtils } from \"../../cauldron/utils/xr_utils.js\";\r\nimport { mat4_create, quat2_create, quat_create, vec3_create } from \"../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Globals } from \"../../pp/globals.js\";\r\n\r\nexport class BasePoseParams {\r\n\r\n constructor(engine = Globals.getMainEngine()) {\r\n this.myReferenceObject = null;\r\n this.myForwardFixed = true;\r\n this.myUpdateOnViewReset = false;\r\n this.myForceEmulatedVelocities = false;\r\n\r\n this.myEngine = engine;\r\n }\r\n}\r\n\r\n// BasePose transform is local by default (as if the parent/reference object was the identity transform)\r\n// You can use setReferenceObject if you want the BasePose to return the transform in world space \r\nexport class BasePose {\r\n\r\n constructor(basePoseParams = new BasePoseParams()) {\r\n this._myForwardFixed = basePoseParams.myForwardFixed;\r\n this._myForceEmulatedVelocities = basePoseParams.myForceEmulatedVelocities;\r\n this._myUpdateOnViewReset = basePoseParams.myUpdateOnViewReset;\r\n\r\n this._myReferenceObject = basePoseParams.myReferenceObject;\r\n\r\n this._myEngine = basePoseParams.myEngine;\r\n\r\n this._myPosition = vec3_create();\r\n this._myRotationQuat = quat_create();\r\n\r\n this._myPrevPosition = vec3_create();\r\n this._myPrevRotationQuat = quat_create();\r\n\r\n this._myLinearVelocity = vec3_create();\r\n this._myAngularVelocityRadians = vec3_create();\r\n\r\n this._myActive = true;\r\n\r\n this._myValid = false;\r\n this._myLinearVelocityEmulated = true;\r\n this._myAngularVelocityEmulated = true;\r\n\r\n this._myPrePoseUpdatedEventEmitter = new Emitter(); // Signature: listener(dt, pose, manualUpdate)\r\n this._myPoseUpdatedEmitter = new Emitter(); // Signature: listener(dt, pose, manualUpdate)\r\n this._myPostPoseUpdatedEventEmitter = new Emitter(); // Signature: listener(dt, pose, manualUpdate)\r\n\r\n this._myViewResetEventListener = null;\r\n\r\n this._myDestroyed = false;\r\n }\r\n\r\n getEngine() {\r\n return this._myEngine;\r\n }\r\n\r\n setActive(active) {\r\n if (this._myActive != active) {\r\n if (active) {\r\n XRUtils.registerSessionStartEndEventListeners(this, this._onXRSessionStart.bind(this), this._onXRSessionEnd.bind(this), true, true, this._myEngine);\r\n } else {\r\n this._myPosition.vec3_zero();\r\n this._myRotationQuat.quat_identity();\r\n\r\n this._myPrevPosition.vec3_zero();\r\n this._myPrevRotationQuat.quat_identity();\r\n\r\n this._myLinearVelocity.vec3_zero();\r\n this._myAngularVelocityRadians.vec3_zero();\r\n\r\n this._myValid = false;\r\n\r\n this._myLinearVelocityEmulated = true;\r\n this._myAngularVelocityEmulated = true;\r\n\r\n if (this._myViewResetEventListener != null) {\r\n XRUtils.getReferenceSpace(this._myEngine)?.removeEventListener?.(\"reset\", this._myViewResetEventListener);\r\n }\r\n\r\n this._myViewResetEventListener = null;\r\n\r\n XRUtils.unregisterSessionStartEndEventListeners(this, this._myEngine);\r\n }\r\n }\r\n\r\n this._setActiveHook(active);\r\n\r\n this._myActive = active;\r\n }\r\n\r\n isActive() {\r\n return this._myActive;\r\n }\r\n\r\n // If the reference object is set, the transform will be converted using it as a parent,\r\n // otherwise the transform will be local, as if the parent/reference object was the identity transform\r\n setReferenceObject(referenceObject) {\r\n this._myReferenceObject = referenceObject;\r\n }\r\n\r\n getReferenceObject() {\r\n return this._myReferenceObject;\r\n }\r\n\r\n setForwardFixed(forwardFixed) {\r\n this._myForwardFixed = forwardFixed;\r\n }\r\n\r\n isForwardFixed() {\r\n return this._myForwardFixed;\r\n }\r\n\r\n setForceEmulatedVelocities(forceEmulatedVelocities) {\r\n this._myForceEmulatedVelocities = forceEmulatedVelocities;\r\n }\r\n\r\n isForceEmulatedVelocities() {\r\n return this._myForceEmulatedVelocities;\r\n }\r\n\r\n setUpdateOnViewReset(updateOnViewReset) {\r\n this._myUpdateOnViewReset = updateOnViewReset;\r\n }\r\n\r\n isUpdateOnViewReset() {\r\n return this._myUpdateOnViewReset;\r\n }\r\n\r\n getReferenceSpace() {\r\n return XRUtils.getReferenceSpace(this._myEngine);\r\n }\r\n\r\n getPosition(out = vec3_create(), referenceObjectOverride = undefined) {\r\n // Implemented outside class definition\r\n }\r\n\r\n getRotation(out = vec3_create(), referenceObjectOverride = undefined) {\r\n return this.getRotationDegrees(out, referenceObjectOverride);\r\n }\r\n\r\n getRotationDegrees(out = vec3_create(), referenceObjectOverride = undefined) {\r\n // Implemented outside class definition\r\n }\r\n\r\n getRotationRadians(out = vec3_create(), referenceObjectOverride = undefined) {\r\n // Implemented outside class definition\r\n }\r\n\r\n getRotationQuat(out = quat_create(), referenceObjectOverride = undefined) {\r\n // Implemented outside class definition\r\n }\r\n\r\n getTransform(out = mat4_create(), referenceObjectOverride = undefined) {\r\n return this.getTransformMatrix(out, referenceObjectOverride);\r\n }\r\n\r\n getTransformMatrix(out = mat4_create(), referenceObjectOverride = undefined) {\r\n // Implemented outside class definition\r\n }\r\n\r\n /**\r\n * TS type inference helper\r\n * \r\n * @param {any} referenceObjectOverride\r\n * @return {any}\r\n */\r\n getTransformQuat(out = quat2_create(), referenceObjectOverride = undefined) {\r\n // Implemented outside class definition\r\n }\r\n\r\n getLinearVelocity(out = vec3_create(), referenceObjectOverride = undefined) {\r\n // Implemented outside class definition\r\n }\r\n\r\n getAngularVelocity(out = vec3_create(), referenceObjectOverride = undefined) {\r\n return this.getAngularVelocityDegrees(out, referenceObjectOverride);\r\n }\r\n\r\n getAngularVelocityDegrees(out = vec3_create(), referenceObjectOverride = undefined) {\r\n // Implemented outside class definition\r\n }\r\n\r\n getAngularVelocityRadians(out = vec3_create(), referenceObjectOverride = undefined) {\r\n // Implemented outside class definition\r\n }\r\n\r\n isValid() {\r\n return this._myValid;\r\n }\r\n\r\n isLinearVelocityEmulated() {\r\n return this._myLinearVelocityEmulated;\r\n }\r\n\r\n isAngularVelocityEmulated() {\r\n return this._myAngularVelocityEmulated;\r\n }\r\n\r\n registerPrePoseUpdatedEventListener(id, listener) {\r\n this._myPrePoseUpdatedEventEmitter.add(listener, { id: id });\r\n }\r\n\r\n unregisterPrePoseUpdatedEventListener(id) {\r\n this._myPrePoseUpdatedEventEmitter.remove(id);\r\n }\r\n\r\n registerPoseUpdatedEventListener(id, listener) {\r\n this._myPoseUpdatedEmitter.add(listener, { id: id });\r\n }\r\n\r\n unregisterPoseUpdatedEventListener(id) {\r\n this._myPoseUpdatedEmitter.remove(id);\r\n }\r\n\r\n registerPostPoseUpdatedEventListener(id, listener) {\r\n this._myPostPoseUpdatedEventEmitter.add(listener, { id: id });\r\n }\r\n\r\n unregisterPostPoseUpdatedEventListener(id) {\r\n this._myPostPoseUpdatedEventEmitter.remove(id);\r\n }\r\n\r\n start() {\r\n this._myActive = false;\r\n this.setActive(true);\r\n }\r\n\r\n update(dt) {\r\n if (!this._myActive) return;\r\n\r\n this._update(dt, true, false);\r\n }\r\n\r\n // Hooks\r\n\r\n _isReadyToGetPose() {\r\n return true;\r\n }\r\n\r\n _getPose(xrFrame) {\r\n return null;\r\n }\r\n\r\n _preUpdate(dt, updateVelocity, manualUpdate) {\r\n\r\n }\r\n\r\n _postUpdate(dt, updateVelocity, manualUpdate, xrPose) {\r\n\r\n }\r\n\r\n _onXRSessionStartHook(manualCall, session) {\r\n\r\n }\r\n\r\n _onXRSessionEndHook() {\r\n\r\n }\r\n\r\n _onViewResetHook() {\r\n\r\n }\r\n\r\n _setActiveHook(active) {\r\n\r\n }\r\n\r\n _destroyHook() {\r\n\r\n }\r\n\r\n // Hooks End\r\n\r\n _update(dt, updateVelocity, manualUpdate) {\r\n this._preUpdate(dt, updateVelocity, manualUpdate);\r\n\r\n this._myPrevPosition.vec3_copy(this._myPosition);\r\n this._myPrevRotationQuat.quat_copy(this._myRotationQuat);\r\n\r\n let xrFrame = XRUtils.getFrame(this._myEngine);\r\n if (xrFrame && this._isReadyToGetPose()) {\r\n let xrPose = null;\r\n try {\r\n xrPose = this._getPose(xrFrame);\r\n } catch (error) {\r\n // Not handled, pose will be null\r\n }\r\n\r\n if (xrPose) {\r\n this._myPosition[0] = xrPose.transform.position.x;\r\n this._myPosition[1] = xrPose.transform.position.y;\r\n this._myPosition[2] = xrPose.transform.position.z;\r\n\r\n this._myRotationQuat[0] = xrPose.transform.orientation.x;\r\n this._myRotationQuat[1] = xrPose.transform.orientation.y;\r\n this._myRotationQuat[2] = xrPose.transform.orientation.z;\r\n this._myRotationQuat[3] = xrPose.transform.orientation.w;\r\n this._myRotationQuat.quat_normalize(this._myRotationQuat);\r\n\r\n if (updateVelocity) {\r\n if (xrPose.linearVelocity && !this._myForceEmulatedVelocities) {\r\n this._myLinearVelocity[0] = xrPose.linearVelocity.x;\r\n this._myLinearVelocity[1] = xrPose.linearVelocity.y;\r\n this._myLinearVelocity[2] = xrPose.linearVelocity.z;\r\n\r\n this._myLinearVelocityEmulated = false;\r\n } else {\r\n this._computeEmulatedLinearVelocity(dt);\r\n\r\n this._myLinearVelocityEmulated = true;\r\n }\r\n\r\n if (xrPose.angularVelocity && !this._myForceEmulatedVelocities) {\r\n this._myAngularVelocityRadians[0] = xrPose.angularVelocity.x;\r\n this._myAngularVelocityRadians[1] = xrPose.angularVelocity.y;\r\n this._myAngularVelocityRadians[2] = xrPose.angularVelocity.z;\r\n\r\n this._myAngularVelocityEmulated = false;\r\n } else {\r\n this._computeEmulatedAngularVelocity(dt);\r\n\r\n this._myAngularVelocityEmulated = true;\r\n }\r\n }\r\n\r\n this._myValid = true;\r\n } else {\r\n // Keep previous position and rotation but reset velocity because reasons\r\n\r\n if (updateVelocity) {\r\n this._myLinearVelocity[0] = 0;\r\n this._myLinearVelocity[1] = 0;\r\n this._myLinearVelocity[2] = 0;\r\n\r\n this._myAngularVelocityRadians[0] = 0;\r\n this._myAngularVelocityRadians[1] = 0;\r\n this._myAngularVelocityRadians[2] = 0;\r\n }\r\n\r\n this._myValid = false;\r\n this._myLinearVelocityEmulated = true;\r\n this._myAngularVelocityEmulated = true;\r\n }\r\n\r\n this._postUpdate(dt, updateVelocity, manualUpdate, xrPose);\r\n } else {\r\n // Keep previous position and rotation but reset velocity because reasons\r\n\r\n if (updateVelocity) {\r\n this._myLinearVelocity[0] = 0;\r\n this._myLinearVelocity[1] = 0;\r\n this._myLinearVelocity[2] = 0;\r\n\r\n this._myAngularVelocityRadians[0] = 0;\r\n this._myAngularVelocityRadians[1] = 0;\r\n this._myAngularVelocityRadians[2] = 0;\r\n }\r\n\r\n this._myValid = false;\r\n this._myLinearVelocityEmulated = true;\r\n this._myAngularVelocityEmulated = true;\r\n\r\n this._postUpdate(dt, updateVelocity, manualUpdate, null);\r\n }\r\n\r\n // This is not a pre update event, it's a pre pose updated, which can be used to guarantee a bit of order if you want something\r\n // to update before the stuff that updates on pose updated\r\n this._myPrePoseUpdatedEventEmitter.notify(dt, this, manualUpdate);\r\n this._myPoseUpdatedEmitter.notify(dt, this, manualUpdate);\r\n this._myPostPoseUpdatedEventEmitter.notify(dt, this, manualUpdate);\r\n }\r\n\r\n _computeEmulatedLinearVelocity(dt) {\r\n if (dt > 0) {\r\n this._myPosition.vec3_sub(this._myPrevPosition, this._myLinearVelocity);\r\n this._myLinearVelocity.vec3_scale(1 / dt, this._myLinearVelocity);\r\n } else {\r\n this._myLinearVelocity[0] = 0;\r\n this._myLinearVelocity[1] = 0;\r\n this._myLinearVelocity[2] = 0;\r\n }\r\n }\r\n\r\n _onXRSessionStart(manualCall, session) {\r\n let referenceSpace = XRUtils.getReferenceSpace(this._myEngine);\r\n\r\n if (referenceSpace.addEventListener != null) {\r\n this._myViewResetEventListener = this._onViewReset.bind(this);\r\n referenceSpace.addEventListener(\"reset\", this._myViewResetEventListener);\r\n }\r\n\r\n this._onXRSessionStartHook(manualCall, session);\r\n }\r\n\r\n _onXRSessionEnd() {\r\n this._onXRSessionEndHook();\r\n\r\n this._myViewResetEventListener = null;\r\n }\r\n\r\n _onViewReset() {\r\n if (this._myUpdateOnViewReset) {\r\n this._update(0, false, true);\r\n }\r\n\r\n this._onViewResetHook();\r\n }\r\n\r\n _computeEmulatedAngularVelocity() {\r\n // Implemented outside class definition\r\n }\r\n\r\n destroy() {\r\n this._myDestroyed = true;\r\n\r\n this.setActive(false);\r\n\r\n this._destroyHook();\r\n }\r\n\r\n isDestroyed() {\r\n return this._myDestroyed;\r\n }\r\n}\r\n\r\n\r\n\r\n// IMPLEMENTATION\r\n\r\nBasePose.prototype.getPosition = function () {\r\n let transform = mat4_create();\r\n return function getPosition(out = vec3_create(), referenceObjectOverride = undefined) {\r\n let referenceObject = referenceObjectOverride === undefined ? this._myReferenceObject : referenceObjectOverride;\r\n\r\n out.vec3_copy(this._myPosition);\r\n\r\n if (referenceObject == null) {\r\n return out;\r\n }\r\n\r\n return out.vec3_convertPositionToWorld(referenceObject.pp_getTransform(transform), out);\r\n };\r\n}();\r\n\r\nBasePose.prototype.getRotationDegrees = function () {\r\n let rotationQuat = quat_create();\r\n return function getRotationDegrees(out = vec3_create(), referenceObjectOverride = undefined) {\r\n return this.getRotationQuat(rotationQuat, referenceObjectOverride).quat_toDegrees(out);\r\n };\r\n}();\r\n\r\nBasePose.prototype.getRotationRadians = function () {\r\n let rotationQuat = quat_create();\r\n return function getRotationRadians(out = vec3_create(), referenceObjectOverride = undefined) {\r\n return this.getRotationQuat(rotationQuat, referenceObjectOverride).quat_toRadians(out);\r\n };\r\n}();\r\n\r\nBasePose.prototype.getRotationQuat = function () {\r\n let playerRotationQuat = quat_create();\r\n let up = vec3_create();\r\n return function getRotationQuat(out = quat_create(), referenceObjectOverride = undefined) {\r\n let referenceObject = referenceObjectOverride === undefined ? this._myReferenceObject : referenceObjectOverride;\r\n\r\n out.quat_copy(this._myRotationQuat);\r\n\r\n if (this._myForwardFixed) {\r\n out.quat_rotateAxisRadians(Math.PI, out.quat_getUp(up), out);\r\n }\r\n\r\n if (referenceObject == null) {\r\n return out;\r\n }\r\n\r\n return out.quat_toWorld(referenceObject.pp_getRotationQuat(playerRotationQuat), out);\r\n };\r\n}();\r\n\r\nBasePose.prototype.getTransformMatrix = function () {\r\n let transformQuat = quat2_create();\r\n return function getTransformMatrix(out = mat4_create(), referenceObjectOverride = undefined) {\r\n return this.getTransformQuat(transformQuat, referenceObjectOverride).quat2_toMatrix(out);\r\n };\r\n}();\r\n\r\nBasePose.prototype.getTransformQuat = function () {\r\n let rotationQuat = quat_create();\r\n let playerTransformQuat = quat2_create();\r\n return function getTransformQuat(out = quat2_create(), referenceObjectOverride = undefined) {\r\n let referenceObject = referenceObjectOverride === undefined ? this._myReferenceObject : referenceObjectOverride;\r\n\r\n out.quat2_identity();\r\n out.quat2_setPositionRotationQuat(this._myPosition, this.getRotationQuat(rotationQuat, referenceObjectOverride));\r\n\r\n if (referenceObject == null) {\r\n return out;\r\n }\r\n\r\n return out.quat_toWorld(referenceObject.pp_getTransformQuat(playerTransformQuat), out);\r\n };\r\n}();\r\n\r\nBasePose.prototype.getLinearVelocity = function () {\r\n let transform = mat4_create();\r\n return function getLinearVelocity(out = vec3_create(), referenceObjectOverride = undefined) {\r\n let referenceObject = referenceObjectOverride === undefined ? this._myReferenceObject : referenceObjectOverride;\r\n\r\n out.vec3_copy(this._myLinearVelocity);\r\n\r\n if (referenceObject == null) {\r\n return out;\r\n }\r\n\r\n return out.vec3_convertDirectionToWorld(referenceObject.pp_getTransform(transform), out);\r\n };\r\n}();\r\n\r\nBasePose.prototype.getAngularVelocityDegrees = function () {\r\n let velocityRadians = vec3_create();\r\n return function getAngularVelocityDegrees(out = vec3_create(), referenceObjectOverride = undefined) {\r\n return this.getAngularVelocityRadians(velocityRadians, referenceObjectOverride).vec3_toDegrees(out);\r\n };\r\n}();\r\n\r\nBasePose.prototype.getAngularVelocityRadians = function () {\r\n let transform = mat4_create();\r\n return function getAngularVelocityRadians(out = vec3_create(), referenceObjectOverride = undefined) {\r\n let referenceObject = referenceObjectOverride === undefined ? this._myReferenceObject : referenceObjectOverride;\r\n\r\n out.vec3_copy(this._myAngularVelocityRadians);\r\n\r\n if (referenceObject == null) {\r\n return out;\r\n }\r\n\r\n return out.vec3_convertDirectionToWorld(referenceObject.pp_getTransform(transform), out);\r\n };\r\n}();\r\n\r\nBasePose.prototype._computeEmulatedAngularVelocity = function () {\r\n let rotationRadians = vec3_create();\r\n let prevRotationRadians = vec3_create();\r\n return function _computeEmulatedAngularVelocity(dt) {\r\n if (dt > 0) {\r\n rotationRadians = this._myRotationQuat.quat_toRadians(rotationRadians);\r\n prevRotationRadians = this._myPrevRotationQuat.quat_toRadians(prevRotationRadians);\r\n rotationRadians.vec3_sub(prevRotationRadians, this._myAngularVelocityRadians);\r\n this._myAngularVelocityRadians.vec3_scale(1 / dt, this._myAngularVelocityRadians);\r\n } else {\r\n this._myAngularVelocityRadians[0] = 0;\r\n this._myAngularVelocityRadians[1] = 0;\r\n this._myAngularVelocityRadians[2] = 0;\r\n }\r\n };\r\n}();", "import { WonderlandEngine } from \"@wonderlandengine/api\";\r\nimport { XRUtils } from \"../../cauldron/utils/xr_utils.js\";\r\nimport { Globals } from \"../../pp/globals.js\";\r\nimport { Handedness, HandednessIndex, InputSourceType, TrackedHandJointID, TrackedHandJointIDIndex } from \"./input_types.js\";\r\n\r\nexport function getHandednessByString(string: string): Handedness | null {\r\n let handedness = null;\r\n\r\n switch (string) {\r\n case Handedness.LEFT:\r\n handedness = Handedness.LEFT;\r\n break;\r\n case Handedness.RIGHT:\r\n handedness = Handedness.RIGHT;\r\n break;\r\n }\r\n\r\n return handedness;\r\n}\r\n\r\nexport function getHandednessByIndex(index: number): Handedness | null {\r\n let handedness = null;\r\n\r\n switch (index) {\r\n case HandednessIndex.LEFT:\r\n handedness = Handedness.LEFT;\r\n break;\r\n case HandednessIndex.RIGHT:\r\n handedness = Handedness.RIGHT;\r\n break;\r\n }\r\n\r\n return handedness;\r\n}\r\n\r\nexport function getInputSource(handedness: Handedness, inputSourceType: InputSourceType | null = null, engine: WonderlandEngine = Globals.getMainEngine()!): XRInputSource | null {\r\n let inputSource = null;\r\n\r\n const xrSession = XRUtils.getSession(engine);\r\n if (xrSession != null && xrSession.inputSources != null) {\r\n for (let i = 0; i < xrSession.inputSources.length; i++) {\r\n const input = xrSession.inputSources[i];\r\n\r\n const correctType = (inputSourceType == null) || (inputSourceType == InputSourceType.GAMEPAD && !input.hand) || (inputSourceType == InputSourceType.TRACKED_HAND && input.hand);\r\n if (correctType && input.handedness == handedness) {\r\n inputSource = input;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return inputSource;\r\n}\r\n\r\nexport function getInputSourceTypeByHandedness(handedness: Handedness, engine: WonderlandEngine = Globals.getMainEngine()!): InputSourceType | null {\r\n const inputSource = InputUtils.getInputSource(handedness, undefined, engine);\r\n\r\n return inputSource != null ? InputUtils.getInputSourceType(inputSource) : null;\r\n}\r\n\r\nexport function getInputSourceType(inputSource: XRInputSource): InputSourceType {\r\n let inputSourceType = null;\r\n\r\n if (inputSource.hand) {\r\n inputSourceType = InputSourceType.TRACKED_HAND;\r\n } else {\r\n inputSourceType = InputSourceType.GAMEPAD;\r\n }\r\n\r\n return inputSourceType;\r\n}\r\n\r\nexport function getOppositeHandedness(handedness: Handedness): Handedness {\r\n let oppositeHandedness = null;\r\n\r\n switch (handedness) {\r\n case Handedness.LEFT:\r\n oppositeHandedness = Handedness.RIGHT;\r\n break;\r\n case Handedness.RIGHT:\r\n oppositeHandedness = Handedness.LEFT;\r\n break;\r\n }\r\n\r\n return oppositeHandedness;\r\n}\r\n\r\nexport function getJointIDByIndex(index: number): TrackedHandJointID | null {\r\n let jointID = null;\r\n\r\n let jointIDKey = null;\r\n for (const jointIDIndexKey in TrackedHandJointIDIndex) {\r\n if (TrackedHandJointIDIndex[jointIDIndexKey as keyof typeof TrackedHandJointIDIndex] == index) {\r\n jointIDKey = jointIDIndexKey;\r\n break;\r\n }\r\n }\r\n\r\n if (jointIDKey != null) {\r\n jointID = TrackedHandJointID[jointIDKey as keyof typeof TrackedHandJointID];\r\n }\r\n\r\n return jointID;\r\n}\r\n\r\nexport const InputUtils = {\r\n getHandednessByString,\r\n getHandednessByIndex,\r\n getInputSource,\r\n getInputSourceTypeByHandedness,\r\n getInputSourceType,\r\n getOppositeHandedness,\r\n getJointIDByIndex\r\n} as const;", "import { Timer } from \"../../cauldron/cauldron/timer.js\";\r\nimport { XRUtils } from \"../../cauldron/utils/xr_utils.js\";\r\nimport { quat_create, vec3_create } from \"../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Handedness, InputSourceType } from \"../cauldron/input_types.js\";\r\nimport { InputUtils } from \"../cauldron/input_utils.js\";\r\nimport { BasePose, BasePoseParams } from \"./base_pose.js\";\r\n\r\nexport class HandPoseParams extends BasePoseParams {\r\n\r\n constructor(engine) {\r\n super(engine);\r\n\r\n this.myFixTrackedHandRotation = true;\r\n\r\n /**\r\n * This can be used to make it so that when you put down the gamepads and tracked hands would be picked, \r\n * the gamepads will still being used (if they exists) for a bit more before switching to hands (if they are still the best option)\r\n */\r\n this.mySwitchToTrackedHandDelayEnabled = false;\r\n\r\n this.mySwitchToTrackedHandDelay = 0;\r\n\r\n /**\r\n * Sadly, it can happen that when the game switches to hand tracking and we want to use the gamepad, the gamepad is \r\n * not available in the tracked sources for a few frames\r\n * \r\n * This make it so that, if the gamepad becomes available during this amount of frames, \r\n * it will be picked, otherwise it will switch to whatever input source is available at the moment\r\n * \r\n * In the meantime the input source will be `null` and not the tracked hand, to avoid activating tracked hand features,\r\n * just for a small amount of frames\r\n */\r\n this._mySwitchToTrackedHandDelayKeepCheckingForGamepadFrameCounter = 3;\r\n\r\n /**\r\n * While {@link _mySwitchToTrackedHandDelayKeepCheckingForGamepadFrameCounter} is being used to check for the gamepad to become available, \r\n * you will end up with a `null` input source\r\n * \r\n * This \"risky\" fix keeps the gamepad previous references anyway for that amount of frames\r\n * \r\n * This reference might be not valid anymore tho, even if it seems to always be working, \r\n * which is why it is marked as \"risky\", even though it seems to normally be ok\r\n */\r\n this.mySwitchToTrackedHandDelayNoInputSourceRiskyFixEnabled = false;\r\n }\r\n}\r\n\r\nexport class HandPose extends BasePose {\r\n\r\n constructor(handedness, handPoseParams = new HandPoseParams()) {\r\n super(handPoseParams);\r\n\r\n this._myHandedness = handedness;\r\n this._myFixTrackedHandRotation = handPoseParams.myFixTrackedHandRotation;\r\n\r\n this._myRealInputSource = null;\r\n this._myInputSource = null;\r\n this._myTrackedHand = false;\r\n\r\n this._myInputSourcesChangeEventListener = null;\r\n this._myVisibilityChangeEventListener = null;\r\n\r\n\r\n\r\n this._mySwitchToTrackedHandDelayEnabled = handPoseParams.mySwitchToTrackedHandDelayEnabled;\r\n this._mySwitchToTrackedHandDelay = handPoseParams.mySwitchToTrackedHandDelay;\r\n this._mySwitchToTrackedHandDelayKeepCheckingForGamepadFrameCounter = handPoseParams._mySwitchToTrackedHandDelayKeepCheckingForGamepadFrameCounter;\r\n this._mySwitchToTrackedHandDelayNoInputSourceRiskyFixEnabled = handPoseParams.mySwitchToTrackedHandDelayNoInputSourceRiskyFixEnabled;\r\n\r\n this._myDisableSwitchToTrackedHandDelaySessionChangeFrameCounter = 0;\r\n this._myDisableSwitchToTrackedHandDelaySessionChangeTimer = new Timer(1, false);\r\n\r\n this._myCurrentSwitchToTrackedHandDelayKeepCheckingForGamepadFrameCounter = 0;\r\n this._mySwitchToTrackedHandTimer = new Timer(this._mySwitchToTrackedHandDelay, false);\r\n\r\n }\r\n\r\n getHandedness() {\r\n return this._myHandedness;\r\n }\r\n\r\n getInputSource() {\r\n return this._myInputSource;\r\n }\r\n\r\n getInputSourceType() {\r\n if (this._myInputSource == null) {\r\n return null;\r\n }\r\n\r\n return InputUtils.getInputSourceType(this._myInputSource);\r\n }\r\n\r\n getInputSourceReal() {\r\n return this._myRealInputSource;\r\n }\r\n\r\n getInputSourceTypeReal() {\r\n if (this._myRealInputSource == null) {\r\n return null;\r\n }\r\n\r\n return InputUtils.getInputSourceType(this._myRealInputSource);\r\n }\r\n\r\n isFixTrackedHandRotation() {\r\n return this._myFixTrackedHandRotation;\r\n }\r\n\r\n setFixTrackedHandRotation(fixTrackedHandRotation) {\r\n this._myFixTrackedHandRotation = fixTrackedHandRotation;\r\n }\r\n\r\n isSwitchToTrackedHandDelayEnabled() {\r\n return this._mySwitchToTrackedHandDelayEnabled;\r\n }\r\n\r\n setSwitchToTrackedHandDelayEnabled(switchToTrackedHandDelayEnabled) {\r\n this._mySwitchToTrackedHandDelayEnabled = switchToTrackedHandDelayEnabled;\r\n }\r\n\r\n getSwitchToTrackedHandDelay() {\r\n return this._mySwitchToTrackedHandDelay;\r\n }\r\n\r\n setSwitchToTrackedHandDelay(switchToTrackedHandDelay) {\r\n this._mySwitchToTrackedHandDelay = switchToTrackedHandDelay;\r\n }\r\n\r\n getSwitchToTrackedHandDelayKeepCheckingForGamepadFrameCounter() {\r\n return this._mySwitchToTrackedHandDelayKeepCheckingForGamepadFrameCounter;\r\n }\r\n\r\n setSwitchToTrackedHandDelayKeepCheckingForGamepadFrameCounter(switchToTrackedHandDelayKeepCheckingForGamepadFrameCounter) {\r\n this._mySwitchToTrackedHandDelayKeepCheckingForGamepadFrameCounter = switchToTrackedHandDelayKeepCheckingForGamepadFrameCounter;\r\n }\r\n\r\n isSwitchToTrackedHandDelayNoInputSourceRiskyFixEnabled() {\r\n return this._mySwitchToTrackedHandDelayNoInputSourceRiskyFixEnabled;\r\n }\r\n\r\n setSwitchToTrackedHandDelayNoInputSourceRiskyFixEnabled(switchToTrackedHandDelayNoInputSourceRiskyFixEnabled) {\r\n this._mySwitchToTrackedHandDelayNoInputSourceRiskyFixEnabled = switchToTrackedHandDelayNoInputSourceRiskyFixEnabled;\r\n }\r\n\r\n getRotationQuat(out = quat_create(), referenceObjectOverride = undefined) {\r\n // Implemented outside class definition\r\n }\r\n\r\n _isReadyToGetPose() {\r\n return this._myInputSource != null;\r\n }\r\n\r\n _getPose(xrFrame) {\r\n return xrFrame.getPose(this._myInputSource.gripSpace, this.getReferenceSpace());\r\n }\r\n\r\n _preUpdate(dt) {\r\n if (this._mySwitchToTrackedHandDelayEnabled) {\r\n if (this._myCurrentSwitchToTrackedHandDelayKeepCheckingForGamepadFrameCounter > 0) {\r\n this._myCurrentSwitchToTrackedHandDelayKeepCheckingForGamepadFrameCounter--;\r\n if (this._myCurrentSwitchToTrackedHandDelayKeepCheckingForGamepadFrameCounter == 0) {\r\n this._myCurrentSwitchToTrackedHandDelayKeepCheckingForGamepadFrameCounter = 0;\r\n this._mySwitchToTrackedHandTimer.reset();\r\n }\r\n\r\n this._myInputSourcesChangeEventListener();\r\n }\r\n\r\n if (this._mySwitchToTrackedHandTimer.isRunning()) {\r\n this._mySwitchToTrackedHandTimer.update(dt);\r\n if (this._mySwitchToTrackedHandTimer.isDone()) {\r\n if (this._myInputSourcesChangeEventListener != null) {\r\n this._myCurrentSwitchToTrackedHandDelayKeepCheckingForGamepadFrameCounter = 0;\r\n this._mySwitchToTrackedHandTimer.reset();\r\n this._myInputSourcesChangeEventListener();\r\n }\r\n }\r\n }\r\n\r\n if (this._myDisableSwitchToTrackedHandDelaySessionChangeFrameCounter > 0) {\r\n this._myDisableSwitchToTrackedHandDelaySessionChangeFrameCounter--;\r\n } else {\r\n this._myDisableSwitchToTrackedHandDelaySessionChangeTimer.update(dt);\r\n }\r\n }\r\n }\r\n\r\n _setActiveHook(active) {\r\n if (this.isActive() != active) {\r\n if (!active) {\r\n this._myRealInputSource = null;\r\n this._myInputSource = null;\r\n this._myTrackedHand = false;\r\n\r\n XRUtils.getSession(this.getEngine())?.removeEventListener(\"inputsourceschange\", this._myInputSourcesChangeEventListener);\r\n XRUtils.getSession(this.getEngine())?.removeEventListener(\"visibilitychange\", this._myVisibilityChangeEventListener);\r\n\r\n this._myCurrentSwitchToTrackedHandDelayKeepCheckingForGamepadFrameCounter = 0;\r\n this._mySwitchToTrackedHandTimer.reset();\r\n\r\n this._myDisableSwitchToTrackedHandDelaySessionChangeFrameCounter = 0;\r\n this._myDisableSwitchToTrackedHandDelaySessionChangeTimer.reset();\r\n }\r\n }\r\n }\r\n\r\n _onXRSessionStartHook(manualCall, session) {\r\n if (this._mySwitchToTrackedHandDelayEnabled) {\r\n this._myDisableSwitchToTrackedHandDelaySessionChangeFrameCounter = 10;\r\n this._myDisableSwitchToTrackedHandDelaySessionChangeTimer.start();\r\n }\r\n\r\n this._myInputSourcesChangeEventListener = () => {\r\n let wasUsingGamepad = false;\r\n let lastGamepadInputSource = null;\r\n if (this._mySwitchToTrackedHandDelayEnabled) {\r\n if ((this.getInputSourceTypeReal() == InputSourceType.GAMEPAD || this._mySwitchToTrackedHandTimer.isRunning()) &&\r\n this._mySwitchToTrackedHandDelay > 0 && session.trackedSources != null &&\r\n this._myDisableSwitchToTrackedHandDelaySessionChangeFrameCounter == 0 &&\r\n !this._myDisableSwitchToTrackedHandDelaySessionChangeTimer.isRunning()) {\r\n\r\n wasUsingGamepad = true;\r\n if (this._mySwitchToTrackedHandDelayNoInputSourceRiskyFixEnabled) {\r\n lastGamepadInputSource = this._myInputSource;\r\n }\r\n }\r\n }\r\n\r\n this._myRealInputSource = null;\r\n this._myInputSource = null;\r\n this._myTrackedHand = false;\r\n\r\n if (session.inputSources != null) {\r\n for (const inputSource of session.inputSources) {\r\n if (inputSource.handedness == this._myHandedness) {\r\n this._myRealInputSource = inputSource;\r\n this._myInputSource = inputSource;\r\n this._myTrackedHand = InputUtils.getInputSourceType(this._myInputSource) == InputSourceType.TRACKED_HAND;\r\n\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if (this._mySwitchToTrackedHandDelayEnabled) {\r\n if (wasUsingGamepad && (this._myInputSource == null || this._myTrackedHand)) {\r\n const inputSourcesToCheck = [];\r\n\r\n if (session.inputSources != null) {\r\n inputSourcesToCheck.push(...session.inputSources);\r\n }\r\n\r\n if (session.trackedSources != null) {\r\n inputSourcesToCheck.push(...session.trackedSources);\r\n }\r\n\r\n let gamepadFound = false;\r\n for (const inputSourceToCheck of inputSourcesToCheck) {\r\n if (inputSourceToCheck.handedness == this._myHandedness) {\r\n const inputSourceToCheckType = InputUtils.getInputSourceType(inputSourceToCheck);\r\n if (inputSourceToCheckType == InputSourceType.GAMEPAD) {\r\n this._myInputSource = inputSourceToCheck;\r\n this._myTrackedHand = false;\r\n\r\n this._myCurrentSwitchToTrackedHandDelayKeepCheckingForGamepadFrameCounter = 0;\r\n if (!this._mySwitchToTrackedHandTimer.isRunning()) {\r\n this._mySwitchToTrackedHandTimer.start(this._mySwitchToTrackedHandDelay);\r\n }\r\n\r\n gamepadFound = true;\r\n\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if (!gamepadFound) {\r\n if (this._mySwitchToTrackedHandDelayKeepCheckingForGamepadFrameCounter > 0) {\r\n // Sadly the gamepad might be added in the tracked source only at the end of this callback\r\n\r\n if (this._mySwitchToTrackedHandDelayNoInputSourceRiskyFixEnabled) {\r\n this._myInputSource = lastGamepadInputSource;\r\n this._myTrackedHand = false;\r\n } else {\r\n // Prefer null over the actual input source to prevent activating features that uses tracked hands \r\n // just for a few frames\r\n this._myInputSource = null;\r\n this._myTrackedHand = false;\r\n }\r\n\r\n if (this._myCurrentSwitchToTrackedHandDelayKeepCheckingForGamepadFrameCounter == 0) {\r\n this._myCurrentSwitchToTrackedHandDelayKeepCheckingForGamepadFrameCounter = this._mySwitchToTrackedHandDelayKeepCheckingForGamepadFrameCounter;\r\n }\r\n\r\n if (!this._mySwitchToTrackedHandTimer.isRunning()) {\r\n this._mySwitchToTrackedHandTimer.start(this._mySwitchToTrackedHandDelay);\r\n }\r\n } else {\r\n this._myCurrentSwitchToTrackedHandDelayKeepCheckingForGamepadFrameCounter = 0;\r\n this._mySwitchToTrackedHandTimer.reset();\r\n }\r\n }\r\n } else {\r\n this._myCurrentSwitchToTrackedHandDelayKeepCheckingForGamepadFrameCounter = 0;\r\n this._mySwitchToTrackedHandTimer.reset();\r\n }\r\n }\r\n };\r\n\r\n this._myInputSourcesChangeEventListener();\r\n\r\n session.addEventListener(\"inputsourceschange\", this._myInputSourcesChangeEventListener);\r\n\r\n this._myVisibilityChangeEventListener = () => {\r\n this._myCurrentSwitchToTrackedHandDelayKeepCheckingForGamepadFrameCounter = 0;\r\n this._mySwitchToTrackedHandTimer.reset();\r\n\r\n if (this._mySwitchToTrackedHandDelayEnabled) {\r\n this._myDisableSwitchToTrackedHandDelaySessionChangeFrameCounter = 10;\r\n this._myDisableSwitchToTrackedHandDelaySessionChangeTimer.start();\r\n }\r\n };\r\n\r\n session.addEventListener(\"visibilitychange\", this._myVisibilityChangeEventListener);\r\n }\r\n\r\n _onXRSessionEndHook() {\r\n this._myRealInputSource = null;\r\n this._myInputSource = null;\r\n this._myTrackedHand = false;\r\n\r\n this._myInputSourcesChangeEventListener = null;\r\n this._myVisibilityChangeEventListener = null;\r\n\r\n this._myCurrentSwitchToTrackedHandDelayKeepCheckingForGamepadFrameCounter = 0;\r\n this._mySwitchToTrackedHandTimer.reset();\r\n\r\n this._myDisableSwitchToTrackedHandDelaySessionChangeFrameCounter = 0;\r\n this._myDisableSwitchToTrackedHandDelaySessionChangeTimer.reset();\r\n }\r\n}\r\n\r\n\r\n\r\n// IMPLEMENTATION\r\n\r\nHandPose.prototype.getRotationQuat = function () {\r\n let playerRotationQuat = quat_create();\r\n let up = vec3_create();\r\n let right = vec3_create();\r\n let forward = vec3_create();\r\n return function getRotationQuat(out = quat_create(), referenceObjectOverride = undefined) {\r\n let referenceObject = referenceObjectOverride === undefined ? this._myReferenceObject : referenceObjectOverride;\r\n\r\n out.quat_copy(this._myRotationQuat);\r\n\r\n if (this._myForwardFixed) {\r\n out.quat_rotateAxisRadians(Math.PI, out.quat_getUp(up), out);\r\n }\r\n\r\n if (this._myFixTrackedHandRotation && this._myTrackedHand) {\r\n out.quat_rotateAxis(-60, out.quat_getRight(right), out);\r\n\r\n let forwardRotation = 20;\r\n forwardRotation = (this._myHandedness == Handedness.LEFT) ? forwardRotation : -forwardRotation;\r\n out.quat_rotateAxis(forwardRotation, out.quat_getForward(forward), out);\r\n }\r\n\r\n if (referenceObject == null) {\r\n return out;\r\n }\r\n\r\n return out.quat_toWorld(referenceObject.pp_getRotationQuat(playerRotationQuat), out);\r\n };\r\n}();", "import { HandPose, HandPoseParams } from \"./hand_pose.js\";\r\n\r\nexport class HandRayPoseParams extends HandPoseParams { }\r\n\r\nexport class HandRayPose extends HandPose {\r\n\r\n constructor(handedness, handRayPoseParams = new HandRayPoseParams()) {\r\n super(handedness, handRayPoseParams);\r\n }\r\n\r\n _getPose(xrFrame) {\r\n return xrFrame.getPose(this._myInputSource.targetRaySpace, this.getReferenceSpace());\r\n }\r\n}", "import { BasePose } from \"./base_pose.js\";\r\n\r\nexport class HeadPose extends BasePose {\r\n _getPose(xrFrame) {\r\n return xrFrame.getViewerPose(this.getReferenceSpace());\r\n }\r\n}", "import { XRUtils } from \"../../cauldron/utils/xr_utils.js\";\r\nimport { InputSourceType } from \"../cauldron/input_types.js\";\r\nimport { InputUtils } from \"../cauldron/input_utils.js\";\r\nimport { BasePose, BasePoseParams } from \"./base_pose.js\";\r\n\r\nexport class TrackedHandJointPose extends BasePose {\r\n\r\n constructor(handedness, trackedHandJointID, basePoseParams = new BasePoseParams()) {\r\n super(basePoseParams);\r\n\r\n this._myInputSource = null;\r\n\r\n this._myHandedness = handedness;\r\n this._myTrackedHandJointID = trackedHandJointID;\r\n\r\n this._myJointRadius = 0;\r\n\r\n this._myInputSourcesChangeEventListener = null;\r\n }\r\n\r\n getHandedness() {\r\n return this._myHandedness;\r\n }\r\n\r\n getTrackedHandJointID() {\r\n return this._myTrackedHandJointID;\r\n }\r\n\r\n setTrackedHandJointID(trackedHandJointID) {\r\n this._myTrackedHandJointID = trackedHandJointID;\r\n }\r\n\r\n getJointRadius() {\r\n return this._myJointRadius;\r\n }\r\n\r\n _isReadyToGetPose() {\r\n return this._myInputSource != null;\r\n }\r\n\r\n _getPose(xrFrame) {\r\n return xrFrame.getJointPose(this._myInputSource.hand.get(this._myTrackedHandJointID), this.getReferenceSpace());\r\n }\r\n\r\n _postUpdate(dt, updateVelocity, manualUpdate, xrPose) {\r\n if (xrPose != null) {\r\n this._myJointRadius = xrPose.radius;\r\n }\r\n }\r\n\r\n _setActiveHook(active) {\r\n if (this.isActive() != active) {\r\n if (!active) {\r\n this._myInputSource = null;\r\n this._myJointRadius = 0;\r\n\r\n XRUtils.getSession(this.getEngine())?.removeEventListener(\"inputsourceschange\", this._myInputSourcesChangeEventListener);\r\n }\r\n }\r\n }\r\n\r\n _onXRSessionStartHook(manualCall, session) {\r\n this._myInputSourcesChangeEventListener = () => {\r\n this._myInputSource = null;\r\n\r\n if (session.inputSources != null && session.inputSources.length > 0) {\r\n\r\n for (let i = 0; i < session.inputSources.length; i++) {\r\n let inputSource = session.inputSources[i];\r\n if (inputSource.handedness == this._myHandedness) {\r\n if (InputUtils.getInputSourceType(inputSource) == InputSourceType.TRACKED_HAND) {\r\n this._myInputSource = inputSource;\r\n }\r\n }\r\n }\r\n }\r\n };\r\n\r\n this._myInputSourcesChangeEventListener();\r\n\r\n session.addEventListener(\"inputsourceschange\", this._myInputSourcesChangeEventListener);\r\n }\r\n\r\n _onXRSessionEndHook() {\r\n this._myInputSource = null;\r\n\r\n this._myInputSourcesChangeEventListener = null;\r\n }\r\n}", "import { Globals } from \"../../pp/globals.js\";\r\nimport { TrackedHandJointID } from \"../cauldron/input_types.js\";\r\nimport { InputUtils } from \"../cauldron/input_utils.js\";\r\nimport { BasePoseParams } from \"./base_pose.js\";\r\nimport { TrackedHandJointPose } from \"./tracked_hand_joint_pose.js\";\r\n\r\nexport class TrackedHandPoseParams extends BasePoseParams {\r\n\r\n constructor(addAllJointIDs = true, engine = Globals.getMainEngine()) {\r\n super(engine);\r\n\r\n this.myTrackedHandJointIDList = [];\r\n this._myActive = true;\r\n\r\n if (addAllJointIDs) {\r\n for (let key in TrackedHandJointID) {\r\n this.myTrackedHandJointIDList.push(TrackedHandJointID[key]);\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport class TrackedHandPose {\r\n\r\n constructor(handedness, trackedHandPoseParams = new TrackedHandPoseParams()) {\r\n this._myHandedness = handedness;\r\n\r\n this._myForwardFixed = trackedHandPoseParams.myForwardFixed;\r\n this._myForceEmulatedVelocities = trackedHandPoseParams.myForceEmulatedVelocities;\r\n this._myReferenceObject = trackedHandPoseParams.myReferenceObject;\r\n\r\n this._myEngine = trackedHandPoseParams.myEngine;\r\n this._myActive = true;\r\n\r\n this._myTrackedHandJointPoseParams = new BasePoseParams(this._myEngine);\r\n this._myTrackedHandJointPoseParams.myForwardFixed = this._myForwardFixed;\r\n this._myTrackedHandJointPoseParams.myForceEmulatedVelocities = this._myForceEmulatedVelocities;\r\n this._myTrackedHandJointPoseParams.myReferenceObject = this._myReferenceObject;\r\n\r\n this._myTrackedHandJointPoses = [];\r\n for (let jointID of trackedHandPoseParams.myTrackedHandJointIDList) {\r\n let trackedHandJointPose = new TrackedHandJointPose(this._myHandedness, jointID, this._myTrackedHandJointPoseParams);\r\n this._myTrackedHandJointPoses[jointID] = trackedHandJointPose;\r\n }\r\n }\r\n\r\n setActive(active) {\r\n this._myActive = active;\r\n\r\n for (let jointPose of this._myTrackedHandJointPoses) {\r\n jointPose.setActive(active);\r\n }\r\n }\r\n\r\n isActive() {\r\n return this._myActive;\r\n }\r\n\r\n start() {\r\n for (let jointPoseKey in this._myTrackedHandJointPoses) {\r\n let jointPose = this._myTrackedHandJointPoses[jointPoseKey];\r\n jointPose.start();\r\n }\r\n }\r\n\r\n update(dt) {\r\n if (!this._myActive) return;\r\n\r\n for (let jointPoseKey in this._myTrackedHandJointPoses) {\r\n let jointPose = this._myTrackedHandJointPoses[jointPoseKey];\r\n jointPose.update(dt);\r\n }\r\n }\r\n\r\n getEngine() {\r\n return this._myEngine;\r\n }\r\n\r\n getHandedness() {\r\n return this._myHandedness;\r\n }\r\n\r\n getJointPose(jointID) {\r\n return this._myTrackedHandJointPoses[jointID];\r\n }\r\n\r\n getJointPoseByIndex(jointIDIndex) {\r\n return this._myTrackedHandJointPoses[InputUtils.getJointIDByIndex(jointIDIndex)];\r\n }\r\n\r\n getJointPoses() {\r\n return this._myTrackedHandJointPoses;\r\n }\r\n\r\n addTrackedHandJointID(jointID) {\r\n if (!this._myTrackedHandJointPoses.pp_has(element => element.getTrackedHandJointID() == jointID)) {\r\n let trackedHandJointPose = new TrackedHandJointPose(this._myHandedness, jointID, this._myTrackedHandJointPoseParams);\r\n this._myTrackedHandJointPoses.push(trackedHandJointPose);\r\n }\r\n }\r\n\r\n removeTrackedHandJointID(jointID) {\r\n this._myTrackedHandJointPoses.pp_remove(element => element.getTrackedHandJointID() == jointID);\r\n }\r\n\r\n setReferenceObject(referenceObject) {\r\n this._myReferenceObject = referenceObject;\r\n this._myTrackedHandJointPoseParams.myReferenceObject = this._myReferenceObject;\r\n for (let jointPoseKey in this._myTrackedHandJointPoses) {\r\n let jointPose = this._myTrackedHandJointPoses[jointPoseKey];\r\n jointPose.setReferenceObject(referenceObject);\r\n }\r\n }\r\n\r\n getReferenceObject() {\r\n return this._myReferenceObject;\r\n }\r\n\r\n setForwardFixed(forwardFixed) {\r\n this._myForwardFixed = forwardFixed;\r\n this._myTrackedHandJointPoseParams.myForwardFixed = this._myForwardFixed;\r\n for (let jointPoseKey in this._myTrackedHandJointPoses) {\r\n let jointPose = this._myTrackedHandJointPoses[jointPoseKey];\r\n jointPose.setForwardFixed(forwardFixed);\r\n }\r\n }\r\n\r\n isForwardFixed() {\r\n return this._myForwardFixed;\r\n }\r\n\r\n setForceEmulatedVelocities(forceEmulatedVelocities) {\r\n this._myForceEmulatedVelocities = forceEmulatedVelocities;\r\n this._myTrackedHandJointPoseParams.myForceEmulatedVelocities = this._myForceEmulatedVelocities;\r\n for (let jointPoseKey in this._myTrackedHandJointPoses) {\r\n let jointPose = this._myTrackedHandJointPoses[jointPoseKey];\r\n jointPose.setForceEmulatedVelocities(forceEmulatedVelocities);\r\n }\r\n }\r\n\r\n isForceEmulatedVelocities() {\r\n return this._myForceEmulatedVelocities;\r\n }\r\n\r\n destroy() {\r\n this._myDestroyed = true;\r\n\r\n this.setActive(false);\r\n\r\n for (let jointPose of this._myTrackedHandJointPoses) {\r\n jointPose.destroy();\r\n }\r\n }\r\n\r\n isDestroyed() {\r\n return this._myDestroyed;\r\n }\r\n}", "import { ViewComponent } from \"@wonderlandengine/api\";\r\nimport { Timer } from \"../../cauldron/cauldron/timer.js\";\r\nimport { RaycastResults } from \"../../cauldron/physics/physics_raycast_params.js\";\r\nimport { PhysicsUtils } from \"../../cauldron/physics/physics_utils.js\";\r\nimport { XRUtils } from \"../../cauldron/utils/xr_utils.js\";\r\nimport { mat4_create, quat_create, vec2_create, vec3_create } from \"../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Globals } from \"../../pp/globals.js\";\r\n\r\nexport let MouseButtonID = {\r\n LEFT: 0,\r\n MIDDLE: 1,\r\n RIGHT: 2\r\n};\r\n\r\n// #TODO Refactor Mouse/Keyboard/Gamepad and create a sort of parent ButtonHandler that have the base ButtonInfo and all of them inherit\r\nexport class Mouse {\r\n\r\n constructor(engine = Globals.getMainEngine()) {\r\n this._myEngine = engine;\r\n\r\n this._myButtonInfos = {};\r\n this._myButtonInfosIDs = [];\r\n for (let key in MouseButtonID) {\r\n this._myButtonInfos[MouseButtonID[key]] = this._createButtonInfo();\r\n this._myButtonInfosIDs.push(MouseButtonID[key]);\r\n }\r\n\r\n this._myPreventContextMenuEventListener = this._preventContextMenu.bind(this);\r\n this._myPreventMiddleButtonScrollEventListener = this._preventMiddleButtonScroll.bind(this);\r\n\r\n this._myInternalMousePosition = vec2_create();\r\n\r\n this._myScreenSize = vec2_create();\r\n\r\n this._myResetMovingDelay = 0.15;\r\n this._myResetMovingTimer = new Timer(this._myResetMovingDelay, false);\r\n this._myMoving = false;\r\n\r\n this._myInsideView = false;\r\n this._myValid = false;\r\n\r\n this._myActive = true;\r\n\r\n this._myPointerUpOnPointerLeave = true;\r\n\r\n this._myContextMenuActive = true;\r\n this._myMiddleButtonScrollActive = true;\r\n\r\n this._myPointerID = null;\r\n this._myLastValidPointerEvent = null;\r\n\r\n this._myPointerEventValidCallbacks = {}; // Signature: callback(event)\r\n this._myPointerEventValidCallbacksIDs = [];\r\n\r\n this._myPointerMoveEventListener = null;\r\n this._myPointerDownEventListener = null;\r\n this._myPointerUpEventListener = null;\r\n this._myPointerLeaveEventListener = null;\r\n this._myPointerEnterEventListener = null;\r\n this._myMouseDownEventListener = null;\r\n this._myMouseUpEventListener = null;\r\n this._myWindowResizeEventListener = null;\r\n\r\n this._myDestroyed = false;\r\n\r\n // Support Variables\r\n this._myProjectionMatrixInverse = mat4_create();\r\n this._myRotationQuat = quat_create();\r\n this._myOriginWorld = vec3_create();\r\n this._myDirectionWorld = vec3_create();\r\n }\r\n\r\n setActive(active) {\r\n if (this._myActive != active) {\r\n this._myActive = active;\r\n\r\n if (this._myActive) {\r\n this._myPointerMoveEventListener = this._onPointerAction.bind(this, this._onPointerMove.bind(this));\r\n document.body.addEventListener(\"pointermove\", this._myPointerMoveEventListener);\r\n this._myPointerDownEventListener = this._onPointerAction.bind(this, this._onPointerDown.bind(this));\r\n document.body.addEventListener(\"pointerdown\", this._myPointerDownEventListener);\r\n this._myPointerUpEventListener = this._onPointerAction.bind(this, this._onPointerUp.bind(this));\r\n document.body.addEventListener(\"pointerup\", this._myPointerUpEventListener);\r\n this._myPointerLeaveEventListener = this._onPointerLeave.bind(this);\r\n document.body.addEventListener(\"pointerleave\", this._myPointerLeaveEventListener);\r\n this._myPointerEnterEventListener = this._onPointerEnter.bind(this);\r\n document.body.addEventListener(\"pointerenter\", this._myPointerEnterEventListener);\r\n\r\n // These are needed to being able to detect for example left and right click together, pointer only allow one down at a time\r\n this._myMouseDownEventListener = this._onMouseAction.bind(this, this._onPointerDown.bind(this));\r\n document.body.addEventListener(\"mousedown\", this._myMouseDownEventListener);\r\n this._myMouseUpEventListener = this._onMouseAction.bind(this, this._onPointerUp.bind(this));\r\n document.body.addEventListener(\"mouseup\", this._myMouseUpEventListener);\r\n\r\n this._updateScreenSize();\r\n this._myWindowResizeEventListener = this._updateScreenSize.bind(this);\r\n window.addEventListener(\"resize\", this._myWindowResizeEventListener);\r\n\r\n this._myContextMenuActive = !this._myContextMenuActive;\r\n this.setContextMenuActive(!this._myContextMenuActive);\r\n\r\n this._myMiddleButtonScrollActive = !this._myMiddleButtonScrollActive;\r\n this.setMiddleButtonScrollActive(!this._myMiddleButtonScrollActive);\r\n } else {\r\n for (let i = 0; i < this._myButtonInfosIDs.length; i++) {\r\n let id = this._myButtonInfosIDs[i];\r\n let buttonInfo = this._myButtonInfos[id];\r\n buttonInfo.myPressed = false;\r\n buttonInfo.myPressStart = false;\r\n buttonInfo.myPressEnd = false;\r\n buttonInfo.myPressStartToProcess = false;\r\n buttonInfo.myPressEndToProcess = false;\r\n }\r\n\r\n this._myInternalMousePosition.vec2_zero();\r\n\r\n this._myScreenSize.vec2_zero();\r\n\r\n this._myResetMovingTimer.reset();\r\n this._myMoving = false;\r\n\r\n this._myInsideView = false;\r\n this._myValid = false;\r\n\r\n this._myPointerID = null;\r\n this._myLastValidPointerEvent = null;\r\n\r\n document.body.removeEventListener(\"pointermove\", this._myPointerMoveEventListener);\r\n document.body.removeEventListener(\"pointerdown\", this._myPointerDownEventListener);\r\n document.body.removeEventListener(\"pointerup\", this._myPointerUpEventListener);\r\n document.body.removeEventListener(\"pointerleave\", this._myPointerLeaveEventListener);\r\n document.body.removeEventListener(\"pointerenter\", this._myPointerEnterEventListener);\r\n\r\n document.body.removeEventListener(\"mousedown\", this._myMouseDownEventListener);\r\n document.body.removeEventListener(\"mouseup\", this._myMouseUpEventListener);\r\n\r\n document.body.removeEventListener(\"contextmenu\", this._myPreventContextMenuEventListener);\r\n document.body.removeEventListener(\"mousedown\", this._myPreventMiddleButtonScrollEventListener);\r\n\r\n window.removeEventListener(\"resize\", this._myWindowResizeEventListener);\r\n\r\n this._myPointerMoveEventListener = null;\r\n this._myPointerDownEventListener = null;\r\n this._myPointerUpEventListener = null;\r\n this._myPointerLeaveEventListener = null;\r\n this._myPointerEnterEventListener = null;\r\n this._myMouseDownEventListener = null;\r\n this._myMouseUpEventListener = null;\r\n this._myWindowResizeEventListener = null;\r\n }\r\n }\r\n }\r\n\r\n isActive() {\r\n return this._myActive;\r\n }\r\n\r\n start() {\r\n this._myActive = false;\r\n this.setActive(true);\r\n }\r\n\r\n update(dt) {\r\n if (!this._myActive) return;\r\n\r\n if (this._myResetMovingTimer.isRunning()) {\r\n this._myResetMovingTimer.update(dt);\r\n if (this._myResetMovingTimer.isDone()) {\r\n this._myResetMovingTimer.reset();\r\n this._myMoving = false;\r\n }\r\n }\r\n\r\n for (let i = 0; i < this._myButtonInfosIDs.length; i++) {\r\n let id = this._myButtonInfosIDs[i];\r\n let buttonInfo = this._myButtonInfos[id];\r\n buttonInfo.myPressStart = buttonInfo.myPressStartToProcess;\r\n buttonInfo.myPressEnd = buttonInfo.myPressEndToProcess;\r\n buttonInfo.myPressStartToProcess = false;\r\n buttonInfo.myPressEndToProcess = false;\r\n }\r\n\r\n if (!this.isAnyButtonPressed() && !this._myMoving) {\r\n this._myPointerID = null;\r\n }\r\n\r\n if (this._myLastValidPointerEvent != null) {\r\n let lastValidPointerEventStillValid = this._isPointerEventValid(this._myLastValidPointerEvent);\r\n if (!lastValidPointerEventStillValid) {\r\n if (this._myInsideView) {\r\n this._onPointerLeave(this._myLastValidPointerEvent);\r\n }\r\n\r\n this._myLastValidPointerEvent = null;\r\n }\r\n }\r\n }\r\n\r\n isValid() {\r\n return this._myValid;\r\n }\r\n\r\n isButtonPressed(buttonID) {\r\n let pressed = false;\r\n\r\n if (this._myButtonInfosIDs[buttonID] != null) {\r\n pressed = this._myButtonInfos[buttonID].myPressed;\r\n }\r\n\r\n return pressed;\r\n }\r\n\r\n isAnyButtonPressed() {\r\n let pressed = false;\r\n\r\n for (let i = 0; i < this._myButtonInfosIDs.length; i++) {\r\n let id = this._myButtonInfosIDs[i];\r\n let buttonInfo = this._myButtonInfos[id];\r\n if (buttonInfo.myPressed) {\r\n pressed = true;\r\n break;\r\n }\r\n }\r\n\r\n return pressed;\r\n }\r\n\r\n isButtonPressStart(buttonID) {\r\n let pressStart = false;\r\n\r\n if (this._myButtonInfosIDs[buttonID] != null) {\r\n pressStart = this._myButtonInfos[buttonID].myPressStart;\r\n }\r\n\r\n return pressStart;\r\n }\r\n\r\n isButtonPressEnd(buttonID = null) {\r\n let pressEnd = false;\r\n\r\n if (this._myButtonInfosIDs[buttonID] != null) {\r\n pressEnd = this._myButtonInfos[buttonID].myPressEnd;\r\n }\r\n\r\n return pressEnd;\r\n }\r\n\r\n isMoving() {\r\n return this._myMoving;\r\n }\r\n\r\n isInsideView() {\r\n return this._myInsideView;\r\n }\r\n\r\n isTargetingRenderCanvas() {\r\n return this.isInsideView() && this._myLastValidPointerEvent != null && this._myLastValidPointerEvent.target == Globals.getCanvas(this._myEngine);\r\n }\r\n\r\n // The origin and direction are set by the mouse\r\n raycastWorld(raycastParams, raycastResults = new RaycastResults()) {\r\n this.getOriginWorld(raycastParams.myOrigin);\r\n this.getDirectionWorld(raycastParams.myDirection);\r\n raycastResults = PhysicsUtils.raycast(raycastParams, raycastResults, Globals.getPhysics(this._myEngine));\r\n return raycastResults;\r\n }\r\n\r\n getPositionScreen(out = vec2_create()) {\r\n let mousePosition = out;\r\n mousePosition[0] = this._myInternalMousePosition[0];\r\n mousePosition[1] = this._myScreenSize[1] - 1 - this._myInternalMousePosition[1];\r\n return mousePosition;\r\n }\r\n\r\n getPositionScreenNormalized(out = vec2_create()) {\r\n let mousePosition = out;\r\n mousePosition[0] = (this._myScreenSize[0] == 0) ? 0 : ((this._myInternalMousePosition[0] / this._myScreenSize[0]) * 2 - 1);\r\n mousePosition[1] = (this._myScreenSize[1] == 0) ? 0 : (((this._myScreenSize[1] - 1 - this._myInternalMousePosition[1]) / this._myScreenSize[1]) * 2 - 1);\r\n return mousePosition;\r\n }\r\n\r\n getScreenSize() {\r\n return this._myScreenSize;\r\n }\r\n\r\n getPositionWorld(distanceFromCamera, out = vec3_create()) {\r\n let originWorld = this.getOriginWorld(this._myOriginWorld);\r\n let directionWorld = this.getDirectionWorld(this._myDirectionWorld);\r\n\r\n out = originWorld.vec3_add(directionWorld.vec3_scale(distanceFromCamera, out), out);\r\n return out;\r\n }\r\n\r\n getOriginWorld(out = vec3_create()) {\r\n if (XRUtils.isSessionActive(this._myEngine)) {\r\n Globals.getPlayerObjects(this._myEngine).myEyeLeft.pp_getPosition(out); // In theory mouse should not be used inside the session, but may make sense for AR which uses eye left\r\n } else {\r\n Globals.getPlayerObjects(this._myEngine).myCameraNonXR.pp_getPosition(out);\r\n }\r\n\r\n return out;\r\n }\r\n\r\n getDirectionWorld(out = vec3_create()) {\r\n let right = this._myInternalMousePosition[0] / this._myScreenSize[0];\r\n let up = this._myInternalMousePosition[1] / this._myScreenSize[1];\r\n\r\n let directionLocal = out;\r\n directionLocal.vec3_set(right * 2 - 1, -up * 2 + 1, -1.0);\r\n\r\n let projectionMatrixInvert = this._myProjectionMatrixInverse;\r\n if (XRUtils.isSessionActive(this._myEngine)) {\r\n projectionMatrixInvert = Globals.getPlayerObjects(this._myEngine).myEyeLeft.pp_getComponent(ViewComponent).projectionMatrix.mat4_invert(projectionMatrixInvert);\r\n } else {\r\n projectionMatrixInvert = Globals.getPlayerObjects(this._myEngine).myCameraNonXR.pp_getComponent(ViewComponent).projectionMatrix.mat4_invert(projectionMatrixInvert);\r\n }\r\n\r\n directionLocal.vec3_transformMat4(projectionMatrixInvert, directionLocal);\r\n directionLocal.vec3_normalize(directionLocal);\r\n\r\n let directionWorld = directionLocal;\r\n if (XRUtils.isSessionActive(this._myEngine)) {\r\n directionWorld = directionLocal.vec3_transformQuat(Globals.getPlayerObjects(this._myEngine).myEyeLeft.pp_getRotationQuat(this._myRotationQuat), directionLocal);\r\n } else {\r\n directionWorld = directionLocal.vec3_transformQuat(Globals.getPlayerObjects(this._myEngine).myCameraNonXR.pp_getRotationQuat(this._myRotationQuat), directionLocal);\r\n }\r\n\r\n directionWorld.vec3_normalize(directionWorld);\r\n\r\n return out;\r\n }\r\n\r\n setTouchValid(touchValid) {\r\n let callbackID = \"pp_internal_touch_valid_callback\";\r\n if (touchValid) {\r\n this.removePointerEventValidCallback(callbackID);\r\n } else {\r\n this.addPointerEventValidCallback(callbackID, function (event) {\r\n return event.pointerType == \"mouse\";\r\n });\r\n }\r\n }\r\n\r\n setTargetOnlyRenderCanvas(targetOnlyRenderCanvas) {\r\n let callbackID = \"pp_internal_target_only_render_canvas_callback\";\r\n if (targetOnlyRenderCanvas) {\r\n this.addPointerEventValidCallback(callbackID, function (event) {\r\n return event.target == Globals.getCanvas(this._myEngine);\r\n });\r\n } else {\r\n this.removePointerEventValidCallback(callbackID);\r\n }\r\n }\r\n\r\n getLastValidPointerEvent() {\r\n return this._myLastValidPointerEvent;\r\n }\r\n\r\n // Can be used to specify that only some pointerType are valid (eg: mouse, touch, pen) or just some target (eg: Globals.getCanvas(this._myEngine))\r\n addPointerEventValidCallback(id, callback) {\r\n this._myPointerEventValidCallbacks[id] = callback;\r\n this._myPointerEventValidCallbacksIDs.push(id);\r\n }\r\n\r\n removePointerEventValidCallback(id) {\r\n delete this._myPointerEventValidCallbacks[id];\r\n this._myPointerEventValidCallbacksIDs.pp_removeEqual(id);\r\n }\r\n\r\n isPointerUpOnPointerLeave() {\r\n return this._myPointerUpOnPointerLeave;\r\n }\r\n\r\n setPointerUpOnPointerLeave(pointerUpOnPointerLeave) {\r\n this._myPointerUpOnPointerLeave = pointerUpOnPointerLeave;\r\n }\r\n\r\n isContextMenuActive() {\r\n return this._myContextMenuActive;\r\n }\r\n\r\n setContextMenuActive(active) {\r\n if (this._myContextMenuActive != active) {\r\n if (active) {\r\n document.body.removeEventListener(\"contextmenu\", this._myPreventContextMenuEventListener);\r\n } else {\r\n document.body.addEventListener(\"contextmenu\", this._myPreventContextMenuEventListener, false);\r\n }\r\n this._myContextMenuActive = active;\r\n }\r\n }\r\n\r\n isMiddleButtonScrollActive() {\r\n return this._myMiddleButtonScrollActive;\r\n }\r\n\r\n setMiddleButtonScrollActive(active) {\r\n if (this._myMiddleButtonScrollActive != active) {\r\n if (active) {\r\n document.body.removeEventListener(\"mousedown\", this._myPreventMiddleButtonScrollEventListener);\r\n } else {\r\n document.body.addEventListener(\"mousedown\", this._myPreventMiddleButtonScrollEventListener, false);\r\n }\r\n this._myMiddleButtonScrollActive = active;\r\n }\r\n }\r\n\r\n setResetMovingDelay(delay) {\r\n this._myResetMovingDelay = delay;\r\n }\r\n\r\n getResetMovingDelay() {\r\n return this._myResetMovingDelay;\r\n }\r\n\r\n _onPointerAction(actionCallback, event) {\r\n if (!this._isPointerEventIDValid(event)) return;\r\n\r\n if (!this._isPointerEventValid(event)) {\r\n if (this._myInsideView) {\r\n this._onPointerLeave(event);\r\n }\r\n return;\r\n }\r\n\r\n if (!this._myInsideView) {\r\n this._onPointerEnter(event);\r\n }\r\n\r\n actionCallback(event);\r\n\r\n this._updatePosition(event);\r\n this._updatePointerData(event);\r\n }\r\n\r\n _onMouseAction(actionCallback, event) {\r\n if (!this._myInsideView) return;\r\n if (!this._isMouseAllowed()) return;\r\n if (!this._isPointerEventIDValid(this._myLastValidPointerEvent)) return;\r\n if (!this._isPointerEventValid(this._myLastValidPointerEvent)) return;\r\n\r\n actionCallback(event);\r\n }\r\n\r\n _onPointerMove(event) {\r\n this._myResetMovingTimer.start(this._myResetMovingDelay);\r\n this._myMoving = true;\r\n }\r\n\r\n _onPointerDown(event) {\r\n let buttonInfo = this._myButtonInfos[event.button];\r\n if (!buttonInfo.myPressed) {\r\n buttonInfo.myPressed = true;\r\n buttonInfo.myPressStartToProcess = true;\r\n }\r\n }\r\n\r\n _onPointerUp(event) {\r\n let buttonInfo = this._myButtonInfos[event.button];\r\n if (buttonInfo.myPressed) {\r\n buttonInfo.myPressed = false;\r\n buttonInfo.myPressEndToProcess = true;\r\n }\r\n }\r\n\r\n _onPointerLeave(event) {\r\n if (!this._myInsideView || this._myLastValidPointerEvent == null || event.pointerId != this._myLastValidPointerEvent.pointerId) return;\r\n\r\n this._myInsideView = false;\r\n\r\n this._myMoving = false;\r\n\r\n if (this._myPointerUpOnPointerLeave) {\r\n for (let i = 0; i < this._myButtonInfosIDs.length; i++) {\r\n let id = this._myButtonInfosIDs[i];\r\n let buttonInfo = this._myButtonInfos[id];\r\n if (buttonInfo.myPressed) {\r\n buttonInfo.myPressed = false;\r\n buttonInfo.myPressEndToProcess = true;\r\n }\r\n }\r\n }\r\n\r\n this._myPointerID = null;\r\n }\r\n\r\n _onPointerEnter(event) {\r\n if ((this._myInsideView && this._myPointerID != null) || !this._isPointerEventIDValid(event) || !this._isPointerEventValid(event)) return;\r\n\r\n this._myInsideView = true;\r\n\r\n this._updatePosition(event);\r\n this._updatePointerData(event);\r\n }\r\n\r\n _preventContextMenu(event) {\r\n if (!this._isPointerEventIDValid(event) || !this._isPointerEventValid(event)) return;\r\n\r\n event.preventDefault();\r\n }\r\n\r\n _preventMiddleButtonScroll(event) {\r\n if (!this._isPointerEventIDValid(event) || !this._isPointerEventValid(event)) return;\r\n\r\n if (event.button == 1) {\r\n event.preventDefault();\r\n return false;\r\n }\r\n }\r\n\r\n _updatePosition(event) {\r\n this._myInternalMousePosition[0] = event.clientX;\r\n this._myInternalMousePosition[1] = event.clientY;\r\n\r\n this._myValid = true;\r\n }\r\n\r\n _updateScreenSize() {\r\n let bounds = document.body.getBoundingClientRect();\r\n this._myScreenSize[0] = bounds.width;\r\n this._myScreenSize[1] = bounds.height;\r\n }\r\n\r\n _updatePointerData(event) {\r\n this._myPointerID = event.pointerId;\r\n this._myLastValidPointerEvent = event;\r\n }\r\n\r\n _isPointerEventIDValid(event) {\r\n if (event == null) return false;\r\n\r\n return this._myPointerID == null || this._myPointerID == event.pointerId;\r\n }\r\n\r\n _isPointerEventValid(event) {\r\n if (event == null) return false;\r\n\r\n let valid = true;\r\n\r\n for (let i = 0; i < this._myPointerEventValidCallbacksIDs.length; i++) {\r\n let id = this._myPointerEventValidCallbacksIDs[i];\r\n let callback = this._myPointerEventValidCallbacks[id];\r\n if (!callback(event)) {\r\n valid = false;\r\n break;\r\n }\r\n }\r\n\r\n return valid;\r\n }\r\n\r\n _isMouseAllowed() {\r\n // Mouse events are valid only if the last pointer event was a mouse (id==1)\r\n return this._myLastValidPointerEvent != null && this._myLastValidPointerEvent.pointerId == 1;\r\n }\r\n\r\n _createButtonInfo() {\r\n return { myPressed: false, myPressStart: false, myPressStartToProcess: false, myPressEnd: false, myPressEndToProcess: false, };\r\n }\r\n\r\n destroy() {\r\n this._myDestroyed = true;\r\n\r\n this.setActive(false);\r\n }\r\n\r\n isDestroyed() {\r\n return this._myDestroyed;\r\n }\r\n}", "import { Component, Property } from \"@wonderlandengine/api\";\r\nimport { Globals } from \"../../../pp/globals.js\";\r\n\r\nexport class EnableToolComponent extends Component {\r\n static TypeName = \"pp-enable-tool\";\r\n static Properties = {\r\n _myEnable: Property.bool(true)\r\n };\r\n\r\n start() {\r\n this._myHasToolEnabled = this._myEnable;\r\n this._myToolEnabled = this._myEnable;\r\n }\r\n\r\n onActivate() {\r\n if (this._myHasToolEnabled) {\r\n Globals.setToolEnabled(this._myToolEnabled, this.engine);\r\n }\r\n }\r\n\r\n onDeactivate() {\r\n this._myHasToolEnabled = Globals.hasToolEnabled();\r\n this._myToolEnabled = Globals.isToolEnabled();\r\n Globals.removeToolEnabled(this.engine);\r\n }\r\n}", "import { Component, Property } from \"@wonderlandengine/api\";\r\nimport { Globals } from \"../../../pp/globals.js\";\r\nimport { ConsoleVR } from \"../console_vr.js\";\r\n\r\nexport class InitConsoleVRComponent extends Component {\r\n static TypeName = \"pp-init-console-vr\";\r\n static Properties = {\r\n _myInit: Property.bool(true)\r\n };\r\n\r\n init() {\r\n this._myConsoleVR = null;\r\n\r\n if (this._myInit) {\r\n this._myConsoleVR = new ConsoleVR(this.engine);\r\n }\r\n }\r\n\r\n onActivate() {\r\n if (this._myConsoleVR != null && !Globals.hasConsoleVR(this.engine)) {\r\n Globals.setConsoleVR(this._myConsoleVR, this.engine);\r\n }\r\n }\r\n\r\n onDeactivate() {\r\n if (this._myConsoleVR != null && Globals.getConsoleVR(this.engine) == this._myConsoleVR) {\r\n Globals.removeConsoleVR(this.engine);\r\n }\r\n }\r\n}", "import { Globals } from \"../../pp/globals.js\";\r\n\r\nlet _myConsoleOriginalLog = console.log;\r\nlet _myConsoleOriginalError = console.error;\r\nlet _myConsoleOriginalWarn = console.warn;\r\nlet _myConsoleOriginalInfo = console.info;\r\nlet _myConsoleOriginalDebug = console.debug;\r\nlet _myConsoleOriginalAssert = console.assert;\r\nlet _myConsoleOriginalClear = console.clear;\r\n\r\nexport function log(engine = Globals.getMainEngine(), ...args) {\r\n return ConsoleOriginalFunctions.getLog(engine).apply(console, args);\r\n}\r\n\r\nexport function error(engine = Globals.getMainEngine(), ...args) {\r\n return ConsoleOriginalFunctions.getError(engine).apply(console, args);\r\n}\r\n\r\nexport function warn(engine = Globals.getMainEngine(), ...args) {\r\n return ConsoleOriginalFunctions.getWarn(engine).apply(console, args);\r\n}\r\n\r\nexport function info(engine = Globals.getMainEngine(), ...args) {\r\n return ConsoleOriginalFunctions.getInfo(engine).apply(console, args);\r\n}\r\n\r\nexport function debug(engine = Globals.getMainEngine(), ...args) {\r\n return ConsoleOriginalFunctions.getDebug(engine).apply(console, args);\r\n}\r\n\r\nexport function assert(engine = Globals.getMainEngine(), ...args) {\r\n return ConsoleOriginalFunctions.getAssert(engine).apply(console, args);\r\n}\r\n\r\nexport function clear(engine = Globals.getMainEngine(), ...args) {\r\n return ConsoleOriginalFunctions.getClear(engine).apply(console, args);\r\n}\r\n\r\nexport function getLog(engine = Globals.getMainEngine()) {\r\n return _myConsoleOriginalLog;\r\n}\r\n\r\nexport function getError(engine = Globals.getMainEngine()) {\r\n return _myConsoleOriginalError;\r\n}\r\n\r\nexport function getWarn(engine = Globals.getMainEngine()) {\r\n return _myConsoleOriginalWarn;\r\n}\r\n\r\nexport function getInfo(engine = Globals.getMainEngine()) {\r\n return _myConsoleOriginalInfo;\r\n}\r\n\r\nexport function getDebug(engine = Globals.getMainEngine()) {\r\n return _myConsoleOriginalDebug;\r\n}\r\n\r\nexport function getAssert(engine = Globals.getMainEngine()) {\r\n return _myConsoleOriginalAssert;\r\n}\r\n\r\nexport function getClear(engine = Globals.getMainEngine()) {\r\n return _myConsoleOriginalClear;\r\n}\r\n\r\nexport let ConsoleOriginalFunctions = {\r\n log,\r\n error,\r\n warn,\r\n info,\r\n debug,\r\n assert,\r\n clear,\r\n getLog,\r\n getError,\r\n getWarn,\r\n getInfo,\r\n getDebug,\r\n getAssert,\r\n getClear\r\n};", "import { Globals } from \"../../pp/globals.js\";\r\nimport { ConsoleOriginalFunctions } from \"./console_original_functions.js\";\r\n\r\nexport class ConsoleVR {\r\n static myOriginalLog = ConsoleVR.prototype.log;\r\n static myOriginalError = ConsoleVR.prototype.error;\r\n static myOriginalWarn = ConsoleVR.prototype.warn;\r\n static myOriginalInfo = ConsoleVR.prototype.info;\r\n static myOriginalDebug = ConsoleVR.prototype.debug;\r\n static myOriginalAssert = ConsoleVR.prototype.assert;\r\n static myOriginalClear = ConsoleVR.prototype.clear;\r\n\r\n constructor(engine = Globals.getMainEngine()) {\r\n this._myEngine = engine;\r\n this._myForwardToBrowserConsole = true;\r\n }\r\n\r\n log(...args) {\r\n if (this._myForwardToBrowserConsole) {\r\n ConsoleOriginalFunctions.log(this._myEngine, ...args);\r\n }\r\n }\r\n\r\n error(...args) {\r\n if (this._myForwardToBrowserConsole) {\r\n ConsoleOriginalFunctions.error(this._myEngine, ...args);\r\n }\r\n }\r\n\r\n warn(...args) {\r\n if (this._myForwardToBrowserConsole) {\r\n ConsoleOriginalFunctions.warn(this._myEngine, ...args);\r\n }\r\n }\r\n\r\n info(...args) {\r\n if (this._myForwardToBrowserConsole) {\r\n ConsoleOriginalFunctions.info(this._myEngine, ...args);\r\n }\r\n }\r\n\r\n debug(...args) {\r\n if (this._myForwardToBrowserConsole) {\r\n ConsoleOriginalFunctions.debug(this._myEngine, ...args);\r\n }\r\n }\r\n\r\n assert(...args) {\r\n if (this._myForwardToBrowserConsole) {\r\n ConsoleOriginalFunctions.assert(this._myEngine, ...args);\r\n }\r\n }\r\n\r\n clear(...args) {\r\n if (this._myForwardToBrowserConsole) {\r\n ConsoleOriginalFunctions.clear(this._myEngine, ...args);\r\n }\r\n }\r\n\r\n setForwardToBrowserConsole(forwardToBrowserConsole) {\r\n this._myForwardToBrowserConsole = forwardToBrowserConsole;\r\n }\r\n\r\n isForwardToBrowserConsole() {\r\n return this._myForwardToBrowserConsole;\r\n }\r\n}", "import { Component, Property } from \"@wonderlandengine/api\";\r\nimport { Globals } from \"../../../pp/globals.js\";\r\nimport { EasyTuneVariables } from \"../easy_tune_variables.js\";\r\n\r\nexport class InitEasyTuneVariablesComponent extends Component {\r\n static TypeName = \"pp-init-easy-tune-variables\";\r\n static Properties = {\r\n _myInit: Property.bool(true)\r\n };\r\n\r\n init() {\r\n this._myEasyTuneVariables = null;\r\n\r\n if (this._myInit) {\r\n this._myEasyTuneVariables = new EasyTuneVariables();\r\n }\r\n }\r\n\r\n onActivate() {\r\n if (this._myEasyTuneVariables != null && !Globals.hasEasyTuneVariables(this.engine)) {\r\n Globals.setEasyTuneVariables(this._myEasyTuneVariables, this.engine);\r\n }\r\n }\r\n\r\n onDeactivate() {\r\n if (this._myEasyTuneVariables != null && Globals.getEasyTuneVariables(this.engine) == this._myEasyTuneVariables) {\r\n Globals.removeEasyTuneVariables(this.engine);\r\n }\r\n }\r\n}", "import { EasyTuneVariable, EasyTuneVariableTyped } from \"./easy_tune_variable_types.js\";\r\n\r\nexport class EasyTuneVariables {\r\n\r\n private readonly _myVariables: Map = new Map();\r\n\r\n public add(variable: EasyTuneVariable, overwriteCurrentOne = false): void {\r\n if (overwriteCurrentOne || !this._myVariables.has(variable.getName())) {\r\n this._myVariables.set(variable.getName(), variable);\r\n }\r\n }\r\n\r\n public remove(variableName: string): void {\r\n this._myVariables.delete(variableName);\r\n }\r\n\r\n public get(variableName: string): Readonly | null {\r\n const variable = this._myVariables.get(variableName);\r\n if (variable != null) {\r\n return variable.getValue() as ValueType;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n public set(variableName: string, value: Readonly, resetDefaultValue: boolean = false, skipValueChangedNotify: boolean = false): void {\r\n const variable = this._myVariables.get(variableName);\r\n if (variable != null) {\r\n variable.setValue(value, resetDefaultValue, skipValueChangedNotify);\r\n }\r\n }\r\n\r\n public has(variableName: string): boolean {\r\n return this._myVariables.has(variableName);\r\n }\r\n\r\n public length(): number {\r\n return this._myVariables.size;\r\n }\r\n\r\n public isWidgetCurrentVariable(variableName: string): boolean {\r\n const variable = this._myVariables.get(variableName);\r\n if (variable != null) {\r\n return variable.isWidgetCurrentVariable();\r\n }\r\n\r\n return false;\r\n }\r\n\r\n public getEasyTuneVariable(variableName: string): EasyTuneVariableType | null {\r\n return this._myVariables.get(variableName) as EasyTuneVariableType ?? null;\r\n }\r\n\r\n public getEasyTuneVariablesList(): EasyTuneVariable[] {\r\n return Array.from(this._myVariables.values());\r\n }\r\n\r\n public getEasyTuneVariablesNames(): string[] {\r\n return Array.from(this._myVariables.keys());\r\n }\r\n\r\n public changeEasyTuneVariableName(oldName: string, newName: string): void {\r\n const variableToChange = this._myVariables.get(oldName);\r\n if (variableToChange != null) {\r\n const oldVariables = new Map(this._myVariables);\r\n this._myVariables.clear();\r\n for (const [name, variable] of oldVariables) {\r\n if (name != oldName) {\r\n this._myVariables.set(name, variable);\r\n } else {\r\n this._myVariables.set(newName, variable);\r\n }\r\n }\r\n\r\n variableToChange.setName(newName);\r\n }\r\n }\r\n\r\n public fromJSON(json: string, resetDefaultValue: boolean = false, skipValueChangedNotify: boolean = false, manualImport: boolean = false): void {\r\n const objectJSON = JSON.parse(json);\r\n\r\n for (const variable of this._myVariables.values()) {\r\n if ((variable.isManualImportEnabled() && manualImport) || (variable.isAutoImportEnabled() && !manualImport)) {\r\n const variableName = variable.getName();\r\n if (Object.hasOwn(objectJSON, variableName)) {\r\n const variableValueJSON = objectJSON[variableName];\r\n variable.fromJSON(variableValueJSON, resetDefaultValue, skipValueChangedNotify);\r\n }\r\n }\r\n }\r\n }\r\n\r\n public toJSON(excludeVariablesWithValueAsDefault: boolean = false): string {\r\n const objectJSON: Record = {};\r\n\r\n for (const variable of this._myVariables.values()) {\r\n if (variable.isExportEnabled()) {\r\n if (!excludeVariablesWithValueAsDefault || !variable.isValueEqual(variable.getDefaultValue())) {\r\n objectJSON[variable.getName()] = variable.toJSON();\r\n }\r\n }\r\n }\r\n\r\n return JSON.stringify(objectJSON);\r\n }\r\n\r\n /**\r\n * @param id if `undefined` is used as id, it will overwrite the default variable listener\r\n */\r\n public registerValueChangedEventListener>(variableName: string, id: unknown, callback: (value: ValueType, easyTuneVariable: EasyTuneVariableType) => void): void {\r\n this._myVariables.get(variableName)!.registerValueChangedEventListener(id, callback as (value: unknown, easyTuneVariable: EasyTuneVariable) => void);\r\n }\r\n\r\n /**\r\n * @param id if `undefined` is used as id, it will unregister the default variable listener\r\n */\r\n public unregisterValueChangedEventListener(variableName: string, id?: unknown): void {\r\n this._myVariables.get(variableName)!.unregisterValueChangedEventListener(id);\r\n }\r\n}", "import { ARCamera8thwall, Cursor, CursorTarget, DebugObject, DeviceOrientationLook, FingerCursor, FixedFoveation, HandTracking, HitTestLocation, HowlerAudioListener, HowlerAudioSource, ImageTexture, MouseLookComponent, PlayerHeight, TargetFramerate, TeleportComponent, Trail, TwoJointIkSolver, VideoTexture, VrModeActiveSwitch, Vrm, WasdControlsComponent } from \"@wonderlandengine/components\";\r\n\r\nexport function registerWLComponents(engine) {\r\n engine.registerComponent(\r\n ARCamera8thwall,\r\n Cursor,\r\n CursorTarget,\r\n DebugObject,\r\n DeviceOrientationLook,\r\n FingerCursor,\r\n FixedFoveation,\r\n HandTracking,\r\n HitTestLocation,\r\n HowlerAudioListener,\r\n HowlerAudioSource,\r\n ImageTexture,\r\n MouseLookComponent,\r\n PlayerHeight,\r\n TargetFramerate,\r\n TeleportComponent,\r\n Trail,\r\n TwoJointIkSolver,\r\n VideoTexture,\r\n VrModeActiveSwitch,\r\n Vrm,\r\n WasdControlsComponent\r\n );\r\n}", "import { ArrayUtils } from \"./array/array_utils.js\";\r\n\r\nexport function getObjectPrototypes(object) {\r\n let prototypes = [];\r\n\r\n prototypes.push(object);\r\n\r\n let objectProto = Object.getPrototypeOf(object);\r\n while (objectProto != null) {\r\n ArrayUtils.pushUnique(prototypes, objectProto);\r\n objectProto = Object.getPrototypeOf(objectProto);\r\n }\r\n\r\n let prototypesToCheck = [object];\r\n while (prototypesToCheck.length > 0) {\r\n let prototypeToCheck = prototypesToCheck.shift();\r\n if (prototypeToCheck != null) {\r\n ArrayUtils.pushUnique(prototypes, prototypeToCheck);\r\n\r\n ArrayUtils.pushUnique(prototypesToCheck, Object.getPrototypeOf(prototypeToCheck));\r\n\r\n try {\r\n ArrayUtils.pushUnique(prototypesToCheck, prototypeToCheck.prototype);\r\n } catch (error) {\r\n // Ignored\r\n }\r\n }\r\n }\r\n\r\n return prototypes;\r\n}\r\n\r\nexport function getObjectPropertyNames(object) {\r\n let propertyNames = [];\r\n\r\n let prototypes = JSUtils.getObjectPrototypes(object);\r\n\r\n for (let prototype of prototypes) {\r\n if (prototype != null) {\r\n let ownPropertyNames = Object.getOwnPropertyNames(prototype);\r\n for (let ownPropertyName of ownPropertyNames) {\r\n ArrayUtils.pushUnique(propertyNames, ownPropertyName);\r\n }\r\n }\r\n }\r\n\r\n return propertyNames;\r\n}\r\n\r\nexport function getObjectPropertyDescriptor(object, propertyName) {\r\n let propertyDescriptor = null;\r\n\r\n let propertyParent = JSUtils.getObjectPropertyOwnParent(object, propertyName);\r\n\r\n if (propertyParent != null) {\r\n propertyDescriptor = Object.getOwnPropertyDescriptor(propertyParent, propertyName);\r\n }\r\n\r\n return propertyDescriptor;\r\n}\r\n\r\nexport function getObjectProperty(object, propertyName) {\r\n let property = undefined;\r\n\r\n let propertyDescriptor = JSUtils.getObjectPropertyDescriptor(object, propertyName);\r\n if (propertyDescriptor != null) {\r\n if (propertyDescriptor.get != null) {\r\n property = propertyDescriptor.get.bind(object)();\r\n } else {\r\n property = propertyDescriptor.value;\r\n }\r\n }\r\n\r\n return property;\r\n}\r\n\r\nexport function setObjectProperty(valueToSet, object, propertyName) {\r\n let propertyDescriptor = JSUtils.getObjectPropertyDescriptor(object, propertyName);\r\n\r\n let setUsed = false;\r\n if (propertyDescriptor != null) {\r\n if (propertyDescriptor.set != null) {\r\n setUsed = true;\r\n\r\n propertyDescriptor.set.bind(object)(valueToSet);\r\n }\r\n }\r\n\r\n if (!setUsed) {\r\n let propertyParent = JSUtils.getObjectPropertyOwnParent(object, propertyName);\r\n if (propertyParent == null) {\r\n propertyParent = object;\r\n }\r\n\r\n Object.defineProperty(propertyParent, propertyName, {\r\n value: valueToSet\r\n });\r\n }\r\n}\r\n\r\nexport function getObjectPropertyOwnParent(object, propertyName) {\r\n let parent = null;\r\n\r\n let parents = JSUtils.getObjectPropertyOwnParents(object, propertyName);\r\n if (parents.length > 0) {\r\n parent = parents[0];\r\n }\r\n\r\n return parent;\r\n}\r\n\r\nexport function getObjectPropertyOwnParents(object, propertyName) {\r\n let parents = [];\r\n\r\n let possibleParents = JSUtils.getObjectPrototypes(object);\r\n\r\n for (let possibleParent of possibleParents) {\r\n let propertyNames = Object.getOwnPropertyNames(possibleParent);\r\n if (ArrayUtils.hasEqual(propertyNames, propertyName)) {\r\n parents.push(possibleParent);\r\n }\r\n }\r\n\r\n return parents;\r\n}\r\n\r\nexport function getObjectFromPath(path, pathStartObject = window) {\r\n let object = null;\r\n\r\n let objectName = JSUtils.getObjectNameFromPath(path);\r\n if (objectName != null) {\r\n object = JSUtils.getObjectProperty(JSUtils.getObjectParentFromPath(path, pathStartObject), objectName);\r\n }\r\n\r\n return object;\r\n}\r\n\r\nexport function getObjectNameFromPath(path) {\r\n let objectName = null;\r\n\r\n if (path != null) {\r\n let pathSplit = path.split(\".\");\r\n if (pathSplit.length > 0) {\r\n objectName = pathSplit[pathSplit.length - 1];\r\n }\r\n }\r\n\r\n return objectName;\r\n}\r\n\r\nexport function getObjectParentFromPath(path, pathStartObject = window) {\r\n let pathSplit = path.split(\".\");\r\n let currentParent = pathStartObject;\r\n for (let i = 0; i < pathSplit.length - 1; i++) {\r\n currentParent = JSUtils.getObjectProperty(currentParent, pathSplit[i]);\r\n }\r\n\r\n return currentParent;\r\n}\r\n\r\nexport function overwriteObjectProperty(newProperty, object, propertyName, overwriteOnOwnParent = true, jsObjectFunctionsSpecialOverwrite = false, logEnabled = false) {\r\n let success = false;\r\n\r\n try {\r\n let propertyOwnParent = JSUtils.getObjectPropertyOwnParent(object, propertyName);\r\n if (propertyOwnParent != null) {\r\n let originalPropertyDescriptor = Object.getOwnPropertyDescriptor(propertyOwnParent, propertyName);\r\n\r\n if (originalPropertyDescriptor != null) {\r\n let originalProperty = JSUtils.getObjectProperty(propertyOwnParent, propertyName);\r\n JSUtils.copyObjectProperties(originalProperty, newProperty, true, jsObjectFunctionsSpecialOverwrite, logEnabled);\r\n\r\n let overwriteTarget = object;\r\n if (overwriteOnOwnParent) {\r\n overwriteTarget = propertyOwnParent;\r\n }\r\n\r\n Object.defineProperty(overwriteTarget, propertyName, {\r\n value: newProperty,\r\n enumerable: originalPropertyDescriptor.enumerable,\r\n writable: originalPropertyDescriptor.writable,\r\n configurable: originalPropertyDescriptor.configurable\r\n });\r\n\r\n success = true;\r\n } else {\r\n Object.defineProperty(object, propertyName, {\r\n value: newProperty\r\n });\r\n\r\n success = true;\r\n }\r\n } else {\r\n Object.defineProperty(object, propertyName, {\r\n value: newProperty\r\n });\r\n\r\n success = true;\r\n }\r\n } catch (error) {\r\n if (logEnabled) {\r\n console.error(\"Property:\", propertyName, \"of:\", object, \"can't be overwritten.\");\r\n }\r\n }\r\n\r\n return success;\r\n}\r\n\r\nexport function copyObjectProperties(fromObject, toObject, cleanCopy = false, jsObjectFunctionsSpecialCopy = false, logEnabled = false) {\r\n if (fromObject != null) {\r\n if (cleanCopy) {\r\n JSUtils.cleanObjectProperties(toObject);\r\n }\r\n\r\n Object.setPrototypeOf(toObject, Object.getPrototypeOf(fromObject));\r\n\r\n let fromObjectPropertyNames = Object.getOwnPropertyNames(fromObject);\r\n for (let fromObjectPropertyName of fromObjectPropertyNames) {\r\n try {\r\n let fromObjectPropertyDescriptor = Object.getOwnPropertyDescriptor(fromObject, fromObjectPropertyName);\r\n\r\n Object.defineProperty(toObject, fromObjectPropertyName, {\r\n value: fromObjectPropertyDescriptor.value,\r\n enumerable: fromObjectPropertyDescriptor.enumerable,\r\n writable: fromObjectPropertyDescriptor.writable,\r\n configurable: fromObjectPropertyDescriptor.configurable\r\n });\r\n } catch (error) {\r\n if (logEnabled) {\r\n console.error(\"Property:\", fromObjectPropertyName, \"of:\", fromObject.name, \"can't be overwritten.\");\r\n }\r\n }\r\n }\r\n\r\n if (jsObjectFunctionsSpecialCopy) {\r\n _jsObjectFunctionsSpecialCopy(fromObject, toObject);\r\n }\r\n }\r\n}\r\n\r\nexport function cleanObjectProperties(object) {\r\n let objectNames = Object.getOwnPropertyNames(object);\r\n ArrayUtils.pushUnique(objectNames, \"__proto__\");\r\n\r\n for (let objectName of objectNames) {\r\n try {\r\n Object.defineProperty(object, objectName, {\r\n value: undefined\r\n });\r\n } catch (error) {\r\n // Ignored\r\n }\r\n\r\n try {\r\n delete object[objectName];\r\n } catch (error) {\r\n // Ignored\r\n }\r\n }\r\n\r\n Object.setPrototypeOf(object, null);\r\n}\r\n\r\nexport function doesObjectPropertyUseAccessors(object, propertyName) {\r\n let propertyUseAccessors = false;\r\n\r\n let propertyDescriptor = JSUtils.getObjectPropertyDescriptor(object, propertyName);\r\n\r\n if (propertyDescriptor != null && (propertyDescriptor.get != null || propertyDescriptor.set != null)) {\r\n propertyUseAccessors = true;\r\n }\r\n\r\n return propertyUseAccessors;\r\n}\r\n\r\nexport function isFunctionByName(functionParent, functionName) {\r\n let isFunctionResult = false;\r\n\r\n let functionProperty = JSUtils.getObjectProperty(functionParent, functionName);\r\n if (functionProperty != null) {\r\n isFunctionResult = JSUtils.isFunction(functionProperty);\r\n }\r\n\r\n return isFunctionResult;\r\n}\r\n\r\nexport function isClassByName(classParent, className) {\r\n let isClassResult = false;\r\n\r\n let classProperty = JSUtils.getObjectProperty(classParent, className);\r\n if (classProperty != null) {\r\n isClassResult = JSUtils.isClass(classProperty);\r\n }\r\n\r\n return isClassResult;\r\n}\r\n\r\nexport function isObjectByName(objectParent, objectName) {\r\n let isObjectResult = false;\r\n\r\n let objectProperty = JSUtils.getObjectProperty(objectParent, objectName);\r\n if (objectProperty != null) {\r\n isObjectResult = JSUtils.isObject(objectProperty);\r\n }\r\n\r\n return isObjectResult;\r\n}\r\n\r\nexport function isFunction(property) {\r\n return typeof property == \"function\" && !JSUtils.isClass(property);\r\n}\r\n\r\nexport let isClass = function () {\r\n let checkClassRegex = new RegExp(\"^class\");\r\n return function isClass(property) {\r\n return typeof property == \"function\" &&\r\n property.prototype != null && typeof property.prototype.constructor == \"function\" &&\r\n property.toString != null && typeof property.toString == \"function\" && property.toString()?.match(checkClassRegex) != null;\r\n };\r\n}();\r\n\r\nexport function isObject(property) {\r\n return typeof property == \"object\";\r\n}\r\n\r\nexport let JSUtils = {\r\n getObjectPrototypes,\r\n getObjectPropertyNames,\r\n getObjectPropertyDescriptor,\r\n getObjectProperty,\r\n setObjectProperty,\r\n getObjectPropertyOwnParent,\r\n getObjectPropertyOwnParents,\r\n getObjectFromPath,\r\n getObjectNameFromPath,\r\n getObjectParentFromPath,\r\n overwriteObjectProperty,\r\n copyObjectProperties,\r\n cleanObjectProperties,\r\n doesObjectPropertyUseAccessors,\r\n isFunctionByName,\r\n isClassByName,\r\n isObjectByName,\r\n isFunction,\r\n isClass,\r\n isObject\r\n};\r\n\r\n\r\n\r\nfunction _jsObjectFunctionsSpecialCopy(fromObject, toObject) {\r\n try {\r\n if (typeof toObject == \"function\" && typeof fromObject == \"function\") {\r\n let functionsToOverwrite = [\"toString\", \"toLocaleString\", \"valueOf\"];\r\n\r\n for (let functionToOverwrite of functionsToOverwrite) {\r\n let propertyDescriptorToOverwrite = JSUtils.getObjectPropertyDescriptor(fromObject, functionToOverwrite);\r\n\r\n if (propertyDescriptorToOverwrite != null && propertyDescriptorToOverwrite.value != null &&\r\n (propertyDescriptorToOverwrite.value == Object[functionToOverwrite])) {\r\n let valueToReturn = Object[functionToOverwrite].bind(fromObject)();\r\n let overwrittenFunction = function () { return valueToReturn; };\r\n JSUtils.overwriteObjectProperty(overwrittenFunction, toObject, functionToOverwrite, false, false);\r\n }\r\n }\r\n }\r\n } catch (error) {\r\n // Ignored\r\n }\r\n}", "import { JSUtils } from \"../../cauldron/utils/js_utils.js\";\r\n\r\nexport function injectOwnProperties(fromReference: T, toReference: object, enumerable: boolean = true, writable: boolean = true, configurable: boolean = true, keepOriginalDescriptorAttributes: boolean = true, bindThisAsFirstParam: boolean = false, prefix?: string, functionNamesToExclude: Readonly = []): void {\r\n const ownPropertyNames = Object.getOwnPropertyNames(fromReference);\r\n const fromReferenceAsRecord = fromReference as Record;\r\n for (const ownPropertyName of ownPropertyNames) {\r\n if (functionNamesToExclude.includes(ownPropertyName)) continue;\r\n\r\n let enumerableToUse: boolean | undefined = enumerable;\r\n let writableToUse: boolean | undefined = writable;\r\n let configurableToUse: boolean | undefined = configurable;\r\n\r\n if (keepOriginalDescriptorAttributes) {\r\n const originalDescriptor = Object.getOwnPropertyDescriptor(toReference, ownPropertyName);\r\n if (originalDescriptor != null) {\r\n enumerableToUse = originalDescriptor.enumerable;\r\n writableToUse = originalDescriptor.writable;\r\n configurableToUse = originalDescriptor.configurable;\r\n }\r\n }\r\n\r\n let adjustedPropertyName = ownPropertyName;\r\n if (prefix != null) {\r\n if (adjustedPropertyName.length > 0 && adjustedPropertyName[0] == adjustedPropertyName[0].toUpperCase()) {\r\n adjustedPropertyName = prefix.toUpperCase() + adjustedPropertyName;\r\n } else {\r\n adjustedPropertyName = prefix + adjustedPropertyName;\r\n }\r\n }\r\n\r\n const propertyDescriptor = Object.getOwnPropertyDescriptor(fromReference, ownPropertyName);\r\n const useAccessors = propertyDescriptor != null && (propertyDescriptor.get != null || propertyDescriptor.set != null);\r\n\r\n if (!useAccessors) {\r\n let adjustedProperyValue = fromReferenceAsRecord[ownPropertyName];\r\n\r\n if (bindThisAsFirstParam && JSUtils.isFunction(adjustedProperyValue)) {\r\n const originalFunction = fromReferenceAsRecord[ownPropertyName] as (this: unknown, ...args: unknown[]) => unknown;\r\n adjustedProperyValue = function (this: unknown, ...args: unknown[]) {\r\n return originalFunction(this, ...args);\r\n };\r\n\r\n Object.defineProperty(adjustedProperyValue, \"name\", {\r\n value: adjustedPropertyName\r\n });\r\n }\r\n\r\n Object.defineProperty(toReference, adjustedPropertyName, {\r\n value: adjustedProperyValue,\r\n enumerable: enumerableToUse,\r\n writable: writableToUse,\r\n configurable: configurableToUse\r\n });\r\n } else {\r\n Object.defineProperty(toReference, adjustedPropertyName, {\r\n get: propertyDescriptor.get,\r\n set: propertyDescriptor.set,\r\n enumerable: enumerableToUse,\r\n configurable: configurableToUse\r\n });\r\n }\r\n }\r\n}\r\n\r\nexport const PluginUtils = {\r\n injectOwnProperties\r\n} as const;", "export const ARRAY_LIKE_CLASSES = [\r\n Array,\r\n Uint8ClampedArray,\r\n Uint8Array,\r\n Uint16Array,\r\n Uint32Array,\r\n Int8Array,\r\n Int16Array,\r\n Int32Array,\r\n Float32Array,\r\n Float64Array\r\n] as const;\r\n\r\nexport const MUTABLE_ARRAY_LIKE_CLASSES = [\r\n Array\r\n] as const;\r\n\r\nexport const ArrayExtensionUtils = {\r\n ARRAY_LIKE_CLASSES,\r\n MUTABLE_ARRAY_LIKE_CLASSES\r\n} as const;", "import { ArrayLike, DynamicArrayLike } from \"../../../../cauldron/type_definitions/array_type_definitions.js\";\r\nimport { ArrayUtils } from \"../../../../cauldron/utils/array/array_utils.js\";\r\nimport { PluginUtils } from \"../../../utils/plugin_utils.js\";\r\nimport { ArrayExtensionUtils } from \"./array_extension_utils.js\";\r\nimport { ArrayLikeExtension, DynamicArrayLikeOwnExtension } from \"./array_type_extension.js\";\r\n\r\nimport \"./array_type_extension.js\";\r\n\r\nexport function initArrayExtension(): void {\r\n _initArrayLikeExtensionProtoypes();\r\n _initDynamicArrayOwnExtensionProtoype();\r\n}\r\n\r\nfunction _initArrayLikeExtensionProtoypes(): void {\r\n\r\n const arrayLikeExtension: ArrayLikeExtension, any> = {\r\n\r\n pp_copy, T>(this: ArrayType, array: Readonly>, copyCallback?: (arrayElement: T, thisElement: T) => T): ArrayType {\r\n return ArrayUtils.copy(array, this, copyCallback);\r\n },\r\n\r\n pp_clone, T>(this: Readonly, cloneCallback?: (elementToClone: T) => T): ArrayType {\r\n return ArrayUtils.clone(this, cloneCallback);\r\n },\r\n\r\n pp_equals(this: Readonly>, array: Readonly>, elementsEqualCallback?: (thisElement: T, arrayElement: T) => boolean): boolean {\r\n return ArrayUtils.equals(this, array, elementsEqualCallback);\r\n },\r\n\r\n pp_first(this: Readonly>): T | undefined {\r\n return ArrayUtils.first(this);\r\n },\r\n\r\n pp_last(this: Readonly>): T | undefined {\r\n return ArrayUtils.last(this);\r\n },\r\n\r\n pp_has(this: Readonly>, callback: (elementToCheck: T, elementIndex: number) => boolean): boolean {\r\n return ArrayUtils.has(this, callback);\r\n },\r\n\r\n pp_hasEqual(this: Readonly>, elementToFind: T, elementsEqualCallback?: (elementToCheck: T, elementToFind: T) => boolean): boolean {\r\n return ArrayUtils.hasEqual(this, elementToFind, elementsEqualCallback);\r\n },\r\n\r\n pp_find(this: Readonly>, callback: (elementToCheck: T, elementIndex: number) => boolean): T | undefined {\r\n return ArrayUtils.find(this, callback);\r\n },\r\n\r\n pp_findIndex(this: Readonly>, callback: (elementToCheck: T, elementIndex: number) => boolean): number {\r\n return ArrayUtils.findIndex(this, callback);\r\n },\r\n\r\n pp_findAll(this: Readonly>, callback: (elementToCheck: T, elementIndex: number) => boolean): T[] {\r\n return ArrayUtils.findAll(this, callback);\r\n },\r\n\r\n pp_findAllIndexes(this: Readonly>, callback: (elementToCheck: T, elementIndex: number) => boolean): number[] {\r\n return ArrayUtils.findAllIndexes(this, callback);\r\n },\r\n\r\n pp_findEqual(this: Readonly>, elementToFind: T, elementsEqualCallback?: (elementToCheck: T, elementToFind: T) => boolean): T | undefined {\r\n return ArrayUtils.findEqual(this, elementToFind, elementsEqualCallback);\r\n },\r\n\r\n pp_findAllEqual(this: Readonly>, elementToFind: T, elementsEqualCallback?: (elementToCheck: T, elementToFind: T) => boolean): T[] {\r\n return ArrayUtils.findAllEqual(this, elementToFind, elementsEqualCallback);\r\n },\r\n\r\n pp_findIndexEqual(this: Readonly>, elementToFind: T, elementsEqualCallback?: (elementToCheck: T, elementToFind: T) => boolean): number {\r\n return ArrayUtils.findIndexEqual(this, elementToFind, elementsEqualCallback);\r\n },\r\n\r\n pp_findAllIndexesEqual(this: Readonly>, elementToFind: T, elementsEqualCallback?: (elementToCheck: T, elementToFind: T) => boolean): number[] {\r\n return ArrayUtils.findAllIndexesEqual(this, elementToFind, elementsEqualCallback);\r\n }\r\n };\r\n\r\n for (const arrayLikeClassToExtend of ArrayExtensionUtils.ARRAY_LIKE_CLASSES) {\r\n PluginUtils.injectOwnProperties(arrayLikeExtension, arrayLikeClassToExtend.prototype, false, true, true);\r\n }\r\n}\r\n\r\nfunction _initDynamicArrayOwnExtensionProtoype(): void {\r\n\r\n const dynamicArrayOwnExtension: DynamicArrayLikeOwnExtension, any> = {\r\n\r\n pp_remove(this: DynamicArrayLike, callback: (elementToCheck: T, elementIndex: number) => boolean): T | undefined {\r\n return ArrayUtils.remove(this, callback);\r\n },\r\n\r\n pp_removeIndex(this: DynamicArrayLike, index: number): T | undefined {\r\n return ArrayUtils.removeIndex(this, index);\r\n },\r\n\r\n pp_removeAll(this: DynamicArrayLike, callback: (elementToCheck: T, elementIndex: number) => boolean): T[] {\r\n return ArrayUtils.removeAll(this, callback);\r\n },\r\n\r\n pp_removeAllIndexes(this: DynamicArrayLike, indexes: ArrayLike): T[] {\r\n return ArrayUtils.removeAllIndexes(this, indexes);\r\n },\r\n\r\n pp_removeEqual(this: DynamicArrayLike, elementToRemove: T, elementsEqualCallback?: (elementToCheck: T, elementToRemove: T) => boolean): T | undefined {\r\n return ArrayUtils.removeEqual(this, elementToRemove, elementsEqualCallback);\r\n },\r\n\r\n pp_removeAllEqual(this: DynamicArrayLike, elementToRemove: T, elementsEqualCallback?: (elementToCheck: T, elementToRemove: T) => boolean): T[] {\r\n return ArrayUtils.removeAllEqual(this, elementToRemove, elementsEqualCallback);\r\n },\r\n\r\n pp_clear, T>(this: ArrayType): ArrayType {\r\n return ArrayUtils.clear(this);\r\n },\r\n\r\n pp_pushUnique(this: DynamicArrayLike, elementToAdd: T, elementsEqualCallback?: (elementToCheck: T, elementToAdd: T) => boolean): number {\r\n return ArrayUtils.pushUnique(this, elementToAdd, elementsEqualCallback);\r\n },\r\n\r\n pp_unshiftUnique(this: DynamicArrayLike, elementToAdd: T, elementsEqualCallback?: (elementToCheck: T, elementToAdd: T) => boolean): number {\r\n return ArrayUtils.unshiftUnique(this, elementToAdd, elementsEqualCallback);\r\n }\r\n };\r\n\r\n for (const dynamicArrayLikeClassToExtend of ArrayExtensionUtils.MUTABLE_ARRAY_LIKE_CLASSES) {\r\n PluginUtils.injectOwnProperties(dynamicArrayOwnExtension, dynamicArrayLikeClassToExtend.prototype, false, true, true);\r\n }\r\n}", "import { Matrix3, Quaternion, Vector3 } from \"../../../../cauldron/type_definitions/array_type_definitions.js\";\r\nimport { Mat3Utils } from \"../../../../cauldron/utils/array/mat3_utils.js\";\r\nimport { PluginUtils } from \"../../../utils/plugin_utils.js\";\r\nimport { ArrayExtensionUtils } from \"./array_extension_utils.js\";\r\nimport { Matrix3Extension } from \"./mat3_type_extension.js\";\r\n\r\nimport \"./mat3_type_extension.js\";\r\n\r\nexport function initMat3Extension(): void {\r\n _initMat3ExtensionProtoype();\r\n}\r\n\r\nfunction _initMat3ExtensionProtoype(): void {\r\n\r\n const mat3Extension: Matrix3Extension = {\r\n\r\n mat3_set(this: T,\r\n m00: number, m01?: number, m02?: number,\r\n m10?: number, m11?: number, m12?: number,\r\n m20?: number, m21?: number, m22?: number): T {\r\n return Mat3Utils.set(this,\r\n m00, m01!, m02!,\r\n m10!, m11!, m12!,\r\n m20!, m21!, m22!\r\n );\r\n },\r\n\r\n mat3_copy(this: T, matrix: Readonly): T {\r\n return Mat3Utils.copy(matrix, this);\r\n },\r\n\r\n mat3_clone(this: Readonly): T {\r\n return Mat3Utils.clone(this);\r\n },\r\n\r\n mat3_equals(this: Readonly, matrix: Readonly, epsilon?: number): boolean {\r\n return Mat3Utils.equals(this, matrix, epsilon);\r\n },\r\n\r\n mat3_toDegrees(this: Readonly, out?: Vector3 | U): Vector3 | U {\r\n return Mat3Utils.toDegrees(this, out!);\r\n },\r\n\r\n mat3_toRadians(this: Readonly, out?: Vector3 | U): Vector3 | U {\r\n return Mat3Utils.toRadians(this, out!);\r\n },\r\n\r\n mat3_toQuat(this: Readonly, out?: Quaternion | U): Quaternion | U {\r\n return Mat3Utils.toQuat(this, out!);\r\n },\r\n\r\n mat3_fromAxes(this: T, left: Readonly, up: Readonly, forward: Readonly): T {\r\n return Mat3Utils.fromAxes(left, up, forward, this);\r\n }\r\n };\r\n\r\n for (const arrayLikeClassToExtend of ArrayExtensionUtils.ARRAY_LIKE_CLASSES) {\r\n PluginUtils.injectOwnProperties(mat3Extension, arrayLikeClassToExtend.prototype, false, true, true);\r\n }\r\n}", "import { Matrix4, Quaternion, Quaternion2, Vector3 } from \"../../../../cauldron/type_definitions/array_type_definitions.js\";\r\nimport { Mat4Utils } from \"../../../../cauldron/utils/array/mat4_utils.js\";\r\nimport { PluginUtils } from \"../../../utils/plugin_utils.js\";\r\nimport { ArrayExtensionUtils } from \"./array_extension_utils.js\";\r\nimport { Matrix4Extension } from \"./mat4_type_extension.js\";\r\n\r\nimport \"./mat4_type_extension.js\";\r\n\r\nexport function initMat4Extension(): void {\r\n _initMat4ExtensionProtoype();\r\n}\r\n\r\nfunction _initMat4ExtensionProtoype(): void {\r\n\r\n const matrix4Extension: Matrix4Extension = {\r\n\r\n mat4_set(this: T,\r\n m00: number, m01?: number, m02?: number, m03?: number,\r\n m10?: number, m11?: number, m12?: number, m13?: number,\r\n m20?: number, m21?: number, m22?: number, m23?: number,\r\n m30?: number, m31?: number, m32?: number, m33?: number): T {\r\n return Mat4Utils.set(this,\r\n m00, m01!, m02!, m03!,\r\n m10!, m11!, m12!, m13!,\r\n m20!, m21!, m22!, m23!,\r\n m30!, m31!, m32!, m33!\r\n );\r\n },\r\n\r\n mat4_copy(this: T, matrix: Readonly): T {\r\n return Mat4Utils.copy(matrix, this);\r\n },\r\n\r\n mat4_clone(this: Readonly): T {\r\n return Mat4Utils.clone(this);\r\n },\r\n\r\n mat4_equals(this: Readonly, matrix: Readonly, epsilon?: number): boolean {\r\n return Mat4Utils.equals(this, matrix, epsilon);\r\n },\r\n\r\n mat4_identity(this: T): T {\r\n return Mat4Utils.identity(this);\r\n },\r\n\r\n mat4_invert(this: Readonly, out?: T | U): T | U {\r\n return Mat4Utils.invert(this, out!);\r\n },\r\n\r\n mat4_mul(this: Readonly, matrix: Readonly, out?: T | U): T | U {\r\n return Mat4Utils.mul(this, matrix, out!);\r\n },\r\n\r\n mat4_scale(this: Readonly, vector: Readonly, out?: T | U): T | U {\r\n return Mat4Utils.scale(this, vector, out!);\r\n },\r\n\r\n mat4_getPosition(this: Readonly, out?: Vector3): Vector3 | T {\r\n return Mat4Utils.getPosition(this, out!);\r\n },\r\n\r\n mat4_getRotation(this: Readonly, out?: Vector3): Vector3 | T {\r\n return Mat4Utils.getRotation(this, out!);\r\n },\r\n\r\n mat4_getRotationDegrees(this: Readonly, out?: Vector3): Vector3 | T {\r\n return Mat4Utils.getRotationDegrees(this, out!);\r\n },\r\n\r\n mat4_getRotationRadians(this: Readonly, out?: Vector3): Vector3 | T {\r\n return Mat4Utils.getRotationRadians(this, out!);\r\n },\r\n\r\n mat4_getRotationQuat(this: Readonly, out?: Quaternion | T): Quaternion | T {\r\n return Mat4Utils.getRotationQuat(this, out!);\r\n },\r\n\r\n mat4_getScale(this: Readonly, out?: Vector3): Vector3 | T {\r\n return Mat4Utils.getScale(this, out!);\r\n },\r\n\r\n mat4_setPosition(this: T, position: Readonly): T {\r\n return Mat4Utils.setPosition(this, position);\r\n },\r\n\r\n mat4_setRotation(this: T, rotation: Readonly): T {\r\n return Mat4Utils.setRotation(this, rotation);\r\n },\r\n\r\n mat4_setRotationDegrees(this: T, rotation: Readonly): T {\r\n return Mat4Utils.setRotationDegrees(this, rotation);\r\n },\r\n\r\n mat4_setRotationRadians(this: T, rotation: Readonly): T {\r\n return Mat4Utils.setRotationRadians(this, rotation);\r\n },\r\n\r\n mat4_setRotationQuat(this: T, rotation: Readonly): T {\r\n return Mat4Utils.setRotationQuat(this, rotation);\r\n },\r\n\r\n mat4_setScale(this: T, scale: Readonly): T {\r\n return Mat4Utils.setScale(this, scale);\r\n },\r\n\r\n mat4_setPositionRotationScale(this: T, position: Readonly, rotation: Readonly, scale: Readonly): T {\r\n return Mat4Utils.setPositionRotationScale(this, position, rotation, scale);\r\n },\r\n\r\n mat4_setPositionRotationDegreesScale(this: T, position: Readonly, rotation: Readonly, scale: Readonly): T {\r\n return Mat4Utils.setPositionRotationDegreesScale(this, position, rotation, scale);\r\n },\r\n\r\n mat4_setPositionRotationRadiansScale(this: T, position: Readonly, rotation: Readonly, scale: Readonly): T {\r\n return Mat4Utils.setPositionRotationRadiansScale(this, position, rotation, scale);\r\n },\r\n\r\n mat4_setPositionRotationQuatScale(this: T, position: Readonly, rotation: Readonly, scale: Readonly): T {\r\n return Mat4Utils.setPositionRotationQuatScale(this, position, rotation, scale);\r\n },\r\n\r\n mat4_setPositionRotation(this: T, position: Readonly, rotation: Readonly): T {\r\n return Mat4Utils.setPositionRotation(this, position, rotation);\r\n },\r\n\r\n mat4_setPositionRotationDegrees(this: T, position: Readonly, rotation: Readonly): T {\r\n return Mat4Utils.setPositionRotationDegrees(this, position, rotation);\r\n },\r\n\r\n mat4_setPositionRotationRadians(this: T, position: Readonly, rotation: Readonly): T {\r\n return Mat4Utils.setPositionRotationRadians(this, position, rotation);\r\n },\r\n\r\n mat4_setPositionRotationQuat(this: T, position: Readonly, rotation: Readonly): T {\r\n return Mat4Utils.setPositionRotationQuat(this, position, rotation);\r\n },\r\n\r\n mat4_getAxes(this: Readonly, out?: [Vector3, Vector3, Vector3] | [T, U, V]): [Vector3, Vector3, Vector3] | [T, U, V] {\r\n return Mat4Utils.getAxes(this, out!);\r\n },\r\n\r\n mat4_getForward(this: Readonly, out?: Vector3): Vector3 | T {\r\n return Mat4Utils.getForward(this, out!);\r\n },\r\n\r\n mat4_getBackward(this: Readonly, out?: Vector3 | T): Vector3 | T {\r\n return Mat4Utils.getBackward(this, out!);\r\n },\r\n\r\n mat4_getLeft(this: Readonly, out?: Vector3): Vector3 | T {\r\n return Mat4Utils.getLeft(this, out!);\r\n },\r\n\r\n mat4_getRight(this: Readonly, out?: Vector3 | T): Vector3 | T {\r\n return Mat4Utils.getRight(this, out!);\r\n },\r\n\r\n mat4_getUp(this: Readonly, out?: Vector3): Vector3 | T {\r\n return Mat4Utils.getUp(this, out!);\r\n },\r\n\r\n mat4_getDown(this: Readonly, out?: Vector3 | T): Vector3 | T {\r\n return Mat4Utils.getDown(this, out!);\r\n },\r\n\r\n mat4_hasUniformScale(this: Readonly): boolean {\r\n return Mat4Utils.hasUniformScale(this);\r\n },\r\n\r\n mat4_toWorld(this: Readonly, parentTransformMatrix: Readonly, out?: T | U): T | U {\r\n return Mat4Utils.toWorld(this, parentTransformMatrix, out!);\r\n },\r\n\r\n mat4_toLocal(this: Readonly, parentTransformMatrix: Readonly, out?: T | U): T | U {\r\n return Mat4Utils.toLocal(this, parentTransformMatrix, out!);\r\n },\r\n\r\n mat4_toQuat(this: Readonly, out?: Quaternion2 | T): Quaternion2 | T {\r\n return Mat4Utils.toQuat(this, out!);\r\n },\r\n\r\n mat4_fromQuat(this: T, quat: Readonly): T {\r\n return Mat4Utils.fromQuat(quat, this);\r\n }\r\n };\r\n\r\n for (const arrayLikeClassToExtend of ArrayExtensionUtils.ARRAY_LIKE_CLASSES) {\r\n PluginUtils.injectOwnProperties(matrix4Extension, arrayLikeClassToExtend.prototype, false, true, true);\r\n }\r\n}", "import { Matrix4, Quaternion, Quaternion2, Vector3 } from \"../../../../cauldron/type_definitions/array_type_definitions.js\";\r\nimport { Quat2Utils } from \"../../../../cauldron/utils/array/quat2_utils.js\";\r\nimport { EasingFunction } from \"../../../../cauldron/utils/math_utils.js\";\r\nimport { PluginUtils } from \"../../../utils/plugin_utils.js\";\r\nimport { ArrayExtensionUtils } from \"./array_extension_utils.js\";\r\nimport { Quaternion2Extension } from \"./quat2_type_extension.js\";\r\n\r\nimport \"./quat2_type_extension.js\";\r\n\r\nexport function initQuat2Extension(): void {\r\n _initQuat2ExtensionProtoype();\r\n}\r\n\r\nfunction _initQuat2ExtensionProtoype(): void {\r\n\r\n const quat2Extension: Quaternion2Extension = {\r\n\r\n quat2_set(this: T, x1: number, y1?: number, z1?: number, w1?: number, x2?: number, y2?: number, z2?: number, w2?: number): T {\r\n return Quat2Utils.set(this, x1, y1!, z1!, w1!, x2!, y2!, z2!, w2!);\r\n },\r\n\r\n quat2_copy(this: T, quat: Readonly): T {\r\n return Quat2Utils.copy(quat, this);\r\n },\r\n\r\n quat2_clone(this: Readonly): T {\r\n return Quat2Utils.clone(this);\r\n },\r\n\r\n quat2_equals(this: Readonly, quat: Readonly, epsilon?: number): boolean {\r\n return Quat2Utils.equals(this, quat, epsilon);\r\n },\r\n\r\n quat2_isNormalized(this: Readonly, epsilon?: number): boolean {\r\n return Quat2Utils.isNormalized(this, epsilon);\r\n },\r\n\r\n quat2_normalize(this: Readonly, out?: T | U): T | U {\r\n return Quat2Utils.normalize(this, out!);\r\n },\r\n\r\n quat2_length(this: Readonly): number {\r\n return Quat2Utils.length(this);\r\n },\r\n\r\n quat2_lengthSquared(this: Readonly): number {\r\n return Quat2Utils.lengthSquared(this);\r\n },\r\n\r\n quat2_identity(this: T): T {\r\n return Quat2Utils.identity(this);\r\n },\r\n\r\n quat2_mul(this: Readonly, quat: Readonly, out?: T | U): T | U {\r\n return Quat2Utils.mul(this, quat, out!);\r\n },\r\n\r\n quat2_invert(this: Readonly, out?: T | U): T | U {\r\n return Quat2Utils.invert(this, out!);\r\n },\r\n\r\n quat2_conjugate(this: Readonly, out?: T | U): T | U {\r\n return Quat2Utils.conjugate(this, out!);\r\n },\r\n\r\n quat2_lerp(this: Readonly, to: Readonly, interpolationFactor: number, out?: T | U): T | U {\r\n return Quat2Utils.lerp(this, to, interpolationFactor, out!);\r\n },\r\n\r\n quat2_interpolate(this: Readonly, to: Readonly, interpolationFactor: number, easingFunction?: EasingFunction, out?: T | U): T | U {\r\n return Quat2Utils.interpolate(this, to, interpolationFactor, easingFunction!, out!);\r\n },\r\n\r\n quat2_slerp(this: Readonly, to: Readonly, interpolationFactor: number, out?: T | U): T | U {\r\n return Quat2Utils.slerp(this, to, interpolationFactor, out!);\r\n },\r\n\r\n quat2_interpolateSpherical(this: Readonly, to: Readonly, interpolationFactor: number, easingFunction?: EasingFunction, out?: T | U): T | U {\r\n return Quat2Utils.interpolateSpherical(this, to, interpolationFactor, easingFunction!, out!);\r\n },\r\n\r\n quat2_getPosition(this: Readonly, out?: Vector3 | T): Vector3 | T {\r\n return Quat2Utils.getPosition(this, out!);\r\n },\r\n\r\n quat2_getRotation(this: Readonly, out?: Vector3 | T): Vector3 | T {\r\n return Quat2Utils.getRotation(this, out!);\r\n },\r\n\r\n quat2_getRotationDegrees(this: Readonly, out?: Vector3 | T): Vector3 | T {\r\n return Quat2Utils.getRotationDegrees(this, out!);\r\n },\r\n\r\n quat2_getRotationRadians(this: Readonly, out?: Vector3 | T): Vector3 | T {\r\n return Quat2Utils.getRotationRadians(this, out!);\r\n },\r\n\r\n quat2_getRotationQuat(this: Readonly, out?: Quaternion | T): Quaternion | T {\r\n return Quat2Utils.getRotationQuat(this, out!);\r\n },\r\n\r\n quat2_setPosition(this: T, position: Readonly): T {\r\n return Quat2Utils.setPosition(this, position);\r\n },\r\n\r\n quat2_setRotation(this: T, rotation: Readonly): T {\r\n return Quat2Utils.setRotation(this, rotation);\r\n },\r\n\r\n quat2_setRotationDegrees(this: T, rotation: Readonly): T {\r\n return Quat2Utils.setRotationDegrees(this, rotation);\r\n },\r\n\r\n quat2_setRotationRadians(this: T, rotation: Readonly): T {\r\n return Quat2Utils.setRotationRadians(this, rotation);\r\n },\r\n\r\n quat2_setRotationQuat(this: T, rotation: Readonly): T {\r\n return Quat2Utils.setRotationQuat(this, rotation);\r\n },\r\n\r\n quat2_setPositionRotation(this: T, position: Readonly, rotation: Readonly): T {\r\n return Quat2Utils.setPositionRotation(this, position, rotation);\r\n },\r\n\r\n quat2_setPositionRotationDegrees(this: T, position: Readonly, rotation: Readonly): T {\r\n return Quat2Utils.setPositionRotationDegrees(this, position, rotation);\r\n },\r\n\r\n quat2_setPositionRotationRadians(this: T, position: Readonly, rotation: Readonly): T {\r\n return Quat2Utils.setPositionRotationRadians(this, position, rotation);\r\n },\r\n\r\n quat2_setPositionRotationQuat(this: T, position: Readonly, rotation: Readonly): T {\r\n return Quat2Utils.setPositionRotationQuat(this, position, rotation);\r\n },\r\n\r\n quat2_getAxes(this: Readonly, out?: [Vector3, Vector3, Vector3] | [T, U, V]): [Vector3, Vector3, Vector3] | [T, U, V] {\r\n return Quat2Utils.getAxes(this, out!);\r\n },\r\n\r\n quat2_getForward(this: Readonly, out?: Vector3 | T): Vector3 | T {\r\n return Quat2Utils.getForward(this, out!);\r\n },\r\n\r\n quat2_getBackward(this: Readonly, out?: Vector3 | T): Vector3 | T {\r\n return Quat2Utils.getBackward(this, out!);\r\n },\r\n\r\n quat2_getLeft(this: Readonly, out?: Vector3 | T): Vector3 | T {\r\n return Quat2Utils.getLeft(this, out!);\r\n },\r\n\r\n quat2_getRight(this: Readonly, out?: Vector3 | T): Vector3 | T {\r\n return Quat2Utils.getRight(this, out!);\r\n },\r\n\r\n quat2_getUp(this: Readonly, out?: Vector3 | T): Vector3 | T {\r\n return Quat2Utils.getUp(this, out!);\r\n },\r\n\r\n quat2_getDown(this: Readonly, out?: Vector3 | T): Vector3 | T {\r\n return Quat2Utils.getDown(this, out!);\r\n },\r\n\r\n quat2_rotateAxis(this: Readonly, angle: number, axis: Readonly, out?: T | U): T | U {\r\n return Quat2Utils.rotateAxis(this, angle, axis, out!);\r\n },\r\n\r\n quat2_rotateAxisDegrees(this: Readonly, angle: number, axis: Readonly, out?: T | U): T | U {\r\n return Quat2Utils.rotateAxisDegrees(this, angle, axis, out!);\r\n },\r\n\r\n quat2_rotateAxisRadians(this: Readonly, angle: number, axis: Readonly, out?: T | U): T | U {\r\n return Quat2Utils.rotateAxisRadians(this, angle, axis, out!);\r\n },\r\n\r\n quat2_toWorld(this: Readonly, parentTransformQuat: Readonly, out?: T | U): T | U {\r\n return Quat2Utils.toWorld(this, parentTransformQuat, out!);\r\n },\r\n\r\n quat2_toLocal(this: Readonly, parentTransformQuat: Readonly, out?: T | U): T | U {\r\n return Quat2Utils.toLocal(this, parentTransformQuat, out!);\r\n },\r\n\r\n quat2_toMatrix(this: Readonly, out?: Matrix4 | T): Matrix4 | T {\r\n return Quat2Utils.toMatrix(this, out!);\r\n },\r\n\r\n quat2_fromMatrix(this: T, matrix: Readonly): T {\r\n return Quat2Utils.fromMatrix(matrix, this);\r\n }\r\n };\r\n\r\n for (const arrayLikeClassToExtend of ArrayExtensionUtils.ARRAY_LIKE_CLASSES) {\r\n PluginUtils.injectOwnProperties(quat2Extension, arrayLikeClassToExtend.prototype, false, true, true);\r\n }\r\n}", "import { Matrix3, Quaternion, Vector3 } from \"../../../../cauldron/type_definitions/array_type_definitions.js\";\r\nimport { QuatUtils } from \"../../../../cauldron/utils/array/quat_utils.js\";\r\nimport { EasingFunction } from \"../../../../cauldron/utils/math_utils.js\";\r\nimport { PluginUtils } from \"../../../utils/plugin_utils.js\";\r\nimport { ArrayExtensionUtils } from \"./array_extension_utils.js\";\r\nimport { QuaternionExtension } from \"./quat_type_extension.js\";\r\n\r\nimport \"./quat_type_extension.js\";\r\n\r\nexport function initQuatExtension(): void {\r\n _initQuatExtensionProtoype();\r\n}\r\n\r\nfunction _initQuatExtensionProtoype(): void {\r\n\r\n const quatExtension: QuaternionExtension = {\r\n\r\n quat_set(this: T, x: number, y?: number, z?: number, w?: number): T {\r\n return QuatUtils.set(this, x!, y!, z!, w!);\r\n },\r\n\r\n quat_copy(this: T, quat: Readonly): T {\r\n return QuatUtils.copy(quat, this);\r\n },\r\n\r\n quat_clone(this: Readonly): T {\r\n return QuatUtils.clone(this);\r\n },\r\n\r\n quat_equals(this: Readonly, quat: Readonly, epsilon?: number): boolean {\r\n return QuatUtils.equals(this, quat, epsilon);\r\n },\r\n\r\n quat_isNormalized(this: Readonly, epsilon?: number): boolean {\r\n return QuatUtils.isNormalized(this, epsilon);\r\n },\r\n\r\n quat_normalize(this: Readonly, out?: T | U): T | U {\r\n return QuatUtils.normalize(this, out!);\r\n },\r\n\r\n quat_length(this: Readonly): number {\r\n return QuatUtils.length(this);\r\n },\r\n\r\n quat_lengthSquared(this: Readonly): number {\r\n return QuatUtils.lengthSquared(this);\r\n },\r\n\r\n quat_identity(this: T): T {\r\n return QuatUtils.identity(this);\r\n },\r\n\r\n quat_mul(this: Readonly, quat: Readonly, out?: T | U): T | U {\r\n return QuatUtils.mul(this, quat, out!);\r\n },\r\n\r\n quat_invert(this: Readonly, out?: T | U): T | U {\r\n return QuatUtils.invert(this, out!);\r\n },\r\n\r\n quat_conjugate(this: Readonly, out?: T | U): T | U {\r\n return QuatUtils.conjugate(this, out!);\r\n },\r\n\r\n quat_lerp(this: Readonly, to: Readonly, interpolationFactor: number, out?: T | U): T | U {\r\n return QuatUtils.lerp(this, to, interpolationFactor, out!);\r\n },\r\n\r\n quat_interpolate(this: Readonly, to: Readonly, interpolationFactor: number, easingFunction?: EasingFunction, out?: T | U): T | U {\r\n return QuatUtils.interpolate(this, to, interpolationFactor, easingFunction!, out!);\r\n },\r\n\r\n quat_slerp(this: Readonly, to: Readonly, interpolationFactor: number, out?: T | U): T | U {\r\n return QuatUtils.slerp(this, to, interpolationFactor, out!);\r\n },\r\n\r\n quat_interpolateSpherical(this: Readonly, to: Readonly, interpolationFactor: number, easingFunction?: EasingFunction, out?: T | U): T | U {\r\n return QuatUtils.interpolateSpherical(this, to, interpolationFactor, easingFunction!, out!);\r\n },\r\n quat_getAngle(this: Readonly): number {\r\n return QuatUtils.getAngle(this);\r\n },\r\n\r\n quat_getAngleDegrees(this: Readonly): number {\r\n return QuatUtils.getAngleDegrees(this);\r\n },\r\n\r\n quat_getAngleRadians(this: Readonly): number {\r\n return QuatUtils.getAngleRadians(this);\r\n },\r\n\r\n quat_getAxis(this: Readonly, out?: Vector3 | T): Vector3 | T {\r\n return QuatUtils.getAxis(this, out!);\r\n },\r\n\r\n quat_getAxisScaled(this: Readonly, out?: Vector3 | T): Vector3 | T {\r\n return QuatUtils.getAxisScaled(this, out!);\r\n },\r\n\r\n quat_getAxisScaledDegrees(this: Readonly, out?: Vector3 | T): Vector3 | T {\r\n return QuatUtils.getAxisScaledDegrees(this, out!);\r\n },\r\n\r\n quat_getAxisScaledRadians(this: Readonly, out?: Vector3 | T): Vector3 | T {\r\n return QuatUtils.getAxisScaledRadians(this, out!);\r\n },\r\n\r\n quat_getAxes(this: Readonly, out?: [Vector3, Vector3, Vector3] | [T, U, V]): [Vector3, Vector3, Vector3] | [T, U, V] {\r\n return QuatUtils.getAxes(this, out!);\r\n },\r\n\r\n quat_getForward(this: Readonly, out?: Vector3 | T): Vector3 | T {\r\n return QuatUtils.getForward(this, out!);\r\n },\r\n\r\n quat_getBackward(this: Readonly, out?: Vector3 | T): Vector3 | T {\r\n return QuatUtils.getBackward(this, out!);\r\n },\r\n\r\n quat_getLeft(this: Readonly, out?: Vector3 | T): Vector3 | T {\r\n return QuatUtils.getLeft(this, out!);\r\n },\r\n\r\n quat_getRight(this: Readonly, out?: Vector3 | T): Vector3 | T {\r\n return QuatUtils.getRight(this, out!);\r\n },\r\n\r\n quat_getUp(this: Readonly, out?: Vector3 | T): Vector3 | T {\r\n return QuatUtils.getUp(this, out!);\r\n },\r\n\r\n quat_getDown(this: Readonly, out?: Vector3 | T): Vector3 | T {\r\n return QuatUtils.getDown(this, out!);\r\n },\r\n\r\n quat_setAxes(this: T, left: Readonly, up: Readonly, forward: Readonly): T {\r\n return QuatUtils.setAxes(this, left, up, forward);\r\n },\r\n\r\n quat_setForward(this: T, forward: Readonly, up?: Readonly, left?: Readonly): T {\r\n return QuatUtils.setForward(this, forward, up, left);\r\n },\r\n\r\n quat_setBackward(this: T, backward: Readonly, up?: Readonly, left?: Readonly): T {\r\n return QuatUtils.setBackward(this, backward, up, left);\r\n },\r\n\r\n quat_setUp(this: T, up: Readonly, forward?: Readonly, left?: Readonly): T {\r\n return QuatUtils.setUp(this, up, forward, left);\r\n },\r\n\r\n quat_setDown(this: T, down: Readonly, forward?: Readonly, left?: Readonly): T {\r\n return QuatUtils.setDown(this, down, forward, left);\r\n },\r\n\r\n quat_setLeft(this: T, left: Readonly, up?: Readonly, forward?: Readonly): T {\r\n return QuatUtils.setLeft(this, left, up, forward);\r\n },\r\n\r\n quat_setRight(this: T, right: Readonly, up?: Readonly, forward?: Readonly): T {\r\n return QuatUtils.setRight(this, right, up, forward);\r\n },\r\n\r\n quat_toWorld(this: Readonly, parentRotationQuat: Readonly, out?: T | U): T | U {\r\n return QuatUtils.toWorld(this, parentRotationQuat, out!);\r\n },\r\n\r\n quat_toLocal(this: Readonly, parentRotationQuat: Readonly, out?: T | U): T | U {\r\n return QuatUtils.toLocal(this, parentRotationQuat, out!);\r\n },\r\n\r\n quat_addRotation(this: Readonly, rotation: Readonly, out?: T | U): T | U {\r\n return QuatUtils.addRotation(this, rotation, out!);\r\n },\r\n\r\n quat_addRotationDegrees(this: Readonly, rotation: Readonly, out?: T | U): T | U {\r\n return QuatUtils.addRotationDegrees(this, rotation, out!);\r\n },\r\n\r\n quat_addRotationRadians(this: Readonly, rotation: Readonly, out?: T | U): T | U {\r\n return QuatUtils.addRotationRadians(this, rotation, out!);\r\n },\r\n\r\n quat_addRotationQuat(this: Readonly, rotation: Readonly, out?: T | U): T | U {\r\n return QuatUtils.addRotationQuat(this, rotation, out!);\r\n },\r\n\r\n quat_subRotation(this: Readonly, rotation: Readonly, out?: T | U): T | U {\r\n return QuatUtils.subRotation(this, rotation, out!);\r\n },\r\n\r\n quat_subRotationDegrees(this: Readonly, rotation: Readonly, out?: T | U): T | U {\r\n return QuatUtils.subRotationDegrees(this, rotation, out!);\r\n },\r\n\r\n quat_subRotationRadians(this: Readonly, rotation: Readonly, out?: T | U): T | U {\r\n return QuatUtils.subRotationRadians(this, rotation, out!);\r\n },\r\n\r\n quat_subRotationQuat(this: Readonly, rotation: Readonly, out?: T | U): T | U {\r\n return QuatUtils.subRotationQuat(this, rotation, out!);\r\n },\r\n\r\n quat_rotationTo(this: Readonly, to: Readonly, out?: T | U): T | U {\r\n return QuatUtils.rotationTo(this, to, out!);\r\n },\r\n\r\n quat_rotationToDegrees(this: Readonly, to: Readonly, out?: T | U): T | U {\r\n return QuatUtils.rotationToDegrees(this, to, out!);\r\n },\r\n\r\n quat_rotationToRadians(this: Readonly, to: Readonly, out?: T | U): T | U {\r\n return QuatUtils.rotationToRadians(this, to, out!);\r\n },\r\n\r\n quat_rotationToQuat(this: Readonly, to: Readonly, out?: T | U): T | U {\r\n return QuatUtils.rotationToQuat(this, to, out!);\r\n },\r\n\r\n quat_rotationAroundAxis(this: Readonly, axis: Readonly, out?: T | U): T | U {\r\n return QuatUtils.rotationAroundAxis(this, axis, out!);\r\n },\r\n\r\n quat_rotationAroundAxisDegrees(this: Readonly, axis: Readonly, out?: T | U): T | U {\r\n return QuatUtils.rotationAroundAxisDegrees(this, axis, out!);\r\n },\r\n\r\n quat_rotationAroundAxisRadians(this: Readonly, axis: Readonly, out?: T | U): T | U {\r\n return QuatUtils.rotationAroundAxisRadians(this, axis, out!);\r\n },\r\n\r\n quat_rotationAroundAxisQuat(this: Readonly, axis: Readonly, out?: T | U): T | U {\r\n return QuatUtils.rotationAroundAxisQuat(this, axis, out!);\r\n },\r\n\r\n quat_getTwist(this: Readonly, axis: Readonly, out?: T | U): T | U {\r\n return QuatUtils.getTwist(this, axis, out!);\r\n },\r\n\r\n quat_getSwing(this: Readonly, axis: Readonly, out?: T | U): T | U {\r\n return QuatUtils.getSwing(this, axis, out!);\r\n },\r\n\r\n quat_getSwingFromTwist(this: Readonly, twist: Readonly, out?: T | U): T | U {\r\n return QuatUtils.getSwingFromTwist(this, twist, out!);\r\n },\r\n\r\n quat_getTwistFromSwing(this: Readonly, swing: Readonly, out?: T | U): T | U {\r\n return QuatUtils.getTwistFromSwing(this, swing, out!);\r\n },\r\n\r\n quat_fromTwistSwing(this: T, twist: Readonly, swing: Readonly): T {\r\n return QuatUtils.fromTwistSwing(twist, swing, this);\r\n },\r\n\r\n quat_rotate(this: Readonly, rotation: Readonly, out?: T | U): T | U {\r\n return QuatUtils.rotate(this, rotation, out!);\r\n },\r\n\r\n quat_rotateDegrees(this: Readonly, rotation: Readonly, out?: T | U): T | U {\r\n return QuatUtils.rotateDegrees(this, rotation, out!);\r\n },\r\n\r\n quat_rotateRadians(this: Readonly, rotation: Readonly, out?: T | U): T | U {\r\n return QuatUtils.rotateRadians(this, rotation, out!);\r\n },\r\n\r\n quat_rotateQuat(this: Readonly, rotation: Readonly, out?: T | U): T | U {\r\n return QuatUtils.rotateQuat(this, rotation, out!);\r\n },\r\n\r\n quat_rotateAxis(this: Readonly, angle: number, axis: Readonly, out?: T | U): T | U {\r\n return QuatUtils.rotateAxis(this, angle, axis, out!);\r\n },\r\n\r\n quat_rotateAxisDegrees(this: Readonly, angle: number, axis: Readonly, out?: T | U): T | U {\r\n return QuatUtils.rotateAxisDegrees(this, angle, axis, out!);\r\n },\r\n\r\n quat_rotateAxisRadians(this: Readonly, angle: number, axis: Readonly, out?: T | U): T | U {\r\n return QuatUtils.rotateAxisRadians(this, angle, axis, out!);\r\n },\r\n\r\n quat_fromDegrees(this: T, rotation: Readonly): T {\r\n return QuatUtils.fromDegrees(rotation, this);\r\n },\r\n\r\n quat_fromRadians(this: T, rotation: Readonly): T {\r\n return QuatUtils.fromRadians(rotation, this);\r\n },\r\n\r\n quat_fromAxis(this: T, angle: number, axis: Readonly): T {\r\n return QuatUtils.fromAxis(angle, axis, this);\r\n },\r\n\r\n quat_fromAxisDegrees(this: T, angle: number, axis: Readonly): T {\r\n return QuatUtils.fromAxisDegrees(angle, axis, this);\r\n },\r\n\r\n quat_fromAxisRadians(this: T, angle: number, axis: Readonly): T {\r\n return QuatUtils.fromAxisRadians(angle, axis, this);\r\n },\r\n\r\n quat_fromAxes(this: T, left: Readonly, up: Readonly, forward: Readonly): Quaternion | T {\r\n return QuatUtils.fromAxes(left, up, forward, this);\r\n },\r\n\r\n quat_toDegrees(this: Readonly, out?: Vector3 | T): Vector3 | T {\r\n return QuatUtils.toDegrees(this, out!);\r\n },\r\n\r\n quat_toRadians(this: Readonly, out?: Vector3 | T): Vector3 | T {\r\n return QuatUtils.toRadians(this, out!);\r\n },\r\n\r\n quat_toMatrix(this: Readonly, out?: Matrix3 | T): Matrix3 | T {\r\n return QuatUtils.toMatrix(this, out!);\r\n }\r\n };\r\n\r\n for (const arrayLikeClassToExtend of ArrayExtensionUtils.ARRAY_LIKE_CLASSES) {\r\n PluginUtils.injectOwnProperties(quatExtension, arrayLikeClassToExtend.prototype, false, true, true);\r\n }\r\n}", "import { Vector2 } from \"../../../../cauldron/type_definitions/array_type_definitions.js\";\r\nimport { Vec2Utils } from \"../../../../cauldron/utils/array/vec2_utils.js\";\r\nimport { EasingFunction } from \"../../../../cauldron/utils/math_utils.js\";\r\nimport { PluginUtils } from \"../../../utils/plugin_utils.js\";\r\nimport { ArrayExtensionUtils } from \"./array_extension_utils.js\";\r\nimport { Vector2Extension } from \"./vec2_type_extension.js\";\r\n\r\nimport \"./vec2_type_extension.js\";\r\n\r\nexport function initVec2Extension(): void {\r\n _initVec2ExtensionProtoype();\r\n}\r\n\r\nfunction _initVec2ExtensionProtoype(): void {\r\n\r\n const vec2Extension: Vector2Extension = {\r\n\r\n vec2_set(this: T, x: number, y?: number): T {\r\n return Vec2Utils.set(this, x, y!);\r\n },\r\n\r\n vec2_copy(this: T, vector: Readonly): T {\r\n return Vec2Utils.copy(vector, this);\r\n },\r\n\r\n vec2_clone(this: Readonly): T {\r\n return Vec2Utils.clone(this);\r\n },\r\n\r\n vec2_equals(this: Readonly, vector: Readonly, epsilon?: number): boolean {\r\n return Vec2Utils.equals(this, vector, epsilon);\r\n },\r\n\r\n vec2_length(this: Readonly): number {\r\n return Vec2Utils.length(this);\r\n },\r\n\r\n vec2_normalize(this: Readonly, out?: U): U {\r\n return Vec2Utils.normalize(this, out!);\r\n },\r\n\r\n vec2_zero(this: T): T {\r\n return Vec2Utils.zero(this);\r\n },\r\n\r\n vec2_isZero(this: Readonly, epsilon?: number): boolean {\r\n return Vec2Utils.isZero(this, epsilon);\r\n },\r\n\r\n vec2_lerp(this: Readonly, to: Readonly, interpolationFactor: number, out?: T | U): T | U {\r\n return Vec2Utils.lerp(this, to, interpolationFactor, out!);\r\n },\r\n\r\n vec2_interpolate(this: Readonly, to: Readonly, interpolationFactor: number, easingFunction?: EasingFunction, out?: T | U): T | U {\r\n return Vec2Utils.interpolate(this, to, interpolationFactor, easingFunction!, out!);\r\n }\r\n };\r\n\r\n for (const arrayLikeClassToExtend of ArrayExtensionUtils.ARRAY_LIKE_CLASSES) {\r\n PluginUtils.injectOwnProperties(vec2Extension, arrayLikeClassToExtend.prototype, false, true, true);\r\n }\r\n}", "import { Matrix3, Matrix4, Quaternion, Vector3 } from \"../../../../cauldron/type_definitions/array_type_definitions.js\";\r\nimport { Vec3Utils } from \"../../../../cauldron/utils/array/vec3_utils.js\";\r\nimport { EasingFunction } from \"../../../../cauldron/utils/math_utils.js\";\r\nimport { PluginUtils } from \"../../../utils/plugin_utils.js\";\r\nimport { ArrayExtensionUtils } from \"./array_extension_utils.js\";\r\nimport { Vector3Extension } from \"./vec3_type_extension.js\";\r\n\r\nimport \"./vec3_type_extension.js\";\r\n\r\nexport function initVec3Extension(): void {\r\n _initVec3ExtensionProtoype();\r\n}\r\n\r\nfunction _initVec3ExtensionProtoype(): void {\r\n\r\n const vec3Extension: Vector3Extension = {\r\n\r\n vec3_set(this: T, x: number, y?: number, z?: number): T {\r\n return Vec3Utils.set(this, x!, y!, z!);\r\n },\r\n\r\n vec3_copy(this: T, vector: Readonly): T {\r\n return Vec3Utils.copy(vector, this);\r\n },\r\n\r\n vec3_clone(this: Readonly): T {\r\n return Vec3Utils.clone(this);\r\n },\r\n\r\n vec3_equals(this: Readonly, vector: Readonly, epsilon?: number): boolean {\r\n return Vec3Utils.equals(this, vector, epsilon);\r\n },\r\n\r\n vec3_isNormalized(this: Readonly, epsilon?: number): boolean {\r\n return Vec3Utils.isNormalized(this, epsilon);\r\n },\r\n\r\n vec3_normalize(this: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.normalize(this, out!);\r\n },\r\n vec3_isZero(this: Readonly, epsilon?: number): boolean {\r\n return Vec3Utils.isZero(this, epsilon);\r\n },\r\n vec3_zero(this: T): T {\r\n return Vec3Utils.zero(this);\r\n },\r\n\r\n vec3_length(this: Readonly): number {\r\n return Vec3Utils.length(this);\r\n },\r\n\r\n vec3_lengthSquared(this: Readonly): number {\r\n return Vec3Utils.lengthSquared(this);\r\n },\r\n\r\n vec3_lengthSigned(this: Readonly, positiveDirection: Readonly): number {\r\n return Vec3Utils.lengthSigned(this, positiveDirection);\r\n },\r\n\r\n vec3_distance(this: Readonly, vector: Readonly): number {\r\n return Vec3Utils.distance(this, vector);\r\n },\r\n\r\n vec3_distanceSquared(this: Readonly, vector: Readonly): number {\r\n return Vec3Utils.distanceSquared(this, vector);\r\n },\r\n\r\n vec3_add(this: Readonly, vector: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.add(this, vector, out!);\r\n },\r\n\r\n vec3_sub(this: Readonly, vector: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.sub(this, vector, out!);\r\n },\r\n\r\n vec3_mul(this: Readonly, vector: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.mul(this, vector, out!);\r\n },\r\n\r\n vec3_div(this: Readonly, vector: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.div(this, vector, out!);\r\n },\r\n\r\n vec3_scale(this: Readonly, value: number, out?: T | U): T | U {\r\n return Vec3Utils.scale(this, value, out!);\r\n },\r\n\r\n vec3_negate(this: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.negate(this, out!);\r\n },\r\n\r\n vec3_dot(this: Readonly, vector: Readonly): number {\r\n return Vec3Utils.dot(this, vector);\r\n },\r\n\r\n vec3_cross(this: Readonly, vector: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.cross(this, vector, out!);\r\n },\r\n\r\n vec3_transformQuat(this: Readonly, quat: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.transformQuat(this, quat, out!);\r\n },\r\n\r\n vec3_transformMat3(this: Readonly, matrix: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.transformMat3(this, matrix, out!);\r\n },\r\n\r\n vec3_transformMat4(this: Readonly, matrix: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.transformMat4(this, matrix, out!);\r\n },\r\n\r\n vec3_lerp(this: Readonly, to: Readonly, interpolationFactor: number, out?: T | U): T | U {\r\n return Vec3Utils.lerp(this, to, interpolationFactor, out!);\r\n },\r\n\r\n vec3_interpolate(this: Readonly, to: Readonly, interpolationFactor: number, easingFunction?: EasingFunction, out?: T | U): T | U {\r\n return Vec3Utils.interpolate(this, to, interpolationFactor, easingFunction!, out!);\r\n },\r\n\r\n vec3_angle(this: Readonly, vector: Readonly): number {\r\n return Vec3Utils.angle(this, vector);\r\n },\r\n\r\n vec3_angleDegrees(this: Readonly, vector: Readonly): number {\r\n return Vec3Utils.angleDegrees(this, vector);\r\n },\r\n\r\n vec3_angleRadians(this: Readonly, vector: Readonly): number {\r\n return Vec3Utils.angleRadians(this, vector);\r\n },\r\n\r\n vec3_angleSigned(this: Readonly, vector: Readonly, referenceAxis: Readonly): number {\r\n return Vec3Utils.angleSigned(this, vector, referenceAxis);\r\n },\r\n\r\n vec3_angleSignedDegrees(this: Readonly, vector: Readonly, referenceAxis: Readonly): number {\r\n return Vec3Utils.angleSignedDegrees(this, vector, referenceAxis);\r\n },\r\n\r\n vec3_angleSignedRadians(this: Readonly, vector: Readonly, referenceAxis: Readonly): number {\r\n return Vec3Utils.angleSignedRadians(this, vector, referenceAxis);\r\n },\r\n\r\n vec3_anglePivoted(this: Readonly, vector: Readonly, referenceAxis: Readonly): number {\r\n return Vec3Utils.anglePivoted(this, vector, referenceAxis);\r\n },\r\n\r\n vec3_anglePivotedDegrees(this: Readonly, vector: Readonly, referenceAxis: Readonly): number {\r\n return Vec3Utils.anglePivotedDegrees(this, vector, referenceAxis);\r\n },\r\n\r\n vec3_anglePivotedRadians(this: Readonly, vector: Readonly, referenceAxis: Readonly): number {\r\n return Vec3Utils.anglePivotedRadians(this, vector, referenceAxis);\r\n },\r\n\r\n vec3_anglePivotedSigned(this: Readonly, vector: Readonly, referenceAxis: Readonly): number {\r\n return Vec3Utils.anglePivotedSigned(this, vector, referenceAxis);\r\n },\r\n\r\n vec3_anglePivotedSignedDegrees(this: Readonly, vector: Readonly, referenceAxis: Readonly): number {\r\n return Vec3Utils.anglePivotedSignedDegrees(this, vector, referenceAxis);\r\n },\r\n\r\n vec3_anglePivotedSignedRadians(this: Readonly, vector: Readonly, referenceAxis: Readonly): number {\r\n return Vec3Utils.anglePivotedSignedRadians(this, vector, referenceAxis);\r\n },\r\n\r\n vec3_valueAlongAxis(this: Readonly, axis: Readonly): number {\r\n return Vec3Utils.valueAlongAxis(this, axis);\r\n },\r\n\r\n vec3_valueAlongPlane(this: Readonly, planeNormal: Readonly): number {\r\n return Vec3Utils.valueAlongPlane(this, planeNormal);\r\n },\r\n\r\n vec3_componentAlongAxis(this: Readonly, axis: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.componentAlongAxis(this, axis, out!);\r\n },\r\n\r\n vec3_removeComponentAlongAxis(this: Readonly, axis: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.removeComponentAlongAxis(this, axis, out!);\r\n },\r\n\r\n vec3_copyComponentAlongAxis(this: Readonly, vector: Readonly, axis: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.copyComponentAlongAxis(vector, this, axis, out!);\r\n },\r\n vec3_isConcordant(this: Readonly, vector: Readonly): boolean {\r\n return Vec3Utils.isConcordant(this, vector);\r\n },\r\n\r\n vec3_isFartherAlongAxis(this: Readonly, vector: Readonly, axis: Readonly): boolean {\r\n return Vec3Utils.isFartherAlongAxis(this, vector, axis);\r\n },\r\n\r\n vec3_isToTheRight(this: Readonly, vector: Readonly, referenceAxis: Readonly): boolean {\r\n return Vec3Utils.isToTheRight(this, vector, referenceAxis);\r\n },\r\n\r\n vec3_signTo(this: Readonly, vector: Readonly, referenceAxis: Readonly, zeroSign?: number): number {\r\n return Vec3Utils.signTo(this, vector, referenceAxis, zeroSign);\r\n },\r\n\r\n vec3_projectOnAxis(this: Readonly, axis: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.projectOnAxis(this, axis, out!);\r\n },\r\n\r\n vec3_projectOnAxisAlongAxis(this: Readonly, axis: Readonly, projectAlongAxis: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.projectOnAxisAlongAxis(this, axis, projectAlongAxis, out!);\r\n },\r\n\r\n vec3_projectOnPlane(this: Readonly, planeNormal: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.projectOnPlane(this, planeNormal, out!);\r\n },\r\n\r\n vec3_projectOnPlaneAlongAxis(this: Readonly, planeNormal: Readonly, projectAlongAxis: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.projectOnPlaneAlongAxis(this, planeNormal, projectAlongAxis, out!);\r\n },\r\n\r\n vec3_isOnAxis(this: Readonly, axis: Readonly): boolean {\r\n return Vec3Utils.isOnAxis(this, axis);\r\n },\r\n\r\n vec3_isOnPlane(this: Readonly, planeNormal: Readonly): boolean {\r\n return Vec3Utils.isOnPlane(this, planeNormal);\r\n },\r\n\r\n vec3_perpendicularAny(this: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.perpendicularAny(this, out!);\r\n },\r\n\r\n vec3_rotate(this: Readonly, rotation: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.rotate(this, rotation, out!);\r\n },\r\n\r\n vec3_rotateDegrees(this: Readonly, rotation: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.rotateDegrees(this, rotation, out!);\r\n },\r\n\r\n vec3_rotateRadians(this: Readonly, rotation: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.rotateRadians(this, rotation, out!);\r\n },\r\n\r\n vec3_rotateQuat(this: Readonly, rotation: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.rotateQuat(this, rotation, out!);\r\n },\r\n\r\n vec3_rotateAxis(this: Readonly, angle: number, axis: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.rotateAxis(this, angle, axis, out!);\r\n },\r\n\r\n vec3_rotateAxisDegrees(this: Readonly, angle: number, axis: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.rotateAxisDegrees(this, angle, axis, out!);\r\n },\r\n\r\n vec3_rotateAxisRadians(this: Readonly, angle: number, axis: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.rotateAxisRadians(this, angle, axis, out!);\r\n },\r\n\r\n vec3_rotateAround(this: Readonly, rotation: Readonly, origin: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.rotateAround(this, rotation, origin, out!);\r\n },\r\n\r\n vec3_rotateAroundDegrees(this: Readonly, rotation: Readonly, origin: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.rotateAroundDegrees(this, rotation, origin, out!);\r\n },\r\n\r\n vec3_rotateAroundRadians(this: Readonly, rotation: Readonly, origin: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.rotateAroundRadians(this, rotation, origin, out!);\r\n },\r\n\r\n vec3_rotateAroundQuat(this: Readonly, rotation: Readonly, origin: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.rotateAroundQuat(this, rotation, origin, out!);\r\n },\r\n\r\n vec3_rotateAroundAxis(this: Readonly, angle: number, axis: Readonly, origin: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.rotateAroundAxis(this, angle, axis, origin, out!);\r\n },\r\n\r\n vec3_rotateAroundAxisDegrees(this: Readonly, angle: number, axis: Readonly, origin: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.rotateAroundAxisDegrees(this, angle, axis, origin, out!);\r\n },\r\n\r\n vec3_rotateAroundAxisRadians(this: Readonly, angle: number, axis: Readonly, origin: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.rotateAroundAxisRadians(this, angle, axis, origin, out!);\r\n },\r\n\r\n vec3_addRotation(this: Readonly, rotation: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.addRotation(this, rotation, out!);\r\n },\r\n\r\n vec3_addRotationDegrees(this: Readonly, rotation: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.addRotationDegrees(this, rotation, out!);\r\n },\r\n\r\n vec3_addRotationRadians(this: Readonly, rotation: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.addRotationRadians(this, rotation, out!);\r\n },\r\n\r\n vec3_addRotationQuat(this: Readonly, rotation: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.addRotationQuat(this, rotation, out!);\r\n },\r\n\r\n vec3_degreesAddRotation(this: Readonly, rotation: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.degreesAddRotation(this, rotation, out!);\r\n },\r\n\r\n vec3_degreesAddRotationDegrees(this: Readonly, rotation: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.degreesAddRotationDegrees(this, rotation, out!);\r\n },\r\n\r\n vec3_degreesAddRotationRadians(this: Readonly, rotation: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.degreesAddRotationRadians(this, rotation, out!);\r\n },\r\n\r\n vec3_degreesAddRotationQuat(this: Readonly, rotation: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.degreesAddRotationQuat(this, rotation, out!);\r\n },\r\n\r\n vec3_radiansAddRotation(this: Readonly, rotation: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.radiansAddRotation(this, rotation, out!);\r\n },\r\n\r\n vec3_radiansAddRotationDegrees(this: Readonly, rotation: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.radiansAddRotationDegrees(this, rotation, out!);\r\n },\r\n\r\n vec3_radiansAddRotationRadians(this: Readonly, rotation: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.radiansAddRotationRadians(this, rotation, out!);\r\n },\r\n\r\n vec3_radiansAddRotationQuat(this: Readonly, rotation: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.radiansAddRotationQuat(this, rotation, out!);\r\n },\r\n\r\n vec3_rotationTo(this: Readonly, to: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.rotationTo(this, to, out!);\r\n },\r\n\r\n vec3_rotationToDegrees(this: Readonly, to: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.rotationToDegrees(this, to, out!);\r\n },\r\n\r\n vec3_rotationToRadians(this: Readonly, to: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.rotationToRadians(this, to, out!);\r\n },\r\n\r\n vec3_rotationToQuat(this: Readonly, to: Readonly, out?: Quaternion | T): Quaternion | T {\r\n return Vec3Utils.rotationToQuat(this, to, out!);\r\n },\r\n\r\n vec3_rotationToPivoted(this: Readonly, to: Readonly, pivotAxis: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.rotationToPivoted(this, to, pivotAxis, out!);\r\n },\r\n\r\n vec3_rotationToPivotedDegrees(this: Readonly, to: Readonly, pivotAxis: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.rotationToPivotedDegrees(this, to, pivotAxis, out!);\r\n },\r\n\r\n vec3_rotationToPivotedRadians(this: Readonly, to: Readonly, pivotAxis: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.rotationToPivotedRadians(this, to, pivotAxis, out!);\r\n },\r\n\r\n vec3_rotationToPivotedQuat(this: Readonly, to: Readonly, pivotAxis: Readonly, out?: Quaternion | T): Quaternion | T {\r\n return Vec3Utils.rotationToPivotedQuat(this, to, pivotAxis, out!);\r\n },\r\n\r\n vec3_convertPositionToWorld(this: Readonly, parentTransform: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.convertPositionToWorld(this, parentTransform, out!);\r\n },\r\n\r\n vec3_convertPositionToLocal(this: Readonly, parentTransform: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.convertPositionToLocal(this, parentTransform, out!);\r\n },\r\n\r\n vec3_convertPositionToWorldMatrix(this: Readonly, parentTransform: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.convertPositionToWorldMatrix(this, parentTransform, out!);\r\n },\r\n\r\n vec3_convertPositionToLocalMatrix(this: Readonly, parentTransform: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.convertPositionToLocalMatrix(this, parentTransform, out!);\r\n },\r\n\r\n vec3_convertPositionToWorldQuat(this: Readonly, parentTransform: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.convertPositionToWorldQuat(this, parentTransform, out!);\r\n },\r\n\r\n vec3_convertPositionToLocalQuat(this: Readonly, parentTransform: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.convertPositionToLocalQuat(this, parentTransform, out!);\r\n },\r\n\r\n vec3_convertDirectionToWorld(this: Readonly, parentTransform: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.convertDirectionToWorld(this, parentTransform, out!);\r\n },\r\n\r\n vec3_convertDirectionToLocal(this: Readonly, parentTransform: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.convertDirectionToLocal(this, parentTransform, out!);\r\n },\r\n\r\n vec3_convertDirectionToWorldMatrix(this: Readonly, parentTransform: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.convertDirectionToWorldMatrix(this, parentTransform, out!);\r\n },\r\n\r\n vec3_convertDirectionToLocalMatrix(this: Readonly, parentTransform: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.convertDirectionToLocalMatrix(this, parentTransform, out!);\r\n },\r\n\r\n vec3_convertDirectionToWorldQuat(this: Readonly, parentTransform: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.convertDirectionToWorldQuat(this, parentTransform, out!);\r\n },\r\n\r\n vec3_convertDirectionToLocalQuat(this: Readonly, parentTransform: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.convertDirectionToLocalQuat(this, parentTransform, out!);\r\n },\r\n\r\n vec3_toRadians(this: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.toRadians(this, out!);\r\n },\r\n\r\n vec3_toDegrees(this: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.toDegrees(this, out!);\r\n },\r\n\r\n vec3_toQuat(this: Readonly, out?: Quaternion | T): Quaternion | T {\r\n return Vec3Utils.toQuat(this, out!);\r\n },\r\n\r\n vec3_radiansToQuat(this: Readonly, out?: Quaternion | T): Quaternion | T {\r\n return Vec3Utils.radiansToQuat(this, out!);\r\n },\r\n\r\n vec3_degreesToQuat(this: Readonly, out?: Quaternion | T): Quaternion | T {\r\n return Vec3Utils.degreesToQuat(this, out!);\r\n },\r\n\r\n vec3_toMatrix(this: Readonly, out?: Matrix3 | T): Matrix3 | T {\r\n return Vec3Utils.toMatrix(this, out!);\r\n },\r\n\r\n vec3_degreesToMatrix(this: Readonly, out?: Matrix3 | T): Matrix3 | T {\r\n return Vec3Utils.degreesToMatrix(this, out!);\r\n },\r\n\r\n vec3_radiansToMatrix(this: Readonly, out?: Matrix3 | T): Matrix3 | T {\r\n return Vec3Utils.radiansToMatrix(this, out!);\r\n }\r\n };\r\n\r\n for (const arrayLikeClassToExtend of ArrayExtensionUtils.ARRAY_LIKE_CLASSES) {\r\n PluginUtils.injectOwnProperties(vec3Extension, arrayLikeClassToExtend.prototype, false, true, true);\r\n }\r\n}", "import { Vector4 } from \"../../../../cauldron/type_definitions/array_type_definitions.js\";\r\nimport { Vec4Utils } from \"../../../../cauldron/utils/array/vec4_utils.js\";\r\nimport { EasingFunction } from \"../../../../cauldron/utils/math_utils.js\";\r\nimport { PluginUtils } from \"../../../utils/plugin_utils.js\";\r\nimport { ArrayExtensionUtils } from \"./array_extension_utils.js\";\r\nimport { Vector4Extension } from \"./vec4_type_extension.js\";\r\n\r\nimport \"./vec4_type_extension.js\";\r\n\r\nexport function initVec4Extension(): void {\r\n _initVec4ExtensionProtoype();\r\n}\r\n\r\nfunction _initVec4ExtensionProtoype(): void {\r\n\r\n const vec4Extension: Vector4Extension = {\r\n\r\n vec4_set(this: T, x: number, y?: number, z?: number, w?: number): T {\r\n return Vec4Utils.set(this, x, y!, z!, w!);\r\n },\r\n\r\n vec4_copy(this: T, vector: Readonly): T {\r\n return Vec4Utils.copy(vector, this);\r\n },\r\n\r\n vec4_clone(this: Readonly): T {\r\n return Vec4Utils.clone(this);\r\n },\r\n\r\n vec4_equals(this: Readonly, vector: Readonly, epsilon?: number): boolean {\r\n return Vec4Utils.equals(this, vector, epsilon);\r\n },\r\n\r\n vec4_lerp(this: Readonly, to: Readonly, interpolationFactor: number, out?: T | U): T | U {\r\n return Vec4Utils.lerp(this, to, interpolationFactor, out!);\r\n },\r\n\r\n vec4_interpolate(this: Readonly, to: Readonly, interpolationFactor: number, easingFunction?: EasingFunction, out?: T | U): T | U {\r\n return Vec4Utils.interpolate(this, to, interpolationFactor, easingFunction!, out!);\r\n }\r\n };\r\n\r\n for (const arrayLikeClassToExtend of ArrayExtensionUtils.ARRAY_LIKE_CLASSES) {\r\n PluginUtils.injectOwnProperties(vec4Extension, arrayLikeClassToExtend.prototype, false, true, true);\r\n }\r\n}", "import { Vector } from \"../../../../cauldron/type_definitions/array_type_definitions.js\";\r\nimport { VecUtils } from \"../../../../cauldron/utils/array/vec_utils.js\";\r\nimport { EasingFunction } from \"../../../../cauldron/utils/math_utils.js\";\r\nimport { PluginUtils } from \"../../../utils/plugin_utils.js\";\r\nimport { ArrayExtensionUtils } from \"./array_extension_utils.js\";\r\nimport { VectorExtension } from \"./vec_type_extension.js\";\r\n\r\nimport \"./vec_type_extension.js\";\r\n\r\nexport function initVecExtension(): void {\r\n _initVecExtensionProtoype();\r\n}\r\n\r\nfunction _initVecExtensionProtoype(): void {\r\n\r\n const vecExtension: VectorExtension = {\r\n\r\n vec_set(this: T, firstValue: number, ...remainingValues: number[]): T {\r\n return VecUtils.set(this, firstValue, ...remainingValues);\r\n },\r\n\r\n vec_copy(this: T, vector: Readonly): T {\r\n return VecUtils.copy(vector, this);\r\n },\r\n\r\n vec_clone(this: Readonly): T {\r\n return VecUtils.clone(this);\r\n },\r\n\r\n vec_equals(this: Readonly, vector: Readonly, epsilon?: number): boolean {\r\n return VecUtils.equals(this, vector, epsilon);\r\n },\r\n\r\n vec_zero(this: T): T {\r\n return VecUtils.zero(this);\r\n },\r\n\r\n vec_isZero(this: Readonly, epsilon?: number): boolean {\r\n return VecUtils.isZero(this, epsilon);\r\n },\r\n\r\n vec_scale(this: Readonly, value: number, out?: U): U {\r\n return VecUtils.scale(this, value, out!);\r\n },\r\n\r\n vec_round(this: Readonly, out?: U): U {\r\n return VecUtils.round(this, out!);\r\n },\r\n\r\n vec_floor(this: Readonly, out?: U): U {\r\n return VecUtils.floor(this, out!);\r\n },\r\n\r\n vec_ceil(this: Readonly, out?: U): U {\r\n return VecUtils.ceil(this, out!);\r\n },\r\n\r\n vec_clamp(this: Readonly, start?: number, end?: number, out?: U): U {\r\n return VecUtils.clamp(this, start!, end!, out!);\r\n },\r\n\r\n vec_lerp(this: Readonly, to: Readonly, interpolationFactor: number, out?: T | U): T | U {\r\n return VecUtils.lerp(this, to, interpolationFactor, out!);\r\n },\r\n\r\n vec_interpolate(this: Readonly, to: Readonly, interpolationFactor: number, easingFunction?: EasingFunction, out?: T | U): T | U {\r\n return VecUtils.interpolate(this, to, interpolationFactor, easingFunction!, out!);\r\n },\r\n\r\n vec_toString(this: Readonly, decimalPlaces?: number): string {\r\n return VecUtils.toString(this, decimalPlaces);\r\n },\r\n\r\n vec_log(this: Readonly, decimalPlaces?: number): Vector {\r\n return VecUtils.log(this, decimalPlaces);\r\n },\r\n\r\n vec_error(this: Readonly, decimalPlaces?: number): Vector {\r\n return VecUtils.error(this, decimalPlaces);\r\n },\r\n\r\n vec_warn(this: Readonly, decimalPlaces?: number): Vector {\r\n return VecUtils.warn(this, decimalPlaces);\r\n }\r\n };\r\n\r\n for (const arrayLikeClassToExtend of ArrayExtensionUtils.ARRAY_LIKE_CLASSES) {\r\n PluginUtils.injectOwnProperties(vecExtension, arrayLikeClassToExtend.prototype, false, true, true);\r\n }\r\n}", "import { EasingFunction, EasingFunctionName, MathUtils } from \"../../../cauldron/utils/math_utils.js\";\r\nimport { PluginUtils } from \"../../utils/plugin_utils.js\";\r\nimport { MathExtension } from \"./math_type_extension.js\";\r\n\r\nimport \"./math_type_extension.js\";\r\n\r\nexport function initMathExtension(): void {\r\n _initMathExtensionInstance();\r\n}\r\n\r\nfunction _initMathExtensionInstance(): void {\r\n\r\n const mathExtension: MathExtension = {\r\n\r\n get PP_EPSILON() {\r\n return MathUtils.EPSILON;\r\n },\r\n\r\n get PP_EPSILON_SQUARED() {\r\n return MathUtils.EPSILON_SQUARED;\r\n },\r\n\r\n get PP_EPSILON_DEGREES() {\r\n return MathUtils.EPSILON_DEGREES;\r\n },\r\n\r\n pp_clamp(value: number, start?: number, end?: number): number {\r\n return MathUtils.clamp(value, start, end);\r\n },\r\n\r\n pp_sign(value: number, zeroSign?: number): number {\r\n return MathUtils.sign(value, zeroSign);\r\n },\r\n\r\n pp_toDegrees(angle: number): number {\r\n return MathUtils.toDegrees(angle);\r\n },\r\n\r\n pp_toRadians(angle: number): number {\r\n return MathUtils.toRadians(angle);\r\n },\r\n\r\n pp_roundDecimal(number: number, decimalPlaces: number): number {\r\n return MathUtils.roundDecimal(number, decimalPlaces);\r\n },\r\n\r\n pp_mapToRange(value: number, originRangeStart: number, originRangeEnd: number, newRangeStart: number, newRangeEnd: number): number {\r\n return MathUtils.mapToRange(value, originRangeStart, originRangeEnd, newRangeStart, newRangeEnd);\r\n },\r\n\r\n pp_random(start?: number, end?: number): number {\r\n return MathUtils.random(start!, end!);\r\n },\r\n\r\n pp_randomInt(start: number, end: number): number {\r\n return MathUtils.randomInt(start, end);\r\n },\r\n\r\n pp_randomBool(): boolean {\r\n return MathUtils.randomBool();\r\n },\r\n\r\n pp_randomSign(): number {\r\n return MathUtils.randomSign();\r\n },\r\n\r\n pp_randomPick(...args: T[]): T | null {\r\n return MathUtils.randomPick(...args);\r\n },\r\n\r\n pp_randomUUID(): string {\r\n return MathUtils.randomUUID();\r\n },\r\n\r\n pp_lerp(from: number, to: number, interpolationFactor: number): number {\r\n return MathUtils.lerp(from, to, interpolationFactor);\r\n },\r\n\r\n pp_interpolate(from: number, to: number, interpolationFactor: number, easingFunction?: EasingFunction): number {\r\n return MathUtils.interpolate(from, to, interpolationFactor, easingFunction);\r\n },\r\n\r\n pp_interpolatePeriodic(from: number, to: number, interpolationFactor: number, easingFunction?: EasingFunction): number {\r\n return MathUtils.interpolatePeriodic(from, to, interpolationFactor, easingFunction);\r\n },\r\n\r\n pp_getEasingFunctionByName(easingFunctionName: EasingFunctionName): EasingFunction {\r\n return MathUtils.getEasingFunctionByName(easingFunctionName);\r\n },\r\n\r\n pp_getEasingFunctionNameByIndex(index: number): EasingFunctionName | null {\r\n return MathUtils.getEasingFunctionNameByIndex(index);\r\n },\r\n\r\n pp_angleDistance(from: number, to: number): number {\r\n return MathUtils.angleDistance(from, to);\r\n },\r\n\r\n pp_angleDistanceDegrees(from: number, to: number): number {\r\n return MathUtils.angleDistanceDegrees(from, to);\r\n },\r\n\r\n pp_angleDistanceRadians(from: number, to: number): number {\r\n return MathUtils.angleDistanceRadians(from, to);\r\n },\r\n\r\n pp_angleDistanceSigned(from: number, to: number): number {\r\n return MathUtils.angleDistanceSigned(from, to);\r\n },\r\n\r\n pp_angleDistanceSignedDegrees(from: number, to: number): number {\r\n return MathUtils.angleDistanceSignedDegrees(from, to);\r\n },\r\n\r\n pp_angleDistanceSignedRadians(from: number, to: number): number {\r\n return MathUtils.angleDistanceSignedRadians(from, to);\r\n },\r\n\r\n pp_angleClamp(angle: number, usePositiveRange?: boolean): number {\r\n return MathUtils.angleClamp(angle, usePositiveRange);\r\n },\r\n\r\n pp_angleClampDegrees(angle: number, usePositiveRange?: boolean): number {\r\n return MathUtils.angleClampDegrees(angle, usePositiveRange);\r\n },\r\n\r\n pp_angleClampRadians(angle: number, usePositiveRange?: boolean): number {\r\n return MathUtils.angleClampRadians(angle, usePositiveRange);\r\n },\r\n\r\n pp_isInsideAngleRange(angle: number, start: number, end: number, useShortestAngle?: boolean): boolean {\r\n return MathUtils.isInsideAngleRange(angle, start, end, useShortestAngle);\r\n },\r\n\r\n pp_isInsideAngleRangeDegrees(angle: number, start: number, end: number, useShortestAngle?: boolean): boolean {\r\n return MathUtils.isInsideAngleRangeDegrees(angle, start, end, useShortestAngle);\r\n },\r\n\r\n pp_isInsideAngleRangeRadians(angle: number, start: number, end: number, useShortestAngle?: boolean): boolean {\r\n return MathUtils.isInsideAngleRangeRadians(angle, start, end, useShortestAngle);\r\n }\r\n };\r\n\r\n PluginUtils.injectOwnProperties(mathExtension, Math, false, true, true);\r\n}", "import { PluginUtils } from \"../../utils/plugin_utils.js\";\r\nimport { NumberExtension } from \"./number_type_extension.js\";\r\n\r\nimport \"./number_type_extension.js\";\r\n\r\nexport function initNumberExtension(): void {\r\n _initNumberExtensionPrototype();\r\n}\r\n\r\nfunction _initNumberExtensionPrototype(): void {\r\n\r\n const numberExtension: NumberExtension = {\r\n get(this: number, factor?: number): number {\r\n return this.valueOf();\r\n }\r\n };\r\n\r\n PluginUtils.injectOwnProperties(numberExtension, Number.prototype, false, true, true);\r\n}", "import { initArrayExtension } from \"./array/array_extension.js\";\r\nimport { initMat3Extension } from \"./array/mat3_extension.js\";\r\nimport { initMat4Extension } from \"./array/mat4_extension.js\";\r\nimport { initQuat2Extension } from \"./array/quat2_extension.js\";\r\nimport { initQuatExtension } from \"./array/quat_extension.js\";\r\nimport { initVec2Extension } from \"./array/vec2_extension.js\";\r\nimport { initVec3Extension } from \"./array/vec3_extension.js\";\r\nimport { initVec4Extension } from \"./array/vec4_extension.js\";\r\nimport { initVecExtension } from \"./array/vec_extension.js\";\r\nimport { initMathExtension } from \"./math_extension.js\";\r\nimport { initNumberExtension } from \"./number_extension.js\";\r\n\r\n/**\r\n * TS import preserver\r\n * \r\n * This is only needed to make it so the import is not removed, since it makes the type extensions available to the Typescript \r\n */\r\nimport \"./array/array_extension.js\";\r\nimport \"./array/mat3_extension.js\";\r\nimport \"./array/mat4_extension.js\";\r\nimport \"./array/quat2_extension.js\";\r\nimport \"./array/quat_extension.js\";\r\nimport \"./array/vec2_extension.js\";\r\nimport \"./array/vec3_extension.js\";\r\nimport \"./array/vec4_extension.js\";\r\nimport \"./array/vec_extension.js\";\r\nimport \"./math_extension.js\";\r\nimport \"./number_extension.js\";\r\n\r\nexport function initJSExtensions(): void {\r\n initMathExtension();\r\n\r\n initArrayExtension();\r\n initVecExtension();\r\n initVec2Extension();\r\n initVec3Extension();\r\n initVec4Extension();\r\n initQuatExtension();\r\n initQuat2Extension();\r\n initMat3Extension();\r\n initMat4Extension();\r\n\r\n initNumberExtension();\r\n}", "import { initJSExtensions } from \"./extensions/init_js_extentions.js\";\r\n\r\n/**\r\n * TS import preserver\r\n * \r\n * This is only needed to make it so the import is not removed, since it makes the type extensions available to the Typescript \r\n */\r\nimport \"./extensions/init_js_extentions.js\";\r\n\r\nexport function initJSPlugins(): void {\r\n initJSExtensions();\r\n}", "import \"./number_array_type_extension.js\";\r\n\r\nexport function initNumberArrayExtension(): void {\r\n _initNumberArrayExtensionPrototype();\r\n}\r\n\r\nfunction _initNumberArrayExtensionPrototype(): void {\r\n}", "import { Component, Object3D, WonderlandEngine, type ComponentConstructor } from \"@wonderlandengine/api\";\r\nimport { Matrix3, Matrix4, Quaternion, Quaternion2, Vector3 } from \"../../../cauldron/type_definitions/array_type_definitions.js\";\r\nimport { ObjectCloneParams, ObjectUtils } from \"../../../cauldron/wl/utils/object_utils.js\";\r\nimport { PluginUtils } from \"../../utils/plugin_utils.js\";\r\nimport { Object3DExtension } from \"./object_type_extension.js\";\r\n\r\nimport \"./object_type_extension.js\";\r\n\r\nexport function initObjectExtension(): void {\r\n _initObjectExtensionProtoype();\r\n}\r\n\r\nfunction _initObjectExtensionProtoype(): void {\r\n\r\n const objectExtension: Object3DExtension = {\r\n pp_getPosition(this: Readonly, outPosition?: T): T {\r\n return ObjectUtils.getPosition(this, outPosition!);\r\n },\r\n\r\n pp_getPositionWorld(this: Readonly, outPosition?: Vector3 | T): Vector3 | T {\r\n return ObjectUtils.getPositionWorld(this, outPosition!);\r\n },\r\n\r\n pp_getPositionLocal(this: Readonly, outPosition?: Vector3 | T): Vector3 | T {\r\n return ObjectUtils.getPositionLocal(this, outPosition!);\r\n },\r\n\r\n pp_getRotation(this: Readonly, outRotation?: T): T {\r\n return ObjectUtils.getRotation(this, outRotation!);\r\n },\r\n\r\n pp_getRotationDegrees(this: Readonly, outRotation?: T): T {\r\n return ObjectUtils.getRotationDegrees(this, outRotation!);\r\n },\r\n\r\n pp_getRotationRadians(this: Readonly, outRotation?: T): T {\r\n return ObjectUtils.getRotationRadians(this, outRotation!);\r\n },\r\n\r\n pp_getRotationMatrix(this: Readonly, outRotation?: Matrix3 | T): Matrix3 | T {\r\n return ObjectUtils.getRotationMatrix(this, outRotation!);\r\n },\r\n\r\n pp_getRotationQuat(this: Readonly, outRotation?: Quaternion | T): Quaternion | T {\r\n return ObjectUtils.getRotationQuat(this, outRotation!);\r\n },\r\n\r\n pp_getRotationWorld(this: Readonly, outRotation?: T): T {\r\n return ObjectUtils.getRotationWorld(this, outRotation!);\r\n },\r\n\r\n pp_getRotationWorldDegrees(this: Readonly, outRotation?: T): T {\r\n return ObjectUtils.getRotationWorldDegrees(this, outRotation!);\r\n },\r\n\r\n pp_getRotationWorldRadians(this: Readonly, outRotation?: Vector3 | T): Vector3 | T {\r\n return ObjectUtils.getRotationWorldRadians(this, outRotation!);\r\n },\r\n\r\n pp_getRotationWorldMatrix(this: Readonly, outRotation?: Matrix3 | T): Matrix3 | T {\r\n return ObjectUtils.getRotationWorldMatrix(this, outRotation!);\r\n },\r\n\r\n pp_getRotationWorldQuat(this: Readonly, outRotation?: Quaternion | T): Quaternion | T {\r\n return ObjectUtils.getRotationWorldQuat(this, outRotation!);\r\n },\r\n\r\n pp_getRotationLocal(this: Readonly, outRotation?: T): T {\r\n return ObjectUtils.getRotationLocal(this, outRotation!);\r\n },\r\n\r\n pp_getRotationLocalDegrees(this: Readonly, outRotation?: T): T {\r\n return ObjectUtils.getRotationLocalDegrees(this, outRotation!);\r\n },\r\n\r\n pp_getRotationLocalRadians(this: Readonly, outRotation?: Vector3 | T): Vector3 | T {\r\n return ObjectUtils.getRotationLocalRadians(this, outRotation!);\r\n },\r\n\r\n pp_getRotationLocalMatrix(this: Readonly, outRotation?: Matrix3 | T): Matrix3 | T {\r\n return ObjectUtils.getRotationLocalMatrix(this, outRotation!);\r\n },\r\n\r\n pp_getRotationLocalQuat(this: Readonly, outRotation?: Quaternion | T): Quaternion | T {\r\n return ObjectUtils.getRotationLocalQuat(this, outRotation!);\r\n },\r\n\r\n pp_getScale(this: Readonly, outScale?: T): T {\r\n return ObjectUtils.getScale(this, outScale!);\r\n },\r\n\r\n pp_getScaleWorld(this: Readonly, outScale?: Vector3 | T): Vector3 | T {\r\n return ObjectUtils.getScaleWorld(this, outScale!);\r\n },\r\n\r\n pp_getScaleLocal(this: Readonly, outScale?: Vector3 | T): Vector3 | T {\r\n return ObjectUtils.getScaleLocal(this, outScale!);\r\n },\r\n\r\n pp_getTransform(this: Readonly, outTransform?: Matrix4 | T): Matrix4 | T {\r\n return ObjectUtils.getTransform(this, outTransform!);\r\n },\r\n\r\n pp_getTransformMatrix(this: Readonly, outTransform?: Matrix4 | T): Matrix4 | T {\r\n return ObjectUtils.getTransformMatrix(this, outTransform!);\r\n },\r\n\r\n pp_getTransformQuat(this: Readonly, outTransform?: Quaternion2 | T): Quaternion2 | T {\r\n return ObjectUtils.getTransformQuat(this, outTransform!);\r\n },\r\n\r\n pp_getTransformWorld(this: Readonly, outTransform?: Matrix4 | T): Matrix4 | T {\r\n return ObjectUtils.getTransformWorld(this, outTransform!);\r\n },\r\n\r\n pp_getTransformWorldMatrix(this: Readonly, outTransform?: Matrix4 | T): Matrix4 | T {\r\n return ObjectUtils.getTransformWorldMatrix(this, outTransform!);\r\n },\r\n\r\n pp_getTransformWorldQuat(this: Readonly, outTransform?: Quaternion2 | T): Quaternion2 | T {\r\n return ObjectUtils.getTransformWorldQuat(this, outTransform!);\r\n },\r\n\r\n pp_getTransformLocal(this: Readonly, outTransform?: Matrix4 | T): Matrix4 | T {\r\n return ObjectUtils.getTransformLocal(this, outTransform!);\r\n },\r\n\r\n pp_getTransformLocalMatrix(this: Readonly, outTransform?: Matrix4 | T): Matrix4 | T {\r\n return ObjectUtils.getTransformLocalMatrix(this, outTransform!);\r\n },\r\n\r\n pp_getTransformLocalQuat(this: Readonly, outTransform?: Quaternion2 | T): Quaternion2 | T {\r\n return ObjectUtils.getTransformLocalQuat(this, outTransform!);\r\n },\r\n\r\n pp_getAxes(this: Readonly, outAxes?: [Vector3, Vector3, Vector3] | [T, U, V]): [Vector3, Vector3, Vector3] | [T, U, V] {\r\n return ObjectUtils.getAxes(this, outAxes!);\r\n },\r\n\r\n pp_getAxesWorld(this: Readonly, outAxes?: [Vector3, Vector3, Vector3] | [T, U, V]): [Vector3, Vector3, Vector3] | [T, U, V] {\r\n return ObjectUtils.getAxesWorld(this, outAxes!);\r\n },\r\n\r\n pp_getAxesLocal(this: Readonly, outAxes?: [Vector3, Vector3, Vector3] | [T, U, V]): [Vector3, Vector3, Vector3] | [T, U, V] {\r\n return ObjectUtils.getAxesLocal(this, outAxes!);\r\n },\r\n\r\n pp_getForward(this: Readonly, outForward?: T): T {\r\n return ObjectUtils.getForward(this, outForward!);\r\n },\r\n\r\n pp_getForwardWorld(this: Readonly, outForward?: Vector3 | T): Vector3 | T {\r\n return ObjectUtils.getForwardWorld(this, outForward!);\r\n },\r\n\r\n pp_getForwardLocal(this: Readonly, outForward?: Vector3 | T): Vector3 | T {\r\n return ObjectUtils.getForwardLocal(this, outForward!);\r\n },\r\n\r\n pp_getBackward(this: Readonly, outBackward?: T): T {\r\n return ObjectUtils.getBackward(this, outBackward!);\r\n },\r\n\r\n pp_getBackwardWorld(this: Readonly, outBackward?: Vector3 | T): Vector3 | T {\r\n return ObjectUtils.getBackwardWorld(this, outBackward!);\r\n },\r\n\r\n pp_getBackwardLocal(this: Readonly, outBackward?: Vector3 | T): Vector3 | T {\r\n return ObjectUtils.getBackwardLocal(this, outBackward!);\r\n },\r\n\r\n pp_getUp(this: Readonly, outUp?: T): T {\r\n return ObjectUtils.getUp(this, outUp!);\r\n },\r\n\r\n pp_getUpWorld(this: Readonly, outUp?: Vector3 | T): Vector3 | T {\r\n return ObjectUtils.getUpWorld(this, outUp!);\r\n },\r\n\r\n pp_getUpLocal(this: Readonly, outUp?: Vector3 | T): Vector3 | T {\r\n return ObjectUtils.getUpLocal(this, outUp!);\r\n },\r\n\r\n pp_getDown(this: Readonly, outDown?: T): T {\r\n return ObjectUtils.getDown(this, outDown!);\r\n },\r\n\r\n pp_getDownWorld(this: Readonly, outDown?: Vector3 | T): Vector3 | T {\r\n return ObjectUtils.getDownWorld(this, outDown!);\r\n },\r\n\r\n pp_getDownLocal(this: Readonly, outDown?: Vector3 | T): Vector3 | T {\r\n return ObjectUtils.getDownLocal(this, outDown!);\r\n },\r\n\r\n pp_getLeft(this: Readonly, outLeft?: T): T {\r\n return ObjectUtils.getLeft(this, outLeft!);\r\n },\r\n\r\n pp_getLeftWorld(this: Readonly, outLeft?: Vector3 | T): Vector3 | T {\r\n return ObjectUtils.getLeftWorld(this, outLeft!);\r\n },\r\n\r\n pp_getLeftLocal(this: Readonly, outLeft?: Vector3 | T): Vector3 | T {\r\n return ObjectUtils.getLeftLocal(this, outLeft!);\r\n },\r\n\r\n pp_getRight(this: Readonly, outRight?: T): T {\r\n return ObjectUtils.getRight(this, outRight!);\r\n },\r\n\r\n pp_getRightWorld(this: Readonly, outRight?: Vector3 | T): Vector3 | T {\r\n return ObjectUtils.getRightWorld(this, outRight!);\r\n },\r\n\r\n pp_getRightLocal(this: Readonly, outRight?: Vector3 | T): Vector3 | T {\r\n return ObjectUtils.getRightLocal(this, outRight!);\r\n },\r\n\r\n pp_setPosition(this: Object3D, position: Readonly): Object3D {\r\n return ObjectUtils.setPosition(this, position);\r\n },\r\n\r\n pp_setPositionWorld(this: Object3D, position: Readonly): Object3D {\r\n return ObjectUtils.setPositionWorld(this, position);\r\n },\r\n\r\n pp_setPositionLocal(this: Object3D, position: Readonly): Object3D {\r\n return ObjectUtils.setPositionLocal(this, position);\r\n },\r\n\r\n pp_setRotation(this: Object3D, rotation: Readonly): Object3D {\r\n return ObjectUtils.setRotation(this, rotation);\r\n },\r\n\r\n pp_setRotationDegrees(this: Object3D, rotation: Readonly): Object3D {\r\n return ObjectUtils.setRotationDegrees(this, rotation);\r\n },\r\n\r\n pp_setRotationRadians(this: Object3D, rotation: Readonly): Object3D {\r\n return ObjectUtils.setRotationRadians(this, rotation);\r\n },\r\n\r\n pp_setRotationMatrix(this: Object3D, rotation: Readonly): Object3D {\r\n return ObjectUtils.setRotationMatrix(this, rotation);\r\n },\r\n\r\n pp_setRotationQuat(this: Object3D, rotation: Readonly): Object3D {\r\n return ObjectUtils.setRotationQuat(this, rotation);\r\n },\r\n\r\n pp_setRotationWorld(this: Object3D, rotation: Readonly): Object3D {\r\n return ObjectUtils.setRotationWorld(this, rotation);\r\n },\r\n\r\n pp_setRotationWorldDegrees(this: Object3D, rotation: Readonly): Object3D {\r\n return ObjectUtils.setRotationWorldDegrees(this, rotation);\r\n },\r\n\r\n pp_setRotationWorldRadians(this: Object3D, rotation: Readonly): Object3D {\r\n return ObjectUtils.setRotationWorldRadians(this, rotation);\r\n },\r\n\r\n pp_setRotationWorldMatrix(this: Object3D, rotation: Readonly): Object3D {\r\n return ObjectUtils.setRotationWorldMatrix(this, rotation);\r\n },\r\n\r\n pp_setRotationWorldQuat(this: Object3D, rotation: Readonly): Object3D {\r\n return ObjectUtils.setRotationWorldQuat(this, rotation);\r\n },\r\n\r\n pp_setRotationLocal(this: Object3D, rotation: Readonly): Object3D {\r\n return ObjectUtils.setRotationLocal(this, rotation);\r\n },\r\n\r\n pp_setRotationLocalDegrees(this: Object3D, rotation: Readonly): Object3D {\r\n return ObjectUtils.setRotationLocalDegrees(this, rotation);\r\n },\r\n\r\n pp_setRotationLocalRadians(this: Object3D, rotation: Readonly): Object3D {\r\n return ObjectUtils.setRotationLocalRadians(this, rotation);\r\n },\r\n\r\n pp_setRotationLocalMatrix(this: Object3D, rotation: Readonly): Object3D {\r\n return ObjectUtils.setRotationLocalMatrix(this, rotation);\r\n },\r\n\r\n pp_setRotationLocalQuat(this: Object3D, rotation: Readonly): Object3D {\r\n return ObjectUtils.setRotationLocalQuat(this, rotation);\r\n },\r\n\r\n pp_setScale(this: Object3D, scale: Readonly | number): Object3D {\r\n return ObjectUtils.setScale(this, scale as Vector3);\r\n },\r\n\r\n pp_setScaleWorld(this: Object3D, scale: Readonly | number): Object3D {\r\n return ObjectUtils.setScaleWorld(this, scale as Vector3);\r\n },\r\n\r\n pp_setScaleLocal(this: Object3D, scale: Readonly | number): Object3D {\r\n return ObjectUtils.setScaleLocal(this, scale as Vector3);\r\n },\r\n\r\n pp_setAxes(this: Object3D, left?: Readonly, up?: Readonly, forward?: Readonly): Object3D {\r\n return ObjectUtils.setAxes(this, left, up, forward);\r\n },\r\n\r\n pp_setAxesWorld(this: Object3D, left?: Readonly, up?: Readonly, forward?: Readonly): Object3D {\r\n return ObjectUtils.setAxesWorld(this, left, up, forward);\r\n },\r\n\r\n pp_setAxesLocal(this: Object3D, left?: Readonly, up?: Readonly, forward?: Readonly): Object3D {\r\n return ObjectUtils.setAxesLocal(this, left, up, forward);\r\n },\r\n\r\n pp_setForward(this: Object3D, forward: Readonly, up?: Readonly, left?: Readonly): Object3D {\r\n return ObjectUtils.setForward(this, forward, up, left);\r\n },\r\n\r\n pp_setForwardWorld(this: Object3D, forward: Readonly, up?: Readonly, left?: Readonly): Object3D {\r\n return ObjectUtils.setForwardWorld(this, forward, up, left);\r\n },\r\n\r\n pp_setForwardLocal(this: Object3D, forward: Readonly, up?: Readonly, left?: Readonly): Object3D {\r\n return ObjectUtils.setForwardLocal(this, forward, up, left);\r\n },\r\n\r\n pp_setBackward(this: Object3D, backward: Readonly, up?: Readonly, left?: Readonly): Object3D {\r\n return ObjectUtils.setBackward(this, backward, up, left);\r\n },\r\n\r\n pp_setBackwardWorld(this: Object3D, backward: Readonly, up?: Readonly, left?: Readonly): Object3D {\r\n return ObjectUtils.setBackwardWorld(this, backward, up, left);\r\n },\r\n\r\n pp_setBackwardLocal(this: Object3D, backward: Readonly, up?: Readonly, left?: Readonly): Object3D {\r\n return ObjectUtils.setBackwardLocal(this, backward, up, left);\r\n },\r\n\r\n pp_setUp(this: Object3D, up: Readonly, forward?: Readonly, left?: Readonly): Object3D {\r\n return ObjectUtils.setUp(this, up, forward, left);\r\n },\r\n\r\n pp_setUpWorld(this: Object3D, up: Readonly, forward?: Readonly, left?: Readonly): Object3D {\r\n return ObjectUtils.setUpWorld(this, up, forward, left);\r\n },\r\n\r\n pp_setUpLocal(this: Object3D, up: Readonly, forward?: Readonly, left?: Readonly): Object3D {\r\n return ObjectUtils.setUpLocal(this, up, forward, left);\r\n },\r\n\r\n pp_setDown(this: Object3D, down: Readonly, forward?: Readonly, left?: Readonly): Object3D {\r\n return ObjectUtils.setDown(this, down, forward, left);\r\n },\r\n\r\n pp_setDownWorld(this: Object3D, down: Readonly, forward?: Readonly, left?: Readonly): Object3D {\r\n return ObjectUtils.setDownWorld(this, down, forward, left);\r\n },\r\n\r\n pp_setDownLocal(this: Object3D, down: Readonly, forward?: Readonly, left?: Readonly): Object3D {\r\n return ObjectUtils.setDownLocal(this, down, forward, left);\r\n },\r\n\r\n pp_setLeft(this: Object3D, left: Readonly, up?: Readonly, forward?: Readonly): Object3D {\r\n return ObjectUtils.setLeft(this, left, up, forward);\r\n },\r\n\r\n pp_setLeftWorld(this: Object3D, left: Readonly, up?: Readonly, forward?: Readonly): Object3D {\r\n return ObjectUtils.setLeftWorld(this, left, up, forward);\r\n },\r\n\r\n pp_setLeftLocal(this: Object3D, left: Readonly, up?: Readonly, forward?: Readonly): Object3D {\r\n return ObjectUtils.setLeftLocal(this, left, up, forward);\r\n },\r\n\r\n pp_setRight(this: Object3D, right: Readonly, up?: Readonly, forward?: Readonly): Object3D {\r\n return ObjectUtils.setRight(this, right, up, forward);\r\n },\r\n\r\n pp_setRightWorld(this: Object3D, right: Readonly, up?: Readonly, forward?: Readonly): Object3D {\r\n return ObjectUtils.setRightWorld(this, right, up, forward);\r\n },\r\n\r\n pp_setRightLocal(this: Object3D, right: Readonly, up?: Readonly, forward?: Readonly): Object3D {\r\n return ObjectUtils.setRightLocal(this, right, up, forward);\r\n },\r\n\r\n pp_setTransform(this: Object3D, transform: Readonly): Object3D {\r\n return ObjectUtils.setTransform(this, transform);\r\n },\r\n\r\n pp_setTransformMatrix(this: Object3D, transform: Readonly): Object3D {\r\n return ObjectUtils.setTransformMatrix(this, transform);\r\n },\r\n\r\n pp_setTransformQuat(this: Object3D, transform: Readonly): Object3D {\r\n return ObjectUtils.setTransformQuat(this, transform);\r\n },\r\n\r\n pp_setTransformWorld(this: Object3D, transform: Readonly): Object3D {\r\n return ObjectUtils.setTransformWorld(this, transform);\r\n },\r\n\r\n pp_setTransformWorldMatrix(this: Object3D, transform: Readonly): Object3D {\r\n return ObjectUtils.setTransformWorldMatrix(this, transform);\r\n },\r\n\r\n pp_setTransformWorldQuat(this: Object3D, transform: Readonly): Object3D {\r\n return ObjectUtils.setTransformWorldQuat(this, transform);\r\n },\r\n\r\n pp_setTransformLocal(this: Object3D, transform: Readonly): Object3D {\r\n return ObjectUtils.setTransformLocal(this, transform);\r\n },\r\n\r\n pp_setTransformLocalMatrix(this: Object3D, transform: Readonly): Object3D {\r\n return ObjectUtils.setTransformLocalMatrix(this, transform);\r\n },\r\n\r\n pp_setTransformLocalQuat(this: Object3D, transform: Readonly): Object3D {\r\n return ObjectUtils.setTransformLocalQuat(this, transform);\r\n },\r\n\r\n pp_resetPosition(this: Object3D): Object3D {\r\n return ObjectUtils.resetPosition(this);\r\n },\r\n\r\n pp_resetPositionWorld(this: Object3D): Object3D {\r\n return ObjectUtils.resetPositionWorld(this);\r\n },\r\n\r\n pp_resetPositionLocal(this: Object3D): Object3D {\r\n return ObjectUtils.resetPositionLocal(this);\r\n },\r\n\r\n pp_resetRotation(this: Object3D): Object3D {\r\n return ObjectUtils.resetRotation(this);\r\n },\r\n\r\n pp_resetRotationWorld(this: Object3D): Object3D {\r\n return ObjectUtils.resetRotationWorld(this);\r\n },\r\n\r\n pp_resetRotationLocal(this: Object3D): Object3D {\r\n return ObjectUtils.resetRotationLocal(this);\r\n },\r\n\r\n pp_resetScale(this: Object3D): Object3D {\r\n return ObjectUtils.resetScale(this);\r\n },\r\n\r\n pp_resetScaleWorld(this: Object3D): Object3D {\r\n return ObjectUtils.resetScaleWorld(this);\r\n },\r\n\r\n pp_resetScaleLocal(this: Object3D): Object3D {\r\n return ObjectUtils.resetScaleLocal(this);\r\n },\r\n\r\n pp_resetTransform(this: Object3D): Object3D {\r\n return ObjectUtils.resetTransform(this);\r\n },\r\n\r\n pp_resetTransformWorld(this: Object3D): Object3D {\r\n return ObjectUtils.resetTransformWorld(this);\r\n },\r\n\r\n pp_resetTransformLocal(this: Object3D): Object3D {\r\n return ObjectUtils.resetTransformLocal(this);\r\n },\r\n\r\n pp_translate(this: Object3D, translation: Readonly): Object3D {\r\n return ObjectUtils.translate(this, translation);\r\n },\r\n\r\n pp_translateWorld(this: Object3D, translation: Readonly): Object3D {\r\n return ObjectUtils.translateWorld(this, translation);\r\n },\r\n\r\n pp_translateLocal(this: Object3D, translation: Readonly): Object3D {\r\n return ObjectUtils.translateLocal(this, translation);\r\n },\r\n\r\n pp_translateObject(this: Object3D, translation: Readonly): Object3D {\r\n return ObjectUtils.translateObject(this, translation);\r\n },\r\n\r\n pp_translateAxis(this: Object3D, amount: number, direction: Readonly): Object3D {\r\n return ObjectUtils.translateAxis(this, amount, direction);\r\n },\r\n\r\n pp_translateAxisWorld(this: Object3D, amount: number, direction: Readonly): Object3D {\r\n return ObjectUtils.translateAxisWorld(this, amount, direction);\r\n },\r\n\r\n pp_translateAxisLocal(this: Object3D, amount: number, direction: Readonly): Object3D {\r\n return ObjectUtils.translateAxisLocal(this, amount, direction);\r\n },\r\n\r\n pp_translateAxisObject(this: Object3D, amount: number, direction: Readonly): Object3D {\r\n return ObjectUtils.translateAxisObject(this, amount, direction);\r\n },\r\n\r\n pp_rotate(this: Object3D, rotation: Readonly): Object3D {\r\n return ObjectUtils.rotate(this, rotation);\r\n },\r\n\r\n pp_rotateDegrees(this: Object3D, rotation: Readonly): Object3D {\r\n return ObjectUtils.rotateDegrees(this, rotation);\r\n },\r\n\r\n pp_rotateRadians(this: Object3D, rotation: Readonly): Object3D {\r\n return ObjectUtils.rotateRadians(this, rotation);\r\n },\r\n\r\n pp_rotateMatrix(this: Object3D, rotation: Readonly): Object3D {\r\n return ObjectUtils.rotateMatrix(this, rotation);\r\n },\r\n\r\n pp_rotateQuat(this: Object3D, rotation: Readonly): Object3D {\r\n return ObjectUtils.rotateQuat(this, rotation);\r\n },\r\n\r\n pp_rotateWorld(this: Object3D, rotation: Readonly): Object3D {\r\n return ObjectUtils.rotateWorld(this, rotation);\r\n },\r\n\r\n pp_rotateWorldDegrees(this: Object3D, rotation: Readonly): Object3D {\r\n return ObjectUtils.rotateWorldDegrees(this, rotation);\r\n },\r\n\r\n pp_rotateWorldRadians(this: Object3D, rotation: Readonly): Object3D {\r\n return ObjectUtils.rotateWorldRadians(this, rotation);\r\n },\r\n\r\n pp_rotateWorldMatrix(this: Object3D, rotation: Readonly): Object3D {\r\n return ObjectUtils.rotateWorldMatrix(this, rotation);\r\n },\r\n\r\n pp_rotateWorldQuat(this: Object3D, rotation: Readonly): Object3D {\r\n return ObjectUtils.rotateWorldQuat(this, rotation);\r\n },\r\n\r\n pp_rotateLocal(this: Object3D, rotation: Readonly): Object3D {\r\n return ObjectUtils.rotateLocal(this, rotation);\r\n },\r\n\r\n pp_rotateLocalDegrees(this: Object3D, rotation: Readonly): Object3D {\r\n return ObjectUtils.rotateLocalDegrees(this, rotation);\r\n },\r\n\r\n pp_rotateLocalRadians(this: Object3D, rotation: Readonly): Object3D {\r\n return ObjectUtils.rotateLocalRadians(this, rotation);\r\n },\r\n\r\n pp_rotateLocalMatrix(this: Object3D, rotation: Readonly): Object3D {\r\n return ObjectUtils.rotateLocalMatrix(this, rotation);\r\n },\r\n\r\n pp_rotateLocalQuat(this: Object3D, rotation: Readonly): Object3D {\r\n return ObjectUtils.rotateLocalQuat(this, rotation);\r\n },\r\n\r\n pp_rotateObject(this: Object3D, rotation: Readonly): Object3D {\r\n return ObjectUtils.rotateObject(this, rotation);\r\n },\r\n\r\n pp_rotateObjectDegrees(this: Object3D, rotation: Readonly): Object3D {\r\n return ObjectUtils.rotateObjectDegrees(this, rotation);\r\n },\r\n\r\n pp_rotateObjectRadians(this: Object3D, rotation: Readonly): Object3D {\r\n return ObjectUtils.rotateObjectRadians(this, rotation);\r\n },\r\n\r\n pp_rotateObjectMatrix(this: Object3D, rotation: Readonly): Object3D {\r\n return ObjectUtils.rotateObjectMatrix(this, rotation);\r\n },\r\n\r\n pp_rotateObjectQuat(this: Object3D, rotation: Readonly): Object3D {\r\n return ObjectUtils.rotateObjectQuat(this, rotation);\r\n },\r\n\r\n pp_rotateAxis(this: Object3D, angle: number, axis: Readonly): Object3D {\r\n return ObjectUtils.rotateAxis(this, angle, axis);\r\n },\r\n\r\n pp_rotateAxisDegrees(this: Object3D, angle: number, axis: Readonly): Object3D {\r\n return ObjectUtils.rotateAxisDegrees(this, angle, axis);\r\n },\r\n\r\n pp_rotateAxisRadians(this: Object3D, angle: number, axis: Readonly): Object3D {\r\n return ObjectUtils.rotateAxisRadians(this, angle, axis);\r\n },\r\n\r\n pp_rotateAxisWorld(this: Object3D, angle: number, axis: Readonly): Object3D {\r\n return ObjectUtils.rotateAxisWorld(this, angle, axis);\r\n },\r\n\r\n pp_rotateAxisWorldDegrees(this: Object3D, angle: number, axis: Readonly): Object3D {\r\n return ObjectUtils.rotateAxisWorldDegrees(this, angle, axis);\r\n },\r\n\r\n pp_rotateAxisWorldRadians(this: Object3D, angle: number, axis: Readonly): Object3D {\r\n return ObjectUtils.rotateAxisWorldRadians(this, angle, axis);\r\n },\r\n\r\n pp_rotateAxisLocal(this: Object3D, angle: number, axis: Readonly): Object3D {\r\n return ObjectUtils.rotateAxisLocal(this, angle, axis);\r\n },\r\n\r\n pp_rotateAxisLocalDegrees(this: Object3D, angle: number, axis: Readonly): Object3D {\r\n return ObjectUtils.rotateAxisLocalDegrees(this, angle, axis);\r\n },\r\n\r\n pp_rotateAxisLocalRadians(this: Object3D, angle: number, axis: Readonly): Object3D {\r\n return ObjectUtils.rotateAxisLocalRadians(this, angle, axis);\r\n },\r\n\r\n pp_rotateAxisObject(this: Object3D, angle: number, axis: Readonly): Object3D {\r\n return ObjectUtils.rotateAxisObject(this, angle, axis);\r\n },\r\n\r\n pp_rotateAxisObjectDegrees(this: Object3D, angle: number, axis: Readonly): Object3D {\r\n return ObjectUtils.rotateAxisObjectDegrees(this, angle, axis);\r\n },\r\n\r\n pp_rotateAxisObjectRadians(this: Object3D, angle: number, axis: Readonly): Object3D {\r\n return ObjectUtils.rotateAxisObjectRadians(this, angle, axis);\r\n },\r\n\r\n pp_rotateAround(this: Object3D, rotation: Readonly, origin: Readonly): Object3D {\r\n return ObjectUtils.rotateAround(this, rotation, origin);\r\n },\r\n\r\n pp_rotateAroundDegrees(this: Object3D, rotation: Readonly, origin: Readonly): Object3D {\r\n return ObjectUtils.rotateAroundDegrees(this, rotation, origin);\r\n },\r\n\r\n pp_rotateAroundRadians(this: Object3D, rotation: Readonly, origin: Readonly): Object3D {\r\n return ObjectUtils.rotateAroundRadians(this, rotation, origin);\r\n },\r\n\r\n pp_rotateAroundMatrix(this: Object3D, rotation: Readonly, origin: Readonly): Object3D {\r\n return ObjectUtils.rotateAroundMatrix(this, rotation, origin);\r\n },\r\n\r\n pp_rotateAroundQuat(this: Object3D, rotation: Readonly, origin: Readonly): Object3D {\r\n return ObjectUtils.rotateAroundQuat(this, rotation, origin);\r\n },\r\n\r\n pp_rotateAroundWorld(this: Object3D, rotation: Readonly, origin: Readonly): Object3D {\r\n return ObjectUtils.rotateAroundWorld(this, rotation, origin);\r\n },\r\n\r\n pp_rotateAroundWorldDegrees(this: Object3D, rotation: Readonly, origin: Readonly): Object3D {\r\n return ObjectUtils.rotateAroundWorldDegrees(this, rotation, origin);\r\n },\r\n\r\n pp_rotateAroundWorldRadians(this: Object3D, rotation: Readonly, origin: Readonly): Object3D {\r\n return ObjectUtils.rotateAroundWorldRadians(this, rotation, origin);\r\n },\r\n\r\n pp_rotateAroundWorldMatrix(this: Object3D, rotation: Readonly, origin: Readonly): Object3D {\r\n return ObjectUtils.rotateAroundWorldMatrix(this, rotation, origin);\r\n },\r\n\r\n pp_rotateAroundWorldQuat(this: Object3D, rotation: Readonly, origin: Readonly): Object3D {\r\n return ObjectUtils.rotateAroundWorldQuat(this, rotation, origin);\r\n },\r\n\r\n pp_rotateAroundLocal(this: Object3D, rotation: Readonly, origin: Readonly): Object3D {\r\n return ObjectUtils.rotateAroundLocal(this, rotation, origin);\r\n },\r\n\r\n pp_rotateAroundLocalDegrees(this: Object3D, rotation: Readonly, origin: Readonly): Object3D {\r\n return ObjectUtils.rotateAroundLocalDegrees(this, rotation, origin);\r\n },\r\n\r\n pp_rotateAroundLocalRadians(this: Object3D, rotation: Readonly, origin: Readonly): Object3D {\r\n return ObjectUtils.rotateAroundLocalRadians(this, rotation, origin);\r\n },\r\n\r\n pp_rotateAroundLocalMatrix(this: Object3D, rotation: Readonly, origin: Readonly): Object3D {\r\n return ObjectUtils.rotateAroundLocalMatrix(this, rotation, origin);\r\n },\r\n\r\n pp_rotateAroundLocalQuat(this: Object3D, rotation: Readonly, origin: Readonly): Object3D {\r\n return ObjectUtils.rotateAroundLocalQuat(this, rotation, origin);\r\n },\r\n\r\n pp_rotateAroundObject(this: Object3D, rotation: Readonly, origin: Readonly): Object3D {\r\n return ObjectUtils.rotateAroundObject(this, rotation, origin);\r\n },\r\n\r\n pp_rotateAroundObjectDegrees(this: Object3D, rotation: Readonly, origin: Readonly): Object3D {\r\n return ObjectUtils.rotateAroundObjectDegrees(this, rotation, origin);\r\n },\r\n\r\n pp_rotateAroundObjectRadians(this: Object3D, rotation: Readonly, origin: Readonly): Object3D {\r\n return ObjectUtils.rotateAroundObjectRadians(this, rotation, origin);\r\n },\r\n\r\n pp_rotateAroundObjectMatrix(this: Object3D, rotation: Readonly, origin: Readonly): Object3D {\r\n return ObjectUtils.rotateAroundObjectMatrix(this, rotation, origin);\r\n },\r\n\r\n pp_rotateAroundObjectQuat(this: Object3D, rotation: Readonly, origin: Readonly): Object3D {\r\n return ObjectUtils.rotateAroundObjectQuat(this, rotation, origin);\r\n },\r\n\r\n pp_rotateAroundAxis(this: Object3D, angle: number, axis: Readonly, origin: Readonly): Object3D {\r\n return ObjectUtils.rotateAroundAxis(this, angle, axis, origin);\r\n },\r\n\r\n pp_rotateAroundAxisDegrees(this: Object3D, angle: number, axis: Readonly, origin: Readonly): Object3D {\r\n return ObjectUtils.rotateAroundAxisDegrees(this, angle, axis, origin);\r\n },\r\n\r\n pp_rotateAroundAxisRadians(this: Object3D, angle: number, axis: Readonly, origin: Readonly): Object3D {\r\n return ObjectUtils.rotateAroundAxisRadians(this, angle, axis, origin);\r\n },\r\n\r\n pp_rotateAroundAxisWorld(this: Object3D, angle: number, axis: Readonly, origin: Readonly): Object3D {\r\n return ObjectUtils.rotateAroundAxisWorld(this, angle, axis, origin);\r\n },\r\n\r\n pp_rotateAroundAxisWorldDegrees(this: Object3D, angle: number, axis: Readonly, origin: Readonly): Object3D {\r\n return ObjectUtils.rotateAroundAxisWorldDegrees(this, angle, axis, origin);\r\n },\r\n\r\n pp_rotateAroundAxisWorldRadians(this: Object3D, angle: number, axis: Readonly, origin: Readonly): Object3D {\r\n return ObjectUtils.rotateAroundAxisWorldRadians(this, angle, axis, origin);\r\n },\r\n\r\n pp_rotateAroundAxisLocal(this: Object3D, angle: number, axis: Readonly, origin: Readonly): Object3D {\r\n return ObjectUtils.rotateAroundAxisLocal(this, angle, axis, origin);\r\n },\r\n\r\n pp_rotateAroundAxisLocalDegrees(this: Object3D, angle: number, axis: Readonly, origin: Readonly): Object3D {\r\n return ObjectUtils.rotateAroundAxisLocalDegrees(this, angle, axis, origin);\r\n },\r\n\r\n pp_rotateAroundAxisLocalRadians(this: Object3D, angle: number, axis: Readonly, origin: Readonly): Object3D {\r\n return ObjectUtils.rotateAroundAxisLocalRadians(this, angle, axis, origin);\r\n },\r\n\r\n pp_rotateAroundAxisObject(this: Object3D, angle: number, axis: Readonly, origin: Readonly): Object3D {\r\n return ObjectUtils.rotateAroundAxisObject(this, angle, axis, origin);\r\n },\r\n\r\n pp_rotateAroundAxisObjectDegrees(this: Object3D, angle: number, axis: Readonly, origin: Readonly): Object3D {\r\n return ObjectUtils.rotateAroundAxisObjectDegrees(this, angle, axis, origin);\r\n },\r\n\r\n pp_rotateAroundAxisObjectRadians(this: Object3D, angle: number, axis: Readonly, origin: Readonly): Object3D {\r\n return ObjectUtils.rotateAroundAxisObjectRadians(this, angle, axis, origin);\r\n },\r\n\r\n pp_scaleObject(this: Object3D, scale: Readonly | number): Object3D {\r\n return ObjectUtils.scaleObject(this, scale as Vector3);\r\n },\r\n\r\n pp_lookAt(this: Object3D, position: Readonly, up?: Readonly): Object3D {\r\n return ObjectUtils.lookAt(this, position, up);\r\n },\r\n\r\n pp_lookAtWorld(this: Object3D, position: Readonly, up?: Readonly): Object3D {\r\n return ObjectUtils.lookAtWorld(this, position, up);\r\n },\r\n\r\n pp_lookAtLocal(this: Object3D, position: Readonly, up?: Readonly): Object3D {\r\n return ObjectUtils.lookAtLocal(this, position, up);\r\n },\r\n\r\n pp_lookTo(this: Object3D, direction: Readonly, up?: Readonly): Object3D {\r\n return ObjectUtils.lookTo(this, direction, up);\r\n },\r\n\r\n pp_lookToWorld(this: Object3D, direction: Readonly, up?: Readonly): Object3D {\r\n return ObjectUtils.lookToWorld(this, direction, up);\r\n },\r\n\r\n pp_lookToLocal(this: Object3D, direction: Readonly, up?: Readonly): Object3D {\r\n return ObjectUtils.lookToLocal(this, direction, up);\r\n },\r\n\r\n pp_convertPositionObjectToWorld(this: Readonly, position: Readonly, outPosition?: Vector3 | T): Vector3 | T {\r\n return ObjectUtils.convertPositionObjectToWorld(this, position, outPosition!);\r\n },\r\n\r\n pp_convertDirectionObjectToWorld(this: Readonly, direction: Readonly, outDirection?: Vector3 | T): Vector3 | T {\r\n return ObjectUtils.convertDirectionObjectToWorld(this, direction, outDirection!);\r\n },\r\n\r\n pp_convertPositionWorldToObject(this: Readonly, position: Readonly, outPosition?: Vector3 | T): Vector3 | T {\r\n return ObjectUtils.convertPositionWorldToObject(this, position, outPosition!);\r\n },\r\n\r\n pp_convertDirectionWorldToObject(this: Readonly, direction: Readonly, outDirection?: Vector3 | T): Vector3 | T {\r\n return ObjectUtils.convertDirectionWorldToObject(this, direction, outDirection!);\r\n },\r\n\r\n pp_convertPositionLocalToWorld(this: Readonly, position: Readonly, outPosition?: Vector3 | T): Vector3 | T {\r\n return ObjectUtils.convertPositionLocalToWorld(this, position, outPosition!);\r\n },\r\n\r\n pp_convertDirectionLocalToWorld(this: Readonly, direction: Readonly, outDirection?: Vector3 | T): Vector3 | T {\r\n return ObjectUtils.convertDirectionLocalToWorld(this, direction, outDirection!);\r\n },\r\n\r\n pp_convertPositionWorldToLocal(this: Readonly, position: Readonly, outPosition?: Vector3 | T): Vector3 | T {\r\n return ObjectUtils.convertPositionWorldToLocal(this, position, outPosition!);\r\n },\r\n\r\n pp_convertDirectionWorldToLocal(this: Readonly, direction: Readonly, outDirection?: Vector3 | T): Vector3 | T {\r\n return ObjectUtils.convertDirectionWorldToLocal(this, direction, outDirection!);\r\n },\r\n\r\n pp_convertPositionObjectToLocal(this: Readonly, position: Readonly, outPosition?: Vector3 | T): Vector3 | T {\r\n return ObjectUtils.convertPositionObjectToLocal(this, position, outPosition!);\r\n },\r\n\r\n pp_convertDirectionObjectToLocal(this: Readonly, direction: Readonly, outDirection?: Vector3 | T): Vector3 | T {\r\n return ObjectUtils.convertDirectionObjectToLocal(this, direction, outDirection!);\r\n },\r\n\r\n pp_convertPositionLocalToObject(this: Readonly, position: Readonly, outPosition?: Vector3 | T): Vector3 | T {\r\n return ObjectUtils.convertPositionLocalToObject(this, position, outPosition!);\r\n },\r\n\r\n pp_convertDirectionLocalToObject(this: Readonly, direction: Readonly, outDirection?: Vector3 | T): Vector3 | T {\r\n return ObjectUtils.convertDirectionLocalToObject(this, direction, outDirection!);\r\n },\r\n\r\n pp_convertTransformObjectToWorld(this: Readonly, transform: Readonly, outTransform?: T | U): T | U {\r\n return ObjectUtils.convertTransformObjectToWorld(this, transform, outTransform!);\r\n },\r\n\r\n pp_convertTransformObjectToWorldMatrix(this: Readonly, transform: Readonly, outTransform?: T | U): T | U {\r\n return ObjectUtils.convertTransformObjectToWorldMatrix(this, transform, outTransform!);\r\n },\r\n\r\n pp_convertTransformObjectToWorldQuat(this: Readonly, transform: Readonly, outTransform?: T | U): T | U {\r\n return ObjectUtils.convertTransformObjectToWorldQuat(this, transform, outTransform!);\r\n },\r\n\r\n pp_convertTransformWorldToObject(this: Readonly, transform: Readonly, outTransform?: T | U): T | U {\r\n return ObjectUtils.convertTransformWorldToObject(this, transform, outTransform!);\r\n },\r\n\r\n pp_convertTransformWorldToObjectMatrix(this: Readonly, transform: Readonly, outTransform?: T | U): T | U {\r\n return ObjectUtils.convertTransformWorldToObjectMatrix(this, transform, outTransform!);\r\n },\r\n\r\n pp_convertTransformWorldToObjectQuat(this: Readonly, transform: Readonly, outTransform?: T | U): T | U {\r\n return ObjectUtils.convertTransformWorldToObjectQuat(this, transform, outTransform!);\r\n },\r\n\r\n pp_convertTransformLocalToWorld(this: Readonly, transform: Readonly, outTransform?: T | U): T | U {\r\n return ObjectUtils.convertTransformLocalToWorld(this, transform, outTransform!);\r\n },\r\n\r\n pp_convertTransformLocalToWorldMatrix(this: Readonly, transform: Readonly, outTransform?: T | U): T | U {\r\n return ObjectUtils.convertTransformLocalToWorldMatrix(this, transform, outTransform!);\r\n },\r\n\r\n pp_convertTransformLocalToWorldQuat(this: Readonly, transform: Readonly, outTransform?: T | U): T | U {\r\n return ObjectUtils.convertTransformLocalToWorldQuat(this, transform, outTransform!);\r\n },\r\n\r\n pp_convertTransformWorldToLocal(this: Readonly, transform: Readonly, outTransform?: T | U): T | U {\r\n return ObjectUtils.convertTransformWorldToLocal(this, transform, outTransform!);\r\n },\r\n\r\n pp_convertTransformWorldToLocalMatrix(this: Readonly, transform: Readonly, outTransform?: T | U): T | U {\r\n return ObjectUtils.convertTransformWorldToLocalMatrix(this, transform, outTransform!);\r\n },\r\n\r\n pp_convertTransformWorldToLocalQuat(this: Readonly, transform: Readonly, outTransform?: T | U): T | U {\r\n return ObjectUtils.convertTransformWorldToLocalQuat(this, transform, outTransform!);\r\n },\r\n\r\n pp_convertTransformObjectToLocal(this: Readonly, transform: Readonly, outTransform?: T | U): T | U {\r\n return ObjectUtils.convertTransformObjectToLocal(this, transform, outTransform!);\r\n },\r\n\r\n pp_convertTransformObjectToLocalMatrix(this: Readonly, transform: Readonly, outTransform?: T | U): T | U {\r\n return ObjectUtils.convertTransformObjectToLocalMatrix(this, transform, outTransform!);\r\n },\r\n\r\n pp_convertTransformObjectToLocalQuat(this: Readonly, transform: Readonly, outTransform?: T | U): T | U {\r\n return ObjectUtils.convertTransformObjectToLocalQuat(this, transform, outTransform!);\r\n },\r\n\r\n pp_convertTransformLocalToObject(this: Readonly, transform: Readonly, outTransform?: T | U): T | U {\r\n return ObjectUtils.convertTransformLocalToObject(this, transform, outTransform!);\r\n },\r\n\r\n pp_convertTransformLocalToObjectMatrix(this: Readonly, transform: Readonly, outTransform?: T | U): T | U {\r\n return ObjectUtils.convertTransformLocalToObjectMatrix(this, transform, outTransform!);\r\n },\r\n\r\n pp_convertTransformLocalToObjectQuat(this: Readonly, transform: Readonly, outTransform?: T | U): T | U {\r\n return ObjectUtils.convertTransformLocalToObjectQuat(this, transform, outTransform!);\r\n },\r\n\r\n pp_setParent(this: Object3D, newParent: Object3D, keepTransformWorld?: boolean): Object3D {\r\n return ObjectUtils.setParent(this, newParent, keepTransformWorld);\r\n },\r\n\r\n pp_getParent(this: Readonly): Object3D | null {\r\n return ObjectUtils.getParent(this);\r\n },\r\n\r\n pp_addComponent(this: Object3D, classOrType: ComponentConstructor | string, paramsOrActive?: Record | boolean, active?: boolean): T | null {\r\n return ObjectUtils.addComponent(this, classOrType, paramsOrActive, active);\r\n },\r\n\r\n pp_getComponent(this: Readonly, classOrType: ComponentConstructor | string, index?: number): T | null {\r\n return ObjectUtils.getComponent(this, classOrType, index);\r\n },\r\n\r\n pp_getComponentSelf(this: Readonly, classOrType: ComponentConstructor | string, index?: number): T | null {\r\n return ObjectUtils.getComponentSelf(this, classOrType, index);\r\n },\r\n\r\n pp_getComponentHierarchy(this: Readonly, classOrType: ComponentConstructor | string, index?: number): T | null {\r\n return ObjectUtils.getComponentHierarchy(this, classOrType, index);\r\n },\r\n\r\n pp_getComponentHierarchyBreadth(this: Readonly, classOrType: ComponentConstructor | string, index?: number): T | null {\r\n return ObjectUtils.getComponentHierarchyBreadth(this, classOrType, index);\r\n },\r\n\r\n pp_getComponentHierarchyDepth(this: Readonly, classOrType: ComponentConstructor | string, index?: number): T | null {\r\n return ObjectUtils.getComponentHierarchyDepth(this, classOrType, index);\r\n },\r\n\r\n pp_getComponentDescendants(this: Readonly, classOrType: ComponentConstructor | string, index?: number): T | null {\r\n return ObjectUtils.getComponentDescendants(this, classOrType, index);\r\n },\r\n\r\n pp_getComponentDescendantsBreadth(this: Readonly, classOrType: ComponentConstructor | string, index?: number): T | null {\r\n return ObjectUtils.getComponentDescendantsBreadth(this, classOrType, index);\r\n },\r\n\r\n pp_getComponentDescendantsDepth(this: Readonly, classOrType: ComponentConstructor | string, index?: number): T | null {\r\n return ObjectUtils.getComponentDescendantsDepth(this, classOrType, index);\r\n },\r\n\r\n pp_getComponentChildren(this: Readonly, classOrType: ComponentConstructor | string, index?: number): T | null {\r\n return ObjectUtils.getComponentChildren(this, classOrType, index);\r\n },\r\n\r\n pp_getComponents(this: Readonly, classOrType?: ComponentConstructor | string): T[] {\r\n return ObjectUtils.getComponents(this, classOrType);\r\n },\r\n\r\n pp_getComponentsSelf(this: Readonly, classOrType?: ComponentConstructor | string): T[] {\r\n return ObjectUtils.getComponentsSelf(this, classOrType);\r\n },\r\n\r\n pp_getComponentsHierarchy(this: Readonly, classOrType?: ComponentConstructor | string): T[] {\r\n return ObjectUtils.getComponentsHierarchy(this, classOrType);\r\n },\r\n\r\n pp_getComponentsHierarchyBreadth(this: Readonly, classOrType?: ComponentConstructor | string): T[] {\r\n return ObjectUtils.getComponentsHierarchyBreadth(this, classOrType);\r\n },\r\n\r\n pp_getComponentsHierarchyDepth(this: Readonly, classOrType?: ComponentConstructor | string): T[] {\r\n return ObjectUtils.getComponentsHierarchyDepth(this, classOrType);\r\n },\r\n\r\n pp_getComponentsDescendants(this: Readonly, classOrType?: ComponentConstructor | string): T[] {\r\n return ObjectUtils.getComponentsDescendants(this, classOrType);\r\n },\r\n\r\n pp_getComponentsDescendantsBreadth(this: Readonly, classOrType?: ComponentConstructor | string): T[] {\r\n return ObjectUtils.getComponentsDescendantsBreadth(this, classOrType);\r\n },\r\n\r\n pp_getComponentsDescendantsDepth(this: Readonly, classOrType?: ComponentConstructor | string): T[] {\r\n return ObjectUtils.getComponentsDescendantsDepth(this, classOrType);\r\n },\r\n\r\n pp_getComponentsChildren(this: Readonly, classOrType?: ComponentConstructor | string): T[] {\r\n return ObjectUtils.getComponentsChildren(this, classOrType);\r\n },\r\n\r\n pp_setActive(this: Object3D, active: boolean): Object3D {\r\n return ObjectUtils.setActive(this, active);\r\n },\r\n\r\n pp_setActiveSelf(this: Object3D, active: boolean): Object3D {\r\n return ObjectUtils.setActiveSelf(this, active);\r\n },\r\n\r\n pp_setActiveHierarchy(this: Object3D, active: boolean): Object3D {\r\n return ObjectUtils.setActiveHierarchy(this, active);\r\n },\r\n\r\n pp_setActiveHierarchyBreadth(this: Object3D, active: boolean): Object3D {\r\n return ObjectUtils.setActiveHierarchyBreadth(this, active);\r\n },\r\n\r\n pp_setActiveHierarchyDepth(this: Object3D, active: boolean): Object3D {\r\n return ObjectUtils.setActiveHierarchyDepth(this, active);\r\n },\r\n\r\n pp_setActiveDescendants(this: Object3D, active: boolean): Object3D {\r\n return ObjectUtils.setActiveDescendants(this, active);\r\n },\r\n\r\n pp_setActiveDescendantsBreadth(this: Object3D, active: boolean): Object3D {\r\n return ObjectUtils.setActiveDescendantsBreadth(this, active);\r\n },\r\n\r\n pp_setActiveDescendantsDepth(this: Object3D, active: boolean): Object3D {\r\n return ObjectUtils.setActiveDescendantsDepth(this, active);\r\n },\r\n\r\n pp_setActiveChildren(this: Object3D, active: boolean): Object3D {\r\n return ObjectUtils.setActiveChildren(this, active);\r\n },\r\n\r\n pp_hasUniformScale(this: Readonly): boolean {\r\n return ObjectUtils.hasUniformScale(this);\r\n },\r\n\r\n pp_hasUniformScaleWorld(this: Readonly): boolean {\r\n return ObjectUtils.hasUniformScaleWorld(this);\r\n },\r\n\r\n pp_hasUniformScaleLocal(this: Readonly): boolean {\r\n return ObjectUtils.hasUniformScaleLocal(this);\r\n },\r\n\r\n pp_clone(this: Readonly, cloneParams?: Readonly): Object3D | null {\r\n return ObjectUtils.clone(this, cloneParams);\r\n },\r\n\r\n pp_isCloneable(this: Readonly, cloneParams?: Readonly): boolean {\r\n return ObjectUtils.isCloneable(this, cloneParams);\r\n },\r\n\r\n pp_toString(this: Readonly): string {\r\n return ObjectUtils.toString(this);\r\n },\r\n\r\n pp_toStringExtended(this: Readonly): string {\r\n return ObjectUtils.toStringExtended(this);\r\n },\r\n\r\n pp_toStringCompact(this: Readonly): string {\r\n return ObjectUtils.toStringCompact(this);\r\n },\r\n\r\n pp_log(this: Readonly): Object3D {\r\n return ObjectUtils.log(this);\r\n },\r\n\r\n pp_logExtended(this: Readonly): Object3D {\r\n return ObjectUtils.logExtended(this);\r\n },\r\n\r\n pp_logCompact(this: Readonly): Object3D {\r\n return ObjectUtils.logCompact(this);\r\n },\r\n\r\n pp_warn(this: Readonly): Object3D {\r\n return ObjectUtils.warn(this);\r\n },\r\n\r\n pp_warnExtended(this: Readonly): Object3D {\r\n return ObjectUtils.warnExtended(this);\r\n },\r\n\r\n pp_warnCompact(this: Readonly): Object3D {\r\n return ObjectUtils.warnCompact(this);\r\n },\r\n\r\n pp_error(this: Readonly): Object3D {\r\n return ObjectUtils.error(this);\r\n },\r\n\r\n pp_errorExtended(this: Readonly): Object3D {\r\n return ObjectUtils.errorExtended(this);\r\n },\r\n\r\n pp_errorCompact(this: Readonly): Object3D {\r\n return ObjectUtils.errorCompact(this);\r\n },\r\n\r\n pp_getObjectByName(this: Readonly, name: string, isRegex?: boolean, index?: number): Object3D | null {\r\n return ObjectUtils.getObjectByName(this, name, isRegex, index);\r\n },\r\n\r\n pp_getObjectByNameHierarchy(this: Readonly, name: string, isRegex?: boolean, index?: number): Object3D | null {\r\n return ObjectUtils.getObjectByNameHierarchy(this, name, isRegex, index);\r\n },\r\n\r\n pp_getObjectByNameHierarchyBreadth(this: Readonly, name: string, isRegex?: boolean, index?: number): Object3D | null {\r\n return ObjectUtils.getObjectByNameHierarchyBreadth(this, name, isRegex, index);\r\n },\r\n\r\n pp_getObjectByNameHierarchyDepth(this: Readonly, name: string, isRegex?: boolean, index?: number): Object3D | null {\r\n return ObjectUtils.getObjectByNameHierarchyDepth(this, name, isRegex, index);\r\n },\r\n\r\n pp_getObjectByNameDescendants(this: Readonly, name: string, isRegex?: boolean, index?: number): Object3D | null {\r\n return ObjectUtils.getObjectByNameDescendants(this, name, isRegex, index);\r\n },\r\n\r\n pp_getObjectByNameDescendantsBreadth(this: Readonly, name: string, isRegex?: boolean, index?: number): Object3D | null {\r\n return ObjectUtils.getObjectByNameDescendantsBreadth(this, name, isRegex, index);\r\n },\r\n\r\n pp_getObjectByNameDescendantsDepth(this: Readonly, name: string, isRegex?: boolean, index?: number): Object3D | null {\r\n return ObjectUtils.getObjectByNameDescendantsDepth(this, name, isRegex, index);\r\n },\r\n\r\n pp_getObjectByNameChildren(this: Readonly, name: string, isRegex?: boolean, index?: number): Object3D | null {\r\n return ObjectUtils.getObjectByNameChildren(this, name, isRegex, index);\r\n },\r\n\r\n pp_getObjectsByName(this: Readonly, name: string, isRegex?: boolean): Object3D[] {\r\n return ObjectUtils.getObjectsByName(this, name, isRegex);\r\n },\r\n\r\n pp_getObjectsByNameHierarchy(this: Readonly, name: string, isRegex?: boolean): Object3D[] {\r\n return ObjectUtils.getObjectsByNameHierarchy(this, name, isRegex);\r\n },\r\n\r\n pp_getObjectsByNameHierarchyBreadth(this: Readonly, name: string, isRegex?: boolean): Object3D[] {\r\n return ObjectUtils.getObjectsByNameHierarchyBreadth(this, name, isRegex);\r\n },\r\n\r\n pp_getObjectsByNameHierarchyDepth(this: Readonly, name: string, isRegex?: boolean): Object3D[] {\r\n return ObjectUtils.getObjectsByNameHierarchyDepth(this, name, isRegex);\r\n },\r\n\r\n pp_getObjectsByNameDescendants(this: Readonly, name: string, isRegex?: boolean): Object3D[] {\r\n return ObjectUtils.getObjectsByNameDescendants(this, name, isRegex);\r\n },\r\n\r\n pp_getObjectsByNameDescendantsBreadth(this: Readonly, name: string, isRegex?: boolean): Object3D[] {\r\n return ObjectUtils.getObjectsByNameDescendantsBreadth(this, name, isRegex);\r\n },\r\n\r\n pp_getObjectsByNameDescendantsDepth(this: Readonly, name: string, isRegex?: boolean): Object3D[] {\r\n return ObjectUtils.getObjectsByNameDescendantsDepth(this, name, isRegex);\r\n },\r\n\r\n pp_getObjectsByNameChildren(this: Readonly, name: string, isRegex?: boolean): Object3D[] {\r\n return ObjectUtils.getObjectsByNameChildren(this, name, isRegex);\r\n },\r\n\r\n pp_getObjectByID(this: Readonly, id: number): Object3D | null {\r\n return ObjectUtils.getObjectByID(this, id);\r\n },\r\n\r\n pp_getObjectByIDHierarchy(this: Readonly, id: number): Object3D | null {\r\n return ObjectUtils.getObjectByIDHierarchy(this, id);\r\n },\r\n\r\n pp_getObjectByIDHierarchyBreadth(this: Readonly, id: number): Object3D | null {\r\n return ObjectUtils.getObjectByIDHierarchyBreadth(this, id);\r\n },\r\n\r\n pp_getObjectByIDHierarchyDepth(this: Readonly, id: number): Object3D | null {\r\n return ObjectUtils.getObjectByIDHierarchyDepth(this, id);\r\n },\r\n\r\n pp_getObjectByIDDescendants(this: Readonly, id: number): Object3D | null {\r\n return ObjectUtils.getObjectByIDDescendants(this, id);\r\n },\r\n\r\n pp_getObjectByIDDescendantsBreadth(this: Readonly, id: number): Object3D | null {\r\n return ObjectUtils.getObjectByIDDescendantsBreadth(this, id);\r\n },\r\n\r\n pp_getObjectByIDDescendantsDepth(this: Readonly, id: number): Object3D | null {\r\n return ObjectUtils.getObjectByIDDescendantsDepth(this, id);\r\n },\r\n\r\n pp_getObjectByIDChildren(this: Readonly, id: number): Object3D | null {\r\n return ObjectUtils.getObjectByIDChildren(this, id);\r\n },\r\n\r\n pp_getHierarchy(this: Readonly): Object3D[] {\r\n return ObjectUtils.getHierarchy(this);\r\n },\r\n\r\n pp_getHierarchyBreadth(this: Readonly): Object3D[] {\r\n return ObjectUtils.getHierarchyBreadth(this);\r\n },\r\n\r\n pp_getHierarchyDepth(this: Readonly): Object3D[] {\r\n return ObjectUtils.getHierarchyDepth(this);\r\n },\r\n\r\n pp_getDescendants(this: Readonly): Object3D[] {\r\n return ObjectUtils.getDescendants(this);\r\n },\r\n\r\n pp_getDescendantsBreadth(this: Readonly): Object3D[] {\r\n return ObjectUtils.getDescendantsBreadth(this);\r\n },\r\n\r\n pp_getDescendantsDepth(this: Readonly): Object3D[] {\r\n return ObjectUtils.getDescendantsDepth(this);\r\n },\r\n\r\n pp_getChildren(this: Readonly): Object3D[] {\r\n return ObjectUtils.getChildren(this);\r\n },\r\n\r\n pp_getSelf(this: Readonly): Object3D {\r\n return ObjectUtils.getSelf(this);\r\n },\r\n\r\n pp_addChild(this: Object3D): Object3D {\r\n return ObjectUtils.addChild(this);\r\n },\r\n\r\n pp_getName(this: Readonly): string {\r\n return ObjectUtils.getName(this);\r\n },\r\n\r\n pp_setName(this: Object3D, name: string): Object3D {\r\n return ObjectUtils.setName(this, name);\r\n },\r\n\r\n pp_getEngine(this: Readonly): WonderlandEngine {\r\n return ObjectUtils.getEngine(this);\r\n },\r\n\r\n pp_getID(this: Readonly): number {\r\n return ObjectUtils.getID(this);\r\n },\r\n\r\n pp_markDirty(this: Object3D): Object3D {\r\n return ObjectUtils.markDirty(this);\r\n },\r\n\r\n pp_isTransformChanged(this: Readonly): boolean {\r\n return ObjectUtils.isTransformChanged(this);\r\n },\r\n\r\n pp_destroy(this: Object3D): void {\r\n return ObjectUtils.destroy(this);\r\n },\r\n\r\n pp_reserveObjects(this: Readonly, count: number): Object3D {\r\n return ObjectUtils.reserveObjects(this, count);\r\n },\r\n\r\n pp_reserveObjectsSelf(this: Readonly, count: number): Object3D {\r\n return ObjectUtils.reserveObjectsSelf(this, count);\r\n },\r\n\r\n pp_reserveObjectsHierarchy(this: Readonly, count: number): Object3D {\r\n return ObjectUtils.reserveObjectsHierarchy(this, count);\r\n },\r\n\r\n pp_reserveObjectsDescendants(this: Readonly, count: number): Object3D {\r\n return ObjectUtils.reserveObjectsDescendants(this, count);\r\n },\r\n\r\n pp_reserveObjectsChildren(this: Readonly, count: number): Object3D {\r\n return ObjectUtils.reserveObjectsChildren(this, count);\r\n },\r\n\r\n pp_getComponentsAmountMap(this: Readonly, outComponentsAmountMap?: Map): Map {\r\n return ObjectUtils.getComponentsAmountMap(this, outComponentsAmountMap!);\r\n },\r\n\r\n pp_getComponentsAmountMapSelf(this: Readonly, outComponentsAmountMap?: Map): Map {\r\n return ObjectUtils.getComponentsAmountMapSelf(this, outComponentsAmountMap!);\r\n },\r\n\r\n pp_getComponentsAmountMapHierarchy(this: Readonly, outComponentsAmountMap?: Map): Map {\r\n return ObjectUtils.getComponentsAmountMapHierarchy(this, outComponentsAmountMap!);\r\n },\r\n\r\n pp_getComponentsAmountMapDescendants(this: Readonly, outComponentsAmountMap?: Map): Map {\r\n return ObjectUtils.getComponentsAmountMapDescendants(this, outComponentsAmountMap!);\r\n },\r\n\r\n pp_getComponentsAmountMapChildren(this: Readonly, outComponentsAmountMap?: Map): Map {\r\n return ObjectUtils.getComponentsAmountMapChildren(this, outComponentsAmountMap!);\r\n }\r\n };\r\n\r\n PluginUtils.injectOwnProperties(objectExtension, Object3D.prototype, false, true, true);\r\n}\r\n\r\n", "import { initNumberArrayExtension } from \"./number_array_extension.js\";\r\nimport { initObjectExtension } from \"./object_extension.js\";\r\n\r\n/**\r\n * TS import preserver\r\n * \r\n * This is only needed to make it so the import is not removed, since it makes the type extensions available to the Typescript \r\n */\r\nimport \"./number_array_extension.js\";\r\nimport \"./object_extension.js\";\r\n\r\nexport function initWLExtensions(): void {\r\n initObjectExtension();\r\n initNumberArrayExtension();\r\n}", "import { Emitter } from \"@wonderlandengine/api\";\r\nimport { PluginUtils } from \"../../../utils/plugin_utils.js\";\r\n\r\nexport function initCauldronMods(): void {\r\n _initEmitterModPrototype();\r\n}\r\n\r\nfunction _initEmitterModPrototype(): void {\r\n const emitterMod: Record = {\r\n add(this: Emitter, listener: unknown, opts: Partial<{ once: boolean, id: unknown }> = {}): Emitter {\r\n const { once = false, id = undefined } = opts;\r\n const data: any = { id, once, callback: listener };\r\n\r\n const _transactions: { type: number, data: any }[] = (this as unknown as { _transactions: { type: number, data: any }[] })._transactions;\r\n\r\n if (data.id !== undefined) {\r\n _transactions.pp_removeAll((elementToCheck: { type: number, data: any }): boolean => {\r\n return elementToCheck.data.id === data.id;\r\n });\r\n\r\n this._listeners.pp_removeAll((listener: { id: unknown }): boolean => {\r\n return listener.id === data.id;\r\n });\r\n }\r\n\r\n const _notifying: boolean = (this as unknown as { _notifying: boolean })._notifying;\r\n if (_notifying) {\r\n _transactions.push({ type: 1 /* TransactionType.Addition */, data });\r\n return this;\r\n }\r\n this._listeners.push(data);\r\n return this;\r\n },\r\n _flushTransactions(this: Emitter): void {\r\n const listeners = this._listeners;\r\n const _transactions: { type: number, data: any }[] = (this as unknown as { _transactions: { type: number, data: any }[] })._transactions;\r\n\r\n for (let i = 0; i < _transactions.length; i++) {\r\n const transaction = _transactions[i];\r\n if (transaction.type == 1 /*TransactionType.Addition*/) {\r\n listeners.push(transaction.data);\r\n } else {\r\n this.remove(transaction.data);\r\n }\r\n }\r\n\r\n _transactions.length = 0;\r\n }\r\n };\r\n\r\n\r\n\r\n PluginUtils.injectOwnProperties(emitterMod, Emitter.prototype, false, true, true);\r\n}", "import { InputComponent, ViewComponent } from \"@wonderlandengine/api\";\r\nimport { Cursor, CursorTarget, HitTestLocation } from \"@wonderlandengine/components\";\r\nimport { BrowserUtils } from \"../../../../cauldron/utils/browser_utils.js\";\r\nimport { XRUtils } from \"../../../../cauldron/utils/xr_utils.js\";\r\nimport { Handedness } from \"../../../../input/cauldron/input_types.js\";\r\nimport { InputUtils } from \"../../../../input/cauldron/input_utils.js\";\r\nimport { Globals } from \"../../../../pp/globals.js\";\r\nimport { mat4_create, quat2_create, vec3_create } from \"../../../js/extensions/array/vec_create_extension.js\";\r\nimport { PluginUtils } from \"../../../utils/plugin_utils.js\";\r\n\r\nimport \"./cursor_component_type_extension.js\";\r\n\r\nexport function initCursorComponentMod() {\r\n _initCursorComponentModPrototype();\r\n}\r\n\r\nfunction _initCursorComponentModPrototype() {\r\n\r\n let cursorComponentMod = {};\r\n\r\n // Modified Functions\r\n\r\n cursorComponentMod.init = function init() {\r\n this.visible = false;\r\n this.globalTarget = this.object.pp_addComponent(CursorTarget);\r\n this.hitTestTarget = this.object.pp_addComponent(CursorTarget);\r\n this.hoveringObject = null;\r\n this.hoveringObjectTarget = null;\r\n\r\n this.handednessTyped = null;\r\n\r\n this.cursorPos = vec3_create();\r\n\r\n this._collisionMask = (1 << this.collisionGroup);\r\n\r\n this._doubleClickTimer = 0;\r\n this._tripleClickTimer = 0;\r\n this._multipleClickObject = null;\r\n this._multipleClickDelay = 0.3;\r\n\r\n this._onDeactivateCallbacks = [];\r\n\r\n this._prevHitLocationLocalToTarget = vec3_create();\r\n\r\n this._pointerID = null;\r\n\r\n this._updatePointerStyle = false;\r\n\r\n this._lastClientX = null;\r\n this._lastClientY = null;\r\n this._lastWidth = null;\r\n this._lastHeight = null;\r\n this._lastPointerID = null;\r\n\r\n this._lastOriginalMouseEvent = null;\r\n this._lastOriginalGamepadEvent = null;\r\n\r\n this._pointerLeaveToProcess = false;\r\n this._pointerLeaveMouseEvent = null;\r\n\r\n this._transformQuat = quat2_create();\r\n this._origin = vec3_create();\r\n this._direction = vec3_create();\r\n\r\n this._isHovering = false;\r\n\r\n this._isDown = false;\r\n this._lastIsDown = false;\r\n this._isRealDown = false;\r\n\r\n this._isDownForUpWithDown = false;\r\n this._isUpWithNoDown = false;\r\n\r\n this._tempVec = vec3_create();\r\n\r\n this._viewComponent = null;\r\n this._viewComponentBackup = null;\r\n\r\n this._cursorRayOrigin = vec3_create();\r\n this._cursorRayScale = vec3_create();\r\n\r\n this._projectionMatrix = mat4_create();\r\n\r\n this._hitTestLocation = null;\r\n this._hitTestObject = null;\r\n\r\n this._rayHitLocation = vec3_create();\r\n this._hitObjectData = [null, null, null];\r\n\r\n this._myViewEventListenersRegistered = false;\r\n };\r\n\r\n cursorComponentMod.start = function start() {\r\n this._screenSize = [0, 0];\r\n\r\n if (this.handedness == 0) {\r\n let inputComp = this.object.pp_getComponent(InputComponent);\r\n if (!inputComp) {\r\n console.warn(\"cursor component on object \" + this.object.pp_getName() + \" was configured with handedness \\\"input component\\\", \" + \"but object has no input component.\");\r\n this.handedness = null;\r\n } else {\r\n this.handedness = inputComp.handedness;\r\n this.input = inputComp;\r\n }\r\n } else {\r\n this.handedness = InputUtils.getHandednessByIndex(this.handedness - 1);\r\n }\r\n\r\n this.handednessTyped = this.handedness;\r\n\r\n this.pp_setViewComponent(this.object.pp_getComponent(ViewComponent));\r\n this._viewComponentBackup = null;\r\n\r\n if (this.cursorRayObject) {\r\n this.cursorRayObject.pp_setActive(false);\r\n this._cursorRayScale.set(this.cursorRayObject.pp_getScaleLocal());\r\n\r\n // Set ray to a good default distance of the cursor of 1m \r\n this._setCursorRayTransform(null);\r\n }\r\n\r\n this._setCursorVisibility(false);\r\n\r\n if (this.useWebXRHitTest) {\r\n this._hitTestObject = this.object.pp_addChild();\r\n this._hitTestLocation = this.hitTestObject.pp_addComponent(HitTestLocation, { scaleObject: false, });\r\n }\r\n\r\n // #TODO Remove this work around when the pointerId will be fixed on the Meta Quest since now onPointerMove is always 1\r\n // but for the onPointerDown and onPointerUp is always different\r\n // As long as this work around is needed, the cursor might not behave perfectly\r\n // For example, a onUnhover will be trigger every time the pointer is released since it always trigger onPointerLeave\r\n this.isHeadset = BrowserUtils.isDesktop() && XRUtils.isVRSupported(this.engine);\r\n };\r\n\r\n cursorComponentMod.update = function update(dt) {\r\n if (this._doubleClickTimer > 0) {\r\n this._doubleClickTimer -= dt;\r\n }\r\n\r\n if (this._tripleClickTimer > 0) {\r\n this._tripleClickTimer -= dt;\r\n }\r\n\r\n // If in XR, set the cursor ray based on object transform\r\n // View Component not null is currently used as a way to specify this is cursor should only work for Non XR\r\n if (XRUtils.isSessionActive(this.engine) && this._viewComponent == null) {\r\n if (Globals.getHandPose(this.handedness, this.engine).getInputSourceType() != null) {\r\n // Since Google Cardboard tap is registered as arTouchDown without a gamepad, we need to check for gamepad presence \r\n if (this.arTouchDown && this._pp_isAR()) {\r\n let axes = XRUtils.getSession(this.engine).inputSources[0].gamepad.axes;\r\n // Screenspace Y is inverted \r\n this._direction.vec3_set(axes[0], -axes[1], -1.0);\r\n this.updateDirection();\r\n } else {\r\n this.object.pp_getPosition(this._origin);\r\n this.object.pp_getForward(this._direction);\r\n }\r\n\r\n let hitObjectData = this._pp_rayCast();\r\n this._pp_hoverBehaviour(hitObjectData[0], hitObjectData[1], hitObjectData[2], this._lastOriginalGamepadEvent);\r\n } else if (this.hoveringObject != null) {\r\n this._pp_hoverBehaviour(null, null, null, this._lastOriginalGamepadEvent, true); // Trigger Unhover\r\n }\r\n } else if (!XRUtils.isSessionActive(this.engine) && this._viewComponent != null) {\r\n if (this._lastPointerID != null) {\r\n this._pp_updateMousePos(this._lastClientX, this._lastClientY, this._lastWidth, this._lastHeight);\r\n\r\n let hitObjectData = this._pp_rayCast();\r\n this._pp_hoverBehaviour(hitObjectData[0], hitObjectData[1], hitObjectData[2], this._lastOriginalMouseEvent);\r\n\r\n if (this.hoveringObject != null) {\r\n this._pointerID = this._lastPointerID;\r\n } else {\r\n this._pointerID = null;\r\n }\r\n } else if (this.hoveringObject != null) {\r\n this._pp_hoverBehaviour(null, null, null, this._lastOriginalMouseEvent, true); // Trigger Unhover\r\n }\r\n } else if (this.hoveringObject != null) {\r\n this._pp_hoverBehaviour(null, null, null, null, true); // Trigger Unhover\r\n }\r\n\r\n this._pp_processPointerLeave();\r\n\r\n if (this.hoveringObject != null && (this.cursorPos[0] != 0 || this.cursorPos[1] != 0 || this.cursorPos[2] != 0)) {\r\n if (this.cursorObject) {\r\n this._setCursorVisibility(true);\r\n\r\n this.cursorObject.pp_setPosition(this.cursorPos);\r\n this.cursorObject.pp_setTransformLocalQuat(this.cursorObject.pp_getTransformLocalQuat(this._transformQuat).quat2_normalize(this._transformQuat));\r\n }\r\n\r\n if (this.cursorRayObject) {\r\n this._setCursorRayTransform(this.cursorPos);\r\n }\r\n } else {\r\n if (this.cursorObject) {\r\n this._setCursorVisibility(false);\r\n }\r\n\r\n if (this.cursorRayObject) {\r\n this._setCursorRayTransform(null);\r\n }\r\n }\r\n\r\n if (this.cursorRayObject) {\r\n if ((XRUtils.isSessionActive(this.engine) && this._viewComponent == null) || (!XRUtils.isSessionActive(this.engine) && this._viewComponent != null && this.handedness != Handedness.LEFT && this.handedness != Handedness.RIGHT)) {\r\n this.cursorRayObject.pp_setActive(true);\r\n } else {\r\n this.cursorRayObject.pp_setActive(false);\r\n }\r\n }\r\n\r\n if (this.hoveringObject == null) {\r\n this._pointerID = null;\r\n }\r\n\r\n this._updatePointerStyle = false;\r\n\r\n this._lastOriginalMouseEvent = null;\r\n this._lastOriginalGamepadEvent = null;\r\n };\r\n\r\n cursorComponentMod.onActivate = function onActivate() {\r\n this._isDown = false;\r\n this._lastIsDown = false;\r\n\r\n this._isDownForUpWithDown = false;\r\n this._isUpWithNoDown = false;\r\n\r\n if (this._viewComponent == null) {\r\n if (this._viewComponentBackup != null) {\r\n this.pp_setViewComponent(this._viewComponentBackup);\r\n } else {\r\n this.pp_setViewComponent(this.object.pp_getComponent(ViewComponent));\r\n this._viewComponentBackup = null;\r\n }\r\n }\r\n\r\n XRUtils.registerSessionStartEventListener(this, this.setupVREvents.bind(this), true, false, this.engine);\r\n this._onDeactivateCallbacks.push(() => {\r\n XRUtils.unregisterSessionStartEventListener(this, this.engine);\r\n });\r\n };\r\n\r\n cursorComponentMod.onDeactivate = function onDeactivate() {\r\n if (this.hoveringObject != null) {\r\n this._pp_hoverBehaviour(null, null, null, null, true); // Trigger Unhover\r\n }\r\n\r\n this.hoveringObject = null;\r\n this.hoveringObjectTarget = null;\r\n\r\n this._pp_updateCursorStyle();\r\n\r\n this._setCursorVisibility(false);\r\n if (this.cursorRayObject) {\r\n this.cursorRayObject.pp_setActive(false);\r\n }\r\n\r\n this._isDown = false;\r\n this._lastIsDown = false;\r\n this._isRealDown = false;\r\n\r\n this._isDownForUpWithDown = false;\r\n this._isUpWithNoDown = false;\r\n\r\n this._pointerID = null;\r\n\r\n this._lastPointerID = null;\r\n\r\n this._lastClientX = null;\r\n this._lastClientY = null;\r\n this._lastWidth = null;\r\n this._lastHeight = null;\r\n\r\n this._lastOriginalMouseEvent = null;\r\n this._lastOriginalGamepadEvent = null;\r\n\r\n this._pointerLeaveToProcess = false;\r\n this._pointerLeaveMouseEvent = null;\r\n\r\n for (let callback of this._onDeactivateCallbacks) {\r\n callback();\r\n }\r\n\r\n this._onDeactivateCallbacks = [];\r\n\r\n this._viewComponent = null;\r\n };\r\n\r\n cursorComponentMod.onDestroy = function onDestroy() {\r\n if (this._hitTestObject != null) {\r\n this._hitTestObject.pp_destroy();\r\n }\r\n };\r\n\r\n cursorComponentMod.updateDirection = function () {\r\n let transformWorld = quat2_create();\r\n return function updateDirection() {\r\n this.object.pp_getPosition(this._origin);\r\n\r\n // Reverse-project the direction into view space \r\n this._direction.vec3_transformMat4(this._projectionMatrix, this._direction);\r\n this._direction.vec3_normalize(this._direction);\r\n this._direction.vec3_transformQuat(this.object.pp_getTransformQuat(transformWorld), this._direction);\r\n };\r\n }();\r\n\r\n cursorComponentMod.setupVREvents = function setupVREvents(session) {\r\n // If in XR, one-time bind the listener \r\n\r\n let onSelect = this.onSelect.bind(this);\r\n session.addEventListener(\"select\", onSelect);\r\n let onSelectStart = this.onSelectStart.bind(this);\r\n session.addEventListener(\"selectstart\", onSelectStart);\r\n let onSelectEnd = this.onSelectEnd.bind(this);\r\n session.addEventListener(\"selectend\", onSelectEnd);\r\n\r\n this._onDeactivateCallbacks.push(() => {\r\n if (!XRUtils.isSessionActive(this.engine)) return;\r\n\r\n let session = XRUtils.getSession(this.engine);\r\n session.removeEventListener(\"select\", onSelect);\r\n session.removeEventListener(\"selectstart\", onSelectStart);\r\n session.removeEventListener(\"selectend\", onSelectEnd);\r\n });\r\n\r\n // After XR session was entered, the projection matrix changed \r\n this._onViewportResize();\r\n };\r\n\r\n cursorComponentMod.onSelect = function onSelect(e) {\r\n };\r\n\r\n cursorComponentMod.onSelectStart = function onSelectStart(e) {\r\n if (this.active) {\r\n if (this._pp_isAR()) {\r\n this.arTouchDown = true;\r\n this._lastOriginalGamepadEvent = e;\r\n } else if (e.inputSource.handedness == this.handedness) {\r\n this._isDown = true;\r\n this._isRealDown = true;\r\n\r\n if (!this._lastIsDown) {\r\n this._isDownForUpWithDown = true;\r\n }\r\n\r\n this._lastOriginalGamepadEvent = e;\r\n }\r\n }\r\n };\r\n\r\n cursorComponentMod.onSelectEnd = function onSelectEnd(e) {\r\n if (this.active) {\r\n if (this._pp_isAR()) {\r\n this.arTouchDown = false;\r\n this._lastOriginalGamepadEvent = e;\r\n } else if (e.inputSource.handedness == this.handedness) {\r\n if (!this._isDownForUpWithDown) {\r\n this._isUpWithNoDown = true;\r\n }\r\n\r\n this._isDown = false;\r\n this._isRealDown = false;\r\n\r\n this._isDownForUpWithDown = false;\r\n\r\n this._lastOriginalGamepadEvent = e;\r\n }\r\n }\r\n };\r\n\r\n cursorComponentMod.onPointerMove = function onPointerMove(e) {\r\n if (this.active && !this._pointerLeaveToProcess) {\r\n // Don't care about secondary pointers \r\n if (this._pointerID != null && this._pointerID != e.pointerId && !this.isHeadset) return;\r\n\r\n this._pp_updateMouseData(e, e.clientX, e.clientY, this._screenSize[0], this._screenSize[1], e.pointerId);\r\n }\r\n };\r\n\r\n cursorComponentMod.onClick = function onClick(e) {\r\n };\r\n\r\n cursorComponentMod.onPointerDown = function onPointerDown(e) {\r\n if (this.active && !this._pointerLeaveToProcess) {\r\n // Don't care about secondary pointers or non-left clicks \r\n if ((this._pointerID != null && this._pointerID != e.pointerId && !this.isHeadset) || e.button != 0) return;\r\n\r\n this._pp_updateMouseData(e, e.clientX, e.clientY, this._screenSize[0], this._screenSize[1], e.pointerId);\r\n\r\n this._isDown = true;\r\n this._isRealDown = true;\r\n\r\n if (!this._lastIsDown) {\r\n this._isDownForUpWithDown = true;\r\n }\r\n }\r\n };\r\n\r\n cursorComponentMod.onPointerUp = function onPointerUp(e) {\r\n if (this.active && !this._pointerLeaveToProcess) {\r\n // Don't care about secondary pointers or non-left clicks \r\n if ((this._pointerID != null && this._pointerID != e.pointerId && !this.isHeadset) || e.button != 0) return;\r\n\r\n this._pp_updateMouseData(e, e.clientX, e.clientY, this._screenSize[0], this._screenSize[1], e.pointerId);\r\n\r\n if (!this._isDownForUpWithDown) {\r\n this._isUpWithNoDown = true;\r\n }\r\n\r\n this._isDown = false;\r\n this._isRealDown = false;\r\n\r\n this._isDownForUpWithDown = false;\r\n\r\n this._updatePointerStyle = true;\r\n }\r\n };\r\n\r\n cursorComponentMod._onViewportResize = function _onViewportResize() {\r\n if (!this._viewComponent) return;\r\n\r\n // Projection matrix will change if the viewport is resized, which will affect the\r\n // projection matrix because of the aspect ratio\r\n this._viewComponent.projectionMatrix.mat4_invert(this._projectionMatrix);\r\n };\r\n\r\n cursorComponentMod._setCursorRayTransform = function _setCursorRayTransform(hitPosition) {\r\n if (!this.cursorRayObject) return;\r\n if (this.cursorRayScalingAxis != 4) {\r\n this.cursorRayObject.pp_resetScaleLocal();\r\n\r\n if (hitPosition != null) {\r\n this.cursorRayObject.pp_getPosition(this._cursorRayOrigin);\r\n let dist = this._cursorRayOrigin.vec3_distance(hitPosition);\r\n this._cursorRayScale[this.cursorRayScalingAxis] = dist;\r\n this.cursorRayObject.pp_scaleObject(this._cursorRayScale);\r\n }\r\n }\r\n };\r\n\r\n cursorComponentMod._setCursorVisibility = function _setCursorVisibility(visible) {\r\n this.visible = visible;\r\n if (!this.cursorObject) return;\r\n\r\n this.cursorObject.pp_setActive(visible);\r\n };\r\n\r\n // New Functions \r\n\r\n cursorComponentMod._pp_hoverBehaviour = function _pp_hoverBehaviour(hitObject, hitLocation, hitTestResults, originalEvent = null, forceUnhover = false) {\r\n if (!forceUnhover && hitObject != null) {\r\n let hoveringObjectChanged = false;\r\n if (this.hoveringObject == null || this.hoveringObject != hitObject) {\r\n // Unhover previous, if exists \r\n if (this.hoveringObject != null) {\r\n if (!this.hoveringReality) {\r\n if (this.hoveringObjectTarget && !this.hoveringObjectTarget.isDestroyed && this.hoveringObjectTarget.active) this.hoveringObjectTarget.onUnhover.notify(this.hoveringObject, this, originalEvent);\r\n this.globalTarget.onUnhover.notify(this.hoveringObject, this, originalEvent);\r\n } else {\r\n this.hitTestTarget.onUnhover.notify(null, this, originalEvent);\r\n }\r\n }\r\n\r\n hoveringObjectChanged = true;\r\n\r\n // Hover new object \r\n this.hoveringObject = hitObject;\r\n this.hoveringObjectTarget = this.hoveringObject.pp_getComponentSelf(CursorTarget);\r\n if (this.hoveringObjectTarget != null && !this.hoveringObjectTarget.active) {\r\n this.hoveringObjectTarget = null;\r\n }\r\n\r\n if (!this.hoveringReality) {\r\n if (this.hoveringObjectTarget) this.hoveringObjectTarget.onHover.notify(this.hoveringObject, this, originalEvent);\r\n this.globalTarget.onHover.notify(this.hoveringObject, this, originalEvent);\r\n } else {\r\n this.hitTestTarget.onHover.notify(hitTestResults, this, originalEvent);\r\n }\r\n\r\n this._pp_updateCursorStyle();\r\n\r\n if (!this._pp_isDownToProcess() && this._isRealDown) {\r\n this._isDown = true;\r\n this._lastIsDown = true;\r\n\r\n this._isDownForUpWithDown = false;\r\n this._isUpWithNoDown = false;\r\n\r\n if (!this.hoveringReality) {\r\n if (this.hoveringObjectTarget) this.hoveringObjectTarget.onDownOnHover.notify(this.hoveringObject, this, originalEvent);\r\n this.globalTarget.onDownOnHover.notify(this.hoveringObject, this, originalEvent);\r\n } else {\r\n this.hitTestTarget.onDownOnHover.notify(hitTestResults, this, originalEvent);\r\n }\r\n }\r\n }\r\n\r\n if (this._updatePointerStyle) {\r\n this._pp_updateCursorStyle();\r\n }\r\n\r\n if (!hoveringObjectChanged && this._pp_isMoving(hitLocation)) {\r\n\r\n if (!this.hoveringReality) {\r\n if (this.hoveringObjectTarget) this.hoveringObjectTarget.onMove.notify(this.hoveringObject, this, originalEvent);\r\n this.globalTarget.onMove.notify(this.hoveringObject, this, originalEvent);\r\n } else {\r\n this.hitTestTarget.onMove.notify(hitTestResults, this, originalEvent);\r\n }\r\n }\r\n\r\n if (this._pp_isDownToProcess()) {\r\n // Cursor down \r\n if (!this.hoveringReality) {\r\n if (this.hoveringObjectTarget) this.hoveringObjectTarget.onDown.notify(this.hoveringObject, this, originalEvent);\r\n this.globalTarget.onDown.notify(this.hoveringObject, this, originalEvent);\r\n } else {\r\n this.hitTestTarget.onDown.notify(hitTestResults, this, originalEvent);\r\n }\r\n\r\n // Click \r\n if (!this.hoveringReality) {\r\n if (this.hoveringObjectTarget) this.hoveringObjectTarget.onClick.notify(this.hoveringObject, this, originalEvent);\r\n this.globalTarget.onClick.notify(this.hoveringObject, this, originalEvent);\r\n } else {\r\n this.hitTestTarget.onClick.notify(hitTestResults, this, originalEvent);\r\n }\r\n\r\n // Multiple Clicks \r\n if (this._tripleClickTimer > 0 && this._multipleClickObject && this._multipleClickObject == this.hoveringObject) {\r\n if (!this.hoveringReality) {\r\n if (this.hoveringObjectTarget) this.hoveringObjectTarget.onTripleClick.notify(this.hoveringObject, this, originalEvent);\r\n this.globalTarget.onTripleClick.notify(this.hoveringObject, this, originalEvent);\r\n } else {\r\n this.hitTestTarget.onTripleClick.notify(hitTestResults, this, originalEvent);\r\n }\r\n\r\n this._tripleClickTimer = 0;\r\n } else if (this._doubleClickTimer > 0 && this._multipleClickObject && this._multipleClickObject == this.hoveringObject) {\r\n if (!this.hoveringReality) {\r\n if (this.hoveringObjectTarget) this.hoveringObjectTarget.onDoubleClick.notify(this.hoveringObject, this, originalEvent);\r\n this.globalTarget.onDoubleClick.notify(this.hoveringObject, this, originalEvent);\r\n } else {\r\n this.hitTestTarget.onDoubleClick.notify(hitTestResults, this, originalEvent);\r\n }\r\n\r\n this._tripleClickTimer = this._multipleClickDelay;\r\n this._doubleClickTimer = 0;\r\n } else {\r\n if (!this.hoveringReality) {\r\n if (this.hoveringObjectTarget) this.hoveringObjectTarget.onSingleClick.notify(this.hoveringObject, this, originalEvent);\r\n this.globalTarget.onSingleClick.notify(this.hoveringObject, this, originalEvent);\r\n } else {\r\n this.hitTestTarget.onSingleClick.notify(hitTestResults, this, originalEvent);\r\n }\r\n\r\n this._tripleClickTimer = 0;\r\n this._doubleClickTimer = this._multipleClickDelay;\r\n this._multipleClickObject = this.hoveringObject;\r\n }\r\n } else {\r\n // Cursor up \r\n if (!this._isUpWithNoDown && !hoveringObjectChanged && this._pp_isUpToProcess()) {\r\n if (!this.hoveringReality) {\r\n if (this.hoveringObjectTarget) this.hoveringObjectTarget.onUp.notify(this.hoveringObject, this, originalEvent);\r\n this.globalTarget.onUp.notify(this.hoveringObject, this, originalEvent);\r\n\r\n if (this.hoveringObjectTarget) this.hoveringObjectTarget.onUpWithDown.notify(this.hoveringObject, this, originalEvent);\r\n this.globalTarget.onUpWithDown.notify(this.hoveringObject, this, originalEvent);\r\n } else {\r\n this.hitTestTarget.onUp.notify(hitTestResults, this, originalEvent);\r\n\r\n this.hitTestTarget.onUpWithDown.notify(hitTestResults, this, originalEvent);\r\n }\r\n } else if (this._isUpWithNoDown || (hoveringObjectChanged && this._pp_isUpToProcess())) {\r\n if (!this.hoveringReality) {\r\n if (this.hoveringObjectTarget) this.hoveringObjectTarget.onUp.notify(this.hoveringObject, this, originalEvent);\r\n this.globalTarget.onUp.notify(this.hoveringObject, this, originalEvent);\r\n\r\n if (this.hoveringObjectTarget) this.hoveringObjectTarget.onUpWithNoDown.notify(this.hoveringObject, this, originalEvent);\r\n this.globalTarget.onUpWithNoDown.notify(this.hoveringObject, this, originalEvent);\r\n } else {\r\n this.hitTestTarget.onUp.notify(hitTestResults, this, originalEvent);\r\n\r\n this.hitTestTarget.onUpWithNoDown.notify(hitTestResults, this, originalEvent);\r\n }\r\n }\r\n }\r\n\r\n this._prevHitLocationLocalToTarget = this.hoveringObject.pp_convertPositionWorldToLocal(hitLocation, this._prevHitLocationLocalToTarget);\r\n } else if (this.hoveringObject != null && (forceUnhover || hitObject == null)) {\r\n if (!this.hoveringReality) {\r\n if (this.hoveringObjectTarget && !this.hoveringObjectTarget.isDestroyed && this.hoveringObjectTarget.active) this.hoveringObjectTarget.onUnhover.notify(this.hoveringObject, this, originalEvent);\r\n this.globalTarget.onUnhover.notify(this.hoveringObject, this, originalEvent);\r\n } else {\r\n this.hitTestTarget.onUnhover.notify(null, this, originalEvent);\r\n }\r\n\r\n this.hoveringObject = null;\r\n this.hoveringObjectTarget = null;\r\n\r\n this._pp_updateCursorStyle();\r\n }\r\n\r\n if (this.hoveringObject != null) {\r\n this._lastIsDown = this._isDown;\r\n } else {\r\n this._isDown = false;\r\n this._lastIsDown = false;\r\n\r\n this._isDownForUpWithDown = false;\r\n }\r\n\r\n this._isUpWithNoDown = false;\r\n };\r\n\r\n cursorComponentMod._pp_rayCast = function _pp_rayCast() {\r\n let rayHit =\r\n this.rayCastMode == 0\r\n ? Globals.getScene(this.engine).rayCast(\r\n this._origin,\r\n this._direction,\r\n this._collisionMask\r\n )\r\n : Globals.getPhysics(this.engine).rayCast(\r\n this._origin,\r\n this._direction,\r\n this._collisionMask,\r\n this.maxDistance\r\n );\r\n\r\n let rayHitCollisionDistanceValid = true;\r\n if (this.rayCastMode == 0 && rayHit.hitCount > 0 && rayHit.distances[0] > this.maxDistance) {\r\n rayHitCollisionDistanceValid = false;\r\n }\r\n\r\n this._hitObjectData[0] = null;\r\n this._hitObjectData[1] = null;\r\n this._hitObjectData[2] = null;\r\n\r\n let hitTestResultDistance = Infinity;\r\n if (this._hitTestLocation != null && this._hitTestLocation.visible) {\r\n this._hitTestObject.pp_getPositionWorld(this.cursorPos);\r\n this._rayHitLocation.vec3_copy(this.cursorPos);\r\n hitTestResultDistance = this.cursorPos.vec3_distance(this.object.pp_getPositionWorld(this._tempVec));\r\n\r\n this._hitObjectData[0] = this._hitTestObject;\r\n this._hitObjectData[1] = this._rayHitLocation;\r\n }\r\n\r\n this.hoveringReality = false;\r\n\r\n if (rayHit.hitCount > 0 && rayHitCollisionDistanceValid) {\r\n let rayHitDistance = rayHit.distances[0];\r\n if (rayHitDistance <= hitTestResultDistance) {\r\n // Overwrite cursorPos set by hit test location\r\n this.cursorPos.vec3_copy(rayHit.locations[0]);\r\n this._rayHitLocation.vec3_copy(this.cursorPos);\r\n\r\n this._hitObjectData[0] = rayHit.objects[0];\r\n this._hitObjectData[1] = this._rayHitLocation;\r\n } else {\r\n this.hoveringReality = true;\r\n }\r\n } else if (hitTestResultDistance == Infinity) {\r\n this.cursorPos.vec3_zero();\r\n\r\n this._hitObjectData[0] = null;\r\n this._hitObjectData[1] = null;\r\n }\r\n\r\n let xrFrame = XRUtils.getFrame(this.engine);\r\n if (this.hoveringReality && xrFrame != null) {\r\n this._hitObjectData[2] = this._hitTestLocation.getHitTestResults(xrFrame)[0];\r\n }\r\n\r\n if (this._hitObjectData[0] != null) {\r\n const cursorTarget = this._hitObjectData[0].pp_getComponentSelf(CursorTarget);\r\n if (cursorTarget == null || !cursorTarget.active) {\r\n this._hitObjectData[0] = null;\r\n this._hitObjectData[1] = null;\r\n this._hitObjectData[2] = null;\r\n }\r\n }\r\n\r\n return this._hitObjectData;\r\n };\r\n\r\n cursorComponentMod._pp_updateMouseData = function _pp_updateMouseData(e, clientX, clientY, w, h, pointerID) {\r\n this._lastClientX = clientX;\r\n this._lastClientY = clientY;\r\n this._lastWidth = w;\r\n this._lastHeight = h;\r\n this._lastPointerID = pointerID;\r\n\r\n this._lastOriginalMouseEvent = e;\r\n };\r\n\r\n cursorComponentMod._pp_updateMousePos = function _pp_updateMousePos(clientX, clientY, w, h) {\r\n // Get direction in normalized device coordinate space from mouse position \r\n let left = clientX / w;\r\n let top = clientY / h;\r\n this._direction.vec3_set(left * 2 - 1, -top * 2 + 1, -1.0);\r\n\r\n this.updateDirection();\r\n };\r\n\r\n cursorComponentMod.pp_setViewComponent = function pp_setViewComponent(viewComponent) {\r\n this._viewComponent = viewComponent;\r\n\r\n // If this object also has a view component, we will enable inverse-projected mouse clicks,\r\n // otherwise just use the objects transformation\r\n if (this._viewComponent != null) {\r\n this._viewComponent.projectionMatrix.mat4_invert(this._projectionMatrix);\r\n\r\n if (!this._myViewEventListenersRegistered) {\r\n this._myViewEventListenersRegistered = true;\r\n\r\n this._myWindowResizeEventListener = () => {\r\n let bounds = document.body.getBoundingClientRect();\r\n this._screenSize[0] = bounds.width;\r\n this._screenSize[1] = bounds.height;\r\n };\r\n this._myWindowResizeEventListener();\r\n window.addEventListener(\"resize\", this._myWindowResizeEventListener);\r\n\r\n let onClick = this.onClick.bind(this);\r\n Globals.getCanvas(this.engine).addEventListener(\"click\", onClick);\r\n let onPointerDown = this.onPointerDown.bind(this);\r\n Globals.getCanvas(this.engine).addEventListener(\"pointerdown\", onPointerDown);\r\n let onPointerMove = this.onPointerMove.bind(this);\r\n Globals.getCanvas(this.engine).addEventListener(\"pointermove\", onPointerMove);\r\n let onPointerUp = this.onPointerUp.bind(this);\r\n Globals.getCanvas(this.engine).addEventListener(\"pointerup\", onPointerUp);\r\n let onPointerLeave = this._pp_onPointerLeave.bind(this);\r\n Globals.getCanvas(this.engine).addEventListener(\"pointerleave\", onPointerLeave);\r\n\r\n let onViewportResize = this._onViewportResize.bind(this);\r\n this.engine.onResize.add(onViewportResize);\r\n\r\n this._onDeactivateCallbacks.push(() => {\r\n Globals.getCanvas(this.engine).removeEventListener(\"click\", onClick);\r\n Globals.getCanvas(this.engine).removeEventListener(\"pointerdown\", onPointerDown);\r\n Globals.getCanvas(this.engine).removeEventListener(\"pointermove\", onPointerMove);\r\n Globals.getCanvas(this.engine).removeEventListener(\"pointerup\", onPointerUp);\r\n Globals.getCanvas(this.engine).removeEventListener(\"pointerleave\", onPointerLeave);\r\n\r\n this.engine.onResize.remove(onViewportResize);\r\n\r\n window.removeEventListener(\"resize\", this._myWindowResizeEventListener);\r\n\r\n this._myViewEventListenersRegistered = false;\r\n });\r\n }\r\n }\r\n\r\n this._viewComponentBackup = this._viewComponent;\r\n };\r\n\r\n cursorComponentMod._pp_onPointerLeave = function _pp_onPointerLeave(e) {\r\n if (this._pointerID == null || this._pointerID == e.pointerId || this.isHeadset) {\r\n this._pointerLeaveToProcess = true;\r\n this._pointerLeaveMouseEvent = e;\r\n }\r\n };\r\n\r\n cursorComponentMod._pp_processPointerLeave = function _pp_processPointerLeave() {\r\n if (this._pointerLeaveToProcess) {\r\n this._pointerID = null;\r\n\r\n this._lastPointerID = null;\r\n\r\n this._lastClientX = null;\r\n this._lastClientY = null;\r\n this._lastWidth = null;\r\n this._lastHeight = null;\r\n\r\n this._lastOriginalMouseEvent = this._pointerLeaveMouseEvent;\r\n\r\n this._pointerLeaveToProcess = false;\r\n this._pointerLeaveMouseEvent = null;\r\n\r\n if (this.hoveringObject != null) {\r\n this._pp_hoverBehaviour(null, null, null, this._lastOriginalMouseEvent, true); // Trigger Unhover\r\n }\r\n\r\n this._isDown = false;\r\n this._lastIsDown = false;\r\n this._isRealDown = false;\r\n\r\n this._isDownForUpWithDown = false;\r\n this._isUpWithNoDown = false;\r\n }\r\n };\r\n\r\n cursorComponentMod._pp_isDownToProcess = function _pp_isDownToProcess() {\r\n return this._isDown != this._lastIsDown && this._isDown;\r\n };\r\n\r\n cursorComponentMod._pp_isUpToProcess = function _pp_isUpToProcess() {\r\n return this._isDown != this._lastIsDown && !this._isDown;\r\n };\r\n\r\n cursorComponentMod._pp_isMoving = function () {\r\n let hitLocationLocalToTarget = vec3_create();\r\n return function _pp_isMoving(hitLocation) {\r\n let moving = false;\r\n\r\n hitLocationLocalToTarget = this.hoveringObject.pp_convertPositionWorldToLocal(hitLocation, hitLocationLocalToTarget);\r\n\r\n if (!hitLocationLocalToTarget.vec_equals(this._prevHitLocationLocalToTarget, 0.0001)) {\r\n moving = true;\r\n }\r\n\r\n return moving;\r\n };\r\n }();\r\n\r\n cursorComponentMod._pp_isAR = function _pp_isAR() {\r\n let firstInputSource = XRUtils.getSession(this.engine).inputSources[0];\r\n return this.input != null && firstInputSource.handedness == \"none\" && firstInputSource.gamepad != null;\r\n };\r\n\r\n cursorComponentMod._pp_updateCursorStyle = function _pp_updateCursorStyle() {\r\n if (this.styleCursor) {\r\n if (this.hoveringObjectTarget != null && !this.hoveringObjectTarget.isSurface) {\r\n document.body.style.cursor = \"pointer\";\r\n } else if (document.body.style.cursor == \"pointer\") {\r\n document.body.style.cursor = \"default\";\r\n }\r\n }\r\n };\r\n\r\n\r\n\r\n PluginUtils.injectOwnProperties(cursorComponentMod, Cursor.prototype, false, true, true);\r\n}", "import { Emitter } from \"@wonderlandengine/api\";\r\nimport { CursorTarget } from \"@wonderlandengine/components\";\r\nimport { PluginUtils } from \"../../../utils/plugin_utils.js\";\r\n\r\nimport \"./cursor_target_component_type_extension.js\";\r\n\r\nexport function initCursorTargetComponentMod(): void {\r\n _initCursorTargetComponentModPrototype();\r\n}\r\n\r\nfunction _initCursorTargetComponentModPrototype(): void {\r\n\r\n const cursorTargetComponentMod: Record = {\r\n\r\n // New Functions \r\n\r\n init(this: CursorTarget): void {\r\n this.onSingleClick = new Emitter();\r\n this.onDoubleClick = new Emitter();\r\n this.onTripleClick = new Emitter();\r\n\r\n this.onDownOnHover = new Emitter();\r\n\r\n this.onUpWithDown = new Emitter();\r\n this.onUpWithNoDown = new Emitter();\r\n\r\n this.isSurface = false;\r\n },\r\n\r\n start(): void { },\r\n update(dt: number): void { },\r\n onActivate(): void { },\r\n onDeactivate(): void { },\r\n onDestroy(): void { },\r\n };\r\n\r\n\r\n\r\n PluginUtils.injectOwnProperties(cursorTargetComponentMod, CursorTarget.prototype, false, true, true);\r\n}", "import { MouseLookComponent } from \"@wonderlandengine/components\";\r\nimport { Timer } from \"../../../../cauldron/cauldron/timer.js\";\r\nimport { Globals } from \"../../../../pp/globals.js\";\r\nimport { vec3_create } from \"../../../js/extensions/array/vec_create_extension.js\";\r\nimport { PluginUtils } from \"../../../utils/plugin_utils.js\";\r\n\r\nexport function initMouseLookComponentMod() {\r\n _initMouseLookComponentModPrototype();\r\n}\r\n\r\nfunction _initMouseLookComponentModPrototype() {\r\n\r\n let mouseLookComponentMod = {};\r\n\r\n // Modified Functions\r\n\r\n mouseLookComponentMod.init = function init() {\r\n this.pointerId = null;\r\n this.prevMoveEvent = null;\r\n\r\n this.resetMovingDelay = 0.15;\r\n this.resetMovingTimer = new Timer(this.resetMovingDelay, false);\r\n this.isMoving = false;\r\n this.mouseDown = false;\r\n\r\n this.pointerMoveListener = this._onMove.bind(this);\r\n\r\n this.contextMenuListener = function (event) {\r\n if (this.active) {\r\n event.preventDefault();\r\n }\r\n }.bind(this);\r\n\r\n this.pointerDown = function (event) {\r\n if (this.active) {\r\n if (this.pointerId != null) return;\r\n\r\n if (!this.mouseDown) {\r\n if (event.button == this.mouseButtonIndex) {\r\n this.pointerId = event.pointerId;\r\n this.mouseDown = true;\r\n // Commenting cursor style change for now since it messes with Cursor Component cursor style, which is more important to have,\r\n // since it provides a more important feedback, while here is mostly just a visual thing\r\n //document.body.style.cursor = \"grabbing\"; \r\n if (event.button == 1) {\r\n event.preventDefault(); // Prevent scrolling\r\n return false;\r\n }\r\n }\r\n }\r\n }\r\n }.bind(this);\r\n\r\n this.pointerUp = function (event) {\r\n if (this.active) {\r\n if (event.pointerId != this.pointerId) return;\r\n\r\n if (this.mouseDown) {\r\n if (event.button == this.mouseButtonIndex) {\r\n this.mouseDown = false;\r\n //document.body.style.cursor = \"default\";\r\n }\r\n }\r\n }\r\n }.bind(this);\r\n\r\n this.pointerLeave = function (event) {\r\n if (this.active) {\r\n if (event.pointerId != this.pointerId) return;\r\n\r\n this.pointerId = null;\r\n this.prevMoveEvent = null;\r\n\r\n if (this.mouseDown) {\r\n this.mouseDown = false;\r\n //document.body.style.cursor = \"default\";\r\n }\r\n }\r\n }.bind(this);\r\n };\r\n\r\n // New Functions\r\n\r\n mouseLookComponentMod.start = function start() { };\r\n\r\n mouseLookComponentMod.onActivate = function onActivate() {\r\n document.body.addEventListener(\"pointermove\", this.pointerMoveListener);\r\n\r\n if (this.requireMouseDown) {\r\n if (this.mouseButtonIndex == 2) {\r\n Globals.getCanvas(this.engine).addEventListener(\"contextmenu\", this.contextMenuListener, false);\r\n }\r\n\r\n Globals.getCanvas(this.engine).addEventListener(\"pointerdown\", this.pointerDown);\r\n\r\n document.body.addEventListener(\"pointerup\", this.pointerUp);\r\n }\r\n\r\n document.body.addEventListener(\"pointerleave\", this.pointerLeave);\r\n };\r\n\r\n mouseLookComponentMod.onDeactivate = function onDeactivate() {\r\n if (this.mouseDown) {\r\n //document.body.style.cursor = \"default\";\r\n }\r\n\r\n this.isMoving = false;\r\n this.mouseDown = false;\r\n\r\n this.pointerId = null;\r\n this.prevMoveEvent = null;\r\n\r\n document.body.removeEventListener(\"pointermove\", this.pointerMoveListener);\r\n Globals.getCanvas(this.engine).removeEventListener(\"contextmenu\", this.contextMenuListener);\r\n Globals.getCanvas(this.engine).removeEventListener(\"pointerdown\", this.pointerDown);\r\n document.body.removeEventListener(\"pointerup\", this.pointerUp);\r\n document.body.removeEventListener(\"pointerleave\", this.pointerLeave);\r\n };\r\n\r\n mouseLookComponentMod.update = function update(dt) {\r\n if (this.resetMovingTimer.isRunning()) {\r\n this.resetMovingTimer.update(dt);\r\n if (this.resetMovingTimer.isDone()) {\r\n this.resetMovingTimer.reset();\r\n this.isMoving = false;\r\n }\r\n }\r\n\r\n if (!this.isMoving) {\r\n if (!this.requireMouseDown || !this.mouseDown) {\r\n this.pointerId = null;\r\n }\r\n\r\n this.prevMoveEvent = null;\r\n }\r\n };\r\n\r\n mouseLookComponentMod._onMove = function () {\r\n let viewForward = vec3_create();\r\n let viewUp = vec3_create();\r\n\r\n let referenceUp = vec3_create();\r\n let referenceUpNegate = vec3_create();\r\n let referenceRight = vec3_create();\r\n\r\n let newUp = vec3_create();\r\n return function _onMove(event) {\r\n if (this.active) {\r\n if (this.pointerId != null && event.pointerId != this.pointerId) return;\r\n\r\n if (this.mouseDown || !this.requireMouseDown) {\r\n\r\n viewForward = this.object.pp_getBackward(viewForward); // The view \"real\" forward is actually the backward\r\n viewUp = this.object.pp_getUp(viewUp);\r\n\r\n referenceUp.vec3_set(0, 1, 0);\r\n if (this.object.pp_getParent() != null) {\r\n referenceUp = this.object.pp_getParent().pp_getUp(referenceUp);\r\n }\r\n\r\n referenceRight = viewForward.vec3_cross(referenceUp, referenceRight);\r\n\r\n let minAngle = 1;\r\n if (viewForward.vec3_angle(referenceUp) < minAngle) {\r\n referenceRight = viewUp.vec3_negate(referenceRight).vec3_cross(referenceUp, referenceRight);\r\n } else if (viewForward.vec3_angle(referenceUp.vec3_negate(referenceUpNegate)) < minAngle) {\r\n referenceRight = viewUp.vec3_cross(referenceUp, referenceRight);\r\n } else if (!viewUp.vec3_isConcordant(referenceUp)) {\r\n referenceRight.vec3_negate(referenceRight);\r\n }\r\n referenceRight.vec3_normalize(referenceRight);\r\n\r\n let movementX = event.movementX;\r\n let movementY = event.movementY;\r\n\r\n if (movementX == null || movementY == null) {\r\n if (this.prevMoveEvent != null) {\r\n movementX = event.pageX - this.prevMoveEvent.pageX;\r\n movementY = event.pageY - this.prevMoveEvent.pageY;\r\n } else {\r\n movementX = 0;\r\n movementY = 0;\r\n }\r\n }\r\n\r\n this.rotationX = -this.sensitity * movementX;\r\n this.rotationY = -this.sensitity * movementY;\r\n\r\n this.object.pp_rotateAxis(this.rotationY, referenceRight);\r\n\r\n let maxVerticalAngle = 89 - 0.001;\r\n newUp = this.object.pp_getUp(newUp);\r\n let angleWithUp = Math.pp_angleClamp(newUp.vec3_angleSigned(referenceUp, referenceRight));\r\n if (Math.abs(angleWithUp) > maxVerticalAngle) {\r\n let fixAngle = (Math.abs(angleWithUp) - maxVerticalAngle) * Math.pp_sign(angleWithUp);\r\n this.object.pp_rotateAxis(fixAngle, referenceRight);\r\n }\r\n\r\n this.object.pp_rotateAxis(this.rotationX, referenceUp);\r\n\r\n this.prevMoveEvent = event;\r\n this.pointerId = event.pointerId;\r\n\r\n this.resetMovingTimer.start(this.resetMovingDelay);\r\n this.isMoving = true;\r\n }\r\n }\r\n };\r\n }();\r\n\r\n\r\n\r\n PluginUtils.injectOwnProperties(mouseLookComponentMod, MouseLookComponent.prototype, false, true, true);\r\n}", "import { initCauldronMods } from \"./cauldron_mods.js\";\r\nimport { initCursorComponentMod } from \"./cursor_component_mod.js\";\r\nimport { initCursorTargetComponentMod } from \"./cursor_target_component_mod.js\";\r\nimport { initMouseLookComponentMod } from \"./mouse_look_component_mod.js\";\r\n\r\n/**\r\n * TS import preserver\r\n * \r\n * This is only needed to make it so the import is not removed, since it makes the type extensions available to the Typescript \r\n */\r\nimport \"./cauldron_mods.js\";\r\nimport \"./cursor_component_mod.js\";\r\nimport \"./cursor_target_component_mod.js\";\r\nimport \"./mouse_look_component_mod.js\";\r\n\r\nexport function initComponentMods(): void {\r\n initCursorComponentMod();\r\n initCursorTargetComponentMod();\r\n initMouseLookComponentMod();\r\n\r\n initCauldronMods();\r\n}", "import { initComponentMods } from \"./components/init_component_mods.js\";\r\n\r\n/**\r\n * TS import preserver\r\n * \r\n * This is only needed to make it so the import is not removed, since it makes the type extensions available to the Typescript \r\n */\r\nimport \"./components/init_component_mods.js\";\r\n\r\nexport function initWLMods(): void {\r\n initComponentMods();\r\n}", "import { initWLExtensions } from \"./extensions/init_wl_extentions.js\";\r\nimport { initWLMods } from \"./mods/init_wl_mods.js\";\r\n\r\n/**\r\n * TS import preserver\r\n * \r\n * This is only needed to make it so the import is not removed, since it makes the type extensions available to the Typescript \r\n */\r\nimport \"./extensions/init_wl_extentions.js\";\r\nimport \"./mods/init_wl_mods.js\";\r\n\r\nexport function initWLPlugins(): void {\r\n initWLExtensions();\r\n initWLMods();\r\n}", "import { initJSPlugins } from \"./js/init_js_plugins.js\";\r\nimport { initWLPlugins } from \"./wl/init_wl_plugins.js\";\r\n\r\n/**\r\n * TS import preserver\r\n * \r\n * This is only needed to make it so the import is not removed, since it makes the type extensions available to the Typescript \r\n */\r\nimport \"./js/init_js_plugins.js\";\r\nimport \"./wl/init_wl_plugins.js\";\r\n\r\nexport function initPlugins(): void {\r\n initJSPlugins();\r\n initWLPlugins();\r\n}", "export const PP_VERSION = \"0.7.2\";", "import { WonderlandEngine } from \"@wonderlandengine/api\";\r\nimport { registerWLComponents } from \"../cauldron/wl/register_wl_components.js\";\r\nimport { ComponentUtils } from \"../cauldron/wl/utils/component_utils.js\";\r\nimport { initPlugins } from \"../plugin/init_plugins.js\";\r\nimport { Globals } from \"./globals.js\";\r\nimport { PP_VERSION } from \"./pp_version.js\";\r\nimport { registerPPComponents } from \"./register_pp_components.js\";\r\n\r\n/**\r\n * TS import preserver\r\n * \r\n * This is only needed to make it so the import is not removed, since it makes the type extensions available to the Typescript \r\n */\r\nimport \"../plugin/init_plugins.js\";\r\n\r\nexport function initPP(engine: WonderlandEngine): void {\r\n console.log(\"PP version: \" + PP_VERSION);\r\n\r\n Globals.setMainEngine(engine);\r\n\r\n ComponentUtils.setWLComponentDefaultCloneCallbacks(engine);\r\n\r\n registerWLComponents(engine);\r\n registerPPComponents(engine);\r\n\r\n initPlugins();\r\n}", "import { Component, Property } from \"@wonderlandengine/api\";\r\nimport * as PPAPI from \"../../index.js\";\r\n\r\nexport class AddPPToWindowComponent extends Component {\r\n static TypeName = \"pp-add-pp-to-window\";\r\n static Properties = {\r\n _myAdd: Property.bool(true)\r\n };\r\n\r\n init() {\r\n this._myPP = null;\r\n if (this._myAdd) {\r\n this._myPP = {};\r\n this._addProperties(PPAPI);\r\n\r\n window.PP = this._myPP;\r\n }\r\n }\r\n\r\n _addProperties(object) {\r\n let propertyNames = Object.getOwnPropertyNames(object);\r\n for (let propertyName of propertyNames) {\r\n if (object[propertyName] != undefined) {\r\n this._myPP[propertyName] = object[propertyName];\r\n }\r\n }\r\n }\r\n\r\n onActivate() {\r\n if (this._myPP != null) {\r\n window.PP = this._myPP;\r\n }\r\n }\r\n\r\n onDeactivate() {\r\n if (this._myPP != null) {\r\n delete window.PP;\r\n }\r\n }\r\n}", "import { Howler } from \"howler\";\r\n\r\nexport function isPlaybackBlocked() {\r\n let blocked = false;\r\n\r\n if (Howler != null && Howler.state != \"running\") {\r\n blocked = true;\r\n }\r\n\r\n return blocked;\r\n}\r\n\r\nexport let AudioUtils = {\r\n isPlaybackBlocked\r\n};", "import { AudioPlayer } from \"../audio_player.js\";\r\n\r\nexport class HowlerAudioPlayer extends AudioPlayer {\r\n\r\n constructor(howl, audioSetup = null) {\r\n super(audioSetup, howl);\r\n\r\n if (audioSetup == null) {\r\n this._myAudioSetup.myAudioFilePath = this._myAudio._src;\r\n\r\n this._myAudioSetup.myLoop = this._myAudio._loop;\r\n this._myAudioSetup.myAutoPlay = this._myAudio._autoplay;\r\n\r\n this._myAudioSetup.myVolume = this._myAudio._volume;\r\n this._myAudioSetup.myRate = this._myAudio._rate;\r\n\r\n this._myAudioSetup.myPool = this._myAudio._pool;\r\n this._myAudioSetup.myPreload = this._myAudio._preload;\r\n\r\n this._myAudioSetup.myPosition = (this._myAudio._pos != null) ? this._myAudio._pos.vec3_clone() : null;\r\n this._myAudioSetup.mySpatial = this._myAudio._pos != null;\r\n this._myAudioSetup.myReferenceDistance = this._myAudio._pannerAttr.refDistance;\r\n } else {\r\n this._myAudioSetup.myAudioFilePath = this._myAudio._src;\r\n\r\n this._myAudio.loop(this._myAudioSetup.myLoop);\r\n this._myAudio._autoplay = this._myAudioSetup.myAutoPlay;\r\n\r\n this._myAudio.volume(this._myAudioSetup.myVolume);\r\n this._myAudio.rate(this._myAudioSetup.myRate);\r\n\r\n this._myAudio._pool = this._myAudioSetup.myPool;\r\n this._myAudio._preload = this._myAudioSetup.myPreload;\r\n\r\n this.updatePosition(this._myAudioSetup.myPosition);\r\n\r\n this._myAudio._pannerAttr.refDistance = this._myAudioSetup.myReferenceDistance;\r\n\r\n if (this._myAudioSetup.myAutoPlay) {\r\n this._myAudio.play();\r\n }\r\n }\r\n\r\n this._addListeners();\r\n }\r\n}", "import { Component } from \"@wonderlandengine/api\";\r\nimport { Howler } from \"howler\";\r\n\r\nexport class MuteEverythingComponent extends Component {\r\n static TypeName = \"pp-mute-everything\";\r\n\r\n start() {\r\n Howler.mute(true);\r\n }\r\n}", "import { Component } from \"@wonderlandengine/api\";\r\nimport { Howler } from \"howler\";\r\nimport { vec3_create } from \"../../plugin/js/extensions/array/vec_create_extension.js\";\r\n\r\nexport class SpatialAudioListenerComponent extends Component {\r\n static TypeName = \"pp-spatial-audio-listener\";\r\n\r\n init() {\r\n this._myOrigin = vec3_create();\r\n this._myForward = vec3_create();\r\n this._myUp = vec3_create();\r\n }\r\n\r\n start() {\r\n this._updateAudioListener();\r\n }\r\n\r\n update(dt) {\r\n this._updateAudioListener();\r\n }\r\n\r\n _updateAudioListener() {\r\n this.object.pp_getPosition(this._myOrigin);\r\n this.object.pp_getForward(this._myForward);\r\n this.object.pp_getUp(this._myUp);\r\n\r\n Howler.pos(this._myOrigin[0], this._myOrigin[1], this._myOrigin[2]);\r\n Howler.orientation(this._myForward[0], this._myForward[1], this._myForward[2],\r\n this._myUp[0], this._myUp[1], this._myUp[2]);\r\n }\r\n}", "import { Component, PhysXComponent, Property, Shape } from \"@wonderlandengine/api\";\r\nimport { vec3_create } from \"../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Globals } from \"../../pp/globals.js\";\r\nimport { Timer } from \"../cauldron/timer.js\";\r\nimport { PhysicsCollisionCollector } from \"../physics/physics_collision_collector.js\";\r\nimport { RaycastParams, RaycastResults } from \"../physics/physics_raycast_params.js\";\r\nimport { PhysicsUtils } from \"../physics/physics_utils.js\";\r\n\r\n// Adjust the gravity to a low value like -0.05 to have better results, since the dynamic objects will move slowly instead of quickly falling far away\r\nexport class BenchmarkMaxPhysXComponent extends Component {\r\n static TypeName = \"pp-benchmark-max-physx\";\r\n static Properties = {\r\n _myStaticDomeSize: Property.float(40),\r\n _myStaticPhysXCount: Property.int(1000),\r\n _myDynamicDomeSize: Property.float(80),\r\n _myDynamicPhysXCount: Property.int(250),\r\n _myKinematicDomeSize: Property.float(120),\r\n _myKinematicPhysXCount: Property.int(250),\r\n _myRaycastCount: Property.int(100),\r\n _myVisualizeRaycast: Property.bool(false),\r\n _myVisualizeRaycastDelay: Property.float(0.5),\r\n\r\n // You can use this to test with convex mesh, \r\n // but u first need to add a physx with a convex mesh to the scene and read the shapeData index on the component to set it as _myShapeIndex\r\n _myUseConvexMesh: Property.bool(false),\r\n _myShapeIndex: Property.int(0),\r\n _myShapeScaleMultiplier: Property.float(1), // Used to adjust the scale of the convex mesh if too big or small based on how u imported it\r\n\r\n _myLogEnabled: Property.bool(true),\r\n _myClearConsoleBeforeLog: Property.bool(true)\r\n };\r\n\r\n start() {\r\n this._myActive = false;\r\n\r\n if (Globals.isDebugEnabled(this.engine)) {\r\n this._myActive = true;\r\n }\r\n\r\n this._myStarted = false;\r\n this._myPreStartTimer = new Timer(1);\r\n }\r\n\r\n _start() {\r\n this._myParentObject = this.object.pp_addChild();\r\n\r\n this._myRaycastParams = new RaycastParams(Globals.getPhysics(this.engine));\r\n this._myRaycastResults = new RaycastResults();\r\n\r\n this._myStaticPhysXObjects = [];\r\n this._myStaticPhysXComponents = [];\r\n this._myStaticPhysXCollectors = [];\r\n this._myDynamicPhysXObjects = [];\r\n this._myDynamicPhysXComponents = [];\r\n this._myDynamicPhysXCollectors = [];\r\n this._myKinematicPhysXObjects = [];\r\n this._myKinematicPhysXComponents = [];\r\n this._myKinematicPhysXCollectors = [];\r\n\r\n this._spawnDome(true, false);\r\n this._spawnDome(false, false);\r\n this._spawnDome(false, true);\r\n\r\n this._myStartTimer = new Timer(1);\r\n this._myTimer = new Timer(0);\r\n this._myDebugTimer = new Timer(this._myVisualizeRaycastDelay);\r\n this._myLogEnabledTimer = new Timer(1);\r\n this._myFPSHistory = [];\r\n for (let i = 0; i < 7; i++) {\r\n this._myFPSHistory.push(0);\r\n }\r\n\r\n this._myAddVelocityDelay = 10;\r\n\r\n this._myTranslateVec3 = vec3_create();\r\n this._myRotateVec3 = vec3_create();\r\n\r\n this._myStarted = true;\r\n }\r\n\r\n update(dt) {\r\n if (!this._myActive || !Globals.isDebugEnabled(this.engine)) return;\r\n\r\n if (!this._myStarted) {\r\n this._myPreStartTimer.update(dt);\r\n if (this._myPreStartTimer.isDone()) {\r\n this._start();\r\n }\r\n } else {\r\n this._myStartTimer.update(dt);\r\n if (this._myStartTimer.isDone()) {\r\n this._myTimer.update(dt);\r\n this._myDebugTimer.update(dt);\r\n this._myLogEnabledTimer.update(dt);\r\n if (this._myTimer.isDone()) {\r\n this._myTimer.start();\r\n\r\n let debugEnabled = false;\r\n if (this._myDebugTimer.isDone()) {\r\n this._myDebugTimer.start();\r\n debugEnabled = true;\r\n }\r\n\r\n debugEnabled = debugEnabled && this._myVisualizeRaycast;\r\n this._raycastTest(debugEnabled);\r\n }\r\n\r\n this._myFPSHistory.pop();\r\n this._myFPSHistory.unshift(Math.round(1 / dt));\r\n\r\n if (this._myLogEnabled) {\r\n if (this._myLogEnabledTimer.isDone()) {\r\n this._myLogEnabledTimer.start();\r\n if (this._myClearConsoleBeforeLog) {\r\n console.clear();\r\n }\r\n console.log(\"Static PhysX Dome Size:\", this._myStaticPhysXObjects.length);\r\n console.log(\"Dynamic PhysX Dome Size:\", this._myDynamicPhysXObjects.length);\r\n console.log(\"Kinematic PhysX Dome Size:\", this._myKinematicPhysXObjects.length);\r\n\r\n let staticCollisions = 0;\r\n for (let collector of this._myStaticPhysXCollectors) {\r\n staticCollisions += collector.getCollisions().length;\r\n }\r\n\r\n let dynamicCollisions = 0;\r\n for (let collector of this._myDynamicPhysXCollectors) {\r\n dynamicCollisions += collector.getCollisions().length;\r\n }\r\n\r\n let kinematicCollisions = 0;\r\n for (let collector of this._myKinematicPhysXCollectors) {\r\n kinematicCollisions += collector.getCollisions().length;\r\n }\r\n\r\n // Every collision is considered twice since it is caught by 2 physX\r\n let totalCollisions = (staticCollisions + dynamicCollisions + kinematicCollisions) / 2;\r\n\r\n console.log(\"Current Collisions Count:\", totalCollisions);\r\n console.log(\"Raycast Count:\", this._myRaycastCount);\r\n console.log(\"FPS History:\");\r\n let fpsString = \"\";\r\n for (let fps of this._myFPSHistory) {\r\n fpsString = fpsString.concat(fps, \"\\n\");\r\n }\r\n console.log(fpsString);\r\n }\r\n }\r\n }\r\n\r\n if (this._myAddVelocityDelay > 0) {\r\n this._myAddVelocityDelay--;\r\n if (this._myAddVelocityDelay == 0) {\r\n for (let physX of this._myDynamicPhysXComponents) {\r\n physX.kinematic = false;\r\n let strength = 50;\r\n physX.linearVelocity = [Math.pp_random(-strength, strength), Math.pp_random(-strength, strength), Math.pp_random(-strength, strength)];\r\n physX.angularVelocity = [Math.pp_random(-strength, strength), Math.pp_random(-strength, strength), Math.pp_random(-strength, strength)];\r\n }\r\n }\r\n }\r\n\r\n for (let physX of this._myKinematicPhysXObjects) {\r\n let strength = 5 * dt;\r\n this._myTranslateVec3.vec3_set(Math.pp_random(-strength, strength), Math.pp_random(-strength, strength), Math.pp_random(-strength, strength));\r\n physX.pp_translate(this._myTranslateVec3);\r\n\r\n let rotateStrength = 50 * dt;\r\n this._myRotateVec3.vec3_set(Math.pp_random(-rotateStrength, rotateStrength), Math.pp_random(-rotateStrength, rotateStrength), Math.pp_random(-rotateStrength, rotateStrength));\r\n physX.pp_rotate(this._myRotateVec3);\r\n }\r\n }\r\n }\r\n\r\n _raycastTest(debugEnabled) {\r\n let raycastCount = this._myRaycastCount;\r\n\r\n let distance = 10000;\r\n\r\n for (let i = 0; i < raycastCount; i++) {\r\n let origin = [Math.pp_random(1, 2) * Math.pp_randomSign(), Math.pp_random(1, 2) * Math.pp_randomSign(), Math.pp_random(1, 2) * Math.pp_randomSign()];\r\n let direction = [Math.pp_random(-1, 1), Math.pp_random(-1, 1), Math.pp_random(-1, 1)];\r\n direction.vec3_normalize(direction);\r\n\r\n this._myRaycastParams.myOrigin.vec3_copy(origin);\r\n this._myRaycastParams.myDirection.vec3_copy(direction);\r\n this._myRaycastParams.myDistance = distance;\r\n this._myRaycastParams.myBlockLayerFlags.setAllFlagsActive();\r\n\r\n let raycastResults = PhysicsUtils.raycast(this._myRaycastParams, this._myRaycastResults);\r\n\r\n if (debugEnabled && Globals.isDebugEnabled(this.engine)) {\r\n Globals.getDebugVisualManager(this.engine).drawRaycast(this._myDebugTimer.getDuration(), raycastResults, true, 5, 0.015);\r\n }\r\n }\r\n }\r\n\r\n _spawnDome(staticDome, dynamicDome) {\r\n let maxCount = this._myStaticPhysXCount;\r\n let physXList = this._myStaticPhysXObjects;\r\n let cloves = Math.ceil(Math.sqrt(this._myStaticPhysXCount));\r\n if (!staticDome) {\r\n if (dynamicDome) {\r\n cloves = Math.ceil(Math.sqrt(this._myDynamicPhysXCount));\r\n maxCount = this._myDynamicPhysXCount;\r\n physXList = this._myDynamicPhysXObjects;\r\n } else {\r\n cloves = Math.ceil(Math.sqrt(this._myKinematicPhysXCount));\r\n maxCount = this._myKinematicPhysXCount;\r\n physXList = this._myKinematicPhysXObjects;\r\n }\r\n }\r\n\r\n let angleForClove = Math.PI * 2 / cloves;\r\n\r\n let minDistance = Math.max(0, this._myStaticDomeSize - 20);\r\n let maxDistance = this._myStaticDomeSize + 20;\r\n\r\n if (!staticDome) {\r\n if (dynamicDome) {\r\n minDistance = Math.max(0, this._myDynamicDomeSize - 20);\r\n maxDistance = this._myDynamicDomeSize + 20;\r\n } else {\r\n minDistance = Math.max(0, this._myKinematicDomeSize - 20);\r\n maxDistance = this._myKinematicDomeSize + 20;\r\n }\r\n }\r\n\r\n let minExtraRotation = 0;\r\n let maxExtraRotation = Math.pp_toRadians(10);\r\n\r\n let upDirection = vec3_create(0, 1, 0);\r\n let horizontalDirection = vec3_create(0, 0, -1);\r\n\r\n for (let i = 0; i < cloves / 2; i++) {\r\n let verticalDirection = vec3_create(0, 1, 0);\r\n\r\n let rotationAxis = vec3_create();\r\n horizontalDirection.vec3_cross(verticalDirection, rotationAxis);\r\n rotationAxis.vec3_normalize(rotationAxis);\r\n\r\n for (let j = 0; j < cloves; j++) {\r\n if (physXList.length < maxCount) {\r\n let distance = Math.random() * (maxDistance - minDistance) + minDistance;\r\n let extraAxisRotation = (Math.random() * 2 - 1) * (maxExtraRotation - minExtraRotation) + minExtraRotation;\r\n let extraUpRotation = (Math.random() * 2 - 1) * (maxExtraRotation - minExtraRotation) + minExtraRotation;\r\n let physXDirection = verticalDirection.pp_clone();\r\n\r\n physXDirection.vec3_rotateAxisRadians(extraAxisRotation, rotationAxis, physXDirection);\r\n physXDirection.vec3_rotateAxisRadians(extraUpRotation, upDirection, physXDirection);\r\n\r\n physXDirection.vec3_scale(distance, physXDirection);\r\n\r\n this._addPhysX(physXDirection, staticDome, dynamicDome);\r\n }\r\n\r\n verticalDirection.vec3_rotateAxisRadians(angleForClove / 2, rotationAxis, verticalDirection);\r\n\r\n if (physXList.length < maxCount) {\r\n let distance = Math.random() * (maxDistance - minDistance) + minDistance;\r\n let extraAxisRotation = (Math.random() * 2 - 1) * (maxExtraRotation - minExtraRotation) + minExtraRotation;\r\n let extraUpRotation = (Math.random() * 2 - 1) * (maxExtraRotation - minExtraRotation) + minExtraRotation;\r\n let physXDirection = verticalDirection.pp_clone();\r\n\r\n physXDirection.vec3_rotateAxisRadians(extraAxisRotation, rotationAxis, physXDirection);\r\n physXDirection.vec3_rotateAxisRadians(extraUpRotation, upDirection, physXDirection);\r\n\r\n physXDirection.vec3_scale(distance, physXDirection);\r\n\r\n this._addPhysX(physXDirection, staticDome, dynamicDome);\r\n }\r\n\r\n verticalDirection.vec3_rotateAxisRadians(angleForClove / 2, rotationAxis, verticalDirection);\r\n\r\n }\r\n\r\n horizontalDirection.vec3_rotateAxisRadians(angleForClove, upDirection, horizontalDirection);\r\n }\r\n }\r\n\r\n _addPhysX(physXDirection, staticDome, dynamicDome) {\r\n let position = physXDirection;\r\n let scale = Math.pp_random(1, 10);\r\n let shape = Math.pp_randomPick(Shape.Sphere, Shape.Box);\r\n if (this._myUseConvexMesh) {\r\n shape = Shape.ConvexMesh;\r\n scale *= this._myShapeScaleMultiplier;\r\n }\r\n\r\n let physX = this._myParentObject.pp_addChild();\r\n physX.pp_setPosition(position);\r\n\r\n let physXComponent = physX.pp_addComponent(PhysXComponent, {\r\n \"shape\": shape,\r\n \"shapeData\": { index: this._myShapeIndex },\r\n \"extents\": vec3_create(scale, scale, scale),\r\n \"static\": staticDome,\r\n \"kinematic\": !dynamicDome,\r\n \"mass\": 1\r\n });\r\n\r\n if (staticDome) {\r\n this._myStaticPhysXObjects.push(physX);\r\n this._myStaticPhysXComponents.push(physXComponent);\r\n this._myStaticPhysXCollectors.push(new PhysicsCollisionCollector(physXComponent));\r\n } else if (dynamicDome) {\r\n this._myDynamicPhysXObjects.push(physX);\r\n this._myDynamicPhysXComponents.push(physXComponent);\r\n this._myDynamicPhysXCollectors.push(new PhysicsCollisionCollector(physXComponent));\r\n } else {\r\n this._myKinematicPhysXObjects.push(physX);\r\n this._myKinematicPhysXComponents.push(physXComponent);\r\n this._myKinematicPhysXCollectors.push(new PhysicsCollisionCollector(physXComponent));\r\n }\r\n }\r\n\r\n onActivate() {\r\n if (this._myStaticPhysXCollectors != null) {\r\n for (let collector of this._myStaticPhysXCollectors) {\r\n collector.setActive(true);\r\n }\r\n }\r\n\r\n if (this._myDynamicPhysXCollectors != null) {\r\n for (let collector of this._myDynamicPhysXCollectors) {\r\n collector.setActive(true);\r\n }\r\n }\r\n\r\n if (this._myKinematicPhysXCollectors != null) {\r\n for (let collector of this._myKinematicPhysXCollectors) {\r\n collector.setActive(true);\r\n }\r\n }\r\n }\r\n\r\n onDeactivate() {\r\n if (this._myStaticPhysXCollectors != null) {\r\n for (let collector of this._myStaticPhysXCollectors) {\r\n collector.setActive(false);\r\n }\r\n }\r\n\r\n if (this._myDynamicPhysXCollectors != null) {\r\n for (let collector of this._myDynamicPhysXCollectors) {\r\n collector.setActive(false);\r\n }\r\n }\r\n\r\n if (this._myKinematicPhysXCollectors != null) {\r\n for (let collector of this._myKinematicPhysXCollectors) {\r\n collector.setActive(false);\r\n }\r\n }\r\n }\r\n\r\n onDestroy() {\r\n if (this._myStaticPhysXCollectors != null) {\r\n for (let collector of this._myStaticPhysXCollectors) {\r\n collector.destroy();\r\n }\r\n }\r\n\r\n if (this._myDynamicPhysXCollectors != null) {\r\n for (let collector of this._myDynamicPhysXCollectors) {\r\n collector.destroy();\r\n }\r\n }\r\n\r\n if (this._myKinematicPhysXCollectors != null) {\r\n for (let collector of this._myKinematicPhysXCollectors) {\r\n collector.destroy();\r\n }\r\n }\r\n }\r\n}", "import { CollisionEventType, Emitter, Object3D, PhysXComponent } from \"@wonderlandengine/api\";\r\nimport { Timer } from \"../cauldron/timer.js\";\r\n\r\nexport class PhysicsCollisionCollector {\r\n\r\n private readonly _myPhysXComponent: PhysXComponent;\r\n\r\n private _myActive: boolean = false;\r\n\r\n private _myCollisionCallbackID: number | null = null;\r\n\r\n private _myCollisionEmitter: Emitter<[PhysXComponent, PhysXComponent, CollisionEventType]> = new Emitter();\r\n private _myCollisionStartEmitter: Emitter<[PhysXComponent, PhysXComponent, CollisionEventType]> = new Emitter();\r\n private _myCollisionEndEmitter: Emitter<[PhysXComponent, PhysXComponent, CollisionEventType]> = new Emitter();\r\n\r\n private readonly _myCollisions: PhysXComponent[] = [];\r\n private _myCollisionsStarted: PhysXComponent[] = [];\r\n private _myCollisionsEnded: PhysXComponent[] = [];\r\n private _myCollisionsStartedToProcess: PhysXComponent[] = [];\r\n private _myCollisionsEndedToProcess: PhysXComponent[] = [];\r\n\r\n // This separation is needed so it's possible to return the physx component list without having to build it every time\r\n // Beside, this is only needed due to trigger not detecting a collision end if the physX component they are colliding with goes inactive or is destroyed\r\n private readonly _myCollisionObjects: Object3D[] = [];\r\n private _myCollisionObjectsStarted: Object3D[] = [];\r\n private _myCollisionObjectsEnded: Object3D[] = [];\r\n private _myCollisionObjectsStartedToProcess: Object3D[] = [];\r\n private _myCollisionObjectsEndedToProcess: Object3D[] = [];\r\n\r\n private _myUpdateActive: boolean = false;\r\n private _myCollisionStartEndProcessingActive: boolean = true;\r\n\r\n private readonly _myTriggerDesyncFixDelay: Timer = new Timer(0.1);\r\n\r\n private _myLogEnabled: boolean = false;\r\n\r\n private _myDestroyed: boolean = false;\r\n\r\n constructor(physXComponent: PhysXComponent) {\r\n this._myPhysXComponent = physXComponent;\r\n\r\n this.setActive(true);\r\n }\r\n\r\n public getPhysXComponent(): PhysXComponent {\r\n return this._myPhysXComponent;\r\n }\r\n\r\n public getCollisions(): Readonly {\r\n return this._myCollisions;\r\n }\r\n\r\n public getCollisionsStarted(): Readonly {\r\n return this._myCollisionsStarted;\r\n }\r\n\r\n public getCollisionsEnded(): Readonly {\r\n return this._myCollisionsEnded;\r\n }\r\n\r\n public isActive(): boolean {\r\n return this._myActive;\r\n }\r\n\r\n public setActive(active: boolean): void {\r\n if (this._myActive != active) {\r\n this._myActive = active;\r\n\r\n this._myCollisions.pp_clear();\r\n this._myCollisionObjects.pp_clear();\r\n\r\n this._myCollisionsStarted.pp_clear();\r\n this._myCollisionObjectsStarted.pp_clear();\r\n this._myCollisionsEnded.pp_clear();\r\n this._myCollisionObjectsEnded.pp_clear();\r\n\r\n this._myCollisionsStartedToProcess.pp_clear();\r\n this._myCollisionObjectsStartedToProcess.pp_clear();\r\n this._myCollisionsEndedToProcess.pp_clear();\r\n this._myCollisionObjectsEndedToProcess.pp_clear();\r\n\r\n if (this._myActive) {\r\n this._myCollisionCallbackID = this._myPhysXComponent.onCollision(this._onCollision.bind(this));\r\n } else if (this._myCollisionCallbackID != null && !this._myPhysXComponent.isDestroyed) {\r\n this._myPhysXComponent.removeCollisionCallback(this._myCollisionCallbackID);\r\n this._myCollisionCallbackID = null;\r\n }\r\n }\r\n }\r\n\r\n /** `update` is not mandatory, use it only if u want to access collisions start and end or if the phsyX is a trigger */\r\n public update(dt: number): void {\r\n if (!this._myActive) {\r\n return;\r\n }\r\n\r\n this._myUpdateActive = true;\r\n\r\n if (this._myCollisionStartEndProcessingActive) {\r\n const prevCollisionsStartToProcess = this._myCollisionsStartedToProcess;\r\n this._myCollisionsStartedToProcess = this._myCollisionsStarted;\r\n this._myCollisionsStartedToProcess.pp_clear();\r\n this._myCollisionsStarted = prevCollisionsStartToProcess;\r\n\r\n const prevCollisionObjectsStartToProcess = this._myCollisionObjectsStartedToProcess;\r\n this._myCollisionObjectsStartedToProcess = this._myCollisionObjectsStarted;\r\n this._myCollisionObjectsStartedToProcess.pp_clear();\r\n this._myCollisionObjectsStarted = prevCollisionObjectsStartToProcess;\r\n\r\n const prevCollisionsEndToProcess = this._myCollisionsEndedToProcess;\r\n this._myCollisionsEndedToProcess = this._myCollisionsEnded;\r\n this._myCollisionsEndedToProcess.pp_clear();\r\n this._myCollisionsEnded = prevCollisionsEndToProcess;\r\n\r\n const prevCollisionObjectsEndToProcess = this._myCollisionObjectsEndedToProcess;\r\n this._myCollisionObjectsEndedToProcess = this._myCollisionObjectsEnded;\r\n this._myCollisionObjectsEndedToProcess.pp_clear();\r\n this._myCollisionObjectsEnded = prevCollisionObjectsEndToProcess;\r\n }\r\n\r\n if (this._myPhysXComponent.trigger) {\r\n this._triggerDesyncFix(dt);\r\n }\r\n }\r\n\r\n /** Set to `true` only if u are going to actually update this object and don't want to \r\n lose any collision start or end events prior to updating the first time after activation, \r\n since on update this flag is automatically set to `true` */\r\n public setUpdateActive(active: boolean): void {\r\n this._myUpdateActive = active;\r\n }\r\n\r\n /** If this is set to `false` you won't be able to get the collision that just started or ended, but just the current colliding ones \r\n Keep in mind that you also need to update the collector for this to work */\r\n public setCollisionStartEndProcessingActive(active: boolean): void {\r\n this._myCollisionStartEndProcessingActive = active;\r\n }\r\n\r\n public isLogEnabled(): boolean {\r\n return this._myLogEnabled;\r\n }\r\n\r\n public setLogEnabled(enabled: boolean): void {\r\n this._myLogEnabled = enabled;\r\n }\r\n\r\n public registerCollisionEventListener(id: unknown, listener: (currentPhysX: PhysXComponent, otherPhysX: PhysXComponent, collisionType: CollisionEventType) => void): void {\r\n this._myCollisionEmitter.add(listener, { id: id });\r\n }\r\n\r\n public unregisterCollisionEventListener(id: unknown): void {\r\n this._myCollisionEmitter.remove(id);\r\n }\r\n\r\n public registerCollisionStartEventListener(id: unknown, listener: (currentPhysX: PhysXComponent, otherPhysX: PhysXComponent, collisionType: CollisionEventType) => void): void {\r\n this._myCollisionStartEmitter.add(listener, { id: id });\r\n }\r\n\r\n public unregisterCollisionStartEventListener(id: unknown): void {\r\n this._myCollisionStartEmitter.remove(id);\r\n }\r\n\r\n public registerCollisionEndEventListener(id: unknown, listener: (currentPhysX: PhysXComponent, otherPhysX: PhysXComponent, collisionType: CollisionEventType) => void): void {\r\n this._myCollisionEndEmitter.add(listener, { id: id });\r\n }\r\n\r\n public unregisterCollisionEndEventListener(id: unknown): void {\r\n this._myCollisionEndEmitter.remove(id);\r\n }\r\n\r\n private _onCollision(type: CollisionEventType, physXComponent: PhysXComponent): void {\r\n let collisionValid = this._areLayerFlagsMatching(physXComponent);\r\n\r\n if (collisionValid) {\r\n if (type == CollisionEventType.Touch || type == CollisionEventType.TriggerTouch) {\r\n collisionValid = this._onCollisionStart(type, physXComponent);\r\n } else if (type == CollisionEventType.TouchLost || type == CollisionEventType.TriggerTouchLost) {\r\n collisionValid = this._onCollisionEnd(type, physXComponent, physXComponent.object);\r\n }\r\n\r\n if (collisionValid) {\r\n this._myCollisionEmitter.notify(this._myPhysXComponent, physXComponent, type);\r\n }\r\n }\r\n }\r\n\r\n private _onCollisionStart(type: CollisionEventType, physXComponent: PhysXComponent): boolean {\r\n let componentFound = false;\r\n for (const physXComponentToCheck of this._myCollisions) {\r\n if (physXComponentToCheck == physXComponent) {\r\n componentFound = true;\r\n break;\r\n }\r\n }\r\n\r\n if (this._myLogEnabled && componentFound) {\r\n console.error(\"Collision Start on PhysX component already collected\");\r\n }\r\n\r\n if (!componentFound) {\r\n this._myCollisions.push(physXComponent);\r\n this._myCollisionObjects.push(physXComponent.object);\r\n\r\n if (this._myUpdateActive && this._myCollisionStartEndProcessingActive) {\r\n this._myCollisionsStartedToProcess.push(physXComponent);\r\n this._myCollisionObjectsStartedToProcess.push(physXComponent.object);\r\n\r\n const indexesToRemove = this._myCollisionsEndedToProcess.pp_findAllIndexes(function (physXComponentToCheck: PhysXComponent) {\r\n return physXComponentToCheck == physXComponent;\r\n });\r\n\r\n for (let i = indexesToRemove.length - 1; i >= 0; i--) {\r\n this._myCollisionsEndedToProcess.pp_removeIndex(indexesToRemove[i]);\r\n this._myCollisionObjectsEndedToProcess.pp_removeIndex(indexesToRemove[i]);\r\n }\r\n }\r\n\r\n if (this._myLogEnabled) {\r\n console.log(\"Collision Start - Object ID: \" + physXComponent.object.pp_getID());\r\n }\r\n\r\n this._myCollisionStartEmitter.notify(this._myPhysXComponent, physXComponent, type);\r\n\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n\r\n private _onCollisionEnd(type: CollisionEventType, physXComponent: PhysXComponent, physXObject: Object3D): boolean {\r\n let componentFound = false;\r\n for (const physXComponentToCheck of this._myCollisions) {\r\n if (physXComponentToCheck == physXComponent) {\r\n componentFound = true;\r\n break;\r\n }\r\n }\r\n\r\n if (this._myLogEnabled && !componentFound) {\r\n console.error(\"Collision End on physX component not collected - Object ID: \" + physXObject.pp_getID());\r\n }\r\n\r\n if (componentFound) {\r\n const indexesToRemove = this._myCollisions.pp_findAllIndexes(function (physXComponentToCheck: PhysXComponent) {\r\n return physXComponentToCheck == physXComponent;\r\n });\r\n\r\n for (let i = indexesToRemove.length - 1; i >= 0; i--) {\r\n this._myCollisions.pp_removeIndex(indexesToRemove[i]);\r\n this._myCollisionObjects.pp_removeIndex(indexesToRemove[i]);\r\n }\r\n\r\n if (this._myUpdateActive && this._myCollisionStartEndProcessingActive) {\r\n this._myCollisionsEndedToProcess.push(physXComponent);\r\n this._myCollisionObjectsEndedToProcess.push(physXObject);\r\n\r\n const indexesToRemove = this._myCollisionsStartedToProcess.pp_findAllIndexes(function (physXComponentToCheck: PhysXComponent) {\r\n return physXComponentToCheck == physXComponent;\r\n });\r\n\r\n for (let i = indexesToRemove.length - 1; i >= 0; i--) {\r\n this._myCollisionsStartedToProcess.pp_removeIndex(indexesToRemove[i]);\r\n this._myCollisionObjectsStartedToProcess.pp_removeIndex(indexesToRemove[i]);\r\n }\r\n }\r\n\r\n if (this._myLogEnabled) {\r\n console.log(\"Collision End - Object ID: \" + physXObject.pp_getID());\r\n }\r\n\r\n this._myCollisionEndEmitter.notify(this._myPhysXComponent, physXComponent, type);\r\n\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n\r\n private _areLayerFlagsMatching(physXComponent: PhysXComponent): boolean {\r\n if (!this._myPhysXComponent.trigger) {\r\n return true;\r\n }\r\n\r\n return (this._myPhysXComponent.groupsMask & physXComponent.groupsMask) > 0;\r\n }\r\n\r\n private static readonly _triggerDesyncFixSV =\r\n {\r\n findAllCallback(object: Readonly) {\r\n const physXComponent = object.pp_getComponentSelf(PhysXComponent);\r\n return physXComponent == null || !physXComponent.active;\r\n }\r\n };\r\n private _triggerDesyncFix(dt: number): void {\r\n this._myTriggerDesyncFixDelay.update(dt);\r\n if (this._myTriggerDesyncFixDelay.isDone()) {\r\n this._myTriggerDesyncFixDelay.start();\r\n\r\n if (this._myCollisionObjects.length > 0) {\r\n const findAllCallback = PhysicsCollisionCollector._triggerDesyncFixSV.findAllCallback;\r\n let collisionsToEndIndexes = null;\r\n\r\n if (!this._myPhysXComponent.active) {\r\n collisionsToEndIndexes = [];\r\n for (let i = 0; i < this._myCollisionObjects.length; i++) {\r\n collisionsToEndIndexes.push(i);\r\n }\r\n } else {\r\n collisionsToEndIndexes = this._myCollisionObjects.pp_findAllIndexes(findAllCallback);\r\n }\r\n\r\n if (collisionsToEndIndexes.length > 0) {\r\n const physXComponentsToEnd: [Object3D, PhysXComponent][] = [];\r\n for (let i = 0; i < collisionsToEndIndexes.length; i++) {\r\n physXComponentsToEnd.push([this._myCollisionObjects[collisionsToEndIndexes[i]], this._myCollisions[collisionsToEndIndexes[i]]]);\r\n }\r\n\r\n for (const physXComponentToEnd of physXComponentsToEnd) {\r\n if (this._myLogEnabled) {\r\n console.log(\"Trigger Desync Fix - Object ID: \" + physXComponentToEnd[0].pp_getID());\r\n }\r\n\r\n if (this._onCollisionEnd(CollisionEventType.TriggerTouchLost, physXComponentToEnd[1], physXComponentToEnd[0])) {\r\n this._myCollisionEmitter.notify(this._myPhysXComponent, physXComponentToEnd[1], CollisionEventType.TriggerTouchLost);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n public destroy(): void {\r\n this._myDestroyed = true;\r\n\r\n this.setActive(false);\r\n }\r\n\r\n public isDestroyed(): boolean {\r\n return this._myDestroyed;\r\n }\r\n}", "import { Alignment, Component, MeshComponent, Property, TextComponent, VerticalAlignment } from \"@wonderlandengine/api\";\r\nimport { vec2_create, vec3_create, vec4_create } from \"../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Globals } from \"../../pp/globals.js\";\r\nimport { Timer } from \"../cauldron/timer.js\";\r\nimport { ObjectPool, ObjectPoolParams } from \"../object_pool/object_pool.js\";\r\nimport { XRUtils } from \"../utils/xr_utils.js\";\r\nimport { MeshCreationParams, MeshCreationTriangleParams, MeshCreationVertexParams, MeshUtils } from \"../wl/utils/mesh_utils.js\";\r\nimport { ObjectCloneParams } from \"../wl/utils/object_utils.js\";\r\n\r\nexport class BenchmarkMaxVisibleTrianglesComponent extends Component {\r\n static TypeName = \"pp-benchmark-max-visible-triangles\";\r\n static Properties = {\r\n _myTargetFrameRate: Property.int(-1), // -1 means it will auto detect it at start\r\n _myTargetFrameRateThreshold: Property.int(3),\r\n _myStartPlaneCount: Property.int(1),\r\n _myPlaneTriangles: Property.int(100),\r\n _mySecondsBeforeDoubling: Property.float(0.5), // Higher gives a better frame rate evaluation\r\n _myDTHistoryToIgnorePercentage: Property.float(0.25),\r\n _myCloneMaterial: Property.bool(false),\r\n _myCloneMesh: Property.bool(false),\r\n\r\n _myLogEnabled: Property.bool(true),\r\n\r\n _myStartOnXRStart: Property.bool(false),\r\n _myDisplayInFrontOfPlayer: Property.bool(true),\r\n _myDisplayInFrontOfPlayerDistance: Property.float(10),\r\n\r\n _myPlaneMaterial: Property.material(),\r\n _myBackgroundMaterial: Property.material(),\r\n _myTextMaterial: Property.material(null)\r\n };\r\n\r\n _start() {\r\n if (this._myPlaneMaterial == null) {\r\n this._myPlaneMaterial = Globals.getDefaultMaterials(this.engine).myPhongOpaque.clone();\r\n this._myPlaneMaterial.diffuseColor = vec4_create(0.95, 0.95, 0.95, 1);\r\n this._myPlaneMaterial.ambientColor = vec4_create(0, 0, 0, 1);\r\n this._myPlaneMaterial.ambientFactor = 0.5;\r\n }\r\n\r\n if (this._myBackgroundMaterial == null) {\r\n this._myBackgroundMaterial = Globals.getDefaultMaterials(this.engine).myPhongOpaque.clone();\r\n this._myBackgroundMaterial.diffuseColor = vec4_create(0.25, 0.25, 0.25, 1);\r\n this._myBackgroundMaterial.ambientColor = vec4_create(0, 0, 0, 1);\r\n this._myBackgroundMaterial.ambientFactor = 0.5;\r\n }\r\n\r\n if (this._myTextMaterial == null) {\r\n this._myTextMaterial = Globals.getDefaultMaterials(this.engine).myText.clone();\r\n }\r\n\r\n this._myLagColor = vec4_create(0.6, 0, 0, 1);\r\n this._myNormalColor = vec4_create(0.25, 0.25, 0.25, 1);\r\n\r\n this._myRealTrianglesAmount = 0;\r\n\r\n let parent = this.object;\r\n if (this._myDisplayInFrontOfPlayer) {\r\n parent = Globals.getPlayerObjects(this.engine).myHead.pp_addChild();\r\n parent.pp_rotateAxis(180, vec3_create(0, 1, 0));\r\n parent.pp_translateLocal(vec3_create(0, 0, this._myDisplayInFrontOfPlayerDistance));\r\n }\r\n\r\n this._myTrianglesObject = parent.pp_addChild();\r\n\r\n this._myBackgroundObject = this._myTrianglesObject.pp_addChild();\r\n {\r\n let meshComponent = this._myBackgroundObject.pp_addComponent(MeshComponent);\r\n meshComponent.mesh = MeshUtils.createPlane(this.engine);\r\n meshComponent.material = this._myBackgroundMaterial.clone();\r\n }\r\n\r\n this._myPlaneObject = this._myTrianglesObject.pp_addChild();\r\n {\r\n let meshComponent = this._myPlaneObject.pp_addComponent(MeshComponent);\r\n meshComponent.mesh = this._createPlaneMesh(this._myPlaneTriangles);\r\n this._myRealTrianglesAmount = meshComponent.mesh.indexData.length / 3;\r\n meshComponent.material = this._myPlaneMaterial.clone();\r\n }\r\n\r\n let poolParams = new ObjectPoolParams();\r\n if (!this._myCloneMesh) {\r\n poolParams.myInitialPoolSize = 30000;\r\n } else {\r\n if (this._myRealTrianglesAmount <= 4) {\r\n poolParams.myInitialPoolSize = 15000;\r\n } else if (this._myRealTrianglesAmount <= 8) {\r\n poolParams.myInitialPoolSize = 10000;\r\n } else if (this._myRealTrianglesAmount <= 64) {\r\n poolParams.myInitialPoolSize = 7500;\r\n } else {\r\n poolParams.myInitialPoolSize = 5000;\r\n }\r\n }\r\n poolParams.myPercentageToAddWhenEmpty = 0;\r\n poolParams.myAmountToAddWhenEmpty = 10000;\r\n poolParams.myCloneParams = new ObjectCloneParams();\r\n poolParams.myCloneParams.myComponentDeepCloneParams.setDeepCloneComponentVariable(MeshComponent.TypeName, \"material\", this._myCloneMaterial);\r\n poolParams.myCloneParams.myComponentDeepCloneParams.setDeepCloneComponentVariable(MeshComponent.TypeName, \"mesh\", this._myCloneMesh);\r\n\r\n this._myPoolID = this.type + \"_\" + Math.pp_randomUUID();\r\n Globals.getObjectPoolManager(this.engine).addPool(this._myPoolID, new ObjectPool(this._myPlaneObject, poolParams));\r\n\r\n this._myBackgroundObject.pp_setActive(false);\r\n this._myPlaneObject.pp_setActive(false);\r\n\r\n this._myTextsObject = this._myTrianglesObject.pp_addChild();\r\n //this._myTextsObject.pp_addComponent(EasyTransformComponent);\r\n\r\n this._myTriangleTextObject = this._myTextsObject.pp_addChild();\r\n //this._myTriangleTextObject.pp_addComponent(EasyTransformComponent, { _myLocal: true });\r\n\r\n this._myTriangleTextComponent = this._myTriangleTextObject.pp_addComponent(TextComponent);\r\n\r\n this._myTriangleTextComponent.alignment = Alignment.Left;\r\n this._myTriangleTextComponent.verticalAlignment = VerticalAlignment.Line;\r\n this._myTriangleTextComponent.material = this._myTextMaterial.clone();\r\n this._myTriangleTextComponent.material.color = this._myNormalColor;\r\n this._myTriangleTextComponent.text = \" \";\r\n //this._myTriangleTextComponent.text = \"Triangles: 9999999\";\r\n\r\n this._myPlaneTextObject = this._myTextsObject.pp_addChild();\r\n\r\n this._myPlaneTextComponent = this._myPlaneTextObject.pp_addComponent(TextComponent);\r\n //this._myPlaneTextObject.pp_addComponent(EasyTransformComponent, { _myLocal: true });\r\n\r\n this._myPlaneTextComponent.alignment = Alignment.Left;\r\n this._myPlaneTextComponent.verticalAlignment = VerticalAlignment.Line;\r\n this._myPlaneTextComponent.material = this._myTextMaterial.clone();\r\n this._myPlaneTextComponent.material.color = this._myNormalColor;\r\n this._myPlaneTextComponent.text = \" \";\r\n //this._myPlaneTextComponent.text = \"Planes: 9999999\";\r\n\r\n this._myFPSTextObject = this._myTextsObject.pp_addChild();\r\n\r\n this._myFPSTextComponent = this._myFPSTextObject.pp_addComponent(TextComponent);\r\n //this._myFPSTextObject.pp_addComponent(EasyTransformComponent, { _myLocal: true });\r\n\r\n this._myFPSTextComponent.alignment = Alignment.Left;\r\n this._myFPSTextComponent.verticalAlignment = VerticalAlignment.Line;\r\n this._myFPSTextComponent.material = this._myTextMaterial.clone();\r\n this._myFPSTextComponent.material.color = this._myNormalColor;\r\n this._myFPSTextComponent.text = \" \";\r\n //this._myFPSTextComponent.text = \"FPS: 99.99\";\r\n\r\n this._myDoneTextObject = this._myTrianglesObject.pp_addChild();\r\n\r\n this._myDoneTextComponent = this._myDoneTextObject.pp_addComponent(TextComponent);\r\n //this._myDoneTextObject.pp_addComponent(EasyTransformComponent, { _myLocal: true });\r\n\r\n this._myDoneTextComponent.alignment = Alignment.Center;\r\n this._myDoneTextComponent.verticalAlignment = VerticalAlignment.Line;\r\n this._myDoneTextComponent.material = this._myTextMaterial.clone();\r\n this._myDoneTextComponent.material.color = this._myNormalColor;\r\n this._myDoneTextComponent.text = \" \";\r\n //this._myDoneTextComponent.text = \"End\";\r\n\r\n this._myTextsObject.pp_setPositionLocal(vec3_create(0, 4.3, 0));\r\n this._myTextsObject.pp_setScale(2.75);\r\n\r\n this._myTriangleTextObject.pp_setPositionLocal(vec3_create(-1.4, 0, 0));\r\n this._myPlaneTextObject.pp_setPositionLocal(vec3_create(0.55, 0, 0));\r\n this._myFPSTextObject.pp_setPositionLocal(vec3_create(-0.315, 0, 0));\r\n this._myDoneTextObject.pp_setPositionLocal(vec3_create(0, -4.6, 0));\r\n this._myDoneTextObject.pp_setScale(4);\r\n\r\n this._myBackgroundSize = 4;\r\n this._myBackgroundObject.pp_setActive(true);\r\n this._myBackgroundObject.pp_setScale(this._myBackgroundSize + 0.1);\r\n this._myBackgroundObject.pp_translateLocal(vec3_create(0, 0, -0.001));\r\n\r\n this._myDoubleTimer = new Timer(this._mySecondsBeforeDoubling);\r\n this._myDone = false;\r\n\r\n this._myCurrentPlanes = this._myStartPlaneCount;\r\n\r\n this._myDTHistory = [];\r\n\r\n this._myUpperLimit = -1;\r\n this._myLowerLimit = 0;\r\n\r\n this._myPlanes = [];\r\n this._mySkipNextFrames = 0;\r\n this._myMaxWaitFrames = 0;\r\n\r\n this._myMaxPlanesReached = false;\r\n\r\n this._myFirstTime = true;\r\n }\r\n\r\n _update(dt) {\r\n // Skip lag frames after the new set of plane has been shown, wait for it to be stable\r\n {\r\n if (dt < 0.00001) {\r\n return;\r\n }\r\n\r\n if (dt > 0.5 && this._myMaxWaitFrames > 0) {\r\n this._myMaxWaitFrames--;\r\n return;\r\n }\r\n\r\n this._myMaxWaitFrames = 10;\r\n\r\n if (this._mySkipNextFrames > 0) {\r\n this._mySkipNextFrames--;\r\n return;\r\n }\r\n }\r\n\r\n if (!this._myDone) {\r\n this._myDoubleTimer.update(dt);\r\n\r\n this._myDTHistory.push(dt);\r\n\r\n if (this._myDoubleTimer.isDone()) {\r\n this._myDoubleTimer.start();\r\n\r\n let frameRate = this._computeAverageFrameRate(false);\r\n\r\n if (this._myFirstTime) {\r\n this._myFirstTime = false;\r\n } else {\r\n\r\n // If there is not lag, the current plane count is a good lower limit, otherwise the current count is now a upper threshold, we have to search below it\r\n let lagging = false;\r\n if (frameRate < this._myStableFrameRate - this._myTargetFrameRateThreshold) {\r\n this._myUpperLimit = this._myCurrentPlanes;\r\n\r\n lagging = true;\r\n\r\n if (this._myUpperLimit == 1) {\r\n this._myLowerLimit = 1;\r\n }\r\n } else {\r\n this._myLowerLimit = this._myCurrentPlanes;\r\n if (this._myUpperLimit > 0) {\r\n this._myUpperLimit = Math.max(this._myUpperLimit, this._myLowerLimit);\r\n }\r\n }\r\n\r\n this._myTriangleTextComponent.text = \"Triangles: \" + this._myCurrentPlanes * this._myRealTrianglesAmount;\r\n this._myPlaneTextComponent.text = \"Planes: \" + this._myCurrentPlanes;\r\n this._myFPSTextComponent.text = \"FPS: \" + frameRate + \" / \" + this._myStableFrameRate;\r\n\r\n if (lagging) {\r\n this._myTriangleTextComponent.material.color = this._myLagColor;\r\n this._myPlaneTextComponent.material.color = this._myLagColor;\r\n this._myFPSTextComponent.material.color = this._myLagColor;\r\n } else {\r\n this._myTriangleTextComponent.material.color = this._myNormalColor;\r\n this._myPlaneTextComponent.material.color = this._myNormalColor;\r\n this._myFPSTextComponent.material.color = this._myNormalColor;\r\n }\r\n\r\n let reset = false;\r\n\r\n // Check if the binary search is completed\r\n if ((this._myUpperLimit > 0 &&\r\n (!lagging && (this._myUpperLimit - this._myLowerLimit) <= Math.max(2, 1000 / this._myRealTrianglesAmount)) ||\r\n (lagging && (this._myUpperLimit - this._myLowerLimit) <= 1)) ||\r\n (!lagging && this._myMaxPlanesReached)) {\r\n if (frameRate < this._myStableFrameRate - this._myTargetFrameRateThreshold) {\r\n // Going a bit back with the binary search, maybe the lower limit was not lower after all cause of a bad assumption of average FPS\r\n this._myLowerLimit = Math.max(1, Math.floor(this._myUpperLimit / 2.5));\r\n this._myUpperLimit = 0;\r\n reset = true;\r\n\r\n if (this._myLogEnabled) {\r\n // Reset\r\n console.log(\"Rst - Triangles:\", this._myCurrentPlanes * this._myRealTrianglesAmount, \"- Planes:\", this._myCurrentPlanes, \"- Frame Rate:\", frameRate);\r\n }\r\n } else {\r\n if (this._myMaxPlanesReached) {\r\n if (this._myLogEnabled) {\r\n console.log(\"Aborted - Max Planes Reached\");\r\n\r\n this._myDoneTextComponent.text = \"Aborted - Max Planes Reached\";\r\n }\r\n } else {\r\n this._displayPlanes(this._myLowerLimit);\r\n\r\n if (this._myLogEnabled) {\r\n console.log(\"\\nEnd - Triangles:\", this._myLowerLimit * this._myRealTrianglesAmount, \"- Planes:\", this._myLowerLimit, \"- Frame Rate:\", frameRate);\r\n console.log(\"Plane Triangles (Adjusted):\", this._myRealTrianglesAmount);\r\n console.log(\"Target Frame Rate:\", this._myStableFrameRate, \"- Threshold: \", (this._myStableFrameRate - this._myTargetFrameRateThreshold));\r\n }\r\n\r\n this._myTriangleTextComponent.text = \"Triangles: \" + this._myLowerLimit * this._myRealTrianglesAmount;\r\n this._myPlaneTextComponent.text = \"Planes: \" + this._myLowerLimit;\r\n this._myFPSTextComponent.text = \"FPS: \" + frameRate + \" / \" + this._myStableFrameRate;\r\n\r\n this._myDoneTextComponent.text = \"End\";\r\n }\r\n this._myDone = true;\r\n }\r\n }\r\n\r\n if (lagging && !reset) {\r\n if (this._myLogEnabled) {\r\n console.log(\"Lag - Triangles:\", this._myCurrentPlanes * this._myRealTrianglesAmount, \"- Planes:\", this._myCurrentPlanes, \"- Frame Rate:\", frameRate);\r\n }\r\n }\r\n\r\n if (!this._myDone) {\r\n // Sort of binary search, if there is no upper limit yet, just double\r\n if (this._myUpperLimit > 0) {\r\n this._myCurrentPlanes = Math.floor((this._myUpperLimit + this._myLowerLimit) / 2);\r\n this._myCurrentPlanes = Math.max(this._myCurrentPlanes, 1);\r\n } else if (!reset) {\r\n this._myCurrentPlanes = this._myLowerLimit * 2;\r\n } else {\r\n this._myCurrentPlanes = this._myLowerLimit;\r\n }\r\n\r\n if (this._myCurrentPlanes > 50000) {\r\n this._myCurrentPlanes = 50000;\r\n this._myMaxPlanesReached = true;\r\n } else {\r\n this._myMaxPlanesReached = false;\r\n }\r\n }\r\n }\r\n\r\n if (!this._myDone) {\r\n this._displayPlanes(this._myCurrentPlanes);\r\n this._myElapsedTime = 0;\r\n this._myFrameCount = 0;\r\n\r\n this._mySkipNextFrames = 30;\r\n }\r\n }\r\n }\r\n }\r\n\r\n _displayPlanes(count) {\r\n while (this._myPlanes.length > count) {\r\n let plane = this._myPlanes.pop();\r\n Globals.getObjectPoolManager(this.engine).release(this._myPoolID, plane);\r\n }\r\n\r\n while (this._myPlanes.length < count) {\r\n let plane = Globals.getObjectPoolManager(this.engine).get(this._myPoolID);\r\n this._myPlanes.push(plane);\r\n }\r\n\r\n let gridSize = 1;\r\n while (gridSize * gridSize < count) {\r\n gridSize++;\r\n }\r\n\r\n let spaceBetween = 0.01;\r\n let totalSpaceBetween = spaceBetween * (gridSize - 1);\r\n let planeSize = (this._myBackgroundSize * 2 - totalSpaceBetween) / (gridSize * 2);\r\n\r\n let currentCount = count;\r\n\r\n for (let i = 0; i < gridSize && currentCount > 0; i++) {\r\n for (let j = 0; j < gridSize && currentCount > 0; j++) {\r\n let plane = this._myPlanes[currentCount - 1];\r\n plane.pp_setScale(planeSize);\r\n\r\n let position = [-this._myBackgroundSize + planeSize + j * planeSize * 2 + j * spaceBetween, this._myBackgroundSize - planeSize - i * planeSize * 2 - i * spaceBetween, 0];\r\n\r\n plane.pp_setPositionLocal(position);\r\n plane.pp_setActive(true);\r\n\r\n currentCount--;\r\n }\r\n }\r\n }\r\n\r\n start() {\r\n this._myActive = false;\r\n\r\n if (Globals.isDebugEnabled(this.engine)) {\r\n this._myActive = true;\r\n }\r\n\r\n this._myStartTimer = new Timer(2);\r\n this._mySessionStarted = false;\r\n\r\n this._myDTHistory = [];\r\n\r\n this._myFramesToSkip = 10;\r\n }\r\n\r\n update(dt) {\r\n if (!this._myActive || !Globals.isDebugEnabled(this.engine)) return;\r\n\r\n if (this._myFramesToSkip == 0) {\r\n if (this._mySessionStarted || !this._myStartOnXRStart) {\r\n if (this._myStartTimer.isRunning()) {\r\n this._myStartTimer.update(dt);\r\n\r\n this._myDTHistory.push(dt);\r\n\r\n if (this._myStartTimer.isDone()) {\r\n this._myStableFrameRate = this._computeAverageFrameRate(true);\r\n if (this._myTargetFrameRate > 0) {\r\n this._myStableFrameRate = this._myTargetFrameRate;\r\n }\r\n\r\n if (this._myLogEnabled) {\r\n console.log(\"\\nPlane Triangles (Adjusted):\", this._myRealTrianglesAmount);\r\n console.log(\"Target Frame Rate:\", this._myStableFrameRate, \"- Threshold: \", (this._myStableFrameRate - this._myTargetFrameRateThreshold));\r\n console.log(\"\");\r\n }\r\n\r\n this._start();\r\n }\r\n } else {\r\n this._update(dt);\r\n }\r\n } else {\r\n this._mySessionStarted = XRUtils.getSession(this.engine) != null;\r\n }\r\n } else {\r\n this._myFramesToSkip--;\r\n }\r\n }\r\n\r\n _computeAverageFrameRate(firstCompute) {\r\n let frameRate = 0;\r\n\r\n this._myDTHistory.sort((a, b) => a - b);\r\n let elementsToRemove = Math.floor(this._myDTHistory.length * Math.min(0.9, this._myDTHistoryToIgnorePercentage * (firstCompute ? 2 : 1)));\r\n for (let i = 0; i < elementsToRemove && this._myDTHistory.length > 1; i++) {\r\n this._myDTHistory.pop();\r\n }\r\n\r\n let averageDT = 0;\r\n for (let dt of this._myDTHistory) {\r\n averageDT += dt;\r\n }\r\n averageDT /= this._myDTHistory.length;\r\n frameRate = Math.round(1 / averageDT);\r\n\r\n this._myDTHistory = [];\r\n\r\n return frameRate;\r\n }\r\n\r\n _createPlaneMesh(trianglesAmount) {\r\n let squaresAmount = Math.ceil(trianglesAmount / 2);\r\n\r\n let row = 1;\r\n let column = 1;\r\n\r\n let closestSqrt = 1;\r\n while (closestSqrt * closestSqrt < squaresAmount) {\r\n closestSqrt++;\r\n }\r\n\r\n row = closestSqrt;\r\n column = closestSqrt;\r\n\r\n while (row > 1 && column > 1 && row * column > squaresAmount && ((row - 1) * column >= squaresAmount)) {\r\n row--;\r\n }\r\n\r\n let meshCreationParams = new MeshCreationParams(this.engine);\r\n\r\n for (let i = 0; i < row + 1; i++) {\r\n for (let j = 0; j < column + 1; j++) {\r\n\r\n let x = (2 / column) * j;\r\n let y = (2 / row) * i;\r\n\r\n let vertexCreationParams = new MeshCreationVertexParams();\r\n\r\n vertexCreationParams.myPosition = vec3_create();\r\n vertexCreationParams.myPosition[0] = x - 1;\r\n vertexCreationParams.myPosition[1] = y - 1;\r\n vertexCreationParams.myPosition[2] = 0;\r\n\r\n vertexCreationParams.myTextureCoordinates = vec2_create();\r\n vertexCreationParams.myTextureCoordinates[0] = x / 2;\r\n vertexCreationParams.myTextureCoordinates[1] = y / 2;\r\n\r\n vertexCreationParams.myNormal = vec3_create();\r\n vertexCreationParams.myNormal[0] = 0;\r\n vertexCreationParams.myNormal[1] = 0;\r\n vertexCreationParams.myNormal[2] = 1;\r\n\r\n meshCreationParams.myVertexes.push(vertexCreationParams);\r\n }\r\n }\r\n\r\n for (let i = 0; i < row; i++) {\r\n for (let j = 0; j < column; j++) {\r\n let firstTriangle = new MeshCreationTriangleParams();\r\n firstTriangle.myIndexes[0] = (i * (column + 1)) + j;\r\n firstTriangle.myIndexes[1] = (i * (column + 1)) + j + 1;\r\n firstTriangle.myIndexes[2] = ((i + 1) * (column + 1)) + j;\r\n\r\n let secondTriangle = new MeshCreationTriangleParams();\r\n secondTriangle.myIndexes[0] = ((i + 1) * (column + 1)) + j;\r\n secondTriangle.myIndexes[1] = (i * (column + 1)) + j + 1;\r\n secondTriangle.myIndexes[2] = ((i + 1) * (column + 1)) + j + 1;\r\n\r\n meshCreationParams.myTriangles.push(firstTriangle);\r\n meshCreationParams.myTriangles.push(secondTriangle);\r\n }\r\n }\r\n\r\n let mesh = MeshUtils.create(meshCreationParams);\r\n\r\n return mesh;\r\n }\r\n\r\n onDeactivate() {\r\n Globals.getObjectPoolManager(this.engine)?.releaseAll(this._myPoolID);\r\n }\r\n\r\n onDestroy() {\r\n Globals.getObjectPoolManager(this.engine)?.destroyPool(this._myPoolID);\r\n }\r\n}", "import { Component, PhysXComponent, Property } from \"@wonderlandengine/api\";\r\n\r\nexport class AdjustHierarchyPhysXScaleComponent extends Component {\r\n static TypeName = \"pp-adjust-hierarchy-physx-scale\";\r\n static Properties = {\r\n _myWhen: Property.enum([\"Init\", \"Start\", \"First Update\"], \"Start\")\r\n };\r\n\r\n init() {\r\n if (this.active && this._myWhen == 0) {\r\n this._adjustScale();\r\n }\r\n }\r\n\r\n start() {\r\n if (this._myWhen == 1) {\r\n this._adjustScale();\r\n }\r\n this._myFirst = true;\r\n }\r\n\r\n update(dt) {\r\n if (this._myWhen == 2 && this._myFirst) {\r\n this._myFirst = false;\r\n this._adjustScale();\r\n }\r\n }\r\n\r\n _adjustScale() {\r\n let scale = this.object.pp_getScale();\r\n let physXComponents = this.object.pp_getComponents(PhysXComponent);\r\n for (let physX of physXComponents) {\r\n physX.extents[0] = physX.extents[0] * scale[0];\r\n physX.extents[1] = physX.extents[1] * scale[1];\r\n physX.extents[2] = physX.extents[2] * scale[2];\r\n\r\n if (physX.active) {\r\n physX.active = false;\r\n physX.active = true;\r\n }\r\n }\r\n }\r\n}", "import { Component, Object3D, property } from \"@wonderlandengine/api\";\r\nimport { XRUtils } from \"../../utils/xr_utils.js\";\r\n\r\nexport class ResetLocalTransformComponent extends Component {\r\n public static override TypeName = \"pp-reset-local-transform\";\r\n\r\n @property.enum([\"Self\", \"Children\", \"Descendants\", \"Hierarchy\"], \"Self\")\r\n private _myResetLocalTransformOn!: number;\r\n\r\n @property.enum([\"Init\", \"Start\", \"First Update\", \"Enter XR\", \"Exit XR\", \"First Enter XR\", \"First Exit XR\"], \"Init\")\r\n private _myResetLocalTransformWhen!: number;\r\n\r\n private _myFirstUpdate: boolean = true;\r\n private _myFirstXRStart: boolean = true;\r\n private _myFirstXREnd: boolean = true;\r\n\r\n public override init(): void {\r\n if (this.active && this._myResetLocalTransformWhen == 0) {\r\n this._resetLocalTransform();\r\n }\r\n }\r\n\r\n public override start(): void {\r\n if (this._myResetLocalTransformWhen == 1) {\r\n this._resetLocalTransform();\r\n }\r\n }\r\n\r\n public override update(dt: number): void {\r\n if (this._myResetLocalTransformWhen == 2 && this._myFirstUpdate) {\r\n this._resetLocalTransform();\r\n }\r\n\r\n this._myFirstUpdate = false;\r\n }\r\n\r\n private _onXRSessionStart(): void {\r\n if (this._myResetLocalTransformWhen == 3 || (this._myResetLocalTransformWhen == 5 && this._myFirstXRStart)) {\r\n this._resetLocalTransform();\r\n }\r\n\r\n this._myFirstXRStart = false;\r\n }\r\n\r\n private _onXRSessionEnd(): void {\r\n if (this._myResetLocalTransformWhen == 4 || (this._myResetLocalTransformWhen == 6 && this._myFirstXREnd)) {\r\n this._resetLocalTransform();\r\n }\r\n\r\n this._myFirstXREnd = false;\r\n }\r\n\r\n private _resetLocalTransform(): void {\r\n let objects: Object3D[] = [];\r\n if (this._myResetLocalTransformOn == 0) {\r\n objects = [this.object.pp_getSelf()];\r\n } else if (this._myResetLocalTransformOn == 1) {\r\n objects = this.object.pp_getChildren();\r\n } else if (this._myResetLocalTransformOn == 2) {\r\n objects = this.object.pp_getDescendants();\r\n } else {\r\n objects = this.object.pp_getHierarchy();\r\n }\r\n\r\n for (const object of objects) {\r\n object.pp_resetTransformLocal();\r\n }\r\n }\r\n\r\n public override onActivate(): void {\r\n if (this._myResetLocalTransformWhen == 3 || this._myResetLocalTransformWhen == 5) {\r\n XRUtils.registerSessionStartEventListener(this, this._onXRSessionStart.bind(this), true, true, this.engine);\r\n }\r\n\r\n if (this._myResetLocalTransformWhen == 4 || this._myResetLocalTransformWhen == 6) {\r\n XRUtils.registerSessionEndEventListener(this, this._onXRSessionEnd.bind(this), this.engine);\r\n }\r\n }\r\n\r\n public override onDeactivate(): void {\r\n XRUtils.unregisterSessionStartEndEventListeners(this, this.engine);\r\n }\r\n}", "import { Component, Property } from \"@wonderlandengine/api\";\r\nimport { XRUtils } from \"../../utils/xr_utils.js\";\r\n\r\nexport class SetActiveComponent extends Component {\r\n static TypeName = \"pp-set-active\";\r\n static Properties = {\r\n _myActive: Property.bool(true),\r\n _mySetActiveOn: Property.enum([\"Self\", \"Children\", \"Descendants\", \"Hierarchy\"], \"Hierarchy\"),\r\n _mySetActiveWhen: Property.enum([\"Init\", \"Start\", \"First Update\", \"Enter XR\", \"Exit XR\", \"First Enter XR\", \"First Exit XR\"], \"Init\")\r\n };\r\n\r\n init() {\r\n if (this.active && this._mySetActiveWhen == 0) {\r\n this._setActive();\r\n }\r\n }\r\n\r\n start() {\r\n if (this._mySetActiveWhen == 1) {\r\n this._setActive();\r\n }\r\n\r\n this._myFirstUpdate = true;\r\n this._myFirstXRStart = true;\r\n this._myFirstXREnd = true;\r\n\r\n this._myActivateOnNextUpdate = false;\r\n }\r\n\r\n update(dt) {\r\n if (this._myActivateOnNextUpdate) {\r\n this._onActivate();\r\n\r\n this._myActivateOnNextUpdate = false;\r\n }\r\n\r\n if (this._mySetActiveWhen == 2 && this._myFirstUpdate) {\r\n this._setActive();\r\n }\r\n\r\n this._myFirstUpdate = false;\r\n }\r\n\r\n _onXRSessionStart() {\r\n if (this._mySetActiveWhen == 3 || (this._mySetActiveWhen == 5 && this._myFirstXRStart)) {\r\n this._setActive();\r\n }\r\n\r\n this._myFirstXRStart = false;\r\n }\r\n\r\n _onXRSessionEnd() {\r\n if (this._mySetActiveWhen == 4 || (this._mySetActiveWhen == 6 && this._myFirstXREnd)) {\r\n this._setActive();\r\n }\r\n\r\n this._myFirstXREnd = false;\r\n }\r\n\r\n _setActive() {\r\n if (this._mySetActiveOn == 0) {\r\n this.object.pp_setActiveSelf(this._myActive);\r\n } else if (this._mySetActiveOn == 1) {\r\n this.object.pp_setActiveChildren(this._myActive);\r\n } else if (this._mySetActiveOn == 2) {\r\n this.object.pp_setActiveDescendants(this._myActive);\r\n } else {\r\n this.object.pp_setActive(this._myActive);\r\n }\r\n }\r\n\r\n onActivate() {\r\n this._myActivateOnNextUpdate = true;\r\n }\r\n\r\n _onActivate() {\r\n if (this._mySetActiveWhen == 3 || this._mySetActiveWhen == 5) {\r\n XRUtils.registerSessionStartEventListener(this, this._onXRSessionStart.bind(this), true, true, this.engine);\r\n } else if (this._mySetActiveWhen == 4 || this._mySetActiveWhen == 6) {\r\n XRUtils.registerSessionEndEventListener(this, this._onXRSessionEnd.bind(this), this.engine);\r\n }\r\n }\r\n\r\n onDeactivate() {\r\n XRUtils.unregisterSessionStartEndEventListeners(this, this.engine);\r\n }\r\n}", "import { Component, LogLevel, property } from \"@wonderlandengine/api\";\r\n\r\nexport class SetEngineLogLevelComponent extends Component {\r\n public static override TypeName = \"pp-set-engine-log-level\";\r\n\r\n @property.bool(true)\r\n private _myInfoEnabled!: boolean;\r\n\r\n @property.bool(true)\r\n private _myWarnEnabled!: boolean;\r\n\r\n @property.bool(true)\r\n private _myErrorEnabled!: boolean;\r\n\r\n public override init(): void {\r\n const logLevelsToDisable = [];\r\n\r\n if (!this._myInfoEnabled) {\r\n logLevelsToDisable.push(LogLevel.Info);\r\n }\r\n\r\n if (!this._myWarnEnabled) {\r\n logLevelsToDisable.push(LogLevel.Warn);\r\n }\r\n\r\n if (!this._myErrorEnabled) {\r\n logLevelsToDisable.push(LogLevel.Error);\r\n }\r\n\r\n if (logLevelsToDisable.length > 0) {\r\n this.engine.log.levels.disable(...logLevelsToDisable);\r\n }\r\n }\r\n}", "import { Component, property } from \"@wonderlandengine/api\";\r\nimport { XRUtils } from \"../../utils/xr_utils.js\";\r\n\r\nenum _ButtonBehaviorWhenNotAvailable {\r\n NONE = \"none\",\r\n DISABLE = \"disable\",\r\n HIDE = \"hide\"\r\n}\r\n\r\n/** The buttons must first be enabled from the Wonderland Engine editor -> Project Settings / VR & AR */\r\nexport class ShowXRButtonsComponent extends Component {\r\n public static override TypeName = \"pp-show-xr-buttons\";\r\n\r\n @property.bool(true)\r\n private readonly _myShowVRButton!: boolean;\r\n @property.enum(Object.values(_ButtonBehaviorWhenNotAvailable), _ButtonBehaviorWhenNotAvailable.DISABLE)\r\n private readonly _myVRButtonBehaviorWhenNotAvailable!: number;\r\n\r\n @property.bool(true)\r\n private readonly _myShowARButton!: boolean;\r\n @property.enum(Object.values(_ButtonBehaviorWhenNotAvailable), _ButtonBehaviorWhenNotAvailable.DISABLE)\r\n private readonly _myARButtonBehaviorWhenNotAvailable!: number;\r\n\r\n private _myXRButtonsContainer: HTMLElement | null = null;\r\n private _myVRButton: HTMLElement | null = null;\r\n private _myARButton: HTMLElement | null = null;\r\n\r\n private _myFirstUpdate: boolean = false;\r\n\r\n private _myVRButtonVisibilityUpdated: boolean = false;\r\n private _myVRButtonUsabilityUpdated: boolean = false;\r\n private _myVRButtonDisabledOpacityUpdated: boolean = false;\r\n\r\n private _myARButtonVisibilityUpdated: boolean = false;\r\n private _myARButtonUsabilityUpdated: boolean = false;\r\n private _myARButtonDisabledOpacityUpdated: boolean = false;\r\n\r\n public override init(): void {\r\n this._myXRButtonsContainer = document.getElementById(\"xr-buttons-container\");\r\n\r\n this._myVRButton = document.getElementById(\"vr-button\");\r\n this._myARButton = document.getElementById(\"ar-button\");\r\n }\r\n\r\n public override update(dt: number): void {\r\n if (!this._myFirstUpdate) {\r\n this._myFirstUpdate = true;\r\n\r\n if (this._myXRButtonsContainer != null) {\r\n if (this._myShowVRButton || this._myShowARButton) {\r\n this._myXRButtonsContainer.style.setProperty(\"display\", \"flex\");\r\n } else {\r\n this._myXRButtonsContainer.style.setProperty(\"display\", \"none\");\r\n }\r\n }\r\n\r\n if (this._myVRButton != null) {\r\n if (this._myShowVRButton) {\r\n this._myVRButton.style.setProperty(\"display\", \"block\");\r\n } else {\r\n this._myVRButton.style.setProperty(\"display\", \"none\");\r\n }\r\n }\r\n\r\n if (this._myARButton != null) {\r\n if (this._myShowARButton) {\r\n this._myARButton.style.setProperty(\"display\", \"block\");\r\n } else {\r\n this._myARButton.style.setProperty(\"display\", \"none\");\r\n }\r\n }\r\n } else {\r\n this._updateXRButtons(dt);\r\n }\r\n }\r\n\r\n private _updateXRButtons(dt: number): void {\r\n if (this._myShowVRButton) {\r\n if (!this._myVRButtonUsabilityUpdated) {\r\n if (this._myVRButton != null) {\r\n if (!this._myVRButtonVisibilityUpdated) {\r\n this._myVRButton.style.setProperty(\"transform\", \"scale(1)\");\r\n this._myVRButtonVisibilityUpdated = true;\r\n }\r\n\r\n if (!this._myVRButtonUsabilityUpdated) {\r\n if (XRUtils.isVRSupported(this.engine)) {\r\n this._myVRButton.style.setProperty(\"opacity\", \"1\");\r\n this._myVRButton.style.setProperty(\"pointer-events\", \"all\");\r\n\r\n this._myVRButtonUsabilityUpdated = true;\r\n } else if (!this._myVRButtonDisabledOpacityUpdated) {\r\n switch (this._myVRButtonBehaviorWhenNotAvailable) {\r\n case 0:\r\n this._myVRButton.style.setProperty(\"opacity\", \"1\");\r\n this._myVRButton.style.setProperty(\"pointer-events\", \"all\");\r\n break;\r\n case 1:\r\n this._myVRButton.style.setProperty(\"opacity\", \"0.5\");\r\n break;\r\n case 2:\r\n this._myVRButton.style.setProperty(\"display\", \"none\");\r\n break;\r\n }\r\n\r\n this._myVRButtonDisabledOpacityUpdated = true;\r\n }\r\n }\r\n } else {\r\n this._myVRButtonUsabilityUpdated = true;\r\n }\r\n }\r\n }\r\n\r\n if (this._myShowARButton) {\r\n if (!this._myARButtonUsabilityUpdated) {\r\n if (this._myARButton != null) {\r\n if (!this._myARButtonVisibilityUpdated) {\r\n this._myARButton.style.setProperty(\"transform\", \"scale(1)\");\r\n this._myARButtonVisibilityUpdated = true;\r\n }\r\n\r\n if (!this._myARButtonUsabilityUpdated) {\r\n if (XRUtils.isARSupported(this.engine)) {\r\n this._myARButton.style.setProperty(\"opacity\", \"1\");\r\n this._myARButton.style.setProperty(\"pointer-events\", \"all\");\r\n\r\n this._myARButtonUsabilityUpdated = true;\r\n } else if (!this._myARButtonDisabledOpacityUpdated) {\r\n switch (this._myARButtonBehaviorWhenNotAvailable) {\r\n case 0:\r\n this._myARButton.style.setProperty(\"opacity\", \"1\");\r\n this._myARButton.style.setProperty(\"pointer-events\", \"all\");\r\n break;\r\n case 1:\r\n this._myARButton.style.setProperty(\"opacity\", \"0.5\");\r\n break;\r\n case 2:\r\n this._myARButton.style.setProperty(\"display\", \"none\");\r\n break;\r\n }\r\n\r\n this._myARButtonDisabledOpacityUpdated = true;\r\n }\r\n }\r\n } else {\r\n this._myARButtonUsabilityUpdated = true;\r\n }\r\n }\r\n }\r\n }\r\n\r\n public override onActivate(): void {\r\n XRUtils.registerSessionStartEndEventListeners(this, this._onXRSessionStart.bind(this), this._onXRSessionEnd.bind(this), true, false, this.engine);\r\n }\r\n\r\n public override onDeactivate(): void {\r\n XRUtils.unregisterSessionStartEndEventListeners(this, this.engine);\r\n }\r\n\r\n private _onXRSessionStart(): void {\r\n if (this._myXRButtonsContainer != null) {\r\n this._myXRButtonsContainer.style.setProperty(\"display\", \"none\");\r\n }\r\n }\r\n\r\n private _onXRSessionEnd(): void {\r\n if (this._myXRButtonsContainer != null && (this._myShowVRButton || this._myShowARButton)) {\r\n this._myXRButtonsContainer.style.setProperty(\"display\", \"flex\");\r\n }\r\n }\r\n}", "\r\n\r\nimport { Emitter } from \"@wonderlandengine/api\";\r\nimport { State } from \"./state.js\";\r\nimport { Transition } from \"./transition.js\";\r\n\r\nexport class StateData {\r\n public myID: unknown;\r\n public myState: State;\r\n\r\n constructor(stateID: unknown, state: State) {\r\n this.myID = stateID;\r\n this.myState = state;\r\n }\r\n}\r\n\r\nexport class TransitionData {\r\n public myID: unknown;\r\n\r\n public myFromStateData: Readonly;\r\n public myToStateData: Readonly;\r\n\r\n public myTransition: Transition;\r\n\r\n public mySkipStateFunction: SkipStateFunction;\r\n\r\n constructor(transitionID: unknown, fromStateData: Readonly, toStateData: Readonly, transition: Transition, skipStateFunction: SkipStateFunction) {\r\n this.myID = transitionID;\r\n this.myFromStateData = fromStateData;\r\n this.myToStateData = toStateData;\r\n this.myTransition = transition;\r\n this.mySkipStateFunction = skipStateFunction;\r\n }\r\n}\r\n\r\nexport class PendingPerform {\r\n public myID: unknown;\r\n public myTransitionArgs: unknown[];\r\n\r\n constructor(transitionID: unknown, ...args: unknown[]) {\r\n this.myID = transitionID;\r\n this.myTransitionArgs = args;\r\n }\r\n}\r\n\r\nexport enum PerformMode {\r\n IMMEDIATE = 0,\r\n DELAYED = 1\r\n}\r\n\r\nexport enum PerformDelayedMode {\r\n QUEUE = 0,\r\n KEEP_FIRST = 1,\r\n KEEP_LAST = 2\r\n}\r\n\r\nexport enum SkipStateFunction {\r\n NONE = 0,\r\n END = 1,\r\n START = 2,\r\n BOTH = 3\r\n}\r\n\r\n/**\r\n * You can also use plain functions for state/transition if u want to do something simple and quick\r\n * \r\n * Signatures:\r\n * function stateUpdate(dt, fsm, stateData)\r\n * function init(fsm, stateData)\r\n * function transition(fsm, transitionData)\r\n*/\r\nexport class FSM {\r\n\r\n private _myCurrentStateData: Readonly | null = null;\r\n\r\n private readonly _myStatesData: Map> = new Map();\r\n private readonly _myTransitionsData: Map>> = new Map();\r\n\r\n private _myLogEnabled: boolean = false;\r\n private _myLogShowDelayedInfo: boolean = false;\r\n private _myLogFSMName: string = \"FSM\";\r\n\r\n private _myPerformMode: PerformMode;\r\n private _myPerformDelayedMode: PerformDelayedMode;\r\n private readonly _myPendingPerforms: PendingPerform[] = [];\r\n private _myCurrentlyPerformedTransitionData: Readonly | null = null;\r\n\r\n private readonly _myInitEmitter: Emitter<[FSM, Readonly, ...unknown[]]> = new Emitter();\r\n private readonly _myInitIDEmitters: Map, ...unknown[]]>> = new Map();\r\n private readonly _myTransitionEmitter: Emitter<[FSM, Readonly, PerformMode, ...unknown[]]> = new Emitter();\r\n private readonly _myTransitionIDEmitters: [unknown, unknown, unknown, Emitter<[FSM, Readonly, PerformMode, ...unknown[]]>][] = [];\r\n\r\n constructor(performMode = PerformMode.IMMEDIATE, performDelayedMode = PerformDelayedMode.QUEUE) {\r\n this._myPerformMode = performMode;\r\n this._myPerformDelayedMode = performDelayedMode;\r\n }\r\n\r\n public addState(stateID: unknown, state?: State): void;\r\n public addState(stateID: unknown,\r\n stateUpdateCallback?: ((dt: number, fsm: FSM, stateData: Readonly, ...args: any[]) => void),\r\n stateStartCallback?: ((fsm: FSM, transitionData: Readonly, ...args: any[]) => void),\r\n stateEndCallback?: ((fsm: FSM, transitionData: Readonly, ...args: any[]) => void),\r\n stateInitCallback?: ((fsm: FSM, stateData: Readonly, ...args: any[]) => void)): void;\r\n public addState(stateID: unknown,\r\n state?: State | ((dt: number, fsm: FSM, stateData: Readonly, ...args: unknown[]) => void),\r\n stateStartCallback?: ((fsm: FSM, transitionData: Readonly, ...args: unknown[]) => void),\r\n stateEndCallback?: ((fsm: FSM, transitionData: Readonly, ...args: unknown[]) => void),\r\n stateInitCallback?: ((fsm: FSM, stateData: Readonly, ...args: unknown[]) => void)): void {\r\n let adjustedState: State | null = null;\r\n if (state == null || typeof state == \"function\") {\r\n adjustedState = {};\r\n\r\n if (state != null) {\r\n adjustedState.update = function update(dt: number, fsm: FSM, stateData: Readonly, ...args: unknown[]): void { return state(dt, fsm, stateData, ...args); };\r\n }\r\n\r\n if (stateStartCallback != null) {\r\n adjustedState.start = function start(fsm: FSM, transitionData: Readonly, ...args: unknown[]): void { return stateStartCallback(fsm, transitionData, ...args); };\r\n }\r\n\r\n if (stateEndCallback != null) {\r\n adjustedState.end = function end(fsm: FSM, transitionData: Readonly, ...args: unknown[]): void { return stateEndCallback(fsm, transitionData, ...args); };\r\n }\r\n\r\n if (stateInitCallback != null) {\r\n adjustedState.init = function init(fsm: FSM, stateData: Readonly, ...args: unknown[]): void { return stateInitCallback(fsm, stateData, ...args); };\r\n }\r\n\r\n adjustedState.clone = function clone() {\r\n const clonedState: State = {};\r\n clonedState.update = this.update;\r\n clonedState.clone = this.clone;\r\n return clonedState;\r\n };\r\n } else {\r\n adjustedState = state;\r\n }\r\n\r\n const stateData = new StateData(stateID, adjustedState);\r\n this._myStatesData.set(stateID, stateData);\r\n this._myTransitionsData.set(stateID, new Map());\r\n }\r\n\r\n public addTransition(fromStateID: unknown, toStateID: unknown, transitionID: unknown, transition?: Transition, skipStateFunction?: SkipStateFunction): void;\r\n public addTransition(fromStateID: unknown, toStateID: unknown, transitionID: unknown, transitionPerformCallback?: ((fsm: FSM, transitionData: Readonly, ...args: any[]) => void), skipStateFunction?: SkipStateFunction): void;\r\n public addTransition(fromStateID: unknown, toStateID: unknown, transitionID: unknown, transition?: Transition | ((fsm: FSM, transitionData: Readonly, ...args: unknown[]) => void), skipStateFunction: SkipStateFunction = SkipStateFunction.NONE): void {\r\n let adjustedTransition: Transition | null = null;\r\n if (transition == null || typeof transition == \"function\") {\r\n adjustedTransition = {};\r\n\r\n if (transition != null) {\r\n adjustedTransition.perform = function perform(fsm: FSM, transitionData: Readonly, ...args: unknown[]): void { return transition(fsm, transitionData, ...args); };\r\n }\r\n\r\n adjustedTransition.clone = function clone() {\r\n const clonedTransition: Transition = {};\r\n clonedTransition.perform = this.perform;\r\n clonedTransition.clone = this.clone;\r\n return clonedTransition;\r\n };\r\n } else {\r\n adjustedTransition = transition;\r\n }\r\n\r\n if (this.hasState(fromStateID) && this.hasState(toStateID)) {\r\n const transitionsDataFromState = this._getTransitionsDataFromState(fromStateID)!;\r\n\r\n const transitionData = new TransitionData(transitionID, this.getStateData(fromStateID)!, this.getStateData(toStateID)!, adjustedTransition, skipStateFunction);\r\n transitionsDataFromState.set(transitionID, transitionData);\r\n } else {\r\n if (!this.hasState(fromStateID) && !this.hasState(toStateID)) {\r\n console.error(\"Can't add transition:\", transitionID, \"- from state not found:\", fromStateID, \"- to state not found:\", toStateID);\r\n } else if (!this.hasState(fromStateID)) {\r\n console.error(\"Can't add transition:\", transitionID, \"- from state not found:\", fromStateID);\r\n } else if (!this.hasState(toStateID)) {\r\n console.error(\"Can't add transition:\", transitionID, \"- to state not found:\", toStateID);\r\n }\r\n }\r\n }\r\n\r\n public init(stateID: unknown, transition?: Transition): void;\r\n public init(stateID: unknown, transitionPerformInitCallback?: ((fsm: FSM, stateData: Readonly, ...args: unknown[]) => void), ...args: unknown[]): void;\r\n public init(stateID: unknown, transition?: Transition | ((fsm: FSM, stateData: Readonly, ...args: unknown[]) => void), ...args: unknown[]): void {\r\n let adjustedInitTransition: Transition | null = null;\r\n if (transition == null || typeof transition == \"function\") {\r\n adjustedInitTransition = {};\r\n\r\n if (transition != null) {\r\n adjustedInitTransition.performInit = function performInit(fsm: FSM, stateData: Readonly, ...args: unknown[]): void { return transition(fsm, stateData, ...args); };\r\n }\r\n } else {\r\n adjustedInitTransition = transition;\r\n }\r\n\r\n if (this.hasState(stateID)) {\r\n const stateData = this._myStatesData.get(stateID)!;\r\n\r\n if (this._myLogEnabled) {\r\n console.log(this._myLogFSMName, \"- Init:\", stateID);\r\n }\r\n\r\n if (adjustedInitTransition != null && adjustedInitTransition.performInit != null) {\r\n adjustedInitTransition.performInit(this, stateData, ...args);\r\n } else if (stateData.myState != null && stateData.myState.init != null) {\r\n stateData.myState.init(this, stateData, ...args);\r\n }\r\n\r\n this._myCurrentStateData = stateData;\r\n\r\n this._myInitEmitter.notify(this, stateData, ...args);\r\n\r\n if (this._myInitIDEmitters.size > 0) {\r\n const emitter = this._myInitIDEmitters.get(stateID);\r\n if (emitter != null) {\r\n emitter.notify(this, stateData, ...args);\r\n }\r\n }\r\n } else if (this._myLogEnabled) {\r\n console.warn(this._myLogFSMName, \"- Init state not found:\", stateID);\r\n }\r\n }\r\n\r\n public update(dt: number, ...args: unknown[]): void {\r\n if (this._myPendingPerforms.length > 0) {\r\n for (let i = 0; i < this._myPendingPerforms.length; i++) {\r\n this._perform(this._myPendingPerforms[i].myID, PerformMode.DELAYED, ...this._myPendingPerforms[i].myTransitionArgs);\r\n }\r\n\r\n this._myPendingPerforms.pp_clear();\r\n }\r\n\r\n if (this._myCurrentStateData != null && this._myCurrentStateData.myState != null && this._myCurrentStateData.myState.update != null) {\r\n this._myCurrentStateData.myState.update(dt, this, this._myCurrentStateData, ...args);\r\n }\r\n }\r\n\r\n public perform(transitionID: unknown, ...args: unknown[]): void {\r\n if (this._myPerformMode == PerformMode.DELAYED) {\r\n this.performDelayed(transitionID, ...args);\r\n } else {\r\n this.performImmediate(transitionID, ...args);\r\n }\r\n }\r\n\r\n public performDelayed(transitionID: unknown, ...args: unknown[]): boolean {\r\n let performDelayed = false;\r\n\r\n switch (this._myPerformDelayedMode) {\r\n case PerformDelayedMode.QUEUE:\r\n this._myPendingPerforms.push(new PendingPerform(transitionID, ...args));\r\n performDelayed = true;\r\n break;\r\n case PerformDelayedMode.KEEP_FIRST:\r\n if (!this.hasPendingPerforms()) {\r\n this._myPendingPerforms.push(new PendingPerform(transitionID, ...args));\r\n performDelayed = true;\r\n }\r\n break;\r\n case PerformDelayedMode.KEEP_LAST:\r\n this.resetPendingPerforms();\r\n this._myPendingPerforms.push(new PendingPerform(transitionID, ...args));\r\n performDelayed = true;\r\n break;\r\n }\r\n\r\n return performDelayed;\r\n }\r\n\r\n public performImmediate(transitionID: unknown, ...args: unknown[]): boolean {\r\n return this._perform(transitionID, PerformMode.IMMEDIATE, ...args);\r\n }\r\n\r\n public canPerform(transitionID: unknown): boolean {\r\n if (this._myCurrentStateData == null) {\r\n return false;\r\n }\r\n\r\n return this.hasTransitionFromState(this._myCurrentStateData.myID, transitionID);\r\n }\r\n\r\n public canGoTo(stateID: unknown, transitionID?: unknown): boolean {\r\n if (this._myCurrentStateData == null) {\r\n return false;\r\n }\r\n\r\n return this.hasTransitionFromStateToState(this._myCurrentStateData.myID, stateID, transitionID);\r\n }\r\n\r\n public isInState(stateID: unknown): boolean {\r\n return this._myCurrentStateData != null && this._myCurrentStateData.myID == stateID;\r\n }\r\n\r\n public isPerformingTransition(): boolean {\r\n return this._myCurrentlyPerformedTransitionData != null;\r\n }\r\n\r\n public getCurrentlyPerformingTransitionData(): Readonly | null {\r\n return this._myCurrentlyPerformedTransitionData;\r\n }\r\n\r\n public hasBeenInit(): boolean {\r\n return this._myCurrentStateData != null;\r\n }\r\n\r\n public reset(): void {\r\n this.resetCurrentState();\r\n this.resetPendingPerforms();\r\n }\r\n\r\n public resetCurrentState(): void {\r\n this._myCurrentStateData = null;\r\n }\r\n\r\n public resetPendingPerforms(): void {\r\n this._myPendingPerforms.pp_clear();\r\n }\r\n\r\n public getCurrentStateData(): Readonly | null {\r\n return this._myCurrentStateData;\r\n }\r\n\r\n public getCurrentTransitionsData(): Readonly[] {\r\n if (this._myCurrentStateData == null) {\r\n return [];\r\n }\r\n\r\n return this.getTransitionsDataFromState(this._myCurrentStateData.myID);\r\n }\r\n\r\n public getCurrentTransitionsDataToState(stateID: unknown): Readonly[] {\r\n if (this._myCurrentStateData == null) {\r\n return [];\r\n }\r\n\r\n return this.getTransitionsDataFromStateToState(this._myCurrentStateData.myID, stateID);\r\n }\r\n\r\n public getStateData(stateID: unknown): Readonly | null {\r\n const stateData = this._myStatesData.get(stateID);\r\n return stateData != null ? stateData : null;\r\n }\r\n\r\n public getStatesData(): Readonly[] {\r\n return Array.from(this._myStatesData.values());\r\n }\r\n\r\n public getTransitionsData(): Readonly[] {\r\n const transitionsData = [];\r\n\r\n for (const transitionsDataFromState of this._myTransitionsData.values()) {\r\n for (const transitionData of transitionsDataFromState.values()) {\r\n transitionsData.push(transitionData);\r\n }\r\n }\r\n\r\n return transitionsData;\r\n }\r\n\r\n public getTransitionsDataFromState(fromStateID: unknown): Readonly[] {\r\n const transitionsDataFromState = this._getTransitionsDataFromState(fromStateID);\r\n if (transitionsDataFromState == null) {\r\n return [];\r\n }\r\n\r\n return Array.from(transitionsDataFromState.values());\r\n }\r\n\r\n public getTransitionsDataFromStateToState(fromStateID: unknown, toStateID: unknown): Readonly[] {\r\n const transitionsDataFromState = this._getTransitionsDataFromState(fromStateID);\r\n if (transitionsDataFromState == null) {\r\n return [];\r\n }\r\n\r\n const transitionsDataToState = [];\r\n for (const transitionData of transitionsDataFromState.values()) {\r\n if (transitionData.myToStateData.myID == toStateID) {\r\n transitionsDataToState.push(transitionData);\r\n }\r\n }\r\n\r\n return transitionsDataToState;\r\n }\r\n\r\n public removeState(stateID: unknown): boolean {\r\n if (this.hasState(stateID)) {\r\n this._myStatesData.delete(stateID);\r\n this._myTransitionsData.delete(stateID);\r\n\r\n for (const transitionsDataFromState of this._myTransitionsData.values()) {\r\n const toDelete = [];\r\n for (const [transitionID, transitionData] of transitionsDataFromState.entries()) {\r\n if (transitionData.myToStateData.myID == stateID) {\r\n toDelete.push(transitionID);\r\n }\r\n }\r\n\r\n for (const transitionID of toDelete) {\r\n transitionsDataFromState.delete(transitionID);\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n public removeTransitionFromState(fromStateID: unknown, transitionID: unknown): boolean {\r\n const transitionsDataFromState = this._getTransitionsDataFromState(fromStateID);\r\n if (transitionsDataFromState != null) {\r\n return transitionsDataFromState.delete(transitionID);\r\n }\r\n\r\n return false;\r\n }\r\n\r\n public hasState(stateID: unknown): boolean {\r\n return this._myStatesData.has(stateID);\r\n }\r\n\r\n public hasTransitionFromState(fromStateID: unknown, transitionID: unknown): boolean {\r\n const transitionsData = this.getTransitionsDataFromState(fromStateID);\r\n\r\n const transitionIndex = transitionsData.findIndex(function (transition) {\r\n return transition.myID == transitionID;\r\n });\r\n\r\n return transitionIndex >= 0;\r\n }\r\n\r\n public hasTransitionFromStateToState(fromStateID: unknown, toStateID: unknown, transitionID?: unknown): boolean {\r\n const transitionsData = this.getTransitionsDataFromStateToState(fromStateID, toStateID);\r\n\r\n let hasTransition = false;\r\n if (transitionID != null) {\r\n const transitionIndex = transitionsData.findIndex(function (transition) {\r\n return transition.myID == transitionID;\r\n });\r\n\r\n hasTransition = transitionIndex >= 0;\r\n } else {\r\n hasTransition = transitionsData.length > 0;\r\n }\r\n\r\n return hasTransition;\r\n }\r\n\r\n public setPerformMode(performMode: PerformMode): void {\r\n this._myPerformMode = performMode;\r\n }\r\n\r\n public getPerformMode(): PerformMode {\r\n return this._myPerformMode;\r\n }\r\n\r\n public setPerformDelayedMode(performDelayedMode: PerformDelayedMode): void {\r\n this._myPerformDelayedMode = performDelayedMode;\r\n }\r\n\r\n public getPerformDelayedMode(): PerformDelayedMode {\r\n return this._myPerformDelayedMode;\r\n }\r\n\r\n public hasPendingPerforms(): boolean {\r\n return this._myPendingPerforms.length > 0;\r\n }\r\n\r\n public getPendingPerforms(): Readonly {\r\n return this._myPendingPerforms;\r\n }\r\n\r\n public clone(deepClone: boolean = false): FSM | null {\r\n if (!this.isCloneable(deepClone)) {\r\n return null;\r\n }\r\n\r\n const cloneFSM = new FSM();\r\n\r\n cloneFSM._myLogEnabled = this._myLogEnabled;\r\n cloneFSM._myLogShowDelayedInfo = this._myLogShowDelayedInfo;\r\n cloneFSM._myLogFSMName = this._myLogFSMName;\r\n\r\n cloneFSM._myPerformMode = this._myPerformMode;\r\n cloneFSM._myPerformDelayedMode = this._myPerformDelayedMode;\r\n (cloneFSM._myPendingPerforms as PendingPerform[]) = this._myPendingPerforms.pp_clone();\r\n\r\n for (const stateData of this._myStatesData.values()) {\r\n let clonedStateData = null;\r\n\r\n if (deepClone) {\r\n clonedStateData = new StateData(stateData.myID, stateData.myState.clone!());\r\n } else {\r\n clonedStateData = new StateData(stateData.myID, stateData.myState);\r\n }\r\n\r\n cloneFSM._myStatesData.set(clonedStateData.myID, clonedStateData);\r\n }\r\n\r\n for (const [stateID, transitionsDataFromState] of this._myTransitionsData.entries()) {\r\n const clonedTransitionsDataFromState = new Map();\r\n cloneFSM._myTransitionsData.set(stateID, clonedTransitionsDataFromState);\r\n\r\n for (const transitonData of transitionsDataFromState.values()) {\r\n let clonedTransitionData = null;\r\n\r\n const fromState = cloneFSM.getStateData(transitonData.myFromStateData.myID)!;\r\n const toState = cloneFSM.getStateData(transitonData.myToStateData.myID)!;\r\n\r\n if (deepClone) {\r\n clonedTransitionData = new TransitionData(transitonData.myID, fromState, toState, transitonData.myTransition.clone!(), transitonData.mySkipStateFunction);\r\n } else {\r\n clonedTransitionData = new TransitionData(transitonData.myID, fromState, toState, transitonData.myTransition, transitonData.mySkipStateFunction);\r\n }\r\n\r\n clonedTransitionsDataFromState.set(clonedTransitionData.myID, clonedTransitionData);\r\n }\r\n }\r\n\r\n if (this._myCurrentStateData != null) {\r\n cloneFSM._myCurrentStateData = cloneFSM.getStateData(this._myCurrentStateData.myID);\r\n }\r\n\r\n return cloneFSM;\r\n }\r\n\r\n public isCloneable(deepClone: boolean = false): boolean {\r\n if (!deepClone) {\r\n return true;\r\n }\r\n\r\n let deepCloneable = true;\r\n\r\n for (const stateData of this._myStatesData.values()) {\r\n deepCloneable = deepCloneable && stateData.myState.clone != null;\r\n }\r\n\r\n for (const transitionsData of this._myTransitionsData.values()) {\r\n for (const transitionsDataFromState of transitionsData.values()) {\r\n deepCloneable = deepCloneable && transitionsDataFromState.myTransition.clone != null;\r\n }\r\n }\r\n\r\n return deepCloneable;\r\n }\r\n\r\n public setLogEnabled(active: boolean, fsmName?: string, showDelayedInfo: boolean = false): void {\r\n this._myLogEnabled = active;\r\n this._myLogShowDelayedInfo = showDelayedInfo;\r\n if (fsmName != null) {\r\n this._myLogFSMName = \"FSM: \".concat(fsmName);\r\n }\r\n }\r\n\r\n public registerInitEventListener(listenerID: unknown, listener: (fsm: FSM, stateData: Readonly, ...args: unknown[]) => void): void {\r\n this._myInitEmitter.add(listener, { id: listenerID });\r\n }\r\n\r\n public unregisterInitEventListener(listenerID: unknown): void {\r\n this._myInitEmitter.remove(listenerID);\r\n }\r\n\r\n public registerInitIDEventListener(stateID: unknown, listenerID: unknown, listener: (fsm: FSM, stateData: Readonly, ...args: unknown[]) => void): void {\r\n let stateIDEmitter = this._myInitIDEmitters.get(stateID);\r\n if (stateIDEmitter == null) {\r\n this._myInitIDEmitters.set(stateID, new Emitter());\r\n stateIDEmitter = this._myInitIDEmitters.get(stateID);\r\n }\r\n\r\n stateIDEmitter!.add(listener, { id: listenerID });\r\n }\r\n\r\n public unregisterInitIDEventListener(stateID: unknown, listenerID: unknown): void {\r\n const stateIDEmitter = this._myInitIDEmitters.get(stateID);\r\n if (stateIDEmitter != null) {\r\n stateIDEmitter.remove(listenerID);\r\n\r\n if (stateIDEmitter.isEmpty) {\r\n this._myInitIDEmitters.delete(stateID);\r\n }\r\n }\r\n }\r\n\r\n public registerTransitionEventListener(listenerID: unknown, listener: (fsm: FSM, transitionData: Readonly, performMode: PerformMode, ...args: unknown[]) => void): void {\r\n this._myTransitionEmitter.add(listener, { id: listenerID });\r\n }\r\n\r\n public unregisterTransitionEventListener(listenerID: unknown): void {\r\n this._myTransitionEmitter.remove(listenerID);\r\n }\r\n\r\n /** The fsm IDs can be `null`, that means that the listener is called whenever only the valid IDs match\r\n This let you register to all the transitions with a specific ID and from of a specific state but to every state (`toStateID == null`) */\r\n public registerTransitionIDEventListener(fromStateID: unknown, toStateID: unknown, transitionID: unknown, listenerID: unknown, listener: (fsm: FSM, transitionData: Readonly, performMode: PerformMode, ...args: unknown[]) => void): void {\r\n let internalTransitionIDEmitter: Emitter<[FSM, Readonly, PerformMode, ...unknown[]]> | null = null;\r\n for (const value of this._myTransitionIDEmitters) {\r\n if (value[0] == fromStateID && value[1] == toStateID && value[2] == transitionID) {\r\n internalTransitionIDEmitter = value[3];\r\n break;\r\n }\r\n }\r\n\r\n if (internalTransitionIDEmitter == null) {\r\n const transitionIDEmitter: [unknown, unknown, unknown, Emitter<[FSM, Readonly, PerformMode, ...unknown[]]>] = [\r\n fromStateID,\r\n toStateID,\r\n transitionID,\r\n new Emitter()\r\n ];\r\n\r\n internalTransitionIDEmitter = transitionIDEmitter[3];\r\n\r\n this._myTransitionIDEmitters.push(transitionIDEmitter);\r\n }\r\n\r\n internalTransitionIDEmitter!.add(listener, { id: listenerID });\r\n }\r\n\r\n public unregisterTransitionIDEventListener(fromStateID: unknown, toStateID: unknown, transitionID: unknown, listenerID: unknown): void {\r\n let internalTransitionIDEmitter: Emitter<[FSM, Readonly, PerformMode, ...unknown[]]> | null = null;\r\n for (const value of this._myTransitionIDEmitters) {\r\n if (value[0] == fromStateID && value[1] == toStateID && value[2] == transitionID) {\r\n internalTransitionIDEmitter = value[3];\r\n break;\r\n }\r\n }\r\n\r\n if (internalTransitionIDEmitter != null) {\r\n internalTransitionIDEmitter.remove(listenerID);\r\n\r\n if (internalTransitionIDEmitter.isEmpty) {\r\n this._myTransitionIDEmitters.pp_remove(element => element[0] == fromStateID && element[1] == toStateID && element[2] == transitionID);\r\n }\r\n }\r\n }\r\n\r\n private _perform(transitionID: unknown, performMode: PerformMode, ...args: unknown[]): boolean {\r\n if (this.isPerformingTransition()) {\r\n const currentlyPerformingTransitionData = this.getCurrentlyPerformingTransitionData()!;\r\n const consoleArguments = [this._myLogFSMName, \"- Trying to perform:\", transitionID];\r\n if (this._myLogShowDelayedInfo) {\r\n consoleArguments.push(performMode == PerformMode.DELAYED ? \"- Delayed\" : \"- Immediate\");\r\n }\r\n consoleArguments.push(\"- But another transition is currently being performed -\", currentlyPerformingTransitionData.myID);\r\n console.warn(...consoleArguments);\r\n\r\n return false;\r\n }\r\n\r\n if (this._myCurrentStateData != null) {\r\n if (this.canPerform(transitionID)) {\r\n const transitionsData = this._myTransitionsData.get(this._myCurrentStateData.myID)!;\r\n const transitionDataToPerform = transitionsData.get(transitionID)!;\r\n\r\n this._myCurrentlyPerformedTransitionData = transitionDataToPerform;\r\n\r\n const fromStateData = this._myCurrentStateData;\r\n const toStateData = this._myStatesData.get(transitionDataToPerform.myToStateData.myID)!;\r\n\r\n if (this._myLogEnabled) {\r\n const consoleArguments = [this._myLogFSMName, \"- From:\", fromStateData.myID, \"- To:\", toStateData.myID, \"- With:\", transitionID];\r\n if (this._myLogShowDelayedInfo) {\r\n consoleArguments.push(performMode == PerformMode.DELAYED ? \"- Delayed\" : \"- Immediate\");\r\n }\r\n console.log(...consoleArguments);\r\n }\r\n\r\n if (transitionDataToPerform.mySkipStateFunction != SkipStateFunction.END && transitionDataToPerform.mySkipStateFunction != SkipStateFunction.BOTH &&\r\n fromStateData.myState != null && fromStateData.myState.end != null) {\r\n fromStateData.myState.end(this, transitionDataToPerform, ...args);\r\n }\r\n\r\n if (transitionDataToPerform.myTransition != null && transitionDataToPerform.myTransition.perform != null) {\r\n transitionDataToPerform.myTransition.perform(this, transitionDataToPerform, ...args);\r\n }\r\n\r\n if (transitionDataToPerform.mySkipStateFunction != SkipStateFunction.START && transitionDataToPerform.mySkipStateFunction != SkipStateFunction.BOTH &&\r\n toStateData.myState != null && toStateData.myState.start != null) {\r\n toStateData.myState.start(this, transitionDataToPerform, ...args);\r\n }\r\n\r\n this._myCurrentStateData = transitionDataToPerform.myToStateData;\r\n\r\n this._myTransitionEmitter.notify(this, transitionDataToPerform, performMode, ...args);\r\n\r\n if (this._myTransitionIDEmitters.length > 0) {\r\n const internalTransitionIDEmitters = [];\r\n for (const value of this._myTransitionIDEmitters) {\r\n if ((value[0] == null || value[0] == fromStateData.myID) &&\r\n (value[1] == null || value[1] == toStateData.myID) &&\r\n (value[2] == null || value[2] == transitionDataToPerform.myID)) {\r\n internalTransitionIDEmitters.push(value[3]);\r\n }\r\n }\r\n\r\n for (const emitter of internalTransitionIDEmitters) {\r\n emitter.notify(this, transitionDataToPerform, performMode, ...args);\r\n }\r\n }\r\n\r\n this._myCurrentlyPerformedTransitionData = null;\r\n\r\n return true;\r\n } else if (this._myLogEnabled) {\r\n const consoleArguments = [this._myLogFSMName, \"- No Transition:\", transitionID, \"- From:\", this._myCurrentStateData.myID];\r\n if (this._myLogShowDelayedInfo) {\r\n consoleArguments.push(performMode == PerformMode.DELAYED ? \"- Delayed\" : \"- Immediate\");\r\n }\r\n console.warn(...consoleArguments);\r\n }\r\n } else if (this._myLogEnabled) {\r\n const consoleArguments = [this._myLogFSMName, \"- FSM not initialized yet\"];\r\n if (this._myLogShowDelayedInfo) {\r\n consoleArguments.push(performMode == PerformMode.DELAYED ? \"- Delayed\" : \"- Immediate\");\r\n }\r\n console.warn(...consoleArguments);\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private _getTransitionsDataFromState(fromStateID: unknown): Map> | null {\r\n const transitionsData = this._myTransitionsData.get(fromStateID);\r\n return transitionsData != null ? transitionsData : null;\r\n }\r\n}", "import { FSM, StateData, TransitionData } from \"../../fsm.js\";\r\n\r\nexport abstract class BaseConditionState {\r\n\r\n private _myConditionCallback: () => boolean;\r\n\r\n private _myTransitionToPerformOnEnd: unknown;\r\n private _myTransitionArgs: unknown[];\r\n\r\n constructor(conditionCallback: () => boolean, transitionToPerformOnEnd: unknown, ...transitionArgs: unknown[]) {\r\n this._myConditionCallback = conditionCallback;\r\n\r\n this._myTransitionToPerformOnEnd = transitionToPerformOnEnd;\r\n this._myTransitionArgs = transitionArgs;\r\n }\r\n\r\n public setTransitionToPerformOnEnd(transitionToPerformOnEnd: unknown, ...transitionArgs: unknown[]): void {\r\n this._myTransitionToPerformOnEnd = transitionToPerformOnEnd;\r\n this._myTransitionArgs = transitionArgs;\r\n }\r\n\r\n protected _setConditionCallback(conditionCallback: () => boolean): void {\r\n this._myConditionCallback = conditionCallback;\r\n }\r\n\r\n protected _update(dt: number, fsm: FSM): void {\r\n if (this._myConditionCallback()) {\r\n if (this._myTransitionToPerformOnEnd != null) {\r\n fsm.perform(this._myTransitionToPerformOnEnd, ...this._myTransitionArgs);\r\n }\r\n }\r\n }\r\n\r\n protected _start(fsm: FSM, transitionData: Readonly, conditionCallback?: () => boolean, transitionToPerformOnEnd?: unknown, ...transitionArgs: unknown[]): void {\r\n if (conditionCallback != null) {\r\n this._myConditionCallback = conditionCallback;\r\n }\r\n\r\n if (transitionToPerformOnEnd != null) {\r\n this._myTransitionToPerformOnEnd = transitionToPerformOnEnd;\r\n this._myTransitionArgs = transitionArgs;\r\n }\r\n }\r\n\r\n protected _init(fsm: FSM, stateData: Readonly, conditionCallback?: () => boolean, transitionToPerformOnEnd?: unknown, ...transitionArgs: unknown[]): void {\r\n if (conditionCallback != null) {\r\n this._myConditionCallback = conditionCallback;\r\n }\r\n\r\n if (transitionToPerformOnEnd != null) {\r\n this._myTransitionToPerformOnEnd = transitionToPerformOnEnd;\r\n this._myTransitionArgs = transitionArgs;\r\n }\r\n }\r\n}", "import { FSM, StateData, TransitionData } from \"../../fsm.js\";\r\nimport { State } from \"../../state.js\";\r\nimport { BaseConditionState } from \"./base_condition_state.js\";\r\n\r\nexport class ConditionState extends BaseConditionState implements State {\r\n\r\n constructor(conditionCallback: () => boolean, transitionToPerformOnEnd: unknown, ...transitionArgs: unknown[]) {\r\n super(conditionCallback, transitionToPerformOnEnd, ...transitionArgs);\r\n }\r\n\r\n public setConditionCallback(conditionCallback: () => boolean): void {\r\n super._setConditionCallback(conditionCallback);\r\n }\r\n\r\n public update(dt: number, fsm: FSM): void {\r\n this._update(dt, fsm);\r\n }\r\n\r\n public start(fsm: FSM, transitionData: Readonly, conditionCallback?: () => boolean, transitionToPerformOnEnd?: unknown, ...transitionArgs: unknown[]): void {\r\n this._start(fsm, transitionData, conditionCallback, transitionToPerformOnEnd, ...transitionArgs);\r\n }\r\n\r\n public init(fsm: FSM, stateData: Readonly, conditionCallback?: () => boolean, transitionToPerformOnEnd?: unknown, ...transitionArgs: unknown[]): void {\r\n this._init(fsm, stateData, conditionCallback, transitionToPerformOnEnd, ...transitionArgs);\r\n }\r\n}", "import { Timer } from \"../../../cauldron/timer.js\";\r\nimport { FSM, StateData, TransitionData } from \"../../fsm.js\";\r\nimport { State } from \"../../state.js\";\r\nimport { BaseConditionState } from \"./base_condition_state.js\";\r\n\r\nexport class TimerState extends BaseConditionState implements State {\r\n\r\n private readonly _myTimer: Timer;\r\n\r\n constructor(duration: number = 0, transitionToPerformOnEnd: unknown, ...transitionArgs: unknown[]) {\r\n super(() => this._myTimer.isDone(), transitionToPerformOnEnd, ...transitionArgs);\r\n\r\n this._myTimer = new Timer(duration, false);\r\n }\r\n\r\n public setDuration(duration: number): void {\r\n this._myTimer.setDuration(duration);\r\n }\r\n\r\n public onEnd(listener: () => void, id?: unknown): void {\r\n this._myTimer.onEnd(listener, id);\r\n }\r\n\r\n public unregisterOnEnd(id?: unknown): void {\r\n this._myTimer.unregisterOnEnd(id);\r\n }\r\n\r\n public update(dt: number, fsm: FSM): void {\r\n this._myTimer.update(dt);\r\n\r\n super._update(dt, fsm);\r\n }\r\n\r\n public start(fsm: FSM, transitionData: Readonly, duration?: number, transitionToPerformOnEnd?: unknown, ...transitionArgs: unknown[]): void {\r\n this._myTimer.start(duration);\r\n\r\n super._start(fsm, transitionData, undefined, transitionToPerformOnEnd, ...transitionArgs);\r\n }\r\n\r\n public init(fsm: FSM, stateData: Readonly, duration?: number, transitionToPerformOnEnd?: unknown, ...transitionArgs: unknown[]): void {\r\n this._myTimer.start(duration);\r\n\r\n super._init(fsm, stateData, undefined, transitionToPerformOnEnd, ...transitionArgs);\r\n }\r\n}", "import { FSM, StateData, TransitionData } from \"../../fsm.js\";\r\nimport { State } from \"../../state.js\";\r\nimport { BaseConditionState } from \"./base_condition_state.js\";\r\n\r\nexport class FramesCountdownState extends BaseConditionState implements State {\r\n\r\n private _myFramesCountdown: number;\r\n private _myCurrentFramesCountdown: number;\r\n\r\n constructor(framesCountdown: number = 0, transitionToPerformOnEnd: unknown, ...transitionArgs: unknown[]) {\r\n super(() => this._myCurrentFramesCountdown <= 0, transitionToPerformOnEnd, ...transitionArgs);\r\n\r\n this._myFramesCountdown = framesCountdown;\r\n this._myCurrentFramesCountdown = this._myFramesCountdown;\r\n }\r\n\r\n public setFramesCountdown(framesCountdown: number): void {\r\n this._myFramesCountdown = framesCountdown;\r\n this._myCurrentFramesCountdown = this._myFramesCountdown;\r\n }\r\n\r\n public update(dt: number, fsm: FSM): void {\r\n if (this._myCurrentFramesCountdown > 0) {\r\n this._myCurrentFramesCountdown--;\r\n }\r\n\r\n super._update(dt, fsm);\r\n }\r\n\r\n public start(fsm: FSM, transitionData: Readonly, duration?: number, transitionToPerformOnEnd?: unknown, ...transitionArgs: unknown[]): void {\r\n this._myCurrentFramesCountdown = this._myFramesCountdown;\r\n\r\n super._start(fsm, transitionData, undefined, transitionToPerformOnEnd, ...transitionArgs);\r\n }\r\n\r\n public init(fsm: FSM, stateData: Readonly, duration?: number, transitionToPerformOnEnd?: unknown, ...transitionArgs: unknown[]): void {\r\n this._myCurrentFramesCountdown = this._myFramesCountdown;\r\n\r\n super._init(fsm, stateData, undefined, transitionToPerformOnEnd, ...transitionArgs);\r\n }\r\n}", "import { Timer } from \"../../../cauldron/timer.js\";\r\nimport { FSM, StateData, TransitionData } from \"../../fsm.js\";\r\nimport { State } from \"../../state.js\";\r\nimport { BaseConditionState } from \"./base_condition_state.js\";\r\n\r\nexport class DelayState extends BaseConditionState implements State {\r\n\r\n private readonly _myTimer: Timer;\r\n\r\n private _myFramesCountdown: number;\r\n private _myCurrentFramesCountdown: number;\r\n\r\n private _myUpdateTimerAfterFramesCountdown: boolean;\r\n\r\n constructor(duration: number = 0, framesCountdown: number = 0, updateTimerAfterFramesCountdown: boolean = true, transitionToPerformOnEnd: unknown, ...transitionArgs: unknown[]) {\r\n super(() => this._myCurrentFramesCountdown <= 0 && this._myTimer.isDone(), transitionToPerformOnEnd, ...transitionArgs);\r\n\r\n this._myTimer = new Timer(duration, false);\r\n\r\n this._myFramesCountdown = framesCountdown;\r\n this._myCurrentFramesCountdown = this._myFramesCountdown;\r\n\r\n this._myUpdateTimerAfterFramesCountdown = updateTimerAfterFramesCountdown;\r\n }\r\n\r\n public setUpdateTimerAfterFramesCountdown(updateTimerAfterFramesCountdown: boolean): void {\r\n this._myUpdateTimerAfterFramesCountdown = updateTimerAfterFramesCountdown;\r\n }\r\n\r\n public setDuration(duration: number): void {\r\n this._myTimer.setDuration(duration);\r\n }\r\n\r\n public setFramesCountdown(framesCountdown: number): void {\r\n this._myFramesCountdown = framesCountdown;\r\n this._myCurrentFramesCountdown = this._myFramesCountdown;\r\n }\r\n\r\n public update(dt: number, fsm: FSM): void {\r\n if (this._myCurrentFramesCountdown > 0) {\r\n this._myCurrentFramesCountdown--;\r\n }\r\n\r\n if (!this._myUpdateTimerAfterFramesCountdown || this._myCurrentFramesCountdown <= 0) {\r\n this._myTimer.update(dt);\r\n }\r\n\r\n super._update(dt, fsm);\r\n }\r\n\r\n public start(fsm: FSM, transitionData: Readonly, duration?: number, transitionToPerformOnEnd?: unknown, ...transitionArgs: unknown[]): void {\r\n this._myTimer.start(duration);\r\n this._myCurrentFramesCountdown = this._myFramesCountdown;\r\n\r\n super._start(fsm, transitionData, undefined, transitionToPerformOnEnd, ...transitionArgs);\r\n }\r\n\r\n public init(fsm: FSM, stateData: Readonly, duration?: number, transitionToPerformOnEnd?: unknown, ...transitionArgs: unknown[]): void {\r\n this._myTimer.start(duration);\r\n this._myCurrentFramesCountdown = this._myFramesCountdown;\r\n\r\n super._init(fsm, stateData, undefined, transitionToPerformOnEnd, ...transitionArgs);\r\n }\r\n}", "import { FSM, StateData, TransitionData } from \"../../fsm.js\";\r\nimport { State } from \"../../state.js\";\r\n\r\n/**\r\n * This state calls the `branchCallback` function every `update` and if it returns a value different from `null` \r\n * will perform a transition using that value as `transitionID`\r\n * \r\n * If you want to also forward args for the transition, you have you to return the transition as an array \r\n * where the first item is the `transitionID` and the second one are the arguments: `[transitionID, [argument1, argument2, ...]]`\r\n */\r\nexport class BranchState implements State {\r\n\r\n private _myBranchCallback: () => unknown | [unknown, unknown[]];\r\n\r\n constructor(branchCallback: () => unknown | [unknown, unknown[]]) {\r\n this._myBranchCallback = branchCallback;\r\n }\r\n\r\n public setBranchCallback(branchCallback: () => unknown | [unknown, unknown[]]): void {\r\n this._myBranchCallback = branchCallback;\r\n }\r\n\r\n public update(dt: number, fsm: FSM): void {\r\n const branchResult = this._myBranchCallback();\r\n if (branchResult != null) {\r\n if (Array.isArray(branchResult) && branchResult.length == 2) {\r\n fsm.perform(branchResult[0], ...branchResult[1]);\r\n } else {\r\n fsm.perform(branchResult);\r\n }\r\n }\r\n }\r\n\r\n public start(fsm: FSM, transitionData: Readonly, branchCallback?: () => unknown | [unknown, unknown[]]): void {\r\n if (branchCallback != null) {\r\n this._myBranchCallback = branchCallback;\r\n }\r\n }\r\n\r\n public init(fsm: FSM, stateData: Readonly, branchCallback?: () => boolean): void {\r\n if (branchCallback != null) {\r\n this._myBranchCallback = branchCallback;\r\n }\r\n }\r\n}", "import { Vector4 } from \"../type_definitions/array_type_definitions.js\";\r\nimport { Vec4Utils } from \"./array/vec4_utils.js\";\r\n\r\nexport enum ColorModel {\r\n RGB,\r\n HSV\r\n}\r\n\r\n/** `rgb` is in the `[0, 1]` space, alpha is not changed */\r\nexport function rgbToHSV(rgb: Readonly): T;\r\nexport function rgbToHSV(rgb: Readonly, out: T): T;\r\nexport function rgbToHSV(rgb: Readonly, out: T | U = Vec4Utils.clone(rgb)): T | U {\r\n const r = rgb[0];\r\n const g = rgb[1];\r\n const b = rgb[2];\r\n\r\n const max = Math.max(r, g, b);\r\n const min = Math.min(r, g, b);\r\n\r\n const d = max - min;\r\n\r\n let h = 0;\r\n const s = (max == 0 ? 0 : d / max);\r\n const v = max;\r\n\r\n switch (max) {\r\n case min:\r\n h = 0;\r\n break;\r\n case r:\r\n h = (g - b) + d * (g < b ? 6 : 0); h /= 6 * d;\r\n break;\r\n case g:\r\n h = (b - r) + d * 2; h /= 6 * d;\r\n break;\r\n case b:\r\n h = (r - g) + d * 4; h /= 6 * d;\r\n break;\r\n }\r\n\r\n out[0] = h;\r\n out[1] = s;\r\n out[2] = v;\r\n out[3] = rgb[3];\r\n\r\n return out;\r\n}\r\n\r\n/** alpha is not changed */\r\nexport function hsvToRGB(hsv: Readonly): T;\r\nexport function hsvToRGB(hsv: Readonly, out: T): T;\r\nexport function hsvToRGB(hsv: Readonly, out: T | U = Vec4Utils.clone(hsv)): T | U {\r\n const h = hsv[0];\r\n const s = hsv[1];\r\n const v = hsv[2];\r\n\r\n const i = Math.floor(h * 6);\r\n const f = h * 6 - i;\r\n const p = v * (1 - s);\r\n const q = v * (1 - f * s);\r\n const t = v * (1 - (1 - f) * s);\r\n\r\n let r = 0;\r\n let g = 0;\r\n let b = 0;\r\n\r\n switch (i % 6) {\r\n case 0:\r\n r = v;\r\n g = t;\r\n b = p;\r\n break;\r\n case 1:\r\n r = q;\r\n g = v;\r\n b = p;\r\n break;\r\n case 2:\r\n r = p;\r\n g = v;\r\n b = t;\r\n break;\r\n case 3:\r\n r = p;\r\n g = q;\r\n b = v;\r\n break;\r\n case 4:\r\n r = t;\r\n g = p;\r\n b = v;\r\n break;\r\n case 5:\r\n r = v;\r\n g = p;\r\n b = q;\r\n break;\r\n }\r\n\r\n out[0] = r;\r\n out[1] = g;\r\n out[2] = b;\r\n out[3] = hsv[3];\r\n\r\n return out;\r\n}\r\n\r\nexport function colorNormalizedToInt(color: Readonly): T;\r\nexport function colorNormalizedToInt(color: Readonly, out: T): T;\r\nexport function colorNormalizedToInt(color: Readonly, out: T | U = Vec4Utils.clone(color)): T | U {\r\n for (let i = 0; i < out.length; i++) {\r\n out[i] = Math.round(color[i] * 255);\r\n out[i] = Math.pp_clamp(out[i], 0, 255);\r\n }\r\n\r\n return out;\r\n}\r\n\r\nexport function colorIntToNormalized(color: Readonly): T;\r\nexport function colorIntToNormalized(color: Readonly, out: T): T;\r\nexport function colorIntToNormalized(color: Readonly, out: T | U = Vec4Utils.clone(color)): T | U {\r\n for (let i = 0; i < out.length; i++) {\r\n out[i] = color[i] / 255;\r\n out[i] = Math.pp_clamp(out[i], 0, 1);\r\n }\r\n\r\n return out;\r\n}\r\n\r\nexport const ColorUtils = {\r\n rgbToHSV,\r\n hsvToRGB,\r\n colorNormalizedToInt,\r\n colorIntToNormalized\r\n} as const;", "let _myAnalyticsEnabled: boolean = false;\r\n\r\nlet _mySendDataCallback: ((...args: unknown[]) => void) | null = null;\r\n\r\nconst _myEventsSentOnce: string[] = [];\r\n\r\nlet _myDataLogEnabled: boolean = false;\r\nlet _myEventsLogEnabled: boolean = false;\r\n\r\nlet _myErrorsLogEnabled: boolean = false;\r\n\r\nexport function setAnalyticsEnabled(enabled: boolean): void {\r\n _myAnalyticsEnabled = enabled;\r\n}\r\n\r\nexport function isAnalyticsEnabled(): boolean {\r\n return _myAnalyticsEnabled;\r\n}\r\n\r\nexport function setSendDataCallback(callback: ((...args: unknown[]) => void) | null): void {\r\n _mySendDataCallback = callback;\r\n}\r\n\r\nexport function sendData(...args: unknown[]): boolean {\r\n let dataSent = false;\r\n\r\n try {\r\n if (_myAnalyticsEnabled) {\r\n if (_myDataLogEnabled) {\r\n console.log(\"Analytics Data: \" + args);\r\n }\r\n\r\n if (_mySendDataCallback != null) {\r\n _mySendDataCallback(...args);\r\n\r\n dataSent = true;\r\n } else if (_myErrorsLogEnabled) {\r\n console.error(\"You need to set the send data callback\");\r\n }\r\n }\r\n } catch (error) {\r\n if (_myErrorsLogEnabled) {\r\n console.error(error);\r\n }\r\n\r\n dataSent = false;\r\n }\r\n\r\n return dataSent;\r\n}\r\n\r\nexport function sendEvent(eventName: string, params?: Record): boolean {\r\n let eventSent = false;\r\n\r\n try {\r\n if (_myAnalyticsEnabled) {\r\n if (_myEventsLogEnabled) {\r\n if (params != null) {\r\n console.log(\"Analytics Event: \" + eventName + \" - Params:\", params);\r\n } else {\r\n console.log(\"Analytics Event: \" + eventName);\r\n }\r\n }\r\n\r\n if (_mySendDataCallback != null) {\r\n if (params != null) {\r\n _mySendDataCallback(\"event\", eventName, params);\r\n } else {\r\n _mySendDataCallback(\"event\", eventName);\r\n }\r\n\r\n eventSent = true;\r\n } else if (_myErrorsLogEnabled) {\r\n console.error(\"Analytics Error: You need to set the send data callback\");\r\n } else {\r\n console.warn(\"Analytics Error: You need to set the send data callback\");\r\n }\r\n }\r\n } catch (error) {\r\n if (_myErrorsLogEnabled) {\r\n console.error(error);\r\n }\r\n\r\n eventSent = false;\r\n }\r\n\r\n return eventSent;\r\n}\r\n\r\nexport function sendEventOnce(eventName: string, params?: Record): boolean {\r\n let eventSent = false;\r\n\r\n if (_myAnalyticsEnabled) {\r\n if (!AnalyticsUtils.hasEventAlreadyBeenSent(eventName)) {\r\n eventSent = AnalyticsUtils.sendEvent(eventName, params);\r\n\r\n if (eventSent) {\r\n _myEventsSentOnce.pp_pushUnique(eventName);\r\n }\r\n }\r\n }\r\n\r\n return eventSent;\r\n}\r\n\r\nexport function sendEventWithValue(eventName: string, value: number): boolean {\r\n return AnalyticsUtils.sendEvent(eventName, { \"value\": value });\r\n}\r\n\r\nexport function sendEventOnceWithValue(eventName: string, value: number): boolean {\r\n return AnalyticsUtils.sendEventOnce(eventName, { \"value\": value });\r\n}\r\n\r\nexport function clearEventSentOnceState(eventName: string): void {\r\n _myEventsSentOnce.pp_removeEqual(eventName);\r\n}\r\n\r\nexport function clearAllEventsSentOnceState(): void {\r\n _myEventsSentOnce.pp_clear();\r\n}\r\n\r\nexport function hasEventAlreadyBeenSent(eventName: string): boolean {\r\n return _myEventsSentOnce.pp_hasEqual(eventName);\r\n}\r\n\r\nexport function getEventsAlreadyBeenSent(): string[] {\r\n return _myEventsSentOnce;\r\n}\r\n\r\nexport function setDataLogEnabled(enabled: boolean): void {\r\n _myDataLogEnabled = enabled;\r\n}\r\n\r\nexport function isDataLogEnabled(): boolean {\r\n return _myDataLogEnabled;\r\n}\r\n\r\nexport function setEventsLogEnabled(enabled: boolean): void {\r\n _myEventsLogEnabled = enabled;\r\n}\r\n\r\nexport function isEventsLogEnabled(): boolean {\r\n return _myEventsLogEnabled;\r\n}\r\n\r\nexport function setErrorsLogEnabled(enabled: boolean): void {\r\n _myErrorsLogEnabled = enabled;\r\n}\r\n\r\nexport function isErrorsLogEnabled(): boolean {\r\n return _myErrorsLogEnabled;\r\n}\r\n\r\nexport const AnalyticsUtils = {\r\n setAnalyticsEnabled,\r\n isAnalyticsEnabled,\r\n setSendDataCallback,\r\n sendData,\r\n sendEvent,\r\n sendEventOnce,\r\n sendEventWithValue,\r\n sendEventOnceWithValue,\r\n clearEventSentOnceState,\r\n clearAllEventsSentOnceState,\r\n hasEventAlreadyBeenSent,\r\n getEventsAlreadyBeenSent,\r\n setDataLogEnabled,\r\n isDataLogEnabled,\r\n setEventsLogEnabled,\r\n isEventsLogEnabled,\r\n setErrorsLogEnabled,\r\n isErrorsLogEnabled\r\n} as const;", "import { Material, MeshComponent, Object3D, TextComponent } from \"@wonderlandengine/api\";\r\nimport { vec4_create } from \"../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Vector4 } from \"../../type_definitions/array_type_definitions.js\";\r\nimport { FlatMaterial, PhongMaterial } from \"../type_definitions/material_type_definitions.js\";\r\n\r\nexport const setAlpha = function () {\r\n const color = vec4_create();\r\n return function setAlpha(material: Material, alpha: number): void {\r\n const flatMaterial = material as FlatMaterial;\r\n if (flatMaterial.color != null) {\r\n color.vec4_copy(flatMaterial.color);\r\n color[3] = alpha;\r\n flatMaterial.color = color;\r\n }\r\n\r\n const phongMaterial = material as PhongMaterial;\r\n if (phongMaterial.diffuseColor != null) {\r\n color.vec4_copy(phongMaterial.diffuseColor);\r\n color[3] = alpha;\r\n phongMaterial.diffuseColor = color;\r\n }\r\n\r\n if (phongMaterial.ambientColor != null) {\r\n color.vec4_copy(phongMaterial.ambientColor);\r\n color[3] = alpha;\r\n phongMaterial.ambientColor = color;\r\n }\r\n };\r\n}();\r\n\r\nexport function setObjectAlpha(object: Readonly, alpha: number): void {\r\n const meshComponents = object.pp_getComponents(MeshComponent);\r\n for (const meshComponent of meshComponents) {\r\n if (meshComponent.material != null) {\r\n MaterialUtils.setAlpha(meshComponent.material, alpha);\r\n }\r\n }\r\n\r\n const textComponents = object.pp_getComponents(TextComponent);\r\n for (const textComponent of textComponents) {\r\n if (textComponent.material != null) {\r\n MaterialUtils.setAlpha(textComponent.material, alpha);\r\n }\r\n }\r\n}\r\n\r\nexport function setObjectMaterial(object: Readonly, material: Material, cloneMaterial: boolean = false): void {\r\n const meshComponents = object.pp_getComponents(MeshComponent);\r\n for (const meshComponent of meshComponents) {\r\n if (cloneMaterial) {\r\n meshComponent.material = material.clone();\r\n } else {\r\n meshComponent.material = material;\r\n }\r\n }\r\n\r\n const textComponents = object.pp_getComponents(TextComponent);\r\n for (const textComponent of textComponents) {\r\n if (cloneMaterial) {\r\n textComponent.material = material.clone();\r\n } else {\r\n textComponent.material = material;\r\n }\r\n }\r\n}\r\n\r\nexport function setObjectClonedMaterials(object: Readonly): void {\r\n const meshComponents = object.pp_getComponents(MeshComponent);\r\n for (const meshComponent of meshComponents) {\r\n if (meshComponent.material != null) {\r\n meshComponent.material = meshComponent.material.clone();\r\n }\r\n }\r\n\r\n const textComponents = object.pp_getComponents(TextComponent);\r\n for (const textComponent of textComponents) {\r\n if (textComponent.material != null) {\r\n textComponent.material = textComponent.material.clone();\r\n }\r\n }\r\n}\r\n\r\nexport function setObjectSpecularColor(object: Readonly, color: Readonly): void {\r\n const meshComponents = object.pp_getComponents(MeshComponent);\r\n for (const meshComponent of meshComponents) {\r\n if (meshComponent.material != null) {\r\n const phongMaterial = meshComponent.material as PhongMaterial;\r\n if (phongMaterial.specularColor != null) {\r\n phongMaterial.specularColor = color;\r\n }\r\n }\r\n }\r\n\r\n const textComponents = object.pp_getComponents(TextComponent);\r\n for (const textComponent of textComponents) {\r\n if (textComponent.material != null) {\r\n const phongMaterial = textComponent.material as PhongMaterial;\r\n if (phongMaterial.specularColor != null) {\r\n phongMaterial.specularColor = color;\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport function setObjectFogColor(object: Readonly, color: Readonly): void {\r\n const meshComponents = object.pp_getComponents(MeshComponent);\r\n for (const meshComponent of meshComponents) {\r\n if (meshComponent.material != null) {\r\n const phongMaterial = meshComponent.material as PhongMaterial;\r\n if (phongMaterial.fogColor != null) {\r\n phongMaterial.fogColor = color;\r\n }\r\n }\r\n }\r\n\r\n const textComponents = object.pp_getComponents(TextComponent);\r\n for (const textComponent of textComponents) {\r\n if (textComponent.material != null) {\r\n const phongMaterial = textComponent.material as PhongMaterial;\r\n if (phongMaterial.fogColor != null) {\r\n phongMaterial.fogColor = color;\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport const MaterialUtils = {\r\n setAlpha,\r\n setObjectAlpha,\r\n setObjectMaterial,\r\n setObjectClonedMaterials,\r\n setObjectSpecularColor,\r\n setObjectFogColor\r\n} as const;", "import { TextComponent } from \"@wonderlandengine/api\";\r\n\r\nexport function setClonedMaterials(object) {\r\n let textComponents = object.pp_getComponents(TextComponent);\r\n\r\n for (let textComponent of textComponents) {\r\n if (textComponent.material != null) {\r\n textComponent.material = textComponent.material.clone();\r\n }\r\n }\r\n}\r\n\r\nexport let TextUtils = {\r\n setClonedMaterials\r\n};", "import { Component, Property } from \"@wonderlandengine/api\";\r\nimport { VisualTransform, VisualTransformParams } from \"../../cauldron/visual/elements/visual_transform.js\";\r\nimport { Globals } from \"../../pp/globals.js\";\r\n\r\nexport class DebugTransformComponent extends Component {\r\n static TypeName = \"pp-debug-transform\";\r\n static Properties = {\r\n _myLength: Property.float(0.1),\r\n _myThickness: Property.float(0.005)\r\n };\r\n\r\n start() {\r\n this._myStarted = false;\r\n }\r\n\r\n update(dt) {\r\n if (Globals.isDebugEnabled(this.engine)) {\r\n if (!this._myStarted) {\r\n this._myDebugVisualTransform = null;\r\n\r\n this._myDebugTransformParams = new VisualTransformParams(this.engine);\r\n this._myDebugTransformParams.myLength = this._myLength;\r\n this._myDebugTransformParams.myThickness = this._myThickness;\r\n\r\n this._myDebugVisualTransform = new VisualTransform(this._myDebugTransformParams);\r\n this._myDebugVisualTransform.setVisible(Globals.isDebugEnabled(this.engine));\r\n\r\n this._myStarted = true;\r\n } else {\r\n this.object.pp_getTransform(this._myDebugTransformParams.myTransform);\r\n this._myDebugVisualTransform.paramsUpdated();\r\n this._myDebugVisualTransform.setVisible(true);\r\n }\r\n }\r\n }\r\n\r\n onDeactivate() {\r\n if (this._myStarted) {\r\n this._myDebugVisualTransform.setVisible(false);\r\n }\r\n }\r\n\r\n onDestroy() {\r\n if (this._myStarted) {\r\n this._myDebugVisualTransform.destroy();\r\n }\r\n }\r\n}", "import { Alignment, Component, Property, VerticalAlignment } from \"@wonderlandengine/api\";\r\nimport { Timer } from \"../../cauldron/cauldron/timer.js\";\r\nimport { vec3_create, vec4_create } from \"../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Globals } from \"../../pp/globals.js\";\r\n\r\nexport class ShowFPSComponent extends Component {\r\n static TypeName = \"pp-show-fps\";\r\n static Properties = {\r\n _myRefreshSeconds: Property.float(0.25),\r\n _myScreenPositionX: Property.float(1),\r\n _myScreenPositionY: Property.float(-1),\r\n _myScreenPositionZ: Property.float(1),\r\n _myScale: Property.float(1.5),\r\n _myTextMaterial: Property.material()\r\n };\r\n\r\n start() {\r\n this._myColor = vec4_create(1, 1, 1, 1);\r\n if (this._myTextMaterial != null) {\r\n this._myColor.vec4_copy(this._myTextMaterial.color);\r\n }\r\n\r\n this._myScreenPosition = vec3_create(this._myScreenPositionX, this._myScreenPositionY, this._myScreenPositionZ);\r\n\r\n this._myCurrentFPS = 0;\r\n\r\n this._myTimer = new Timer(this._myRefreshSeconds);\r\n this._myTotalDT = 0;\r\n this._myFrames = 0;\r\n }\r\n\r\n update(dt) {\r\n if (Globals.isDebugEnabled(this.engine) && Globals.getDebugVisualManager(this.engine) != null) {\r\n this._myTotalDT += dt;\r\n this._myFrames++;\r\n\r\n this._myTimer.update(dt);\r\n if (this._myTimer.isDone()) {\r\n this._myTimer.start();\r\n\r\n this._myCurrentFPS = Math.round(this._myFrames / this._myTotalDT);\r\n\r\n this._myTotalDT = 0;\r\n this._myFrames = 0;\r\n }\r\n\r\n Globals.getDebugVisualManager(this.engine).drawUIText(0, this._myCurrentFPS.toFixed(0), this._myScreenPosition, this._myScale, this._myColor, Alignment.Right, VerticalAlignment.Bottom);\r\n }\r\n }\r\n}", "import { Component, property } from \"@wonderlandengine/api\";\r\nimport { Handedness } from \"../../input/cauldron/input_types.js\";\r\nimport { InputUtils } from \"../../input/cauldron/input_utils.js\";\r\nimport { GamepadButtonID } from \"../../input/gamepad/gamepad_buttons.js\";\r\nimport { Globals } from \"../../pp/globals.js\";\r\n\r\nexport class ToggleActiveOnButtonPressComponent extends Component {\r\n public static override TypeName = \"toggle-active-on-button-press\";\r\n\r\n @property.enum([\"Left\", \"Right\"], \"Left\")\r\n private _myHandedness!: number;\r\n\r\n @property.enum([\"Select\", \"Squeeze\", \"Thumstick\", \"Top Button\", \"Bottom Button\"], \"Bottom Button\")\r\n private _myButton!: number;\r\n\r\n @property.int(2)\r\n private _myMultiplePressCount!: number;\r\n\r\n private _myHandednessType!: Handedness;\r\n private _myButtonID!: GamepadButtonID;\r\n\r\n private _myActive: boolean = false;\r\n\r\n public override start(): void {\r\n this._myHandednessType = InputUtils.getHandednessByIndex(this._myHandedness)!;\r\n switch (this._myButton) {\r\n case 0:\r\n this._myButtonID = GamepadButtonID.SELECT;\r\n break;\r\n case 1:\r\n this._myButtonID = GamepadButtonID.SQUEEZE;\r\n break;\r\n case 2:\r\n this._myButtonID = GamepadButtonID.THUMBSTICK;\r\n break;\r\n case 3:\r\n this._myButtonID = GamepadButtonID.TOP_BUTTON;\r\n break;\r\n case 4:\r\n this._myButtonID = GamepadButtonID.BOTTOM_BUTTON;\r\n break;\r\n }\r\n\r\n const components = this.object.pp_getComponents();\r\n for (const component of components) {\r\n if (component.active) {\r\n this._myActive = true;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n public override update(dt: number): void {\r\n if (Globals.isDebugEnabled() && Globals.getGamepad(this._myHandednessType)!.getButtonInfo(this._myButtonID).isPressEnd(this._myMultiplePressCount > 0 ? this._myMultiplePressCount : null)) {\r\n this.object.pp_setActive(!this._myActive);\r\n this.active = true;\r\n\r\n this._myActive = !this._myActive;\r\n }\r\n }\r\n}\r\n", "// #TODO Add getter/setter accessors overwrite\r\n// #TODO If both a class and the parent class are in the list, they should be overwritten in parent first order\r\n// #TODO How to overwrite class and objects from modules?\r\n// #TODO Some functions, like glMatrix.vec3.copy, are defined as getter, how to overwrite them?\r\n\r\nimport { JSUtils } from \"../../cauldron/utils/js_utils.js\";\r\nimport { Globals } from \"../../pp/globals.js\";\r\n\r\nexport class DebugFunctionsOverwriterParams {\r\n\r\n constructor(engine = Globals.getMainEngine()) {\r\n this.myObjectsByReference = []; // You can specify to count the call on a specific object instance\r\n this.myObjectsByPath = []; // If you want you can specify the instance by path, but it means it must be reachable from window\r\n\r\n this.myClassesByReference = []; // By Reference means by using a reference to the class, like doing Timer, but also let ref = Timer and use ref\r\n this.myClassesByPath = []; // By Path means by using the full class path, like \"Timer\", this is requiredneeded if u want to count the constructor\r\n\r\n // You can also count the call to a specific function, but it must be reachable from window, no reference way\r\n // It's mostly for global functions, which could be tracked anyway using window as object reference\r\n this.myFunctionsByPath = [];\r\n\r\n this.myExcludeConstructors = false; // Constructor calls count can be a problem for some classes (like Array)\r\n this.myExcludeJSObjectFunctions = false;\r\n\r\n this.myFunctionNamesToInclude = []; // Empty means every function is included, can be a regex (. must be escaped with \\\\.)\r\n this.myFunctionNamesToExclude = []; // Empty means no function is excluded, can be a regex (. must be escaped with \\\\.)\r\n\r\n // These can be used if u want to have a bit more control on function name filtering\r\n this.myFunctionPathsToInclude = []; // Empty means every function is included, can be a regex (. must be escaped with \\\\.)\r\n this.myFunctionPathsToExclude = []; // Empty means no function is excluded, can be a regex (. must be escaped with \\\\.)\r\n\r\n this.myObjectAddObjectDescendantsDepthLevel = 0; // You can specify if you want to also count the OBJECT descendants of the objects you have specified\r\n this.myObjectAddClassDescendantsDepthLevel = 0; // You can specify if you want to also count the CLASS descendants of the objects you have specified\r\n // The depth level specify how deep in the hierarchy, level 0 means no recursion, 1 only children, 2 also grand children, and so on\r\n // -1 to select all the hierarchy\r\n\r\n // These filters are only useful if u are doing recursion\r\n this.myObjectNamesToInclude = []; // Empty means every object is included, can be a regex (. must be escaped with \\\\.)\r\n this.myObjectNamesToExclude = []; // Empty means no object is excluded, can be a regex (. must be escaped with \\\\.)\r\n\r\n this.myClassNamesToInclude = []; // Empty means every class is included, can be a regex (. must be escaped with \\\\.)\r\n this.myClassNamesToExclude = []; // Empty means no class is excluded, can be a regex (. must be escaped with \\\\.)\r\n\r\n this.myObjectPathsToInclude = []; // Empty means every object is included, can be a regex (. must be escaped with \\\\.)\r\n this.myObjectPathsToExclude = []; // Empty means no object is excluded, can be a regex (. must be escaped with \\\\.)\r\n\r\n this.myClassPathsToInclude = []; // Empty means every class is included, can be a regex (. must be escaped with \\\\.)\r\n this.myClassPathsToExclude = []; // Empty means no class is excluded, can be a regex (. must be escaped with \\\\.)\r\n\r\n // Tricks\r\n // - you can specify an object/class/function as a pair [object, \"name\"] instead of just object\r\n // and the name, if not null, will be used as path instead of the default one\r\n // WARNING: this means that there is a specific case, an array of 2 elements with a string, which can't be tracked if you don't put it inside an array like above\r\n\r\n this.myLogEnabled = false;\r\n\r\n this.myEngine = engine;\r\n }\r\n}\r\n\r\nexport class DebugFunctionsOverwriter {\r\n\r\n constructor(params = new DebugFunctionsOverwriterParams()) {\r\n this._myParams = params;\r\n\r\n this._myPropertiesAlreadyOverwritten = new Map();\r\n }\r\n\r\n overwriteFunctions() {\r\n let classesAndParents = this._getReferencesAndParents(this._myParams.myClassesByReference, this._myParams.myClassesByPath, true);\r\n let objectsAndParents = this._getReferencesAndParents(this._myParams.myObjectsByReference, this._myParams.myObjectsByPath, false);\r\n let functionsAndParents = this._getReferencesAndParents([], this._myParams.myFunctionsByPath, false);\r\n\r\n this._objectAddDescendants(objectsAndParents, classesAndParents);\r\n\r\n for (let referenceAndParent of classesAndParents) {\r\n let reference = referenceAndParent[0];\r\n let referenceParent = referenceAndParent[1];\r\n let referenceName = referenceAndParent[2];\r\n let referencePath = referenceAndParent[3];\r\n let referenceNameForFilter = referenceAndParent[4];\r\n\r\n this._overwriteReferenceFunctions(reference, referenceParent, referenceName, referencePath, referenceNameForFilter, true);\r\n }\r\n\r\n for (let referenceAndParent of objectsAndParents) {\r\n let reference = referenceAndParent[0];\r\n let referenceParent = referenceAndParent[1];\r\n let referenceName = referenceAndParent[2];\r\n let referencePath = referenceAndParent[3];\r\n let referenceNameForFilter = referenceAndParent[4];\r\n\r\n this._overwriteReferenceFunctions(reference, referenceParent, referenceName, referencePath, referenceNameForFilter, false);\r\n }\r\n\r\n for (let referenceAndParent of functionsAndParents) {\r\n let referenceParent = referenceAndParent[1];\r\n let referenceName = referenceAndParent[2];\r\n let referencePath = referenceAndParent[3];\r\n\r\n this._overwriteFunction(referenceParent, referenceName, null, null, referencePath, false, true);\r\n }\r\n }\r\n\r\n // Hooks\r\n\r\n _getOverwrittenFunction(reference, propertyName, referencePath, isClass, isFunction) {\r\n return JSUtils.getObjectProperty(reference, propertyName);\r\n }\r\n\r\n _getOverwrittenConstructor(reference, propertyName, referencePath, isClass, isFunction) {\r\n return JSUtils.getObjectProperty(reference, propertyName);\r\n }\r\n\r\n _onOverwriteSuccess(reference, propertyName, referenceParentForConstructor, referenceNameForConstructor, referencePath, isClass, isFunction, isConstructor) {\r\n\r\n }\r\n\r\n _onOverwriteFailure(reference, propertyName, referenceParentForConstructor, referenceNameForConstructor, referencePath, isClass, isFunction, isConstructor) {\r\n\r\n }\r\n\r\n // Hooks end\r\n\r\n _overwriteReferenceFunctions(reference, referenceParent, referenceName, referencePath, referenceNameForFilter, isClass) {\r\n let includePathList = this._myParams.myObjectPathsToInclude;\r\n let excludePathList = this._myParams.myObjectPathsToExclude;\r\n let includeNameList = this._myParams.myObjectNamesToInclude;\r\n let excludeNameList = this._myParams.myObjectNamesToExclude;\r\n if (isClass) {\r\n includePathList = this._myParams.myClassPathsToInclude;\r\n excludePathList = this._myParams.myClassPathsToExclude;\r\n includeNameList = this._myParams.myClassNamesToInclude;\r\n excludeNameList = this._myParams.myClassNamesToExclude;\r\n }\r\n\r\n let validReferencePath = this._filterName(referencePath, includePathList, excludePathList);\r\n let validReferenceName = this._filterName(referenceNameForFilter, includeNameList, excludeNameList);\r\n if (validReferencePath && validReferenceName) {\r\n let propertyNames = JSUtils.getObjectPropertyNames(reference);\r\n if (propertyNames.pp_hasEqual(\"constructor\")) {\r\n propertyNames.unshift(\"constructor\"); // Be sure it's added first to spot bugs, not important that it appears twice in the list\r\n }\r\n\r\n for (let propertyName of propertyNames) {\r\n let overwriteTargetReference = null;\r\n\r\n let referenceParentForConstructor = null;\r\n let referenceNameForConstructor = null;\r\n\r\n if (isClass) {\r\n let fixedReference = reference;\r\n\r\n if (referenceParent != null) {\r\n let ownReferenceDescriptor = Object.getOwnPropertyDescriptor(referenceParent, referenceName);\r\n if (ownReferenceDescriptor != null && ownReferenceDescriptor.value != null) {\r\n fixedReference = ownReferenceDescriptor.value;\r\n }\r\n }\r\n\r\n overwriteTargetReference = fixedReference.prototype;\r\n if (overwriteTargetReference == null) {\r\n overwriteTargetReference = fixedReference;\r\n } else {\r\n try {\r\n let referenceProperty = JSUtils.getObjectProperty(overwriteTargetReference, propertyName);\r\n if (referenceProperty == null) {\r\n overwriteTargetReference = fixedReference;\r\n }\r\n } catch (error) {\r\n overwriteTargetReference = fixedReference;\r\n }\r\n }\r\n\r\n referenceParentForConstructor = referenceParent;\r\n referenceNameForConstructor = referenceName;\r\n } else {\r\n overwriteTargetReference = reference;\r\n }\r\n\r\n this._overwriteFunction(overwriteTargetReference, propertyName, referenceParentForConstructor, referenceNameForConstructor, referencePath, isClass, false);\r\n\r\n }\r\n }\r\n }\r\n\r\n _overwriteFunction(reference, propertyName, referenceParentForConstructor, referenceNameForConstructor, referencePath, isClass, isFunction) {\r\n try {\r\n let propertyCountedAlready = this._myPropertiesAlreadyOverwritten.get(propertyName) != null && this._myPropertiesAlreadyOverwritten.get(propertyName).pp_hasEqual(reference);\r\n if (!propertyCountedAlready) {\r\n if (JSUtils.isFunctionByName(reference, propertyName) || (propertyName == \"constructor\" && JSUtils.isClassByName(reference, propertyName))) {\r\n if (!this._myParams.myExcludeJSObjectFunctions || !this._isJSObjectFunction(propertyName)) {\r\n let validFunctionName = this._filterName(propertyName, this._myParams.myFunctionNamesToInclude, this._myParams.myFunctionNamesToExclude);\r\n let validFunctionPath = this._filterName((referencePath != null ? referencePath + \".\" : \"\") + propertyName, this._myParams.myFunctionPathsToInclude, this._myParams.myFunctionPathsToExclude);\r\n if (validFunctionName && validFunctionPath) {\r\n if (!this._myPropertiesAlreadyOverwritten.has(propertyName)) {\r\n this._myPropertiesAlreadyOverwritten.set(propertyName, []);\r\n }\r\n\r\n let overwriteSuccess = false;\r\n let isConstructor = false;\r\n if (propertyName != \"constructor\") {\r\n try {\r\n let newFunction = this._getOverwrittenFunction(reference, propertyName, referencePath, isClass, isFunction);\r\n if (newFunction != JSUtils.getObjectProperty(reference, propertyName)) {\r\n overwriteSuccess = JSUtils.overwriteObjectProperty(newFunction, reference, propertyName, false, true, this._myParams.myLogEnabled);\r\n } else {\r\n overwriteSuccess = true;\r\n }\r\n } catch (error) {\r\n overwriteSuccess = false;\r\n\r\n if (this._myParams.myLogEnabled) {\r\n console.error(error);\r\n }\r\n }\r\n } else if (!this._myParams.myExcludeConstructors && isClass && referenceParentForConstructor != null) {\r\n let referenceForConstructor = JSUtils.getObjectProperty(referenceParentForConstructor, referenceNameForConstructor);\r\n if (referenceForConstructor != null && referenceForConstructor.prototype != null) {\r\n isConstructor = true;\r\n\r\n try {\r\n let newConstructor = this._getOverwrittenConstructor(referenceParentForConstructor, referenceNameForConstructor, referencePath, isClass, isFunction);\r\n if (newConstructor != referenceForConstructor) {\r\n overwriteSuccess = JSUtils.overwriteObjectProperty(newConstructor, referenceParentForConstructor, referenceNameForConstructor, false, true, this._myParams.myLogEnabled);\r\n if (overwriteSuccess) {\r\n overwriteSuccess = JSUtils.overwriteObjectProperty(newConstructor, referenceForConstructor.prototype, propertyName, false, true, this._myParams.myLogEnabled);\r\n }\r\n } else {\r\n overwriteSuccess = true;\r\n }\r\n } catch (error) {\r\n overwriteSuccess = false;\r\n\r\n if (this._myParams.myLogEnabled) {\r\n console.error(error);\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (overwriteSuccess) {\r\n this._myPropertiesAlreadyOverwritten.get(propertyName).push(reference);\r\n this._onOverwriteSuccess(reference, propertyName, referenceParentForConstructor, referenceNameForConstructor, referencePath, isClass, isFunction, isConstructor);\r\n } else {\r\n this._onOverwriteFailure(reference, propertyName, referenceParentForConstructor, referenceNameForConstructor, referencePath, isClass, isFunction, isConstructor);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n } catch (error) {\r\n if (this._myParams.myLogEnabled) {\r\n console.error(error);\r\n }\r\n }\r\n }\r\n\r\n _getReferencesAndParents(byReferenceList, byPathList, isClass) {\r\n let referenceAndParents = [];\r\n\r\n let equalCallback = (first, second) => first[0] == second[0];\r\n\r\n for (let pathPair of byPathList) {\r\n let path = pathPair;\r\n let referenceName = \"\";\r\n let referencePath = pathPair;\r\n let referenceNameForFilter = \"\";\r\n\r\n if (pathPair != null && Array.isArray(pathPair) && pathPair.length != null && pathPair.length == 2 && typeof pathPair[1] == \"string\") {\r\n path = pathPair[0];\r\n referencePath = pathPair[1];\r\n }\r\n\r\n referenceName = JSUtils.getObjectNameFromPath(path);\r\n referenceNameForFilter = JSUtils.getObjectNameFromPath(referencePath);\r\n\r\n let reference = JSUtils.getObjectFromPath(path, window);\r\n let referenceParent = JSUtils.getObjectParentFromPath(path, window);\r\n\r\n if (reference != null) {\r\n referenceAndParents.pp_pushUnique([reference, referenceParent, referenceName, referencePath, referenceNameForFilter], equalCallback);\r\n }\r\n }\r\n\r\n for (let referencePair of byReferenceList) {\r\n let reference = referencePair;\r\n let referenceName = \"\";\r\n let referencePath = \"\";\r\n let referenceNameForFilter = \"\";\r\n\r\n if (referencePair != null && referencePair.length != null && referencePair.length == 2 && typeof referencePair[1] == \"string\") {\r\n reference = referencePair[0];\r\n referencePath = referencePair[1];\r\n referenceNameForFilter = JSUtils.getObjectNameFromPath(referencePath);\r\n } else {\r\n referencePath = isClass ? reference.name : null;\r\n referenceNameForFilter = isClass ? reference.name : null;\r\n }\r\n\r\n if (isClass) {\r\n referenceName = reference.name;\r\n } else {\r\n referenceName = JSUtils.getObjectNameFromPath(referencePath);\r\n }\r\n\r\n if (reference != null) {\r\n referenceAndParents.pp_pushUnique([reference, null, referenceName, referencePath, referenceNameForFilter], equalCallback);\r\n }\r\n }\r\n\r\n return referenceAndParents;\r\n }\r\n\r\n _objectAddDescendants(objectsAndParents, classesAndParents) {\r\n let equalCallback = (first, second) => first[0] == second[0];\r\n\r\n let objectsToVisit = [];\r\n for (let objectAndParent of objectsAndParents) {\r\n objectsToVisit.pp_pushUnique([objectAndParent[0], 0, objectAndParent[3]], equalCallback);\r\n }\r\n\r\n while (objectsToVisit.length > 0) {\r\n let objectToVisit = objectsToVisit.shift();\r\n\r\n let object = objectToVisit[0];\r\n let objectLevel = objectToVisit[1];\r\n let objectPath = objectToVisit[2];\r\n\r\n if ((\r\n objectLevel + 1 <= this._myParams.myObjectAddObjectDescendantsDepthLevel || this._myParams.myObjectAddObjectDescendantsDepthLevel == -1) ||\r\n objectLevel + 1 <= this._myParams.myObjectAddClassDescendantsDepthLevel || this._myParams.myObjectAddClassDescendantsDepthLevel == -1) {\r\n\r\n let propertyNames = null;\r\n try {\r\n propertyNames = JSUtils.getObjectPropertyNames(object);\r\n } catch (error) {\r\n continue;\r\n }\r\n\r\n for (let propertyName of propertyNames) {\r\n let objectProperty = null;\r\n\r\n try {\r\n objectProperty = JSUtils.getObjectProperty(object, propertyName);\r\n if (objectProperty == null) {\r\n continue;\r\n }\r\n } catch (error) {\r\n continue;\r\n }\r\n\r\n let currentPath = \"\";\r\n let currentName = \"\";\r\n if (objectPath != null) {\r\n currentName = propertyName;\r\n currentPath = objectPath + \".\" + currentName;\r\n } else {\r\n currentName = propertyName;\r\n currentPath = currentName;\r\n }\r\n\r\n let isClass = JSUtils.isClassByName(object, propertyName);\r\n let isObject = JSUtils.isObjectByName(object, propertyName);\r\n\r\n let includePathList = this._myParams.myObjectPathsToInclude;\r\n let excludePathList = this._myParams.myObjectPathsToExclude;\r\n let includeNameList = this._myParams.myObjectNamesToInclude;\r\n let excludeNameList = this._myParams.myObjectNamesToExclude;\r\n if (isClass) {\r\n includePathList = this._myParams.myClassPathsToInclude;\r\n excludePathList = this._myParams.myClassPathsToExclude;\r\n includeNameList = this._myParams.myClassNamesToInclude;\r\n excludeNameList = this._myParams.myClassNamesToExclude;\r\n }\r\n\r\n let validReferencePath = this._filterName(currentPath, includePathList, excludePathList);\r\n let validReferenceName = this._filterName(propertyName, includeNameList, excludeNameList);\r\n if (validReferencePath && validReferenceName) {\r\n if (isObject && (objectLevel + 1 <= this._myParams.myObjectAddObjectDescendantsDepthLevel || this._myParams.myObjectAddObjectDescendantsDepthLevel == -1)) {\r\n objectsAndParents.pp_pushUnique([objectProperty, object, propertyName, currentPath, currentName], equalCallback);\r\n }\r\n\r\n if (isClass && propertyName != \"constructor\" && (objectLevel + 1 <= this._myParams.myObjectAddClassDescendantsDepthLevel || this._myParams.myObjectAddClassDescendantsDepthLevel == -1)) {\r\n classesAndParents.pp_pushUnique([objectProperty, object, propertyName, currentPath, currentName], equalCallback);\r\n }\r\n\r\n if (isObject) {\r\n objectsToVisit.pp_pushUnique([objectProperty, objectLevel + 1, currentPath], equalCallback);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n _filterName(name, includeList, excludeList) {\r\n let validName = includeList.length == 0;\r\n for (let includeName of includeList) {\r\n if (name.match(includeName) != null) {\r\n validName = true;\r\n break;\r\n }\r\n }\r\n\r\n if (validName) {\r\n for (let excludeName of excludeList) {\r\n if (name.match(excludeName) != null) {\r\n validName = false;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return validName;\r\n }\r\n\r\n _isJSObjectFunction(propertyName) {\r\n // Implemented outside class definition\r\n }\r\n}\r\n\r\n\r\n\r\n// IMPLEMENTATION\r\n\r\nDebugFunctionsOverwriter.prototype._isJSObjectFunction = function () {\r\n let jsObjectFunctions = [\r\n \"__defineGetter__\", \"__defineSetter__\", \"hasOwnProperty\", \"__lookupGetter__\", \"__lookupSetter__\", \"isPrototypeOf\",\r\n \"propertyIsEnumerable\", \"toString\", \"valueOf\", \"__proto__\", \"toLocaleString\", \"arguments\", \"caller\", \"apply\", \"bind\", \"call\", \"callee\"];\r\n return function _isJSObjectFunction(propertyName) {\r\n return jsObjectFunctions.pp_hasEqual(propertyName);\r\n };\r\n}();", "import { JSUtils } from \"../../../cauldron/utils/js_utils.js\";\r\nimport { DebugFunctionsOverwriter, DebugFunctionsOverwriterParams } from \"../debug_functions_overwriter.js\";\r\n\r\nexport class DebugFunctionsPerformanceAnalyzerParams extends DebugFunctionsOverwriterParams {\r\n\r\n constructor() {\r\n super();\r\n\r\n this.myExecutionTimeAnalysisEnabled = true;\r\n\r\n this.myAddPathPrefixToFunctionID = true;\r\n // This works at best when the object/class is specified as path\r\n // since with reference it's not possible to get the full path or get the variable name of the reference\r\n\r\n this.myFilterDebugFunctionsPerformanceAnalyzerClasses = true;\r\n }\r\n}\r\n\r\nexport class DebugFunctionPerformanceAnalysisResults {\r\n\r\n constructor() {\r\n this.myReference = null;\r\n this.myName = \"\";\r\n this.myPath = \"\";\r\n this.myID = \"\";\r\n\r\n this.myCallsCount = 0;\r\n this.myTotalExecutionTime = 0;\r\n this.myTotalExecutionTimePercentage = 0;\r\n this.myAverageExecutionTime = 0;\r\n this.myTimeElapsedSinceLastReset = 0;\r\n\r\n this._myTotalExecutionTimeInternal = 0;\r\n }\r\n\r\n reset() {\r\n this.myCallsCount = 0;\r\n this.myTotalExecutionTime = 0;\r\n this.myTotalExecutionTimePercentage = 0;\r\n this.myAverageExecutionTime = 0;\r\n this.myTimeElapsedSinceLastReset = 0;\r\n\r\n this._myTotalExecutionTimeInternal = 0;\r\n }\r\n\r\n max(other) {\r\n this.myCallsCount = Math.max(this.myCallsCount, other.myCallsCount);\r\n this.myTotalExecutionTime = Math.max(this.myTotalExecutionTime, other.myTotalExecutionTime);\r\n this.myTotalExecutionTimePercentage = Math.max(this.myTotalExecutionTimePercentage, other.myTotalExecutionTimePercentage);\r\n this.myAverageExecutionTime = Math.max(this.myAverageExecutionTime, other.myAverageExecutionTime);\r\n }\r\n\r\n copy(other) {\r\n this.myReference = other.myReference;\r\n this.myName = other.myName;\r\n this.myPath = other.myPath;\r\n this.myID = other.myID;\r\n\r\n this.myCallsCount = other.myCallsCount;\r\n this.myTotalExecutionTime = other.myTotalExecutionTime;\r\n this.myTotalExecutionTimePercentage = other.myTotalExecutionTimePercentage;\r\n this.myAverageExecutionTime = other.myAverageExecutionTime;\r\n this.myTimeElapsedSinceLastReset = other.myTimeElapsedSinceLastReset;\r\n\r\n this._myTotalExecutionTimeInternal = other._myTotalExecutionTimeInternal;\r\n }\r\n}\r\n\r\nexport let DebugFunctionsPerformanceAnalyzerSortOrder = {\r\n NONE: 0,\r\n CALLS_COUNT: 1,\r\n TOTAL_EXECUTION_TIME: 2,\r\n AVERAGE_EXECUTION_TIME: 3\r\n};\r\n\r\nexport class DebugFunctionsPerformanceAnalyzer extends DebugFunctionsOverwriter {\r\n\r\n constructor(params = new DebugFunctionsPerformanceAnalyzerParams()) {\r\n super(params);\r\n\r\n this._myFunctionPerformanceAnalysisResults = new Map();\r\n this._myFunctionPerformanceAnalysisMaxResults = new Map();\r\n\r\n this._myResultsAlreadyAdded = false;\r\n\r\n this._myExecutionTimes = {\r\n myOverheadExecutionTimeSinceLastReset: 0,\r\n myLastFunctionExecutionTime: 0,\r\n myOriginalFunctionOverheadExecutionTimes: []\r\n };\r\n this._myTimeOfLastReset = window.performance.now();\r\n this._myMaxTimeElapsedSinceLastReset = 0;\r\n\r\n let originalPush = Array.prototype[\"push\"];\r\n let originalPop = Array.prototype[\"pop\"];\r\n this._myExecutionTimes.myOriginalFunctionOverheadExecutionTimes.push = function () { return originalPush.bind(this)(...arguments); };\r\n this._myExecutionTimes.myOriginalFunctionOverheadExecutionTimes.pop = function () { return originalPop.bind(this)(...arguments); };\r\n }\r\n\r\n overwriteFunctions() {\r\n super.overwriteFunctions();\r\n\r\n this.resetResults();\r\n this.resetMaxResults();\r\n }\r\n\r\n getTimeElapsedSinceLastReset() {\r\n return window.performance.now() - this._myTimeOfLastReset - this._myExecutionTimes.myOverheadExecutionTimeSinceLastReset;\r\n }\r\n\r\n getMaxTimeElapsedSinceLastReset() {\r\n this._myMaxTimeElapsedSinceLastReset = Math.max(this._myMaxTimeElapsedSinceLastReset, this.getTimeElapsedSinceLastReset());\r\n return this._myMaxTimeElapsedSinceLastReset;\r\n }\r\n\r\n resetResults() {\r\n this._updateDerivatesResults();\r\n this._updateMaxResults();\r\n\r\n for (let property of this._myFunctionPerformanceAnalysisResults.keys()) {\r\n this._myFunctionPerformanceAnalysisResults.get(property).reset();\r\n }\r\n\r\n this._myExecutionTimes.myOverheadExecutionTimeSinceLastReset = 0;\r\n\r\n this._myTimeOfLastReset = window.performance.now();\r\n }\r\n\r\n resetMaxResults() {\r\n this._myMaxTimeElapsedSinceLastReset = 0;\r\n for (let property of this._myFunctionPerformanceAnalysisMaxResults.keys()) {\r\n this._myFunctionPerformanceAnalysisMaxResults.get(property).reset();\r\n }\r\n }\r\n\r\n getResults(sortOrder = DebugFunctionsPerformanceAnalyzerSortOrder.NONE) {\r\n this._updateDerivatesResults();\r\n this._updateMaxResults();\r\n\r\n let results = this._myFunctionPerformanceAnalysisResults;\r\n results = this._sortResults(results, sortOrder);\r\n return results;\r\n }\r\n\r\n getMaxResults(sortOrder = DebugFunctionsPerformanceAnalyzerSortOrder.NONE) {\r\n this._updateDerivatesResults();\r\n this._updateMaxResults();\r\n\r\n let results = this._myFunctionPerformanceAnalysisMaxResults;\r\n results = this._sortResults(results, sortOrder);\r\n return results;\r\n }\r\n\r\n _getOverwrittenFunction(reference, propertyName, referencePath, isClass, isFunction) {\r\n return this._getOverwrittenFunctionInternal(reference, propertyName, referencePath, isClass, isFunction, false);\r\n }\r\n\r\n _getOverwrittenConstructor(reference, propertyName, referencePath, isClass, isFunction) {\r\n return this._getOverwrittenFunctionInternal(reference, propertyName, referencePath, isClass, isFunction, true);\r\n }\r\n\r\n _onOverwriteSuccess(reference, propertyName, referenceParentForConstructor, referenceNameForConstructor, referencePath, isClass, isFunction, isConstructor) {\r\n this._myResultsAlreadyAdded = false;\r\n }\r\n\r\n _onOverwriteFailure(reference, propertyName, referenceParentForConstructor, referenceNameForConstructor, referencePath, isClass, isFunction, isConstructor) {\r\n if (this._myResultsAlreadyAdded) {\r\n let propertyID = this._getPropertyID(propertyName, referencePath, isFunction, isConstructor);\r\n this._myFunctionPerformanceAnalysisResults.delete(propertyID);\r\n }\r\n }\r\n\r\n _sortResults(results, sortOrder) {\r\n let sortedResults = results;\r\n\r\n if (sortOrder != DebugFunctionsPerformanceAnalyzerSortOrder.NONE) {\r\n sortedResults = new Map([...results.entries()].sort(function (first, second) {\r\n let sortResult = 0;\r\n\r\n if (sortOrder == DebugFunctionsPerformanceAnalyzerSortOrder.CALLS_COUNT) {\r\n sortResult = -(first[1].myCallsCount - second[1].myCallsCount);\r\n if (sortResult == 0) {\r\n sortResult = -(first[1].myTotalExecutionTime - second[1].myTotalExecutionTime);\r\n if (sortResult == 0) {\r\n sortResult = -(first[1].myAverageExecutionTime - second[1].myAverageExecutionTime);\r\n }\r\n }\r\n } else if (sortOrder == DebugFunctionsPerformanceAnalyzerSortOrder.TOTAL_EXECUTION_TIME) {\r\n sortResult = -(first[1].myTotalExecutionTime - second[1].myTotalExecutionTime);\r\n if (sortResult == 0) {\r\n sortResult = -(first[1].myAverageExecutionTime - second[1].myAverageExecutionTime);\r\n if (sortResult == 0) {\r\n sortResult = -(first[1].myCallsCount - second[1].myCallsCount);\r\n }\r\n }\r\n } else {\r\n sortResult = -(first[1].myAverageExecutionTime - second[1].myAverageExecutionTime);\r\n if (sortResult == 0) {\r\n sortResult = -(first[1].myTotalExecutionTime - second[1].myTotalExecutionTime);\r\n if (sortResult == 0) {\r\n sortResult = -(first[1].myCallsCount - second[1].myCallsCount);\r\n }\r\n }\r\n }\r\n\r\n return sortResult;\r\n }));\r\n }\r\n\r\n return sortedResults;\r\n }\r\n\r\n _getPropertyID(propertyName, referencePath, isFunction, isConstructor) {\r\n let id = isConstructor ? \"constructor\" : propertyName;\r\n\r\n if (referencePath != null && this._myParams.myAddPathPrefixToFunctionID) {\r\n if (!isFunction) {\r\n id = referencePath + \".\" + id;\r\n } else {\r\n id = referencePath;\r\n }\r\n }\r\n\r\n return id;\r\n }\r\n\r\n _updateDerivatesResults() {\r\n let timeElapsedSinceLastReset = this.getTimeElapsedSinceLastReset();\r\n let beforeTime = window.performance.now();\r\n\r\n for (let property of this._myFunctionPerformanceAnalysisResults.keys()) {\r\n let results = this._myFunctionPerformanceAnalysisResults.get(property);\r\n\r\n if (timeElapsedSinceLastReset != 0) {\r\n results.myTotalExecutionTimePercentage = results.myTotalExecutionTime / timeElapsedSinceLastReset;\r\n } else {\r\n if (results.myCallsCount != 0) {\r\n results.myTotalExecutionTimePercentage = 1;\r\n } else {\r\n results.myTotalExecutionTimePercentage = 0;\r\n }\r\n }\r\n\r\n if (results.myCallsCount != 0) {\r\n results.myAverageExecutionTime = results.myTotalExecutionTime / results.myCallsCount;\r\n } else {\r\n results.myAverageExecutionTime = 0;\r\n }\r\n\r\n results.myTimeElapsedSinceLastReset = timeElapsedSinceLastReset;\r\n }\r\n\r\n this._myExecutionTimes.myOverheadExecutionTimeSinceLastReset += window.performance.now() - beforeTime;\r\n }\r\n\r\n _updateMaxResults() {\r\n let beforeTime = window.performance.now();\r\n\r\n this._myMaxTimeElapsedSinceLastReset = Math.max(this._myMaxTimeElapsedSinceLastReset, this.getTimeElapsedSinceLastReset());\r\n\r\n for (let property of this._myFunctionPerformanceAnalysisResults.keys()) {\r\n if (this._myFunctionPerformanceAnalysisMaxResults.has(property)) {\r\n this._myFunctionPerformanceAnalysisMaxResults.get(property).max(this._myFunctionPerformanceAnalysisResults.get(property));\r\n } else {\r\n let maxResults = new DebugFunctionPerformanceAnalysisResults();\r\n maxResults.copy(this._myFunctionPerformanceAnalysisResults.get(property));\r\n this._myFunctionPerformanceAnalysisMaxResults.set(property, maxResults);\r\n }\r\n }\r\n\r\n this._myExecutionTimes.myOverheadExecutionTimeSinceLastReset += window.performance.now() - beforeTime;\r\n }\r\n\r\n _getOverwrittenFunctionInternal(reference, propertyName, referencePath, isClass, isFunction, isConstructor) {\r\n let newFunction = JSUtils.getObjectProperty(reference, propertyName);\r\n\r\n if (!this._myParams.myFilterDebugFunctionsPerformanceAnalyzerClasses || !this._isPerformanceAnalyzer(reference, propertyName, isClass)) {\r\n if (propertyName != \"_myPerformanceAnalyzerOriginalFunction\") {\r\n let propertyID = this._getPropertyID(propertyName, referencePath, isFunction, isConstructor);\r\n\r\n this._myResultsAlreadyAdded = this._myFunctionPerformanceAnalysisResults.has(propertyID);\r\n let analysisResults = new DebugFunctionPerformanceAnalysisResults();\r\n\r\n analysisResults.myReference = reference;\r\n analysisResults.myName = propertyName;\r\n analysisResults.myPath = referencePath;\r\n analysisResults.myID = referencePath;\r\n\r\n this._myFunctionPerformanceAnalysisResults.set(propertyID, analysisResults);\r\n\r\n try {\r\n let functionPerformanceAnalysisResults = this._myFunctionPerformanceAnalysisResults.get(propertyID);\r\n let executionTimes = this._myExecutionTimes;\r\n\r\n let originalFunction = reference[propertyName];\r\n let functionCallOverhead = 0.000175; // ms taken by an analyzed function that is empty\r\n let overheadError = 0.00035; // ms to add to adjust a bit for window.performance.now() max precision which is 0.0005\r\n\r\n let executionTimeAnalysisEnabled = this._myParams.myExecutionTimeAnalysisEnabled;\r\n\r\n if (!isConstructor) {\r\n newFunction = function () {\r\n let startTime = window.performance.now();\r\n\r\n let errorToThrow = null;\r\n let returnValue = undefined;\r\n let boundOriginalFunction = null;\r\n let startOriginalFunctionTime = 0;\r\n let endOriginalFunctionTime = 0;\r\n let originalFunctionOverheadExecutionTime = 0;\r\n let executionTimeToAdjust = 0;\r\n let executionTime = 0;\r\n let beforeOverhead = 0;\r\n let inBetweenOverhead = 0;\r\n\r\n if (executionTimeAnalysisEnabled) {\r\n executionTimes.myOriginalFunctionOverheadExecutionTimes.push(0);\r\n\r\n startOriginalFunctionTime = window.performance.now();\r\n endOriginalFunctionTime = window.performance.now();\r\n\r\n try {\r\n boundOriginalFunction = originalFunction.bind(this);\r\n startOriginalFunctionTime = window.performance.now();\r\n returnValue = boundOriginalFunction(...arguments);\r\n endOriginalFunctionTime = window.performance.now();\r\n } catch (error) {\r\n endOriginalFunctionTime = window.performance.now();\r\n errorToThrow = error;\r\n }\r\n } else {\r\n try {\r\n boundOriginalFunction = originalFunction.bind(this);\r\n returnValue = boundOriginalFunction(...arguments);\r\n } catch (error) {\r\n errorToThrow = error;\r\n }\r\n }\r\n\r\n functionPerformanceAnalysisResults.myCallsCount += 1;\r\n\r\n if (executionTimeAnalysisEnabled) {\r\n originalFunctionOverheadExecutionTime = executionTimes.myOriginalFunctionOverheadExecutionTimes.pop();\r\n\r\n executionTimeToAdjust = endOriginalFunctionTime - startOriginalFunctionTime - originalFunctionOverheadExecutionTime;\r\n executionTime = executionTimeToAdjust - functionCallOverhead;\r\n if (originalFunction._myPerformanceAnalyzerHasBeenOverwritten) {\r\n executionTime = executionTimes.myLastFunctionExecutionTime;\r\n }\r\n\r\n functionPerformanceAnalysisResults._myTotalExecutionTimeInternal += executionTime;\r\n functionPerformanceAnalysisResults.myTotalExecutionTime = Math.max(0, functionPerformanceAnalysisResults._myTotalExecutionTimeInternal);\r\n\r\n executionTimes.myLastFunctionExecutionTime = executionTime;\r\n\r\n beforeOverhead = startOriginalFunctionTime - startTime;\r\n inBetweenOverhead = beforeOverhead - endOriginalFunctionTime - overheadError;\r\n if (executionTimes.myOriginalFunctionOverheadExecutionTimes.length > 0) {\r\n executionTimes.myOriginalFunctionOverheadExecutionTimes[executionTimes.myOriginalFunctionOverheadExecutionTimes.length - 1] +=\r\n inBetweenOverhead + originalFunctionOverheadExecutionTime + overheadError * 2.75;\r\n executionTimes.myOriginalFunctionOverheadExecutionTimes[executionTimes.myOriginalFunctionOverheadExecutionTimes.length - 1] +=\r\n window.performance.now();\r\n }\r\n\r\n executionTimes.myOverheadExecutionTimeSinceLastReset += inBetweenOverhead;\r\n executionTimes.myOverheadExecutionTimeSinceLastReset += window.performance.now();\r\n }\r\n\r\n if (errorToThrow != null) {\r\n throw errorToThrow;\r\n }\r\n\r\n return returnValue;\r\n };\r\n } else {\r\n newFunction = function () {\r\n let startTime = window.performance.now();\r\n\r\n let errorToThrow = null;\r\n let returnValue = undefined;\r\n let startOriginalFunctionTime = 0;\r\n let endOriginalFunctionTime = 0;\r\n let originalFunctionOverheadExecutionTime = 0;\r\n let executionTimeToAdjust = 0;\r\n let executionTime = 0;\r\n let beforeOverhead = 0;\r\n let inBetweenOverhead = 0;\r\n\r\n if (executionTimeAnalysisEnabled) {\r\n executionTimes.myOriginalFunctionOverheadExecutionTimes.push(0);\r\n\r\n startOriginalFunctionTime = window.performance.now();\r\n endOriginalFunctionTime = window.performance.now();\r\n\r\n try {\r\n startOriginalFunctionTime = window.performance.now();\r\n returnValue = new originalFunction(...arguments);\r\n endOriginalFunctionTime = window.performance.now();\r\n } catch (error) {\r\n endOriginalFunctionTime = window.performance.now();\r\n errorToThrow = error;\r\n }\r\n } else {\r\n try {\r\n returnValue = new originalFunction(...arguments);\r\n } catch (error) {\r\n errorToThrow = error;\r\n }\r\n }\r\n\r\n functionPerformanceAnalysisResults.myCallsCount += 1;\r\n\r\n if (executionTimeAnalysisEnabled) {\r\n originalFunctionOverheadExecutionTime = executionTimes.myOriginalFunctionOverheadExecutionTimes.pop();\r\n\r\n executionTimeToAdjust = endOriginalFunctionTime - startOriginalFunctionTime - originalFunctionOverheadExecutionTime;\r\n executionTime = executionTimeToAdjust - functionCallOverhead;\r\n if (originalFunction._myPerformanceAnalyzerHasBeenOverwritten) {\r\n executionTime = executionTimes.myLastFunctionExecutionTime;\r\n }\r\n\r\n functionPerformanceAnalysisResults._myTotalExecutionTimeInternal += executionTime;\r\n functionPerformanceAnalysisResults.myTotalExecutionTime = Math.max(0, functionPerformanceAnalysisResults._myTotalExecutionTimeInternal);\r\n\r\n executionTimes.myLastFunctionExecutionTime = executionTime;\r\n\r\n beforeOverhead = startOriginalFunctionTime - startTime;\r\n inBetweenOverhead = beforeOverhead - endOriginalFunctionTime - overheadError;\r\n if (executionTimes.myOriginalFunctionOverheadExecutionTimes.length > 0) {\r\n executionTimes.myOriginalFunctionOverheadExecutionTimes[executionTimes.myOriginalFunctionOverheadExecutionTimes.length - 1] +=\r\n inBetweenOverhead + originalFunctionOverheadExecutionTime + overheadError * 2.75;\r\n executionTimes.myOriginalFunctionOverheadExecutionTimes[executionTimes.myOriginalFunctionOverheadExecutionTimes.length - 1] +=\r\n window.performance.now();\r\n }\r\n\r\n executionTimes.myOverheadExecutionTimeSinceLastReset += inBetweenOverhead;\r\n executionTimes.myOverheadExecutionTimeSinceLastReset += window.performance.now();\r\n }\r\n\r\n if (errorToThrow != null) {\r\n throw errorToThrow;\r\n }\r\n\r\n return returnValue;\r\n };\r\n }\r\n\r\n if (newFunction != null) {\r\n Object.defineProperty(newFunction, \"_myPerformanceAnalyzerHasBeenOverwritten\", {\r\n value: true,\r\n enumerable: false,\r\n configurable: false,\r\n writable: false\r\n });\r\n\r\n Object.defineProperty(newFunction, \"_myPerformanceAnalyzerOriginalFunction\", {\r\n value: originalFunction,\r\n enumerable: false,\r\n configurable: false,\r\n writable: false\r\n });\r\n }\r\n } catch (error) {\r\n if (this._myParams.myLogEnabled) {\r\n console.error(\"Function:\", propertyName, \"of:\", reference, \"can't be overwritten.\\nError:\", error);\r\n }\r\n }\r\n }\r\n }\r\n\r\n return newFunction;\r\n }\r\n\r\n _isPerformanceAnalyzer(reference, propertyName, isClass) {\r\n let isPerformanceAnalyzer = false;\r\n\r\n if (isClass) {\r\n if (reference == DebugFunctionsPerformanceAnalyzer.prototype || reference == DebugFunctionPerformanceAnalysisResults.prototype) {\r\n isPerformanceAnalyzer = true;\r\n }\r\n }\r\n\r\n return isPerformanceAnalyzer;\r\n }\r\n}", "import { Timer } from \"../../../cauldron/cauldron/timer.js\";\r\nimport { DebugFunctionsPerformanceAnalyzerSortOrder } from \"./debug_functions_performance_analyzer.js\";\r\n\r\nexport class DebugFunctionsPerformanceAnalysisResultsLoggerParams {\r\n\r\n constructor() {\r\n this.myPerformanceAnalyzer = null;\r\n\r\n this.myLogTitle = \"Functions Performance Analysis Results\";\r\n this.mySecondsBetweenLogs = 1;\r\n this.myLogFunction = \"log\";\r\n\r\n this.myFormatLog = true;\r\n this.myFormatLogIndentationCharacter = \"-\";\r\n\r\n this.myLogMaxResults = false;\r\n\r\n this.myLogSortOrder = DebugFunctionsPerformanceAnalyzerSortOrder.NONE;\r\n\r\n this.myLogMaxAmountOfFunctions = null;\r\n\r\n this.myLogFunctionsWithCallsCountAbove = null;\r\n this.myLogFunctionsWithTotalExecutionTimePercentageAbove = null;\r\n\r\n this.myLogCallsCountResults = false;\r\n this.myLogTotalExecutionTimeResults = false;\r\n this.myLogTotalExecutionTimePercentageResults = false;\r\n this.myLogAverageExecutionTimeResults = false;\r\n\r\n this.myClearConsoleBeforeLog = false;\r\n }\r\n}\r\n\r\nexport class DebugFunctionsPerformanceAnalysisResultsLogger {\r\n\r\n constructor(params) {\r\n this._myParams = params;\r\n\r\n this._myLogTimer = new Timer(this._myParams.mySecondsBetweenLogs);\r\n\r\n this._myMaxNameLength = 0;\r\n this._myMaxCallsCountLength = 0;\r\n this._myMaxTotalExecutionTimeLength = 0;\r\n this._myMaxTotalExecutionTimePercentageLength = 0;\r\n this._myMaxAverageExecutionTimeLength = 0;\r\n }\r\n\r\n update(dt) {\r\n if (this._myParams.myPerformanceAnalyzer == null) {\r\n return;\r\n }\r\n\r\n this._myLogTimer.update(dt);\r\n if (this._myLogTimer.isDone()) {\r\n this._myLogTimer.start();\r\n\r\n let timeSinceLastReset = this._myParams.myPerformanceAnalyzer.getTimeElapsedSinceLastReset();\r\n if (this._myParams.myLogMaxResults) {\r\n timeSinceLastReset = this._myParams.myPerformanceAnalyzer.getMaxTimeElapsedSinceLastReset();\r\n }\r\n\r\n let analysisResults = null;\r\n if (!this._myParams.myLogMaxResults) {\r\n analysisResults = this._myParams.myPerformanceAnalyzer.getResults(this._myParams.myLogSortOrder);\r\n } else {\r\n analysisResults = this._myParams.myPerformanceAnalyzer.getMaxResults(this._myParams.myLogSortOrder);\r\n }\r\n\r\n if (this._myParams.myLogFunctionsWithCallsCountAbove != null) {\r\n let analysisResultsClone = new Map(analysisResults);\r\n analysisResults = new Map();\r\n let keys = [...analysisResultsClone.keys()];\r\n for (let i = 0; i < keys.length; i++) {\r\n let results = analysisResultsClone.get(keys[i]);\r\n if (results.myCallsCount > this._myParams.myLogFunctionsWithCallsCountAbove) {\r\n analysisResults.set(keys[i], results);\r\n }\r\n }\r\n }\r\n\r\n if (this._myParams.myLogFunctionsWithTotalExecutionTimePercentageAbove != null) {\r\n let analysisResultsClone = new Map(analysisResults);\r\n analysisResults = new Map();\r\n let keys = [...analysisResultsClone.keys()];\r\n for (let i = 0; i < keys.length; i++) {\r\n let results = analysisResultsClone.get(keys[i]);\r\n if (results.myTotalExecutionTimePercentage * 100 > this._myParams.myLogFunctionsWithTotalExecutionTimePercentageAbove) {\r\n analysisResults.set(keys[i], results);\r\n }\r\n }\r\n }\r\n\r\n if (this._myParams.myLogMaxAmountOfFunctions != null) {\r\n let analysisResultsClone = new Map(analysisResults);\r\n analysisResults = new Map();\r\n let keys = [...analysisResultsClone.keys()];\r\n for (let i = 0; i < this._myParams.myLogMaxAmountOfFunctions && i < keys.length; i++) {\r\n let counter = analysisResultsClone.get(keys[i]);\r\n analysisResults.set(keys[i], counter);\r\n }\r\n }\r\n\r\n if (this._myParams.myClearConsoleBeforeLog) {\r\n console.clear();\r\n }\r\n\r\n let analysisResultsToLog = new Map();\r\n for (let key of analysisResults.keys()) {\r\n let currentResults = analysisResults.get(key);\r\n\r\n let resultsToLog = {};\r\n if (this._myParams.myLogCallsCountResults) {\r\n resultsToLog.myCallsCount = currentResults.myCallsCount;\r\n }\r\n\r\n if (this._myParams.myLogTotalExecutionTimeResults) {\r\n resultsToLog.myTotalExecutionTime = currentResults.myTotalExecutionTime;\r\n }\r\n\r\n if (this._myParams.myLogTotalExecutionTimePercentageResults) {\r\n resultsToLog.myTotalExecutionTimePercentage = currentResults.myTotalExecutionTimePercentage;\r\n }\r\n\r\n if (this._myParams.myLogAverageExecutionTimeResults) {\r\n resultsToLog.myAverageExecutionTime = currentResults.myAverageExecutionTime;\r\n }\r\n\r\n analysisResultsToLog.set(key, resultsToLog);\r\n }\r\n\r\n let resultsText = \"\";\r\n\r\n for (let entry of analysisResults.entries()) {\r\n let name = entry[0];\r\n let results = entry[1];\r\n\r\n this._myMaxNameLength = Math.max(this._myMaxNameLength, name.length);\r\n\r\n this._myMaxCallsCountLength = Math.max(this._myMaxCallsCountLength, results.myCallsCount.toFixed(0).length);\r\n this._myMaxTotalExecutionTimeLength = Math.max(this._myMaxTotalExecutionTimeLength, results.myTotalExecutionTime.toFixed(5).length);\r\n this._myMaxTotalExecutionTimePercentageLength = Math.max(this._myMaxTotalExecutionTimePercentageLength, (results.myTotalExecutionTimePercentage * 100).toFixed(2).length);\r\n this._myMaxAverageExecutionTimeLength = Math.max(this._myMaxAverageExecutionTimeLength, results.myAverageExecutionTime.toFixed(5).length);\r\n }\r\n\r\n for (let entry of analysisResults.entries()) {\r\n let name = entry[0];\r\n let results = entry[1];\r\n\r\n let parametersToLog = 0;\r\n if (this._myParams.myLogCallsCountResults) {\r\n parametersToLog++;\r\n }\r\n\r\n if (this._myParams.myLogTotalExecutionTimeResults) {\r\n parametersToLog++;\r\n }\r\n\r\n if (this._myParams.myLogTotalExecutionTimePercentageResults) {\r\n parametersToLog++;\r\n }\r\n\r\n if (this._myParams.myLogAverageExecutionTimeResults) {\r\n parametersToLog++;\r\n }\r\n\r\n let textOrdered = [];\r\n\r\n let callsCountText = ((parametersToLog > 1) ? \"Calls Count: \" : \"\");\r\n if (this._myParams.myFormatLog) {\r\n for (let i = 0; i < this._myMaxCallsCountLength - results.myCallsCount.toFixed(0).length; i++) {\r\n callsCountText += \" \";\r\n }\r\n }\r\n callsCountText += results.myCallsCount.toFixed(0);\r\n\r\n let totalExecutionTimeText = ((parametersToLog > 1) ? \"Total Time: \" : \"\");\r\n if (this._myParams.myFormatLog) {\r\n for (let i = 0; i < this._myMaxTotalExecutionTimeLength - results.myTotalExecutionTime.toFixed(5).length; i++) {\r\n totalExecutionTimeText += \" \";\r\n }\r\n }\r\n totalExecutionTimeText += results.myTotalExecutionTime.toFixed(5) + \"ms\";\r\n\r\n let totalExecutionTimePercentageText = ((parametersToLog > 1) ? \"Total Time: \" : \"\");\r\n if (this._myParams.myFormatLog) {\r\n for (let i = 0; i < this._myMaxTotalExecutionTimePercentageLength - (results.myTotalExecutionTimePercentage * 100).toFixed(2).length; i++) {\r\n totalExecutionTimePercentageText += \" \";\r\n }\r\n }\r\n totalExecutionTimePercentageText += (results.myTotalExecutionTimePercentage * 100).toFixed(2) + \"%\";\r\n\r\n let averageExecutionTimeText = ((parametersToLog > 1) ? \"Average Time: \" : \"\");\r\n if (this._myParams.myFormatLog) {\r\n for (let i = 0; i < this._myMaxAverageExecutionTimeLength - results.myAverageExecutionTime.toFixed(5).length; i++) {\r\n averageExecutionTimeText += \" \";\r\n }\r\n }\r\n averageExecutionTimeText += results.myAverageExecutionTime.toFixed(5) + \"ms\";\r\n\r\n if (!this._myParams.myLogCallsCountResults) {\r\n callsCountText = null;\r\n }\r\n\r\n if (!this._myParams.myLogTotalExecutionTimeResults) {\r\n totalExecutionTimeText = null;\r\n }\r\n\r\n if (!this._myParams.myLogTotalExecutionTimePercentageResults) {\r\n totalExecutionTimePercentageText = null;\r\n }\r\n\r\n if (!this._myParams.myLogAverageExecutionTimeResults) {\r\n averageExecutionTimeText = null;\r\n }\r\n\r\n switch (this._myParams.myLogSortOrder) {\r\n case DebugFunctionsPerformanceAnalyzerSortOrder.CALLS_COUNT:\r\n textOrdered.push(callsCountText);\r\n textOrdered.push(totalExecutionTimeText);\r\n textOrdered.push(totalExecutionTimePercentageText);\r\n textOrdered.push(averageExecutionTimeText);\r\n break;\r\n case DebugFunctionsPerformanceAnalyzerSortOrder.TOTAL_EXECUTION_TIME:\r\n textOrdered.push(totalExecutionTimeText);\r\n textOrdered.push(totalExecutionTimePercentageText);\r\n textOrdered.push(averageExecutionTimeText);\r\n textOrdered.push(callsCountText);\r\n break;\r\n case DebugFunctionsPerformanceAnalyzerSortOrder.AVERAGE_EXECUTION_TIME:\r\n textOrdered.push(averageExecutionTimeText);\r\n textOrdered.push(totalExecutionTimeText);\r\n textOrdered.push(totalExecutionTimePercentageText);\r\n textOrdered.push(callsCountText);\r\n break;\r\n default:\r\n textOrdered.push(callsCountText);\r\n textOrdered.push(totalExecutionTimeText);\r\n textOrdered.push(totalExecutionTimePercentageText);\r\n textOrdered.push(averageExecutionTimeText);\r\n }\r\n\r\n resultsText += \"\\n\";\r\n if (this._myParams.myFormatLog) {\r\n let nameIndented = name + \" \";\r\n while (nameIndented.length < this._myMaxNameLength + 1) {\r\n nameIndented += this._myParams.myFormatLogIndentationCharacter;\r\n }\r\n nameIndented += this._myParams.myFormatLogIndentationCharacter + \" \";\r\n resultsText += nameIndented;\r\n } else {\r\n resultsText += name + \" - \";\r\n }\r\n\r\n let avoidFirst = true;\r\n for (let text of textOrdered) {\r\n if (text != null) {\r\n if (avoidFirst) {\r\n avoidFirst = false;\r\n } else {\r\n resultsText += \" - \";\r\n }\r\n\r\n resultsText += text;\r\n }\r\n }\r\n }\r\n\r\n if ((this._myParams.myLogTotalExecutionTimeResults || this._myParams.myLogTotalExecutionTimePercentageResults || this._myParams.myLogAverageExecutionTimeResults)) {\r\n console[this._myParams.myLogFunction](\"\\n\" + this._myParams.myLogTitle, \"\\n\\nTotal Time:\", timeSinceLastReset.toFixed(5), \"ms\\n\", resultsText);\r\n } else {\r\n console[this._myParams.myLogFunction](\"\\n\" + this._myParams.myLogTitle, \"\\n\", resultsText);\r\n }\r\n }\r\n }\r\n}", "import { Component, Property } from \"@wonderlandengine/api\";\r\nimport { Timer } from \"../../../../cauldron/cauldron/timer.js\";\r\nimport { GamepadButtonID } from \"../../../../input/gamepad/gamepad_buttons.js\";\r\nimport { Globals } from \"../../../../pp/globals.js\";\r\nimport { DebugFunctionsPerformanceAnalysisResultsLogger, DebugFunctionsPerformanceAnalysisResultsLoggerParams } from \"../debug_functions_performance_analysis_results_logger.js\";\r\nimport { DebugFunctionsPerformanceAnalyzer, DebugFunctionsPerformanceAnalyzerParams } from \"../debug_functions_performance_analyzer.js\";\r\n\r\nexport class DebugFunctionsPerformanceAnalyzerComponent extends Component {\r\n static TypeName = \"pp-debug-functions-performance-analyzer\";\r\n static Properties = {\r\n _myObjectsByPath: Property.string(\"\"),\r\n _myClassesByPath: Property.string(\"\"),\r\n _myFunctionsByPath: Property.string(\"\"),\r\n _myDelayStart: Property.float(0.0),\r\n _myLogTitle: Property.string(\"Functions Performance Analysis Results\"),\r\n _myLogFunction: Property.enum([\"Log\", \"Error\", \"Warn\", \"Debug\"], \"Error\"),\r\n _mySecondsBetweenLogs: Property.float(1.0),\r\n _myLogMaxResults: Property.bool(false),\r\n _myLogSortOrder: Property.enum([\"None\", \"Calls Count\", \"Total Execution Time\", \"Average Execution Time\"], \"Calls Count\"),\r\n _myLogCallsCountResults: Property.bool(true),\r\n _myLogTotalExecutionTimeResults: Property.bool(false),\r\n _myLogTotalExecutionTimePercentageResults: Property.bool(false),\r\n _myLogAverageExecutionTimeResults: Property.bool(false),\r\n _myLogMaxAmountOfFunctions: Property.int(-1),\r\n _myLogFunctionsWithCallsCountAbove: Property.int(0),\r\n _myLogFunctionsWithTotalExecutionTimePercentageAbove: Property.float(-1),\r\n _myFunctionPathsToInclude: Property.string(\"\"),\r\n _myFunctionPathsToExclude: Property.string(\"\"),\r\n _myExcludeConstructors: Property.bool(false),\r\n _myExcludeJSObjectFunctions: Property.bool(true),\r\n _myAddPathPrefixToFunctionID: Property.bool(true),\r\n _myObjectAddObjectDescendantsDepthLevel: Property.int(0),\r\n _myObjectAddClassDescendantsDepthLevel: Property.int(0),\r\n _myClearConsoleBeforeLog: Property.bool(false),\r\n _myResetMaxResultsShortcutEnabled: Property.bool(false),\r\n _myClassesByReference: Property.enum([\"Code Driven\"], \"Code Driven\"),\r\n _myObjectsByReference: Property.enum([\"Code Driven\"], \"Code Driven\")\r\n };\r\n\r\n init() {\r\n this._myActive = false;\r\n\r\n if (Globals.isDebugEnabled(this.engine)) {\r\n this._init();\r\n }\r\n }\r\n\r\n _init() {\r\n this._myActive = true;\r\n\r\n this._myFunctionsPerformanceAnalyzer = null;\r\n this._myFunctionsPerformanceAnalysisResultsLogger = null;\r\n\r\n this._mySkipFirstUpdate = true;\r\n this._myStartTimer = new Timer(this._myDelayStart);\r\n if (this._myDelayStart == 0) {\r\n this._myStartTimer.end();\r\n this._mySkipFirstUpdate = false;\r\n this._start();\r\n }\r\n }\r\n\r\n start() {\r\n if (!this._myActive && Globals.isDebugEnabled(this.engine)) {\r\n this._init();\r\n }\r\n }\r\n\r\n update(dt) {\r\n if (!Globals.isDebugEnabled(this.engine)) return;\r\n\r\n if (this._myActive) {\r\n if (this._mySkipFirstUpdate) {\r\n this._mySkipFirstUpdate = false;\r\n return;\r\n }\r\n\r\n if (this._myStartTimer.isRunning()) {\r\n this._myStartTimer.update(dt);\r\n if (this._myStartTimer.isDone()) {\r\n this._start();\r\n }\r\n } else {\r\n this._myFunctionsPerformanceAnalysisResultsLogger.update(dt);\r\n this._myFunctionsPerformanceAnalyzer.resetResults();\r\n }\r\n\r\n if (this._myResetMaxResultsShortcutEnabled) {\r\n if (Globals.getLeftGamepad(this.engine).getButtonInfo(GamepadButtonID.SELECT).isPressEnd(3)) {\r\n this._myFunctionsPerformanceAnalyzer.resetMaxResults();\r\n }\r\n }\r\n }\r\n }\r\n\r\n _start() {\r\n let functionsPerformanceAnalyzerParams = new DebugFunctionsPerformanceAnalyzerParams(this.engine);\r\n\r\n if (this._myObjectsByPath.length > 0) {\r\n let toIncludeList = [...this._myObjectsByPath.split(\",\")];\r\n for (let i = 0; i < toIncludeList.length; i++) {\r\n toIncludeList[i] = toIncludeList[i].trim();\r\n }\r\n functionsPerformanceAnalyzerParams.myObjectsByPath.push(...toIncludeList);\r\n }\r\n\r\n if (this._myClassesByPath.length > 0) {\r\n let toIncludeList = [...this._myClassesByPath.split(\",\")];\r\n for (let i = 0; i < toIncludeList.length; i++) {\r\n toIncludeList[i] = toIncludeList[i].trim();\r\n }\r\n functionsPerformanceAnalyzerParams.myClassesByPath.push(...toIncludeList);\r\n }\r\n\r\n if (this._myFunctionsByPath.length > 0) {\r\n let toIncludeList = [...this._myFunctionsByPath.split(\",\")];\r\n for (let i = 0; i < toIncludeList.length; i++) {\r\n toIncludeList[i] = toIncludeList[i].trim();\r\n }\r\n functionsPerformanceAnalyzerParams.myFunctionsByPath.push(...toIncludeList);\r\n }\r\n\r\n functionsPerformanceAnalyzerParams.myExcludeConstructors = this._myExcludeConstructors;\r\n functionsPerformanceAnalyzerParams.myExcludeJSObjectFunctions = this._myExcludeJSObjectFunctions;\r\n functionsPerformanceAnalyzerParams.myAddPathPrefixToFunctionID = this._myAddPathPrefixToFunctionID;\r\n\r\n if (this._myFunctionPathsToInclude.length > 0) {\r\n let toIncludeList = [...this._myFunctionPathsToInclude.split(\",\")];\r\n for (let i = 0; i < toIncludeList.length; i++) {\r\n toIncludeList[i] = toIncludeList[i].trim();\r\n }\r\n functionsPerformanceAnalyzerParams.myFunctionPathsToInclude.push(...toIncludeList);\r\n }\r\n\r\n if (this._myFunctionPathsToExclude.length > 0) {\r\n let toExcludeList = [...this._myFunctionPathsToExclude.split(\",\")];\r\n for (let i = 0; i < toExcludeList.length; i++) {\r\n toExcludeList[i] = toExcludeList[i].trim();\r\n }\r\n functionsPerformanceAnalyzerParams.myFunctionPathsToExclude.push(...toExcludeList);\r\n }\r\n\r\n functionsPerformanceAnalyzerParams.myObjectAddObjectDescendantsDepthLevel = this._myObjectAddObjectDescendantsDepthLevel;\r\n functionsPerformanceAnalyzerParams.myObjectAddClassDescendantsDepthLevel = this._myObjectAddClassDescendantsDepthLevel;\r\n\r\n functionsPerformanceAnalyzerParams.myExecutionTimeAnalysisEnabled = this._myLogTotalExecutionTimeResults || this._myLogTotalExecutionTimePercentageResults || this._myLogAverageExecutionTimeResults;\r\n\r\n functionsPerformanceAnalyzerParams.myClassesByReference = (this._myClassesByReference != 0) ? this._myClassesByReference : [];\r\n functionsPerformanceAnalyzerParams.myObjectsByReference = (this._myObjectsByReference != 0) ? this._myObjectsByReference : [];\r\n\r\n this._myFunctionsPerformanceAnalyzer = new DebugFunctionsPerformanceAnalyzer(functionsPerformanceAnalyzerParams);\r\n this._myFunctionsPerformanceAnalyzer.overwriteFunctions();\r\n\r\n let functionsPerformanceAnalysisResultsLoggerParams = new DebugFunctionsPerformanceAnalysisResultsLoggerParams();\r\n functionsPerformanceAnalysisResultsLoggerParams.myPerformanceAnalyzer = this._myFunctionsPerformanceAnalyzer;\r\n functionsPerformanceAnalysisResultsLoggerParams.myLogTitle = this._myLogTitle;\r\n\r\n functionsPerformanceAnalysisResultsLoggerParams.mySecondsBetweenLogs = this._mySecondsBetweenLogs;\r\n functionsPerformanceAnalysisResultsLoggerParams.myLogFunction = [\"log\", \"error\", \"warn\", \"debug\"][this._myLogFunction];\r\n functionsPerformanceAnalysisResultsLoggerParams.myLogMaxAmountOfFunctions = (this._myLogMaxAmountOfFunctions >= 0) ? this._myLogMaxAmountOfFunctions : null;\r\n functionsPerformanceAnalysisResultsLoggerParams.myLogFunctionsWithCallsCountAbove = (this._myLogFunctionsWithCallsCountAbove >= 0) ? this._myLogFunctionsWithCallsCountAbove : null;\r\n functionsPerformanceAnalysisResultsLoggerParams.myLogFunctionsWithTotalExecutionTimePercentageAbove = (this._myLogFunctionsWithTotalExecutionTimePercentageAbove >= 0) ? this._myLogFunctionsWithTotalExecutionTimePercentageAbove : null;\r\n functionsPerformanceAnalysisResultsLoggerParams.myLogMaxResults = this._myLogMaxResults;\r\n functionsPerformanceAnalysisResultsLoggerParams.myClearConsoleBeforeLog = this._myClearConsoleBeforeLog;\r\n\r\n functionsPerformanceAnalysisResultsLoggerParams.myLogSortOrder = this._myLogSortOrder;\r\n\r\n functionsPerformanceAnalysisResultsLoggerParams.myLogCallsCountResults = this._myLogCallsCountResults;\r\n functionsPerformanceAnalysisResultsLoggerParams.myLogTotalExecutionTimeResults = this._myLogTotalExecutionTimeResults;\r\n functionsPerformanceAnalysisResultsLoggerParams.myLogTotalExecutionTimePercentageResults = this._myLogTotalExecutionTimePercentageResults;\r\n functionsPerformanceAnalysisResultsLoggerParams.myLogAverageExecutionTimeResults = this._myLogAverageExecutionTimeResults;\r\n\r\n this._myFunctionsPerformanceAnalysisResultsLogger = new DebugFunctionsPerformanceAnalysisResultsLogger(functionsPerformanceAnalysisResultsLoggerParams);\r\n }\r\n}", "import { Component, Property } from \"@wonderlandengine/api\";\r\nimport { DebugFunctionsPerformanceAnalyzerComponent } from \"./debug_functions_performance_analyzer_component.js\";\r\n\r\nexport class DebugPPFunctionsPerformanceAnalyzerComponent extends Component {\r\n static TypeName = \"pp-debug-pp-functions-performance-analyzer\";\r\n static Properties = {\r\n _myDelayStart: Property.float(0.0),\r\n _myLogFunction: Property.enum([\"Log\", \"Error\", \"Warn\", \"Debug\"], \"Error\"),\r\n _mySecondsBetweenLogs: Property.float(1.0),\r\n _myLogMaxResults: Property.bool(false),\r\n _myLogSortOrder: Property.enum([\"None\", \"Calls Count\", \"Total Execution Time\", \"Average Execution Time\"], \"Calls Count\"),\r\n _myLogCallsCountResults: Property.bool(true),\r\n _myLogTotalExecutionTimeResults: Property.bool(false),\r\n _myLogTotalExecutionTimePercentageResults: Property.bool(false),\r\n _myLogAverageExecutionTimeResults: Property.bool(false),\r\n _myLogMaxAmountOfFunctions: Property.int(-1),\r\n _myLogFunctionsWithCallsCountAbove: Property.int(0),\r\n _myLogFunctionsWithTotalExecutionTimePercentageAbove: Property.float(-1),\r\n _myFunctionPathsToInclude: Property.string(\"\"),\r\n _myFunctionPathsToExclude: Property.string(\"\"),\r\n _myExcludeConstructors: Property.bool(false),\r\n _myClearConsoleBeforeLog: Property.bool(false),\r\n _myResetMaxResultsShortcutEnabled: Property.bool(false)\r\n };\r\n\r\n init() {\r\n this.object.pp_addComponent(DebugFunctionsPerformanceAnalyzerComponent, {\r\n _myObjectsByPath: \"PP\",\r\n _myDelayStart: this._myDelayStart,\r\n _myLogTitle: \"PP Functions Performance Analysis Results\",\r\n _myLogFunction: this._myLogFunction,\r\n _mySecondsBetweenLogs: this._mySecondsBetweenLogs,\r\n _myLogMaxResults: this._myLogMaxResults,\r\n _myLogSortOrder: this._myLogSortOrder,\r\n _myLogMaxAmountOfFunctions: this._myLogMaxAmountOfFunctions,\r\n _myLogFunctionsWithCallsCountAbove: this._myLogFunctionsWithCallsCountAbove,\r\n _myLogFunctionsWithTotalExecutionTimePercentageAbove: this._myLogFunctionsWithTotalExecutionTimePercentageAbove,\r\n _myLogCallsCountResults: this._myLogCallsCountResults,\r\n _myLogTotalExecutionTimeResults: this._myLogTotalExecutionTimeResults,\r\n _myLogTotalExecutionTimePercentageResults: this._myLogTotalExecutionTimePercentageResults,\r\n _myLogAverageExecutionTimeResults: this._myLogAverageExecutionTimeResults,\r\n _myFunctionPathsToInclude: this._myFunctionPathsToInclude,\r\n _myFunctionPathsToExclude: this._myFunctionPathsToExclude,\r\n _myExcludeConstructors: this._myExcludeConstructors,\r\n _myExcludeJSObjectFunctions: true,\r\n _myAddPathPrefixToFunctionID: true,\r\n _myObjectAddObjectDescendantsDepthLevel: 1,\r\n _myObjectAddClassDescendantsDepthLevel: 1,\r\n _myClearConsoleBeforeLog: this._myClearConsoleBeforeLog,\r\n _myResetMaxResultsShortcutEnabled: this._myResetMaxResultsShortcutEnabled\r\n });\r\n }\r\n}", "\r\nimport { Component, Property } from \"@wonderlandengine/api\";\r\nimport { DebugFunctionsPerformanceAnalyzerComponent } from \"./debug_functions_performance_analyzer_component.js\";\r\n\r\nexport class DebugArrayFunctionsPerformanceAnalyzerComponent extends Component {\r\n static TypeName = \"pp-debug-array-functions-performance-analyzer\";\r\n static Properties = {\r\n _myIncludeOnlyMainArrayTypes: Property.bool(true),\r\n _myIncludeOnlyArrayExtensionFunctions: Property.bool(false),\r\n _myDelayStart: Property.float(0.0),\r\n _myLogFunction: Property.enum([\"Log\", \"Error\", \"Warn\", \"Debug\"], \"Error\"),\r\n _mySecondsBetweenLogs: Property.float(1.0),\r\n _myLogMaxResults: Property.bool(false),\r\n _myLogSortOrder: Property.enum([\"None\", \"Calls Count\", \"Total Execution Time\", \"Average Execution Time\"], \"Calls Count\"),\r\n _myLogCallsCountResults: Property.bool(true),\r\n _myLogTotalExecutionTimeResults: Property.bool(false),\r\n _myLogTotalExecutionTimePercentageResults: Property.bool(false),\r\n _myLogAverageExecutionTimeResults: Property.bool(false),\r\n _myLogMaxAmountOfFunctions: Property.int(-1),\r\n _myLogFunctionsWithCallsCountAbove: Property.int(0),\r\n _myLogFunctionsWithTotalExecutionTimePercentageAbove: Property.float(-1),\r\n _myFunctionPathsToInclude: Property.string(\"\"),\r\n _myFunctionPathsToExclude: Property.string(\"\"),\r\n _myExcludeConstructors: Property.bool(false),\r\n _myClearConsoleBeforeLog: Property.bool(false),\r\n _myResetMaxResultsShortcutEnabled: Property.bool(false)\r\n };\r\n\r\n init() {\r\n let classesByPath = \"Array, Uint8ClampedArray, Uint8Array, Uint16Array, Uint32Array, Int8Array, Int16Array, Int32Array, Float32Array, Float64Array\";\r\n if (this._myIncludeOnlyMainArrayTypes) {\r\n classesByPath = \"Array, Uint8Array, Uint16Array, Float32Array\";\r\n }\r\n\r\n this.object.pp_addComponent(DebugFunctionsPerformanceAnalyzerComponent, {\r\n _myClassesByPath: classesByPath,\r\n _myDelayStart: this._myDelayStart,\r\n _myLogTitle: \"Array Functions Performance Analysis Results\",\r\n _myLogFunction: this._myLogFunction,\r\n _mySecondsBetweenLogs: this._mySecondsBetweenLogs,\r\n _myLogMaxResults: this._myLogMaxResults,\r\n _myLogSortOrder: this._myLogSortOrder,\r\n _myLogMaxAmountOfFunctions: this._myLogMaxAmountOfFunctions,\r\n _myLogFunctionsWithCallsCountAbove: this._myLogFunctionsWithCallsCountAbove,\r\n _myLogFunctionsWithTotalExecutionTimePercentageAbove: this._myLogFunctionsWithTotalExecutionTimePercentageAbove,\r\n _myLogCallsCountResults: this._myLogCallsCountResults,\r\n _myLogTotalExecutionTimeResults: this._myLogTotalExecutionTimeResults,\r\n _myLogTotalExecutionTimePercentageResults: this._myLogTotalExecutionTimePercentageResults,\r\n _myLogAverageExecutionTimeResults: this._myLogAverageExecutionTimeResults,\r\n _myFunctionPathsToInclude: this._myFunctionPathsToInclude + (this._myFunctionPathsToInclude.length > 0 && this._myIncludeOnlyArrayExtensionFunctions ? \", \" : \"\") + (this._myIncludeOnlyArrayExtensionFunctions ? \"pp_, vec_, vec2_, vec3_, vec4_, quat_, quat2_, mat3_, mat4_, _pp_, _vec_, _quat_\" : \"\"),\r\n _myFunctionPathsToExclude: this._myFunctionPathsToExclude,\r\n _myExcludeConstructors: this._myExcludeConstructors,\r\n _myExcludeJSObjectFunctions: true,\r\n _myAddPathPrefixToFunctionID: true,\r\n _myClearConsoleBeforeLog: this._myClearConsoleBeforeLog,\r\n _myResetMaxResultsShortcutEnabled: this._myResetMaxResultsShortcutEnabled\r\n });\r\n }\r\n}", "import { Component, Property } from \"@wonderlandengine/api\";\r\nimport { Mat3Utils } from \"../../../../cauldron/utils/array/mat3_utils.js\";\r\nimport { Mat4Utils } from \"../../../../cauldron/utils/array/mat4_utils.js\";\r\nimport { Quat2Utils } from \"../../../../cauldron/utils/array/quat2_utils.js\";\r\nimport { QuatUtils } from \"../../../../cauldron/utils/array/quat_utils.js\";\r\nimport { Vec2Utils } from \"../../../../cauldron/utils/array/vec2_utils.js\";\r\nimport { Vec3Utils } from \"../../../../cauldron/utils/array/vec3_utils.js\";\r\nimport { Vec4Utils } from \"../../../../cauldron/utils/array/vec4_utils.js\";\r\nimport { DebugFunctionsPerformanceAnalyzerComponent } from \"./debug_functions_performance_analyzer_component.js\";\r\n\r\nexport class DebugPPArrayCreationPerformanceAnalyzerComponent extends Component {\r\n static TypeName = \"pp-debug-pp-array-creation-performance-analyzer\";\r\n static Properties = {\r\n _myDelayStart: Property.float(0.0),\r\n _myLogFunction: Property.enum([\"Log\", \"Error\", \"Warn\", \"Debug\"], \"Error\"),\r\n _mySecondsBetweenLogs: Property.float(1.0),\r\n _myLogMaxResults: Property.bool(false),\r\n _myLogSortOrder: Property.enum([\"None\", \"Calls Count\", \"Total Execution Time\", \"Average Execution Time\"], \"Calls Count\"),\r\n _myLogCallsCountResults: Property.bool(true),\r\n _myLogTotalExecutionTimeResults: Property.bool(false),\r\n _myLogTotalExecutionTimePercentageResults: Property.bool(false),\r\n _myLogAverageExecutionTimeResults: Property.bool(false),\r\n _myLogMaxAmountOfFunctions: Property.int(-1),\r\n _myLogFunctionsWithCallsCountAbove: Property.int(0),\r\n _myLogFunctionsWithTotalExecutionTimePercentageAbove: Property.float(-1),\r\n _myClearConsoleBeforeLog: Property.bool(false),\r\n _myResetMaxResultsShortcutEnabled: Property.bool(false)\r\n };\r\n\r\n init() {\r\n this.object.pp_addComponent(DebugFunctionsPerformanceAnalyzerComponent, {\r\n _myObjectsByReference: [\r\n [Vec2Utils, \"Vec2Utils\"],\r\n [Vec3Utils, \"Vec3Utils\"],\r\n [Vec4Utils, \"Vec4Utils\"],\r\n [QuatUtils, \"QuatUtils\"],\r\n [Quat2Utils, \"Quat2Utils\"],\r\n [Mat3Utils, \"Mat3Utils\"],\r\n [Mat4Utils, \"Mat4Utils\"]\r\n ],\r\n _myDelayStart: this._myDelayStart,\r\n _myLogTitle: \"PP Array Creation Performance Analysis Results\",\r\n _myLogFunction: this._myLogFunction,\r\n _mySecondsBetweenLogs: this._mySecondsBetweenLogs,\r\n _myLogMaxResults: this._myLogMaxResults,\r\n _myLogSortOrder: this._myLogSortOrder,\r\n _myLogMaxAmountOfFunctions: this._myLogMaxAmountOfFunctions,\r\n _myLogFunctionsWithCallsCountAbove: this._myLogFunctionsWithCallsCountAbove,\r\n _myLogFunctionsWithTotalExecutionTimePercentageAbove: this._myLogFunctionsWithTotalExecutionTimePercentageAbove,\r\n _myLogCallsCountResults: this._myLogCallsCountResults,\r\n _myLogTotalExecutionTimeResults: this._myLogTotalExecutionTimeResults,\r\n _myLogTotalExecutionTimePercentageResults: this._myLogTotalExecutionTimePercentageResults,\r\n _myLogAverageExecutionTimeResults: this._myLogAverageExecutionTimeResults,\r\n _myFunctionPathsToInclude: \"create\",\r\n _myExcludeConstructors: true,\r\n _myExcludeJSObjectFunctions: true,\r\n _myAddPathPrefixToFunctionID: true,\r\n _myClearConsoleBeforeLog: this._myClearConsoleBeforeLog,\r\n _myResetMaxResultsShortcutEnabled: this._myResetMaxResultsShortcutEnabled\r\n });\r\n }\r\n}", "import { Component, Property } from \"@wonderlandengine/api\";\r\nimport { DebugFunctionsPerformanceAnalyzerComponent } from \"./debug_functions_performance_analyzer_component.js\";\r\n\r\nexport class DebugWLFunctionsPerformanceAnalyzerComponent extends Component {\r\n static TypeName = \"pp-debug-wl-functions-performance-analyzer\";\r\n static Properties = {\r\n _myDelayStart: Property.float(0.0),\r\n _myLogFunction: Property.enum([\"Log\", \"Error\", \"Warn\", \"Debug\"], \"Error\"),\r\n _mySecondsBetweenLogs: Property.float(1.0),\r\n _myLogMaxResults: Property.bool(false),\r\n _myLogSortOrder: Property.enum([\"None\", \"Calls Count\", \"Total Execution Time\", \"Average Execution Time\"], \"Calls Count\"),\r\n _myLogCallsCountResults: Property.bool(true),\r\n _myLogTotalExecutionTimeResults: Property.bool(false),\r\n _myLogTotalExecutionTimePercentageResults: Property.bool(false),\r\n _myLogAverageExecutionTimeResults: Property.bool(false),\r\n _myLogMaxAmountOfFunctions: Property.int(-1),\r\n _myLogFunctionsWithCallsCountAbove: Property.int(0),\r\n _myLogFunctionsWithTotalExecutionTimePercentageAbove: Property.float(-1),\r\n _myFunctionPathsToInclude: Property.string(\"\"),\r\n _myFunctionPathsToExclude: Property.string(\"\"),\r\n _myExcludeConstructors: Property.bool(false),\r\n _myClearConsoleBeforeLog: Property.bool(false),\r\n _myResetMaxResultsShortcutEnabled: Property.bool(false)\r\n };\r\n\r\n init() {\r\n this.object.pp_addComponent(DebugFunctionsPerformanceAnalyzerComponent, {\r\n _myObjectsByPath: \"WL\",\r\n _myDelayStart: this._myDelayStart,\r\n _myLogTitle: \"WL Functions Performance Analysis Results\",\r\n _myLogFunction: this._myLogFunction,\r\n _mySecondsBetweenLogs: this._mySecondsBetweenLogs,\r\n _myLogMaxResults: this._myLogMaxResults,\r\n _myLogSortOrder: this._myLogSortOrder,\r\n _myLogMaxAmountOfFunctions: this._myLogMaxAmountOfFunctions,\r\n _myLogFunctionsWithCallsCountAbove: this._myLogFunctionsWithCallsCountAbove,\r\n _myLogFunctionsWithTotalExecutionTimePercentageAbove: this._myLogFunctionsWithTotalExecutionTimePercentageAbove,\r\n _myLogCallsCountResults: this._myLogCallsCountResults,\r\n _myLogTotalExecutionTimeResults: this._myLogTotalExecutionTimeResults,\r\n _myLogTotalExecutionTimePercentageResults: this._myLogTotalExecutionTimePercentageResults,\r\n _myLogAverageExecutionTimeResults: this._myLogAverageExecutionTimeResults,\r\n _myFunctionPathsToInclude: this._myFunctionPathsToInclude,\r\n _myFunctionPathsToExclude: this._myFunctionPathsToExclude,\r\n _myExcludeConstructors: this._myExcludeConstructors,\r\n _myExcludeJSObjectFunctions: true,\r\n _myAddPathPrefixToFunctionID: true,\r\n _myObjectAddObjectDescendantsDepthLevel: 1,\r\n _myObjectAddClassDescendantsDepthLevel: 1,\r\n _myClearConsoleBeforeLog: this._myClearConsoleBeforeLog,\r\n _myResetMaxResultsShortcutEnabled: this._myResetMaxResultsShortcutEnabled\r\n });\r\n }\r\n}", "import { AnimationComponent, CollisionComponent, Component, InputComponent, LightComponent, MeshComponent, PhysXComponent, Property, TextComponent, ViewComponent } from \"@wonderlandengine/api\";\r\nimport { Timer } from \"../../../../cauldron/cauldron/timer.js\";\r\nimport { ComponentUtils } from \"../../../../cauldron/wl/utils/component_utils.js\";\r\nimport { DebugFunctionsPerformanceAnalyzerComponent } from \"./debug_functions_performance_analyzer_component.js\";\r\n\r\nexport class DebugWLComponentsFunctionsPerformanceAnalyzerComponent extends Component {\r\n static TypeName = \"pp-debug-wl-components-functions-performance-analyzer\";\r\n static Properties = {\r\n _myAnalyzeComponentTypes: Property.bool(true),\r\n _myAnalyzeComponentInstances: Property.bool(false),\r\n _myComponentInstanceID: Property.enum([\"Object ID\", \"Object Name\", \"Object ID - Object Name\"], \"Object ID - Object Name\"),\r\n _myDelayStart: Property.float(0.0),\r\n _myLogFunction: Property.enum([\"Log\", \"Error\", \"Warn\", \"Debug\"], \"Error\"),\r\n _mySecondsBetweenLogs: Property.float(1.0),\r\n _myLogMaxResults: Property.bool(false),\r\n _myLogSortOrder: Property.enum([\"None\", \"Calls Count\", \"Total Execution Time\", \"Average Execution Time\"], \"Calls Count\"),\r\n _myLogCallsCountResults: Property.bool(true),\r\n _myLogTotalExecutionTimeResults: Property.bool(false),\r\n _myLogTotalExecutionTimePercentageResults: Property.bool(false),\r\n _myLogAverageExecutionTimeResults: Property.bool(false),\r\n _myLogMaxAmountOfFunctions: Property.int(-1),\r\n _myLogFunctionsWithCallsCountAbove: Property.int(0),\r\n _myLogFunctionsWithTotalExecutionTimePercentageAbove: Property.float(-1),\r\n _myFunctionPathsToInclude: Property.string(\"\"),\r\n _myFunctionPathsToExclude: Property.string(\"\"),\r\n _myExcludeConstructors: Property.bool(false),\r\n _myClearConsoleBeforeLog: Property.bool(false),\r\n _myResetMaxResultsShortcutEnabled: Property.bool(false)\r\n };\r\n\r\n init() {\r\n this._myStartTimer = new Timer(this._myDelayStart);\r\n if (this._myDelayStart == 0) {\r\n this._myStartTimer.end();\r\n this._start();\r\n }\r\n }\r\n\r\n update(dt) {\r\n if (this._myStartTimer.isRunning()) {\r\n this._myStartTimer.update(dt);\r\n if (this._myStartTimer.isDone()) {\r\n this._start();\r\n }\r\n }\r\n }\r\n\r\n _start() {\r\n\r\n let objectsByReference = [];\r\n let classesByReference = [];\r\n\r\n if (this._myAnalyzeComponentInstances) {\r\n this._addComponentInstanceReferences(objectsByReference);\r\n }\r\n\r\n if (this._myAnalyzeComponentTypes) {\r\n this._addComponentTypeReferences(classesByReference);\r\n }\r\n\r\n this._myAnalyzerComponent = this.object.pp_addComponent(DebugFunctionsPerformanceAnalyzerComponent, {\r\n _myObjectsByReference: objectsByReference,\r\n _myClassesByReference: classesByReference,\r\n _myDelayStart: 0,\r\n _myLogTitle: \"WL Components Performance Analysis Results\",\r\n _myLogFunction: this._myLogFunction,\r\n _mySecondsBetweenLogs: this._mySecondsBetweenLogs,\r\n _myLogMaxResults: this._myLogMaxResults,\r\n _myLogSortOrder: this._myLogSortOrder,\r\n _myLogMaxAmountOfFunctions: this._myLogMaxAmountOfFunctions,\r\n _myLogFunctionsWithCallsCountAbove: this._myLogFunctionsWithCallsCountAbove,\r\n _myLogFunctionsWithTotalExecutionTimePercentageAbove: this._myLogFunctionsWithTotalExecutionTimePercentageAbove,\r\n _myLogCallsCountResults: this._myLogCallsCountResults,\r\n _myLogTotalExecutionTimeResults: this._myLogTotalExecutionTimeResults,\r\n _myLogTotalExecutionTimePercentageResults: this._myLogTotalExecutionTimePercentageResults,\r\n _myLogAverageExecutionTimeResults: this._myLogAverageExecutionTimeResults,\r\n _myFunctionPathsToInclude: this._myFunctionPathsToInclude,\r\n _myFunctionPathsToExclude: this._myFunctionPathsToExclude,\r\n _myExcludeConstructors: this._myExcludeConstructors,\r\n _myExcludeJSObjectFunctions: true,\r\n _myAddPathPrefixToFunctionID: true,\r\n _myObjectAddClassDescendantsDepthLevel: 0,\r\n _myClearConsoleBeforeLog: this._myClearConsoleBeforeLog,\r\n _myResetMaxResultsShortcutEnabled: this._myResetMaxResultsShortcutEnabled\r\n });\r\n }\r\n\r\n _addComponentTypeReferences(classesByReference) {\r\n let nativeComponentClasses = [\r\n AnimationComponent,\r\n CollisionComponent,\r\n InputComponent,\r\n LightComponent,\r\n MeshComponent,\r\n PhysXComponent,\r\n TextComponent,\r\n ViewComponent\r\n ];\r\n\r\n for (let nativeComponentClass of nativeComponentClasses) {\r\n classesByReference.push([nativeComponentClass.prototype, \"{\\\"\" + nativeComponentClass.TypeName + \"\\\"}\"]);\r\n }\r\n\r\n for (let componentClass of ComponentUtils.getJavascriptComponentClassesByIndex(this.engine)) {\r\n classesByReference.push([componentClass.prototype, \"{\\\"\" + componentClass.TypeName + \"\\\"}\"]);\r\n }\r\n }\r\n\r\n _addComponentInstanceReferences(objectsByReference) {\r\n // #TODO add native components\r\n\r\n for (let componentInstance of ComponentUtils.getJavascriptComponentInstances(false, this.engine)) {\r\n let id = \"\";\r\n\r\n switch (this._myComponentInstanceID) {\r\n case 0:\r\n id = componentInstance.object.pp_getID();\r\n break;\r\n case 1:\r\n id = componentInstance.object.pp_getName();\r\n break;\r\n case 2:\r\n id = componentInstance.object.pp_getID();\r\n if (componentInstance.object.pp_getName().length > 0) {\r\n id = id + \" - \" + componentInstance.object.pp_getName();\r\n }\r\n break;\r\n }\r\n\r\n objectsByReference.push([componentInstance,\r\n \"{\\\"\" + componentInstance.type + \"\\\"}[\" + id + \"]\"]);\r\n }\r\n }\r\n}", "import { quat_create, vec3_create } from \"../../../plugin/js/extensions/array/vec_create_extension.js\";\r\n\r\nexport class Direction2DTo3DConverterParams {\r\n\r\n constructor() {\r\n this.myStartFlyingForward = false;\r\n this.myStartFlyingRight = false;\r\n\r\n this.myAutoUpdateFlyForward = false;\r\n this.myAutoUpdateFlyRight = false;\r\n\r\n this.myResetFlyForwardWhenZero = false;\r\n this.myResetFlyRightWhenZero = false;\r\n\r\n this.myMinAngleToFlyForwardUp = 90;\r\n this.myMinAngleToFlyForwardDown = 90;\r\n this.myMinAngleToFlyRightUp = 90;\r\n this.myMinAngleToFlyRightDown = 90;\r\n\r\n // Settings when flying is not active, used to adjust the directions and flat them\r\n this.myAdjustForwardWhenCloseToUp = true;\r\n this.myAdjustRightWhenCloseToUp = true;\r\n this.myAdjustForwardWhenCloseToUpAngleThreshold = 10;\r\n this.myAdjustRightWhenCloseToUpAngleThreshold = 10;\r\n\r\n this.myInvertForwardWhenUpsideDown = false;\r\n this.myInvertRightWhenUpsideDown = false;\r\n\r\n this.myAdjustLastValidFlatForwardOverConversionReferenceRotation = true;\r\n this.myAdjustLastValidFlatRightOverConversionReferenceRotation = true;\r\n }\r\n}\r\n\r\nexport class Direction2DTo3DConverter {\r\n\r\n constructor(params = new Direction2DTo3DConverterParams()) {\r\n this._myParams = params;\r\n\r\n this._myFlyingForward = this._myParams.myStartFlyingForward;\r\n this._myFlyingRight = this._myParams.myStartFlyingRight;\r\n\r\n this._myLastConvertRotationQuat = quat_create();\r\n this._myLastConvertRotationQuatValid = false;\r\n\r\n this._myLastValidFlatForward = vec3_create();\r\n this._myLastValidFlatRight = vec3_create();\r\n }\r\n\r\n // @direction3DUp can be used to flat the direction if the @conversionTransform is not aligned with it\r\n // It's also needed to specify the fly axis, if different from the @conversionTransform up\r\n // If @direction3DUp is null, @conversionTransform up is used\r\n convert(direction2D, conversionTransform, direction3DUp = null, outDirection3D = vec3_create()) {\r\n return this.convertTransform(direction2D, conversionTransform, direction3DUp, outDirection3D);\r\n }\r\n\r\n isFlying() {\r\n return this._myFlyingForward || this._myFlyingRight;\r\n }\r\n\r\n isFlyingForward() {\r\n return this._myFlyingForward;\r\n }\r\n\r\n isFlyingRight() {\r\n return this._myFlyingRight;\r\n }\r\n\r\n startFlying() {\r\n this._myFlyingForward = true;\r\n this._myFlyingRight = true;\r\n }\r\n\r\n startFlyingForward() {\r\n this._myFlyingForward = true;\r\n }\r\n\r\n startFlyingRight() {\r\n this._myFlyingRight = true;\r\n }\r\n\r\n stopFlying() {\r\n this._myFlyingForward = false;\r\n this._myFlyingRight = false;\r\n }\r\n\r\n stopFlyingForward() {\r\n this._myFlyingForward = false;\r\n }\r\n\r\n stopFlyingRight() {\r\n this._myFlyingRight = false;\r\n }\r\n\r\n resetFly() {\r\n this.resetFlyForward();\r\n this.resetFlyRight();\r\n }\r\n\r\n resetFlyForward() {\r\n if (this._myParams.myStartFlyingForward) {\r\n this.startFlyingForward();\r\n } else {\r\n this.stopFlyingForward();\r\n }\r\n }\r\n\r\n resetFlyRight() {\r\n if (this._myParams.myStartFlyingRight) {\r\n this.startFlyingRight();\r\n } else {\r\n this.stopFlyingRight();\r\n }\r\n }\r\n\r\n resetLastValidFlatDirections() {\r\n this._myLastValidFlatForward.vec3_zero();\r\n this._myLastValidFlatRight.vec3_zero();\r\n }\r\n\r\n resetLastValidFlatForward() {\r\n this._myLastValidFlatForward.vec3_zero();\r\n }\r\n\r\n resetLastValidFlatRight() {\r\n this._myLastValidFlatRight.vec3_zero();\r\n }\r\n\r\n resetLastConvertTransform() {\r\n this._myLastConvertRotationQuatValid = false;\r\n this._myLastConvertRotationQuat.quat_identity();\r\n }\r\n\r\n // Convert Alternatives\r\n\r\n // If @direction3DUp is null, vec3_create(0, 1, 0) is used\r\n // Does not work properly if @conversionForward is aligned with @direction3DUp\r\n convertForward(direction2D, conversionForward, direction3DUp = null, outDirection3D = vec3_create()) {\r\n // Implemented outside class definition\r\n }\r\n\r\n // @direction3DUp can be used to flat the direction if the @conversionTransform is not aligned with it\r\n // It's also needed to specify the fly axis, if different from the @conversionTransform up\r\n // If @direction3DUp is null, conversionTransform up is used\r\n convertTransform(direction2D, conversionTransform, direction3DUp = null, outDirection3D = vec3_create()) {\r\n return this.convertTransformMatrix(direction2D, conversionTransform, direction3DUp, outDirection3D);\r\n }\r\n\r\n convertTransformMatrix(direction2D, conversionTransformMatrix, direction3DUp = null, outDirection3D = vec3_create()) {\r\n // Implemented outside class definition\r\n }\r\n\r\n convertTransformQuat(direction2D, conversionTransformQuat, direction3DUp = null, outDirection3D = vec3_create()) {\r\n // Implemented outside class definition\r\n }\r\n\r\n convertRotationQuat(direction2D, conversionRotationQuat, direction3DUp = null, outDirection3D = vec3_create()) {\r\n // Implemented outside class definition\r\n }\r\n}\r\n\r\nDirection2DTo3DConverter.prototype.convertForward = function () {\r\n let rotationQuat = quat_create();\r\n return function convertForward(direction2D, conversionForward, direction3DUp = null, outDirection3D = vec3_create()) {\r\n rotationQuat.quat_identity();\r\n rotationQuat.quat_setForward(conversionForward, direction3DUp);\r\n return this.convertRotationQuat(direction2D, rotationQuat, direction3DUp, outDirection3D);\r\n };\r\n}();\r\n\r\nDirection2DTo3DConverter.prototype.convertTransformMatrix = function () {\r\n let rotationQuat = quat_create();\r\n return function convertTransformMatrix(direction2D, conversionTransformMatrix, direction3DUp = null, outDirection3D = vec3_create()) {\r\n rotationQuat = conversionTransformMatrix.mat4_getRotationQuat(rotationQuat);\r\n return this.convertRotationQuat(direction2D, rotationQuat, direction3DUp, outDirection3D);\r\n };\r\n}();\r\n\r\nDirection2DTo3DConverter.prototype.convertTransformQuat = function () {\r\n let rotationQuat = quat_create();\r\n return function convertTransformQuat(direction2D, conversionTransformQuat, direction3DUp = null, outDirection3D = vec3_create()) {\r\n rotationQuat = conversionTransformQuat.quat2_getRotationQuat(rotationQuat);\r\n return this.convertRotationQuat(direction2D, rotationQuat, direction3DUp, outDirection3D);\r\n };\r\n}();\r\n\r\nDirection2DTo3DConverter.prototype.convertRotationQuat = function () {\r\n let forward = vec3_create();\r\n let right = vec3_create();\r\n let up = vec3_create();\r\n let direction3DUpNegate = vec3_create();\r\n let forwardScaled = vec3_create();\r\n let rightScaled = vec3_create();\r\n let rotationToNewConvertPivoted = quat_create();\r\n return function convertRotationQuat(direction2D, conversionRotationQuat, direction3DUp = null, outDirection3D = vec3_create()) {\r\n outDirection3D.vec3_zero();\r\n\r\n if (this._myParams.myAdjustLastValidFlatForwardOverConversionReferenceRotation || this._myParams.myAdjustLastValidFlatRightOverConversionReferenceRotation) {\r\n if (direction3DUp != null) {\r\n if (this._myLastConvertRotationQuatValid) {\r\n rotationToNewConvertPivoted = this._myLastConvertRotationQuat.quat_rotationToQuat(conversionRotationQuat, rotationToNewConvertPivoted).\r\n quat_rotationAroundAxisQuat(direction3DUp, rotationToNewConvertPivoted);\r\n if (Math.pp_angleClamp(rotationToNewConvertPivoted.quat_getAngle(), true) > Math.PP_EPSILON_DEGREES) {\r\n if (this._myParams.myAdjustLastValidFlatForwardOverConversionReferenceRotation) {\r\n this._myLastValidFlatForward.vec3_rotateQuat(rotationToNewConvertPivoted, this._myLastValidFlatForward);\r\n }\r\n\r\n if (this._myParams.myAdjustLastValidFlatRightOverConversionReferenceRotation) {\r\n this._myLastValidFlatRight.vec3_rotateQuat(rotationToNewConvertPivoted, this._myLastValidFlatRight);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (direction2D.vec2_isZero()) {\r\n let resetFlyForward = this._myParams.myAutoUpdateFlyForward && this._myParams.myResetFlyForwardWhenZero;\r\n if (resetFlyForward) {\r\n this.resetFlyForward();\r\n }\r\n\r\n let resetFlyRight = this._myParams.myAutoUpdateFlyRight && this._myParams.myResetFlyRightWhenZero;\r\n if (resetFlyRight) {\r\n this.resetFlyRight();\r\n }\r\n } else {\r\n\r\n forward = conversionRotationQuat.quat_getForward(forward);\r\n right = conversionRotationQuat.quat_getRight(right);\r\n up = conversionRotationQuat.quat_getUp(up);\r\n\r\n if (direction3DUp != null) {\r\n let upsideDown = !direction3DUp.vec3_isConcordant(up);\r\n\r\n direction3DUpNegate = direction3DUp.vec3_negate(direction3DUpNegate);\r\n\r\n // Check if it is flying based on the convert transform orientation \r\n if (this._myParams.myAutoUpdateFlyForward) {\r\n let angleForwardWithDirectionUp = forward.vec3_angle(direction3DUp);\r\n this._myFlyingForward = this._myFlyingForward ||\r\n (angleForwardWithDirectionUp < 90 - this._myParams.myMinAngleToFlyForwardUp || angleForwardWithDirectionUp > 90 + this._myParams.myMinAngleToFlyForwardDown);\r\n }\r\n\r\n if (this._myParams.myAutoUpdateFlyRight) {\r\n let angleRightWithDirectionUp = right.vec3_angle(direction3DUp);\r\n this._myFlyingRight = this._myFlyingRight ||\r\n (angleRightWithDirectionUp < 90 - this._myParams.myMinAngleToFlyRightUp || angleRightWithDirectionUp > 90 + this._myParams.myMinAngleToFlyRightDown);\r\n }\r\n\r\n // Remove the component to prevent flying, if needed\r\n if (!this._myFlyingForward) {\r\n // If the forward is too similar to the up (or down) take the last valid forward\r\n if (this._myParams.myAdjustForwardWhenCloseToUp && !this._myLastValidFlatForward.vec3_isZero(Math.PP_EPSILON) &&\r\n (forward.vec3_angle(direction3DUp) < this._myParams.myAdjustForwardWhenCloseToUpAngleThreshold ||\r\n forward.vec3_angle(direction3DUpNegate) < this._myParams.myAdjustForwardWhenCloseToUpAngleThreshold)) {\r\n forward.pp_copy(this._myLastValidFlatForward);\r\n } else if (upsideDown && this._myParams.myInvertForwardWhenUpsideDown) {\r\n forward.vec3_negate(forward);\r\n }\r\n\r\n forward = forward.vec3_removeComponentAlongAxis(direction3DUp, forward);\r\n forward.vec3_normalize(forward);\r\n\r\n\r\n if (forward.vec3_isZero(Math.PP_EPSILON)) {\r\n if (!this._myLastValidFlatForward.vec3_isZero(Math.PP_EPSILON)) {\r\n forward.pp_copy(this._myLastValidFlatForward);\r\n } else {\r\n forward.vec3_set(0, 0, 1);\r\n }\r\n }\r\n }\r\n\r\n if (!this._myFlyingRight) {\r\n // If the right is too similar to the up (or down) take the last valid right\r\n if (this._myParams.myAdjustRightWhenCloseToUp && !this._myLastValidFlatRight.vec3_isZero(Math.PP_EPSILON) &&\r\n (right.vec3_angle(direction3DUp) < this._myParams.myAdjustRightWhenCloseToUpAngleThreshold ||\r\n right.vec3_angle(direction3DUpNegate) < this._myParams.myAdjustRightWhenCloseToUpAngleThreshold)) {\r\n right.pp_copy(this._myLastValidFlatRight);\r\n } else if (upsideDown && this._myParams.myInvertRightWhenUpsideDown) {\r\n right.vec3_negate(right);\r\n }\r\n\r\n right = right.vec3_removeComponentAlongAxis(direction3DUp, right);\r\n right.vec3_normalize(right);\r\n\r\n if (right.vec3_isZero(Math.PP_EPSILON)) {\r\n if (!this._myLastValidFlatRight.vec3_isZero(Math.PP_EPSILON)) {\r\n right.pp_copy(this._myLastValidFlatRight);\r\n } else {\r\n right.vec3_set(-1, 0, 0);\r\n }\r\n }\r\n }\r\n\r\n // Update last valid\r\n if ((forward.vec3_angle(direction3DUp) >= this._myParams.myAdjustForwardWhenCloseToUpAngleThreshold && forward.vec3_angle(direction3DUpNegate) >= this._myParams.myAdjustForwardWhenCloseToUpAngleThreshold) ||\r\n (direction2D[1] != 0 && this._myLastValidFlatForward.vec3_isZero(Math.PP_EPSILON))) {\r\n this._myLastValidFlatForward = forward.vec3_removeComponentAlongAxis(direction3DUp, this._myLastValidFlatForward);\r\n this._myLastValidFlatForward.vec3_normalize(this._myLastValidFlatForward);\r\n }\r\n\r\n if ((right.vec3_angle(direction3DUp) >= this._myParams.myAdjustRightWhenCloseToUpAngleThreshold && right.vec3_angle(direction3DUpNegate) >= this._myParams.myAdjustRightWhenCloseToUpAngleThreshold) ||\r\n (direction2D[0] != 0 && this._myLastValidFlatRight.vec3_isZero(Math.PP_EPSILON))) {\r\n this._myLastValidFlatRight = right.vec3_removeComponentAlongAxis(direction3DUp, this._myLastValidFlatRight);\r\n this._myLastValidFlatRight.vec3_normalize(this._myLastValidFlatRight);\r\n }\r\n }\r\n\r\n // Compute direction 3D\r\n outDirection3D = right.vec3_scale(direction2D[0], rightScaled).vec3_add(forward.vec3_scale(direction2D[1], forwardScaled), outDirection3D);\r\n\r\n if (direction3DUp != null && !this._myFlyingForward && !this._myFlyingRight) {\r\n outDirection3D = outDirection3D.vec3_removeComponentAlongAxis(direction3DUp, outDirection3D);\r\n }\r\n\r\n outDirection3D.vec3_normalize(outDirection3D);\r\n }\r\n\r\n this._myLastConvertRotationQuat.quat_copy(conversionRotationQuat);\r\n this._myLastConvertRotationQuatValid = true;\r\n\r\n return outDirection3D;\r\n };\r\n}();", "import { EasingFunction } from \"../../../cauldron/utils/math_utils.js\";\r\n\r\n/** You can just put `fromValue` if u want a value that doesn't actually change -> `new NumberOverFactor(0)` */\r\nexport class NumberOverFactor {\r\n\r\n private readonly _myFromValue: number;\r\n private readonly _myToValue: number;\r\n\r\n private readonly _myFromFactor: number;\r\n private readonly _myToFactor: number;\r\n\r\n private readonly _myEasingFunction: EasingFunction;\r\n\r\n /** `Math.round` / `Math.floor` / `Math.ceil` can be used */\r\n private readonly _myRoundingFunction: ((valueToRound: number, fromValue: number, toValue: number) => number) | null;\r\n\r\n constructor(fromValue: number, toValue: number = fromValue, fromFactor: number = 0, toFactor: number = 0, easingFunction: EasingFunction = EasingFunction.linear, roundingFunction: ((valueToRound: number, fromValue: number, toValue: number) => number) | null = null) {\r\n this._myFromValue = fromValue;\r\n this._myToValue = toValue;\r\n\r\n this._myFromFactor = fromFactor;\r\n this._myToFactor = toFactor;\r\n\r\n this._myEasingFunction = easingFunction;\r\n\r\n this._myRoundingFunction = roundingFunction;\r\n }\r\n\r\n public get(factor: number): number {\r\n const interpolationFactor = this._myEasingFunction(Math.pp_mapToRange(factor, this._myFromFactor, this._myToFactor, 0, 1));\r\n let currentValue = Math.pp_lerp(this._myFromValue, this._myToValue, interpolationFactor);\r\n\r\n if (this._myRoundingFunction != null) {\r\n currentValue = this._myRoundingFunction(currentValue, this._myFromValue, this._myToValue);\r\n }\r\n\r\n return currentValue;\r\n }\r\n\r\n public getAverage(factor: number): number {\r\n return this.get(factor);\r\n }\r\n\r\n public getRange(factor: number): [number, number] {\r\n const currentValue = this.get(factor);\r\n return [currentValue, currentValue];\r\n }\r\n\r\n public getMax(factor: number): number {\r\n return this.get(factor);\r\n }\r\n\r\n public getMin(factor: number): number {\r\n return this.get(factor);\r\n }\r\n\r\n public isInside(value: number, factor: number): boolean {\r\n const currentValue = this.get(factor);\r\n\r\n return currentValue == value;\r\n }\r\n\r\n public isInsideAngleRange(value: number, factor: number): boolean {\r\n return this.isInsideAngleRangeDegrees(value, factor);\r\n }\r\n\r\n public isInsideAngleRangeDegrees(value: number, factor: number): boolean {\r\n const currentValue = this.get(factor);\r\n\r\n const clampedValue = Math.pp_angleClampDegrees(value);\r\n const clampedCurrentValue = Math.pp_angleClampDegrees(currentValue);\r\n\r\n return clampedValue == clampedCurrentValue;\r\n }\r\n\r\n public isInsideAngleRangeRadians(value: number, factor: number): boolean {\r\n const currentValue = this.get(factor);\r\n\r\n const clampedValue = Math.pp_angleClampRadians(value);\r\n const clampedCurrentValue = Math.pp_angleClampRadians(currentValue);\r\n\r\n return clampedValue == clampedCurrentValue;\r\n }\r\n}\r\n\r\nexport class IntOverFactor extends NumberOverFactor {\r\n\r\n constructor(fromValue: number, toValue: number = fromValue, fromFactor: number = 0, toFactor: number = 0, easingFunction: EasingFunction = EasingFunction.linear, roundingFunction: ((valueToRound: number, fromValue: number, toValue: number) => number) | null = null) {\r\n if (roundingFunction == null) {\r\n roundingFunction = function (valueToRound: number, fromValue: number, toValue: number): number {\r\n let roundedValue = null;\r\n\r\n const useFloor = fromValue <= toValue;\r\n if (useFloor) {\r\n roundedValue = Math.floor(valueToRound);\r\n } else {\r\n roundedValue = Math.ceil(valueToRound);\r\n }\r\n\r\n return roundedValue;\r\n };\r\n }\r\n\r\n super(fromValue, toValue, fromFactor, toFactor, easingFunction, roundingFunction);\r\n }\r\n}\r\n\r\n/** You can just put `fromRange` if u want a range that doesn't actually change -> `new NumberOverFactor([1, 25])` */\r\nexport class NumberRangeOverFactor {\r\n\r\n private readonly _myRangeStartOverFactor: NumberOverFactor;\r\n private readonly _myRangeEndOverFactor: NumberOverFactor;\r\n\r\n private readonly _myRoundingFunction: ((valueToRound: number, fromValue: number, toValue: number) => number) | null; // Math.round/floor/ceil can be used\r\n\r\n constructor(fromRange: Readonly<[number, number]>, toRange: Readonly<[number, number]> = fromRange, fromFactor: number = 0, toFactor: number = 0, easingFunction = EasingFunction.linear, roundingFunction: ((valueToRound: number, fromValue: number, toValue: number) => number) | null = null) {\r\n\r\n this._myRangeStartOverFactor = new NumberOverFactor(fromRange[0], toRange[0], fromFactor, toFactor, easingFunction, roundingFunction);\r\n this._myRangeEndOverFactor = new NumberOverFactor(fromRange[1], toRange[1], fromFactor, toFactor, easingFunction, roundingFunction);\r\n\r\n this._myRoundingFunction = roundingFunction;\r\n }\r\n\r\n public get(factor: number): number {\r\n const rangeStart = this._myRangeStartOverFactor.get(factor);\r\n const rangeEnd = this._myRangeEndOverFactor.get(factor);\r\n\r\n let randomValue = null;\r\n\r\n if (this._myRoundingFunction) {\r\n randomValue = Math.pp_randomInt(rangeStart, rangeEnd);\r\n } else {\r\n randomValue = Math.pp_random(rangeStart, rangeEnd);\r\n }\r\n\r\n return randomValue;\r\n }\r\n\r\n public getAverage(factor: number): number {\r\n const rangeStart = this._myRangeStartOverFactor.get(factor);\r\n const rangeEnd = this._myRangeEndOverFactor.get(factor);\r\n\r\n let averageValue = (rangeStart + rangeEnd) / 2;\r\n if (this._myRoundingFunction) {\r\n averageValue = this._myRoundingFunction(averageValue, rangeStart, rangeEnd);\r\n }\r\n\r\n return averageValue;\r\n }\r\n\r\n public getRange(factor: number): [number, number] {\r\n const rangeStart = this._myRangeStartOverFactor.get(factor);\r\n const rangeEnd = this._myRangeEndOverFactor.get(factor);\r\n\r\n return [rangeStart, rangeEnd];\r\n }\r\n\r\n public getMax(factor: number): number {\r\n const rangeStart = this._myRangeStartOverFactor.get(factor);\r\n const rangeEnd = this._myRangeEndOverFactor.get(factor);\r\n\r\n return Math.max(rangeStart, rangeEnd);\r\n }\r\n\r\n public getMin(factor: number): number {\r\n const rangeStart = this._myRangeStartOverFactor.get(factor);\r\n const rangeEnd = this._myRangeEndOverFactor.get(factor);\r\n\r\n return Math.min(rangeStart, rangeEnd);\r\n }\r\n\r\n public isInside(value: number, factor: number): boolean {\r\n const rangeStart = this._myRangeStartOverFactor.get(factor);\r\n const rangeEnd = this._myRangeEndOverFactor.get(factor);\r\n\r\n const min = Math.min(rangeStart, rangeEnd);\r\n const max = Math.max(rangeStart, rangeEnd);\r\n\r\n return value >= min && value <= max;\r\n }\r\n\r\n public isInsideAngleRange(value: number, factor: number): boolean {\r\n return this.isInsideAngleRangeDegrees(value, factor);\r\n }\r\n\r\n public isInsideAngleRangeDegrees(value: number, factor: number): boolean {\r\n const rangeStart = this._myRangeStartOverFactor.get(factor);\r\n const rangeEnd = this._myRangeEndOverFactor.get(factor);\r\n\r\n return Math.pp_isInsideAngleRangeDegrees(value, rangeStart, rangeEnd);\r\n }\r\n\r\n public isInsideAngleRangeRadians(value: number, factor: number): boolean {\r\n const rangeStart = this._myRangeStartOverFactor.get(factor);\r\n const rangeEnd = this._myRangeEndOverFactor.get(factor);\r\n\r\n return Math.pp_isInsideAngleRangeRadians(value, rangeStart, rangeEnd);\r\n }\r\n}\r\n\r\nexport class IntRangeOverFactor extends NumberRangeOverFactor {\r\n\r\n constructor(fromRange: Readonly<[number, number]>, toRange: Readonly<[number, number]> = fromRange, fromFactor: number = 0, toFactor: number = 0, easingFunction = EasingFunction.linear, roundingFunction: ((valueToRound: number, fromValue: number, toValue: number) => number) | null = null) {\r\n if (roundingFunction == null) {\r\n roundingFunction = function (valueToRound: number, fromValue: number, toValue: number): number {\r\n let roundedValue = null;\r\n\r\n const useFloor = fromValue <= toValue;\r\n if (useFloor) {\r\n roundedValue = Math.floor(valueToRound);\r\n } else {\r\n roundedValue = Math.ceil(valueToRound);\r\n }\r\n\r\n return roundedValue;\r\n };\r\n }\r\n\r\n super(fromRange, toRange, fromFactor, toFactor, easingFunction, roundingFunction);\r\n }\r\n}", "import { Timer } from \"../../../cauldron/cauldron/timer.js\";\r\nimport { EasingFunction, MathUtils } from \"../../../cauldron/utils/math_utils.js\";\r\n\r\nexport class AnimatedNumberParams {\r\n public myInitialValue: number = 0;\r\n\r\n public myAnimationSeconds: number = 0;\r\n public myAnimationEasingFunction: EasingFunction = EasingFunction.easeInOut;\r\n\r\n /** \r\n * If this value is not `null` it will be used as reference for the `myAnimationSeconds` time, which \r\n * will then be considered as the time to reach `myReferenceTargetValue` from `myInitialValue`\r\n * \r\n * This means that when a new target value is specified, the time to reach it will automatically be computed \r\n * based on this value, while if this value is `null` it will always take the same time (specified with `myAnimationSeconds`) \r\n * no matter how far or close the target value is from the current value\r\n */\r\n public myReferenceTargetValue: number | null = null;\r\n\r\n /**\r\n * When setting a new target value, if the animated number still has to reach the old target, do not restart\r\n * the animation towards the new target from the start of the easing curve, but continue from the current point,\r\n * but take the new computed time as the time to reach the end of the easing curve.\r\n * This make it so the \"velocity\" of the number is kept even when the target changes.\r\n * \r\n * This settings is applid only if {@link myReferenceTargetValue} is specified\r\n */\r\n public myKeepAnimationEasingProgressOnTargetUpdate: boolean = true;\r\n\r\n /** `Math.round` / `Math.floor` / `Math.ceil` can be used */\r\n public myRoundingFunction: ((valueToRound: number) => number) | null = null;\r\n}\r\n\r\nexport class AnimatedNumber {\r\n private readonly _myParams: AnimatedNumberParams;\r\n\r\n private _myCurrentValue: number = 0;\r\n private _myStartValue: number = 0;\r\n private _myTargetValue: number = 0;\r\n\r\n private readonly _myAnimationTimer: Timer = new Timer(0, false);\r\n\r\n private readonly _myEasingFunction: (valueToEase: number) => number = this._easingFunction.bind(this);\r\n private _myEasingStartValueToUse: number = 0;\r\n private _myEasingNextStartValueToUse: number = 0;\r\n\r\n constructor(params: Readonly) {\r\n this._myParams = params;\r\n\r\n this._myCurrentValue = this._myParams.myInitialValue;\r\n this._myStartValue = this._myParams.myInitialValue;\r\n this._myTargetValue = this._myParams.myInitialValue;\r\n\r\n this._myAnimationTimer.reset(this._myParams.myAnimationSeconds);\r\n }\r\n\r\n public update(dt: number): void {\r\n if (this._myAnimationTimer.isRunning()) {\r\n this._myAnimationTimer.update(dt);\r\n\r\n const animationPercentage = this._myAnimationTimer.getPercentage();\r\n this._myCurrentValue = MathUtils.interpolate(this._myStartValue, this._myTargetValue!, animationPercentage, this._myEasingFunction);\r\n }\r\n }\r\n\r\n public getParams(): AnimatedNumberParams {\r\n return this._myParams;\r\n }\r\n\r\n public getCurrentValue(): number {\r\n return this._myCurrentValue;\r\n }\r\n\r\n public getStartValue(): number {\r\n return this._myStartValue;\r\n }\r\n\r\n public getTargetValue(): number {\r\n return this._myTargetValue;\r\n }\r\n\r\n public setTargetValue(targetValue: number, forceSet: boolean = false): void {\r\n if (this._myTargetValue == targetValue && !forceSet) return;\r\n\r\n this._myTargetValue = targetValue;\r\n\r\n if (this._myParams.myReferenceTargetValue == null) {\r\n this._myStartValue = this._myCurrentValue;\r\n\r\n this._myAnimationTimer.start(this._myParams.myAnimationSeconds);\r\n } else {\r\n const distanceFromInitialToReference = Math.abs(this._myParams.myReferenceTargetValue - this._myParams.myInitialValue);\r\n const distanceFromCurrentToTarget = Math.abs(this._myTargetValue - this._myCurrentValue);\r\n\r\n const secondsToReachTarget = (distanceFromCurrentToTarget / distanceFromInitialToReference) * this._myParams.myAnimationSeconds;\r\n\r\n this._myStartValue = this._myCurrentValue;\r\n\r\n if (this._myAnimationTimer.isRunning() && this._myParams.myKeepAnimationEasingProgressOnTargetUpdate) {\r\n this._myEasingStartValueToUse = this._myEasingNextStartValueToUse;\r\n } else {\r\n this._myEasingStartValueToUse = 0;\r\n }\r\n\r\n this._myAnimationTimer.start(secondsToReachTarget);\r\n }\r\n }\r\n\r\n public end(): void {\r\n this._myAnimationTimer.end();\r\n this._myCurrentValue = MathUtils.interpolate(this._myStartValue, this._myTargetValue!, 1, this._myEasingFunction);\r\n }\r\n\r\n public isDone(): boolean {\r\n return this._myAnimationTimer.isDone();\r\n }\r\n\r\n private _easingFunction(valueToEase: number): number {\r\n const adjustedValueToEase = MathUtils.mapToRange(valueToEase, 0, 1, this._myEasingStartValueToUse, 1);\r\n this._myEasingNextStartValueToUse = adjustedValueToEase;\r\n const easedValue = this._myParams.myAnimationEasingFunction(adjustedValueToEase);\r\n return MathUtils.mapToRange(easedValue, this._myParams.myAnimationEasingFunction(this._myEasingStartValueToUse), 1, 0, 1);\r\n }\r\n}", "import { Component, MeshComponent, Object3D, property, TextComponent, WonderlandEngine } from \"@wonderlandengine/api\";\r\nimport { Cursor, CursorTarget } from \"@wonderlandengine/components\";\r\nimport { AudioPlayer } from \"../../../../audio/audio_player.js\";\r\nimport { AudioSetup } from \"../../../../audio/audio_setup.js\";\r\nimport { Timer } from \"../../../../cauldron/cauldron/timer.js\";\r\nimport { FSM, SkipStateFunction, TransitionData } from \"../../../../cauldron/fsm/fsm.js\";\r\nimport { Vector3, Vector4 } from \"../../../../cauldron/type_definitions/array_type_definitions.js\";\r\nimport { ColorUtils } from \"../../../../cauldron/utils/color_utils.js\";\r\nimport { MathUtils } from \"../../../../cauldron/utils/math_utils.js\";\r\nimport { FlatMaterial, PhongMaterial } from \"../../../../cauldron/wl/type_definitions/material_type_definitions.js\";\r\nimport { InputUtils } from \"../../../../input/cauldron/input_utils.js\";\r\nimport { vec3_create, vec4_create } from \"../../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Globals } from \"../../../../pp/globals.js\";\r\nimport { AnimatedNumber, AnimatedNumberParams } from \"../animated_number.js\";\r\n\r\n/** {@link CursorButtonState.UP} is fundamentally a {@link CursorButtonState.HOVER} but after the button has been pressed */\r\nenum CursorButtonState {\r\n UNHOVER,\r\n HOVER,\r\n DOWN,\r\n UP\r\n}\r\n\r\n/** You can return `true` to prevent the default behavior of the cursor button to be performed after the action has been handled */\r\nexport interface CursorButtonActionsHandler {\r\n\r\n onUpdate?(dt: number, cursorButtonComponent: CursorButtonComponent, cursorState: CursorButtonState): boolean;\r\n\r\n /**\r\n * @param isSecondaryCursor `true` if the event is triggered but this is not the main cursor, which means the button is not actually changing the state \r\n * so you might want to perform limited logic, like only making the gamepad pulse and \r\n * play a sound to give the cursor feel but without changing the button state\r\n * \r\n * @param isHoverFromDown `true` in the special case the button is pressed, another cursor enter the button, and the first cursor unhover\r\n * without releasing down. \r\n * In this special case the button should go back to hover, but you might just want to perform limited logic based on the fact \r\n * that is not hovering from unhover but it's a special case\r\n */\r\n onHover?(cursorButtonComponent: CursorButtonComponent, cursorComponent: Cursor, isSecondaryCursor: boolean, isHoverFromDown: boolean): boolean;\r\n\r\n /**\r\n * @param isSecondaryCursor `true` if the event is triggered but this is not the main cursor, which means the button is not actually changing the state \r\n * so you might want to perform limited logic, like only making the gamepad pulse and \r\n * play a sound to give the cursor feel but without changing the button state\r\n */\r\n onDown?(cursorButtonComponent: CursorButtonComponent, cursorComponent: Cursor, isSecondaryCursor: boolean): boolean;\r\n\r\n /**\r\n * @param isSecondaryCursor `true` if the event is triggered but this is not the main cursor, which means the button is not actually changing the state \r\n * so you might want to perform limited logic, like only making the gamepad pulse and \r\n * play a sound to give the cursor feel but without changing the button state\r\n */\r\n onUp?(cursorButtonComponent: CursorButtonComponent, cursorComponent: Cursor, isSecondaryCursor: boolean): boolean;\r\n\r\n /**\r\n * @param isSecondaryCursor `true` if the event is triggered but this is not the main cursor, which means the button is not actually changing the state \r\n * so you might want to perform limited logic, like only making the gamepad pulse and \r\n * play a sound to give the cursor feel but without changing the button state\r\n */\r\n onUnhover?(cursorButtonComponent: CursorButtonComponent, cursorComponent: Cursor, isSecondaryCursor: boolean): boolean;\r\n\r\n /** \r\n * Used to instantly reset to a complete unhover state, used for example when the button is deactivated \r\n * Usually, if something is done {@link onUnhover}, it should also be done here, but instantly instead of starting it here\r\n * and continue it in the {@link onUpdate} callback\r\n */\r\n onInstantUnhover?(cursorButtonComponent: CursorButtonComponent): boolean;\r\n}\r\n\r\nexport class CursorButtonComponent extends Component {\r\n public static override TypeName = \"pp-cursor-button\";\r\n\r\n /** This can be either a name of a component that is found on the same object of the cursor button, \r\n or the name of an handler added through `CursorButtonComponent.addButtonActionHandler` */\r\n @property.string(\"\")\r\n private readonly _myButtonActionsHandlerNames!: string;\r\n\r\n\r\n\r\n @property.float(0.075)\r\n private readonly _myScaleOffsetOnHover!: number;\r\n\r\n @property.float(-0.075)\r\n private readonly _myScaleOffsetOnDown!: number;\r\n\r\n @property.float(0.075)\r\n private readonly _myScaleOffsetOnUp!: number;\r\n\r\n\r\n\r\n @property.float(0.1)\r\n private readonly _myPulseIntensityOnHover!: number;\r\n\r\n @property.float(0)\r\n private readonly _myPulseIntensityOnDown!: number;\r\n\r\n @property.float(0.1)\r\n private readonly _myPulseIntensityOnUp!: number;\r\n\r\n @property.float(0)\r\n private readonly _myPulseIntensityOnUnhover!: number;\r\n\r\n\r\n\r\n @property.float(-0.1)\r\n private readonly _myColorBrigthnessOffsetOnHover!: number;\r\n\r\n @property.float(0)\r\n private readonly _myColorBrigthnessOffsetOnDown!: number;\r\n\r\n @property.float(-0.1)\r\n private readonly _myColorBrigthnessOffsetOnUp!: number;\r\n\r\n\r\n\r\n @property.bool(true)\r\n private readonly _myUseSpatialAudio!: boolean;\r\n\r\n @property.float(1.5)\r\n private readonly _mySpatialAudioReferenceDistance!: number;\r\n\r\n @property.string(\"\")\r\n private readonly _mySFXOnHover!: string;\r\n\r\n @property.string(\"\")\r\n private readonly _mySFXOnDown!: string;\r\n\r\n @property.string(\"\")\r\n private readonly _mySFXOnUp!: string;\r\n\r\n @property.string(\"\")\r\n private readonly _mySFXOnUnhover!: string;\r\n\r\n\r\n\r\n /** Even if you barely interact with the button, it will keep staying in this state for the specified amount */\r\n @property.float(0)\r\n private readonly _myMinHoverSecond!: number;\r\n\r\n /** Even if you barely interact with the button, it will keep staying in this state for the specified amount */\r\n @property.float(0.15)\r\n private readonly _myMinDownSecond!: number;\r\n\r\n /** Even if you barely interact with the button, it will keep staying in this state for the specified amount */\r\n @property.float(0)\r\n private readonly _myMinUpSecond!: number;\r\n\r\n /** Even if you barely interact with the button, it will keep staying in this state for the specified amount */\r\n @property.float(0)\r\n private readonly _myMinUnhoverSecond!: number;\r\n\r\n\r\n\r\n @property.bool(true)\r\n private readonly _myPerformDefaultSecondaryCursorFeedbackOnHover!: number;\r\n\r\n @property.bool(true)\r\n private readonly _myPerformDefaultSecondaryCursorFeedbackOnDown!: number;\r\n\r\n @property.bool(true)\r\n private readonly _myPerformDefaultSecondaryCursorFeedbackOnUp!: number;\r\n\r\n @property.bool(true)\r\n private readonly _myPerformDefaultSecondaryCursorFeedbackOnUnhover!: number;\r\n\r\n\r\n\r\n @property.bool(false)\r\n private readonly _myUpCursorIsMainOnlyIfLastDown!: boolean;\r\n\r\n @property.bool(false)\r\n private readonly _myUpWithSecondaryCursorIsMain!: boolean;\r\n\r\n\r\n\r\n private readonly _myCursorButtonComponentID: string = \"cursor_button_component\" + MathUtils.randomUUID();\r\n\r\n private readonly _myCursorTarget: CursorTarget | null = null;\r\n\r\n private readonly _myButtonActionsHandlers: Map = new Map();\r\n\r\n private readonly _myFSM: FSM = new FSM();\r\n private readonly _myKeepCurrentStateTimer: Timer = new Timer(0);\r\n\r\n private readonly _myTransitionQueue: [string, Cursor, boolean, boolean | null, () => void][] = [];\r\n private _myApplyQueuedTransitions: boolean = false;\r\n\r\n private _myHoverCursors: Cursor[] = [];\r\n private _myMainDownCursor: Cursor | null = null;\r\n private _myDownCursors: Cursor[] = [];\r\n\r\n private readonly _myOriginalScaleLocal: Vector3 = vec3_create();\r\n private readonly _myAnimatedScale!: AnimatedNumber;\r\n\r\n private readonly _myAnimatedColorBrightnessOffset!: AnimatedNumber;\r\n\r\n private _myFlatMaterialOriginalColors: [FlatMaterial, Vector4][] = [];\r\n private _myPhongMaterialOriginalColors: [PhongMaterial, Vector4][] = [];\r\n\r\n private _myOnHoverAudioPlayer: AudioPlayer | null = null;\r\n private _myOnDownAudioPlayer: AudioPlayer | null = null;\r\n private _myOnUpAudioPlayer: AudioPlayer | null = null;\r\n private _myOnUnhoverAudioPlayer: AudioPlayer | null = null;\r\n\r\n private _myFirstUpdate: boolean = true;\r\n\r\n private static readonly _myCursorButtonActionHandlers: Map, Map> = new Map();\r\n\r\n /** Used to add handlers for every cursor buttons that can be indexes with a string */\r\n public static addButtonActionHandler(id: string, buttonActionHandler: Readonly, engine = Globals.getMainEngine()!): void {\r\n if (!CursorButtonComponent._myCursorButtonActionHandlers.has(engine)) {\r\n CursorButtonComponent._myCursorButtonActionHandlers.set(engine, new Map());\r\n }\r\n\r\n CursorButtonComponent._myCursorButtonActionHandlers.get(engine)!.set(id, buttonActionHandler);\r\n }\r\n\r\n public static removeButtonActionHandler(id: string, engine = Globals.getMainEngine()!): void {\r\n if (CursorButtonComponent._myCursorButtonActionHandlers.has(engine)) {\r\n CursorButtonComponent._myCursorButtonActionHandlers.get(engine)!.delete(id);\r\n }\r\n }\r\n\r\n public static getButtonActionHandler(id: string, engine = Globals.getMainEngine()!): CursorButtonActionsHandler | null {\r\n const buttonActionHandler = CursorButtonComponent._myCursorButtonActionHandlers.get(engine)?.get(id);\r\n return buttonActionHandler != null ? buttonActionHandler : null;\r\n }\r\n\r\n /** Used to add handlers for this specific instance of cursor button */\r\n public addButtonActionHandler(id: unknown, buttonActionHandler: Readonly): void {\r\n this._myButtonActionsHandlers.set(id, buttonActionHandler);\r\n }\r\n\r\n public removeButtonActionHandler(id: unknown): void {\r\n this._myButtonActionsHandlers.delete(id);\r\n }\r\n\r\n public getButtonActionHandler(id: unknown): CursorButtonActionsHandler | null {\r\n const buttonActionHandler = this._myButtonActionsHandlers.get(id);\r\n return buttonActionHandler != null ? buttonActionHandler : null;\r\n }\r\n\r\n public getCurrentState(): CursorButtonState {\r\n let currentState = CursorButtonState.UNHOVER;\r\n\r\n const currentFSMState = this._myFSM.getCurrentStateData()!.myID;\r\n switch (currentFSMState) {\r\n case \"unhover\":\r\n currentState = CursorButtonState.UNHOVER;\r\n break;\r\n case \"hover\":\r\n currentState = CursorButtonState.HOVER;\r\n break;\r\n case \"down\":\r\n currentState = CursorButtonState.DOWN;\r\n break;\r\n case \"up_with_down\":\r\n currentState = CursorButtonState.UP;\r\n break;\r\n }\r\n\r\n return currentState;\r\n }\r\n\r\n public override start(): void {\r\n const buttonActionsHandlerNames = [...this._myButtonActionsHandlerNames.split(\",\")];\r\n for (let i = 0; i < buttonActionsHandlerNames.length; i++) {\r\n buttonActionsHandlerNames[i] = buttonActionsHandlerNames[i].trim();\r\n }\r\n\r\n for (const buttonActionsHandlerName of buttonActionsHandlerNames) {\r\n const buttonActionHandlerComponent = this.object.pp_getComponent(buttonActionsHandlerName) as CursorButtonActionsHandler;\r\n if (buttonActionHandlerComponent != null) {\r\n this._myButtonActionsHandlers.set(buttonActionsHandlerName, buttonActionHandlerComponent);\r\n } else {\r\n const buttonActionHandlerStatic = CursorButtonComponent.getButtonActionHandler(buttonActionsHandlerName, this.engine);\r\n if (buttonActionHandlerStatic != null) {\r\n this._myButtonActionsHandlers.set(buttonActionsHandlerName, buttonActionHandlerStatic);\r\n }\r\n }\r\n }\r\n\r\n this._myKeepCurrentStateTimer.end();\r\n\r\n this._myFSM.setLogEnabled(false, \"Cursor Button\");\r\n\r\n this._myFSM.addState(\"unhover\", { start: this._onUnhoverStart.bind(this) });\r\n this._myFSM.addState(\"hover\", { start: this._onHoverStart.bind(this) });\r\n this._myFSM.addState(\"down\", { start: this._onDownStart.bind(this) });\r\n this._myFSM.addState(\"up_with_down\", { start: this._onUpWithDownStart.bind(this) });\r\n\r\n this._myFSM.addTransition(\"unhover\", \"hover\", \"hover\");\r\n this._myFSM.addTransition(\"hover\", \"down\", \"down\");\r\n this._myFSM.addTransition(\"down\", \"up_with_down\", \"up_with_down\");\r\n this._myFSM.addTransition(\"down\", \"hover\", \"hover\");\r\n this._myFSM.addTransition(\"up_with_down\", \"unhover\", \"unhover\");\r\n this._myFSM.addTransition(\"up_with_down\", \"down\", \"down\");\r\n\r\n this._myFSM.addTransition(\"hover\", \"unhover\", \"unhover\");\r\n this._myFSM.addTransition(\"down\", \"unhover\", \"unhover\");\r\n\r\n this._myFSM.addTransition(\"hover\", \"unhover\", \"instant_unhover\", this._onInstantUnhover.bind(this), SkipStateFunction.BOTH);\r\n this._myFSM.addTransition(\"up_with_down\", \"unhover\", \"instant_unhover\", this._onInstantUnhover.bind(this), SkipStateFunction.BOTH);\r\n this._myFSM.addTransition(\"down\", \"unhover\", \"instant_unhover\", this._onInstantUnhover.bind(this), SkipStateFunction.BOTH);\r\n this._myFSM.addTransition(\"unhover\", \"unhover\", \"instant_unhover\", this._onInstantUnhover.bind(this), SkipStateFunction.BOTH);\r\n\r\n this._myFSM.init(\"unhover\");\r\n }\r\n\r\n private _start(): void {\r\n this._setupVisualsAndSFXs();\r\n\r\n (this._myCursorTarget as (CursorTarget | null)) = this.object.pp_getComponent(CursorTarget);\r\n this.onActivate();\r\n }\r\n\r\n private static readonly _updateSV =\r\n {\r\n buttonScale: vec3_create(),\r\n hsvColor: vec4_create(),\r\n rgbColor: vec4_create()\r\n };\r\n public override update(dt: number): void {\r\n if (this._myFirstUpdate) {\r\n this._start();\r\n this._myFirstUpdate = false;\r\n }\r\n\r\n this._myFSM.update(dt);\r\n\r\n if (this._myKeepCurrentStateTimer.isRunning()) {\r\n this._myKeepCurrentStateTimer.update(dt);\r\n if (this._myKeepCurrentStateTimer.isDone()) {\r\n this._myApplyQueuedTransitions = true;\r\n }\r\n }\r\n\r\n if (this._myApplyQueuedTransitions) {\r\n this._myApplyQueuedTransitions = false;\r\n\r\n while (this._myTransitionQueue.length > 0) {\r\n const transitionToApply = this._myTransitionQueue.shift()!;\r\n\r\n if (this._myFSM.canPerform(transitionToApply[0])) {\r\n if (transitionToApply[3] != null) {\r\n this._myFSM.perform(transitionToApply[0], transitionToApply[1], transitionToApply[2], transitionToApply[3]);\r\n } else {\r\n this._myFSM.perform(transitionToApply[0], transitionToApply[1], transitionToApply[2]);\r\n }\r\n } else {\r\n transitionToApply[4]();\r\n }\r\n\r\n if (this._myKeepCurrentStateTimer.isRunning()) {\r\n break;\r\n }\r\n }\r\n }\r\n\r\n let skipDefault = false;\r\n for (const buttonActionsHandler of this._myButtonActionsHandlers.values()) {\r\n if (buttonActionsHandler.onUpdate != null) {\r\n skipDefault ||= buttonActionsHandler.onUpdate(dt, this, this.getCurrentState());\r\n }\r\n }\r\n\r\n if (!skipDefault) {\r\n if (!this._myAnimatedScale.isDone()) {\r\n this._myAnimatedScale.update(dt);\r\n\r\n const buttonScale = CursorButtonComponent._updateSV.buttonScale;\r\n this.object.pp_setScaleLocal(this._myOriginalScaleLocal.vec3_scale(this._myAnimatedScale.getCurrentValue(), buttonScale));\r\n }\r\n\r\n if (!this._myAnimatedColorBrightnessOffset.isDone()) {\r\n this._myAnimatedColorBrightnessOffset.update(dt);\r\n\r\n const colorBrightnessOffsetCurrentValue = this._myAnimatedColorBrightnessOffset.getCurrentValue();\r\n\r\n const hsvColor = CursorButtonComponent._updateSV.hsvColor;\r\n const rgbColor = CursorButtonComponent._updateSV.rgbColor;\r\n\r\n for (const [material, originalColor] of this._myPhongMaterialOriginalColors) {\r\n ColorUtils.rgbToHSV(originalColor, hsvColor);\r\n hsvColor[2] = MathUtils.clamp(hsvColor[2] + colorBrightnessOffsetCurrentValue, 0, 1);\r\n material.diffuseColor = ColorUtils.hsvToRGB(hsvColor, rgbColor);\r\n }\r\n\r\n for (const [material, originalColor] of this._myFlatMaterialOriginalColors) {\r\n ColorUtils.rgbToHSV(originalColor, hsvColor);\r\n hsvColor[2] = MathUtils.clamp(hsvColor[2] + colorBrightnessOffsetCurrentValue, 0, 1);\r\n material.color = ColorUtils.hsvToRGB(hsvColor, rgbColor);\r\n }\r\n }\r\n }\r\n }\r\n\r\n private _onUnhover(targetObject: Object3D, cursorComponent: Cursor): void {\r\n this._myHoverCursors.pp_removeEqual(cursorComponent);\r\n const cursorWasDown = this._myDownCursors.pp_removeEqual(cursorComponent);\r\n\r\n const isMainCursorDown = (this._myDownCursors.length == 0 && cursorWasDown) || (this._myMainDownCursor == cursorComponent && !this._myUpCursorIsMainOnlyIfLastDown && !this._myUpWithSecondaryCursorIsMain);\r\n\r\n if (isMainCursorDown) {\r\n this._myMainDownCursor = null;\r\n\r\n if (this._myHoverCursors.length > 0) {\r\n this._addToTransitionQueue(\"hover\", cursorComponent, false, true, this._onHoverStart.bind(this, null, null, cursorComponent, true, true));\r\n } else {\r\n this._addToTransitionQueue(\"unhover\", cursorComponent, false, null, this._onUnhoverStart.bind(this, null, null, cursorComponent, true));\r\n }\r\n } else {\r\n if (this._myMainDownCursor == cursorComponent) {\r\n this._myMainDownCursor = this._myDownCursors[0];\r\n }\r\n\r\n const isSecondaryCursor = this._myHoverCursors.length > 0;\r\n\r\n this._addToTransitionQueue(\"unhover\", cursorComponent, isSecondaryCursor, null, this._onUnhoverStart.bind(this, null, null, cursorComponent, true));\r\n }\r\n }\r\n\r\n private _onHover(targetObject: Object3D, cursorComponent: Cursor): void {\r\n const isSecondaryCursor = this._myHoverCursors.length > 0;\r\n\r\n this._myHoverCursors.pp_pushUnique(cursorComponent);\r\n\r\n this._addToTransitionQueue(\"hover\", cursorComponent, isSecondaryCursor, false, this._onHoverStart.bind(this, null, null, cursorComponent, true, false));\r\n }\r\n\r\n private _onDown(targetObject: Object3D, cursorComponent: Cursor): void {\r\n const isSecondaryCursor = this._myMainDownCursor != null && this._myMainDownCursor != cursorComponent;\r\n\r\n if (this._myMainDownCursor == null) {\r\n this._myMainDownCursor = cursorComponent;\r\n }\r\n\r\n this._myDownCursors.pp_pushUnique(cursorComponent);\r\n\r\n this._addToTransitionQueue(\"down\", cursorComponent, isSecondaryCursor, null, this._onDownStart.bind(this, null, null, cursorComponent, true));\r\n }\r\n\r\n private onUpWithDown(targetObject: Object3D, cursorComponent: Cursor): void {\r\n this._myDownCursors.pp_removeEqual(cursorComponent);\r\n\r\n const isSecondaryCursor = !this._myUpWithSecondaryCursorIsMain && (\r\n (!this._myUpCursorIsMainOnlyIfLastDown && this._myMainDownCursor != cursorComponent) ||\r\n (this._myUpCursorIsMainOnlyIfLastDown && this._myDownCursors.length > 0));\r\n\r\n if (!isSecondaryCursor) {\r\n this._myMainDownCursor = null;\r\n } else if (this._myMainDownCursor == cursorComponent) {\r\n this._myMainDownCursor = this._myDownCursors[0];\r\n }\r\n\r\n this._addToTransitionQueue(\"up_with_down\", cursorComponent, isSecondaryCursor, null, this._onUpWithDownStart.bind(this, null, null, cursorComponent, true));\r\n }\r\n\r\n private _addToTransitionQueue(transitionToPerform: string, cursorComponent: Cursor, isSecondaryCursor: boolean, isHoverFromDown: boolean | null, startCallback: () => void): void {\r\n if (!isSecondaryCursor) {\r\n if (!this._myKeepCurrentStateTimer.isDone()) {\r\n const index = this._myTransitionQueue.pp_findIndex((elementToCheck: [string, Cursor, boolean, boolean | null, () => void]) => {\r\n return elementToCheck[0] == transitionToPerform && elementToCheck[1] == cursorComponent && elementToCheck[2] == isSecondaryCursor && elementToCheck[3] == isHoverFromDown;\r\n });\r\n\r\n if (index == -1) {\r\n this._myTransitionQueue.push([transitionToPerform, cursorComponent, isSecondaryCursor, isHoverFromDown, startCallback]);\r\n } else {\r\n this._myTransitionQueue.splice(index + 1);\r\n }\r\n } else if (this._myFSM.canPerform(transitionToPerform)) {\r\n this._myFSM.perform(transitionToPerform, cursorComponent, isSecondaryCursor, isHoverFromDown);\r\n } else {\r\n startCallback();\r\n }\r\n } else {\r\n startCallback();\r\n }\r\n }\r\n\r\n private _onInstantUnhover(fsm: FSM | null, transitionData: Readonly | null): void {\r\n let skipDefault = false;\r\n for (const buttonActionsHandler of this._myButtonActionsHandlers.values()) {\r\n if (buttonActionsHandler.onInstantUnhover != null) {\r\n skipDefault ||= buttonActionsHandler.onInstantUnhover(this);\r\n }\r\n }\r\n\r\n if (skipDefault) {\r\n return;\r\n }\r\n\r\n {\r\n this._myAnimatedScale.setTargetValue(1);\r\n this._myAnimatedScale.end();\r\n\r\n this.object.pp_setScaleLocal(this._myOriginalScaleLocal.vec3_scale(this._myAnimatedScale.getCurrentValue()));\r\n }\r\n\r\n {\r\n this._myAnimatedColorBrightnessOffset.setTargetValue(0);\r\n this._myAnimatedColorBrightnessOffset.end();\r\n\r\n const colorBrightnessOffsetCurrentValue = this._myAnimatedColorBrightnessOffset.getCurrentValue();\r\n\r\n for (const [material, originalColor] of this._myPhongMaterialOriginalColors) {\r\n const hsvColor = ColorUtils.rgbToHSV(originalColor);\r\n hsvColor[2] = MathUtils.clamp(hsvColor[2] + colorBrightnessOffsetCurrentValue, 0, 1);\r\n material.diffuseColor = ColorUtils.hsvToRGB(hsvColor);\r\n }\r\n\r\n for (const [material, originalColor] of this._myFlatMaterialOriginalColors) {\r\n const hsvColor = ColorUtils.rgbToHSV(originalColor);\r\n hsvColor[2] = MathUtils.clamp(hsvColor[2] + colorBrightnessOffsetCurrentValue, 0, 1);\r\n material.color = ColorUtils.hsvToRGB(hsvColor);\r\n }\r\n }\r\n }\r\n\r\n private _onUnhoverStart(fsm: FSM | null, transitionData: Readonly | null, cursorComponent: Cursor, isSecondaryCursor: boolean): void {\r\n if (!isSecondaryCursor) {\r\n this._myKeepCurrentStateTimer.start(this._myMinUnhoverSecond);\r\n this._myKeepCurrentStateTimer.update(0); // Instantly end the timer if the duration is 0\r\n }\r\n\r\n let skipDefault = false;\r\n for (const buttonActionsHandler of this._myButtonActionsHandlers.values()) {\r\n if (buttonActionsHandler.onUnhover != null) {\r\n skipDefault ||= buttonActionsHandler.onUnhover(this, cursorComponent, isSecondaryCursor);\r\n }\r\n }\r\n\r\n if (skipDefault) {\r\n return;\r\n }\r\n\r\n if (!isSecondaryCursor) {\r\n if (this._myScaleOffsetOnHover != 0 || this._myScaleOffsetOnDown != 0 || this._myScaleOffsetOnUp != 0) {\r\n this._myAnimatedScale.setTargetValue(1);\r\n }\r\n }\r\n\r\n if (!isSecondaryCursor || this._myPerformDefaultSecondaryCursorFeedbackOnUnhover) {\r\n if (this._myPulseIntensityOnUnhover != 0) {\r\n const handedness = InputUtils.getHandednessByString(cursorComponent.handedness as string);\r\n if (handedness != null) {\r\n Globals.getGamepads()![handedness].pulse(this._myPulseIntensityOnUnhover, 0.085);\r\n }\r\n }\r\n }\r\n\r\n if (!isSecondaryCursor) {\r\n if (this._myColorBrigthnessOffsetOnHover != 0 || this._myColorBrigthnessOffsetOnDown != 0 || this._myColorBrigthnessOffsetOnUp != 0) {\r\n this._myAnimatedColorBrightnessOffset.setTargetValue(0);\r\n }\r\n }\r\n\r\n if (!isSecondaryCursor || this._myPerformDefaultSecondaryCursorFeedbackOnUnhover) {\r\n if (this._myOnUnhoverAudioPlayer != null) {\r\n this._myOnUnhoverAudioPlayer.setPosition(this.object.pp_getPosition());\r\n this._myOnUnhoverAudioPlayer.play();\r\n }\r\n }\r\n }\r\n\r\n private _onHoverStart(fsm: FSM | null, transitionData: Readonly | null, cursorComponent: Cursor, isSecondaryCursor: boolean, isHoverFromDown: boolean): void {\r\n if (!isSecondaryCursor) {\r\n this._myKeepCurrentStateTimer.start(this._myMinHoverSecond);\r\n this._myKeepCurrentStateTimer.update(0); // Instantly end the timer if the duration is 0\r\n }\r\n\r\n let skipDefault = false;\r\n for (const buttonActionsHandler of this._myButtonActionsHandlers.values()) {\r\n if (buttonActionsHandler.onHover != null) {\r\n skipDefault ||= buttonActionsHandler.onHover(this, cursorComponent, isSecondaryCursor, isHoverFromDown);\r\n }\r\n }\r\n\r\n if (skipDefault) {\r\n return;\r\n }\r\n\r\n if (!isSecondaryCursor) {\r\n if (this._myScaleOffsetOnHover != 0 || this._myScaleOffsetOnDown != 0 || this._myScaleOffsetOnUp != 0) {\r\n this._myAnimatedScale.setTargetValue(1 + this._myScaleOffsetOnHover);\r\n }\r\n }\r\n\r\n if (!isSecondaryCursor || this._myPerformDefaultSecondaryCursorFeedbackOnHover) {\r\n if (this._myPulseIntensityOnHover != 0) {\r\n const handedness = InputUtils.getHandednessByString(cursorComponent.handedness as string);\r\n if (handedness != null) {\r\n Globals.getGamepads()![handedness].pulse(this._myPulseIntensityOnHover, 0.085);\r\n }\r\n }\r\n }\r\n\r\n if (!isSecondaryCursor) {\r\n if (this._myColorBrigthnessOffsetOnHover != 0 || this._myColorBrigthnessOffsetOnDown != 0 || this._myColorBrigthnessOffsetOnUp != 0) {\r\n this._myAnimatedColorBrightnessOffset.setTargetValue(this._myColorBrigthnessOffsetOnHover);\r\n }\r\n }\r\n\r\n if (!isSecondaryCursor || this._myPerformDefaultSecondaryCursorFeedbackOnHover) {\r\n if (this._myOnHoverAudioPlayer != null) {\r\n this._myOnHoverAudioPlayer.setPosition(this.object.pp_getPosition());\r\n this._myOnHoverAudioPlayer.play();\r\n }\r\n }\r\n }\r\n\r\n private _onDownStart(fsm: FSM | null, transitionData: Readonly | null, cursorComponent: Cursor, isSecondaryCursor: boolean): void {\r\n if (!isSecondaryCursor) {\r\n this._myKeepCurrentStateTimer.start(this._myMinDownSecond);\r\n this._myKeepCurrentStateTimer.update(0); // Instantly end the timer if the duration is 0\r\n }\r\n\r\n let skipDefault = false;\r\n for (const buttonActionsHandler of this._myButtonActionsHandlers.values()) {\r\n if (buttonActionsHandler.onDown != null) {\r\n skipDefault ||= buttonActionsHandler.onDown(this, cursorComponent, isSecondaryCursor);\r\n }\r\n }\r\n\r\n if (skipDefault) {\r\n return;\r\n }\r\n\r\n if (!isSecondaryCursor) {\r\n if (this._myScaleOffsetOnHover != 0 || this._myScaleOffsetOnDown != 0 || this._myScaleOffsetOnUp != 0) {\r\n this._myAnimatedScale.setTargetValue(1 + this._myScaleOffsetOnDown);\r\n }\r\n }\r\n\r\n if (!isSecondaryCursor || this._myPerformDefaultSecondaryCursorFeedbackOnDown) {\r\n if (this._myPulseIntensityOnDown != 0) {\r\n const handedness = InputUtils.getHandednessByString(cursorComponent.handedness as string);\r\n if (handedness != null) {\r\n Globals.getGamepads()![handedness].pulse(this._myPulseIntensityOnDown, 0.085);\r\n }\r\n }\r\n }\r\n\r\n if (!isSecondaryCursor) {\r\n if (this._myColorBrigthnessOffsetOnHover != 0 || this._myColorBrigthnessOffsetOnDown != 0 || this._myColorBrigthnessOffsetOnUp != 0) {\r\n this._myAnimatedColorBrightnessOffset.setTargetValue(this._myColorBrigthnessOffsetOnDown);\r\n }\r\n }\r\n\r\n if (!isSecondaryCursor || this._myPerformDefaultSecondaryCursorFeedbackOnDown) {\r\n if (this._myOnDownAudioPlayer != null) {\r\n this._myOnDownAudioPlayer.setPosition(this.object.pp_getPosition());\r\n this._myOnDownAudioPlayer.play();\r\n }\r\n }\r\n }\r\n\r\n private _onUpWithDownStart(fsm: FSM | null, transitionData: Readonly | null, cursorComponent: Cursor, isSecondaryCursor: boolean): void {\r\n if (!isSecondaryCursor) {\r\n this._myKeepCurrentStateTimer.start(this._myMinUpSecond);\r\n this._myKeepCurrentStateTimer.update(0); // Instantly end the timer if the duration is 0\r\n }\r\n\r\n let skipDefault = false;\r\n for (const buttonActionsHandler of this._myButtonActionsHandlers.values()) {\r\n if (buttonActionsHandler.onUp != null) {\r\n skipDefault ||= buttonActionsHandler.onUp(this, cursorComponent, isSecondaryCursor);\r\n }\r\n }\r\n\r\n if (skipDefault) {\r\n return;\r\n }\r\n\r\n if (!isSecondaryCursor) {\r\n if (this._myScaleOffsetOnHover != 0 || this._myScaleOffsetOnDown != 0 || this._myScaleOffsetOnUp != 0) {\r\n this._myAnimatedScale.setTargetValue(1 + this._myScaleOffsetOnUp);\r\n }\r\n }\r\n\r\n if (!isSecondaryCursor || this._myPerformDefaultSecondaryCursorFeedbackOnUp) {\r\n if (this._myPulseIntensityOnUp != 0) {\r\n const handedness = InputUtils.getHandednessByString(cursorComponent.handedness as string);\r\n if (handedness != null) {\r\n Globals.getGamepads()![handedness].pulse(this._myPulseIntensityOnUp, 0.085);\r\n }\r\n }\r\n }\r\n\r\n if (!isSecondaryCursor) {\r\n if (this._myColorBrigthnessOffsetOnHover != 0 || this._myColorBrigthnessOffsetOnDown != 0 || this._myColorBrigthnessOffsetOnUp != 0) {\r\n this._myAnimatedColorBrightnessOffset.setTargetValue(this._myColorBrigthnessOffsetOnUp);\r\n }\r\n }\r\n\r\n if (!isSecondaryCursor || this._myPerformDefaultSecondaryCursorFeedbackOnUp) {\r\n if (this._myOnUpAudioPlayer != null) {\r\n this._myOnUpAudioPlayer.setPosition(this.object.pp_getPosition());\r\n this._myOnUpAudioPlayer.play();\r\n }\r\n }\r\n }\r\n\r\n private _setupVisualsAndSFXs(): void {\r\n this.object.pp_getScaleLocal(this._myOriginalScaleLocal);\r\n\r\n const animatedScaleParams = new AnimatedNumberParams();\r\n animatedScaleParams.myInitialValue = this._myOriginalScaleLocal[0];\r\n animatedScaleParams.myAnimationSeconds = 0.25;\r\n (this._myAnimatedScale as AnimatedNumber) = new AnimatedNumber(animatedScaleParams);\r\n\r\n const animatedColorBrightnessOffsetParams = new AnimatedNumberParams();\r\n animatedColorBrightnessOffsetParams.myInitialValue = 0;\r\n animatedColorBrightnessOffsetParams.myAnimationSeconds = 0.25;\r\n (this._myAnimatedColorBrightnessOffset as AnimatedNumber) = new AnimatedNumber(animatedColorBrightnessOffsetParams);\r\n\r\n const meshComponents = this.object.pp_getComponents(MeshComponent);\r\n for (const meshComponent of meshComponents) {\r\n meshComponent.material = meshComponent.material?.clone();\r\n\r\n const phongMaterial = meshComponent.material as PhongMaterial;\r\n if (phongMaterial.diffuseColor != null) {\r\n this._myPhongMaterialOriginalColors.push([phongMaterial, phongMaterial.diffuseColor.vec4_clone()]);\r\n } else {\r\n const flatMaterial = meshComponent.material as FlatMaterial;\r\n if (flatMaterial.color != null) {\r\n this._myFlatMaterialOriginalColors.push([flatMaterial, flatMaterial.color.vec4_clone()]);\r\n }\r\n }\r\n }\r\n\r\n const textComponents = this.object.pp_getComponents(TextComponent);\r\n for (const textComponent of textComponents) {\r\n textComponent.material = textComponent.material?.clone();\r\n\r\n const flatMaterial = textComponent.material as FlatMaterial;\r\n if (flatMaterial.color != null) {\r\n this._myFlatMaterialOriginalColors.push([flatMaterial, flatMaterial.color.vec4_clone()]);\r\n }\r\n }\r\n\r\n const audioManager = Globals.getAudioManager(this.engine)!;\r\n if (this._mySFXOnHover.length > 0) {\r\n const audioSetup = new AudioSetup(this._mySFXOnHover);\r\n audioSetup.mySpatial = this._myUseSpatialAudio;\r\n audioSetup.myReferenceDistance = this._mySpatialAudioReferenceDistance;\r\n\r\n const audioID = this._myCursorButtonComponentID + \"_on_hover\";\r\n audioManager.addAudioSetup(audioID, audioSetup);\r\n\r\n this._myOnHoverAudioPlayer = audioManager.createAudioPlayer(audioID);\r\n }\r\n\r\n if (this._mySFXOnDown.length > 0) {\r\n const audioSetup = new AudioSetup(this._mySFXOnDown);\r\n audioSetup.mySpatial = this._myUseSpatialAudio;\r\n audioSetup.myReferenceDistance = this._mySpatialAudioReferenceDistance;\r\n\r\n const audioID = this._myCursorButtonComponentID + \"_on_down\";\r\n audioManager.addAudioSetup(audioID, audioSetup);\r\n\r\n this._myOnDownAudioPlayer = audioManager.createAudioPlayer(audioID);\r\n }\r\n\r\n if (this._mySFXOnUp.length > 0) {\r\n const audioSetup = new AudioSetup(this._mySFXOnUp);\r\n audioSetup.mySpatial = this._myUseSpatialAudio;\r\n audioSetup.myReferenceDistance = this._mySpatialAudioReferenceDistance;\r\n\r\n const audioID = this._myCursorButtonComponentID + \"_on_up\";\r\n audioManager.addAudioSetup(audioID, audioSetup);\r\n\r\n this._myOnUpAudioPlayer = audioManager.createAudioPlayer(audioID);\r\n }\r\n\r\n if (this._mySFXOnUnhover.length > 0) {\r\n const audioSetup = new AudioSetup(this._mySFXOnUnhover);\r\n audioSetup.mySpatial = this._myUseSpatialAudio;\r\n audioSetup.myReferenceDistance = this._mySpatialAudioReferenceDistance;\r\n\r\n const audioID = this._myCursorButtonComponentID + \"_on_unhover\";\r\n audioManager.addAudioSetup(audioID, audioSetup);\r\n\r\n this._myOnUnhoverAudioPlayer = audioManager.createAudioPlayer(audioID);\r\n }\r\n }\r\n\r\n public override onActivate(): void {\r\n if (this._myCursorTarget != null) {\r\n this._myCursorTarget.onUnhover.add(this._onUnhover.bind(this), { id: this });\r\n this._myCursorTarget.onHover.add(this._onHover.bind(this), { id: this });\r\n this._myCursorTarget.onDown.add(this._onDown.bind(this), { id: this });\r\n this._myCursorTarget.onUpWithDown.add(this.onUpWithDown.bind(this), { id: this });\r\n }\r\n }\r\n\r\n public override onDeactivate(): void {\r\n if (this._myCursorTarget != null) {\r\n this._myCursorTarget.onUnhover.remove(this);\r\n this._myCursorTarget.onHover.remove(this);\r\n this._myCursorTarget.onDown.remove(this);\r\n this._myCursorTarget.onUpWithDown.remove(this);\r\n\r\n this._myKeepCurrentStateTimer.end();\r\n this._myTransitionQueue.pp_clear();\r\n this._myApplyQueuedTransitions = false;\r\n\r\n this._myHoverCursors.pp_clear();\r\n this._myMainDownCursor = null;\r\n this._myDownCursors.pp_clear();\r\n\r\n this._myFSM.perform(\"instant_unhover\");\r\n }\r\n }\r\n}", "import { Component, Property } from \"@wonderlandengine/api\";\r\nimport { Timer } from \"../../../../cauldron/cauldron/timer.js\";\r\nimport { EasingFunction, MathUtils } from \"../../../../cauldron/utils/math_utils.js\";\r\nimport { ComponentUtils } from \"../../../../cauldron/wl/utils/component_utils.js\";\r\nimport { vec3_create } from \"../../../../plugin/js/extensions/array/vec_create_extension.js\";\r\n\r\nexport class ScaleOnSpawnComponent extends Component {\r\n static TypeName = \"pp-scale-on-spawn\";\r\n static Properties = {\r\n _myStartDelay: Property.float(0.0),\r\n _myScaleDuration: Property.float(0.0)\r\n };\r\n\r\n init() {\r\n this._myTargetScale = vec3_create(1, 1, 1);\r\n }\r\n\r\n start() {\r\n this.object.pp_setScale(MathUtils.EPSILON);\r\n\r\n this._myDelayTimer = new Timer(this._myStartDelay);\r\n this._myScaleDurationTimer = new Timer(this._myScaleDuration);\r\n }\r\n\r\n update(dt) {\r\n if (this._myDelayTimer.isRunning()) {\r\n this._myDelayTimer.update(dt);\r\n } else if (this._myScaleDurationTimer.isRunning()) {\r\n this._myScaleDurationTimer.update(dt);\r\n\r\n this.object.pp_setScale(this._myTargetScale.vec3_scale(EasingFunction.easeOut(this._myScaleDurationTimer.getPercentage())));\r\n }\r\n }\r\n\r\n onActivate() {\r\n this.start();\r\n }\r\n\r\n pp_clone(targetObject) {\r\n let clonedComponent = ComponentUtils.cloneDefault(this, targetObject);\r\n\r\n return clonedComponent;\r\n }\r\n}", "import { Component, Emitter, PhysXComponent, Property } from \"@wonderlandengine/api\";\r\nimport { ComponentUtils } from \"../../cauldron/wl/utils/component_utils.js\";\r\nimport { vec3_create } from \"../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Globals } from \"../../pp/globals.js\";\r\n\r\nexport class GrabbableComponent extends Component {\r\n static TypeName = \"pp-grabbable\";\r\n static Properties = {\r\n _myThrowLinearVelocityMultiplier: Property.float(1),\r\n _myThrowAngularVelocityMultiplier: Property.float(1),\r\n _myKinematicValueOnRelease: Property.enum([\"True\", \"False\", \"Own\"], \"False\"),\r\n _myParentOnRelease: Property.enum([\"Scene\", \"Own\"], \"Own\")\r\n };\r\n\r\n init() {\r\n this._myGrabbed = false;\r\n\r\n this._myGrabber = null;\r\n\r\n this._myOldParent = null;\r\n this._myPhysX = null;\r\n this._myOldKinematicValue = null;\r\n\r\n this._myGrabEmitter = new Emitter(); // Signature: listener(grabber, grabbable)\r\n this._myThrowEmitter = new Emitter(); // Signature: listener(grabber, grabbable)\r\n this._myReleaseEmitter = new Emitter(); // Signature: listener(grabber, grabbable, isThrow)\r\n\r\n this._mySceneParent = null;\r\n }\r\n\r\n start() {\r\n this._myOldParent = this.object.pp_getParent();\r\n this._myPhysX = this.object.pp_getComponent(PhysXComponent);\r\n }\r\n\r\n update(dt) {\r\n this._mySceneParent = Globals.getSceneObjects(this.engine)?.myDynamics ?? null;\r\n }\r\n\r\n onActivate() {\r\n this._mySceneParent = Globals.getSceneObjects(this.engine)?.myDynamics ?? null;\r\n }\r\n\r\n onDeactivate() {\r\n this.release();\r\n }\r\n\r\n grab(grabber) {\r\n if (!this.isGrabbed()) {\r\n this._myOldKinematicValue = this._myPhysX.kinematic;\r\n }\r\n\r\n this.release();\r\n\r\n this._myPhysX.kinematic = true;\r\n\r\n this._myOldParent = this.object.pp_getParent();\r\n this.object.pp_setParent(grabber);\r\n\r\n this._myGrabbed = true;\r\n\r\n this._myGrabEmitter.notify(grabber, this);\r\n }\r\n\r\n throw(linearVelocity, angularVelocity) {\r\n if (this._myGrabbed) {\r\n let grabber = this._myGrabber;\r\n\r\n this._release();\r\n\r\n // #TODO For now kinematic is not updated instantly, add the if as soon as it is\r\n //if (!this._myPhysX.kinematic) {\r\n this._myPhysX.linearVelocity = linearVelocity.vec3_scale(this._myThrowLinearVelocityMultiplier);\r\n this._myPhysX.angularVelocity = angularVelocity.vec3_scale(this._myThrowAngularVelocityMultiplier);\r\n //}\r\n\r\n this._myThrowEmitter.notify(grabber, this);\r\n this._myReleaseEmitter.notify(grabber, this, true);\r\n }\r\n }\r\n\r\n release() {\r\n if (this._myGrabbed) {\r\n let grabber = this._myGrabber;\r\n\r\n this._release();\r\n\r\n this._myReleaseEmitter.notify(grabber, this, false);\r\n }\r\n }\r\n\r\n getLinearVelocity() {\r\n return this._myPhysX.linearVelocity.vec3_clone();\r\n }\r\n\r\n getAngularVelocity() {\r\n return this.getAngularVelocityDegrees();\r\n }\r\n\r\n getAngularVelocityDegrees() {\r\n let angularVelocityDegrees = vec3_create();\r\n\r\n this._myPhysX.angularVelocity.vec3_toDegrees(angularVelocityDegrees);\r\n\r\n return angularVelocityDegrees;\r\n }\r\n\r\n getAngularVelocityRadians() {\r\n return this._myPhysX.angularVelocity.vec3_clone();\r\n }\r\n\r\n isGrabbed() {\r\n return this._myGrabbed;\r\n }\r\n\r\n getGrabber() {\r\n return this._myGrabber;\r\n }\r\n\r\n registerGrabEventListener(id, listener) {\r\n this._myGrabEmitter.add(listener, { id: id });\r\n }\r\n\r\n unregisterGrabEventListener(id) {\r\n this._myGrabEmitter.remove(id);\r\n }\r\n\r\n registerThrowEventListener(id, listener) {\r\n this._myThrowEmitter.add(listener, { id: id });\r\n }\r\n\r\n unregisterThrowEventListener(id) {\r\n this._myThrowEmitter.remove(id);\r\n }\r\n\r\n registerReleaseEventListener(id, listener) {\r\n this._myReleaseEmitter.add(listener, { id: id });\r\n }\r\n\r\n unregisterReleaseEventListener(id) {\r\n this._myReleaseEmitter.remove(id);\r\n }\r\n\r\n _release() {\r\n if (this._myParentOnRelease == 0) {\r\n this.object.pp_setParent(this._mySceneParent);\r\n } else {\r\n this.object.pp_setParent(this._myOldParent);\r\n }\r\n\r\n this._myGrabbed = false;\r\n this._myGrabber = null;\r\n\r\n if (this._myKinematicValueOnRelease == 0) {\r\n this._myPhysX.kinematic = true;\r\n } else if (this._myKinematicValueOnRelease == 1) {\r\n this._myPhysX.kinematic = false;\r\n } else if (this._myOldKinematicValue != null) {\r\n this._myPhysX.kinematic = this._myOldKinematicValue;\r\n }\r\n\r\n if (this._myPhysX.kinematic) {\r\n this._myPhysX.linearVelocity = vec3_create();\r\n this._myPhysX.angularVelocity = vec3_create();\r\n }\r\n }\r\n\r\n pp_clone(targetObject) {\r\n let clonedComponent = ComponentUtils.cloneDefault(this, targetObject);\r\n\r\n return clonedComponent;\r\n }\r\n\r\n pp_clonePostProcess(clonedComponent) {\r\n clonedComponent.start();\r\n }\r\n}", "import { Component, Emitter, PhysXComponent, Property } from \"@wonderlandengine/api\";\r\nimport { PhysicsCollisionCollector } from \"../../cauldron/physics/physics_collision_collector.js\";\r\nimport { EasingFunction } from \"../../cauldron/utils/math_utils.js\";\r\nimport { HandednessIndex, InputSourceType } from \"../../input/cauldron/input_types.js\";\r\nimport { InputUtils } from \"../../input/cauldron/input_utils.js\";\r\nimport { GamepadButtonID } from \"../../input/gamepad/gamepad_buttons.js\";\r\nimport { vec3_create, vec4_create } from \"../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Globals } from \"../../pp/globals.js\";\r\nimport { GrabbableComponent } from \"./grabbable_component.js\";\r\n\r\nexport class GrabberHandComponent extends Component {\r\n static TypeName = \"pp-grabber-hand\";\r\n static Properties = {\r\n _myHandedness: Property.enum([\"Left\", \"Right\"], \"Left\"),\r\n _myGrabButton: Property.enum([\"Select\", \"Squeeze\", \"Both\", \"Both Exclusive\"], \"Squeeze\"), // @\"Both Exclusive\" means u can use both buttons but you have to use the same button you grabbed with to throw\r\n _mySnapGrabbableToOrigin: Property.bool(false),\r\n _myMaxNumberOfObjects: Property.int(1), // How many objects you can grab at the same time\r\n\r\n // ADVANCED SETTINGS\r\n _myThrowVelocitySource: Property.enum([\"Hand\", \"Grabbable\"], \"Hand\"),\r\n _myThrowLinearVelocityMultiplier: Property.float(1), // Multiply the overall throw speed, so slow throws will be multiplied too\r\n _myThrowMaxLinearSpeed: Property.float(15),\r\n _myThrowAngularVelocityMultiplier: Property.float(0.5),\r\n _myThrowMaxAngularSpeed: Property.float(1080), // @Degrees\r\n _myThrowLinearVelocityBoost: Property.float(1.75), // This boost is applied from 0% to 100% based on how fast you throw, so slow throws are not affected\r\n _myThrowLinearVelocityBoostMinSpeedThreshold: Property.float(0.6), // 0% boost is applied if plain throw speed is under this value\r\n _myThrowLinearVelocityBoostMaxSpeedThreshold: Property.float(2.5), // 100% boost is applied if plain throw speed is over this value\r\n };\r\n\r\n init() {\r\n this._myGrabbables = [];\r\n\r\n this._myGamepad = null;\r\n\r\n this._myActiveGrabButton = null;\r\n\r\n this._myPrevInputSourceType = null;\r\n\r\n this._myLinearVelocityHistorySize = 5;\r\n this._myLinearVelocityHistorySpeedAverageSamplesFromStart = 1;\r\n this._myLinearVelocityHistoryDirectionAverageSamplesFromStart = 3;\r\n this._myLinearVelocityHistoryDirectionAverageSkipFromStart = 0;\r\n\r\n this._myHandLinearVelocityHistory = new Array(this._myLinearVelocityHistorySize);\r\n this._myHandLinearVelocityHistory.fill(vec3_create());\r\n\r\n this._myAngularVelocityHistorySize = 1;\r\n this._myHandAngularVelocityHistory = new Array(this._myAngularVelocityHistorySize);\r\n this._myHandAngularVelocityHistory.fill(vec3_create());\r\n\r\n this._myThrowMaxAngularSpeedRadians = Math.pp_toRadians(this._myThrowMaxAngularSpeed);\r\n\r\n this._myGrabEmitter = new Emitter(); // Signature: listener(grabber, grabbable)\r\n this._myThrowEmitter = new Emitter(); // Signature: listener(grabber, grabbable)\r\n\r\n this._myDebugEnabled = false;\r\n }\r\n\r\n start() {\r\n if (this._myHandedness == HandednessIndex.LEFT) {\r\n this._myGamepad = Globals.getLeftGamepad(this.engine);\r\n } else {\r\n this._myGamepad = Globals.getRightGamepad(this.engine);\r\n }\r\n\r\n this._myPhysX = this.object.pp_getComponent(PhysXComponent);\r\n this._myCollisionsCollector = new PhysicsCollisionCollector(this._myPhysX);\r\n }\r\n\r\n update(dt) {\r\n this._myCollisionsCollector.update(dt);\r\n\r\n let currentInputSourceType = null;\r\n if (this._myGamepad.getHandPose() != null) {\r\n currentInputSourceType = this._myGamepad.getHandPose().getInputSourceType();\r\n }\r\n\r\n if (this._myPrevInputSourceType != currentInputSourceType) {\r\n this.throw();\r\n }\r\n this._myPrevInputSourceType = currentInputSourceType;\r\n\r\n if (this._myGrabButton != 1 || currentInputSourceType == InputSourceType.TRACKED_HAND) {\r\n if (this._myGamepad.getButtonInfo(GamepadButtonID.SELECT).isPressStart()) {\r\n this._grab(GamepadButtonID.SELECT);\r\n } else if (this._myGamepad.getButtonInfo(GamepadButtonID.SELECT).isPressEnd()) {\r\n this._throw(GamepadButtonID.SELECT);\r\n }\r\n }\r\n\r\n if (this._myGrabButton != 0) {\r\n if (this._myGamepad.getButtonInfo(GamepadButtonID.SQUEEZE).isPressStart()) {\r\n this._grab(GamepadButtonID.SQUEEZE);\r\n } else if (this._myGamepad.getButtonInfo(GamepadButtonID.SQUEEZE).isPressEnd()) {\r\n this._throw(GamepadButtonID.SQUEEZE);\r\n }\r\n }\r\n\r\n this._updateLinearVelocityHistory();\r\n this._updateAngularVelocityHistory();\r\n }\r\n\r\n grab(grabButton = null) {\r\n this._grab(grabButton);\r\n }\r\n\r\n throw(throwButton = null) {\r\n this._throw(throwButton);\r\n }\r\n\r\n getGamepad() {\r\n return this._myGamepad;\r\n }\r\n\r\n getHandedness() {\r\n return InputUtils.getHandednessByIndex(this._myHandedness);\r\n }\r\n\r\n registerGrabEventListener(id, listener) {\r\n this._myGrabEmitter.add(listener, { id: id });\r\n }\r\n\r\n unregisterGrabEventListener(id) {\r\n this._myGrabEmitter.remove(id);\r\n }\r\n\r\n registerThrowEventListener(id, listener) {\r\n this._myThrowEmitter.add(listener, { id: id });\r\n }\r\n\r\n unregisterThrowEventListener(id) {\r\n this._myThrowEmitter.remove(id);\r\n }\r\n\r\n onActivate() {\r\n this._myCollisionsCollector.setActive(true);\r\n }\r\n\r\n onDeactivate() {\r\n this.throw();\r\n\r\n this._myHandLinearVelocityHistory = new Array(this._myLinearVelocityHistorySize);\r\n this._myHandLinearVelocityHistory.fill(vec3_create());\r\n\r\n this._myHandAngularVelocityHistory = new Array(this._myAngularVelocityHistorySize);\r\n this._myHandAngularVelocityHistory.fill(vec3_create());\r\n\r\n this._myCollisionsCollector.setActive(false);\r\n }\r\n\r\n _grab(grabButton) {\r\n if (this._myGrabbables.length >= this._myMaxNumberOfObjects) {\r\n return;\r\n }\r\n\r\n if (this._myGrabButton == 2 || this._myActiveGrabButton == null || this._myActiveGrabButton == grabButton || grabButton == null) {\r\n let grabbablesToGrab = [];\r\n\r\n let collisions = this._myCollisionsCollector.getCollisions();\r\n for (let i = 0; i < collisions.length; i++) {\r\n let grabbable = collisions[i].object.pp_getComponent(GrabbableComponent);\r\n if (grabbable && grabbable.active) {\r\n grabbablesToGrab.push(grabbable);\r\n }\r\n }\r\n\r\n let grabberPosition = this.object.pp_getPosition();\r\n grabbablesToGrab.sort(function (first, second) {\r\n let firstPosition = first.object.pp_getPosition();\r\n let secondPosition = second.object.pp_getPosition();\r\n\r\n let firstDistance = firstPosition.vec3_distance(grabberPosition);\r\n let secondDistance = secondPosition.vec3_distance(grabberPosition);\r\n\r\n return Math.pp_sign(firstDistance - secondDistance, 0);\r\n });\r\n\r\n for (let grabbableToGrab of grabbablesToGrab) {\r\n if (!this._isAlreadyGrabbed(grabbableToGrab)) {\r\n let grabbableData = new _GrabberHandComponentGrabbableData(grabbableToGrab, this._myThrowVelocitySource == 1, this._myLinearVelocityHistorySize, this._myAngularVelocityHistorySize);\r\n this._myGrabbables.push(grabbableData);\r\n grabbableToGrab.grab(this.object);\r\n grabbableToGrab.registerReleaseEventListener(this, this._onRelease.bind(this));\r\n\r\n if (this._mySnapGrabbableToOrigin) {\r\n grabbableToGrab.object.pp_resetPositionLocal();\r\n }\r\n\r\n this._myGrabEmitter.notify(this, grabbableToGrab);\r\n }\r\n\r\n if (this._myGrabbables.length >= this._myMaxNumberOfObjects) {\r\n break;\r\n }\r\n }\r\n\r\n if (this._myGrabbables.length > 0) {\r\n if (this._myActiveGrabButton == null) {\r\n this._myActiveGrabButton = grabButton;\r\n }\r\n }\r\n }\r\n }\r\n\r\n _throw(throwButton) {\r\n if (this._myGrabButton == 2 || this._myActiveGrabButton == null || this._myActiveGrabButton == throwButton || throwButton == null) {\r\n if (this._myGrabbables.length > 0) {\r\n let linearVelocity = null;\r\n let angularVelocity = null;\r\n\r\n if (this._myThrowVelocitySource == 0) {\r\n linearVelocity = this._computeReleaseLinearVelocity(this._myHandLinearVelocityHistory);\r\n angularVelocity = this._computeReleaseAngularVelocity(this._myHandAngularVelocityHistory);\r\n }\r\n\r\n for (let grabbableData of this._myGrabbables) {\r\n let grabbable = grabbableData.getGrabbable();\r\n\r\n grabbable.unregisterReleaseEventListener(this);\r\n\r\n if (this._myThrowVelocitySource == 1) {\r\n linearVelocity = this._computeReleaseLinearVelocity(grabbableData.getLinearVelocityHistory());\r\n angularVelocity = this._computeReleaseAngularVelocity(grabbableData.getAngularVelocityHistory());\r\n }\r\n\r\n grabbable.throw(linearVelocity, angularVelocity);\r\n\r\n this._myThrowEmitter.notify(this, grabbable);\r\n }\r\n\r\n this._myGrabbables = [];\r\n }\r\n\r\n this._myActiveGrabButton = null;\r\n }\r\n }\r\n\r\n _onRelease(grabber, grabbable) {\r\n grabbable.unregisterReleaseEventListener(this);\r\n this._myGrabbables.pp_remove(element => element.getGrabbable() == grabbable);\r\n\r\n if (this._myGrabbables.length <= 0) {\r\n this._myActiveGrabButton = null;\r\n }\r\n }\r\n\r\n _updateLinearVelocityHistory() {\r\n const velocityToReuse = this._myHandLinearVelocityHistory.pop();\r\n\r\n let handPose = this._myGamepad.getHandPose();\r\n if (handPose != null) {\r\n this._myHandLinearVelocityHistory.unshift(handPose.getLinearVelocity(velocityToReuse));\r\n } else {\r\n velocityToReuse.vec3_zero();\r\n this._myHandLinearVelocityHistory.unshift(velocityToReuse);\r\n }\r\n\r\n for (let grabbable of this._myGrabbables) {\r\n grabbable.updateLinearVelocityHistory();\r\n }\r\n }\r\n\r\n _updateAngularVelocityHistory() {\r\n const velocityToReuse = this._myHandAngularVelocityHistory.pop();\r\n\r\n let handPose = this._myGamepad.getHandPose();\r\n if (handPose != null) {\r\n this._myHandAngularVelocityHistory.unshift(handPose.getAngularVelocityRadians(velocityToReuse));\r\n } else {\r\n velocityToReuse.vec3_zero();\r\n this._myHandAngularVelocityHistory.unshift(velocityToReuse);\r\n }\r\n\r\n for (let grabbable of this._myGrabbables) {\r\n grabbable.updateAngularVelocityHistory();\r\n }\r\n }\r\n\r\n _computeReleaseLinearVelocity(linearVelocityHistory) {\r\n // Speed\r\n let speed = linearVelocityHistory[0].vec3_length();\r\n for (let i = 1; i < this._myLinearVelocityHistorySpeedAverageSamplesFromStart; i++) {\r\n speed += linearVelocityHistory[i].vec3_length();\r\n }\r\n speed /= this._myLinearVelocityHistorySpeedAverageSamplesFromStart;\r\n\r\n // This way I give an increasing and smooth boost to the throw so that when u want to perform a weak throw, the value is not changed, but if u put more speed\r\n // it will be boosted to make it easier and still feel good and natural (value does not increase suddenly)\r\n let speedEaseMultiplier = Math.pp_mapToRange(speed, this._myThrowLinearVelocityBoostMinSpeedThreshold, this._myThrowLinearVelocityBoostMaxSpeedThreshold, 0, 1);\r\n speedEaseMultiplier = EasingFunction.easeIn(speedEaseMultiplier);\r\n\r\n // Add the boost to the speed\r\n let extraSpeed = speed * (speedEaseMultiplier * this._myThrowLinearVelocityBoost);\r\n speed += extraSpeed;\r\n speed *= this._myThrowLinearVelocityMultiplier;\r\n speed = Math.pp_clamp(speed, 0, this._myThrowMaxLinearSpeed);\r\n\r\n if (this._myDebugEnabled && Globals.isDebugEnabled(this.engine)) {\r\n this._debugDirectionLines(linearVelocityHistory);\r\n }\r\n\r\n // Direction\r\n let directionCurrentWeight = this._myLinearVelocityHistoryDirectionAverageSamplesFromStart;\r\n let lastDirectionIndex = this._myLinearVelocityHistoryDirectionAverageSkipFromStart + this._myLinearVelocityHistoryDirectionAverageSamplesFromStart;\r\n let direction = vec3_create();\r\n for (let i = this._myLinearVelocityHistoryDirectionAverageSkipFromStart; i < lastDirectionIndex; i++) {\r\n let currentDirection = linearVelocityHistory[i];\r\n currentDirection.vec3_scale(directionCurrentWeight, currentDirection);\r\n direction.vec3_add(currentDirection, direction);\r\n\r\n directionCurrentWeight--;\r\n }\r\n direction.vec3_normalize(direction);\r\n\r\n direction.vec3_scale(speed, direction);\r\n\r\n return direction;\r\n }\r\n\r\n _computeReleaseAngularVelocity(angularVelocityHistory) {\r\n let angularVelocity = angularVelocityHistory[0];\r\n\r\n // Speed\r\n let speed = angularVelocity.vec3_length();\r\n\r\n speed = Math.pp_clamp(speed * this._myThrowAngularVelocityMultiplier, 0, this._myThrowMaxAngularSpeedRadians);\r\n\r\n // Direction\r\n let direction = angularVelocity.vec3_clone();\r\n direction.vec3_normalize(direction);\r\n\r\n direction.vec3_scale(speed, direction);\r\n\r\n return direction;\r\n }\r\n\r\n _debugDirectionLines(linearVelocityHistory) {\r\n for (let j = this._myLinearVelocityHistoryDirectionAverageSkipFromStart + this._myLinearVelocityHistoryDirectionAverageSamplesFromStart; j > this._myLinearVelocityHistoryDirectionAverageSkipFromStart; j--) {\r\n\r\n let directionCurrentWeight = j - this._myLinearVelocityHistoryDirectionAverageSkipFromStart;\r\n let lastDirectionIndex = j - this._myLinearVelocityHistoryDirectionAverageSkipFromStart;\r\n let direction = vec3_create();\r\n for (let i = this._myLinearVelocityHistoryDirectionAverageSkipFromStart; i < lastDirectionIndex; i++) {\r\n let currentDirection = linearVelocityHistory[i].pp_clone();\r\n currentDirection.vec3_scale(directionCurrentWeight, currentDirection);\r\n direction.vec3_add(currentDirection, direction);\r\n\r\n directionCurrentWeight--;\r\n }\r\n direction.vec3_normalize(direction);\r\n\r\n let color = 1 / j;\r\n\r\n Globals.getDebugVisualManager(this.engine).drawLine(5, this.object.pp_getPosition(), direction, 0.2, vec4_create(color, color, color, 1));\r\n }\r\n }\r\n\r\n _isAlreadyGrabbed(grabbable) {\r\n let found = this._myGrabbables.pp_find(element => element.getGrabbable() == grabbable);\r\n return found != null;\r\n }\r\n\r\n onDestroy() {\r\n this._myCollisionsCollector.destroy();\r\n }\r\n}\r\n\r\nclass _GrabberHandComponentGrabbableData {\r\n\r\n constructor(grabbable, useGrabbableAsVelocitySource, linearVelocityHistorySize, angularVelocityHistorySize) {\r\n this._myGrabbable = grabbable;\r\n this._myUseGrabbableAsVelocitySource = useGrabbableAsVelocitySource;\r\n\r\n if (this._myUseGrabbableAsVelocitySource) {\r\n this._myLinearVelocityHistory = new Array(linearVelocityHistorySize);\r\n this._myLinearVelocityHistory.fill(vec3_create());\r\n\r\n this._myAngularVelocityHistory = new Array(angularVelocityHistorySize);\r\n this._myAngularVelocityHistory.fill(vec3_create());\r\n }\r\n }\r\n\r\n getGrabbable() {\r\n return this._myGrabbable;\r\n }\r\n\r\n getLinearVelocityHistory() {\r\n return this._myLinearVelocityHistory;\r\n }\r\n\r\n getAngularVelocityHistory() {\r\n return this._myAngularVelocityHistory;\r\n }\r\n\r\n updateLinearVelocityHistory() {\r\n if (this._myUseGrabbableAsVelocitySource) {\r\n this._myLinearVelocityHistory.unshift(this._myGrabbable.getLinearVelocity());\r\n this._myLinearVelocityHistory.pop();\r\n }\r\n }\r\n\r\n updateAngularVelocityHistory() {\r\n if (this._myUseGrabbableAsVelocitySource) {\r\n this._myAngularVelocityHistory.unshift(this._myGrabbable.getAngularVelocityRadians());\r\n this._myAngularVelocityHistory.pop();\r\n }\r\n }\r\n}", "let _myDummyServer = null;\r\nlet _myUseDummyServerOnSDKMissing = false;\r\nlet _myUseDummyServerOnError = false;\r\n\r\nexport let CAError = {\r\n NONE: 0,\r\n CA_SDK_MISSING: 1,\r\n DUMMY_NOT_INITIALIZED: 2,\r\n GET_LEADERBOARD_FAILED: 3,\r\n SUBMIT_SCORE_FAILED: 4,\r\n GET_USER_FAILED: 5,\r\n USER_NOT_LOGGED_IN: 6,\r\n USER_HAS_NO_SCORE: 7\r\n};\r\n\r\nexport function setUseDummyServerOnSDKMissing(useDummyServer) {\r\n _myUseDummyServerOnSDKMissing = useDummyServer;\r\n}\r\n\r\nexport function setUseDummyServerOnError(useDummyServer) {\r\n _myUseDummyServerOnError = useDummyServer;\r\n}\r\n\r\nexport function setDummyServer(dummyServer) {\r\n _myDummyServer = dummyServer;\r\n}\r\n\r\nexport function isUseDummyServerOnSDKMissing() {\r\n return _myUseDummyServerOnSDKMissing;\r\n}\r\n\r\nexport function isUseDummyServerOnError() {\r\n return _myUseDummyServerOnError;\r\n}\r\n\r\nexport function getDummyServer() {\r\n return _myDummyServer;\r\n}\r\n\r\nexport function isSDKAvailable() {\r\n return window.heyVR != null;\r\n}\r\n\r\nexport function getSDK() {\r\n return window.heyVR;\r\n}\r\n\r\nexport function getLeaderboard(leaderboardID, ascending, aroundPlayer, scoresAmount, onDoneCallback = null, onErrorCallback = null, useDummyServerOverride = null) {\r\n if (CAUtils.isSDKAvailable()) {\r\n try {\r\n _getLeaderboard(leaderboardID, ascending, aroundPlayer, scoresAmount).then(function (result) {\r\n if (result.leaderboard != null) {\r\n if (!aroundPlayer) {\r\n if (onDoneCallback != null) {\r\n onDoneCallback(result.leaderboard);\r\n }\r\n } else {\r\n let userLeaderboard = result.leaderboard;\r\n CAUtils.getUser(\r\n function (user) {\r\n let userName = user.displayName;\r\n let userValid = false;\r\n for (let userLeaderboardEntry of userLeaderboard) {\r\n if (userLeaderboardEntry.displayName == userName) {\r\n userValid = true;\r\n break;\r\n }\r\n }\r\n if (userValid) {\r\n if (onDoneCallback != null) {\r\n onDoneCallback(userLeaderboard);\r\n }\r\n } else {\r\n if (_myDummyServer != null && _myDummyServer.getLeaderboard != null &&\r\n (_myUseDummyServerOnError && useDummyServerOverride == null) || (useDummyServerOverride != null && useDummyServerOverride)) {\r\n CAUtils.getLeaderboardDummy(leaderboardID, ascending, aroundPlayer, scoresAmount, onDoneCallback, onErrorCallback, CAError.USER_HAS_NO_SCORE);\r\n } else if (onErrorCallback != null) {\r\n let error = {};\r\n error.reason = \"Searching for around player but the user has not submitted a score yet\";\r\n error.type = CAError.USER_HAS_NO_SCORE;\r\n onErrorCallback(error, null);\r\n }\r\n }\r\n },\r\n function (error, result) {\r\n if (_myDummyServer != null && _myDummyServer.getLeaderboard != null &&\r\n (_myUseDummyServerOnError && useDummyServerOverride == null) || (useDummyServerOverride != null && useDummyServerOverride)) {\r\n CAUtils.getLeaderboardDummy(leaderboardID, ascending, aroundPlayer, scoresAmount, onDoneCallback, onErrorCallback, error.type);\r\n } else if (onErrorCallback != null) {\r\n onErrorCallback(error, result);\r\n }\r\n },\r\n false);\r\n }\r\n } else {\r\n if (_myDummyServer != null && _myDummyServer.getLeaderboard != null &&\r\n (_myUseDummyServerOnError && useDummyServerOverride == null) || (useDummyServerOverride != null && useDummyServerOverride)) {\r\n CAUtils.getLeaderboardDummy(leaderboardID, ascending, aroundPlayer, scoresAmount, onDoneCallback, onErrorCallback, CAError.GET_LEADERBOARD_FAILED);\r\n } else if (onErrorCallback != null) {\r\n let error = {};\r\n error.reason = \"Get leaderboard failed\";\r\n error.type = CAError.GET_LEADERBOARD_FAILED;\r\n onErrorCallback(error, result);\r\n }\r\n }\r\n }).catch(function (result) {\r\n if (_myDummyServer != null && _myDummyServer.getLeaderboard != null &&\r\n (_myUseDummyServerOnError && useDummyServerOverride == null) || (useDummyServerOverride != null && useDummyServerOverride)) {\r\n CAUtils.getLeaderboardDummy(leaderboardID, ascending, aroundPlayer, scoresAmount, onDoneCallback, onErrorCallback, CAError.GET_LEADERBOARD_FAILED);\r\n } else if (onErrorCallback != null) {\r\n let error = {};\r\n error.reason = \"Get leaderboard failed\";\r\n error.type = CAError.GET_LEADERBOARD_FAILED;\r\n onErrorCallback(error, result);\r\n }\r\n });\r\n } catch (error) {\r\n if (_myDummyServer != null && _myDummyServer.getLeaderboard != null &&\r\n (_myUseDummyServerOnError && useDummyServerOverride == null) || (useDummyServerOverride != null && useDummyServerOverride)) {\r\n CAUtils.getLeaderboardDummy(leaderboardID, ascending, aroundPlayer, scoresAmount, onDoneCallback, onErrorCallback, CAError.GET_LEADERBOARD_FAILED);\r\n } else if (onErrorCallback != null) {\r\n let error = {};\r\n error.reason = \"Get leaderboard failed\";\r\n error.type = CAError.GET_LEADERBOARD_FAILED;\r\n onErrorCallback(error, null);\r\n }\r\n }\r\n } else {\r\n if (_myDummyServer != null && _myDummyServer.getLeaderboard != null &&\r\n (_myUseDummyServerOnSDKMissing && useDummyServerOverride == null) || (useDummyServerOverride != null && useDummyServerOverride)) {\r\n CAUtils.getLeaderboardDummy(leaderboardID, ascending, aroundPlayer, scoresAmount, onDoneCallback, onErrorCallback, CAError.CA_SDK_MISSING);\r\n } else if (onErrorCallback != null) {\r\n let error = {};\r\n error.reason = \"Construct Arcade SDK missing\";\r\n error.type = CAError.CA_SDK_MISSING;\r\n onErrorCallback(error, null);\r\n }\r\n }\r\n}\r\n\r\nexport function getLeaderboardDummy(leaderboardID, ascending, aroundPlayer, scoresAmount, onDoneCallback = null, onErrorCallback = null, caError = CAError.NONE) {\r\n if (_myDummyServer) {\r\n _myDummyServer.getLeaderboard(leaderboardID, ascending, aroundPlayer, scoresAmount, onDoneCallback, onErrorCallback, caError);\r\n } else {\r\n if (onErrorCallback != null) {\r\n let error = {};\r\n error.reason = \"Dummy server not initialized\";\r\n error.type = CAError.DUMMY_NOT_INITIALIZED;\r\n onErrorCallback(error, null);\r\n }\r\n }\r\n}\r\n\r\nexport function submitScore(leaderboardID, scoreToSubmit, onDoneCallback = null, onErrorCallback = null, useDummyServerOverride = null) {\r\n if (CAUtils.isSDKAvailable()) {\r\n try {\r\n _submitScore(leaderboardID, scoreToSubmit).then(function (result) {\r\n if (result.scoreSubmitted) {\r\n if (onDoneCallback != null) {\r\n onDoneCallback();\r\n }\r\n } else if (result.scoreSubmitted != null) {\r\n if (_myDummyServer != null && _myDummyServer.submitScore != null &&\r\n (_myUseDummyServerOnError && useDummyServerOverride == null) || (useDummyServerOverride != null && useDummyServerOverride)) {\r\n CAUtils.submitScoreDummy(leaderboardID, scoreToSubmit, onDoneCallback, onErrorCallback, CAError.USER_NOT_LOGGED_IN);\r\n } else if (onErrorCallback != null) {\r\n let error = {};\r\n error.reason = \"The score can't be submitted because the user is not logged in\";\r\n error.type = CAError.USER_NOT_LOGGED_IN;\r\n onErrorCallback(error, result);\r\n }\r\n } else {\r\n if (_myDummyServer != null && _myDummyServer.submitScore != null &&\r\n (_myUseDummyServerOnError && useDummyServerOverride == null) || (useDummyServerOverride != null && useDummyServerOverride)) {\r\n CAUtils.submitScoreDummy(leaderboardID, scoreToSubmit, onDoneCallback, onErrorCallback, CAError.SUBMIT_SCORE_FAILED);\r\n } else if (onErrorCallback != null) {\r\n let error = {};\r\n error.reason = \"Submit score failed\";\r\n error.type = CAError.SUBMIT_SCORE_FAILED;\r\n onErrorCallback(error, result);\r\n }\r\n }\r\n }).catch(function (result) {\r\n if (_myDummyServer != null && _myDummyServer.submitScore != null &&\r\n (_myUseDummyServerOnError && useDummyServerOverride == null) || (useDummyServerOverride != null && useDummyServerOverride)) {\r\n CAUtils.submitScoreDummy(leaderboardID, scoreToSubmit, onDoneCallback, onErrorCallback, CAError.SUBMIT_SCORE_FAILED);\r\n } else if (onErrorCallback != null) {\r\n let error = {};\r\n error.reason = \"Submit score failed\";\r\n error.type = CAError.SUBMIT_SCORE_FAILED;\r\n onErrorCallback(error, result);\r\n }\r\n });\r\n } catch (error) {\r\n if (_myDummyServer != null && _myDummyServer.submitScore != null &&\r\n (_myUseDummyServerOnError && useDummyServerOverride == null) || (useDummyServerOverride != null && useDummyServerOverride)) {\r\n CAUtils.submitScoreDummy(leaderboardID, scoreToSubmit, onDoneCallback, onErrorCallback, CAError.SUBMIT_SCORE_FAILED);\r\n } else if (onErrorCallback != null) {\r\n let error = {};\r\n error.reason = \"Submit score failed\";\r\n error.type = CAError.SUBMIT_SCORE_FAILED;\r\n onErrorCallback(error, null);\r\n }\r\n }\r\n } else {\r\n if (_myDummyServer != null && _myDummyServer.submitScore != null &&\r\n (_myUseDummyServerOnSDKMissing && useDummyServerOverride == null) || (useDummyServerOverride != null && useDummyServerOverride)) {\r\n CAUtils.submitScoreDummy(leaderboardID, scoreToSubmit, onDoneCallback, onErrorCallback, CAError.CA_SDK_MISSING);\r\n } else if (onErrorCallback != null) {\r\n let error = {};\r\n error.reason = \"Construct Arcade SDK missing\";\r\n error.type = CAError.CA_SDK_MISSING;\r\n onErrorCallback(error, null);\r\n }\r\n }\r\n}\r\n\r\nexport function submitScoreDummy(leaderboardID, scoreToSubmit, onDoneCallback = null, onErrorCallback = null, caError = CAError.NONE) {\r\n if (_myDummyServer) {\r\n _myDummyServer.submitScore(leaderboardID, scoreToSubmit, onDoneCallback, onErrorCallback, caError);\r\n } else {\r\n if (onErrorCallback != null) {\r\n let error = {};\r\n error.reason = \"Dummy server not initialized\";\r\n error.type = CAError.DUMMY_NOT_INITIALIZED;\r\n onErrorCallback(error, null);\r\n }\r\n }\r\n}\r\n\r\nexport function getUser(onDoneCallback = null, onErrorCallback = null, useDummyServerOverride = null) {\r\n if (CAUtils.isSDKAvailable()) {\r\n try {\r\n _getUser().then(function (result) {\r\n if (result.user != null && result.user.displayName != null) {\r\n if (onDoneCallback != null) {\r\n onDoneCallback(result.user);\r\n }\r\n } else if (result.user != null) {\r\n if (_myDummyServer != null && _myDummyServer.getUser != null &&\r\n (_myUseDummyServerOnError && useDummyServerOverride == null) || (useDummyServerOverride != null && useDummyServerOverride)) {\r\n CAUtils.getUserDummy(onDoneCallback, onErrorCallback, CAError.USER_NOT_LOGGED_IN);\r\n } else if (onErrorCallback != null) {\r\n let error = {};\r\n error.reason = \"User not logged in\";\r\n error.type = CAError.USER_NOT_LOGGED_IN;\r\n onErrorCallback(error, result);\r\n }\r\n } else {\r\n if (_myDummyServer != null && _myDummyServer.getUser != null &&\r\n (_myUseDummyServerOnError && useDummyServerOverride == null) || (useDummyServerOverride != null && useDummyServerOverride)) {\r\n CAUtils.getUserDummy(onDoneCallback, onErrorCallback, CAError.GET_USER_FAILED);\r\n } else if (onErrorCallback != null) {\r\n let error = {};\r\n error.reason = \"Get user failed\";\r\n error.type = CAError.GET_USER_FAILED;\r\n onErrorCallback(error, result);\r\n }\r\n }\r\n }).catch(function (result) {\r\n if (_myDummyServer != null && _myDummyServer.getUser != null &&\r\n (_myUseDummyServerOnError && useDummyServerOverride == null) || (useDummyServerOverride != null && useDummyServerOverride)) {\r\n CAUtils.getUserDummy(onDoneCallback, onErrorCallback, CAError.GET_USER_FAILED);\r\n } else if (onErrorCallback != null) {\r\n let error = {};\r\n error.reason = \"Get user failed\";\r\n error.type = CAError.GET_USER_FAILED;\r\n onErrorCallback(error, result);\r\n }\r\n });\r\n } catch (error) {\r\n if (_myDummyServer != null && _myDummyServer.getUser != null &&\r\n (_myUseDummyServerOnError && useDummyServerOverride == null) || (useDummyServerOverride != null && useDummyServerOverride)) {\r\n CAUtils.getUserDummy(onDoneCallback, onErrorCallback, CAError.GET_USER_FAILED);\r\n } else if (onErrorCallback != null) {\r\n let error = {};\r\n error.reason = \"Get user failed\";\r\n error.type = CAError.GET_USER_FAILED;\r\n onErrorCallback(error, null);\r\n }\r\n }\r\n } else {\r\n if (_myDummyServer != null && _myDummyServer.getUser != null &&\r\n (_myUseDummyServerOnSDKMissing && useDummyServerOverride == null) || (useDummyServerOverride != null && useDummyServerOverride)) {\r\n CAUtils.getUserDummy(onDoneCallback, onErrorCallback, CAError.CA_SDK_MISSING);\r\n } else if (onErrorCallback != null) {\r\n let error = {};\r\n error.reason = \"Construct Arcade SDK missing\";\r\n error.type = CAError.CA_SDK_MISSING;\r\n onErrorCallback(error, null);\r\n }\r\n }\r\n}\r\n\r\nexport function getUserDummy(onDoneCallback = null, onErrorCallback = null, caError = CAError.NONE) {\r\n if (_myDummyServer) {\r\n _myDummyServer.getUser(onDoneCallback, onErrorCallback, caError);\r\n } else {\r\n if (onErrorCallback != null) {\r\n let error = {};\r\n error.reason = \"Dummy server not initialized\";\r\n error.type = CAError.DUMMY_NOT_INITIALIZED;\r\n onErrorCallback(error, null);\r\n }\r\n }\r\n}\r\n\r\nexport let CAUtils = {\r\n setUseDummyServerOnSDKMissing,\r\n setUseDummyServerOnError,\r\n setDummyServer,\r\n isUseDummyServerOnSDKMissing,\r\n isUseDummyServerOnError,\r\n getDummyServer,\r\n isSDKAvailable,\r\n getSDK,\r\n getLeaderboard,\r\n getLeaderboardDummy,\r\n submitScore,\r\n submitScoreDummy,\r\n getUser,\r\n getUserDummy\r\n};\r\n\r\n\r\n\r\n\r\nfunction _getLeaderboard(leaderboardID, ascending, aroundPlayer, scoresAmount) {\r\n let heyVR = CAUtils.getSDK();\r\n\r\n if (aroundPlayer) {\r\n return heyVR.leaderboard.getMy(leaderboardID, scoresAmount).then(function (result) {\r\n let adjustedLeaderboard = [];\r\n for (let leaderboardEntry of result) {\r\n adjustedLeaderboard.push({ rank: leaderboardEntry.rank - 1, displayName: leaderboardEntry.user, score: leaderboardEntry.score });\r\n }\r\n return { leaderboard: adjustedLeaderboard };\r\n }).catch(function (error) {\r\n if (error != null && error.status != null && error.status.debug == \"err_unauthenticated\") {\r\n return { leaderboard: [] };\r\n } else {\r\n return { leaderboard: null };\r\n }\r\n });\r\n } else {\r\n return heyVR.leaderboard.get(leaderboardID, scoresAmount).then(function (result) {\r\n let adjustedLeaderboard = [];\r\n for (let leaderboardEntry of result) {\r\n adjustedLeaderboard.push({ rank: leaderboardEntry.rank - 1, displayName: leaderboardEntry.user, score: leaderboardEntry.score });\r\n }\r\n return { leaderboard: adjustedLeaderboard };\r\n }).catch(function () {\r\n return { leaderboard: null };\r\n });\r\n }\r\n}\r\n\r\nfunction _submitScore(leaderboardID, scoreToSubmit) {\r\n let heyVR = CAUtils.getSDK();\r\n return heyVR.leaderboard.postScore(leaderboardID, scoreToSubmit).then(function () {\r\n return { scoreSubmitted: true };\r\n }).catch(function (error) {\r\n if (error != null && error.status != null && error.status.debug == \"err_unauthenticated\") {\r\n return { scoreSubmitted: false };\r\n } else {\r\n return { scoreSubmitted: null };\r\n }\r\n });\r\n}\r\n\r\nfunction _getUser() {\r\n let heyVR = CAUtils.getSDK();\r\n return heyVR.user.getName().then(result => {\r\n return { user: { displayName: result } };\r\n }).catch(function (error) {\r\n if (error != null && error.status != null && error.status.debug == \"err_unauthenticated\") {\r\n return { user: { displayName: null } };\r\n } else {\r\n return { user: null };\r\n }\r\n });\r\n}", "import { CAError } from \"./ca_utils.js\";\r\n\r\nexport class CADummyServer {\r\n\r\n constructor() {\r\n\r\n }\r\n\r\n getLeaderboard(leaderboardID, ascending, aroundPlayer, scoresAmount, onDoneCallback = null, onErrorCallback = null, caError = CAError.NONE) {\r\n let leaderboard = null;\r\n\r\n if (caError != CAError.CA_SDK_MISSING) {\r\n if (aroundPlayer && (caError == CAError.USER_NOT_LOGGED_IN || caError == CAError.USER_HAS_NO_SCORE)) {\r\n leaderboard = [\r\n { rank: 0, displayName: \"Sign In\", score: 0 },\r\n { rank: 1, displayName: \"And\", score: 0 },\r\n { rank: 2, displayName: \"Play\", score: 0 },\r\n { rank: 3, displayName: \"On\", score: 0 },\r\n { rank: 4, displayName: \"HeyVR\", score: 0 },\r\n { rank: 5, displayName: \"To\", score: 0 },\r\n { rank: 6, displayName: \"Submit\", score: 0 },\r\n { rank: 7, displayName: \"Your\", score: 0 },\r\n { rank: 8, displayName: \"Own\", score: 0 },\r\n { rank: 9, displayName: \"Score\", score: 0 }\r\n ];\r\n } else {\r\n leaderboard = [\r\n { rank: 0, displayName: \"An\", score: 0 },\r\n { rank: 1, displayName: \"Error\", score: 0 },\r\n { rank: 2, displayName: \"Has\", score: 0 },\r\n { rank: 3, displayName: \"Occurred\", score: 0 },\r\n { rank: 4, displayName: \"While\", score: 0 },\r\n { rank: 5, displayName: \"Trying\", score: 0 },\r\n { rank: 6, displayName: \"To\", score: 0 },\r\n { rank: 7, displayName: \"Retrieve\", score: 0 },\r\n { rank: 8, displayName: \"The\", score: 0 },\r\n { rank: 9, displayName: \"Leaderboard\", score: 0 }\r\n ];\r\n }\r\n } else {\r\n if (aroundPlayer) {\r\n leaderboard = [\r\n { rank: 0, displayName: \"Sign In\", score: 0 },\r\n { rank: 1, displayName: \"And\", score: 0 },\r\n { rank: 2, displayName: \"Play\", score: 0 },\r\n { rank: 3, displayName: \"On\", score: 0 },\r\n { rank: 4, displayName: \"HeyVR\", score: 0 },\r\n { rank: 5, displayName: \"To\", score: 0 },\r\n { rank: 6, displayName: \"Submit\", score: 0 },\r\n { rank: 7, displayName: \"Your\", score: 0 },\r\n { rank: 8, displayName: \"Own\", score: 0 },\r\n { rank: 9, displayName: \"Score\", score: 0 }\r\n ];\r\n } else {\r\n leaderboard = [\r\n { rank: 0, displayName: \"The\", score: 0 },\r\n { rank: 1, displayName: \"Top 10\", score: 0 },\r\n { rank: 2, displayName: \"Leaderboard\", score: 0 },\r\n { rank: 3, displayName: \"Is\", score: 0 },\r\n { rank: 4, displayName: \"Available\", score: 0 },\r\n { rank: 5, displayName: \"Only\", score: 0 },\r\n { rank: 5, displayName: \"When\", score: 0 },\r\n { rank: 7, displayName: \"Playing\", score: 0 },\r\n { rank: 8, displayName: \"On\", score: 0 },\r\n { rank: 9, displayName: \"HeyVR\", score: 0 },\r\n ];\r\n }\r\n }\r\n\r\n while (leaderboard.length > scoresAmount) {\r\n leaderboard.pop();\r\n }\r\n\r\n if (onDoneCallback != null) {\r\n onDoneCallback(leaderboard);\r\n }\r\n }\r\n\r\n submitScore(leaderboardID, scoreToSubmit, onDoneCallback = null, onErrorCallback = null, caError = CAError.NONE) {\r\n if (onDoneCallback != null) {\r\n onDoneCallback();\r\n }\r\n }\r\n\r\n getUser(onDoneCallback = null, onErrorCallback = null, caError = CAError.NONE) {\r\n let user = {};\r\n user.displayName = \"Florian\";\r\n\r\n if (onDoneCallback != null) {\r\n onDoneCallback(user);\r\n }\r\n }\r\n}", "import { Component, Property, TextComponent } from \"@wonderlandengine/api\";\r\nimport { ComponentUtils } from \"../../../cauldron/wl/utils/component_utils.js\";\r\nimport { CADummyServer } from \"./ca_dummy_server.js\";\r\nimport { CAUtils } from \"./ca_utils.js\";\r\n\r\nexport class CADisplayLeaderboardComponent extends Component {\r\n static TypeName = \"pp-ca-display-leaderboard\";\r\n static Properties = {\r\n _myUsernamesTextObject: Property.object(),\r\n _myScoresTextObject: Property.object(),\r\n _myLeaderboardID: Property.string(\"\"),\r\n _myLocal: Property.bool(false),\r\n _myAscending: Property.bool(false),\r\n _myScoresAmount: Property.int(10),\r\n _myScoreFormat: Property.enum([\"Value\", \"Hours:Minutes:Seconds\", \"Minutes:Seconds\", \"Seconds\", \"Hours:Minutes\", \"Minutes\"], \"Value\"),\r\n _myPositionAndUsernameSeparator: Property.string(\" - \"),\r\n _myNumberOfLinesBetweenScores: Property.int(1),\r\n _myAddDefaultCADummyServer: Property.bool(false)\r\n };\r\n\r\n init() {\r\n this._myUsernamesTextComponent = null;\r\n this._myScoresTextComponent = null;\r\n\r\n this._myStarted = false;\r\n }\r\n\r\n start() {\r\n if (this._myAddDefaultCADummyServer) {\r\n CAUtils.setDummyServer(new CADummyServer());\r\n CAUtils.setUseDummyServerOnSDKMissing(true);\r\n CAUtils.setUseDummyServerOnError(true);\r\n }\r\n }\r\n\r\n update(dt) {\r\n if (!this._myStarted) {\r\n this._myStarted = true;\r\n\r\n if (this._myUsernamesTextObject != null) {\r\n this._myUsernamesTextComponent = this._myUsernamesTextObject.pp_getComponent(TextComponent);\r\n }\r\n\r\n if (this._myScoresTextObject != null) {\r\n this._myScoresTextComponent = this._myScoresTextObject.pp_getComponent(TextComponent);\r\n }\r\n\r\n this.updateLeaderboard();\r\n }\r\n }\r\n\r\n updateLeaderboard() {\r\n CAUtils.getLeaderboard(this._myLeaderboardID, this._myAscending, this._myLocal, this._myScoresAmount, this._onLeaderboardRetrieved.bind(this));\r\n }\r\n\r\n _onLeaderboardRetrieved(leaderboard) {\r\n if (this._myDestroyed) return;\r\n\r\n let namesText = \"\";\r\n let scoresText = \"\";\r\n\r\n let maxRankDigit = 0;\r\n for (let value of leaderboard) {\r\n let rank = value.rank + 1;\r\n if (rank.toFixed(0).length > maxRankDigit) {\r\n maxRankDigit = rank.toFixed(0).length;\r\n }\r\n }\r\n\r\n for (let value of leaderboard) {\r\n let rank = value.rank + 1;\r\n let fixedRank = rank.toFixed(0);\r\n while (fixedRank.length < maxRankDigit) {\r\n fixedRank = \"0\".concat(fixedRank);\r\n }\r\n\r\n let newlines = \"\\n\";\r\n for (let i = 0; i < this._myNumberOfLinesBetweenScores; i++) {\r\n newlines = newlines + \"\\n\";\r\n }\r\n\r\n namesText = namesText.concat(fixedRank, this._myPositionAndUsernameSeparator, value.displayName, newlines);\r\n\r\n let convertedScore = this._formatScore(value.score);\r\n scoresText = scoresText.concat(convertedScore, newlines);\r\n }\r\n\r\n if (this._myUsernamesTextComponent != null) {\r\n this._myUsernamesTextComponent.text = namesText;\r\n }\r\n\r\n if (this._myScoresTextComponent != null) {\r\n this._myScoresTextComponent.text = scoresText;\r\n }\r\n }\r\n\r\n _formatScore(score) {\r\n let convertedScore = score.toString();\r\n\r\n if (this._myScoreFormat == 1) {\r\n convertedScore = this._formatTime(score, true, true, true);\r\n } else if (this._myScoreFormat == 2) {\r\n convertedScore = this._formatTime(score, false, true, true);\r\n } else if (this._myScoreFormat == 3) {\r\n convertedScore = this._formatTime(score, false, false, true);\r\n } else if (this._myScoreFormat == 4) {\r\n convertedScore = this._formatTime(score, true, true, false);\r\n } else if (this._myScoreFormat == 5) {\r\n convertedScore = this._formatTime(score, false, true, false);\r\n }\r\n\r\n return convertedScore;\r\n }\r\n\r\n _formatTime(score, displayHours, displayMinutes, displaySeconds) {\r\n let time = Math.floor(score / 1000);\r\n\r\n let hours = 0;\r\n if (displayHours) {\r\n hours = Math.floor(time / 3600);\r\n time -= hours * 3600;\r\n }\r\n\r\n let minutes = 0;\r\n if (displayMinutes) {\r\n minutes = Math.floor(time / 60);\r\n time -= minutes * 60;\r\n }\r\n\r\n let seconds = 0;\r\n if (displaySeconds) {\r\n seconds = Math.floor(time);\r\n }\r\n\r\n let convertedTime = \"\";\r\n\r\n if (displaySeconds) {\r\n convertedTime = (seconds.toFixed(0).length < 2 && (displayMinutes || displayHours)) ? \"0\".concat(seconds.toFixed(0)) : seconds.toFixed(0);\r\n }\r\n\r\n if (displayMinutes) {\r\n convertedTime = ((minutes.toFixed(0).length < 2 && (displaySeconds || displayHours)) ? \"0\".concat(minutes.toFixed(0)) : minutes.toFixed(0)) + (displaySeconds ? \":\" + convertedTime : \"\");\r\n }\r\n\r\n if (displayHours) {\r\n convertedTime = ((hours.toFixed(0).length < 2 && (displaySeconds || displayMinutes)) ? \"0\".concat(hours.toFixed(0)) : hours.toFixed(0)) + (displayMinutes ? \":\" + convertedTime : \"\");\r\n }\r\n\r\n return convertedTime;\r\n }\r\n\r\n pp_clone(targetObject) {\r\n let clonedComponent = ComponentUtils.cloneDefault(this, targetObject);\r\n\r\n return clonedComponent;\r\n }\r\n}", "import { vec3_create } from \"../../../../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { CollisionCheckParams } from \"./collision_params.js\";\r\n\r\nexport function generate360TeleportParamsFromMovementParams(movementParams: Readonly, outTeleportParams = new CollisionCheckParams()): CollisionCheckParams {\r\n outTeleportParams.copy(movementParams);\r\n\r\n outTeleportParams.myHalfConeAngle = 180;\r\n outTeleportParams.myHalfConeSliceAmount = Math.round((outTeleportParams.myHalfConeAngle / movementParams.myHalfConeAngle) * movementParams.myHalfConeSliceAmount);\r\n\r\n outTeleportParams.myCheckHorizontalFixedForwardEnabled = true;\r\n outTeleportParams.myCheckHorizontalFixedForward = vec3_create(0, 0, 1);\r\n\r\n return outTeleportParams;\r\n}\r\n\r\nexport const CollisionCheckUtils = {\r\n generate360TeleportParamsFromMovementParams\r\n} as const;", "import { PhysicsLayerFlags } from \"../../../../cauldron/physics/physics_layer_flags.js\";\r\nimport { RaycastBlockColliderType } from \"../../../../cauldron/physics/physics_raycast_params.js\";\r\nimport { quat_create, vec3_create } from \"../../../../plugin/js/extensions/array/vec_create_extension.js\";\r\n\r\nexport class CharacterColliderSetup {\r\n\r\n constructor() {\r\n this.myHeight = 0;\r\n\r\n this.myHorizontalCheckParams = new CharacterColliderHorizontalCheckParams();\r\n this.myVerticalCheckParams = new CharacterColliderVerticalCheckParams();\r\n\r\n this.myWallSlideParams = new CharacterColliderWallSlideParams();\r\n\r\n this.myGroundParams = new CharacterColliderSurfaceParams();\r\n this.myCeilingParams = new CharacterColliderSurfaceParams();\r\n\r\n this.mySplitMovementParams = new CharacterColliderSplitMovementParams();\r\n\r\n this.myAdditionalParams = new CharacterColliderAdditionalParams();\r\n\r\n this.myDebugParams = new CharacterColliderDebugParams();\r\n }\r\n\r\n copy(other) {\r\n // Implemented outside class definition\r\n }\r\n}\r\n\r\nexport let CharacterColliderHorizontalPositionVerticalCheckDirection = {\r\n UPWARD: 0, // Gives less issues with a ground based movement, but may also collide a bit more, resulting in less sliding\r\n DOWNWARD: 1, // Gives less issues with a ceiling based movement (unusual), but may also collide a bit more, resulting in less sliding and more stuck in front of a wall\r\n BOTH: 2 // Check both directions, more expensive (2x checks) and better prevent collisions, sliding more, but is more expensive and gives more issues \r\n\r\n // _\r\n // The issues means that a small step at the end of a slope, maybe due to 2 rectangles, one for the floor and the other for the slope like this -> / \r\n // can create a small step if the floor rectangle is a bit above the end of the slope, this will make the character get stuck thinking it's a wall\r\n // BOTH do a more \"aggressive\" vertical check that makes the character get less stuck in other situations, but can get stuck in this one\r\n // The better solution is to properly create the level, and if possible combine the 2 rectangles by having the floor a little below the end of the slope (like this -> /-)\r\n // The step that is created \"on the other side\" in fact can easily be ignored thanks to the myHorizontalCheckFeetDistanceToIgnore param\r\n // If the level is properly created the best solution should be UPWARD\r\n // and also myHorizontalPositionVerticalCheckIgnoreHitsInsideCollision = false\r\n};\r\n\r\nexport class CharacterColliderHorizontalCheckParams {\r\n\r\n constructor() {\r\n this.myHorizontalCheckConeRadius = 0;\r\n this.myHorizontalCheckConeHalfAngle = 0;\r\n\r\n this.myHorizontalHeightCheckEnabled = false;\r\n\r\n this.myHorizontalCheckFeetDistanceToIgnore = 0;\r\n this.myHorizontalCheckHeadDistanceToIgnore = 0;\r\n // These distances can be used to make the character ignore small steps (like a stair step) so they can move on it\r\n // It also needs the surface pop out to be enabeld to then snap on the step\r\n\r\n this.myHorizontalCheckFixedForwardEnabled = false; // This is basically only useful if the cone angle is 180 degrees\r\n this.myHorizontalCheckFixedForward = vec3_create();\r\n\r\n this.myHorizontalMovementCheckEnabled = false;\r\n\r\n this.myHorizontalMovementCheckRadialSteps = 0;\r\n\r\n this.myHorizontalMovementCheckSplitMovementEnabled = false;\r\n this.myHorizontalMovementCheckSplitMovementMaxSteps = null;\r\n this.myHorizontalMovementCheckSplitMovementMaxStepLength = null;\r\n this.myHorizontalMovementCheckSplitMovementMinStepLength = null;\r\n\r\n this.myHorizontalMovementCheckGetBetterReferenceHit = false;\r\n // If the horizontal movement finds a hit it stops looking, but could end up having a bad reference collision hit\r\n // This makes it so it will check a better hit to use later for the slide\r\n\r\n this.myHorizontalMovementHorizontalRadialCheckEnabled = false;\r\n this.myHorizontalMovementHorizontalDiagonalOutwardCheckEnabled = false;\r\n this.myHorizontalMovementHorizontalDiagonalInwardCheckEnabled = false;\r\n this.myHorizontalMovementHorizontalStraightCheckEnabled = false;\r\n this.myHorizontalMovementHorizontalStraightCentralCheckEnabled = false;\r\n\r\n this.myHorizontalMovementHeightCheckSteps = 0;\r\n this.myHorizontalMovementHeightHorizontalCheckEnabled = false;\r\n this.myHorizontalMovementHeightVerticalCheckEnabled = false;\r\n\r\n this.myHorizontalMovementVerticalRadialDiagonalOutwardCheckEnabled = false;\r\n this.myHorizontalMovementVerticalRadialDiagonalInwardCheckEnabled = false;\r\n\r\n this.myHorizontalMovementVerticalDiagonalOutwardUpwardCheckEnabled = false;\r\n this.myHorizontalMovementVerticalDiagonalOutwardDownwardCheckEnabled = false;\r\n this.myHorizontalMovementVerticalDiagonalInwardUpwardCheckEnabled = false;\r\n this.myHorizontalMovementVerticalDiagonalInwardDownwardCheckEnabled = false;\r\n\r\n this.myHorizontalMovementVerticalStraightCheckEnabled = false;\r\n this.myHorizontalMovementVerticalStraightCentralCheckEnabled = false;\r\n this.myHorizontalMovementVerticalStraightDiagonalUpwardCheckEnabled = false;\r\n this.myHorizontalMovementVerticalStraightDiagonalUpwardCentralCheckEnabled = false;\r\n this.myHorizontalMovementVerticalStraightDiagonalDownwardCheckEnabled = false;\r\n this.myHorizontalMovementVerticalStraightDiagonalDownwardCentralCheckEnabled = false;\r\n\r\n this.myHorizontalPositionCheckEnabled = false;\r\n this.myHorizontalPositionCheckConeHalfSlices = 0;\r\n this.myHorizontalPositionHorizontalBorderCheckEnabled = false;\r\n this.myHorizontalPositionHorizontalRadialCheckEnabled = false;\r\n\r\n this.myHorizontalPositionHeightCheckSteps = 0;\r\n this.myHorizontalPositionHeightHorizontalCheckEnabled = false;\r\n this.myHorizontalPositionHeightVerticalCheckEnabled = false;\r\n\r\n this.myHorizontalPositionVerticalStraightCheckEnabled = false;\r\n this.myHorizontalPositionVerticalStraightCentralCheckEnabled = false;\r\n this.myHorizontalPositionVerticalRadialDiagonalOutwardCheckEnabled = false;\r\n this.myHorizontalPositionVerticalRadialDiagonalInwardCheckEnabled = false;\r\n this.myHorizontalPositionVerticalBorderDiagonalOutwardCheckEnabled = false;\r\n this.myHorizontalPositionVerticalBorderDiagonalInwardCheckEnabled = false;\r\n this.myHorizontalPositionVerticalRadialBorderDiagonalOutwardCheckEnabled = false;\r\n this.myHorizontalPositionVerticalRadialBorderDiagonalInwardCheckEnabled = false;\r\n\r\n this.myHorizontalPositionVerticalCheckGetFarthestHit = false; // Not very useful but already implemented so\r\n\r\n this.myHorizontalPositionVerticalCheckPerformHorizontalCheckOnHit = false;\r\n this.myHorizontalPositionVerticalCheckPerformHorizontalCheckOnHitKeepVerticalHitIfNoHorizontalHit = false;\r\n // If the horizontal check does not hit the vertical hit will be restored\r\n // The fact that the horizontal does not hit could be due to the fact that it thinks that the collision can be ignored\r\n // so restoring the vertical hit can be a bit safer (since u are actually colliding) but also can lead to false positive\r\n\r\n this.myHorizontalPositionVerticalCheckIgnoreHitsInsideCollision = false; // true gives less issues, but may also collide a bit more, resulting in less sliding\r\n this.myHorizontalPositionVerticalCheckDirection = CharacterColliderHorizontalPositionVerticalCheckDirection.UPWARD;\r\n\r\n this.myHorizontalCheckBlockLayerFlags = new PhysicsLayerFlags();\r\n this.myHorizontalCheckObjectsToIgnore = [];\r\n this.myHorizontalBlockColliderType = RaycastBlockColliderType.BOTH;\r\n }\r\n\r\n copy(other) {\r\n // Implemented outside class definition\r\n }\r\n}\r\n\r\nexport class CharacterColliderVerticalCheckParams {\r\n\r\n constructor() {\r\n this.myVerticalCheckCircumferenceRadius = 0;\r\n\r\n this.myVerticalCheckCircumferenceSlices = 0;\r\n this.myVerticalCheckCircumferenceCentralCheckEnabled = false;\r\n this.myVerticalCheckCircumferenceRadialSteps = 0;\r\n this.myVerticalCheckCircumferenceRotationPerRadialStep = 0;\r\n\r\n this.myVerticalCheckFixedForwardEnabled = false;\r\n this.myVerticalCheckFixedForward = vec3_create();\r\n\r\n this.myVerticalMovementCheckEnabled = false;\r\n this.myVerticalMovementCheckReductionEnabled = false;\r\n this.myVerticalMovementCheckPerformCheckOnBothSides = false;\r\n\r\n this.myVerticalPositionCheckEnabled = false;\r\n this.myVerticalPositionCheckPerformCheckOnBothSides = false;\r\n\r\n this.myVerticalCheckAllowHitsInsideCollisionIfOneValid = false;\r\n // If at least one vertical raycast is valid (no hit, outside collision) is it ok if the other checks are completely inside a collision\r\n // let you keep moving vertically if only partially inside a wall\r\n\r\n this.myVerticalCheckBlockLayerFlags = new PhysicsLayerFlags();\r\n this.myVerticalCheckObjectsToIgnore = [];\r\n this.myVerticalBlockColliderType = RaycastBlockColliderType.BOTH;\r\n }\r\n\r\n copy(other) {\r\n // Implemented outside class definition\r\n }\r\n}\r\n\r\nexport let CharacterColliderSlideFlickerPreventionMode = {\r\n NONE: 0,\r\n USE_PREVIOUS_RESULTS: 1, // Allow some flicker before stabilizing but avoid stopping for a 1 frame flicker only (false positive), is also less expensive\r\n COLLISION_ANGLE_ABOVE_90_DEGREES: 2, // Prevents most flicker apart those on almost flat surface, can have some false positive, always check when sliding into opposite direction\r\n COLLISION_ANGLE_ABOVE_90_DEGREES_OR_MOVEMENT_ANGLE_ABOVE_85_DEGREES: 3, // Less flicker than COLLISION_ANGLE_ABOVE_90_DEGREES but more false positive, always check when sliding into opposite direction\r\n ALWAYS: 4 // Less flicker than COLLISION_ANGLE_ABOVE_90_DEGREES_OR_MOVEMENT_ANGLE_ABOVE_85_DEGREES but more false positive\r\n};\r\n\r\nexport class CharacterColliderWallSlideParams {\r\n\r\n constructor() {\r\n this.myWallSlideEnabled = false;\r\n\r\n this.myWallSlideMaxAttempts = 0;\r\n\r\n this.myCheckBothWallSlideDirections = false;\r\n // Expensive, 2 times the checks since it basically check again on the other slide direction\r\n // This can fix some edge cases in which u can get stuck instead of sliding\r\n // It basically require that u also add flicker prevention\r\n\r\n this.myWallSlideFlickerPreventionMode = CharacterColliderSlideFlickerPreventionMode.NONE;\r\n\r\n this.myWallSlideFlickerPreventionCheckOnlyIfAlreadySliding = false;\r\n // This flag make it so the prevention is done only if it was already sliding\r\n // This can lead to a few frames of flicker if u go toward a corner directly, but allow the movement to be more fluid, avoiding getting stuck and false positive\r\n\r\n this.myWallSlideFlickerPreventionForceCheckCounter = 0;\r\n // If the collision think it needs to check for flicker, it will keep checking for the next X frames based on this value even if the condition are not met anymore\r\n // This help in catching the flicker when the direction is not changing every frame but every 2-3 for example\r\n // It's especially useful if combo-ed with CharacterColliderSlideFlickerPreventionMode.USE_PREVIOUS_RESULTS, making it a bit less fluid but also less flickering\r\n\r\n this.my90DegreesWallSlideAdjustDirectionSign = false;\r\n }\r\n\r\n copy(other) {\r\n // Implemented outside class definition\r\n }\r\n}\r\n\r\nexport class CharacterColliderSurfaceParams {\r\n\r\n constructor() {\r\n this.mySurfaceSnapEnabled = false;\r\n this.mySurfaceSnapMaxDistance = 0;\r\n\r\n this.mySurfacePopOutEnabled = false;\r\n this.mySurfacePopOutMaxDistance = 0;\r\n\r\n this.mySurfaceAngleToIgnore = 0;\r\n\r\n this.mySurfaceAngleToIgnoreWithSurfacePerceivedAngle = null;\r\n // Between this value and mySurfaceAngleToIgnore, use the perceived angle to see if u can actually ignore the surface\r\n // This basically means that on steep surface u could still go up by moving diagonally\r\n\r\n this.myHorizontalMovementSurfaceAngleToIgnoreMaxVerticalDistance = null;\r\n this.myHorizontalPositionSurfaceAngleToIgnoreMaxVerticalDistance = null;\r\n // If the collision with the surface is above this max value, even if the surface angle is ignorable do not ignore it\r\n\r\n this.myHorizontalMovementSurfaceAngleToIgnoreMaxHorizontalMovementLeft = null;\r\n // If the collision with the surface happens during the horizontal movement check, if the horizontal movement left (total movement to perform minus hit distance)\r\n // is above this value do not ignore it otherwise you would ignore a surface but are actually going too much inside it\r\n\r\n this.myCollectSurfaceInfo = false;\r\n\r\n this.myOnSurfaceMaxOutsideDistance = 0;\r\n this.myOnSurfaceMaxInsideDistance = 0;\r\n\r\n this.myBaseInsideCollisionCheckEnabled = false;\r\n this.myOnSurfaceIfBaseInsideCollision = false;\r\n\r\n this.myCollectSurfaceNormalMaxOutsideDistance = 0;\r\n this.myCollectSurfaceNormalMaxInsideDistance = 0;\r\n\r\n this.myCollectSurfaceDistanceOutsideDistance = 0;\r\n this.myCollectSurfaceDistanceInsideDistance = 0;\r\n\r\n this.myCollectSurfaceCollisionHitOutsideDistance = 0;\r\n this.myCollectSurfaceCollisionHitInsideDistance = 0;\r\n\r\n this.myHorizontalMovementAdjustVerticalMovementOverSurfacePerceivedAngleDownhill = false;\r\n this.myHorizontalMovementAdjustVerticalMovementOverSurfacePerceivedAngleUphill = false;\r\n // This make it so when a character moves horizontally on a slope it also add a vertical movement so that the movement is actually on the slope plane\r\n this.myHorizontalMovementAdjustVerticalMovementOverSurfacePerceivedAngleDownhillMaxSurfaceAngle = null;\r\n this.myHorizontalMovementAdjustVerticalMovementOverSurfacePerceivedAngleUphillMaxSurfaceAngle = null;\r\n this.myHorizontalMovementAdjustVerticalMovementOverSurfacePerceivedAngleDownhillMaxSurfacePerceivedAngle = null;\r\n this.myHorizontalMovementAdjustVerticalMovementOverSurfacePerceivedAngleUphillMaxSurfacePerceivedAngle = null;\r\n // This can be used to limit the adjustment so that on steep slopes u can bounce off, or anyway don't add a huge vertical movement due to a very steep slope\r\n\r\n this.myVerticalMovementAdjustHorizontalMovementOverSurfaceAngleDownhill = false;\r\n // This make it so when a character moves vertically on a slope (sort of sliding down the slope) it also add a horizontal movement so that the movement is actually on the slope plane\r\n this.myVerticalMovementAdjustHorizontalMovementOverSurfaceAngleDownhillMinSurfaceAngle = null;\r\n // This can be used to make it so the movement (and therefore the slide) only happens above a certain angle, like u want to slide down only on steep surfaces\r\n\r\n this.myMovementMustStayOnSurface = false;\r\n this.myMovementMustStayOnSurfaceHitMaxAngle = null;\r\n this.myMovementMustStayOnIgnorableSurfaceAngleDownhill = false;\r\n this.myMovementMustStayOnSurfaceAngleDownhill = null;\r\n\r\n this.myTeleportMustBeOnSurface = false;\r\n this.myTeleportMustBeOnIgnorableSurfaceAngle = false;\r\n this.myTeleportMustBeOnSurfaceAngle = null;\r\n\r\n this.myCheckTransformMustBeOnSurface = false;\r\n this.myCheckTransformMustBeOnIgnorableSurfaceAngle = false;\r\n this.myCheckTransformMustBeOnSurfaceAngle = null;\r\n\r\n this.myRecollectSurfaceInfoOnSurfaceCheckFailed = false;\r\n // Instead of copying the previous surface info on fail, regather them\r\n\r\n this.myHorizontalMovementAllowExitAttemptWhenOnNotIgnorableSurfacePerceivedAngle = false;\r\n // If u start on a not ignorable perceived angle (above angle to ignore) u normally can't even try to move uphill, this will let you try and see if with that movement\r\n // you could end up in a ignorable perceived angle position\r\n }\r\n\r\n copy(other) {\r\n // Implemented outside class definition\r\n }\r\n}\r\n\r\nexport class CharacterColliderSplitMovementParams {\r\n\r\n constructor() {\r\n this.mySplitMovementEnabled = false;\r\n\r\n this.mySplitMovementMaxSteps = null;\r\n this.mySplitMovementMaxStepLength = null;\r\n this.mySplitMovementMinStepLength = null;\r\n this.mySplitMovementLastStepCanBeLongerThanMaxStepLength = false;\r\n\r\n this.mySplitMovementStopOnHorizontalMovementFailed = false;\r\n this.mySplitMovementStopOnVerticalMovementFailed = false;\r\n this.mySplitMovementStopOnVerticalMovementReduced = false;\r\n\r\n this.mySplitMovementStopAndFailIfMovementWouldBeReduced = false;\r\n\r\n /*\r\n this will not be available until the bridge is removed with a new implementation that directly use the collider and results\r\n \r\n this.mySplitMovementStopOnCallback = null; // Signature: callback(paramsToBeDefined)\r\n */\r\n\r\n this.mySplitMovementStopReturnPreviousResults = false;\r\n }\r\n\r\n copy(other) {\r\n // Implemented outside class definition\r\n }\r\n}\r\n\r\nexport class CharacterColliderAdditionalParams {\r\n\r\n constructor() {\r\n this.myPositionOffsetLocal = vec3_create();\r\n this.myRotationOffsetLocalQuat = quat_create();\r\n\r\n /*\r\n these will not be available until the bridge is removed with a new implementation that directly use the collider and results\r\n\r\n this.myExtraMovementCheckCallback = null; // Signature: callback(paramsToBeDefined)\r\n this.myExtraTeleportCheckCallback = null; // Signature: callback(paramsToBeDefined)\r\n this.myExtraCheckTransformCheckCallback = null; // Signature: callback(paramsToBeDefined)\r\n */\r\n }\r\n\r\n copy(other) {\r\n // Implemented outside class definition\r\n }\r\n}\r\n\r\nexport class CharacterColliderDebugParams {\r\n\r\n constructor() {\r\n this.myVisualDebugEnabled = false;\r\n\r\n this.myVisualDebugMovementEnabled = false;\r\n\r\n this.myVisualDebugHorizontalMovementCheckEnabled = false;\r\n this.myVisualDebugHorizontalPositionCheckEnabled = false;\r\n\r\n this.myVisualDebugVerticalMovementCheckEnabled = false;\r\n this.myVisualDebugVerticalPositionCheckEnabled = false;\r\n\r\n this.myVisualDebugSlideEnabled = false;\r\n\r\n this.myVisualDebugGroundInfoEnabled = false;\r\n this.myVisualDebugCeilingInfoEnabled = false;\r\n\r\n this.myVisualDebugResultsEnabled = false;\r\n }\r\n\r\n copy(other) {\r\n // Implemented outside class definition\r\n }\r\n}\r\n\r\n\r\n\r\n// IMPLEMENTATION\r\n\r\nCharacterColliderSetup.prototype.copy = function copy(other) {\r\n this.myHeight = other.myHeight;\r\n\r\n this.myHorizontalCheckParams.copy(other.myHorizontalCheckParams);\r\n this.myVerticalCheckParams.copy(other.myVerticalCheckParams);\r\n\r\n this.myWallSlideParams.copy(other.myWallSlideParams);\r\n\r\n this.myGroundParams.copy(other.myGroundParams);\r\n this.myCeilingParams.copy(other.myCeilingParams);\r\n\r\n this.mySplitMovementParams.copy(other.mySplitMovementParams);\r\n\r\n this.myAdditionalParams.copy(other.myAdditionalParams);\r\n\r\n this.myDebugParams.copy(other.myDebugParams);\r\n};\r\n\r\nCharacterColliderHorizontalCheckParams.prototype.copy = function copy(other) {\r\n this.myHorizontalCheckConeRadius = other.myHorizontalCheckConeRadius;\r\n this.myHorizontalCheckConeHalfAngle = other.myHorizontalCheckConeHalfAngle;\r\n\r\n this.myHorizontalHeightCheckEnabled = other.myHorizontalHeightCheckEnabled;\r\n\r\n this.myHorizontalCheckFeetDistanceToIgnore = other.myHorizontalCheckFeetDistanceToIgnore;\r\n this.myHorizontalCheckHeadDistanceToIgnore = other.myHorizontalCheckHeadDistanceToIgnore;\r\n\r\n this.myHorizontalCheckFixedForwardEnabled = other.myHorizontalCheckFixedForwardEnabled;\r\n this.myHorizontalCheckFixedForward.vec3_copy(other.myHorizontalCheckFixedForward);\r\n\r\n this.myHorizontalMovementCheckEnabled = other.myHorizontalMovementCheckEnabled;\r\n\r\n this.myHorizontalMovementCheckRadialSteps = other.myHorizontalMovementCheckRadialSteps;\r\n\r\n this.myHorizontalMovementCheckSplitMovementEnabled = other.myHorizontalMovementCheckSplitMovementEnabled;\r\n this.myHorizontalMovementCheckSplitMovementMaxSteps = other.myHorizontalMovementCheckSplitMovementMaxSteps;\r\n this.myHorizontalMovementCheckSplitMovementMaxStepLength = other.myHorizontalMovementCheckSplitMovementMaxStepLength;\r\n this.myHorizontalMovementCheckSplitMovementMinStepLength = other.myHorizontalMovementCheckSplitMovementMinStepLength;\r\n\r\n this.myHorizontalMovementCheckGetBetterReferenceHit = other.myHorizontalMovementCheckGetBetterReferenceHit;\r\n\r\n this.myHorizontalMovementHorizontalRadialCheckEnabled = other.myHorizontalMovementHorizontalRadialCheckEnabled;\r\n this.myHorizontalMovementHorizontalDiagonalOutwardCheckEnabled = other.myHorizontalMovementHorizontalDiagonalOutwardCheckEnabled;\r\n this.myHorizontalMovementHorizontalDiagonalInwardCheckEnabled = other.myHorizontalMovementHorizontalDiagonalInwardCheckEnabled;\r\n this.myHorizontalMovementHorizontalStraightCheckEnabled = other.myHorizontalMovementHorizontalStraightCheckEnabled;\r\n this.myHorizontalMovementHorizontalStraightCentralCheckEnabled = other.myHorizontalMovementHorizontalStraightCentralCheckEnabled;\r\n\r\n this.myHorizontalMovementHeightCheckSteps = other.myHorizontalMovementHeightCheckSteps;\r\n this.myHorizontalMovementHeightVerticalCheckEnabled = other.myHorizontalMovementHeightVerticalCheckEnabled;\r\n this.myHorizontalMovementHeightHorizontalCheckEnabled = other.myHorizontalMovementHeightHorizontalCheckEnabled;\r\n\r\n this.myHorizontalMovementVerticalRadialDiagonalOutwardCheckEnabled = other.myHorizontalMovementVerticalRadialDiagonalOutwardCheckEnabled;\r\n this.myHorizontalMovementVerticalRadialDiagonalInwardCheckEnabled = other.myHorizontalMovementVerticalRadialDiagonalInwardCheckEnabled;\r\n\r\n this.myHorizontalMovementVerticalDiagonalOutwardUpwardCheckEnabled = other.myHorizontalMovementVerticalDiagonalOutwardUpwardCheckEnabled;\r\n this.myHorizontalMovementVerticalDiagonalOutwardDownwardCheckEnabled = other.myHorizontalMovementVerticalDiagonalOutwardDownwardCheckEnabled;\r\n this.myHorizontalMovementVerticalDiagonalInwardUpwardCheckEnabled = other.myHorizontalMovementVerticalDiagonalInwardUpwardCheckEnabled;\r\n this.myHorizontalMovementVerticalDiagonalInwardDownwardCheckEnabled = other.myHorizontalMovementVerticalDiagonalInwardDownwardCheckEnabled;\r\n\r\n this.myHorizontalMovementVerticalStraightCheckEnabled = other.myHorizontalMovementVerticalStraightCheckEnabled;\r\n this.myHorizontalMovementVerticalStraightCentralCheckEnabled = other.myHorizontalMovementVerticalStraightCentralCheckEnabled;\r\n this.myHorizontalMovementVerticalStraightDiagonalUpwardCheckEnabled = other.myHorizontalMovementVerticalStraightDiagonalUpwardCheckEnabled;\r\n this.myHorizontalMovementVerticalStraightDiagonalUpwardCentralCheckEnabled = other.myHorizontalMovementVerticalStraightDiagonalUpwardCentralCheckEnabled;\r\n this.myHorizontalMovementVerticalStraightDiagonalDownwardCheckEnabled = other.myHorizontalMovementVerticalStraightDiagonalDownwardCheckEnabled;\r\n this.myHorizontalMovementVerticalStraightDiagonalDownwardCentralCheckEnabled = other.myHorizontalMovementVerticalStraightDiagonalDownwardCentralCheckEnabled;\r\n\r\n this.myHorizontalPositionCheckEnabled = other.myHorizontalPositionCheckEnabled;\r\n this.myHorizontalPositionCheckConeHalfSlices = other.myHorizontalPositionCheckConeHalfSlices;\r\n this.myHorizontalPositionHorizontalBorderCheckEnabled = other.myHorizontalPositionHorizontalBorderCheckEnabled;\r\n this.myHorizontalPositionHorizontalRadialCheckEnabled = other.myHorizontalPositionHorizontalRadialCheckEnabled;\r\n\r\n this.myHorizontalPositionHeightCheckSteps = other.myHorizontalPositionHeightCheckSteps;\r\n this.myHorizontalPositionHeightHorizontalCheckEnabled = other.myHorizontalPositionHeightHorizontalCheckEnabled;\r\n this.myHorizontalPositionHeightVerticalCheckEnabled = other.myHorizontalPositionHeightVerticalCheckEnabled;\r\n\r\n this.myHorizontalPositionVerticalStraightCheckEnabled = other.myHorizontalPositionVerticalStraightCheckEnabled;\r\n this.myHorizontalPositionVerticalStraightCentralCheckEnabled = other.myHorizontalPositionVerticalStraightCentralCheckEnabled;\r\n this.myHorizontalPositionVerticalRadialDiagonalOutwardCheckEnabled = other.myHorizontalPositionVerticalRadialDiagonalOutwardCheckEnabled;\r\n this.myHorizontalPositionVerticalRadialDiagonalInwardCheckEnabled = other.myHorizontalPositionVerticalRadialDiagonalInwardCheckEnabled;\r\n this.myHorizontalPositionVerticalBorderDiagonalOutwardCheckEnabled = other.myHorizontalPositionVerticalBorderDiagonalOutwardCheckEnabled;\r\n this.myHorizontalPositionVerticalBorderDiagonalInwardCheckEnabled = other.myHorizontalPositionVerticalBorderDiagonalInwardCheckEnabled;\r\n this.myHorizontalPositionVerticalRadialBorderDiagonalOutwardCheckEnabled = other.myHorizontalPositionVerticalRadialBorderDiagonalOutwardCheckEnabled;\r\n this.myHorizontalPositionVerticalRadialBorderDiagonalInwardCheckEnabled = other.myHorizontalPositionVerticalRadialBorderDiagonalInwardCheckEnabled;\r\n\r\n this.myHorizontalPositionVerticalCheckGetFarthestHit = other.myHorizontalPositionVerticalCheckGetFarthestHit;\r\n\r\n this.myHorizontalPositionVerticalCheckPerformHorizontalCheckOnHit = other.myHorizontalPositionVerticalCheckPerformHorizontalCheckOnHit;\r\n this.myHorizontalPositionVerticalCheckPerformHorizontalCheckOnHitKeepVerticalHitIfNoHorizontalHit = other.myHorizontalPositionVerticalCheckPerformHorizontalCheckOnHitKeepVerticalHitIfNoHorizontalHit;\r\n\r\n this.myHorizontalPositionVerticalCheckIgnoreHitsInsideCollision = other.myHorizontalPositionVerticalCheckIgnoreHitsInsideCollision;\r\n this.myHorizontalPositionVerticalCheckDirection = other.myHorizontalPositionVerticalCheckDirection;\r\n\r\n this.myHorizontalCheckBlockLayerFlags.setMask(other.myHorizontalCheckBlockLayerFlags.getMask());\r\n this.myHorizontalCheckObjectsToIgnore.pp_copy(other.myHorizontalCheckObjectsToIgnore);\r\n this.myHorizontalBlockColliderType = other.myHorizontalBlockColliderType;\r\n};\r\n\r\nCharacterColliderVerticalCheckParams.prototype.copy = function copy(other) {\r\n this.myVerticalCheckCircumferenceRadius = other.myVerticalCheckCircumferenceRadius;\r\n\r\n this.myVerticalCheckCircumferenceSlices = other.myVerticalCheckCircumferenceSlices;\r\n this.myVerticalCheckCircumferenceCentralCheckEnabled = other.myVerticalCheckCircumferenceCentralCheckEnabled;\r\n this.myVerticalCheckCircumferenceRadialSteps = other.myVerticalCheckCircumferenceRadialSteps;\r\n this.myVerticalCheckCircumferenceRotationPerRadialStep = other.myVerticalCheckCircumferenceRotationPerRadialStep;\r\n\r\n this.myVerticalCheckFixedForwardEnabled = other.myVerticalCheckFixedForwardEnabled;\r\n this.myVerticalCheckFixedForward.vec3_copy(other.myVerticalCheckFixedForward);\r\n\r\n this.myVerticalMovementCheckEnabled = other.myVerticalMovementCheckEnabled;\r\n this.myVerticalMovementCheckReductionEnabled = other.myVerticalMovementCheckReductionEnabled;\r\n this.myVerticalMovementCheckPerformCheckOnBothSides = other.myVerticalMovementCheckPerformCheckOnBothSides;\r\n\r\n this.myVerticalPositionCheckEnabled = other.myVerticalPositionCheckEnabled;\r\n this.myVerticalPositionCheckPerformCheckOnBothSides = other.myVerticalPositionCheckPerformCheckOnBothSides;\r\n\r\n this.myVerticalCheckAllowHitsInsideCollisionIfOneValid = other.myVerticalCheckAllowHitsInsideCollisionIfOneValid;\r\n\r\n this.myVerticalCheckBlockLayerFlags.setMask(other.myVerticalCheckBlockLayerFlags.getMask());\r\n this.myVerticalCheckObjectsToIgnore.pp_copy(other.myVerticalCheckObjectsToIgnore);\r\n this.myVerticalBlockColliderType = other.myVerticalBlockColliderType;\r\n};\r\n\r\nCharacterColliderWallSlideParams.prototype.copy = function copy(other) {\r\n this.myWallSlideEnabled = other.myWallSlideEnabled;\r\n\r\n this.myWallSlideMaxAttempts = other.myWallSlideMaxAttempts;\r\n\r\n this.myCheckBothWallSlideDirections = other.myCheckBothWallSlideDirections;\r\n\r\n this.myWallSlideFlickerPreventionMode = other.myWallSlideFlickerPreventionMode;\r\n\r\n this.myWallSlideFlickerPreventionCheckOnlyIfAlreadySliding = other.myWallSlideFlickerPreventionCheckOnlyIfAlreadySliding;\r\n\r\n this.myWallSlideFlickerPreventionForceCheckCounter = other.myWallSlideFlickerPreventionForceCheckCounter;\r\n\r\n this.my90DegreesWallSlideAdjustDirectionSign = other.my90DegreesWallSlideAdjustDirectionSign;\r\n};\r\n\r\nCharacterColliderSurfaceParams.prototype.copy = function copy(other) {\r\n this.mySurfaceSnapEnabled = other.mySurfaceSnapEnabled;\r\n this.mySurfaceSnapMaxDistance = other.mySurfaceSnapMaxDistance;\r\n\r\n this.mySurfacePopOutEnabled = other.mySurfacePopOutEnabled;\r\n this.mySurfacePopOutMaxDistance = other.mySurfacePopOutMaxDistance;\r\n\r\n this.mySurfaceAngleToIgnore = other.mySurfaceAngleToIgnore;\r\n this.mySurfaceAngleToIgnoreWithSurfacePerceivedAngle = other.mySurfaceAngleToIgnoreWithSurfacePerceivedAngle;\r\n\r\n this.myHorizontalMovementSurfaceAngleToIgnoreMaxVerticalDistance = other.myHorizontalMovementSurfaceAngleToIgnoreMaxVerticalDistance;\r\n this.myHorizontalPositionSurfaceAngleToIgnoreMaxVerticalDistance = other.myHorizontalPositionSurfaceAngleToIgnoreMaxVerticalDistance;\r\n\r\n this.myHorizontalMovementSurfaceAngleToIgnoreMaxHorizontalMovementLeft = other.myHorizontalMovementSurfaceAngleToIgnoreMaxHorizontalMovementLeft;\r\n\r\n this.myCollectSurfaceInfo = other.myCollectSurfaceInfo;\r\n\r\n this.myOnSurfaceMaxOutsideDistance = other.myOnSurfaceMaxOutsideDistance;\r\n this.myOnSurfaceMaxInsideDistance = other.myOnSurfaceMaxInsideDistance;\r\n\r\n this.myBaseInsideCollisionCheckEnabled = other.myBaseInsideCollisionCheckEnabled;\r\n this.myOnSurfaceIfBaseInsideCollision = other.myOnSurfaceIfBaseInsideCollision;\r\n\r\n this.myCollectSurfaceNormalMaxOutsideDistance = other.myCollectSurfaceNormalMaxOutsideDistance;\r\n this.myCollectSurfaceNormalMaxInsideDistance = other.myCollectSurfaceNormalMaxInsideDistance;\r\n\r\n this.myCollectSurfaceDistanceOutsideDistance = other.myCollectSurfaceDistanceOutsideDistance;\r\n this.myCollectSurfaceDistanceInsideDistance = other.myCollectSurfaceDistanceInsideDistance;\r\n\r\n this.myCollectSurfaceCollisionHitOutsideDistance = other.myCollectSurfaceCollisionHitOutsideDistance;\r\n this.myCollectSurfaceCollisionHitInsideDistance = other.myCollectSurfaceCollisionHitInsideDistance;\r\n\r\n this.myHorizontalMovementAdjustVerticalMovementOverSurfacePerceivedAngleDownhill = other.myHorizontalMovementAdjustVerticalMovementOverSurfacePerceivedAngleDownhill;\r\n this.myHorizontalMovementAdjustVerticalMovementOverSurfacePerceivedAngleUphill = other.myHorizontalMovementAdjustVerticalMovementOverSurfacePerceivedAngleUphill;\r\n this.myHorizontalMovementAdjustVerticalMovementOverSurfacePerceivedAngleDownhillMaxSurfaceAngle = other.myHorizontalMovementAdjustVerticalMovementOverSurfacePerceivedAngleDownhillMaxSurfaceAngle;\r\n this.myHorizontalMovementAdjustVerticalMovementOverSurfacePerceivedAngleUphillMaxSurfaceAngle = other.myHorizontalMovementAdjustVerticalMovementOverSurfacePerceivedAngleUphillMaxSurfaceAngle;\r\n this.myHorizontalMovementAdjustVerticalMovementOverSurfacePerceivedAngleDownhillMaxSurfacePerceivedAngle = other.myHorizontalMovementAdjustVerticalMovementOverSurfacePerceivedAngleDownhillMaxSurfacePerceivedAngle;\r\n this.myHorizontalMovementAdjustVerticalMovementOverSurfacePerceivedAngleUphillMaxSurfacePerceivedAngle = other.myHorizontalMovementAdjustVerticalMovementOverSurfacePerceivedAngleUphillMaxSurfacePerceivedAngle;\r\n\r\n this.myVerticalMovementAdjustHorizontalMovementOverSurfaceAngleDownhill = other.myVerticalMovementAdjustHorizontalMovementOverSurfaceAngleDownhill;\r\n this.myVerticalMovementAdjustHorizontalMovementOverSurfaceAngleDownhillMinSurfaceAngle = other.myVerticalMovementAdjustHorizontalMovementOverSurfaceAngleDownhillMinSurfaceAngle;\r\n\r\n this.myMovementMustStayOnSurface = other.myMovementMustStayOnSurface;\r\n this.myMovementMustStayOnSurfaceHitMaxAngle = other.myMovementMustStayOnSurfaceHitMaxAngle;\r\n this.myMovementMustStayOnIgnorableSurfaceAngleDownhill = other.myMovementMustStayOnIgnorableSurfaceAngleDownhill;\r\n this.myMovementMustStayOnSurfaceAngleDownhill = other.myMovementMustStayOnSurfaceAngleDownhill;\r\n\r\n this.myTeleportMustBeOnSurface = other.myTeleportMustBeOnSurface;\r\n this.myTeleportMustBeOnIgnorableSurfaceAngle = other.myTeleportMustBeOnIgnorableSurfaceAngle;\r\n this.myTeleportMustBeOnSurfaceAngle = other.myTeleportMustBeOnSurfaceAngle;\r\n\r\n this.myCheckTransformMustBeOnSurface = other.myCheckTransformMustBeOnSurface;\r\n this.myCheckTransformMustBeOnIgnorableSurfaceAngle = other.myCheckTransformMustBeOnIgnorableSurfaceAngle;\r\n this.myCheckTransformMustBeOnSurfaceAngle = other.myCheckTransformMustBeOnSurfaceAngle;\r\n\r\n this.myRecollectSurfaceInfoOnSurfaceCheckFailed = other.myRecollectSurfaceInfoOnSurfaceCheckFailed;\r\n\r\n this.myHorizontalMovementAllowExitAttemptWhenOnNotIgnorableSurfacePerceivedAngle = other.myHorizontalMovementAllowExitAttemptWhenOnNotIgnorableSurfacePerceivedAngle;\r\n};\r\n\r\nCharacterColliderSplitMovementParams.prototype.copy = function copy(other) {\r\n this.mySplitMovementEnabled = other.mySplitMovementEnabled;\r\n\r\n this.mySplitMovementMaxSteps = other.mySplitMovementMaxSteps;\r\n this.mySplitMovementMaxStepLength = other.mySplitMovementMaxStepLength;\r\n this.mySplitMovementMinStepLength = other.mySplitMovementMinStepLength;\r\n this.mySplitMovementLastStepCanBeLongerThanMaxStepLength = other.mySplitMovementLastStepCanBeLongerThanMaxStepLength;\r\n\r\n this.mySplitMovementStopOnHorizontalMovementFailed = other.mySplitMovementStopOnHorizontalMovementFailed;\r\n this.mySplitMovementStopOnVerticalMovementFailed = other.mySplitMovementStopOnVerticalMovementFailed;\r\n this.mySplitMovementStopOnVerticalMovementReduced = other.mySplitMovementStopOnVerticalMovementReduced;\r\n\r\n this.mySplitMovementStopAndFailIfMovementWouldBeReduced = other.mySplitMovementStopAndFailIfMovementWouldBeReduced;\r\n\r\n /*\r\n this.mySplitMovementStopOnCallback = other.mySplitMovementStopOnCallback;\r\n */\r\n\r\n this.mySplitMovementStopReturnPreviousResults = other.mySplitMovementStopReturnPreviousResults;\r\n};\r\n\r\nCharacterColliderAdditionalParams.prototype.copy = function copy(other) {\r\n this.myPositionOffsetLocal.vec3_copy(other.myPositionOffsetLocal);\r\n this.myRotationOffsetLocalQuat.quat_copy(other.myRotationOffsetLocalQuat);\r\n\r\n /*\r\n this.myExtraMovementCheckCallback = other.myExtraMovementCheckCallback;\r\n this.myExtraTeleportCheckCallback = other.myExtraTeleportCheckCallback;\r\n this.myExtraCheckTransformCheckCallback = other.myExtraCheckTransformCheckCallback;\r\n */\r\n};\r\n\r\nCharacterColliderDebugParams.prototype.copy = function copy(other) {\r\n this.myVisualDebugEnabled = other.myVisualDebugEnabled;\r\n\r\n this.myVisualDebugMovementEnabled = other.myVisualDebugMovementEnabled;\r\n\r\n this.myVisualDebugHorizontalMovementCheckEnabled = other.myVisualDebugHorizontalMovementCheckEnabled;\r\n this.myVisualDebugHorizontalPositionCheckEnabled = other.myVisualDebugHorizontalPositionCheckEnabled;\r\n\r\n this.myVisualDebugVerticalMovementCheckEnabled = other.myVisualDebugVerticalMovementCheckEnabled;\r\n this.myVisualDebugVerticalPositionCheckEnabled = other.myVisualDebugVerticalPositionCheckEnabled;\r\n\r\n this.myVisualDebugSlideEnabled = other.myVisualDebugSlideEnabled;\r\n\r\n this.myVisualDebugGroundInfoEnabled = other.myVisualDebugGroundInfoEnabled;\r\n this.myVisualDebugCeilingInfoEnabled = other.myVisualDebugCeilingInfoEnabled;\r\n\r\n this.myVisualDebugResultsEnabled = other.myVisualDebugResultsEnabled;\r\n};", "import { vec3_create } from \"../../../plugin/js/extensions/array/vec_create_extension.js\";\r\n\r\nexport function computeGroundPerceivedAngle(surfaceNormal, direction, up) {\r\n return this.computeSurfacePerceivedAngle(surfaceNormal, direction, up, true);\r\n}\r\n\r\nexport function computeCeilingPerceivedAngle(surfaceNormal, direction, up) {\r\n return this.computeSurfacePerceivedAngle(surfaceNormal, direction, up, false);\r\n}\r\n\r\nexport let computeSurfacePerceivedAngle = function () {\r\n let directionOnSurface = vec3_create();\r\n let verticalDirection = vec3_create();\r\n return function computeSurfacePerceivedAngle(surfaceNormal, direction, up, ground) {\r\n let surfacePerceivedAngle = 0;\r\n\r\n verticalDirection.vec3_copy(up);\r\n if (!ground) {\r\n verticalDirection.vec3_negate(verticalDirection);\r\n }\r\n\r\n let surfaceAngle = surfaceNormal.vec3_angle(verticalDirection);\r\n if (surfaceAngle <= Math.PP_EPSILON_DEGREES) {\r\n surfaceAngle = 0;\r\n } else if (surfaceAngle >= 180 - Math.PP_EPSILON_DEGREES) {\r\n surfaceAngle = 180;\r\n }\r\n\r\n directionOnSurface = direction.vec3_projectOnPlaneAlongAxis(surfaceNormal, up, directionOnSurface);\r\n surfacePerceivedAngle = directionOnSurface.vec3_angle(direction);\r\n\r\n let fartherOnUp = directionOnSurface.vec3_isFartherAlongAxis(direction, up);\r\n if ((!fartherOnUp && ground) || (fartherOnUp && !ground)) {\r\n surfacePerceivedAngle *= -1;\r\n }\r\n\r\n if (Math.abs(surfacePerceivedAngle) >= surfaceAngle) {\r\n if (surfaceAngle != 0 && surfaceAngle != 180) {\r\n surfacePerceivedAngle = surfaceAngle * Math.pp_sign(surfacePerceivedAngle);\r\n } else {\r\n surfacePerceivedAngle = surfaceAngle;\r\n }\r\n }\r\n\r\n return surfacePerceivedAngle;\r\n };\r\n}();\r\n\r\nexport let CharacterControllerUtils = {\r\n computeGroundPerceivedAngle,\r\n computeCeilingPerceivedAngle,\r\n computeSurfacePerceivedAngle\r\n};", "import { Object3D } from \"@wonderlandengine/api\";\r\nimport { PhysicsLayerFlags } from \"../../../../cauldron/physics/physics_layer_flags.js\";\r\nimport { CharacterColliderSetup, CharacterColliderSlideFlickerPreventionMode } from \"./character_collider_setup.js\";\r\n\r\nexport enum CharacterColliderSetupSimplifiedCreationAccuracyLevel {\r\n VERY_LOW = 0,\r\n LOW = 1,\r\n MEDIUM = 2,\r\n HIGH = 3,\r\n VERY_HIGH = 4\r\n};\r\n\r\nexport class CharacterColliderSetupSimplifiedCreationParams {\r\n\r\n public myHeight: number = 0;\r\n public myRadius: number = 0;\r\n public myFeetRadius: number | null = null;\r\n\r\n public myAccuracyLevel: CharacterColliderSetupSimplifiedCreationAccuracyLevel = CharacterColliderSetupSimplifiedCreationAccuracyLevel.VERY_LOW;\r\n\r\n public myIsPlayer: boolean = false;\r\n\r\n /**\r\n * If you enable this, you might also want to disable {@link myCheckCeilings}, \r\n * since it doesn't make much sense to check for ceilings when not checking the height\r\n */\r\n public myCheckOnlyFeet: boolean = false;\r\n\r\n /**\r\n * If you enable this, you might also want to disable {@link myCheckOnlyFeet}, \r\n * since it doesn't make much sense to check for ceilings without also checking the height\r\n */\r\n public myCheckCeilings: boolean = false;\r\n\r\n public myMaxMovementSteps: number | null = null;\r\n\r\n public myShouldSlideAlongWall: boolean = false;\r\n\r\n\r\n\r\n public myCollectGroundInfo: boolean = false;\r\n public myMaxDistanceToSnapOnGround: number = 0;\r\n public myMaxDistanceToPopOutGround: number = 0;\r\n public myMaxWalkableGroundAngle: number = 0;\r\n public myMaxWalkableGroundStepHeight: number = 0;\r\n\r\n /**\r\n * Normally, the ground params are used for the ceiling too, but this needs to be a different setting, \r\n * since allowing walkable steps on ceiling might create issues with view occlusion for the player (especially with a high value) \r\n * since you can go more under some low ceiling making the occlusion head collide with it\r\n * \r\n * Settings it to zero is safer, but means that the ceilings physx must be more flat, because it's easier that a small ceiling bump now blocks you\r\n */\r\n public myMaxWalkableCeilingStepHeight: number = 0;\r\n\r\n public myShouldNotFallFromEdges: boolean = false;\r\n\r\n\r\n\r\n public myHorizontalCheckBlockLayerFlags: PhysicsLayerFlags = new PhysicsLayerFlags();\r\n public myHorizontalCheckObjectsToIgnore: Object3D[] = [];\r\n\r\n public myVerticalCheckBlockLayerFlags: PhysicsLayerFlags = new PhysicsLayerFlags();\r\n public myVerticalCheckObjectsToIgnore: Object3D[] = [];\r\n\r\n public myHorizontalCheckDebugEnabled: boolean = false;\r\n public myVerticalCheckDebugEnabled: boolean = false;\r\n}\r\n\r\nexport function createSimplified(simplifiedCreationParams: Readonly, outCharacterColliderSetup: CharacterColliderSetup = new CharacterColliderSetup()): CharacterColliderSetup {\r\n outCharacterColliderSetup.myHeight = simplifiedCreationParams.myHeight;\r\n outCharacterColliderSetup.myHorizontalCheckParams.myHorizontalCheckConeRadius = simplifiedCreationParams.myRadius;\r\n outCharacterColliderSetup.myVerticalCheckParams.myVerticalCheckCircumferenceRadius = simplifiedCreationParams.myFeetRadius ?? simplifiedCreationParams.myRadius / 2;\r\n\r\n outCharacterColliderSetup.myVerticalCheckParams.myVerticalCheckFixedForwardEnabled = true;\r\n outCharacterColliderSetup.myVerticalCheckParams.myVerticalCheckFixedForward.vec3_set(0, 0, 1);\r\n\r\n if (!simplifiedCreationParams.myCheckOnlyFeet) {\r\n outCharacterColliderSetup.myHorizontalCheckParams.myHorizontalHeightCheckEnabled = true;\r\n outCharacterColliderSetup.myVerticalCheckParams.myVerticalPositionCheckEnabled = true;\r\n }\r\n\r\n outCharacterColliderSetup.myWallSlideParams.myWallSlideEnabled = simplifiedCreationParams.myShouldSlideAlongWall;\r\n\r\n\r\n\r\n outCharacterColliderSetup.myHorizontalCheckParams.myHorizontalCheckFeetDistanceToIgnore = simplifiedCreationParams.myMaxWalkableGroundStepHeight;\r\n\r\n outCharacterColliderSetup.myGroundParams.mySurfaceSnapEnabled = simplifiedCreationParams.myMaxDistanceToSnapOnGround > 0;\r\n outCharacterColliderSetup.myGroundParams.mySurfaceSnapMaxDistance = simplifiedCreationParams.myMaxDistanceToSnapOnGround;\r\n outCharacterColliderSetup.myGroundParams.mySurfacePopOutEnabled = simplifiedCreationParams.myMaxDistanceToPopOutGround > 0;\r\n outCharacterColliderSetup.myGroundParams.mySurfacePopOutMaxDistance = simplifiedCreationParams.myMaxDistanceToPopOutGround;\r\n outCharacterColliderSetup.myGroundParams.mySurfacePopOutMaxDistance = Math.max(outCharacterColliderSetup.myGroundParams.mySurfacePopOutMaxDistance, outCharacterColliderSetup.myHorizontalCheckParams.myHorizontalCheckFeetDistanceToIgnore);\r\n\r\n outCharacterColliderSetup.myGroundParams.myHorizontalMovementSurfaceAngleToIgnoreMaxHorizontalMovementLeft = simplifiedCreationParams.myRadius * 0.75;\r\n\r\n outCharacterColliderSetup.myGroundParams.myCollectSurfaceInfo = simplifiedCreationParams.myCollectGroundInfo || simplifiedCreationParams.myMaxWalkableGroundAngle > 0;\r\n outCharacterColliderSetup.myGroundParams.mySurfaceAngleToIgnore = simplifiedCreationParams.myMaxWalkableGroundAngle;\r\n\r\n outCharacterColliderSetup.myGroundParams.myOnSurfaceMaxOutsideDistance = 0.001;\r\n outCharacterColliderSetup.myGroundParams.myOnSurfaceMaxInsideDistance = 0.001;\r\n\r\n outCharacterColliderSetup.myGroundParams.myCollectSurfaceNormalMaxOutsideDistance = (simplifiedCreationParams.myRadius > 0.1) ? 0.1 : 0.01;\r\n outCharacterColliderSetup.myGroundParams.myCollectSurfaceNormalMaxInsideDistance = outCharacterColliderSetup.myGroundParams.myCollectSurfaceNormalMaxOutsideDistance;\r\n outCharacterColliderSetup.myGroundParams.myCollectSurfaceDistanceOutsideDistance = outCharacterColliderSetup.myGroundParams.myCollectSurfaceNormalMaxOutsideDistance;\r\n outCharacterColliderSetup.myGroundParams.myCollectSurfaceDistanceInsideDistance = outCharacterColliderSetup.myGroundParams.myCollectSurfaceNormalMaxInsideDistance;\r\n outCharacterColliderSetup.myGroundParams.myCollectSurfaceCollisionHitOutsideDistance = outCharacterColliderSetup.myGroundParams.myCollectSurfaceNormalMaxOutsideDistance;\r\n outCharacterColliderSetup.myGroundParams.myCollectSurfaceCollisionHitInsideDistance = outCharacterColliderSetup.myGroundParams.myCollectSurfaceNormalMaxInsideDistance;\r\n\r\n outCharacterColliderSetup.myGroundParams.myHorizontalMovementAdjustVerticalMovementOverSurfacePerceivedAngleDownhill = true;\r\n outCharacterColliderSetup.myGroundParams.myHorizontalMovementAdjustVerticalMovementOverSurfacePerceivedAngleUphill = true;\r\n\r\n if (simplifiedCreationParams.myShouldNotFallFromEdges) {\r\n outCharacterColliderSetup.myGroundParams.myMovementMustStayOnSurface = true;\r\n outCharacterColliderSetup.myGroundParams.myMovementMustStayOnSurfaceAngleDownhill = Math.max(60, outCharacterColliderSetup.myGroundParams.mySurfaceAngleToIgnore);\r\n }\r\n\r\n\r\n outCharacterColliderSetup.myHorizontalCheckParams.myHorizontalCheckHeadDistanceToIgnore = simplifiedCreationParams.myMaxWalkableCeilingStepHeight;\r\n\r\n if (simplifiedCreationParams.myCheckCeilings) {\r\n outCharacterColliderSetup.myCeilingParams.mySurfacePopOutEnabled = outCharacterColliderSetup.myGroundParams.mySurfacePopOutEnabled;\r\n outCharacterColliderSetup.myCeilingParams.mySurfacePopOutMaxDistance = simplifiedCreationParams.myMaxDistanceToPopOutGround;\r\n outCharacterColliderSetup.myCeilingParams.mySurfacePopOutMaxDistance = Math.max(outCharacterColliderSetup.myCeilingParams.mySurfacePopOutMaxDistance, outCharacterColliderSetup.myHorizontalCheckParams.myHorizontalCheckHeadDistanceToIgnore);\r\n\r\n outCharacterColliderSetup.myCeilingParams.myHorizontalMovementSurfaceAngleToIgnoreMaxHorizontalMovementLeft = outCharacterColliderSetup.myGroundParams.myHorizontalMovementSurfaceAngleToIgnoreMaxHorizontalMovementLeft;\r\n\r\n outCharacterColliderSetup.myCeilingParams.myCollectSurfaceInfo = outCharacterColliderSetup.myGroundParams.myCollectSurfaceInfo;\r\n outCharacterColliderSetup.myCeilingParams.mySurfaceAngleToIgnore = outCharacterColliderSetup.myGroundParams.mySurfaceAngleToIgnore;\r\n\r\n outCharacterColliderSetup.myCeilingParams.myOnSurfaceMaxOutsideDistance = outCharacterColliderSetup.myGroundParams.myOnSurfaceMaxOutsideDistance;\r\n outCharacterColliderSetup.myCeilingParams.myOnSurfaceMaxInsideDistance = outCharacterColliderSetup.myGroundParams.myOnSurfaceMaxInsideDistance;\r\n\r\n outCharacterColliderSetup.myCeilingParams.myCollectSurfaceNormalMaxOutsideDistance = outCharacterColliderSetup.myGroundParams.myCollectSurfaceNormalMaxOutsideDistance;\r\n outCharacterColliderSetup.myCeilingParams.myCollectSurfaceNormalMaxInsideDistance = outCharacterColliderSetup.myGroundParams.myCollectSurfaceNormalMaxInsideDistance;\r\n outCharacterColliderSetup.myCeilingParams.myCollectSurfaceDistanceOutsideDistance = outCharacterColliderSetup.myGroundParams.myCollectSurfaceDistanceOutsideDistance;\r\n outCharacterColliderSetup.myCeilingParams.myCollectSurfaceDistanceInsideDistance = outCharacterColliderSetup.myGroundParams.myCollectSurfaceDistanceInsideDistance;\r\n outCharacterColliderSetup.myCeilingParams.myCollectSurfaceCollisionHitOutsideDistance = outCharacterColliderSetup.myGroundParams.myCollectSurfaceCollisionHitOutsideDistance;\r\n outCharacterColliderSetup.myCeilingParams.myCollectSurfaceCollisionHitInsideDistance = outCharacterColliderSetup.myGroundParams.myCollectSurfaceCollisionHitInsideDistance;\r\n\r\n outCharacterColliderSetup.myCeilingParams.myHorizontalMovementAdjustVerticalMovementOverSurfacePerceivedAngleUphill = outCharacterColliderSetup.myGroundParams.myHorizontalMovementAdjustVerticalMovementOverSurfacePerceivedAngleUphill;\r\n }\r\n\r\n\r\n\r\n outCharacterColliderSetup.myHorizontalCheckParams.myHorizontalCheckBlockLayerFlags.copy(simplifiedCreationParams.myHorizontalCheckBlockLayerFlags);\r\n outCharacterColliderSetup.myHorizontalCheckParams.myHorizontalCheckObjectsToIgnore.pp_copy(simplifiedCreationParams.myHorizontalCheckObjectsToIgnore);\r\n\r\n outCharacterColliderSetup.myVerticalCheckParams.myVerticalCheckBlockLayerFlags.copy(simplifiedCreationParams.myVerticalCheckBlockLayerFlags);\r\n outCharacterColliderSetup.myVerticalCheckParams.myVerticalCheckObjectsToIgnore.pp_copy(simplifiedCreationParams.myVerticalCheckObjectsToIgnore);\r\n\r\n\r\n\r\n if (simplifiedCreationParams.myHorizontalCheckDebugEnabled) {\r\n outCharacterColliderSetup.myDebugParams.myVisualDebugEnabled = true;\r\n outCharacterColliderSetup.myDebugParams.myVisualDebugHorizontalMovementCheckEnabled = true;\r\n outCharacterColliderSetup.myDebugParams.myVisualDebugHorizontalPositionCheckEnabled = true;\r\n outCharacterColliderSetup.myDebugParams.myVisualDebugSlideEnabled = true;\r\n }\r\n\r\n if (simplifiedCreationParams.myVerticalCheckDebugEnabled) {\r\n outCharacterColliderSetup.myDebugParams.myVisualDebugEnabled = true;\r\n outCharacterColliderSetup.myDebugParams.myVisualDebugVerticalMovementCheckEnabled = true;\r\n outCharacterColliderSetup.myDebugParams.myVisualDebugVerticalPositionCheckEnabled = true;\r\n }\r\n\r\n\r\n\r\n // ACCURACY\r\n\r\n if (simplifiedCreationParams.myAccuracyLevel >= CharacterColliderSetupSimplifiedCreationAccuracyLevel.VERY_LOW) {\r\n outCharacterColliderSetup.myHorizontalCheckParams.myHorizontalCheckConeHalfAngle = 60;\r\n\r\n outCharacterColliderSetup.myHorizontalCheckParams.myHorizontalMovementHeightVerticalCheckEnabled = true;\r\n outCharacterColliderSetup.myHorizontalCheckParams.myHorizontalPositionHeightVerticalCheckEnabled = true;\r\n\r\n // Enable based on speed?\r\n outCharacterColliderSetup.myHorizontalCheckParams.myHorizontalMovementCheckEnabled = false;\r\n\r\n outCharacterColliderSetup.myHorizontalCheckParams.myHorizontalPositionCheckEnabled = true;\r\n outCharacterColliderSetup.myHorizontalCheckParams.myHorizontalPositionCheckConeHalfSlices = 1;\r\n outCharacterColliderSetup.myHorizontalCheckParams.myHorizontalPositionHeightCheckSteps = 1;\r\n outCharacterColliderSetup.myHorizontalCheckParams.myHorizontalPositionHorizontalRadialCheckEnabled = true;\r\n outCharacterColliderSetup.myHorizontalCheckParams.myHorizontalPositionVerticalStraightCheckEnabled = true;\r\n\r\n\r\n\r\n outCharacterColliderSetup.myVerticalCheckParams.myVerticalCheckCircumferenceSlices = 4;\r\n outCharacterColliderSetup.myVerticalCheckParams.myVerticalCheckCircumferenceCentralCheckEnabled = true;\r\n outCharacterColliderSetup.myVerticalCheckParams.myVerticalCheckCircumferenceRadialSteps = 1;\r\n\r\n outCharacterColliderSetup.myVerticalCheckParams.myVerticalMovementCheckEnabled = true;\r\n outCharacterColliderSetup.myVerticalCheckParams.myVerticalMovementCheckReductionEnabled = true;\r\n\r\n outCharacterColliderSetup.myVerticalCheckParams.myVerticalCheckAllowHitsInsideCollisionIfOneValid = true;\r\n\r\n if (simplifiedCreationParams.myIsPlayer) {\r\n outCharacterColliderSetup.myWallSlideParams.myWallSlideMaxAttempts = 2;\r\n outCharacterColliderSetup.myWallSlideParams.my90DegreesWallSlideAdjustDirectionSign = true;\r\n }\r\n }\r\n\r\n if (simplifiedCreationParams.myAccuracyLevel >= CharacterColliderSetupSimplifiedCreationAccuracyLevel.LOW) {\r\n outCharacterColliderSetup.myHorizontalCheckParams.myHorizontalMovementCheckEnabled = true;\r\n outCharacterColliderSetup.myHorizontalCheckParams.myHorizontalMovementCheckRadialSteps = 1;\r\n outCharacterColliderSetup.myHorizontalCheckParams.myHorizontalMovementHeightCheckSteps = 1;\r\n outCharacterColliderSetup.myHorizontalCheckParams.myHorizontalMovementHorizontalStraightCentralCheckEnabled = true;\r\n outCharacterColliderSetup.myHorizontalCheckParams.myHorizontalMovementVerticalStraightDiagonalUpwardCentralCheckEnabled = true;\r\n\r\n\r\n\r\n outCharacterColliderSetup.myVerticalCheckParams.myVerticalCheckCircumferenceRadialSteps = 2;\r\n outCharacterColliderSetup.myVerticalCheckParams.myVerticalCheckCircumferenceRotationPerRadialStep = 180 / outCharacterColliderSetup.myVerticalCheckParams.myVerticalCheckCircumferenceSlices;\r\n\r\n\r\n\r\n outCharacterColliderSetup.myWallSlideParams.myWallSlideMaxAttempts = 2;\r\n outCharacterColliderSetup.myWallSlideParams.myCheckBothWallSlideDirections = false;\r\n outCharacterColliderSetup.myWallSlideParams.myWallSlideFlickerPreventionMode = CharacterColliderSlideFlickerPreventionMode.NONE;\r\n outCharacterColliderSetup.myWallSlideParams.myWallSlideFlickerPreventionCheckOnlyIfAlreadySliding = false;\r\n outCharacterColliderSetup.myWallSlideParams.myWallSlideFlickerPreventionForceCheckCounter = 0;\r\n outCharacterColliderSetup.myWallSlideParams.my90DegreesWallSlideAdjustDirectionSign = false;\r\n }\r\n\r\n if (simplifiedCreationParams.myAccuracyLevel >= CharacterColliderSetupSimplifiedCreationAccuracyLevel.MEDIUM) {\r\n outCharacterColliderSetup.myHorizontalCheckParams.myHorizontalMovementHeightHorizontalCheckEnabled = true;\r\n outCharacterColliderSetup.myHorizontalCheckParams.myHorizontalMovementHorizontalDiagonalOutwardCheckEnabled = true;\r\n outCharacterColliderSetup.myHorizontalCheckParams.myHorizontalMovementVerticalDiagonalOutwardUpwardCheckEnabled = true;\r\n\r\n outCharacterColliderSetup.myHorizontalCheckParams.myHorizontalPositionCheckConeHalfSlices = 2;\r\n outCharacterColliderSetup.myHorizontalCheckParams.myHorizontalPositionHeightHorizontalCheckEnabled = true;\r\n outCharacterColliderSetup.myHorizontalCheckParams.myHorizontalPositionHorizontalBorderCheckEnabled = true;\r\n\r\n\r\n\r\n outCharacterColliderSetup.myVerticalCheckParams.myVerticalMovementCheckPerformCheckOnBothSides = true;\r\n outCharacterColliderSetup.myVerticalCheckParams.myVerticalPositionCheckPerformCheckOnBothSides = true;\r\n\r\n outCharacterColliderSetup.myVerticalCheckParams.myVerticalCheckCircumferenceSlices = 6;\r\n outCharacterColliderSetup.myVerticalCheckParams.myVerticalCheckCircumferenceRadialSteps = 2;\r\n outCharacterColliderSetup.myVerticalCheckParams.myVerticalCheckCircumferenceRotationPerRadialStep = 180 / outCharacterColliderSetup.myVerticalCheckParams.myVerticalCheckCircumferenceSlices;\r\n\r\n\r\n\r\n outCharacterColliderSetup.myWallSlideParams.myWallSlideMaxAttempts = 3;\r\n outCharacterColliderSetup.myWallSlideParams.my90DegreesWallSlideAdjustDirectionSign = true;\r\n\r\n if (simplifiedCreationParams.myIsPlayer) {\r\n outCharacterColliderSetup.myWallSlideParams.myWallSlideFlickerPreventionMode = CharacterColliderSlideFlickerPreventionMode.USE_PREVIOUS_RESULTS;\r\n outCharacterColliderSetup.myWallSlideParams.myWallSlideFlickerPreventionCheckOnlyIfAlreadySliding = true;\r\n outCharacterColliderSetup.myWallSlideParams.myWallSlideFlickerPreventionForceCheckCounter = 4;\r\n }\r\n\r\n\r\n\r\n outCharacterColliderSetup.mySplitMovementParams.mySplitMovementEnabled = true;\r\n outCharacterColliderSetup.mySplitMovementParams.mySplitMovementMaxSteps = simplifiedCreationParams.myMaxMovementSteps;\r\n\r\n const safeRadius = simplifiedCreationParams.myRadius * 0.75;\r\n outCharacterColliderSetup.mySplitMovementParams.mySplitMovementMaxStepLength = safeRadius;\r\n outCharacterColliderSetup.mySplitMovementParams.mySplitMovementMinStepLength = safeRadius;\r\n }\r\n\r\n if (simplifiedCreationParams.myAccuracyLevel >= CharacterColliderSetupSimplifiedCreationAccuracyLevel.HIGH) {\r\n if (outCharacterColliderSetup.myWallSlideParams.myWallSlideEnabled) {\r\n outCharacterColliderSetup.myHorizontalCheckParams.myHorizontalMovementCheckGetBetterReferenceHit = true;\r\n\r\n outCharacterColliderSetup.myHorizontalCheckParams.myHorizontalPositionVerticalCheckPerformHorizontalCheckOnHit = true;\r\n outCharacterColliderSetup.myHorizontalCheckParams.myHorizontalPositionVerticalCheckPerformHorizontalCheckOnHitKeepVerticalHitIfNoHorizontalHit = true;\r\n }\r\n\r\n outCharacterColliderSetup.myHorizontalCheckParams.myHorizontalMovementHorizontalDiagonalInwardCheckEnabled = true;\r\n outCharacterColliderSetup.myHorizontalCheckParams.myHorizontalMovementHorizontalStraightCheckEnabled = true;\r\n outCharacterColliderSetup.myHorizontalCheckParams.myHorizontalMovementHorizontalStraightCentralCheckEnabled = false;\r\n\r\n outCharacterColliderSetup.myHorizontalCheckParams.myHorizontalMovementVerticalDiagonalInwardUpwardCheckEnabled = true;\r\n outCharacterColliderSetup.myHorizontalCheckParams.myHorizontalMovementVerticalStraightDiagonalUpwardCheckEnabled = true;\r\n outCharacterColliderSetup.myHorizontalCheckParams.myHorizontalMovementVerticalStraightDiagonalUpwardCentralCheckEnabled = false;\r\n\r\n\r\n\r\n outCharacterColliderSetup.myVerticalCheckParams.myVerticalCheckCircumferenceSlices = 8;\r\n outCharacterColliderSetup.myVerticalCheckParams.myVerticalCheckCircumferenceRadialSteps = 2;\r\n outCharacterColliderSetup.myVerticalCheckParams.myVerticalCheckCircumferenceRotationPerRadialStep = 180 / outCharacterColliderSetup.myVerticalCheckParams.myVerticalCheckCircumferenceSlices;\r\n\r\n\r\n\r\n outCharacterColliderSetup.myWallSlideParams.myWallSlideMaxAttempts = 4;\r\n\r\n if (simplifiedCreationParams.myIsPlayer) {\r\n outCharacterColliderSetup.myWallSlideParams.myCheckBothWallSlideDirections = true;\r\n }\r\n\r\n\r\n\r\n outCharacterColliderSetup.myGroundParams.myBaseInsideCollisionCheckEnabled = true;\r\n\r\n if (simplifiedCreationParams.myCheckCeilings) {\r\n outCharacterColliderSetup.myCeilingParams.myBaseInsideCollisionCheckEnabled = true;\r\n }\r\n }\r\n\r\n if (simplifiedCreationParams.myAccuracyLevel >= CharacterColliderSetupSimplifiedCreationAccuracyLevel.VERY_HIGH) {\r\n outCharacterColliderSetup.myHorizontalCheckParams.myHorizontalMovementHeightCheckSteps = 2;\r\n\r\n outCharacterColliderSetup.myHorizontalCheckParams.myHorizontalMovementHorizontalRadialCheckEnabled = true;\r\n outCharacterColliderSetup.myHorizontalCheckParams.myHorizontalMovementVerticalDiagonalOutwardDownwardCheckEnabled = true;\r\n outCharacterColliderSetup.myHorizontalCheckParams.myHorizontalMovementVerticalDiagonalInwardDownwardCheckEnabled = true;\r\n\r\n outCharacterColliderSetup.myHorizontalCheckParams.myHorizontalMovementVerticalStraightCheckEnabled = true;\r\n outCharacterColliderSetup.myHorizontalCheckParams.myHorizontalMovementVerticalStraightCentralCheckEnabled = false;\r\n outCharacterColliderSetup.myHorizontalCheckParams.myHorizontalMovementVerticalStraightDiagonalDownwardCheckEnabled = true;\r\n outCharacterColliderSetup.myHorizontalCheckParams.myHorizontalMovementVerticalStraightDiagonalDownwardCentralCheckEnabled = false;\r\n\r\n outCharacterColliderSetup.myHorizontalCheckParams.myHorizontalPositionHeightCheckSteps = 2;\r\n\r\n outCharacterColliderSetup.myHorizontalCheckParams.myHorizontalPositionVerticalRadialDiagonalOutwardCheckEnabled = true;\r\n outCharacterColliderSetup.myHorizontalCheckParams.myHorizontalPositionVerticalBorderDiagonalOutwardCheckEnabled = true;\r\n\r\n outCharacterColliderSetup.myHorizontalCheckParams.myHorizontalPositionVerticalCheckPerformHorizontalCheckOnHit = true;\r\n outCharacterColliderSetup.myHorizontalCheckParams.myHorizontalPositionVerticalCheckPerformHorizontalCheckOnHitKeepVerticalHitIfNoHorizontalHit = true;\r\n\r\n\r\n\r\n outCharacterColliderSetup.myGroundParams.myRecollectSurfaceInfoOnSurfaceCheckFailed = true;\r\n\r\n if (simplifiedCreationParams.myCheckCeilings) {\r\n outCharacterColliderSetup.myCeilingParams.myRecollectSurfaceInfoOnSurfaceCheckFailed = outCharacterColliderSetup.myGroundParams.myRecollectSurfaceInfoOnSurfaceCheckFailed;\r\n }\r\n }\r\n\r\n return outCharacterColliderSetup;\r\n}\r\n\r\nexport function createTeleportColliderSetupFromMovementColliderSetup(movementColliderSetup: Readonly, outTeleportColliderSetup: CharacterColliderSetup = new CharacterColliderSetup()): CharacterColliderSetup {\r\n outTeleportColliderSetup.copy(movementColliderSetup);\r\n\r\n outTeleportColliderSetup.myHorizontalCheckParams.myHorizontalCheckConeHalfAngle = 180;\r\n outTeleportColliderSetup.myHorizontalCheckParams.myHorizontalPositionCheckConeHalfSlices =\r\n Math.round((outTeleportColliderSetup.myHorizontalCheckParams.myHorizontalCheckConeHalfAngle / movementColliderSetup.myHorizontalCheckParams.myHorizontalCheckConeHalfAngle)\r\n * movementColliderSetup.myHorizontalCheckParams.myHorizontalPositionCheckConeHalfSlices);\r\n\r\n outTeleportColliderSetup.myHorizontalCheckParams.myHorizontalCheckFixedForwardEnabled = true;\r\n outTeleportColliderSetup.myHorizontalCheckParams.myHorizontalCheckFixedForward.vec3_set(0, 0, 1);\r\n\r\n return outTeleportColliderSetup;\r\n}\r\n\r\nexport const CharacterColliderSetupUtils = {\r\n createSimplified,\r\n createTeleportColliderSetupFromMovementColliderSetup\r\n} as const;", "import { Object3D, WonderlandEngine } from \"@wonderlandengine/api\";\r\nimport { Timer } from \"../../../../../cauldron/cauldron/timer.js\";\r\nimport { Quaternion, Quaternion2, Vector3 } from \"../../../../../cauldron/type_definitions/array_type_definitions.js\";\r\nimport { Quat2Utils } from \"../../../../../cauldron/utils/array/quat2_utils.js\";\r\nimport { XRUtils } from \"../../../../../cauldron/utils/xr_utils.js\";\r\nimport { mat4_create, quat2_create, quat_create, vec3_create, vec4_create } from \"../../../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Globals } from \"../../../../../pp/globals.js\";\r\n\r\nexport enum NonVRReferenceSpaceMode {\r\n NO_FLOOR = 0,\r\n FLOOR = 1,\r\n NO_FLOOR_THEN_KEEP_VR = 2,\r\n FLOOR_THEN_KEEP_VR = 3\r\n}\r\n\r\nexport class PlayerHeadManagerParams {\r\n\r\n public mySessionChangeResyncEnabled: boolean = false;\r\n\r\n public myBlurEndResyncEnabled: boolean = false;\r\n public myBlurEndResyncRotation: boolean = false;\r\n\r\n public myResetTransformOnViewResetEnabled: boolean = true;\r\n\r\n public myNextEnterSessionResyncHeight: boolean = false;\r\n public myEnterSessionResyncHeight: boolean = false;\r\n\r\n\r\n\r\n public myExitSessionResyncHeight: boolean = false;\r\n public myExitSessionResyncVerticalAngle: boolean = false;\r\n\r\n /** For now right tilt is removed even if this setting is `false`, if the vertical angle has to be adjusted */\r\n public myExitSessionRemoveRightTilt: boolean = false;\r\n\r\n public myExitSessionAdjustMaxVerticalAngle: boolean = false;\r\n public myExitSessionMaxVerticalAngle: number = 0;\r\n public myExitSessionResetNonVRTransformLocal: boolean = true;\r\n\r\n\r\n\r\n public myNonVRFloorBasedMode: NonVRReferenceSpaceMode = NonVRReferenceSpaceMode.FLOOR_THEN_KEEP_VR;\r\n\r\n\r\n\r\n public myDefaultHeightNonVR: number = 0;\r\n public myDefaultHeightVRWithoutFloor: number = 0;\r\n\r\n /** `null` means just keep the detected one */\r\n public myDefaultHeightVRWithFloor: number | null = null;\r\n\r\n /** Can be used to always add a bit of height, for example to compensate the fact \r\n that the default height is actually the eye height and you may want to also add a forehead offset */\r\n public myForeheadExtraHeight: number = 0;\r\n\r\n\r\n\r\n public myFeetRotationKeepUp: boolean = true;\r\n\r\n public myDebugEnabled: boolean = false;\r\n\r\n public readonly myEngine: Readonly;\r\n\r\n constructor(engine: Readonly = Globals.getMainEngine()!) {\r\n this.myEngine = engine;\r\n }\r\n}\r\n\r\n// #TODO Could be seen as the generic player body manager (maybe with hands and stuff also)\r\nexport class PlayerHeadManager {\r\n\r\n private readonly _myParams: PlayerHeadManagerParams;\r\n\r\n private _myCurrentHead: Object3D;\r\n private readonly _myCurrentHeadTransformLocalQuat: Quaternion2 = quat2_create();\r\n\r\n\r\n private _mySessionChangeResyncHeadTransform: Readonly | null = null;\r\n\r\n /** Needed because VR head takes some frames to get the tracked position */\r\n private _myDelaySessionChangeResyncCounter: number = 0;\r\n\r\n\r\n private _myBlurRecoverHeadTransform: Readonly | null = null;\r\n private _myDelayBlurEndResyncCounter: number = 0;\r\n private readonly _myDelayBlurEndResyncTimer = new Timer(5, false);\r\n\r\n private _myVisibilityHidden: boolean = false;\r\n private _myVisibilityChangeEventListener: ((event: XRSessionEvent) => any) | null = null;\r\n\r\n private _mySessionActive: boolean = false;\r\n private _mySessionBlurred: boolean = false;\r\n\r\n private _myIsSyncedDelayCounter: number = 0;\r\n\r\n private _myViewResetThisFrame: boolean = false;\r\n private _myViewResetEventListener: ((event: XRReferenceSpaceEvent) => any) | null = null;\r\n\r\n private _myHeightNonVR: number = 0;\r\n private _myHeightNonVROnEnterSession: number = 0;\r\n private _myHeightVRWithoutFloor: number | null = null;\r\n private _myHeightVRWithFloor: number | null = null;\r\n private _myHeightOffsetWithFloor: number = 0;\r\n private _myHeightOffsetWithoutFloor: number = 0;\r\n private _myNextEnterSessionSetHeightVRWithFloor: boolean = false;\r\n private _myNextEnterSessionSetHeightVRWithoutFloor: boolean = false;\r\n private _myDelayNextEnterSessionSetHeightVRCounter: number = 0;\r\n\r\n private _myLastReferenceSpaceIsFloorBased: boolean | null = null;\r\n\r\n private _myActive: boolean = true;\r\n\r\n private _myDestroyed: boolean = false;\r\n\r\n private static readonly _myResyncCounterFrames = 3;\r\n private static readonly _myIsSyncedDelayCounterFrames = 1;\r\n\r\n constructor(params: PlayerHeadManagerParams = new PlayerHeadManagerParams()) {\r\n this._myParams = params;\r\n\r\n this._myCurrentHead = Globals.getPlayerObjects(this._myParams.myEngine)!.myHead!;\r\n }\r\n\r\n public start(): void {\r\n this._setHeightHeadNonVR(this._myParams.myDefaultHeightNonVR);\r\n this._setHeightHeadVRWithoutFloor(this._myParams.myDefaultHeightVRWithoutFloor);\r\n this._setHeightHeadVRWithFloor(this._myParams.myDefaultHeightVRWithFloor);\r\n\r\n this._updateHeightOffset();\r\n\r\n this._setCameraNonXRHeight(this._myHeightNonVR);\r\n\r\n this._myActive = false;\r\n this.setActive(true);\r\n }\r\n\r\n public setActive(active: boolean): void {\r\n if (this._myActive != active) {\r\n this._myActive = active;\r\n\r\n if (this._myActive) {\r\n XRUtils.registerSessionStartEndEventListeners(this, this._onXRSessionStart.bind(this), this._onXRSessionEnd.bind(this), true, true, this._myParams.myEngine);\r\n } else {\r\n if (this._myViewResetEventListener != null) {\r\n XRUtils.getReferenceSpace(this._myParams.myEngine)?.removeEventListener?.(\"reset\", this._myViewResetEventListener);\r\n }\r\n\r\n if (this._myVisibilityChangeEventListener != null) {\r\n XRUtils.getSession(this._myParams.myEngine)?.removeEventListener?.(\"visibilitychange\", this._myVisibilityChangeEventListener);\r\n }\r\n\r\n XRUtils.unregisterSessionStartEndEventListeners(this, this._myParams.myEngine);\r\n\r\n this._onXRSessionEnd();\r\n }\r\n\r\n this.cancelSync();\r\n }\r\n }\r\n\r\n public getParams(): PlayerHeadManagerParams {\r\n return this._myParams;\r\n }\r\n\r\n public getPlayer(): Object3D {\r\n return Globals.getPlayerObjects(this._myParams.myEngine)!.myPlayer!;\r\n }\r\n\r\n public getHead(): Object3D {\r\n return this._myCurrentHead;\r\n }\r\n\r\n public getHeightHead(): number {\r\n return this.getHeightEyes() + this._myParams.myForeheadExtraHeight;\r\n }\r\n\r\n private static readonly _getHeightEyesSV =\r\n {\r\n headPosition: vec3_create()\r\n };\r\n public getHeightEyes(): number {\r\n const headPosition = PlayerHeadManager._getHeightEyesSV.headPosition;\r\n this._myCurrentHead.pp_getPosition(headPosition);\r\n const eyesHeight = this._getPositionEyesHeight(headPosition);\r\n\r\n return eyesHeight;\r\n }\r\n\r\n private static readonly _getTransformFeetQuatSV =\r\n {\r\n feetPosition: vec3_create(),\r\n feetRotationQuat: quat_create()\r\n };\r\n public getTransformFeetQuat(): Quaternion2;\r\n public getTransformFeetQuat(outTransformQuat: T): T;\r\n public getTransformFeetQuat(outTransformQuat: Quaternion2 | T = quat2_create()): Quaternion2 | T {\r\n const feetPosition = PlayerHeadManager._getTransformFeetQuatSV.feetPosition;\r\n const feetRotationQuat = PlayerHeadManager._getTransformFeetQuatSV.feetRotationQuat;\r\n outTransformQuat.quat2_setPositionRotationQuat(this.getPositionFeet(feetPosition), this.getRotationFeetQuat(feetRotationQuat));\r\n return outTransformQuat;\r\n }\r\n\r\n public getTransformHeadQuat(): Quaternion2;\r\n public getTransformHeadQuat(outTransformQuat: T): T;\r\n public getTransformHeadQuat(outTransformQuat: Quaternion2 | T = quat2_create()): Quaternion2 | T {\r\n return this.getHead().pp_getTransformQuat(outTransformQuat);\r\n }\r\n\r\n private static readonly _getPositionFeetSV =\r\n {\r\n headPosition: vec3_create(),\r\n playerUp: vec3_create()\r\n };\r\n public getPositionFeet(): Vector3;\r\n public getPositionFeet(outPosition: T): T;\r\n public getPositionFeet(outPosition: Vector3 | T = vec3_create()): Vector3 | T {\r\n const headPosition = PlayerHeadManager._getPositionFeetSV.headPosition;\r\n this._myCurrentHead.pp_getPosition(headPosition);\r\n const headHeight = this._getPositionEyesHeight(headPosition);\r\n\r\n const playerUp = PlayerHeadManager._getPositionFeetSV.playerUp;\r\n this.getPlayer().pp_getUp(playerUp);\r\n outPosition = headPosition.vec3_sub(playerUp.vec3_scale(headHeight, outPosition), outPosition);\r\n\r\n return outPosition;\r\n }\r\n\r\n public getPositionHead(): Vector3;\r\n public getPositionHead(outPosition: T): T;\r\n public getPositionHead(outPosition: Vector3 | T = vec3_create()): Vector3 | T {\r\n return this._myCurrentHead.pp_getPosition(outPosition);\r\n }\r\n\r\n private static readonly _getRotationFeetQuatSV =\r\n {\r\n playerUp: vec3_create(),\r\n headForward: vec3_create()\r\n };\r\n public getRotationFeetQuat(): Quaternion;\r\n public getRotationFeetQuat(outRotationQuat: T): T;\r\n public getRotationFeetQuat(outRotationQuat: Quaternion | T = quat_create()): Quaternion | T {\r\n const playerUp = PlayerHeadManager._getRotationFeetQuatSV.playerUp;\r\n const headForward = PlayerHeadManager._getRotationFeetQuatSV.headForward;\r\n this.getPlayer().pp_getUp(playerUp);\r\n this._myCurrentHead.pp_getForward(headForward);\r\n\r\n // Feet are considered to always be flat on the player up\r\n const angleWithUp = headForward.vec3_angle(playerUp);\r\n const mingAngle = 10;\r\n if (angleWithUp < mingAngle) {\r\n this._myCurrentHead.pp_getDown(headForward);\r\n } else if (angleWithUp > 180 - mingAngle) {\r\n this._myCurrentHead.pp_getUp(headForward);\r\n }\r\n\r\n headForward.vec3_removeComponentAlongAxis(playerUp, headForward);\r\n headForward.vec3_normalize(headForward);\r\n\r\n outRotationQuat.quat_setUp(playerUp, headForward);\r\n return outRotationQuat;\r\n }\r\n\r\n public getRotationHeadQuat(): Quaternion;\r\n public getRotationHeadQuat(outRotationQuat: T): T;\r\n public getRotationHeadQuat(outRotationQuat: Quaternion | T = quat_create()): Quaternion | T {\r\n return this.getHead().pp_getRotationQuat(outRotationQuat);\r\n }\r\n\r\n public isSynced(ignoreSessionBlurredState: boolean = false): boolean {\r\n return this._myIsSyncedDelayCounter == 0 && this._myDelaySessionChangeResyncCounter == 0 && this._myDelayNextEnterSessionSetHeightVRCounter == 0 && this._myDelayBlurEndResyncCounter == 0 && !this._myDelayBlurEndResyncTimer.isRunning() && (ignoreSessionBlurredState || !this._mySessionBlurred);\r\n }\r\n\r\n public setHeightHead(height: number, setOnlyForActiveOne: boolean = true): void {\r\n this._setHeightHead(height, height, height, setOnlyForActiveOne);\r\n }\r\n\r\n public setHeightHeadNonVR(height: number): void {\r\n this._setHeightHeadNonVR(height);\r\n\r\n if (!this._mySessionActive) {\r\n this._updateHeightOffset();\r\n this._setCameraNonXRHeight(this._myHeightNonVR);\r\n }\r\n }\r\n\r\n public setHeightHeadVRWithoutFloor(height: number): void {\r\n this._setHeightHeadVRWithoutFloor(height);\r\n\r\n if (this._mySessionActive) {\r\n this._updateHeightOffset();\r\n }\r\n }\r\n\r\n public setHeightHeadVRWithFloor(height = null): void {\r\n this._setHeightHeadVRWithFloor(height);\r\n\r\n if (this._mySessionActive) {\r\n this._updateHeightOffset();\r\n }\r\n }\r\n\r\n public resetHeightHeadToDefault(resetOnlyForActiveOne: boolean = true): void {\r\n this._setHeightHead(this._myHeightNonVR, this._myHeightVRWithoutFloor, this._myHeightVRWithFloor, resetOnlyForActiveOne);\r\n }\r\n\r\n public resetHeightHeadVRWithFloor(): void {\r\n this.setHeightHeadVRWithFloor(null);\r\n }\r\n\r\n public getDefaultHeightHeadNonVR(): number {\r\n return this._myHeightNonVR;\r\n }\r\n\r\n public getDefaultHeightHeadVRWithoutFloor(): number | null {\r\n return this._myHeightVRWithoutFloor;\r\n }\r\n\r\n public getDefaultHeightHeadVRWithFloor(): number | null {\r\n return this._myHeightVRWithFloor;\r\n }\r\n\r\n public getForeheadExtraHeight(): number {\r\n return this._myParams.myForeheadExtraHeight;\r\n }\r\n\r\n public setForeheadExtraHeight(foreheadExtraHeight: number, keepSameHeight: boolean = false, keepSameHeightOnlyForActiveOne: boolean = true): void {\r\n this._myParams.myForeheadExtraHeight = foreheadExtraHeight;\r\n\r\n if (keepSameHeight && (!keepSameHeightOnlyForActiveOne || !this._mySessionActive)) {\r\n this._setHeightHeadNonVR(this._myHeightNonVR);\r\n } else {\r\n this._myHeightNonVR = Math.max(this._myHeightNonVR + (foreheadExtraHeight - this._myParams.myForeheadExtraHeight), this._myParams.myForeheadExtraHeight);\r\n this._myHeightNonVROnEnterSession = Math.max(this._myHeightNonVROnEnterSession + (foreheadExtraHeight - this._myParams.myForeheadExtraHeight), this._myParams.myForeheadExtraHeight);\r\n }\r\n\r\n if (keepSameHeight && (!keepSameHeightOnlyForActiveOne || this._mySessionActive)) {\r\n this._setHeightHeadVRWithoutFloor(this._myHeightVRWithoutFloor);\r\n this._setHeightHeadVRWithFloor(this._myHeightVRWithFloor);\r\n } else {\r\n if (this._myHeightVRWithoutFloor != null) {\r\n this._myHeightVRWithoutFloor = Math.max(this._myHeightVRWithoutFloor + (foreheadExtraHeight - this._myParams.myForeheadExtraHeight), this._myParams.myForeheadExtraHeight);\r\n }\r\n\r\n if (this._myHeightVRWithFloor != null) {\r\n this._myHeightVRWithFloor = Math.max(this._myHeightVRWithFloor + (foreheadExtraHeight - this._myParams.myForeheadExtraHeight), this._myParams.myForeheadExtraHeight);\r\n }\r\n }\r\n\r\n if (keepSameHeight) {\r\n this._updateHeightOffset();\r\n\r\n if (!this._mySessionActive) {\r\n this._setCameraNonXRHeight(this._myHeightNonVR);\r\n }\r\n }\r\n }\r\n\r\n public moveFeet(movement: Readonly): void {\r\n this.getPlayer().pp_translate(movement);\r\n }\r\n\r\n public moveHead(movement: Readonly): void {\r\n this.moveFeet(movement);\r\n }\r\n\r\n private static readonly _teleportPositionHeadSV =\r\n {\r\n currentHeadPosition: vec3_create(),\r\n teleportMovementToPerform: vec3_create()\r\n };\r\n public teleportPositionHead(teleportPosition: Readonly): void {\r\n const currentHeadPosition = PlayerHeadManager._teleportPositionHeadSV.currentHeadPosition;\r\n const teleportMovementToPerform = PlayerHeadManager._teleportPositionHeadSV.teleportMovementToPerform;\r\n this._myCurrentHead.pp_getPosition(currentHeadPosition);\r\n teleportPosition.vec3_sub(currentHeadPosition, teleportMovementToPerform);\r\n this.moveFeet(teleportMovementToPerform);\r\n }\r\n\r\n private static readonly _teleportPositionFeetSV =\r\n {\r\n currentFeetPosition: vec3_create(),\r\n teleportMovementToPerform: vec3_create()\r\n };\r\n public teleportPositionFeet(teleportPosition: Readonly): void {\r\n const currentFeetPosition = PlayerHeadManager._teleportPositionFeetSV.currentFeetPosition;\r\n const teleportMovementToPerform = PlayerHeadManager._teleportPositionFeetSV.teleportMovementToPerform;\r\n this.getPositionFeet(currentFeetPosition);\r\n teleportPosition.vec3_sub(currentFeetPosition, teleportMovementToPerform);\r\n this.moveFeet(teleportMovementToPerform);\r\n }\r\n\r\n private static readonly _teleportPlayerToHeadTransformQuatSV =\r\n {\r\n headPosition: vec3_create(),\r\n playerUp: vec3_create(),\r\n flatCurrentPlayerPosition: vec3_create(),\r\n flatNewPlayerPosition: vec3_create(),\r\n teleportMovement: vec3_create(),\r\n playerForward: vec3_create(),\r\n headForward: vec3_create(),\r\n referenceSpaceForward: vec3_create(),\r\n referenceSpaceForwardNegated: vec3_create(),\r\n rotationToPerform: quat_create()\r\n };\r\n public teleportPlayerToHeadTransformQuat(headTransformQuat: Readonly): void {\r\n const headPosition = PlayerHeadManager._teleportPlayerToHeadTransformQuatSV.headPosition;\r\n headTransformQuat.quat2_getPosition(headPosition);\r\n\r\n const playerUp = PlayerHeadManager._teleportPlayerToHeadTransformQuatSV.playerUp;\r\n const flatCurrentPlayerPosition = PlayerHeadManager._teleportPlayerToHeadTransformQuatSV.flatCurrentPlayerPosition;\r\n const flatNewPlayerPosition = PlayerHeadManager._teleportPlayerToHeadTransformQuatSV.flatNewPlayerPosition;\r\n this.getPlayer().pp_getUp(playerUp);\r\n this.getPlayer().pp_getPosition(flatCurrentPlayerPosition).vec3_removeComponentAlongAxis(playerUp, flatCurrentPlayerPosition);\r\n headPosition.vec3_removeComponentAlongAxis(playerUp, flatNewPlayerPosition);\r\n\r\n const teleportMovement = PlayerHeadManager._teleportPlayerToHeadTransformQuatSV.teleportMovement;\r\n flatNewPlayerPosition.vec3_sub(flatCurrentPlayerPosition, teleportMovement);\r\n this.getPlayer().pp_translate(teleportMovement);\r\n\r\n const playerForward = PlayerHeadManager._teleportPlayerToHeadTransformQuatSV.playerForward;\r\n const headForward = PlayerHeadManager._teleportPlayerToHeadTransformQuatSV.headForward;\r\n this.getPlayer().pp_getForward(playerForward);\r\n headTransformQuat.quat2_getForward(headForward);\r\n\r\n const rotationToPerform = PlayerHeadManager._teleportPlayerToHeadTransformQuatSV.rotationToPerform;\r\n playerForward.vec3_rotationToPivotedQuat(headForward, playerUp, rotationToPerform);\r\n\r\n this.getPlayer().pp_rotateQuat(rotationToPerform);\r\n\r\n // Adjust player rotation based on the reference space rotation, which should not actually be touched,\r\n // but just in case\r\n\r\n this.getPlayer().pp_getForward(playerForward);\r\n\r\n const referenceSpaceForward = PlayerHeadManager._teleportPlayerToHeadTransformQuatSV.referenceSpaceForward;\r\n const referenceSpaceForwardNegated = PlayerHeadManager._teleportPlayerToHeadTransformQuatSV.referenceSpaceForwardNegated;\r\n Globals.getPlayerObjects(this._myParams.myEngine)!.myReferenceSpace!.pp_getForward(referenceSpaceForward);\r\n referenceSpaceForward.vec3_negate(referenceSpaceForwardNegated);\r\n\r\n referenceSpaceForwardNegated.vec3_rotationToPivotedQuat(playerForward, playerUp, rotationToPerform);\r\n\r\n this.getPlayer().pp_rotateQuat(rotationToPerform);\r\n }\r\n\r\n private static readonly _rotateFeetQuatSV =\r\n {\r\n playerUp: vec3_create(),\r\n rotationAxis: vec3_create(),\r\n currentHeadPosition: vec3_create(),\r\n currentFeetRotation: quat_create(),\r\n newFeetRotation: quat_create(),\r\n fixedNewFeetRotation: quat_create(),\r\n newFeetForward: vec3_create(),\r\n fixedRotation: quat_create(),\r\n newHeadPosition: vec3_create(),\r\n headAdjustmentMovement: vec3_create()\r\n };\r\n public rotateFeetQuat(rotationQuat: Readonly, keepUpOverride: boolean | null = null): void {\r\n const angle = rotationQuat.quat_getAngleRadians();\r\n if (angle <= 0.00001) {\r\n return;\r\n }\r\n\r\n const currentHeadPosition = PlayerHeadManager._rotateFeetQuatSV.currentHeadPosition;\r\n const playerUp = PlayerHeadManager._rotateFeetQuatSV.playerUp;\r\n const rotationAxis = PlayerHeadManager._rotateFeetQuatSV.rotationAxis;\r\n this._myCurrentHead.pp_getPosition(currentHeadPosition);\r\n this.getPlayer().pp_getUp(playerUp);\r\n rotationQuat.quat_getAxis(rotationAxis);\r\n\r\n const fixedRotation = PlayerHeadManager._rotateFeetQuatSV.fixedRotation;\r\n if (!rotationAxis.vec3_isOnAxis(playerUp) &&\r\n ((keepUpOverride == null && this._myParams.myFeetRotationKeepUp) || (keepUpOverride))) {\r\n const currentFeetRotation = PlayerHeadManager._rotateFeetQuatSV.currentFeetRotation;\r\n this.getRotationFeetQuat(currentFeetRotation);\r\n\r\n const newFeetRotation = PlayerHeadManager._rotateFeetQuatSV.newFeetRotation;\r\n const newFeetForward = PlayerHeadManager._rotateFeetQuatSV.newFeetForward;\r\n currentFeetRotation.quat_rotateQuat(rotationQuat, newFeetRotation);\r\n newFeetRotation.quat_getForward(newFeetForward);\r\n\r\n const fixedNewFeetRotation = PlayerHeadManager._rotateFeetQuatSV.fixedNewFeetRotation;\r\n fixedNewFeetRotation.quat_copy(newFeetRotation);\r\n fixedNewFeetRotation.quat_setUp(playerUp, newFeetForward);\r\n\r\n currentFeetRotation.quat_rotationToQuat(fixedNewFeetRotation, fixedRotation);\r\n } else {\r\n fixedRotation.quat_copy(rotationQuat);\r\n }\r\n\r\n this.getPlayer().pp_rotateAroundQuat(fixedRotation, currentHeadPosition);\r\n\r\n const newHeadPosition = PlayerHeadManager._rotateFeetQuatSV.newHeadPosition;\r\n this._myCurrentHead.pp_getPosition(newHeadPosition);\r\n\r\n const headAdjustmentMovement = PlayerHeadManager._rotateFeetQuatSV.headAdjustmentMovement;\r\n currentHeadPosition.vec3_sub(newHeadPosition, headAdjustmentMovement);\r\n if (headAdjustmentMovement.vec3_length() > 0.00001) {\r\n this.moveFeet(headAdjustmentMovement);\r\n }\r\n }\r\n\r\n private static readonly _rotateHeadQuatSV =\r\n {\r\n newHeadRotation: quat_create(),\r\n newHeadUp: vec3_create()\r\n };\r\n // #TODO Rotate feet with this and then rotate head freely if possible\r\n public rotateHeadQuat(rotationQuat: Readonly): void {\r\n if (this.canRotateHead()) {\r\n this._myCurrentHead.pp_rotateQuat(rotationQuat);\r\n const newHeadRotation = PlayerHeadManager._rotateHeadQuatSV.newHeadRotation;\r\n this._myCurrentHead.pp_getRotationQuat(newHeadRotation);\r\n\r\n Globals.getPlayerObjects(this._myParams.myEngine)!.myHead!.pp_setRotationQuat(newHeadRotation);\r\n\r\n if (!this._mySessionActive) {\r\n const newHeadUp = PlayerHeadManager._rotateHeadQuatSV.newHeadUp;\r\n newHeadRotation.quat_rotateAxisRadians(Math.PI, newHeadRotation.quat_getUp(newHeadUp), newHeadRotation);\r\n Globals.getPlayerObjects(this._myParams.myEngine)!.myCameraNonXR!.pp_setRotationQuat(newHeadRotation);\r\n }\r\n }\r\n }\r\n\r\n public canRotateFeet(): boolean {\r\n return true;\r\n }\r\n\r\n public canRotateHead(): boolean {\r\n return !this._mySessionActive;\r\n }\r\n\r\n private static readonly _setRotationFeetQuatSV =\r\n {\r\n currentRotationQuat: quat_create(),\r\n rotationQuatToRotate: quat_create()\r\n };\r\n public setRotationFeetQuat(rotationQuat: Readonly, keepUpOverride: boolean | null = null): void {\r\n const currentRotationQuat = PlayerHeadManager._setRotationFeetQuatSV.currentRotationQuat;\r\n const rotationQuatToRotate = PlayerHeadManager._setRotationFeetQuatSV.rotationQuatToRotate;\r\n this.getRotationFeetQuat(currentRotationQuat);\r\n currentRotationQuat.quat_rotationToQuat(rotationQuat, rotationQuatToRotate);\r\n this.rotateFeetQuat(rotationQuatToRotate, keepUpOverride);\r\n }\r\n\r\n private static readonly _setRotationHeadQuatSV =\r\n {\r\n currentRotationQuat: quat_create(),\r\n rotationQuatToRotate: quat_create()\r\n };\r\n public setRotationHeadQuat(rotationQuat: Readonly): void {\r\n const currentRotationQuat = PlayerHeadManager._setRotationHeadQuatSV.currentRotationQuat;\r\n const rotationQuatToRotate = PlayerHeadManager._setRotationHeadQuatSV.rotationQuatToRotate;\r\n this.getRotationHeadQuat(currentRotationQuat);\r\n currentRotationQuat.quat_rotationToQuat(rotationQuat, rotationQuatToRotate);\r\n this.rotateHeadQuat(rotationQuatToRotate);\r\n }\r\n\r\n private static readonly _lookAtFeetSV =\r\n {\r\n direction: vec3_create(),\r\n feetPosition: vec3_create()\r\n };\r\n public lookAtFeet(position: Readonly, up?: Readonly, keepUpOverride: boolean | null = null): void {\r\n const feetPosition = PlayerHeadManager._lookAtFeetSV.feetPosition;\r\n const direction = PlayerHeadManager._lookAtFeetSV.direction;\r\n this.getPositionFeet(feetPosition);\r\n position.vec3_sub(feetPosition, direction).vec3_normalize(direction);\r\n\r\n this.lookToFeet(direction, up, keepUpOverride);\r\n }\r\n\r\n private static readonly _lookToFeetSV =\r\n {\r\n feetRotation: quat_create()\r\n };\r\n public lookToFeet(direction: Readonly, up?: Readonly, keepUpOverride: boolean | null = null): void {\r\n const feetRotation = PlayerHeadManager._lookToFeetSV.feetRotation;\r\n this.getRotationFeetQuat(feetRotation);\r\n feetRotation.quat_setForward(direction, up);\r\n this.setRotationFeetQuat(feetRotation, keepUpOverride);\r\n }\r\n\r\n private static readonly _lookAtHeadSV =\r\n {\r\n direction: vec3_create(),\r\n headPosition: vec3_create()\r\n };\r\n public lookAtHead(position: Readonly, up?: Readonly): void {\r\n const headPosition = PlayerHeadManager._lookAtHeadSV.headPosition;\r\n const direction = PlayerHeadManager._lookAtHeadSV.direction;\r\n this.getPositionHead(headPosition);\r\n position.vec3_sub(headPosition, direction).vec3_normalize(direction);\r\n\r\n this.lookToHead(direction, up);\r\n }\r\n\r\n private static readonly _lookToHeadSV =\r\n {\r\n headRotation: quat_create()\r\n };\r\n public lookToHead(direction: Readonly, up?: Readonly): void {\r\n const headRotation = PlayerHeadManager._lookToHeadSV.headRotation;\r\n this.getRotationHeadQuat(headRotation);\r\n headRotation.quat_setForward(direction, up);\r\n this.setRotationHeadQuat(headRotation);\r\n }\r\n\r\n public resetCameraNonXR(): void {\r\n Globals.getPlayerObjects(this._myParams.myEngine)!.myCameraNonXR!.pp_resetTransformLocal();\r\n this._setCameraNonXRHeight(this._myHeightNonVR);\r\n }\r\n\r\n public cancelSync(): void {\r\n this._myIsSyncedDelayCounter = 0;\r\n this._myDelaySessionChangeResyncCounter = 0;\r\n this._myDelayBlurEndResyncCounter = 0;\r\n this._myDelayBlurEndResyncTimer.reset();\r\n\r\n this._mySessionChangeResyncHeadTransform = null;\r\n this._myBlurRecoverHeadTransform = null;\r\n }\r\n\r\n public cancelNextEnterSessionSetHeight(): void {\r\n this._myDelayNextEnterSessionSetHeightVRCounter--;\r\n this._myNextEnterSessionSetHeightVRWithFloor = false;\r\n this._myNextEnterSessionSetHeightVRWithoutFloor = false;\r\n }\r\n\r\n public update(dt: number): void {\r\n if (!this._myActive) return;\r\n\r\n this._myViewResetThisFrame = false;\r\n\r\n if (this._myIsSyncedDelayCounter != 0) {\r\n this._myIsSyncedDelayCounter--;\r\n this._myIsSyncedDelayCounter = Math.max(0, this._myIsSyncedDelayCounter);\r\n }\r\n\r\n if (this._myDelaySessionChangeResyncCounter > 0) {\r\n this._myDelaySessionChangeResyncCounter--;\r\n if (this._myDelaySessionChangeResyncCounter == 0) {\r\n this._sessionChangeResync();\r\n this._myIsSyncedDelayCounter = PlayerHeadManager._myIsSyncedDelayCounterFrames;\r\n }\r\n }\r\n\r\n if (this._myDelayBlurEndResyncCounter > 0 && !this._myDelayBlurEndResyncTimer.isRunning()) {\r\n this._myDelayBlurEndResyncCounter--;\r\n if (this._myDelayBlurEndResyncCounter == 0) {\r\n this._blurEndResync();\r\n this._myIsSyncedDelayCounter = PlayerHeadManager._myIsSyncedDelayCounterFrames;\r\n }\r\n }\r\n\r\n // Not really used since visibility hidden end is not considered a special case anymore\r\n if (this._myDelayBlurEndResyncTimer.isRunning()) {\r\n if (this._myDelayBlurEndResyncCounter > 0) {\r\n this._myDelayBlurEndResyncCounter--;\r\n } else {\r\n this._myDelayBlurEndResyncTimer.update(dt);\r\n if (this._myDelayBlurEndResyncTimer.isDone()) {\r\n this._blurEndResync();\r\n this._myIsSyncedDelayCounter = PlayerHeadManager._myIsSyncedDelayCounterFrames;\r\n }\r\n }\r\n }\r\n\r\n if (this._myDelayNextEnterSessionSetHeightVRCounter > 0) {\r\n this._myDelayNextEnterSessionSetHeightVRCounter--;\r\n if (this._myDelayNextEnterSessionSetHeightVRCounter == 0) {\r\n if (this._mySessionActive) {\r\n const isFloor = XRUtils.isReferenceSpaceFloorBased(this._myParams.myEngine);\r\n if (isFloor && this._myNextEnterSessionSetHeightVRWithFloor) {\r\n const currentHeadPosition = this._myCurrentHead.pp_getPosition();\r\n\r\n const floorHeight = this._myHeightVRWithFloor! - this._myParams.myForeheadExtraHeight;\r\n const currentEyeHeight = this._getPositionEyesHeight(currentHeadPosition);\r\n\r\n this._myHeightOffsetWithFloor = this._myHeightOffsetWithFloor + (floorHeight - currentEyeHeight);\r\n\r\n this._updateHeightOffset();\r\n\r\n this._myNextEnterSessionSetHeightVRWithFloor = false;\r\n } else if (!isFloor && this._myNextEnterSessionSetHeightVRWithoutFloor) {\r\n const currentHeadPosition = this._myCurrentHead.pp_getPosition();\r\n\r\n const floorHeight = this._myHeightVRWithoutFloor! - this._myParams.myForeheadExtraHeight;\r\n const currentEyeHeight = this._getPositionEyesHeight(currentHeadPosition);\r\n\r\n this._myHeightOffsetWithoutFloor = this._myHeightOffsetWithoutFloor + (floorHeight - currentEyeHeight);\r\n\r\n this._updateHeightOffset();\r\n\r\n this._myNextEnterSessionSetHeightVRWithoutFloor = false;\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (this.isSynced()) {\r\n this._myCurrentHead.pp_getTransformLocalQuat(this._myCurrentHeadTransformLocalQuat);\r\n }\r\n\r\n if (this._myParams.myDebugEnabled && Globals.isDebugEnabled(this._myParams.myEngine)) {\r\n this._debugUpdate(dt);\r\n }\r\n }\r\n\r\n private _setHeightHead(heightNonVR: number, heightVRWithoutFloor: number | null, heightVRWithFloor: number | null, setOnlyForActiveOne: boolean = true): void {\r\n if (!setOnlyForActiveOne || !this._mySessionActive) {\r\n this._setHeightHeadNonVR(heightNonVR);\r\n }\r\n\r\n if (!setOnlyForActiveOne || this._mySessionActive) {\r\n this._setHeightHeadVRWithoutFloor(heightVRWithoutFloor);\r\n this._setHeightHeadVRWithFloor(heightVRWithFloor);\r\n }\r\n\r\n this._updateHeightOffset();\r\n\r\n if (!this._mySessionActive) {\r\n this._setCameraNonXRHeight(this._myHeightNonVR);\r\n }\r\n }\r\n\r\n private _setHeightHeadNonVR(height: number): void {\r\n this._myHeightNonVR = Math.max(height, this._myParams.myForeheadExtraHeight);\r\n this._myHeightNonVROnEnterSession = this._myHeightNonVR;\r\n }\r\n\r\n private _setHeightHeadVRWithoutFloor(heightWithoutFloor: number | null): void {\r\n if (heightWithoutFloor != null) {\r\n this._myHeightVRWithoutFloor = Math.max(heightWithoutFloor, this._myParams.myForeheadExtraHeight);\r\n this._myNextEnterSessionSetHeightVRWithoutFloor = false;\r\n\r\n if (this._mySessionActive) {\r\n this._myHeightOffsetWithoutFloor = this._myHeightOffsetWithoutFloor + (this._myHeightVRWithoutFloor - this.getHeightHead());\r\n } else {\r\n this._myNextEnterSessionSetHeightVRWithoutFloor = true;\r\n }\r\n } else {\r\n this._myHeightVRWithoutFloor = null;\r\n this._myHeightOffsetWithoutFloor = 0;\r\n }\r\n }\r\n\r\n private _setHeightHeadVRWithFloor(heightWithFloor: number | null): void {\r\n if (heightWithFloor != null) {\r\n this._myHeightVRWithFloor = Math.max(heightWithFloor, this._myParams.myForeheadExtraHeight);\r\n this._myNextEnterSessionSetHeightVRWithFloor = false;\r\n\r\n if (this._mySessionActive) {\r\n this._myHeightOffsetWithFloor = this._myHeightOffsetWithFloor + (this._myHeightVRWithFloor - this.getHeightHead());\r\n } else {\r\n this._myNextEnterSessionSetHeightVRWithFloor = true;\r\n }\r\n } else {\r\n this._myHeightVRWithFloor = null;\r\n this._myHeightOffsetWithFloor = 0;\r\n }\r\n }\r\n\r\n private _shouldNonVRUseVRWithFloor(): boolean {\r\n return (this._myLastReferenceSpaceIsFloorBased == null && this._myParams.myNonVRFloorBasedMode == NonVRReferenceSpaceMode.FLOOR_THEN_KEEP_VR) ||\r\n (this._myLastReferenceSpaceIsFloorBased != null && this._myLastReferenceSpaceIsFloorBased &&\r\n (this._myParams.myNonVRFloorBasedMode == NonVRReferenceSpaceMode.NO_FLOOR_THEN_KEEP_VR || this._myParams.myNonVRFloorBasedMode == NonVRReferenceSpaceMode.FLOOR_THEN_KEEP_VR));\r\n }\r\n\r\n private _shouldNonVRUseVRWithoutFloor(): boolean {\r\n return (this._myLastReferenceSpaceIsFloorBased == null && this._myParams.myNonVRFloorBasedMode == NonVRReferenceSpaceMode.NO_FLOOR_THEN_KEEP_VR) ||\r\n (this._myLastReferenceSpaceIsFloorBased != null && !this._myLastReferenceSpaceIsFloorBased &&\r\n (this._myParams.myNonVRFloorBasedMode == NonVRReferenceSpaceMode.NO_FLOOR_THEN_KEEP_VR || this._myParams.myNonVRFloorBasedMode == NonVRReferenceSpaceMode.FLOOR_THEN_KEEP_VR));\r\n }\r\n\r\n private static readonly _setCameraNonXRHeightSV =\r\n {\r\n cameraNonVRPosition: vec3_create(),\r\n cameraNonVRPositionLocalToPlayer: vec3_create(),\r\n adjustedCameraNonVRPosition: vec3_create(),\r\n playerTranform: mat4_create()\r\n };\r\n private _setCameraNonXRHeight(height: number): void {\r\n const eyeHeight = height - this._myParams.myForeheadExtraHeight;\r\n\r\n const cameraNonVRPosition = PlayerHeadManager._setCameraNonXRHeightSV.cameraNonVRPosition;\r\n const cameraNonVRPositionLocalToPlayer = PlayerHeadManager._setCameraNonXRHeightSV.cameraNonVRPositionLocalToPlayer;\r\n const adjustedCameraNonVRPosition = PlayerHeadManager._setCameraNonXRHeightSV.adjustedCameraNonVRPosition;\r\n const playerTranform = PlayerHeadManager._setCameraNonXRHeightSV.playerTranform;\r\n\r\n Globals.getPlayerObjects(this._myParams.myEngine)!.myCameraNonXR!.pp_getPosition(cameraNonVRPosition);\r\n\r\n cameraNonVRPosition.vec3_convertPositionToLocal(this.getPlayer().pp_getTransform(playerTranform), cameraNonVRPositionLocalToPlayer);\r\n cameraNonVRPositionLocalToPlayer.vec3_set(cameraNonVRPositionLocalToPlayer[0], eyeHeight, cameraNonVRPositionLocalToPlayer[2]);\r\n cameraNonVRPositionLocalToPlayer.vec3_convertPositionToWorld(this.getPlayer().pp_getTransform(playerTranform), adjustedCameraNonVRPosition);\r\n\r\n Globals.getPlayerObjects(this._myParams.myEngine)!.myCameraNonXR!.pp_setPosition(adjustedCameraNonVRPosition);\r\n }\r\n\r\n private static readonly _getPositionEyesHeightSV =\r\n {\r\n playerPosition: vec3_create(),\r\n playerUp: vec3_create(),\r\n heightVector: vec3_create()\r\n };\r\n private _getPositionEyesHeight(position: Readonly): number {\r\n const playerPosition = PlayerHeadManager._getPositionEyesHeightSV.playerPosition;\r\n const playerUp = PlayerHeadManager._getPositionEyesHeightSV.playerUp;\r\n this.getPlayer().pp_getPosition(playerPosition);\r\n this.getPlayer().pp_getUp(playerUp);\r\n\r\n const heightVector = PlayerHeadManager._getPositionEyesHeightSV.heightVector;\r\n position.vec3_sub(playerPosition, heightVector).vec3_componentAlongAxis(playerUp, heightVector);\r\n let height = heightVector.vec3_length();\r\n if (!playerUp.vec3_isConcordant(heightVector)) {\r\n height = -height;\r\n }\r\n\r\n return height;\r\n }\r\n\r\n // #TODO What happens if the player go in the blurred state before the scene has loaded?\r\n private _onXRSessionStart(manualCall: boolean, session: XRSession): void {\r\n const nonVRCurrentEyesHeight = this._getPositionEyesHeight(Globals.getPlayerObjects(this._myParams.myEngine)!.myCameraNonXR!.pp_getPosition());\r\n this._myHeightNonVROnEnterSession = nonVRCurrentEyesHeight + this._myParams.myForeheadExtraHeight;\r\n\r\n this._myBlurRecoverHeadTransform = null;\r\n this._myVisibilityHidden = false;\r\n\r\n this._myDelaySessionChangeResyncCounter = 0;\r\n this._myDelayBlurEndResyncCounter = 0;\r\n this._myDelayBlurEndResyncTimer.reset();\r\n this._myDelayNextEnterSessionSetHeightVRCounter = 0;\r\n\r\n const referenceSpace = XRUtils.getReferenceSpace(this._myParams.myEngine)!;\r\n\r\n if (referenceSpace.addEventListener != null) {\r\n this._myViewResetEventListener = this._onViewReset.bind(this);\r\n referenceSpace.addEventListener(\"reset\", this._myViewResetEventListener);\r\n }\r\n\r\n this._myLastReferenceSpaceIsFloorBased = XRUtils.isReferenceSpaceFloorBased(this._myParams.myEngine);\r\n\r\n this._myVisibilityChangeEventListener = function (this: PlayerHeadManager, event: XRSessionEvent) {\r\n if (event.session.visibilityState != \"visible\") {\r\n if (!this._mySessionBlurred) {\r\n this._onXRSessionBlurStart(event.session);\r\n }\r\n\r\n this._myVisibilityHidden = session.visibilityState == \"hidden\";\r\n } else {\r\n if (this._mySessionBlurred) {\r\n this._onXRSessionBlurEnd(event.session);\r\n }\r\n\r\n this._myVisibilityHidden = false;\r\n }\r\n }.bind(this);\r\n\r\n session.addEventListener(\"visibilitychange\", this._myVisibilityChangeEventListener);\r\n\r\n if (this._myParams.mySessionChangeResyncEnabled && !manualCall && this._myActive) {\r\n if (this._myDelaySessionChangeResyncCounter == 0) {\r\n this._mySessionChangeResyncHeadTransform = this._getHeadTransformFromLocal(this._myCurrentHeadTransformLocalQuat);\r\n }\r\n\r\n this._myDelaySessionChangeResyncCounter = PlayerHeadManager._myResyncCounterFrames;\r\n } else {\r\n this._myDelaySessionChangeResyncCounter = 0;\r\n this._mySessionChangeResyncHeadTransform = null;\r\n }\r\n\r\n if (this._myActive) {\r\n if (this._myNextEnterSessionSetHeightVRWithFloor || this._myNextEnterSessionSetHeightVRWithoutFloor) {\r\n this._myDelayNextEnterSessionSetHeightVRCounter = PlayerHeadManager._myResyncCounterFrames;\r\n }\r\n } else {\r\n this._myNextEnterSessionSetHeightVRWithFloor = false;\r\n this._myNextEnterSessionSetHeightVRWithoutFloor = false;\r\n }\r\n\r\n this._mySessionActive = true;\r\n this._mySessionBlurred = false;\r\n\r\n if (this._myActive) {\r\n this._updateHeightOffset();\r\n }\r\n }\r\n\r\n private _onXRSessionEnd(): void {\r\n if (this._myParams.mySessionChangeResyncEnabled && this._myActive) {\r\n if (this._myDelaySessionChangeResyncCounter == 0) {\r\n let previousHeadTransform = this._getHeadTransformFromLocal(this._myCurrentHeadTransformLocalQuat);\r\n\r\n if (this._myBlurRecoverHeadTransform != null) {\r\n previousHeadTransform = this._myBlurRecoverHeadTransform;\r\n }\r\n\r\n this._mySessionChangeResyncHeadTransform = previousHeadTransform;\r\n }\r\n\r\n this._myDelaySessionChangeResyncCounter = PlayerHeadManager._myResyncCounterFrames;\r\n } else {\r\n this._myDelaySessionChangeResyncCounter = 0;\r\n this._mySessionChangeResyncHeadTransform = null;\r\n }\r\n\r\n this._myDelayNextEnterSessionSetHeightVRCounter = 0;\r\n\r\n this._myVisibilityChangeEventListener = null;\r\n this._myViewResetEventListener = null;\r\n\r\n this._myBlurRecoverHeadTransform = null;\r\n this._myVisibilityHidden = false;\r\n\r\n this._myDelayBlurEndResyncCounter = 0;\r\n this._myDelayBlurEndResyncTimer.reset();\r\n\r\n this._mySessionActive = false;\r\n this._mySessionBlurred = false;\r\n\r\n if (this._myActive) {\r\n this._updateHeightOffset();\r\n\r\n if (this._myParams.myExitSessionResetNonVRTransformLocal) {\r\n this.resetCameraNonXR();\r\n } else {\r\n this._setCameraNonXRHeight(this._myHeightNonVROnEnterSession);\r\n }\r\n }\r\n }\r\n\r\n private _onXRSessionBlurStart(session: XRSession): void {\r\n if (this._myActive) {\r\n if (this._myParams.myBlurEndResyncEnabled && this._myBlurRecoverHeadTransform == null && this._mySessionActive) {\r\n if (this._myDelaySessionChangeResyncCounter > 0) {\r\n this._myBlurRecoverHeadTransform = this._mySessionChangeResyncHeadTransform;\r\n } else {\r\n this._myBlurRecoverHeadTransform = this._getHeadTransformFromLocal(this._myCurrentHeadTransformLocalQuat);\r\n }\r\n } else if (!this._mySessionActive || !this._myParams.myBlurEndResyncEnabled) {\r\n this._myBlurRecoverHeadTransform = null;\r\n }\r\n }\r\n\r\n this._myDelayBlurEndResyncCounter = 0;\r\n\r\n this._mySessionBlurred = true;\r\n }\r\n\r\n private _onXRSessionBlurEnd(session: XRSession): void {\r\n if (this._myActive) {\r\n if (this._myDelaySessionChangeResyncCounter == 0) {\r\n if (this._myParams.myBlurEndResyncEnabled && this._myBlurRecoverHeadTransform != null && this._mySessionActive) {\r\n this._myDelayBlurEndResyncCounter = PlayerHeadManager._myResyncCounterFrames;\r\n if (this._myVisibilityHidden) {\r\n //this._myDelayBlurEndResyncTimer.start();\r\n\r\n // This was added because on the end of hidden u can have the resync delay cause of the guardian resync\r\n // but I just decided to skip this since it's not reliable and the guardian resync can happen in other cases\r\n // with no notification anyway\r\n }\r\n } else {\r\n this._myBlurRecoverHeadTransform = null;\r\n this._myDelayBlurEndResyncCounter = 0;\r\n }\r\n } else {\r\n this._myDelaySessionChangeResyncCounter = PlayerHeadManager._myResyncCounterFrames;\r\n this._myBlurRecoverHeadTransform = null;\r\n }\r\n }\r\n\r\n this._mySessionBlurred = false;\r\n }\r\n\r\n private static readonly _onViewResetSV =\r\n {\r\n identityTransformQuat: Quat2Utils.identity(quat2_create()),\r\n prevHeadPosition: vec3_create(),\r\n resetHeadPosition: vec3_create()\r\n };\r\n private _onViewReset(): void {\r\n if (this._myActive) {\r\n if (!this._myViewResetThisFrame && this._myParams.myResetTransformOnViewResetEnabled && this._mySessionActive && this.isSynced()) {\r\n this._myViewResetThisFrame = true;\r\n const previousHeadTransformQuat = this._getHeadTransformFromLocal(this._myCurrentHeadTransformLocalQuat);\r\n this.teleportPlayerToHeadTransformQuat(previousHeadTransformQuat);\r\n\r\n const isFloor = XRUtils.isReferenceSpaceFloorBased(this._myParams.myEngine);\r\n if (!isFloor) {\r\n const identityTransformQuat = PlayerHeadManager._onViewResetSV.identityTransformQuat;\r\n const resetHeadTransformQuat = this._getHeadTransformFromLocal(identityTransformQuat);\r\n\r\n const prevHeadPosition = PlayerHeadManager._onViewResetSV.prevHeadPosition;\r\n const resetHeadPosition = PlayerHeadManager._onViewResetSV.resetHeadPosition;\r\n const prevHeadHeight = this._getPositionEyesHeight(previousHeadTransformQuat.quat2_getPosition(prevHeadPosition));\r\n const currentHeadHeight = this._getPositionEyesHeight(resetHeadTransformQuat.quat2_getPosition(resetHeadPosition));\r\n\r\n this._myHeightOffsetWithoutFloor = this._myHeightOffsetWithoutFloor + (prevHeadHeight - currentHeadHeight);\r\n this._updateHeightOffset();\r\n }\r\n }\r\n }\r\n }\r\n\r\n private static readonly _blurEndResyncSV =\r\n {\r\n playerUp: vec3_create(),\r\n currentHeadPosition: vec3_create(),\r\n recoverHeadPosition: vec3_create(),\r\n flatCurrentHeadPosition: vec3_create(),\r\n flatRecoverHeadPosition: vec3_create(),\r\n recoverMovement: vec3_create(),\r\n recoverHeadForward: vec3_create(),\r\n currentHeadForward: vec3_create(),\r\n rotationToPerform: quat_create()\r\n };\r\n private _blurEndResync(): void {\r\n if (this._myBlurRecoverHeadTransform != null) {\r\n if (this._mySessionChangeResyncHeadTransform != null) {\r\n this._myBlurRecoverHeadTransform = null;\r\n this._sessionChangeResync();\r\n } else {\r\n const playerUp = PlayerHeadManager._blurEndResyncSV.playerUp;\r\n this.getPlayer().pp_getUp(playerUp);\r\n\r\n const currentHeadPosition = PlayerHeadManager._blurEndResyncSV.currentHeadPosition;\r\n const recoverHeadPosition = PlayerHeadManager._blurEndResyncSV.recoverHeadPosition;\r\n this._myCurrentHead.pp_getPosition(currentHeadPosition);\r\n this._myBlurRecoverHeadTransform.quat2_getPosition(recoverHeadPosition);\r\n\r\n const flatCurrentHeadPosition = PlayerHeadManager._blurEndResyncSV.flatCurrentHeadPosition;\r\n const flatRecoverHeadPosition = PlayerHeadManager._blurEndResyncSV.flatRecoverHeadPosition;\r\n currentHeadPosition.vec3_removeComponentAlongAxis(playerUp, flatCurrentHeadPosition);\r\n recoverHeadPosition.vec3_removeComponentAlongAxis(playerUp, flatRecoverHeadPosition);\r\n\r\n const recoverMovement = PlayerHeadManager._blurEndResyncSV.recoverMovement;\r\n flatRecoverHeadPosition.vec3_sub(flatCurrentHeadPosition, recoverMovement);\r\n this.moveFeet(recoverMovement);\r\n\r\n const recoverHeadForward = PlayerHeadManager._blurEndResyncSV.recoverHeadForward;\r\n const currentHeadForward = PlayerHeadManager._blurEndResyncSV.currentHeadForward;\r\n const rotationToPerform = PlayerHeadManager._blurEndResyncSV.rotationToPerform;\r\n this._myBlurRecoverHeadTransform.quat2_getForward(recoverHeadForward);\r\n this._myCurrentHead.pp_getForward(currentHeadForward);\r\n currentHeadForward.vec3_rotationToPivotedQuat(recoverHeadForward, playerUp, rotationToPerform);\r\n\r\n if (this._myParams.myBlurEndResyncRotation) {\r\n this.rotateFeetQuat(rotationToPerform);\r\n }\r\n\r\n this._myBlurRecoverHeadTransform = null;\r\n }\r\n }\r\n }\r\n\r\n private static readonly _sessionChangeResyncSV =\r\n {\r\n currentHeadPosition: vec3_create(),\r\n resyncHeadPosition: vec3_create(),\r\n resyncHeadRotation: quat_create(),\r\n playerUp: vec3_create(),\r\n flatCurrentHeadPosition: vec3_create(),\r\n flatResyncHeadPosition: vec3_create(),\r\n resyncMovement: vec3_create(),\r\n resyncHeadForward: vec3_create(),\r\n resyncHeadUp: vec3_create(),\r\n resyncHeadRight: vec3_create(),\r\n playerPosition: vec3_create(),\r\n newPlayerPosition: vec3_create(),\r\n fixedHeadRight: vec3_create(),\r\n fixedHeadLeft: vec3_create(),\r\n fixedHeadUp: vec3_create(),\r\n fixedHeadForward: vec3_create(),\r\n fixedHeadRotation: quat_create()\r\n };\r\n private _sessionChangeResync(): void {\r\n if (this._myBlurRecoverHeadTransform == null && this._mySessionChangeResyncHeadTransform != null) {\r\n if (this._mySessionActive) {\r\n const currentHeadPosition = PlayerHeadManager._sessionChangeResyncSV.currentHeadPosition;\r\n const resyncHeadPosition = PlayerHeadManager._sessionChangeResyncSV.resyncHeadPosition;\r\n const resyncHeadRotation = PlayerHeadManager._sessionChangeResyncSV.resyncHeadRotation;\r\n this._myCurrentHead.pp_getPosition(currentHeadPosition);\r\n this._mySessionChangeResyncHeadTransform.quat2_getPosition(resyncHeadPosition);\r\n this._mySessionChangeResyncHeadTransform.quat2_getRotationQuat(resyncHeadRotation);\r\n\r\n const playerUp = PlayerHeadManager._sessionChangeResyncSV.playerUp;\r\n this.getPlayer().pp_getUp(playerUp);\r\n\r\n const flatCurrentHeadPosition = PlayerHeadManager._sessionChangeResyncSV.flatCurrentHeadPosition;\r\n const flatResyncHeadPosition = PlayerHeadManager._sessionChangeResyncSV.flatResyncHeadPosition;\r\n currentHeadPosition.vec3_removeComponentAlongAxis(playerUp, flatCurrentHeadPosition);\r\n resyncHeadPosition.vec3_removeComponentAlongAxis(playerUp, flatResyncHeadPosition);\r\n\r\n const resyncMovement = PlayerHeadManager._sessionChangeResyncSV.resyncMovement;\r\n flatResyncHeadPosition.vec3_sub(flatCurrentHeadPosition, resyncMovement);\r\n this.moveFeet(resyncMovement);\r\n\r\n if (this._myParams.myEnterSessionResyncHeight || this._myParams.myNextEnterSessionResyncHeight) {\r\n this._myParams.myNextEnterSessionResyncHeight = false;\r\n const resyncHeadHeight = this._getPositionEyesHeight(resyncHeadPosition);\r\n const currentHeadHeight = this._getPositionEyesHeight(currentHeadPosition);\r\n\r\n this._myHeightVRWithoutFloor = resyncHeadHeight + this._myParams.myForeheadExtraHeight;\r\n this._myHeightVRWithFloor = resyncHeadHeight + this._myParams.myForeheadExtraHeight;\r\n this._myHeightOffsetWithFloor = this._myHeightOffsetWithFloor + (resyncHeadHeight - currentHeadHeight);\r\n this._myHeightOffsetWithoutFloor = this._myHeightOffsetWithoutFloor + (resyncHeadHeight - currentHeadHeight);\r\n\r\n this._updateHeightOffset();\r\n\r\n this._myNextEnterSessionSetHeightVRWithFloor = false;\r\n this._myNextEnterSessionSetHeightVRWithoutFloor = false;\r\n }\r\n\r\n this._resyncHeadRotationForward(resyncHeadRotation);\r\n } else {\r\n const playerUp = PlayerHeadManager._sessionChangeResyncSV.playerUp;\r\n this.getPlayer().pp_getUp(playerUp);\r\n\r\n const resyncHeadPosition = PlayerHeadManager._sessionChangeResyncSV.resyncHeadPosition;\r\n const flatResyncHeadPosition = PlayerHeadManager._sessionChangeResyncSV.flatResyncHeadPosition;\r\n this._mySessionChangeResyncHeadTransform.quat2_getPosition(resyncHeadPosition);\r\n resyncHeadPosition.vec3_removeComponentAlongAxis(playerUp, flatResyncHeadPosition);\r\n\r\n const playerPosition = PlayerHeadManager._sessionChangeResyncSV.playerPosition;\r\n const newPlayerPosition = PlayerHeadManager._sessionChangeResyncSV.newPlayerPosition;\r\n this.getPlayer().pp_getPosition(playerPosition);\r\n flatResyncHeadPosition.vec3_add(playerPosition.vec3_componentAlongAxis(playerUp, newPlayerPosition), newPlayerPosition);\r\n\r\n this.getPlayer().pp_setPosition(newPlayerPosition);\r\n Globals.getPlayerObjects(this._myParams.myEngine)!.myCameraNonXR!.pp_resetPositionLocal();\r\n\r\n if (this._myParams.myExitSessionResyncHeight) {\r\n const resyncHeadHeight = this._getPositionEyesHeight(resyncHeadPosition);\r\n this._myHeightNonVR = resyncHeadHeight + this._myParams.myForeheadExtraHeight;\r\n }\r\n\r\n this._updateHeightOffset();\r\n\r\n if (this._myParams.myExitSessionResyncHeight || this._myParams.myExitSessionResetNonVRTransformLocal) {\r\n this._setCameraNonXRHeight(this._myHeightNonVR);\r\n } else {\r\n this._setCameraNonXRHeight(this._myHeightNonVROnEnterSession);\r\n }\r\n\r\n const resyncHeadRotation = PlayerHeadManager._sessionChangeResyncSV.resyncHeadRotation;\r\n this._mySessionChangeResyncHeadTransform.quat2_getRotationQuat(resyncHeadRotation);\r\n\r\n if (this._myParams.myExitSessionRemoveRightTilt ||\r\n this._myParams.myExitSessionAdjustMaxVerticalAngle || !this._myParams.myExitSessionResyncVerticalAngle) {\r\n const resyncHeadForward = PlayerHeadManager._sessionChangeResyncSV.resyncHeadForward;\r\n const resyncHeadUp = PlayerHeadManager._sessionChangeResyncSV.resyncHeadUp;\r\n resyncHeadRotation.quat_getForward(resyncHeadForward);\r\n resyncHeadRotation.quat_getUp(resyncHeadUp);\r\n\r\n const fixedHeadRight = PlayerHeadManager._sessionChangeResyncSV.fixedHeadRight;\r\n resyncHeadForward.vec3_cross(playerUp, fixedHeadRight);\r\n fixedHeadRight.vec3_normalize(fixedHeadRight);\r\n\r\n if (!resyncHeadUp.vec3_isConcordant(playerUp)) {\r\n const angleForwardUp = resyncHeadForward.vec3_angle(playerUp);\r\n const negateAngle = 45;\r\n if (angleForwardUp > (180 - negateAngle) || angleForwardUp < negateAngle) {\r\n // This way I get a good fixed result for both head upside down and head rotated on forward\r\n // When the head is looking down and a bit backward (more than 135 degrees), I want the forward to actually\r\n // be the opposite because it's like u rotate back the head up and look forward again\r\n fixedHeadRight.vec3_negate(fixedHeadRight);\r\n }\r\n }\r\n\r\n if (fixedHeadRight.vec3_isZero(0.000001)) {\r\n resyncHeadRotation.quat_getRight(fixedHeadRight);\r\n }\r\n\r\n const fixedHeadUp = PlayerHeadManager._sessionChangeResyncSV.fixedHeadUp;\r\n const fixedHeadForward = PlayerHeadManager._sessionChangeResyncSV.fixedHeadForward;\r\n fixedHeadRight.vec3_cross(resyncHeadForward, fixedHeadUp);\r\n fixedHeadUp.vec3_normalize(fixedHeadUp);\r\n fixedHeadUp.vec3_cross(fixedHeadRight, fixedHeadForward);\r\n fixedHeadForward.vec3_normalize(fixedHeadForward);\r\n\r\n const fixedHeadRotation = PlayerHeadManager._sessionChangeResyncSV.fixedHeadRotation;\r\n const fixedHeadLeft = PlayerHeadManager._sessionChangeResyncSV.fixedHeadLeft;\r\n fixedHeadRotation.quat_fromAxes(fixedHeadRight.vec3_negate(fixedHeadLeft), fixedHeadUp, fixedHeadForward);\r\n resyncHeadRotation.quat_copy(fixedHeadRotation);\r\n }\r\n\r\n if (this._myParams.myExitSessionAdjustMaxVerticalAngle || !this._myParams.myExitSessionResyncVerticalAngle) {\r\n const resyncHeadUp = PlayerHeadManager._sessionChangeResyncSV.resyncHeadUp;\r\n const resyncHeadRight = PlayerHeadManager._sessionChangeResyncSV.resyncHeadRight;\r\n resyncHeadRotation.quat_getUp(resyncHeadUp);\r\n resyncHeadRotation.quat_getRight(resyncHeadRight);\r\n\r\n let maxVerticalAngle = Math.max(0, this._myParams.myExitSessionMaxVerticalAngle - 0.0001);\r\n if (!this._myParams.myExitSessionResyncVerticalAngle) {\r\n maxVerticalAngle = 0;\r\n }\r\n\r\n const angleWithUp = Math.pp_angleClamp(resyncHeadUp.vec3_angleSigned(playerUp, resyncHeadRight));\r\n if (Math.abs(angleWithUp) > maxVerticalAngle) {\r\n const fixAngle = (Math.abs(angleWithUp) - maxVerticalAngle) * Math.pp_sign(angleWithUp);\r\n resyncHeadRotation.quat_rotateAxis(fixAngle, resyncHeadRight, resyncHeadRotation);\r\n }\r\n }\r\n\r\n this.setRotationHeadQuat(resyncHeadRotation);\r\n }\r\n\r\n this._mySessionChangeResyncHeadTransform = null;\r\n }\r\n }\r\n\r\n private static readonly _setReferenceSpaceHeightOffsetSV =\r\n {\r\n referenceSpacePosition: vec3_create(),\r\n referenceSpacePositionLocalToPlayer: vec3_create(),\r\n adjustedReferenceSpacePosition: vec3_create(),\r\n playerTransform: mat4_create()\r\n };\r\n private _setReferenceSpaceHeightOffset(offset: number, amountToRemove: number): void {\r\n if (offset != null) {\r\n const referenceSpacePosition = PlayerHeadManager._setReferenceSpaceHeightOffsetSV.referenceSpacePosition;\r\n const referenceSpacePositionLocalToPlayer = PlayerHeadManager._setReferenceSpaceHeightOffsetSV.referenceSpacePositionLocalToPlayer;\r\n const playerTransform = PlayerHeadManager._setReferenceSpaceHeightOffsetSV.playerTransform;\r\n Globals.getPlayerObjects(this._myParams.myEngine)!.myReferenceSpace!.pp_getPosition(referenceSpacePosition);\r\n referenceSpacePosition.vec3_convertPositionToLocal(this.getPlayer().pp_getTransform(playerTransform), referenceSpacePositionLocalToPlayer);\r\n referenceSpacePositionLocalToPlayer.vec3_set(referenceSpacePositionLocalToPlayer[0], offset - amountToRemove, referenceSpacePositionLocalToPlayer[2]);\r\n\r\n const adjustedReferenceSpacePosition = PlayerHeadManager._setReferenceSpaceHeightOffsetSV.adjustedReferenceSpacePosition;\r\n referenceSpacePositionLocalToPlayer.vec3_convertPositionToWorld(this.getPlayer().pp_getTransform(playerTransform), adjustedReferenceSpacePosition);\r\n Globals.getPlayerObjects(this._myParams.myEngine)!.myReferenceSpace!.pp_setPosition(adjustedReferenceSpacePosition);\r\n }\r\n }\r\n\r\n private _updateHeightOffset(): void {\r\n if (this._mySessionActive) {\r\n if (XRUtils.isReferenceSpaceFloorBased(this._myParams.myEngine)) {\r\n this._setReferenceSpaceHeightOffset(this._myHeightOffsetWithFloor, 0);\r\n } else {\r\n this._setReferenceSpaceHeightOffset(this._myHeightOffsetWithoutFloor, 0);\r\n }\r\n } else {\r\n if (this._shouldNonVRUseVRWithFloor()) {\r\n this._setReferenceSpaceHeightOffset(this._myHeightOffsetWithFloor, 0);\r\n } else if (this._shouldNonVRUseVRWithoutFloor()) {\r\n this._setReferenceSpaceHeightOffset(this._myHeightOffsetWithoutFloor, 0);\r\n } else if (this._myParams.myNonVRFloorBasedMode == NonVRReferenceSpaceMode.FLOOR) {\r\n this._setReferenceSpaceHeightOffset(0, 0);\r\n } else {\r\n this._setReferenceSpaceHeightOffset(this._myHeightNonVR, this._myParams.myForeheadExtraHeight);\r\n }\r\n }\r\n }\r\n\r\n private _getHeadTransformFromLocal(transformLocal: Readonly): Quaternion2 {\r\n return this._myCurrentHead.pp_convertTransformLocalToWorldQuat(transformLocal);\r\n }\r\n\r\n private static readonly _resyncHeadRotationForwardSV =\r\n {\r\n playerUp: vec3_create(),\r\n resyncHeadForward: vec3_create(),\r\n resyncHeadUp: vec3_create(),\r\n fixedResyncHeadRotation: quat_create()\r\n };\r\n private _resyncHeadRotationForward(resyncHeadRotation: Readonly): void {\r\n const playerUp = PlayerHeadManager._resyncHeadRotationForwardSV.playerUp;\r\n const resyncHeadForward = PlayerHeadManager._resyncHeadRotationForwardSV.resyncHeadForward;\r\n const resyncHeadUp = PlayerHeadManager._resyncHeadRotationForwardSV.resyncHeadUp;\r\n this.getPlayer().pp_getUp(playerUp);\r\n resyncHeadRotation.quat_getForward(resyncHeadForward);\r\n resyncHeadRotation.quat_getUp(resyncHeadUp);\r\n\r\n const fixedResyncHeadRotation = PlayerHeadManager._resyncHeadRotationForwardSV.fixedResyncHeadRotation;\r\n fixedResyncHeadRotation.quat_copy(resyncHeadRotation);\r\n fixedResyncHeadRotation.quat_setUp(playerUp, resyncHeadForward);\r\n\r\n if (!resyncHeadUp.vec3_isConcordant(playerUp)) {\r\n // If it was upside down, it's like it has to rotate the neck back up,so the forward is actually on the opposite side\r\n fixedResyncHeadRotation.quat_rotateAxis(180, playerUp, fixedResyncHeadRotation);\r\n }\r\n\r\n this.setRotationFeetQuat(fixedResyncHeadRotation);\r\n }\r\n\r\n private _debugUpdate(dt: number): void {\r\n Globals.getDebugVisualManager(this._myParams.myEngine)!.drawLineEnd(0, this.getPositionFeet(), this.getPositionHead(), vec4_create(1, 0, 0, 1), 0.01);\r\n\r\n console.error(this.getHeightEyes());\r\n }\r\n\r\n public destroy(): void {\r\n this._myDestroyed = true;\r\n\r\n this.setActive(false);\r\n }\r\n\r\n public isDestroyed(): boolean {\r\n return this._myDestroyed;\r\n }\r\n}", "import { Object3D, WonderlandEngine } from \"@wonderlandengine/api\";\r\nimport { PhysicsLayerFlags } from \"../../../../../cauldron/physics/physics_layer_flags.js\";\r\nimport { RaycastBlockColliderType } from \"../../../../../cauldron/physics/physics_raycast_params.js\";\r\nimport { Quaternion, Quaternion2, Vector3 } from \"../../../../../cauldron/type_definitions/array_type_definitions.js\";\r\nimport { XRUtils } from \"../../../../../cauldron/utils/xr_utils.js\";\r\nimport { quat2_create, quat_create, vec3_create, vec4_create } from \"../../../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Globals } from \"../../../../../pp/globals.js\";\r\nimport { CollisionCheckBridge } from \"../../../character_controller/collision/collision_check_bridge.js\";\r\nimport { CollisionCheckUtils } from \"../../../character_controller/collision/legacy/collision_check/collision_check_utils.js\";\r\nimport { CollisionCheckParams, CollisionRuntimeParams } from \"../../../character_controller/collision/legacy/collision_check/collision_params.js\";\r\nimport { PlayerHeadManager } from \"./player_head_manager.js\";\r\nimport { PlayerLocomotionTeleport } from \"./teleport/player_locomotion_teleport.js\";\r\n\r\nexport enum PlayerTransformManagerSyncFlag {\r\n BODY_COLLIDING = 0,\r\n HEAD_COLLIDING = 1,\r\n FAR = 2,\r\n FLOATING = 3,\r\n HEIGHT_COLLIDING = 4\r\n}\r\n\r\nexport class PlayerTransformManagerParams {\r\n\r\n public myPlayerHeadManager!: PlayerHeadManager;\r\n\r\n public myMovementCollisionCheckParams!: CollisionCheckParams;\r\n\r\n /** Can be left `null` and will be generated from the `myMovementCollisionCheckParams` */\r\n public myTeleportCollisionCheckParams: CollisionCheckParams | null = null;\r\n public myTeleportCollisionCheckParamsCopyFromMovement: boolean = false;\r\n public myTeleportCollisionCheckParamsCheck360: boolean = false;\r\n public myTeleportCollisionCheckParamsGroundAngleToIgnore: number | null = null;\r\n\r\n\r\n\r\n /** \r\n * This make it so if the valid position after syncing with real has some snapping, the real position too will also adjust to it \r\n * For example, with this off, if you move in real life over ramps the real life height will not change to avoid motion sickness,\r\n * but if you prefer to also go up and down, you need to enable this\r\n */\r\n public myApplyRealToValidAdjustmentsToRealPositionToo: boolean = false;\r\n\r\n /**\r\n * Does not prevent (for now at least) from colliding if you stand up and your head goes inside the ceiling, in that case the height\r\n * is not adjusted to prevent that and the view will be occluded\r\n */\r\n public myPreventRealFromColliding: boolean = false;\r\n\r\n public myAlwaysSyncPositionWithReal: boolean = false;\r\n public myAlwaysSyncHeadPositionWithReal: boolean = false;\r\n\r\n public myIgnoreUpwardMovementToRealIfValidOnGround: boolean = false;\r\n\r\n /**\r\n * If the real position is far, body will be considered colliding \r\n * If the body is colliding, the floating check is skipped\r\n */\r\n public readonly mySyncEnabledFlagMap: Map = new Map();\r\n public readonly mySyncPositionFlagMap: Map = new Map();\r\n public readonly mySyncPositionHeadFlagMap: Map = new Map();\r\n public readonly mySyncRotationFlagMap: Map = new Map();\r\n public readonly mySyncHeightFlagMap: Map = new Map();\r\n\r\n\r\n\r\n /** Used to make the character fall if it's leaning too much */\r\n public myIsLeaningValidAboveDistance: boolean = false;\r\n public myLeaningValidDistance: number = 0;\r\n\r\n /** Settings for both hop and lean */\r\n\r\n /**\r\n * With {@link myRealMovementAllowVerticalAdjustments} enabled these \"ValidIfVerticalMovement\" flags does not work properly,\r\n * since the adjustments can add vertical movement just due to snaps\r\n */\r\n public myIsFloatingValidIfVerticalMovement: boolean = false;\r\n public myIsFloatingValidIfVerticalMovementAndRealOnGround: boolean = false; // #TODO This is more an override\r\n public myIsFloatingValidIfRealOnGround: boolean = false;\r\n public myIsFloatingValidIfSteepGround: boolean = false;\r\n public myIsFloatingValidIfVerticalMovementAndSteepGround: boolean = false;\r\n\r\n public myFloatingSplitCheckEnabled: boolean = false;\r\n public myFloatingSplitCheckMinLength: number | null = null;\r\n public myFloatingSplitCheckMaxLength: number | null = null;\r\n public myFloatingSplitCheckStepEqualLength: boolean = false;\r\n public myFloatingSplitCheckStepEqualLengthMinLength: number = 0;\r\n\r\n\r\n /**\r\n * Can be useful if using the exact height is giving you issues like too close too ceilings, or view occluded too easily\r\n */\r\n public myExtraHeight: number = 0;\r\n\r\n public myMaxDistanceFromRealToSyncEnabled: boolean = false;\r\n\r\n /**\r\n * Max distance to resync valid with real \r\n * If your real position is farther the body will be considered as colliding\r\n */\r\n public myMaxDistanceFromRealToSync: number = 0;\r\n\r\n public myMaxDistanceFromHeadRealToSyncEnabled: boolean = false;\r\n\r\n /**\r\n * Max distance to resync valid head with real head \r\n * If you real head is farther the head will be considered as colliding\r\n * Vertically, the max distance can be higher if the current height is higher\r\n * Since the head might have been reset to feet\r\n */\r\n public myMaxDistanceFromHeadRealToSync: number = 0;\r\n\r\n /**\r\n * If this is enabled, the head will do this max amount of steps to reach the real head, but every step might be longer\r\n * than the safe max step \r\n * This means that the movement to reach the real head might not be as precise and can allow clipping through objects,\r\n * but it will be more performant\r\n * \r\n * Even though the max distance from the head can be already used to limit the amount of steps, when the head is reset\r\n * to feet, it's allowed to perform the whole height movement, even if above the max distance \r\n * If this adjustment movement is too heavy, this can limit it, even though might cause the valid head to move to invalid places\r\n */\r\n public myMaxHeadToRealHeadSteps: number | null = null;\r\n\r\n\r\n\r\n public myHeadRadius: number = 0;\r\n public myHeadHeight: number = 0;\r\n public readonly myHeadCollisionBlockLayerFlags: PhysicsLayerFlags = new PhysicsLayerFlags();\r\n public myHeadCollisionObjectsToIgnore: Readonly[] = [];\r\n public myHeadCollisionBlockColliderType: RaycastBlockColliderType = RaycastBlockColliderType.BOTH;\r\n\r\n /**\r\n * Can be used if when resetting to feet there might be dynamic objects which you would like to exclude for this reset check, \r\n * but you might still to normally avoid, for example for object you can grab and therefore put close to the head, which are not a big deal \r\n * and you can accept being able to see inside them when resetting the head, but not for normal movements\r\n */\r\n public myHeadCollisionBlockLayerFlagsForResetToFeet: PhysicsLayerFlags | null = null;\r\n\r\n\r\n\r\n public myRotateOnlyIfSynced: boolean = false;\r\n public myResetRealResetRotationIfUpChanged: boolean = true;\r\n\r\n\r\n\r\n /**\r\n * This make it so the head must be able to reach from the feet to the real head, sort of \r\n * like you were teleported in a space squashed to your feet and then have to get up \r\n * It can be used to prevent being able to see through the floor, since when the head is reset to the real one \r\n * if the real one is on the other side of the above floor there would be no collision \r\n * The risk is that, if you have objects close to your feet, your head could get stuck on them while trying to \"get up\" \r\n * and the view could be obscured thinking you have those objects in your view\r\n */\r\n public myResetHeadToFeetInsteadOfReal: boolean = false;\r\n\r\n /** This other flag is to fix the above issue, doing the \"squash and get up\" only if the head is not reachable normally \r\n The above issue can still happen but should be more rare, only if you teleport to a place where there could be garbage stuff */\r\n public myResetHeadToFeetInsteadOfRealOnlyIfRealNotReachable: boolean = false;\r\n\r\n public myResetHeadToFeetMoveTowardReal: boolean = true;\r\n\r\n /* Can be used to specify that the head should reset a bit above the actual feet level, so to avoid small objects that could very frequently \r\n happen to be close to the floor */\r\n public myResetHeadToFeetUpOffset: number = 0.25;\r\n\r\n public myResetHeadToFeetGroudnAngleIgnoreEnabled: boolean = false;\r\n\r\n public myResetHeadToRealMinDistance: number = 0;\r\n\r\n\r\n\r\n\r\n // #TODO Set valid if head synced (head manager) (not sure what I meant with this?)\r\n\r\n /** This true means that the real movement should also snap on ground or fix the vertical to pop from it \r\n You may want this if u want that while real moving u can also climb stairs */\r\n public myRealMovementAllowVerticalAdjustments: boolean = false;\r\n\r\n // #TODO Real movement apply vertical snap or not (other option to apply gravity) \r\n // (gravity inside this class?) only when movement is applied not for head only)\r\n\r\n public myUpdatePositionValid: boolean = false;\r\n public myUpdatePositionHeadValid: boolean = true;\r\n public myUpdateRealPositionValid: boolean = false;\r\n public myUpdateRealPositionHeadValid: boolean = false;\r\n\r\n public myMinHeight: number | null = null;\r\n public myMaxHeight: number | null = null;\r\n\r\n\r\n\r\n /** \r\n * These and the callbacks does not makes much sense \r\n * The colliding things are made to not sync the real position, but if the height is below and the body is not colliding \r\n * There is not reason not to resync, even if u put the real back on the valid the height will stay the same \r\n * If someone puts the head in the ground, there is no way for me to resync and make the head pop out sadly \r\n * In this case u either accept that u can move without seeing, or stop moving until the obscure is on\r\n */\r\n\r\n /** Could be ignored and added with the custom check callback if u want it */\r\n public myIsBodyCollidingWhenHeightBelowValue: number | null = null;\r\n\r\n /** Could be ignored and added with the custom check callback if u want it */\r\n public myIsBodyCollidingWhenHeightAboveValue: number | null = null;\r\n\r\n\r\n public myIsBodyCollidingExtraCheckCallback: ((playerTransformManager: PlayerTransformManager) => boolean) | null = null;\r\n public myIsLeaningExtraCheckCallback: ((playerTransformManager: PlayerTransformManager) => boolean) | null = null;\r\n public myIsHoppingExtraCheckCallback: ((playerTransformManager: PlayerTransformManager) => boolean) | null = null;\r\n public myIsFarExtraCheckCallback: ((playerTransformManager: PlayerTransformManager) => boolean) | null = null;\r\n\r\n\r\n\r\n public myAllowUpdateValidToRealWhenBlurred: boolean = false;\r\n\r\n public myResetToValidOnEnterSession: boolean = false;\r\n public myResetToValidOnExitSession: boolean = false;\r\n public myResetToValidOnSessionHiddenEnd: boolean = false;\r\n\r\n public myAlwaysResetRealPositionNonVR: boolean = false;\r\n public myAlwaysResetRealRotationNonVR: boolean = false;\r\n public myAlwaysResetRealHeightNonVR: boolean = false;\r\n\r\n public myAlwaysResetRealPositionVR: boolean = false;\r\n public myAlwaysResetRealRotationVR: boolean = false;\r\n public myAlwaysResetRealHeightVR: boolean = false;\r\n\r\n public myNeverResetRealPositionNonVR: boolean = false;\r\n public myNeverResetRealRotationNonVR: boolean = false;\r\n public myNeverResetRealHeightNonVR: boolean = false;\r\n\r\n public myResetRealHeightNonVROnExitSession: boolean = false;\r\n\r\n public myNeverResetRealPositionVR: boolean = false;\r\n public myNeverResetRealRotationVR: boolean = false;\r\n public myNeverResetRealHeightVR: boolean = false;\r\n\r\n public myResetRealOnMove: boolean = false;\r\n public myResetRealOnTeleport: boolean = false;\r\n\r\n public mySyncPositionDisabled: boolean = false;\r\n\r\n public myDebugEnabled: boolean = false;\r\n\r\n public readonly myEngine: Readonly;\r\n\r\n constructor(engine: Readonly = Globals.getMainEngine()!) {\r\n this.myEngine = engine;\r\n\r\n this.mySyncEnabledFlagMap.set(PlayerTransformManagerSyncFlag.BODY_COLLIDING, true);\r\n this.mySyncEnabledFlagMap.set(PlayerTransformManagerSyncFlag.HEAD_COLLIDING, true);\r\n this.mySyncEnabledFlagMap.set(PlayerTransformManagerSyncFlag.FAR, true);\r\n this.mySyncEnabledFlagMap.set(PlayerTransformManagerSyncFlag.FLOATING, true);\r\n this.mySyncEnabledFlagMap.set(PlayerTransformManagerSyncFlag.HEIGHT_COLLIDING, true);\r\n\r\n this.mySyncPositionFlagMap.set(PlayerTransformManagerSyncFlag.BODY_COLLIDING, true);\r\n this.mySyncPositionFlagMap.set(PlayerTransformManagerSyncFlag.HEAD_COLLIDING, false);\r\n this.mySyncPositionFlagMap.set(PlayerTransformManagerSyncFlag.FAR, true);\r\n this.mySyncPositionFlagMap.set(PlayerTransformManagerSyncFlag.FLOATING, true);\r\n this.mySyncPositionFlagMap.set(PlayerTransformManagerSyncFlag.HEIGHT_COLLIDING, false);\r\n\r\n this.mySyncPositionHeadFlagMap.set(PlayerTransformManagerSyncFlag.BODY_COLLIDING, false);\r\n this.mySyncPositionHeadFlagMap.set(PlayerTransformManagerSyncFlag.HEAD_COLLIDING, true);\r\n this.mySyncPositionHeadFlagMap.set(PlayerTransformManagerSyncFlag.FAR, false);\r\n this.mySyncPositionHeadFlagMap.set(PlayerTransformManagerSyncFlag.FLOATING, false);\r\n this.mySyncPositionHeadFlagMap.set(PlayerTransformManagerSyncFlag.HEIGHT_COLLIDING, false);\r\n\r\n this.mySyncRotationFlagMap.set(PlayerTransformManagerSyncFlag.BODY_COLLIDING, false);\r\n this.mySyncRotationFlagMap.set(PlayerTransformManagerSyncFlag.HEAD_COLLIDING, false);\r\n this.mySyncRotationFlagMap.set(PlayerTransformManagerSyncFlag.FAR, false);\r\n this.mySyncRotationFlagMap.set(PlayerTransformManagerSyncFlag.FLOATING, false);\r\n this.mySyncRotationFlagMap.set(PlayerTransformManagerSyncFlag.HEIGHT_COLLIDING, false);\r\n\r\n this.mySyncHeightFlagMap.set(PlayerTransformManagerSyncFlag.BODY_COLLIDING, false);\r\n this.mySyncHeightFlagMap.set(PlayerTransformManagerSyncFlag.HEAD_COLLIDING, false);\r\n this.mySyncHeightFlagMap.set(PlayerTransformManagerSyncFlag.FAR, false);\r\n this.mySyncHeightFlagMap.set(PlayerTransformManagerSyncFlag.FLOATING, false);\r\n this.mySyncHeightFlagMap.set(PlayerTransformManagerSyncFlag.HEIGHT_COLLIDING, true);\r\n }\r\n}\r\n\r\n// #TODO Sliding info, surface info, update\r\nexport class PlayerTransformManager {\r\n\r\n private readonly _myParams: PlayerTransformManagerParams;\r\n\r\n private readonly _myRealMovementCollisionCheckParams!: CollisionCheckParams;\r\n private readonly _myHeadCollisionCheckParams !: CollisionCheckParams;\r\n\r\n private readonly _myCollisionRuntimeParams = new CollisionRuntimeParams();\r\n\r\n private _myPlayerLocomotionTeleport: PlayerLocomotionTeleport | null = null;\r\n\r\n private readonly _myValidPosition: Vector3 = vec3_create();\r\n private readonly _myValidRotationQuat: Quaternion = quat_create();\r\n private _myValidHeight: number = 0;\r\n private readonly _myValidPositionHead: Vector3 = vec3_create();\r\n private readonly _myValidPositionHeadBackupForResetToFeet: Vector3 = vec3_create();\r\n\r\n private _myIsBodyColliding: boolean = false;\r\n private _myIsHeadColliding: boolean = false;\r\n private _myIsLeaning: boolean = false;\r\n private _myIsHopping: boolean = false;\r\n private _myIsFar: boolean = false;\r\n private _myIsHeightColliding: boolean = false;\r\n\r\n private readonly _myLastValidMovementDirection: Vector3 = vec3_create();\r\n private _myIsPositionValid: boolean = false;\r\n private _myIsPositionHeadValid: boolean = false;\r\n private _myIsRealPositionValid: boolean = false;\r\n private _myIsRealPositionHeadValid: boolean = false;\r\n\r\n private _myResetRealOnHeadSynced: boolean = false;\r\n\r\n private _myResetHeadToFeetDirty: boolean = false;\r\n private _myResetHeadToFeetOnNextUpdateValidToReal: boolean = false;\r\n\r\n private _myVisibilityChangeEventListener: ((event: XRSessionEvent) => any) | null = null;\r\n\r\n private _mySessionHasBeenHidden: boolean = false;\r\n\r\n private _myActive: boolean = true;\r\n\r\n private _myDestroyed: boolean = false;\r\n\r\n constructor(params: PlayerTransformManagerParams) {\r\n this._myParams = params;\r\n\r\n this._generateRealMovementParamsFromMovementParams();\r\n\r\n if (this._myParams.myTeleportCollisionCheckParamsCopyFromMovement) {\r\n this._generateTeleportParamsFromMovementParams();\r\n }\r\n\r\n this._setupHeadCollisionCheckParams();\r\n }\r\n\r\n public start(): void {\r\n this.resetToReal(true, true, true, true, false, true);\r\n\r\n this._myActive = false;\r\n this.setActive(true);\r\n }\r\n\r\n public getParams(): PlayerTransformManagerParams {\r\n return this._myParams;\r\n }\r\n\r\n public setActive(active: boolean): void {\r\n if (this._myActive != active) {\r\n this._myActive = active;\r\n\r\n if (this._myActive) {\r\n XRUtils.registerSessionStartEndEventListeners(this, this._onXRSessionStart.bind(this), this._onXRSessionEnd.bind(this), true, true, this._myParams.myEngine);\r\n } else {\r\n if (this._myVisibilityChangeEventListener != null) {\r\n XRUtils.getSession(this._myParams.myEngine)?.removeEventListener(\"visibilitychange\", this._myVisibilityChangeEventListener);\r\n }\r\n\r\n XRUtils.unregisterSessionStartEndEventListeners(this, this._myParams.myEngine);\r\n }\r\n }\r\n }\r\n\r\n // #TODO update should be before to check the new valid transform and if the head new transform is fine\r\n // then update movements, so that they will use the proper transform\r\n // pre/post update?\r\n // For sliding if previous frame no horizontal movement then reset sliding on pre update\r\n // In generale capire come fare per risolvere i problemi quando c'è un move solo verticale che sputtana i dati dello sliding precedente\r\n // che servono per far slidare bene anche dopo, magari un flag per dire non aggiornare le cose relative al movimento orizzontale\r\n // o un move check solo verticale\r\n public update(dt: number): void {\r\n if (!this._myActive) return;\r\n\r\n // #TODO This should update ground and ceiling info but not sliding info \r\n\r\n if (this._myResetRealOnHeadSynced) {\r\n if (this.getPlayerHeadManager().isSynced()) {\r\n this._myResetRealOnHeadSynced = false;\r\n if (XRUtils.isSessionActive(this._myParams.myEngine)) {\r\n this.resetReal(\r\n !this._myParams.myNeverResetRealPositionVR,\r\n !this._myParams.myNeverResetRealRotationVR,\r\n !this._myParams.myNeverResetRealHeightVR,\r\n true,\r\n true);\r\n } else {\r\n this.resetReal(\r\n !this._myParams.myNeverResetRealPositionNonVR,\r\n !this._myParams.myNeverResetRealRotationNonVR,\r\n !this._myParams.myNeverResetRealHeightNonVR && this._myParams.myResetRealHeightNonVROnExitSession,\r\n true,\r\n true);\r\n }\r\n }\r\n }\r\n\r\n this._updateValidToReal(dt);\r\n this._updatePositionsValid(dt);\r\n\r\n this._updateCollisionHeight();\r\n\r\n if (this._myParams.myDebugEnabled && Globals.isDebugEnabled(this._myParams.myEngine)) {\r\n this._debugUpdate(dt);\r\n }\r\n }\r\n\r\n // #TODO Collision runtime will copy the result, so that u can use that for later reference like if it was sliding\r\n // Maybe there should be a way to sum all the things happened for proper movement in a summary runtime\r\n // or maybe the move should be done once per frame, or at least in theory\r\n // Move should move the valid transform, but also move the player object so that they head, even is colliding is dragged with it\r\n // Also teleport, should get the difference from previous and move the player object, this will keep the relative position head-to-valid\r\n private static readonly _moveSV =\r\n {\r\n fixedMovement: vec3_create(),\r\n transformQuat: quat2_create(),\r\n transformUp: vec3_create(),\r\n fixedVerticalMovement: vec3_create()\r\n };\r\n public move(movement: Readonly, forceMove: boolean = false, useHighestHeight: boolean = false, outCollisionRuntimeParams: CollisionRuntimeParams | null = null): void {\r\n if (this._myPlayerLocomotionTeleport != null) {\r\n this._myPlayerLocomotionTeleport.cancelTeleport();\r\n }\r\n\r\n this.checkMovement(movement, undefined, undefined, useHighestHeight, this._myCollisionRuntimeParams);\r\n\r\n if (outCollisionRuntimeParams != null) {\r\n outCollisionRuntimeParams.copy(this._myCollisionRuntimeParams);\r\n }\r\n\r\n const fixedMovement = PlayerTransformManager._moveSV.fixedMovement;\r\n if (!forceMove) {\r\n fixedMovement.vec3_copy(this._myCollisionRuntimeParams.myFixedMovement);\r\n } else {\r\n fixedMovement.vec3_copy(movement);\r\n }\r\n\r\n if (!fixedMovement.vec3_isZero(0.00001)) {\r\n this._myValidPosition.vec3_add(fixedMovement, this._myValidPosition);\r\n this.getPlayerHeadManager().moveFeet(fixedMovement);\r\n\r\n const fixedVerticalMovement = PlayerTransformManager._moveSV.fixedVerticalMovement;\r\n const transformQuat = PlayerTransformManager._moveSV.transformQuat;\r\n const transformUp = PlayerTransformManager._moveSV.transformUp;\r\n this.getTransformQuat(transformQuat);\r\n transformQuat.quat2_getUp(transformUp);\r\n if (fixedMovement.vec3_removeComponentAlongAxis(transformUp, fixedVerticalMovement).vec3_length() > 0.0001) {\r\n fixedMovement.vec3_normalize(this._myLastValidMovementDirection);\r\n }\r\n }\r\n\r\n // This make reset happens even for gravity, maybe u should do it manually\r\n if (this._myParams.myResetRealOnMove) {\r\n if (!this.isSynced()) {\r\n if (XRUtils.isSessionActive(this._myParams.myEngine)) {\r\n this.resetReal(\r\n !this._myParams.myNeverResetRealPositionVR,\r\n !this._myParams.myNeverResetRealRotationVR,\r\n !this._myParams.myNeverResetRealHeightVR,\r\n true);\r\n } else {\r\n this.resetReal(\r\n !this._myParams.myNeverResetRealPositionNonVR,\r\n !this._myParams.myNeverResetRealRotationNonVR,\r\n !this._myParams.myNeverResetRealHeightNonVR,\r\n true);\r\n }\r\n }\r\n }\r\n\r\n // #TODO Add move callback\r\n }\r\n\r\n private static readonly _checkMovementSV =\r\n {\r\n currentTransformQuat: quat2_create()\r\n };\r\n public checkMovement(movement: Readonly, currentTransformQuat?: Readonly, collisionCheckParams?: Readonly, useHighestHeight: boolean = false, outCollisionRuntimeParams?: CollisionRuntimeParams): CollisionRuntimeParams {\r\n this._updateCollisionHeight(useHighestHeight);\r\n\r\n if (currentTransformQuat == null) {\r\n currentTransformQuat = PlayerTransformManager._checkMovementSV.currentTransformQuat;\r\n this.getTransformQuat(currentTransformQuat);\r\n }\r\n\r\n if (collisionCheckParams == null) {\r\n collisionCheckParams = this._myParams.myMovementCollisionCheckParams;\r\n }\r\n\r\n if (outCollisionRuntimeParams == null) {\r\n outCollisionRuntimeParams = new CollisionRuntimeParams();\r\n outCollisionRuntimeParams.copy(this._myCollisionRuntimeParams);\r\n }\r\n\r\n CollisionCheckBridge.getCollisionCheck(this._myParams.myEngine as any).move(movement, currentTransformQuat, collisionCheckParams, outCollisionRuntimeParams);\r\n\r\n this._updateCollisionHeight();\r\n\r\n return outCollisionRuntimeParams;\r\n }\r\n\r\n private static readonly _teleportPositionSV =\r\n {\r\n teleportTransformQuat: quat2_create()\r\n };\r\n public teleportPosition(teleportPosition: Readonly, forceTeleport: boolean = false, forceTeleportSkipCollisionCheck: boolean = false, useHighestHeight: boolean = false, outCollisionRuntimeParams: CollisionRuntimeParams | null = null): void {\r\n const teleportTransformQuat = PlayerTransformManager._teleportPositionSV.teleportTransformQuat;\r\n this.getTransformQuat(teleportTransformQuat);\r\n teleportTransformQuat.quat2_setPosition(teleportPosition);\r\n this.teleportTransformQuat(teleportTransformQuat, forceTeleport, forceTeleportSkipCollisionCheck, useHighestHeight, outCollisionRuntimeParams);\r\n }\r\n\r\n private static readonly _teleportPositionRotationQuatSV =\r\n {\r\n teleportTransformQuat: quat2_create()\r\n };\r\n public teleportPositionRotationQuat(teleportPosition: Readonly, rotationQuat: Quaternion, forceTeleport: boolean = false, forceTeleportSkipCollisionCheck: boolean = false, useHighestHeight: boolean = false, outCollisionRuntimeParams: CollisionRuntimeParams | null = null): void {\r\n const teleportTransformQuat = PlayerTransformManager._teleportPositionRotationQuatSV.teleportTransformQuat;\r\n this.getTransformQuat(teleportTransformQuat);\r\n teleportTransformQuat.quat2_setPositionRotationQuat(teleportPosition, rotationQuat);\r\n this.teleportTransformQuat(teleportTransformQuat, forceTeleport, forceTeleportSkipCollisionCheck, useHighestHeight, outCollisionRuntimeParams);\r\n }\r\n\r\n private static readonly _teleportTransformQuatSV =\r\n {\r\n currentPosition: vec3_create(),\r\n teleportPosition: vec3_create(),\r\n teleportRotation: quat_create(),\r\n fixedMovement: vec3_create(),\r\n transformQuat: quat2_create(),\r\n transformUp: vec3_create(),\r\n flatTeleportForward: vec3_create()\r\n };\r\n public teleportTransformQuat(teleportTransformQuat: Readonly, forceTeleport: boolean = false, forceTeleportSkipCollisionCheck: boolean = false, useHighestHeight: boolean = false, outCollisionRuntimeParams: CollisionRuntimeParams | null = null): void {\r\n if (this._myPlayerLocomotionTeleport != null) {\r\n this._myPlayerLocomotionTeleport.cancelTeleport();\r\n }\r\n\r\n if (!forceTeleport || !forceTeleportSkipCollisionCheck) {\r\n this.checkTeleportToTransformQuat(teleportTransformQuat, undefined, undefined, useHighestHeight, this._myCollisionRuntimeParams);\r\n }\r\n\r\n if (outCollisionRuntimeParams != null) {\r\n outCollisionRuntimeParams.copy(this._myCollisionRuntimeParams);\r\n }\r\n\r\n const currentPosition = PlayerTransformManager._teleportTransformQuatSV.currentPosition;\r\n const teleportPosition = PlayerTransformManager._teleportTransformQuatSV.teleportPosition;\r\n const teleportRotation = PlayerTransformManager._teleportTransformQuatSV.teleportRotation;\r\n this.getPosition(currentPosition);\r\n teleportTransformQuat.quat2_getPosition(teleportPosition);\r\n teleportTransformQuat.quat2_getRotationQuat(teleportRotation);\r\n\r\n const fixedMovement = PlayerTransformManager._teleportTransformQuatSV.fixedMovement;\r\n fixedMovement.vec3_zero();\r\n if (!forceTeleport) {\r\n if (!this._myCollisionRuntimeParams.myTeleportCanceled) {\r\n this._myCollisionRuntimeParams.myFixedTeleportPosition.vec3_sub(currentPosition, fixedMovement);\r\n }\r\n } else {\r\n teleportPosition.vec3_sub(currentPosition, fixedMovement);\r\n }\r\n\r\n if (!this._myCollisionRuntimeParams.myTeleportCanceled || forceTeleport) {\r\n this._myValidRotationQuat.quat_copy(teleportRotation);\r\n this.getPlayerHeadManager().setRotationFeetQuat(teleportRotation);\r\n }\r\n\r\n if (!fixedMovement.vec3_isZero(0.00001)) {\r\n this._myValidPosition.vec3_add(fixedMovement, this._myValidPosition);\r\n this.getPlayerHeadManager().moveFeet(fixedMovement);\r\n\r\n const transformQuat = PlayerTransformManager._teleportTransformQuatSV.transformQuat;\r\n const transformUp = PlayerTransformManager._teleportTransformQuatSV.transformUp;\r\n const flatTeleportForward = PlayerTransformManager._teleportTransformQuatSV.flatTeleportForward;\r\n this.getTransformQuat(transformQuat);\r\n transformQuat.quat2_getUp(transformUp);\r\n if (this._myCollisionRuntimeParams.myTeleportForward.vec3_removeComponentAlongAxis(transformUp, flatTeleportForward).vec3_length() > 0.0001) {\r\n flatTeleportForward.vec3_normalize(this._myLastValidMovementDirection);\r\n }\r\n }\r\n\r\n if (this._myParams.myResetRealOnTeleport) {\r\n if (!this.isSynced()) {\r\n if (XRUtils.isSessionActive(this._myParams.myEngine)) {\r\n this.resetReal(\r\n !this._myParams.myNeverResetRealPositionVR,\r\n !this._myParams.myNeverResetRealRotationVR,\r\n !this._myParams.myNeverResetRealHeightVR,\r\n true);\r\n } else {\r\n this.resetReal(\r\n !this._myParams.myNeverResetRealPositionNonVR,\r\n !this._myParams.myNeverResetRealRotationNonVR,\r\n !this._myParams.myNeverResetRealHeightNonVR,\r\n true);\r\n }\r\n }\r\n }\r\n\r\n // #TODO Add teleport callback\r\n }\r\n\r\n private static readonly _checkTeleportToTransformQuatSV =\r\n {\r\n currentTransformQuat: quat2_create(),\r\n currentPosition: vec3_create(),\r\n teleportPosition: vec3_create(),\r\n teleportRotation: quat_create(),\r\n rotatedTransformQuat: quat2_create()\r\n };\r\n public checkTeleportToTransformQuat(teleportTransformQuat: Readonly, currentTransformQuat?: Readonly, collisionCheckParams?: Readonly, useHighestHeight: boolean = false, outCollisionRuntimeParams?: CollisionRuntimeParams): CollisionRuntimeParams {\r\n this._updateCollisionHeight(useHighestHeight);\r\n\r\n if (currentTransformQuat == null) {\r\n currentTransformQuat = PlayerTransformManager._checkTeleportToTransformQuatSV.currentTransformQuat;\r\n this.getTransformQuat(currentTransformQuat);\r\n }\r\n\r\n const currentPosition = PlayerTransformManager._checkTeleportToTransformQuatSV.currentPosition;\r\n const teleportPosition = PlayerTransformManager._checkTeleportToTransformQuatSV.teleportPosition;\r\n const teleportRotation = PlayerTransformManager._checkTeleportToTransformQuatSV.teleportRotation;\r\n const rotatedTransformQuat = PlayerTransformManager._checkTeleportToTransformQuatSV.rotatedTransformQuat;\r\n currentTransformQuat.quat2_getPosition(currentPosition);\r\n teleportTransformQuat.quat2_getPosition(teleportPosition);\r\n teleportTransformQuat.quat2_getRotationQuat(teleportRotation);\r\n rotatedTransformQuat.quat2_setPositionRotationQuat(currentPosition, teleportRotation);\r\n\r\n if (collisionCheckParams == null) {\r\n collisionCheckParams = this._myParams.myTeleportCollisionCheckParams!;\r\n }\r\n\r\n if (outCollisionRuntimeParams == null) {\r\n outCollisionRuntimeParams = new CollisionRuntimeParams();\r\n outCollisionRuntimeParams.copy(this._myCollisionRuntimeParams);\r\n }\r\n\r\n CollisionCheckBridge.getCollisionCheck(this._myParams.myEngine as any).teleport(teleportPosition, rotatedTransformQuat, collisionCheckParams, outCollisionRuntimeParams);\r\n\r\n this._updateCollisionHeight();\r\n\r\n return outCollisionRuntimeParams;\r\n }\r\n\r\n public checkTransformQuat(transformQuat: Readonly, collisionCheckParams?: Readonly, outCollisionRuntimeParams?: CollisionRuntimeParams): CollisionRuntimeParams {\r\n if (collisionCheckParams == null) {\r\n collisionCheckParams = this._myParams.myMovementCollisionCheckParams;\r\n }\r\n\r\n if (outCollisionRuntimeParams == null) {\r\n outCollisionRuntimeParams = new CollisionRuntimeParams();\r\n outCollisionRuntimeParams.copy(this._myCollisionRuntimeParams);\r\n }\r\n\r\n CollisionCheckBridge.getCollisionCheck(this._myParams.myEngine as any).positionCheck(true, transformQuat, collisionCheckParams, outCollisionRuntimeParams);\r\n\r\n return outCollisionRuntimeParams;\r\n }\r\n\r\n /** Quick way to force teleport to a position and reset the real to this */\r\n public forceTeleportAndReset(teleportPosition: Readonly, teleportRotationQuat: Readonly, forceTeleportSkipCollisionCheck: boolean = false): void {\r\n this.teleportPositionRotationQuat(teleportPosition, teleportRotationQuat, true, forceTeleportSkipCollisionCheck);\r\n\r\n this.resetReal(true, true, undefined, undefined, undefined, true);\r\n }\r\n\r\n public rotateQuat(rotationQuat: Readonly): void {\r\n this._myValidRotationQuat.quat_rotateQuat(rotationQuat, this._myValidRotationQuat);\r\n this.getPlayerHeadManager().rotateFeetQuat(rotationQuat);\r\n }\r\n\r\n private static readonly _setRotationQuatSV =\r\n {\r\n rotationToPerform: quat_create()\r\n };\r\n public setRotationQuat(rotationQuat: Readonly): void {\r\n const rotationToPerform = PlayerTransformManager._setRotationQuatSV.rotationToPerform;\r\n this._myValidRotationQuat.quat_rotationToQuat(rotationQuat, rotationToPerform);\r\n this.rotateQuat(rotationToPerform);\r\n }\r\n\r\n private static readonly _setHeightSV =\r\n {\r\n transformQuat: quat_create(),\r\n transformUp: vec3_create(),\r\n rotationQuat: quat_create(),\r\n horizontalDirection: vec3_create(),\r\n collisionRuntimeParams: new CollisionRuntimeParams()\r\n };\r\n public setHeight(height: number, forceSet: boolean = false): void {\r\n const fixedHeight = Math.pp_clamp(height, this._myParams.myMinHeight ?? undefined, this._myParams.myMaxHeight ?? undefined);\r\n const previousHeight = this.getHeight();\r\n\r\n this._myValidHeight = fixedHeight;\r\n this._updateCollisionHeight();\r\n\r\n const transformQuat = PlayerTransformManager._setHeightSV.transformQuat;\r\n const transformUp = PlayerTransformManager._setHeightSV.transformUp;\r\n const rotationQuat = PlayerTransformManager._setHeightSV.rotationQuat;\r\n const horizontalDirection = PlayerTransformManager._setHeightSV.horizontalDirection;\r\n this.getTransformQuat(transformQuat);\r\n transformQuat.quat2_getUp(transformUp);\r\n transformQuat.quat2_getRotationQuat(rotationQuat);\r\n this._myLastValidMovementDirection.vec3_removeComponentAlongAxis(transformUp, horizontalDirection);\r\n\r\n if (!horizontalDirection.vec3_isZero(0.00001)) {\r\n horizontalDirection.vec3_normalize(horizontalDirection);\r\n rotationQuat.quat_setUp(transformUp, horizontalDirection);\r\n transformQuat.quat2_setRotationQuat(rotationQuat);\r\n }\r\n\r\n const collisionRuntimeParams = PlayerTransformManager._setHeightSV.collisionRuntimeParams;\r\n collisionRuntimeParams.copy(this._myCollisionRuntimeParams);\r\n const debugBackup = this._myParams.myMovementCollisionCheckParams.myDebugEnabled;\r\n this._myParams.myMovementCollisionCheckParams.myDebugEnabled = false;\r\n CollisionCheckBridge.getCollisionCheck(this._myParams.myEngine as any).positionCheck(true, transformQuat, this._myParams.myMovementCollisionCheckParams, collisionRuntimeParams);\r\n this._myParams.myMovementCollisionCheckParams.myDebugEnabled = debugBackup;\r\n\r\n if (collisionRuntimeParams.myIsPositionOk || forceSet) {\r\n this.getPlayerHeadManager().setHeightHead(this.getHeight(), true);\r\n } else {\r\n this._myValidHeight = previousHeight;\r\n }\r\n\r\n this._updateCollisionHeight();\r\n }\r\n\r\n public getPlayer(): Object3D {\r\n return this._myParams.myPlayerHeadManager.getPlayer();\r\n }\r\n\r\n public getHead(): Object3D {\r\n return this._myParams.myPlayerHeadManager.getHead();\r\n }\r\n\r\n public getTransformQuat(): Quaternion2;\r\n public getTransformQuat(outTransformQuat: T): T;\r\n public getTransformQuat(outTransformQuat: Quaternion2 | T = quat2_create()): Quaternion2 | T {\r\n return outTransformQuat.quat2_setPositionRotationQuat(this.getPosition(this._myValidPosition), this.getRotationQuat(this._myValidRotationQuat));\r\n }\r\n\r\n public getPosition(): Vector3;\r\n public getPosition(outPosition: T): T;\r\n public getPosition(outPosition: Vector3 | T = vec3_create()): Vector3 | T {\r\n return outPosition.vec3_copy(this._myValidPosition);\r\n }\r\n\r\n public getRotationQuat(): Quaternion;\r\n public getRotationQuat(outRotationQuat: T): T;\r\n public getRotationQuat(outRotationQuat: Quaternion | T = quat_create()): Quaternion | T {\r\n return outRotationQuat.quat_copy(this._myValidRotationQuat);\r\n }\r\n\r\n public getPositionHead(): Vector3;\r\n public getPositionHead(outPosition: T): T;\r\n public getPositionHead(outPosition: Vector3 | T = vec3_create()): Vector3 | T {\r\n return outPosition.vec3_copy(this._myValidPositionHead);\r\n }\r\n\r\n public getTransformHeadQuat(): Quaternion2;\r\n public getTransformHeadQuat(outTransformQuat: T): T;\r\n public getTransformHeadQuat(outTransformQuat: Quaternion2 | T = quat2_create()): Quaternion2 | T {\r\n return outTransformQuat.quat2_setPositionRotationQuat(this.getPositionHead(this._myValidPositionHead), this.getRotationQuat(this._myValidRotationQuat));\r\n }\r\n\r\n public getHeight(): number {\r\n return this._myValidHeight;\r\n }\r\n\r\n public getTransformRealQuat(outTransformQuat: Quaternion2 = quat2_create()): Quaternion2 {\r\n return this.getPlayerHeadManager().getTransformFeetQuat(outTransformQuat);\r\n }\r\n\r\n public getPositionReal(): Vector3;\r\n public getPositionReal(outPosition: T): T;\r\n public getPositionReal(outPosition: Vector3 | T = vec3_create()): Vector3 | T {\r\n return this.getPlayerHeadManager().getPositionFeet(outPosition);\r\n }\r\n\r\n public getRotationRealQuat(): Quaternion;\r\n public getRotationRealQuat(outRotationQuat: T): T;\r\n public getRotationRealQuat(outRotationQuat: Quaternion | T = quat_create()): Quaternion | T {\r\n return this.getPlayerHeadManager().getRotationFeetQuat(outRotationQuat);\r\n }\r\n\r\n public getPositionHeadReal(): Vector3;\r\n public getPositionHeadReal(outPosition: T): T;\r\n public getPositionHeadReal(outPosition: Vector3 | T = vec3_create()): Vector3 | T {\r\n return this.getPlayerHeadManager().getPositionHead(outPosition);\r\n }\r\n\r\n public getTransformHeadRealQuat(): Quaternion2;\r\n public getTransformHeadRealQuat(outTransformQuat: T): T;\r\n public getTransformHeadRealQuat(outTransformQuat: Quaternion2 | T = quat2_create()): Quaternion2 | T {\r\n return this.getPlayerHeadManager().getTransformHeadQuat(outTransformQuat);\r\n }\r\n\r\n public getHeightReal(): number {\r\n return this._myParams.myPlayerHeadManager.getHeightHead();\r\n }\r\n\r\n public isSynced(syncFlagMap: Map | null = null): boolean {\r\n const isBodyColliding = this.isBodyColliding() && (syncFlagMap == null || syncFlagMap.get(PlayerTransformManagerSyncFlag.BODY_COLLIDING));\r\n const isHeadColliding = this.isHeadColliding() && (syncFlagMap == null || syncFlagMap.get(PlayerTransformManagerSyncFlag.HEAD_COLLIDING));\r\n const isFar = this.isFar() && (syncFlagMap == null || syncFlagMap.get(PlayerTransformManagerSyncFlag.FAR));\r\n const isFloating = this.isFloating() && (syncFlagMap == null || syncFlagMap.get(PlayerTransformManagerSyncFlag.FLOATING));\r\n const isHeightColliding = this.isHeightColliding() && (syncFlagMap == null || syncFlagMap.get(PlayerTransformManagerSyncFlag.HEIGHT_COLLIDING));\r\n return !isBodyColliding && !isHeadColliding && !isFar && !isFloating && !isHeightColliding;\r\n }\r\n\r\n private static readonly _resetRealSV =\r\n {\r\n realUp: vec3_create(),\r\n validUp: vec3_create(),\r\n position: vec3_create(),\r\n rotationQuat: quat_create(),\r\n\r\n positionHeadReal: vec3_create(),\r\n validPositionHeadBackupForResetToFeet: vec3_create()\r\n };\r\n public resetReal(resetPosition = true, resetRotation = false, resetHeight = false, resetHeadToReal = true, updateValidToReal = false, ignoreResetHeadMinDistance = false): void {\r\n const playerHeadManager = this.getPlayerHeadManager();\r\n\r\n const position = PlayerTransformManager._resetRealSV.position;\r\n if (resetPosition) {\r\n playerHeadManager.teleportPositionFeet(this.getPosition(position));\r\n }\r\n\r\n const realUp = PlayerTransformManager._resetRealSV.realUp;\r\n const rotationQuat = PlayerTransformManager._resetRealSV.rotationQuat;\r\n const validUp = PlayerTransformManager._resetRealSV.validUp;\r\n this.getPlayerHeadManager().getRotationFeetQuat(rotationQuat).quat_getUp(realUp);\r\n this.getRotationQuat(rotationQuat).quat_getUp(validUp);\r\n\r\n if (resetRotation || (realUp.vec3_angle(validUp) > Math.PP_EPSILON_DEGREES && this._myParams.myResetRealResetRotationIfUpChanged)) {\r\n playerHeadManager.setRotationFeetQuat(this.getRotationQuat(rotationQuat), false);\r\n }\r\n\r\n if (resetHeight) {\r\n playerHeadManager.setHeightHead(this.getHeight(), true);\r\n }\r\n\r\n if (resetHeadToReal) {\r\n const positionHeadReal = PlayerTransformManager._resetRealSV.positionHeadReal;\r\n this.getPositionHeadReal(positionHeadReal);\r\n const distanceToRealHead = this._myValidPositionHead.vec3_distance(positionHeadReal);\r\n if (ignoreResetHeadMinDistance || distanceToRealHead >= this._myParams.myResetHeadToRealMinDistance) {\r\n if (this._myParams.myResetHeadToFeetInsteadOfRealOnlyIfRealNotReachable) {\r\n this._myResetHeadToFeetOnNextUpdateValidToReal = true;\r\n const validPositionHeadBackupForResetToFeet = PlayerTransformManager._resetRealSV.validPositionHeadBackupForResetToFeet;\r\n validPositionHeadBackupForResetToFeet.vec3_copy(this._myValidPositionHead);\r\n this.resetHeadToFeet();\r\n this._myValidPositionHeadBackupForResetToFeet.vec3_copy(validPositionHeadBackupForResetToFeet);\r\n } else if (this._myParams.myResetHeadToFeetInsteadOfReal) {\r\n this.resetHeadToFeet();\r\n } else {\r\n this.resetHeadToReal();\r\n }\r\n }\r\n }\r\n\r\n if (updateValidToReal) {\r\n this._updateValidToReal(0);\r\n }\r\n }\r\n\r\n public updateValidToReal(): void {\r\n this._updateValidToReal(0);\r\n }\r\n\r\n public updateValidHeadToRealHead(): void {\r\n this._updateValidHeadToRealHead(0);\r\n }\r\n\r\n public updateValidHeadToRealHeadIfNeeded(): void {\r\n if (this._myResetHeadToFeetDirty) {\r\n this._updateValidHeadToRealHead(0);\r\n }\r\n }\r\n\r\n public resetToReal(resetPosition = true, resetRotation = true, resetHeight = true, resetPositionHead = true, updateValidToReal = false, resetToPlayerInsteadOfHead = false): void {\r\n if (resetPosition) {\r\n if (resetToPlayerInsteadOfHead) {\r\n this.getPlayerHeadManager().getPlayer().pp_getPosition(this._myValidPosition);\r\n } else {\r\n this.getPositionReal(this._myValidPosition);\r\n }\r\n }\r\n\r\n if (resetPositionHead) {\r\n if (!this._myParams.myAlwaysSyncPositionWithReal) {\r\n this.getPositionHeadReal(this._myValidPositionHead);\r\n this._myValidPositionHeadBackupForResetToFeet.vec3_copy(this._myValidPositionHead);\r\n\r\n this._myResetHeadToFeetOnNextUpdateValidToReal = false;\r\n this._myResetHeadToFeetDirty = false;\r\n }\r\n }\r\n\r\n if (resetRotation) {\r\n if (resetToPlayerInsteadOfHead) {\r\n this.getPlayerHeadManager().getPlayer().pp_getRotationQuat(this._myValidRotationQuat);\r\n } else {\r\n this.getRotationRealQuat(this._myValidRotationQuat);\r\n }\r\n }\r\n\r\n if (resetHeight) {\r\n this._myValidHeight = Math.pp_clamp(this.getHeightReal(), this._myParams.myMinHeight ?? undefined, this._myParams.myMaxHeight ?? undefined);\r\n }\r\n\r\n if (updateValidToReal) {\r\n this._updateValidToReal(0);\r\n }\r\n }\r\n\r\n public resetHeadToReal(): void {\r\n if (!this._myParams.myAlwaysSyncPositionWithReal) {\r\n this.getPositionHeadReal(this._myValidPositionHead);\r\n this._myValidPositionHeadBackupForResetToFeet.vec3_copy(this._myValidPositionHead);\r\n\r\n this._myResetHeadToFeetOnNextUpdateValidToReal = false;\r\n this._myResetHeadToFeetDirty = false;\r\n }\r\n }\r\n\r\n private static readonly _resetHeadToFeetSV =\r\n {\r\n transformQuat: quat2_create(),\r\n headUp: vec3_create()\r\n };\r\n public resetHeadToFeet(): void {\r\n this.getPosition(this._myValidPositionHead);\r\n\r\n const transformQuat = PlayerTransformManager._resetHeadToFeetSV.transformQuat;\r\n const headUp = PlayerTransformManager._resetHeadToFeetSV.headUp;\r\n this.getTransformHeadQuat(transformQuat);\r\n transformQuat.quat2_getUp(headUp);\r\n this._myValidPositionHead.vec3_add(headUp.vec3_scale(this._myHeadCollisionCheckParams.myHeight / 2 + 0.00001 + this._myParams.myResetHeadToFeetUpOffset, headUp), this._myValidPositionHead);\r\n this._myValidPositionHeadBackupForResetToFeet.vec3_copy(this._myValidPositionHead);\r\n\r\n this._myResetHeadToFeetDirty = true;\r\n }\r\n\r\n public isBodyColliding(): boolean {\r\n return this._myIsBodyColliding;\r\n }\r\n\r\n public isHeadColliding(): boolean {\r\n return this._myIsHeadColliding;\r\n }\r\n\r\n public isFloating(): boolean {\r\n return this.isLeaning() || this.isHopping();\r\n }\r\n\r\n public isLeaning(): boolean {\r\n return this._myIsLeaning;\r\n }\r\n\r\n public isHopping(): boolean {\r\n return this._myIsHopping;\r\n }\r\n\r\n public isFar(): boolean {\r\n return this._myIsFar;\r\n }\r\n\r\n public isHeightColliding(): boolean {\r\n return this._myIsHeightColliding;\r\n }\r\n\r\n private static readonly _getDistanceToRealSV =\r\n {\r\n position: vec3_create(),\r\n realPosition: vec3_create()\r\n };\r\n public getDistanceToReal(): number {\r\n const realPosition = PlayerTransformManager._getDistanceToRealSV.realPosition;\r\n const position = PlayerTransformManager._getDistanceToRealSV.position;\r\n\r\n this.getPositionReal(realPosition);\r\n return realPosition.vec3_distance(this.getPosition(position));\r\n }\r\n\r\n private static readonly _getDistanceToRealHeadSV =\r\n {\r\n position: vec3_create(),\r\n realPosition: vec3_create()\r\n };\r\n public getDistanceToRealHead(): number {\r\n const realPosition = PlayerTransformManager._getDistanceToRealSV.realPosition;\r\n const position = PlayerTransformManager._getDistanceToRealSV.position;\r\n\r\n this.getPositionHeadReal(realPosition);\r\n return realPosition.vec3_distance(this.getPositionHead(position));\r\n }\r\n\r\n public getPlayerHeadManager(): PlayerHeadManager {\r\n return this._myParams.myPlayerHeadManager;\r\n }\r\n\r\n public getMovementCollisionCheckParams(): CollisionCheckParams {\r\n return this._myParams.myMovementCollisionCheckParams;\r\n }\r\n\r\n public getTeleportCollisionCheckParams(): CollisionCheckParams {\r\n return this._myParams.myTeleportCollisionCheckParams!;\r\n }\r\n\r\n public getHeadCollisionCheckParams(): CollisionCheckParams {\r\n return this._myHeadCollisionCheckParams!;\r\n }\r\n\r\n /**\r\n * This should be used anytime the movement `CollisionCheckParams` are updated,\r\n * so that the other `CollisionCheckParams` are synced with that (if needed)\r\n * \r\n * The head `CollisionCheckParams` are another set of params which are not synced automatically\r\n * If you want to apply some changes made to the movement params to the head ones too, for example\r\n * a new object to ignore, you need to also manually update them\r\n */\r\n public movementCollisionCheckParamsUpdated(): void {\r\n if (this._myParams.myTeleportCollisionCheckParamsCopyFromMovement) {\r\n this._generateTeleportParamsFromMovementParams();\r\n }\r\n\r\n this._generateRealMovementParamsFromMovementParams();\r\n }\r\n\r\n public getCollisionRuntimeParams(): CollisionRuntimeParams {\r\n return this._myCollisionRuntimeParams;\r\n }\r\n\r\n public isPositionValid(): boolean {\r\n return this._myIsPositionValid;\r\n }\r\n\r\n public isPositionHeadValid(): boolean {\r\n return this._myIsPositionHeadValid;\r\n }\r\n\r\n public isPositionRealValid(): boolean {\r\n return this._myIsRealPositionValid;\r\n }\r\n\r\n public isPositionHeadRealValid(): boolean {\r\n return this._myIsRealPositionHeadValid;\r\n }\r\n\r\n public setPlayerLocomotionTeleport(playerLocomotionTeleport: PlayerLocomotionTeleport | null): void {\r\n this._myPlayerLocomotionTeleport = playerLocomotionTeleport;\r\n }\r\n\r\n private _updateCollisionHeight(useHighestHeight: boolean = false): void {\r\n const validHeight = this.getHeight();\r\n const realHeight = this.getHeightReal();\r\n\r\n const highestHeight = Math.max(validHeight, realHeight);\r\n\r\n this._myParams.myMovementCollisionCheckParams.myHeight = (useHighestHeight ? highestHeight : validHeight) + this._myParams.myExtraHeight;\r\n this._myParams.myTeleportCollisionCheckParams!.myHeight = this._myParams.myMovementCollisionCheckParams.myHeight;\r\n\r\n this._myRealMovementCollisionCheckParams.myHeight = Math.max(realHeight, this._myParams.myMinHeight ?? -Number.MAX_VALUE) + this._myParams.myExtraHeight;\r\n }\r\n\r\n private _setupHeadCollisionCheckParams(): void {\r\n (this._myHeadCollisionCheckParams as CollisionCheckParams) = new CollisionCheckParams();\r\n const params = this._myHeadCollisionCheckParams;\r\n\r\n params.myRadius = this._myParams.myHeadRadius;\r\n params.myDistanceFromFeetToIgnore = 0;\r\n params.myDistanceFromHeadToIgnore = 0;\r\n\r\n params.mySplitMovementEnabled = true;\r\n params.mySplitMovementMaxLengthEnabled = true;\r\n params.mySplitMovementMaxLength = params.myRadius * 0.75;\r\n params.mySplitMovementMinLengthEnabled = true;\r\n params.mySplitMovementMinLength = params.mySplitMovementMaxLength;\r\n\r\n if (this._myParams.myMaxHeadToRealHeadSteps != null) {\r\n params.mySplitMovementMaxStepsEnabled = true;\r\n params.mySplitMovementMaxSteps = this._myParams.myMaxHeadToRealHeadSteps;\r\n params.mySplitMovementMaxLengthLastStepCanBeLonger = true;\r\n }\r\n\r\n params.mySplitMovementStopWhenHorizontalMovementCanceled = true;\r\n params.mySplitMovementStopWhenVerticalMovementCanceled = true;\r\n params.mySplitMovementStopWhenVerticalMovementReduced = true;\r\n\r\n params.myHorizontalMovementCheckEnabled = true;\r\n params.myHorizontalMovementRadialStepAmount = 1;\r\n params.myHorizontalMovementCheckDiagonalOutward = true;\r\n params.myHorizontalMovementCheckDiagonalInward = true;\r\n params.myHorizontalMovementCheckVerticalDiagonalUpwardOutward = true;\r\n params.myHorizontalMovementCheckVerticalDiagonalUpwardInward = true;\r\n\r\n params.myHorizontalPositionCheckEnabled = true;\r\n params.myHalfConeAngle = 180;\r\n params.myHalfConeSliceAmount = 3;\r\n params.myCheckConeBorder = true;\r\n params.myCheckConeRay = true;\r\n params.myHorizontalPositionCheckVerticalIgnoreHitsInsideCollision = false;\r\n params.myHorizontalPositionCheckVerticalDirectionType = 0;\r\n\r\n params.myHeight = this._myParams.myHeadHeight;\r\n params.myPositionOffsetLocal.vec3_set(0, -params.myHeight / 2, 0);\r\n\r\n params.myCheckHeight = true;\r\n params.myCheckHeightVerticalMovement = true;\r\n params.myCheckHeightVerticalPosition = true;\r\n params.myHeightCheckStepAmountMovement = 2;\r\n params.myHeightCheckStepAmountPosition = 2;\r\n params.myCheckHeightTopMovement = true;\r\n params.myCheckHeightTopPosition = true;\r\n params.myCheckVerticalStraight = true;\r\n\r\n params.myCheckVerticalFixedForwardEnabled = true;\r\n params.myCheckVerticalFixedForward = vec3_create(0, 0, 1);\r\n\r\n params.myCheckHorizontalFixedForwardEnabled = true;\r\n params.myCheckHorizontalFixedForward = vec3_create(0, 0, 1);\r\n\r\n params.myVerticalMovementCheckEnabled = true;\r\n params.myVerticalPositionCheckEnabled = true;\r\n params.myCheckVerticalBothDirection = true;\r\n params.myCheckVerticalPositionBothDirection = true;\r\n\r\n params.myGroundCircumferenceAddCenter = true;\r\n params.myGroundCircumferenceSliceAmount = 6;\r\n params.myGroundCircumferenceStepAmount = 2;\r\n params.myGroundCircumferenceRotationPerStep = 30;\r\n params.myFeetRadius = params.myRadius;\r\n\r\n params.myHorizontalBlockLayerFlags.copy(this._myParams.myHeadCollisionBlockLayerFlags);\r\n params.myHorizontalObjectsToIgnore.pp_copy(this._myParams.myHeadCollisionObjectsToIgnore);\r\n params.myHorizontalBlockColliderType = this._myParams.myHeadCollisionBlockColliderType;\r\n params.myVerticalBlockLayerFlags.copy(this._myParams.myHeadCollisionBlockLayerFlags);\r\n params.myVerticalObjectsToIgnore.pp_copy(this._myParams.myHeadCollisionObjectsToIgnore);\r\n params.myVerticalBlockColliderType = this._myParams.myHeadCollisionBlockColliderType;\r\n\r\n params.mySlidingEnabled = false;\r\n\r\n params.mySnapOnGroundEnabled = false;\r\n params.mySnapOnCeilingEnabled = false;\r\n params.myGroundPopOutEnabled = false;\r\n params.myCeilingPopOutEnabled = false;\r\n params.myAdjustVerticalMovementWithGroundAngleDownhill = false;\r\n params.myAdjustVerticalMovementWithGroundAngleUphill = false;\r\n params.myAdjustVerticalMovementWithCeilingAngleDownhill = false;\r\n params.myAdjustVerticalMovementWithCeilingAngleUphill = false;\r\n params.myAdjustHorizontalMovementWithGroundAngleDownhill = false;\r\n params.myAdjustHorizontalMovementWithCeilingAngleDownhill = false;\r\n params.myVerticalMovementReduceEnabled = false;\r\n\r\n params.myDebugEnabled = false;\r\n\r\n params.myDebugHorizontalMovementEnabled = false;\r\n params.myDebugHorizontalPositionEnabled = false;\r\n params.myDebugVerticalMovementEnabled = false;\r\n params.myDebugVerticalPositionEnabled = false;\r\n params.myDebugSlidingEnabled = false;\r\n params.myDebugGroundInfoEnabled = false;\r\n params.myDebugCeilingInfoEnabled = false;\r\n params.myDebugRuntimeParamsEnabled = false;\r\n params.myDebugMovementEnabled = false;\r\n }\r\n\r\n private _generateTeleportParamsFromMovementParams(): void {\r\n if (this._myParams.myTeleportCollisionCheckParams == null) {\r\n this._myParams.myTeleportCollisionCheckParams = new CollisionCheckParams();\r\n }\r\n\r\n if (this._myParams.myTeleportCollisionCheckParamsCheck360) {\r\n this._myParams.myTeleportCollisionCheckParams = CollisionCheckUtils.generate360TeleportParamsFromMovementParams(this._myParams.myMovementCollisionCheckParams, this._myParams.myTeleportCollisionCheckParams);\r\n } else {\r\n this._myParams.myTeleportCollisionCheckParams.copy(this._myParams.myMovementCollisionCheckParams);\r\n }\r\n\r\n if (this._myParams.myTeleportCollisionCheckParamsGroundAngleToIgnore != null) {\r\n this._myParams.myTeleportCollisionCheckParams.myGroundAngleToIgnore = this._myParams.myTeleportCollisionCheckParamsGroundAngleToIgnore;\r\n }\r\n }\r\n\r\n private _generateRealMovementParamsFromMovementParams(): void {\r\n if (this._myRealMovementCollisionCheckParams == null) {\r\n (this._myRealMovementCollisionCheckParams as CollisionCheckParams) = new CollisionCheckParams();\r\n }\r\n\r\n const params = this._myRealMovementCollisionCheckParams;\r\n params.copy(this._myParams.myMovementCollisionCheckParams);\r\n\r\n params.mySplitMovementStopWhenHorizontalMovementCanceled = true;\r\n params.mySplitMovementStopWhenVerticalMovementCanceled = true;\r\n params._myInternalSplitMovementMaxStepsDisabled = true;\r\n\r\n params.mySlidingEnabled = false;\r\n\r\n if (!this._myParams.myRealMovementAllowVerticalAdjustments) {\r\n params.mySnapOnGroundEnabled = false;\r\n params.mySnapOnCeilingEnabled = false;\r\n params.myGroundPopOutEnabled = false;\r\n params.myCeilingPopOutEnabled = false;\r\n params.myAdjustVerticalMovementWithGroundAngleDownhill = false;\r\n params.myAdjustVerticalMovementWithGroundAngleUphill = false;\r\n params.myAdjustVerticalMovementWithCeilingAngleDownhill = false;\r\n params.myAdjustVerticalMovementWithCeilingAngleUphill = false;\r\n params.myAdjustHorizontalMovementWithGroundAngleDownhill = false;\r\n params.myAdjustHorizontalMovementWithCeilingAngleDownhill = false;\r\n params.myVerticalMovementReduceEnabled = false;\r\n }\r\n\r\n //params.myHorizontalMovementGroundAngleIgnoreHeight = 0.1 * 3;\r\n //params.myHorizontalMovementCeilingAngleIgnoreHeight = 0.1 * 3;\r\n\r\n params.myDebugEnabled = false;\r\n\r\n params.myDebugHorizontalMovementEnabled = false;\r\n params.myDebugHorizontalPositionEnabled = false;\r\n params.myDebugVerticalMovementEnabled = false;\r\n params.myDebugVerticalPositionEnabled = false;\r\n params.myDebugSlidingEnabled = false;\r\n params.myDebugGroundInfoEnabled = false;\r\n params.myDebugCeilingInfoEnabled = false;\r\n params.myDebugRuntimeParamsEnabled = false;\r\n params.myDebugMovementEnabled = false;\r\n }\r\n\r\n private _onXRSessionStart(manualCall: boolean, session: XRSession): void {\r\n if (!manualCall) {\r\n if (this._myActive) {\r\n if (this._myParams.myResetToValidOnEnterSession) {\r\n this._myResetRealOnHeadSynced = true;\r\n }\r\n }\r\n }\r\n\r\n this._myVisibilityChangeEventListener = function (this: PlayerTransformManager, event: XRSessionEvent) {\r\n if (event.session.visibilityState == \"hidden\") {\r\n this._mySessionHasBeenHidden = true;\r\n } else if (this._mySessionHasBeenHidden) {\r\n this._mySessionHasBeenHidden = false;\r\n\r\n if (this._myParams.myResetToValidOnSessionHiddenEnd) {\r\n this._myResetRealOnHeadSynced = true;\r\n }\r\n }\r\n }.bind(this);\r\n\r\n session.addEventListener(\"visibilitychange\", this._myVisibilityChangeEventListener);\r\n }\r\n\r\n private _onXRSessionEnd(): void {\r\n if (this._myActive) {\r\n if (this._myParams.myResetToValidOnExitSession) {\r\n this._myResetRealOnHeadSynced = true;\r\n }\r\n }\r\n\r\n this._myVisibilityChangeEventListener = null;\r\n }\r\n\r\n private static readonly _updatePositionsValidSV =\r\n {\r\n transformQuat: quat2_create(),\r\n collisionRuntimeParams: new CollisionRuntimeParams(),\r\n headCollisionRuntimeParams: new CollisionRuntimeParams(),\r\n transformUp: vec3_create(),\r\n horizontalDirection: vec3_create(),\r\n rotationQuat: quat_create()\r\n };\r\n private _updatePositionsValid(dt: number): void {\r\n this._updateCollisionHeight();\r\n\r\n if (this._myParams.myUpdatePositionValid) {\r\n const transformQuat = PlayerTransformManager._updatePositionsValidSV.transformQuat;\r\n const transformUp = PlayerTransformManager._updatePositionsValidSV.transformUp;\r\n const rotationQuat = PlayerTransformManager._updatePositionsValidSV.rotationQuat;\r\n const horizontalDirection = PlayerTransformManager._updatePositionsValidSV.horizontalDirection;\r\n this.getTransformQuat(transformQuat);\r\n transformQuat.quat2_getUp(transformUp);\r\n transformQuat.quat2_getRotationQuat(rotationQuat);\r\n this._myLastValidMovementDirection.vec3_removeComponentAlongAxis(transformUp, horizontalDirection);\r\n\r\n if (!horizontalDirection.vec3_isZero(0.00001)) {\r\n horizontalDirection.vec3_normalize(horizontalDirection);\r\n rotationQuat.quat_setUp(transformUp, horizontalDirection);\r\n transformQuat.quat2_setRotationQuat(rotationQuat);\r\n }\r\n\r\n const collisionRuntimeParams = PlayerTransformManager._updatePositionsValidSV.collisionRuntimeParams;\r\n collisionRuntimeParams.copy(this._myCollisionRuntimeParams);\r\n const debugBackup = this._myParams.myMovementCollisionCheckParams.myDebugEnabled;\r\n this._myParams.myMovementCollisionCheckParams.myDebugEnabled = false;\r\n CollisionCheckBridge.getCollisionCheck(this._myParams.myEngine as any).positionCheck(true, transformQuat, this._myParams.myMovementCollisionCheckParams, collisionRuntimeParams);\r\n this._myParams.myMovementCollisionCheckParams.myDebugEnabled = debugBackup;\r\n this._myIsPositionValid = collisionRuntimeParams.myIsPositionOk;\r\n } else {\r\n this._myIsPositionValid = true;\r\n }\r\n\r\n if (this._myParams.myUpdatePositionHeadValid) {\r\n const transformQuat = PlayerTransformManager._updatePositionsValidSV.transformQuat;\r\n this.getTransformHeadQuat(transformQuat);\r\n\r\n const headCollisionRuntimeParams = PlayerTransformManager._updatePositionsValidSV.headCollisionRuntimeParams;\r\n headCollisionRuntimeParams.reset();\r\n const debugBackup = this._myHeadCollisionCheckParams.myDebugEnabled;\r\n this._myHeadCollisionCheckParams.myDebugEnabled = false;\r\n CollisionCheckBridge.getCollisionCheck(this._myParams.myEngine as any).positionCheck(true, transformQuat, this._myHeadCollisionCheckParams, headCollisionRuntimeParams);\r\n this._myHeadCollisionCheckParams.myDebugEnabled = debugBackup;\r\n this._myIsPositionHeadValid = headCollisionRuntimeParams.myIsPositionOk;\r\n } else {\r\n this._myIsPositionHeadValid = true;\r\n }\r\n\r\n if (this._myParams.myUpdateRealPositionValid) {\r\n const transformQuat = PlayerTransformManager._updatePositionsValidSV.transformQuat;\r\n const transformUp = PlayerTransformManager._updatePositionsValidSV.transformUp;\r\n const rotationQuat = PlayerTransformManager._updatePositionsValidSV.rotationQuat;\r\n const horizontalDirection = PlayerTransformManager._updatePositionsValidSV.horizontalDirection;\r\n this.getTransformRealQuat(transformQuat);\r\n transformQuat.quat2_getUp(transformUp);\r\n transformQuat.quat2_getRotationQuat(rotationQuat);\r\n this._myLastValidMovementDirection.vec3_removeComponentAlongAxis(transformUp, horizontalDirection);\r\n\r\n if (!horizontalDirection.vec3_isZero(0.00001)) {\r\n horizontalDirection.vec3_normalize(horizontalDirection);\r\n rotationQuat.quat_setUp(transformUp, horizontalDirection);\r\n transformQuat.quat2_setRotationQuat(rotationQuat);\r\n }\r\n\r\n const collisionRuntimeParams = PlayerTransformManager._updatePositionsValidSV.collisionRuntimeParams;\r\n collisionRuntimeParams.copy(this._myCollisionRuntimeParams);\r\n const debugBackup = this._myParams.myMovementCollisionCheckParams.myDebugEnabled;\r\n this._myParams.myMovementCollisionCheckParams.myDebugEnabled = false;\r\n CollisionCheckBridge.getCollisionCheck(this._myParams.myEngine as any).positionCheck(true, transformQuat, this._myParams.myMovementCollisionCheckParams, collisionRuntimeParams);\r\n this._myIsRealPositionValid = collisionRuntimeParams.myIsPositionOk;\r\n this._myParams.myMovementCollisionCheckParams.myDebugEnabled = debugBackup;\r\n } else {\r\n this._myIsRealPositionValid = true;\r\n }\r\n\r\n if (this._myParams.myUpdateRealPositionHeadValid) {\r\n const transformQuat = PlayerTransformManager._updatePositionsValidSV.transformQuat;\r\n this.getTransformHeadRealQuat(transformQuat);\r\n\r\n const headCollisionRuntimeParams = PlayerTransformManager._updatePositionsValidSV.headCollisionRuntimeParams;\r\n headCollisionRuntimeParams.reset();\r\n const debugBackup = this._myHeadCollisionCheckParams.myDebugEnabled;\r\n this._myHeadCollisionCheckParams.myDebugEnabled = false;\r\n CollisionCheckBridge.getCollisionCheck(this._myParams.myEngine as any).positionCheck(true, transformQuat, this._myHeadCollisionCheckParams, headCollisionRuntimeParams);\r\n this._myHeadCollisionCheckParams.myDebugEnabled = debugBackup;\r\n this._myIsRealPositionHeadValid = headCollisionRuntimeParams.myIsPositionOk;\r\n } else {\r\n this._myIsRealPositionHeadValid = true;\r\n }\r\n }\r\n\r\n private static readonly _updateValidToRealSV =\r\n {\r\n movementToCheck: vec3_create(),\r\n position: vec3_create(),\r\n positionReal: vec3_create(),\r\n transformQuat: quat2_create(),\r\n collisionRuntimeParams: new CollisionRuntimeParams(),\r\n\r\n newValidMovementDirection: vec3_create(),\r\n newValidVerticalMovementDirection: vec3_create(),\r\n newPosition: vec3_create(),\r\n movementStep: vec3_create(),\r\n currentMovementStep: vec3_create(),\r\n transformUp: vec3_create(),\r\n verticalMovement: vec3_create(),\r\n movementChecked: vec3_create(),\r\n newFeetPosition: vec3_create(),\r\n floatingTransformQuat: quat2_create(),\r\n rotationQuat: quat_create(),\r\n horizontalDirection: vec3_create()\r\n };\r\n private _updateValidToReal(dt: number): void {\r\n // If the head is not synced, only do the check to see if head is colliding, but do not actually change the valid position\r\n const isHeadSynced = this.getPlayerHeadManager().isSynced(this._myParams.myAllowUpdateValidToRealWhenBlurred);\r\n\r\n this._updateCollisionHeight();\r\n\r\n const position = PlayerTransformManager._updateValidToRealSV.position;\r\n const positionReal = PlayerTransformManager._updateValidToRealSV.positionReal;\r\n const movementToCheck = PlayerTransformManager._updateValidToRealSV.movementToCheck;\r\n this.getPositionReal(positionReal).vec3_sub(this.getPosition(position), movementToCheck);\r\n\r\n this._myIsFar = false;\r\n // Far\r\n if (this._myParams.mySyncEnabledFlagMap.get(PlayerTransformManagerSyncFlag.FAR)) {\r\n if (this._myParams.myMaxDistanceFromRealToSyncEnabled && movementToCheck.vec3_length() > this._myParams.myMaxDistanceFromRealToSync) {\r\n this._myIsFar = true;\r\n } else if (this._myParams.myIsFarExtraCheckCallback != null && this._myParams.myIsFarExtraCheckCallback(this)) {\r\n this._myIsFar = true;\r\n }\r\n }\r\n\r\n const collisionRuntimeParams = PlayerTransformManager._updateValidToRealSV.collisionRuntimeParams;\r\n const transformQuat = PlayerTransformManager._updateValidToRealSV.transformQuat;\r\n const newPosition = PlayerTransformManager._updateValidToRealSV.newPosition;\r\n const transformUp = PlayerTransformManager._updateValidToRealSV.transformUp;\r\n this.getTransformQuat(transformQuat);\r\n newPosition.vec3_copy(positionReal);\r\n transformQuat.quat2_getUp(transformUp);\r\n\r\n this._myIsBodyColliding = false;\r\n // Body Colliding\r\n if (!this._myIsFar && this._myParams.mySyncEnabledFlagMap.get(PlayerTransformManagerSyncFlag.BODY_COLLIDING)) {\r\n const realHeight = this.getHeightReal();\r\n if (Math.pp_clamp(realHeight, this._myParams.myIsBodyCollidingWhenHeightBelowValue ?? undefined, this._myParams.myIsBodyCollidingWhenHeightAboveValue ?? undefined) != realHeight) {\r\n this._myIsBodyColliding = true;\r\n } else {\r\n collisionRuntimeParams.copy(this._myCollisionRuntimeParams);\r\n\r\n // #TODO Temp as long as surface infos are not updated every time the position changes\r\n // This is needed to understand if snapping should occur (and possibly other stuff I can't remember)\r\n CollisionCheckBridge.getCollisionCheck(this._myParams.myEngine as any).updateSurfaceInfo(transformQuat, this._myParams.myMovementCollisionCheckParams, collisionRuntimeParams);\r\n\r\n if (collisionRuntimeParams.myIsOnGround && this._myParams.myIgnoreUpwardMovementToRealIfValidOnGround) {\r\n const valueAlongUp = movementToCheck.vec3_valueAlongAxis(transformUp);\r\n if (valueAlongUp >= 0) {\r\n movementToCheck.vec3_removeComponentAlongAxis(transformUp, movementToCheck);\r\n }\r\n }\r\n\r\n CollisionCheckBridge.getCollisionCheck(this._myParams.myEngine as any).move(movementToCheck, transformQuat, this._myRealMovementCollisionCheckParams, collisionRuntimeParams);\r\n\r\n if (!collisionRuntimeParams.myHorizontalMovementCanceled && !collisionRuntimeParams.myVerticalMovementCanceled) {\r\n if (this._myParams.myIsBodyCollidingExtraCheckCallback != null && this._myParams.myIsBodyCollidingExtraCheckCallback(this)) {\r\n this._myIsBodyColliding = true;\r\n } else {\r\n this._myIsBodyColliding = false;\r\n newPosition.vec3_copy(collisionRuntimeParams.myNewPosition);\r\n movementToCheck.vec3_copy(collisionRuntimeParams.myFixedMovement);\r\n }\r\n } else {\r\n this._myIsBodyColliding = true;\r\n }\r\n }\r\n } else if (this._myIsFar) {\r\n this._myIsBodyColliding = true;\r\n }\r\n\r\n if (this._myParams.myAlwaysSyncPositionWithReal) {\r\n newPosition.vec3_copy(positionReal);\r\n }\r\n\r\n this._myIsLeaning = false;\r\n this._myIsHopping = false;\r\n // Floating \r\n if (!this._myIsBodyColliding && this._myParams.mySyncEnabledFlagMap.get(PlayerTransformManagerSyncFlag.FLOATING)) {\r\n collisionRuntimeParams.copy(this._myCollisionRuntimeParams);\r\n const floatingTransformQuat = PlayerTransformManager._updateValidToRealSV.floatingTransformQuat;\r\n floatingTransformQuat.quat2_setPositionRotationQuat(this._myValidPosition, this._myValidRotationQuat);\r\n CollisionCheckBridge.getCollisionCheck(this._myParams.myEngine as any).updateSurfaceInfo(floatingTransformQuat, this._myRealMovementCollisionCheckParams, collisionRuntimeParams);\r\n // #TODO Utilizzare on ground del body gia calcolato, ma ora non c'è quindi va bene così\r\n\r\n if (collisionRuntimeParams.myIsOnGround) {\r\n const verticalMovement = PlayerTransformManager._updateValidToRealSV.verticalMovement;\r\n movementToCheck.vec3_componentAlongAxis(transformUp, verticalMovement);\r\n const isVertical = !verticalMovement.vec3_isZero(0.00001);\r\n if (!isVertical || !this._myParams.myIsFloatingValidIfVerticalMovement) {\r\n let movementStepAmount = 1;\r\n const movementStep = PlayerTransformManager._updateValidToRealSV.movementStep;\r\n movementStep.vec3_copy(movementToCheck);\r\n if (!movementToCheck.vec3_isZero(0.00001) && this._myParams.myFloatingSplitCheckEnabled) {\r\n const minLength = this._myParams.myFloatingSplitCheckMinLength;\r\n const maxLength = this._myParams.myFloatingSplitCheckMaxLength;\r\n\r\n const movementLength = movementToCheck.vec3_length();\r\n const stepLength = Math.pp_clamp(movementLength, minLength ?? undefined, maxLength ?? undefined);\r\n\r\n movementStepAmount = Math.ceil(movementLength / stepLength);\r\n movementStep.vec3_normalize(movementStep).vec3_scale(stepLength, movementStep);\r\n\r\n movementStepAmount = Math.max(1, movementStepAmount);\r\n\r\n if (movementStepAmount == 1) {\r\n movementStep.vec3_copy(movementToCheck);\r\n }\r\n }\r\n\r\n const isOnValidGroundAngle = collisionRuntimeParams.myGroundAngle <= this._myRealMovementCollisionCheckParams.myGroundAngleToIgnore + 0.0001;\r\n\r\n const movementChecked = PlayerTransformManager._updateValidToRealSV.movementChecked;\r\n const newFeetPosition = PlayerTransformManager._updateValidToRealSV.newFeetPosition;\r\n movementChecked.vec3_zero();\r\n newFeetPosition.vec3_copy(this._myValidPosition);\r\n collisionRuntimeParams.copy(this._myCollisionRuntimeParams);\r\n\r\n let atLeastOneNotOnGround = false;\r\n let isOneOnGroundBetweenNoGround = false;\r\n let isLastOnGround = false;\r\n let isOneOnSteepGround = false;\r\n\r\n const isOnGroundIfInsideHitBackup = this._myRealMovementCollisionCheckParams.myIsOnGroundIfInsideHit;\r\n\r\n // Previously this was always apply to real, but I think it was needed just for the floating check\r\n // If it seems there are errors due to this, move back to have this always enabled\r\n //\r\n // If the position check was used, this would probably not be needed because snap could happen, but since it's more performance heavy\r\n // just the surface check is done\r\n this._myRealMovementCollisionCheckParams.myIsOnGroundIfInsideHit = true;\r\n\r\n const currentMovementStep = PlayerTransformManager._updateValidToRealSV.currentMovementStep;\r\n for (let i = 0; i < movementStepAmount; i++) {\r\n if (movementStepAmount == 1 || i != movementStepAmount - 1) {\r\n currentMovementStep.vec3_copy(movementStep);\r\n } else {\r\n movementToCheck.vec3_sub(movementChecked, currentMovementStep);\r\n }\r\n\r\n newFeetPosition.vec3_add(currentMovementStep, newFeetPosition);\r\n floatingTransformQuat.quat2_setPositionRotationQuat(newFeetPosition, this._myValidRotationQuat);\r\n collisionRuntimeParams.copy(this._myCollisionRuntimeParams);\r\n CollisionCheckBridge.getCollisionCheck(this._myParams.myEngine as any).updateSurfaceInfo(floatingTransformQuat, this._myRealMovementCollisionCheckParams, collisionRuntimeParams);\r\n movementChecked.vec3_add(currentMovementStep, movementChecked);\r\n\r\n if (!collisionRuntimeParams.myIsOnGround) {\r\n atLeastOneNotOnGround = true;\r\n } else {\r\n if (collisionRuntimeParams.myGroundAngle > this._myRealMovementCollisionCheckParams.myGroundAngleToIgnore + 0.0001) {\r\n isOneOnSteepGround = true;\r\n }\r\n\r\n if (atLeastOneNotOnGround) {\r\n isOneOnGroundBetweenNoGround = true;\r\n }\r\n\r\n if (i == movementStepAmount - 1) {\r\n isLastOnGround = true;\r\n }\r\n }\r\n }\r\n\r\n this._myRealMovementCollisionCheckParams.myIsOnGroundIfInsideHit = isOnGroundIfInsideHitBackup;\r\n\r\n const isFloatingOnSteepGroundFail = isOneOnSteepGround && isOnValidGroundAngle &&\r\n !this._myParams.myIsFloatingValidIfSteepGround && (!isVertical || !this._myParams.myIsFloatingValidIfVerticalMovementAndSteepGround);\r\n if (atLeastOneNotOnGround || isFloatingOnSteepGroundFail) {\r\n if (isOneOnGroundBetweenNoGround) {\r\n this._myIsHopping = true;\r\n } else {\r\n this._myIsLeaning = true;\r\n }\r\n } else {\r\n this._myIsLeaning = false;\r\n this._myIsHopping = false;\r\n\r\n if (this._myParams.myIsLeaningExtraCheckCallback != null && this._myParams.myIsLeaningExtraCheckCallback(this)) {\r\n this._myIsLeaning = true;\r\n } else if (this._myParams.myIsHoppingExtraCheckCallback != null && this._myParams.myIsHoppingExtraCheckCallback(this)) {\r\n this._myIsHopping = true;\r\n }\r\n }\r\n\r\n if (this._myIsLeaning) {\r\n const distance = movementToCheck.vec3_length();\r\n if (this._myParams.myIsLeaningValidAboveDistance && distance > this._myParams.myLeaningValidDistance) {\r\n this._myIsLeaning = false;\r\n }\r\n }\r\n\r\n if (this._myIsLeaning || this._myIsHopping) {\r\n if (isLastOnGround && this._myParams.myIsFloatingValidIfRealOnGround) {\r\n this._myIsLeaning = false;\r\n this._myIsHopping = false;\r\n } else if (isLastOnGround && isVertical && this._myParams.myIsFloatingValidIfVerticalMovementAndRealOnGround) {\r\n this._myIsLeaning = false;\r\n this._myIsHopping = false;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (isHeadSynced) {\r\n if ((this.isSynced(this._myParams.mySyncPositionFlagMap) || this._myParams.myAlwaysSyncPositionWithReal) && !this._myParams.mySyncPositionDisabled &&\r\n (this._myPlayerLocomotionTeleport == null || !this._myPlayerLocomotionTeleport.isTeleporting())) {\r\n const newValidMovementDirection = PlayerTransformManager._updateValidToRealSV.newValidMovementDirection;\r\n const newValidVerticalMovementDirection = PlayerTransformManager._updateValidToRealSV.newValidVerticalMovementDirection;\r\n newPosition.vec3_sub(this._myValidPosition, newValidMovementDirection);\r\n if (newValidMovementDirection.vec3_removeComponentAlongAxis(transformUp, newValidVerticalMovementDirection).vec3_length() > 0.0001) {\r\n newValidMovementDirection.vec3_normalize(this._myLastValidMovementDirection);\r\n }\r\n\r\n this._myValidPosition.vec3_copy(newPosition);\r\n\r\n // This might cause motion sickness\r\n if (this._myParams.myApplyRealToValidAdjustmentsToRealPositionToo) {\r\n this.resetReal(true, false, false, false, false, false);\r\n }\r\n }\r\n\r\n // For now I've not found a valid reason not to always sync rotation, it shouldn't case any trouble even if the new direction collides a bit\r\n if (this.isSynced(this._myParams.mySyncRotationFlagMap)) {\r\n this.getRotationRealQuat(this._myValidRotationQuat);\r\n }\r\n }\r\n\r\n const newHeight = Math.pp_clamp(this.getHeightReal(), this._myParams.myMinHeight ?? undefined, this._myParams.myMaxHeight ?? undefined);\r\n this._myIsHeightColliding = false;\r\n // Height Colliding \r\n if (this._myParams.mySyncEnabledFlagMap.get(PlayerTransformManagerSyncFlag.HEIGHT_COLLIDING)) {\r\n const transformQuat = PlayerTransformManager._updateValidToRealSV.transformQuat;\r\n const transformUp = PlayerTransformManager._updateValidToRealSV.transformUp;\r\n const rotationQuat = PlayerTransformManager._updateValidToRealSV.rotationQuat;\r\n const horizontalDirection = PlayerTransformManager._updateValidToRealSV.horizontalDirection;\r\n this.getTransformQuat(transformQuat);\r\n transformQuat.quat2_getUp(transformUp);\r\n transformQuat.quat2_getRotationQuat(rotationQuat);\r\n this._myLastValidMovementDirection.vec3_removeComponentAlongAxis(transformUp, horizontalDirection);\r\n\r\n if (!horizontalDirection.vec3_isZero(0.00001)) {\r\n horizontalDirection.vec3_normalize(horizontalDirection);\r\n rotationQuat.quat_setUp(transformUp, horizontalDirection);\r\n transformQuat.quat2_setRotationQuat(rotationQuat);\r\n }\r\n\r\n const collisionRuntimeParams = PlayerTransformManager._updateValidToRealSV.collisionRuntimeParams;\r\n collisionRuntimeParams.copy(this._myCollisionRuntimeParams);\r\n const debugBackup = this._myParams.myMovementCollisionCheckParams.myDebugEnabled;\r\n const heightBackup = this._myParams.myMovementCollisionCheckParams.myHeight;\r\n this._myParams.myMovementCollisionCheckParams.myHeight = newHeight + this._myParams.myExtraHeight;\r\n this._myParams.myMovementCollisionCheckParams.myDebugEnabled = false;\r\n CollisionCheckBridge.getCollisionCheck(this._myParams.myEngine as any).positionCheck(true, transformQuat, this._myParams.myMovementCollisionCheckParams, collisionRuntimeParams);\r\n this._myParams.myMovementCollisionCheckParams.myDebugEnabled = debugBackup;\r\n this._myParams.myMovementCollisionCheckParams.myHeight = heightBackup;\r\n\r\n this._myIsHeightColliding = !collisionRuntimeParams.myIsPositionOk;\r\n }\r\n\r\n if (isHeadSynced) {\r\n if (this.isSynced(this._myParams.mySyncHeightFlagMap)) {\r\n this._myValidHeight = newHeight;\r\n this._updateCollisionHeight();\r\n }\r\n\r\n if (this._myParams.myPreventRealFromColliding) {\r\n this.resetReal(true, false, false, false, false, false);\r\n }\r\n }\r\n\r\n this._updateValidHeadToRealHead(dt);\r\n }\r\n\r\n private static readonly _updateValidHeadToRealHeadSV =\r\n {\r\n movementToCheck: vec3_create(),\r\n horizontalMovementToCheck: vec3_create(),\r\n verticalMovementToCheck: vec3_create(),\r\n position: vec3_create(),\r\n positionReal: vec3_create(),\r\n transformQuat: quat2_create(),\r\n collisionRuntimeParams: new CollisionRuntimeParams(),\r\n\r\n bodyRotationQuat: quat_create(),\r\n bodyUp: vec3_create(),\r\n bodyPosition: vec3_create(),\r\n\r\n newPositionHead: vec3_create(),\r\n\r\n backupHorizontalBlockLayerFlags: new PhysicsLayerFlags(),\r\n backupVerticalBlockLayerFlags: new PhysicsLayerFlags()\r\n };\r\n private _updateValidHeadToRealHead(dt: number): void {\r\n // If the head is not synced, only do the check to see if head is colliding, but do not actually change the valid position\r\n const isHeadSynced = this.getPlayerHeadManager().isSynced(this._myParams.myAllowUpdateValidToRealWhenBlurred);\r\n\r\n this._myIsHeadColliding = false;\r\n\r\n const backupHorizontalBlockLayerFlags = PlayerTransformManager._updateValidHeadToRealHeadSV.backupHorizontalBlockLayerFlags;\r\n const backupVerticalBlockLayerFlags = PlayerTransformManager._updateValidHeadToRealHeadSV.backupVerticalBlockLayerFlags;\r\n backupHorizontalBlockLayerFlags.copy(this._myHeadCollisionCheckParams.myHorizontalBlockLayerFlags);\r\n backupVerticalBlockLayerFlags.copy(this._myHeadCollisionCheckParams.myVerticalBlockLayerFlags);\r\n\r\n const backupVerticalMovementReduceEnabled = this._myHeadCollisionCheckParams.myVerticalMovementReduceEnabled;\r\n\r\n const backupGroundAngleToIgnore = this._myHeadCollisionCheckParams.myGroundAngleToIgnore;\r\n const backupGroundAngleToIgnoreWithPerceivedAngle = this._myHeadCollisionCheckParams.myGroundAngleToIgnoreWithPerceivedAngle;\r\n const backupHorizontalMovementGroundAngleIgnoreHeight = this._myHeadCollisionCheckParams.myHorizontalMovementGroundAngleIgnoreHeight;\r\n const backupHorizontalPositionGroundAngleIgnoreHeight = this._myHeadCollisionCheckParams.myHorizontalPositionGroundAngleIgnoreHeight;\r\n const backupHorizontalMovementGroundAngleIgnoreMaxMovementLeft = this._myHeadCollisionCheckParams.myHorizontalMovementGroundAngleIgnoreMaxMovementLeft;\r\n\r\n let headReducedVerticalMovementFeetAdjustment = false;\r\n\r\n const newPositionHead = PlayerTransformManager._updateValidHeadToRealHeadSV.newPositionHead;\r\n const positionReal = PlayerTransformManager._updateValidHeadToRealHeadSV.positionReal;\r\n\r\n // Head Colliding\r\n let firstHeadCollidingCheckDone = false;\r\n do {\r\n if (isHeadSynced) {\r\n if (firstHeadCollidingCheckDone && this._myResetHeadToFeetOnNextUpdateValidToReal) {\r\n this._myResetHeadToFeetOnNextUpdateValidToReal = false;\r\n this.resetHeadToFeet();\r\n }\r\n }\r\n\r\n let resetHeadToFeetDirty = this._myResetHeadToFeetDirty;\r\n\r\n if (this._myResetHeadToFeetOnNextUpdateValidToReal) {\r\n this._myValidPositionHead.vec3_copy(this._myValidPositionHeadBackupForResetToFeet);\r\n\r\n if (isHeadSynced) {\r\n this._myResetHeadToFeetDirty = false;\r\n }\r\n\r\n resetHeadToFeetDirty = false;\r\n }\r\n\r\n if (resetHeadToFeetDirty) {\r\n if (this._myParams.myHeadCollisionBlockLayerFlagsForResetToFeet != null) {\r\n this._myHeadCollisionCheckParams.myHorizontalBlockLayerFlags.copy(this._myParams.myHeadCollisionBlockLayerFlagsForResetToFeet);\r\n this._myHeadCollisionCheckParams.myVerticalBlockLayerFlags.copy(this._myParams.myHeadCollisionBlockLayerFlagsForResetToFeet);\r\n }\r\n\r\n if (this._myParams.myResetHeadToFeetMoveTowardReal) {\r\n this._myHeadCollisionCheckParams.myVerticalMovementReduceEnabled = true;\r\n }\r\n\r\n if (this._myParams.myResetHeadToFeetGroudnAngleIgnoreEnabled) {\r\n this._myHeadCollisionCheckParams.myGroundAngleToIgnore = this._myParams.myMovementCollisionCheckParams.myGroundAngleToIgnore;\r\n this._myHeadCollisionCheckParams.myGroundAngleToIgnoreWithPerceivedAngle = this._myParams.myMovementCollisionCheckParams.myGroundAngleToIgnoreWithPerceivedAngle;\r\n\r\n this._myHeadCollisionCheckParams.myHorizontalMovementGroundAngleIgnoreHeight = this._myParams.myMovementCollisionCheckParams.myHorizontalMovementGroundAngleIgnoreHeight;\r\n this._myHeadCollisionCheckParams.myHorizontalPositionGroundAngleIgnoreHeight = this._myParams.myMovementCollisionCheckParams.myHorizontalPositionGroundAngleIgnoreHeight;\r\n\r\n this._myHeadCollisionCheckParams.myHorizontalMovementGroundAngleIgnoreMaxMovementLeft = this._myParams.myMovementCollisionCheckParams.myHorizontalMovementGroundAngleIgnoreMaxMovementLeft;\r\n }\r\n\r\n if (isHeadSynced) {\r\n this._myResetHeadToFeetDirty = false;\r\n }\r\n } else {\r\n this._myHeadCollisionCheckParams.myHorizontalBlockLayerFlags.copy(backupHorizontalBlockLayerFlags);\r\n this._myHeadCollisionCheckParams.myVerticalBlockLayerFlags.copy(backupVerticalBlockLayerFlags);\r\n this._myHeadCollisionCheckParams.myVerticalMovementReduceEnabled = backupVerticalMovementReduceEnabled;\r\n\r\n this._myHeadCollisionCheckParams.myGroundAngleToIgnore = backupGroundAngleToIgnore;\r\n this._myHeadCollisionCheckParams.myGroundAngleToIgnoreWithPerceivedAngle = backupGroundAngleToIgnoreWithPerceivedAngle;\r\n this._myHeadCollisionCheckParams.myHorizontalMovementGroundAngleIgnoreHeight = backupHorizontalMovementGroundAngleIgnoreHeight;\r\n this._myHeadCollisionCheckParams.myHorizontalPositionGroundAngleIgnoreHeight = backupHorizontalPositionGroundAngleIgnoreHeight;\r\n this._myHeadCollisionCheckParams.myHorizontalMovementGroundAngleIgnoreMaxMovementLeft = backupHorizontalMovementGroundAngleIgnoreMaxMovementLeft;\r\n }\r\n\r\n const position = PlayerTransformManager._updateValidHeadToRealHeadSV.position;\r\n const movementToCheck = PlayerTransformManager._updateValidHeadToRealHeadSV.movementToCheck;\r\n this.getPositionHeadReal(positionReal).vec3_sub(this.getPositionHead(position), movementToCheck);\r\n\r\n const collisionRuntimeParams = PlayerTransformManager._updateValidHeadToRealHeadSV.collisionRuntimeParams;\r\n collisionRuntimeParams.reset();\r\n\r\n const transformQuat = PlayerTransformManager._updateValidHeadToRealHeadSV.transformQuat;\r\n this.getTransformHeadQuat(transformQuat); // Get eyes transform\r\n newPositionHead.vec3_copy(positionReal);\r\n\r\n let isHeadFar = false;\r\n if (this._myParams.myMaxDistanceFromHeadRealToSyncEnabled) {\r\n isHeadFar = movementToCheck.vec3_length() > this._myParams.myMaxDistanceFromHeadRealToSync;\r\n if (isHeadFar) {\r\n const horizontalMovementToCheck = PlayerTransformManager._updateValidHeadToRealHeadSV.horizontalMovementToCheck;\r\n const verticalMovementToCheck = PlayerTransformManager._updateValidHeadToRealHeadSV.verticalMovementToCheck;\r\n const bodyRotationQuat = PlayerTransformManager._updateValidHeadToRealHeadSV.bodyRotationQuat;\r\n const bodyUp = PlayerTransformManager._updateValidHeadToRealHeadSV.bodyUp;\r\n\r\n this.getRotationQuat(bodyRotationQuat);\r\n bodyRotationQuat.quat_getUp(bodyUp);\r\n movementToCheck.vec3_componentAlongAxis(bodyUp, verticalMovementToCheck);\r\n movementToCheck.vec3_sub(verticalMovementToCheck, horizontalMovementToCheck);\r\n\r\n isHeadFar = horizontalMovementToCheck.vec3_length() > this._myParams.myMaxDistanceFromHeadRealToSync;\r\n if (!isHeadFar) {\r\n const bodyPosition = PlayerTransformManager._updateValidHeadToRealHeadSV.bodyPosition;\r\n this.getPosition(bodyPosition);\r\n\r\n const bodyUpValue = bodyPosition.vec3_valueAlongAxis(bodyUp);\r\n const headUpValue = position.vec3_valueAlongAxis(bodyUp);\r\n const headRealUpValue = positionReal.vec3_valueAlongAxis(bodyUp);\r\n\r\n const isHeadBetweenBodyAndHeadReal = headRealUpValue >= headUpValue && headRealUpValue >= bodyUpValue && headUpValue >= (bodyUpValue - 0.0001);\r\n\r\n if (!isHeadBetweenBodyAndHeadReal) {\r\n // It's not a movement to get from feet to head, because the valid head is not between the feet and the real head\r\n isHeadFar = true;\r\n } else {\r\n const heightToCheck = this.getPlayerHeadManager().getHeightEyes() + this._myHeadCollisionCheckParams.myRadius;\r\n const isHeadRealBelowHeight = (headRealUpValue - bodyUpValue) <= heightToCheck;\r\n\r\n if (!isHeadRealBelowHeight) {\r\n // It's not a movement to get from feet to head, because the real head is actually higher\r\n isHeadFar = true;\r\n } else {\r\n isHeadFar = false;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (!isHeadFar && this._myParams.mySyncEnabledFlagMap.get(PlayerTransformManagerSyncFlag.HEAD_COLLIDING)) {\r\n CollisionCheckBridge.getCollisionCheck(this._myParams.myEngine as any).move(movementToCheck, transformQuat, this._myHeadCollisionCheckParams, collisionRuntimeParams);\r\n\r\n if (!collisionRuntimeParams.myHorizontalMovementCanceled && !collisionRuntimeParams.myVerticalMovementCanceled) {\r\n if (!backupVerticalMovementReduceEnabled && collisionRuntimeParams.myHasReducedVerticalMovement) {\r\n this._myIsHeadColliding = true;\r\n headReducedVerticalMovementFeetAdjustment = true;\r\n } else {\r\n this._myIsHeadColliding = false;\r\n }\r\n\r\n newPositionHead.vec3_copy(collisionRuntimeParams.myNewPosition);\r\n } else {\r\n this._myIsHeadColliding = true;\r\n }\r\n } else if (isHeadFar) {\r\n this._myIsHeadColliding = true;\r\n }\r\n\r\n firstHeadCollidingCheckDone = true;\r\n } while (this._myIsHeadColliding && isHeadSynced && this._myResetHeadToFeetOnNextUpdateValidToReal);\r\n\r\n {\r\n this._myHeadCollisionCheckParams.myHorizontalBlockLayerFlags.copy(backupHorizontalBlockLayerFlags);\r\n this._myHeadCollisionCheckParams.myVerticalBlockLayerFlags.copy(backupVerticalBlockLayerFlags);\r\n this._myHeadCollisionCheckParams.myVerticalMovementReduceEnabled = backupVerticalMovementReduceEnabled;\r\n\r\n this._myHeadCollisionCheckParams.myGroundAngleToIgnore = backupGroundAngleToIgnore;\r\n this._myHeadCollisionCheckParams.myGroundAngleToIgnoreWithPerceivedAngle = backupGroundAngleToIgnoreWithPerceivedAngle;\r\n this._myHeadCollisionCheckParams.myHorizontalMovementGroundAngleIgnoreHeight = backupHorizontalMovementGroundAngleIgnoreHeight;\r\n this._myHeadCollisionCheckParams.myHorizontalPositionGroundAngleIgnoreHeight = backupHorizontalPositionGroundAngleIgnoreHeight;\r\n this._myHeadCollisionCheckParams.myHorizontalMovementGroundAngleIgnoreMaxMovementLeft = backupHorizontalMovementGroundAngleIgnoreMaxMovementLeft;\r\n }\r\n\r\n if (isHeadSynced) {\r\n this._myResetHeadToFeetOnNextUpdateValidToReal = false;\r\n this._myResetHeadToFeetDirty = false;\r\n }\r\n\r\n if (this._myParams.myAlwaysSyncHeadPositionWithReal) {\r\n newPositionHead.vec3_copy(positionReal);\r\n }\r\n\r\n const backupIsHeadColliding = this._myIsHeadColliding;\r\n if (headReducedVerticalMovementFeetAdjustment) {\r\n // This is to allow the sync of the head if this is the only think preventing it\r\n this._myIsHeadColliding = false;\r\n }\r\n\r\n if (isHeadSynced) {\r\n if (this.isSynced(this._myParams.mySyncPositionHeadFlagMap) || this._myParams.myAlwaysSyncHeadPositionWithReal\r\n || (this.isSynced(this._myParams.mySyncPositionFlagMap) && this._myParams.myAlwaysSyncPositionWithReal)) {\r\n this._myValidPositionHead.vec3_copy(newPositionHead);\r\n this._myValidPositionHeadBackupForResetToFeet.vec3_copy(this._myValidPositionHead);\r\n }\r\n }\r\n\r\n if (headReducedVerticalMovementFeetAdjustment) {\r\n // Restoring it to colliding after\r\n this._myIsHeadColliding = backupIsHeadColliding;\r\n }\r\n }\r\n\r\n private _debugUpdate(dt: number): void {\r\n Globals.getDebugVisualManager(this._myParams.myEngine)!.drawPoint(0, this._myValidPosition, vec4_create(1, 0, 0, 1), 0.05);\r\n Globals.getDebugVisualManager(this._myParams.myEngine)!.drawLineEnd(0, this._myValidPosition, this.getPositionReal(), vec4_create(1, 0, 0, 1), 0.05);\r\n Globals.getDebugVisualManager(this._myParams.myEngine)!.drawLine(0, this._myValidPosition, this._myValidRotationQuat.quat_getForward(), 0.15, vec4_create(0, 1, 0, 1), 0.025);\r\n\r\n Globals.getDebugVisualManager(this._myParams.myEngine)!.drawPoint(0, this._myValidPositionHead, vec4_create(1, 1, 0, 1), 0.05);\r\n }\r\n\r\n public destroy(): void {\r\n this._myDestroyed = true;\r\n\r\n this.setActive(false);\r\n }\r\n\r\n public isDestroyed(): boolean {\r\n return this._myDestroyed;\r\n }\r\n}", "import { XRUtils } from \"../../../../../cauldron/utils/xr_utils.js\";\r\nimport { Handedness } from \"../../../../../input/cauldron/input_types.js\";\r\nimport { GamepadAxesID } from \"../../../../../input/gamepad/gamepad_buttons.js\";\r\nimport { quat_create, vec3_create } from \"../../../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Globals } from \"../../../../../pp/globals.js\";\r\n\r\nexport class PlayerLocomotionRotateParams {\r\n\r\n constructor(engine = Globals.getMainEngine()) {\r\n this.myPlayerTransformManager = null;\r\n\r\n this.myHorizontalRotationEnabled = true;\r\n this.myVerticalRotationEnabled = true;\r\n\r\n this.myMaxRotationSpeed = 0;\r\n this.myIsSnapTurn = false;\r\n this.mySnapTurnOnlyVR = false;\r\n this.mySnapTurnAngle = 0;\r\n\r\n this.mySmoothSnapEnabled = false;\r\n this.mySmoothSnapSpeedDegrees = 0;\r\n\r\n this.myRotationMinStickIntensityThreshold = 0;\r\n this.mySnapTurnActivateThreshold = 0;\r\n this.mySnapTurnResetThreshold = 0;\r\n\r\n this.myClampVerticalAngle = true;\r\n this.myMaxVerticalAngle = 89;\r\n\r\n this.myHandedness = Handedness.RIGHT;\r\n\r\n this.myEngine = engine;\r\n }\r\n}\r\n\r\nexport class PlayerLocomotionRotate {\r\n\r\n constructor(params) {\r\n this._myParams = params;\r\n\r\n this._mySnapCharge = false;\r\n\r\n this._mySmoothSnapHorizontalRunning = false;\r\n this._mySmoothSnapHorizontalAngleToPerform = 0;\r\n\r\n this._mySmoothSnapVerticalRunning = false;\r\n this._mySmoothSnapVerticalAngleToPerform = 0;\r\n\r\n //Globals.getEasyTuneVariables(this._myParams.myEngine).add(new EasyTuneNumber(\"Teleport Smooth Speed\", this._myParams.mySmoothSnapSpeedDegrees, 10, 3, 0, undefined, undefined, this._myParams.myEngine));\r\n }\r\n\r\n start() {\r\n\r\n }\r\n\r\n stop() {\r\n this._mySmoothSnapHorizontalRunning = false;\r\n this._mySmoothSnapHorizontalAngleToPerform = 0;\r\n\r\n this._mySmoothSnapVerticalRunning = false;\r\n this._mySmoothSnapVerticalAngleToPerform = 0;\r\n }\r\n\r\n getParams() {\r\n return this._myParams;\r\n }\r\n\r\n update(dt) {\r\n //this._myParams.mySmoothSnapSpeedDegrees = Globals.getEasyTuneVariables(this._myParams.myEngine).get(\"Teleport Smooth Speed\");\r\n\r\n if (this._myParams.myHorizontalRotationEnabled) {\r\n this._rotateHeadHorizontally(dt);\r\n }\r\n\r\n if (this._myParams.myVerticalRotationEnabled && this._myParams.myPlayerTransformManager.getPlayerHeadManager().canRotateHead()) {\r\n this._rotateHeadVertically(dt);\r\n }\r\n }\r\n\r\n _rotateHeadHorizontally(dt) {\r\n // Implemented outside class definition\r\n }\r\n\r\n _rotateHeadVertically(dt) {\r\n // Implemented outside class definition\r\n }\r\n}\r\n\r\n\r\n\r\n// IMPLEMENTATION\r\n\r\nPlayerLocomotionRotate.prototype._rotateHeadHorizontally = function () {\r\n let playerRotationQuat = quat_create();\r\n let playerUp = vec3_create();\r\n let headRotation = quat_create();\r\n return function _rotateHeadHorizontally(dt) {\r\n playerUp = this._myParams.myPlayerTransformManager.getRotationQuat(playerRotationQuat).quat_getUp(playerUp);\r\n\r\n headRotation.quat_identity();\r\n\r\n let axes = Globals.getGamepads(this._myParams.myEngine)[this._myParams.myHandedness].getAxesInfo(GamepadAxesID.THUMBSTICK).getAxes();\r\n\r\n if (!this._myParams.myIsSnapTurn || (this._myParams.mySnapTurnOnlyVR && !XRUtils.isSessionActive(this._myParams.myEngine))) {\r\n if (Math.abs(axes[0]) > this._myParams.myRotationMinStickIntensityThreshold) {\r\n let rotationIntensity = -axes[0];\r\n let speed = Math.pp_lerp(0, this._myParams.myMaxRotationSpeed, Math.abs(rotationIntensity)) * Math.pp_sign(rotationIntensity);\r\n\r\n headRotation.quat_fromAxis(speed * dt, playerUp);\r\n }\r\n } else {\r\n if (!this._mySnapCharge) {\r\n if (Math.abs(axes.vec2_length()) < this._myParams.mySnapTurnResetThreshold) {\r\n this._mySnapCharge = true;\r\n }\r\n } else if (!this._mySmoothSnapHorizontalRunning) {\r\n if (Math.abs(axes[0]) > this._myParams.mySnapTurnActivateThreshold) {\r\n let angleToRotate = -Math.pp_sign(axes[0]) * this._myParams.mySnapTurnAngle;\r\n\r\n if (!this._myParams.mySmoothSnapEnabled) {\r\n headRotation.quat_fromAxis(angleToRotate, playerUp);\r\n } else {\r\n this._mySmoothSnapHorizontalRunning = true;\r\n this._mySmoothSnapHorizontalAngleToPerform = angleToRotate;\r\n }\r\n\r\n this._mySnapCharge = false;\r\n }\r\n }\r\n }\r\n\r\n if (this._mySmoothSnapHorizontalRunning) {\r\n let angleToRotate = Math.pp_sign(this._mySmoothSnapHorizontalAngleToPerform) * (this._myParams.mySmoothSnapSpeedDegrees * dt);\r\n if (Math.abs(angleToRotate) > Math.abs(this._mySmoothSnapHorizontalAngleToPerform) - Math.PP_EPSILON) {\r\n angleToRotate = this._mySmoothSnapHorizontalAngleToPerform;\r\n }\r\n\r\n headRotation.quat_fromAxis(angleToRotate, playerUp);\r\n this._mySmoothSnapHorizontalAngleToPerform -= angleToRotate;\r\n\r\n if (Math.abs(this._mySmoothSnapHorizontalAngleToPerform) < Math.PP_EPSILON) {\r\n this._mySmoothSnapHorizontalRunning = false;\r\n this._mySmoothSnapHorizontalAngleToPerform = 0;\r\n }\r\n }\r\n\r\n if (headRotation.quat_getAngle() > Math.PP_EPSILON_DEGREES) {\r\n this._myParams.myPlayerTransformManager.rotateQuat(headRotation);\r\n }\r\n };\r\n}();\r\n\r\nPlayerLocomotionRotate.prototype._rotateHeadVertically = function () {\r\n let headForward = vec3_create();\r\n let headUp = vec3_create();\r\n\r\n let playerRotationQuat = quat_create();\r\n let referenceUp = vec3_create();\r\n let referenceUpNegate = vec3_create();\r\n let referenceRight = vec3_create();\r\n let newUp = vec3_create();\r\n let headRotation = quat_create();\r\n return function _rotateHeadVertically(dt) {\r\n let head = this._myParams.myPlayerTransformManager.getPlayerHeadManager().getHead();\r\n\r\n headForward = head.pp_getForward(headForward);\r\n headUp = head.pp_getUp(headUp);\r\n\r\n referenceUp = this._myParams.myPlayerTransformManager.getRotationRealQuat(playerRotationQuat).quat_getUp(referenceUp);\r\n referenceUpNegate = referenceUp.vec3_negate(referenceUpNegate);\r\n referenceRight = headForward.vec3_cross(referenceUp, referenceRight);\r\n\r\n let minAngle = 1;\r\n if (headForward.vec3_angle(referenceUp) < minAngle) {\r\n referenceRight = headUp.vec3_negate(referenceRight).vec3_cross(referenceUp, referenceRight);\r\n } else if (headForward.vec3_angle(referenceUpNegate) < minAngle) {\r\n referenceRight = headUp.vec3_cross(referenceUp, referenceRight);\r\n } else if (!headUp.vec3_isConcordant(referenceUp)) {\r\n referenceRight.vec3_negate(referenceRight);\r\n }\r\n\r\n referenceRight.vec3_normalize(referenceRight);\r\n\r\n let axes = Globals.getGamepads(this._myParams.myEngine)[this._myParams.myHandedness].getAxesInfo(GamepadAxesID.THUMBSTICK).getAxes();\r\n let angleToRotate = 0;\r\n\r\n if (!this._myParams.myIsSnapTurn || (this._myParams.mySnapTurnOnlyVR && !XRUtils.isSessionActive(this._myParams.myEngine))) {\r\n if (Math.abs(axes[1]) > this._myParams.myRotationMinStickIntensityThreshold) {\r\n let rotationIntensity = axes[1];\r\n angleToRotate = Math.pp_lerp(0, this._myParams.myMaxRotationSpeed, Math.abs(rotationIntensity)) * Math.pp_sign(rotationIntensity) * dt;\r\n }\r\n } else {\r\n if (!this._mySnapCharge) {\r\n if (Math.abs(axes.vec2_length()) < this._myParams.mySnapTurnResetThreshold) {\r\n this._mySnapCharge = true;\r\n }\r\n } else if (!this._mySmoothSnapVerticalRunning) {\r\n if (Math.abs(axes[1]) > this._myParams.mySnapTurnActivateThreshold) {\r\n angleToRotate = Math.pp_sign(axes[1]) * this._myParams.mySnapTurnAngle;\r\n\r\n // Adjust rotation to closest snap step\r\n\r\n let angleWithUp = Math.pp_angleClamp(headUp.vec3_angleSigned(referenceUp, referenceRight));\r\n let snapStep = Math.round(angleWithUp / this._myParams.mySnapTurnAngle);\r\n\r\n let snapAngle = Math.pp_angleClamp(snapStep * this._myParams.mySnapTurnAngle);\r\n let angleToAlign = -Math.pp_angleDistanceSigned(angleWithUp, snapAngle);\r\n\r\n if (Math.abs(angleToAlign) > 1) {\r\n if (Math.pp_sign(angleToRotate) == Math.pp_sign(angleToAlign)) {\r\n angleToRotate = angleToAlign;\r\n } else {\r\n angleToRotate = (-Math.pp_sign(angleToAlign) * this._myParams.mySnapTurnAngle) + angleToAlign;\r\n }\r\n } else if (Math.abs(angleToAlign) > Math.PP_EPSILON_DEGREES) {\r\n angleToRotate += angleToAlign;\r\n }\r\n\r\n if (this._myParams.mySmoothSnapEnabled) {\r\n this._mySmoothSnapVerticalRunning = true;\r\n this._mySmoothSnapVerticalAngleToPerform = angleToRotate;\r\n }\r\n\r\n this._mySnapCharge = false;\r\n }\r\n }\r\n }\r\n\r\n if (this._mySmoothSnapVerticalRunning) {\r\n angleToRotate = Math.pp_sign(this._mySmoothSnapVerticalAngleToPerform) * (this._myParams.mySmoothSnapSpeedDegrees * dt);\r\n if (Math.abs(angleToRotate) > Math.abs(this._mySmoothSnapVerticalAngleToPerform) - Math.PP_EPSILON) {\r\n angleToRotate = this._mySmoothSnapVerticalAngleToPerform;\r\n }\r\n\r\n this._mySmoothSnapVerticalAngleToPerform -= angleToRotate;\r\n\r\n if (Math.abs(this._mySmoothSnapVerticalAngleToPerform) < Math.PP_EPSILON) {\r\n this._mySmoothSnapVerticalRunning = false;\r\n this._mySmoothSnapVerticalAngleToPerform = 0;\r\n }\r\n }\r\n\r\n if (angleToRotate != 0) {\r\n headRotation.quat_fromAxis(angleToRotate, referenceRight);\r\n this._myParams.myPlayerTransformManager.getPlayerHeadManager().rotateHeadQuat(headRotation);\r\n\r\n if (this._myParams.myClampVerticalAngle) {\r\n let maxVerticalAngle = Math.max(0, this._myParams.myMaxVerticalAngle - 0.0001);\r\n newUp = head.pp_getUp(newUp);\r\n let angleWithUp = Math.pp_angleClamp(newUp.vec3_angleSigned(referenceUp, referenceRight));\r\n if (Math.abs(angleWithUp) > maxVerticalAngle) {\r\n let fixAngle = (Math.abs(angleWithUp) - maxVerticalAngle) * Math.pp_sign(angleWithUp);\r\n headRotation.quat_fromAxis(fixAngle, referenceRight);\r\n this._myParams.myPlayerTransformManager.getPlayerHeadManager().rotateHeadQuat(headRotation);\r\n }\r\n }\r\n }\r\n };\r\n}();", "export class PlayerLocomotionMovementRuntimeParams {\r\n\r\n constructor() {\r\n this.myIsFlying = false;\r\n this.myGravitySpeed = 0;\r\n\r\n this.myIsTeleportDetecting = false;\r\n this.myIsTeleporting = false;\r\n this.myTeleportJustPerformed = false;\r\n }\r\n}\r\n\r\nexport class PlayerLocomotionMovement {\r\n\r\n constructor(locomotionRuntimeParams) {\r\n this._myLocomotionRuntimeParams = locomotionRuntimeParams;\r\n\r\n this._myActive = false;\r\n }\r\n\r\n getRuntimeParams() {\r\n return this._myLocomotionRuntimeParams;\r\n }\r\n\r\n start() {\r\n\r\n }\r\n\r\n stop() {\r\n\r\n }\r\n\r\n setActive(active) {\r\n this._myActive = active;\r\n }\r\n\r\n isActive() {\r\n return this._myActive;\r\n }\r\n\r\n canStop() {\r\n return true;\r\n }\r\n}", "import { Emitter, Material, Object3D, PhysXComponent, WonderlandEngine } from \"@wonderlandengine/api\";\r\nimport { FSM } from \"../../../../../cauldron/fsm/fsm.js\";\r\nimport { PhysicsLayerFlags } from \"../../../../../cauldron/physics/physics_layer_flags.js\";\r\nimport { EasingFunction, MathUtils } from \"../../../../../cauldron/utils/math_utils.js\";\r\nimport { XRUtils } from \"../../../../../cauldron/utils/xr_utils.js\";\r\nimport { Handedness } from \"../../../../../input/cauldron/input_types.js\";\r\nimport { InputUtils } from \"../../../../../input/cauldron/input_utils.js\";\r\nimport { GamepadUtils } from \"../../../../../input/gamepad/cauldron/gamepad_utils.js\";\r\nimport { Gamepad } from \"../../../../../input/gamepad/gamepad.js\";\r\nimport { GamepadButtonID } from \"../../../../../input/gamepad/gamepad_buttons.js\";\r\nimport { vec3_create } from \"../../../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Globals } from \"../../../../../pp/globals.js\";\r\nimport { CharacterColliderSetupSimplifiedCreationAccuracyLevel, CharacterColliderSetupSimplifiedCreationParams, CharacterColliderSetupUtils } from \"../../../character_controller/collision/character_collider_setup_utils.js\";\r\nimport { CollisionCheckBridge } from \"../../../character_controller/collision/collision_check_bridge.js\";\r\nimport { CollisionCheckParams } from \"../../../character_controller/collision/legacy/collision_check/collision_params.js\";\r\nimport { NonVRReferenceSpaceMode, PlayerHeadManager, PlayerHeadManagerParams } from \"./player_head_manager.js\";\r\nimport { PlayerLocomotionMovementRuntimeParams } from \"./player_locomotion_movement.js\";\r\nimport { PlayerLocomotionRotate, PlayerLocomotionRotateParams } from \"./player_locomotion_rotate.js\";\r\nimport { PlayerLocomotionSmooth, PlayerLocomotionSmoothParams } from \"./player_locomotion_smooth.js\";\r\nimport { PlayerObscureManager, PlayerObscureManagerParams } from \"./player_obscure_manager.js\";\r\nimport { PlayerTransformManager, PlayerTransformManagerParams, PlayerTransformManagerSyncFlag } from \"./player_transform_manager.js\";\r\nimport { PlayerLocomotionTeleport, PlayerLocomotionTeleportParams } from \"./teleport/player_locomotion_teleport.js\";\r\nimport { PlayerLocomotionTeleportTeleportType } from \"./teleport/player_locomotion_teleport_teleport_state.js\";\r\n\r\nexport enum PlayerLocomotionDirectionReferenceType {\r\n HEAD = 0,\r\n HAND = 1,\r\n CUSTOM_OBJECT = 2\r\n}\r\n\r\nexport enum PlayerLocomotionType {\r\n SMOOTH = 0,\r\n TELEPORT = 1\r\n}\r\n\r\nexport class PlayerLocomotionParams {\r\n\r\n public myDefaultLocomotionType: number = PlayerLocomotionType.SMOOTH;\r\n public myAlwaysSmoothForNonVR: boolean = true;\r\n\r\n /** Double press main hand thumbstick (default: left) to switch */\r\n public mySwitchLocomotionTypeShortcutEnabled: boolean = true;\r\n\r\n public myStartIdle: boolean = false;\r\n\r\n\r\n public myPhysicsBlockLayerFlags: Readonly = new PhysicsLayerFlags();\r\n\r\n\r\n public myDefaultHeight: number = 0;\r\n public myMinHeight: number = 0;\r\n public myCharacterRadius: number = 0;\r\n\r\n /** Set this to `null` to auto compute the feet radius based on {@link myCharacterRadius} */\r\n public myCharacterFeetRadius: number | null = null;\r\n\r\n public myForeheadExtraHeight: number = 0;\r\n\r\n\r\n public myMaxSpeed: number = 0;\r\n public myMaxRotationSpeed: number = 0;\r\n public mySpeedSlowDownPercentageOnWallSlid: number = 1;\r\n\r\n\r\n public myGravityAcceleration: number = 0;\r\n public myMaxGravitySpeed: number = 0;\r\n\r\n\r\n public myIsSnapTurn: boolean = false;\r\n public mySnapTurnOnlyVR: boolean = false;\r\n public mySnapTurnAngle: number = 0;\r\n public mySnapTurnSpeedDegrees: number = 0;\r\n\r\n\r\n public myFlyEnabled: boolean = false;\r\n public myStartFlying: boolean = false;\r\n public myFlyWithButtonsEnabled: boolean = false;\r\n public myFlyWithViewAngleEnabled: boolean = false;\r\n public myMinAngleToFlyUpNonVR: number = 0;\r\n public myMinAngleToFlyDownNonVR: number = 0;\r\n public myMinAngleToFlyUpVR: number = 0;\r\n public myMinAngleToFlyDownVR: number = 0;\r\n public myMinAngleToFlyRight: number = 0;\r\n\r\n\r\n public myMainHand: Handedness = Handedness.LEFT;\r\n public myDirectionInvertForwardWhenUpsideDown: boolean = true;\r\n public myVRDirectionReferenceType: PlayerLocomotionDirectionReferenceType = PlayerLocomotionDirectionReferenceType.HEAD;\r\n public myVRDirectionReferenceObject: Readonly | null = null;\r\n\r\n\r\n public myTeleportType: number = PlayerLocomotionTeleportTeleportType.INSTANT;\r\n public myTeleportMaxDistance: number = 0;\r\n public myTeleportMaxHeightDifference: number = 0;\r\n public myTeleportFloorLayerFlags: Readonly = new PhysicsLayerFlags();\r\n public myTeleportRotationOnUpEnabled: boolean = false;\r\n public myTeleportValidMaterial: Readonly | null = null;\r\n public myTeleportInvalidMaterial: Readonly | null = null;\r\n public myTeleportPositionObject: Readonly | null = null;\r\n public myTeleportPositionObjectRotateWithHead: boolean = false;\r\n public myTeleportParableStartReferenceObject: Readonly | null = null;\r\n\r\n\r\n public myResetRealOnStart: boolean = true;\r\n\r\n /**\r\n * #WARN With `_myResetRealOnStartFramesAmount` at `1` it can happen that you enter the session like 1 frame before the game load\r\n * and the head pose might have not been properly initialized yet in the WebXR API, so the reset real will not happen has expected \r\n * Since this is a sort of edge case (either u enter after the load, or you were already in for more than 2-3 frames), and that\r\n * setting this to more than `1` can cause a visible (even if very short) stutter after the load (due to resetting the head multiple times),\r\n * it's better to keep this value at `1` \r\n * A possible effect of the edge case is the view being obscured on start because it thinks you are colliding\r\n * \r\n * A value of `3` will make u sure that the head pose will be initialized and the reset real will happen as expected in any case \r\n * For example, if u have a total fade at start and nothing can be seen aside the clear color for at least, let's say, 10 frames, \r\n * you can set this to `3` safely, since there will be no visible stutter to be seen (beside the clear color)\r\n */\r\n public myResetRealOnStartFramesAmount: number = 1;\r\n\r\n /** Can fix some head through floor issues, when you can move your head completely to the other side of the floor \r\n If the floors are thick enough that this can't happen, you can leave this to false */\r\n public myResetHeadToFeetInsteadOfReal: boolean = false;\r\n\r\n public myResetHeadToRealMinDistance: number = 0;\r\n\r\n public myMaxHeadToRealHeadSteps: number | null = null;\r\n\r\n\r\n /** Valid means, for example, that the real player has not moved inside a wall by moving in the real space */\r\n public mySyncWithRealWorldPositionOnlyIfValid: boolean = true;\r\n\r\n /** Valid means, for example, that the real player has not moved inside a wall by moving in the real space */\r\n public mySyncWithRealHeightOnlyIfValid: boolean = true;\r\n\r\n public mySnapRealPositionToGround: boolean = false;\r\n public myPreventRealFromColliding: boolean = false;\r\n\r\n public myViewOcclusionInsideWallsEnabled: boolean = true;\r\n public myViewOcclusionLayerFlags: Readonly = new PhysicsLayerFlags();\r\n\r\n /**\r\n * To avoid occlusion issues when moving when touching a tilted ceiling (which is not commong anyway), \r\n * this value should be a bit lower than {@link myCharacterFeetRadius}\r\n * \r\n * If you have a high camera near value, you might need to increase this value, even though the view occlusion might become more aggressive\r\n */\r\n public myViewOcclusionHeadRadius: number = 0;\r\n\r\n /**\r\n * Half of this value should be a bit lower than {@link myForeheadExtraHeight} plus {@link myColliderExtraHeight}, otherwise view occlusion might \r\n * trigger simply when moving under a low ceiling\r\n * \r\n * If you have a high camera near value, you might need to increase this value, even though the view occlusion might become more aggressive\r\n */\r\n public myViewOcclusionHeadHeight: number = 0;\r\n\r\n public myViewOcclusionFadeOutSeconds: number = 0;\r\n public myViewOcclusionMaxRealHeadDistance: number = 0;\r\n\r\n public mySyncNonVRHeightWithVROnExitSession: boolean = false;\r\n public mySyncNonVRVerticalAngleWithVROnExitSession: boolean = false;\r\n\r\n\r\n public mySyncHeadWithRealAfterLocomotionUpdateIfNeeded: boolean = false;\r\n\r\n\r\n\r\n public myColliderAccuracy: number = CharacterColliderSetupSimplifiedCreationAccuracyLevel.VERY_LOW;\r\n\r\n /**\r\n * If you enable this, you might also want to disable {@link myColliderCheckCeilings}, \r\n * since it doesn't make much sense to check for ceilings when not checking the height\r\n */\r\n public myColliderCheckOnlyFeet: boolean = false;\r\n\r\n /**\r\n * If you enable this, you might also want to disable {@link myColliderCheckOnlyFeet}, \r\n * since it doesn't make much sense to check for ceilings without also checking the height\r\n */\r\n public myColliderCheckCeilings: boolean = false;\r\n\r\n public myColliderSlideAlongWall: boolean = false;\r\n public myColliderMaxWalkableGroundAngle: number = 0;\r\n\r\n /**\r\n * This is useful if you want the locomotion teleport feature to be able to go downhill\r\n * on surfaces steeper than {@link myColliderMaxWalkableGroundAngle}\r\n * \r\n * By default the locomotion teleport can't go up on surfaces steeper than {@link myColliderMaxWalkableGroundAngle} anyway,\r\n * no matter, the value of {@link myColliderMaxTeleportableGroundAngle}\r\n * \r\n * If you set this to a value bigger than {@link myColliderMaxWalkableGroundAngle} you will be able to teleport in any case on steeper surfaces,\r\n * so be careful if you want that, even though usually it's safe, since teleport positions, aside from the locomotion teleport ones, are predefined and\r\n * safe positions\r\n * \r\n * The idea is that with the locomotion smooth you can always go downhill but might no be able to climb back up due to the surface beeing steep,\r\n * this sort of replicates that for the locomotion, letting you teleport down on steep surfaces but not up\r\n */\r\n public myColliderMaxTeleportableGroundAngle: number | null = null;\r\n public myColliderSnapOnGround: boolean = false;\r\n public myColliderMaxDistanceToSnapOnGround: number = 0;\r\n public myColliderMaxDistanceToPopOutGround: number = 0;\r\n public myColliderMaxWalkableGroundStepHeight: number = 0;\r\n\r\n /**\r\n * Allowing walkable steps on ceiling might create issues with view occlusion for the player (especially with a high value) \r\n * since you can go more under some low ceiling making the occlusion head collide with it\r\n * \r\n * Settings it to zero is safer, but means that the ceilings physx must be more flat, because it's easier that a small ceiling bump now blocks you\r\n * \r\n * If you want this to be higher than 0, you might also want to increase {@link myColliderExtraHeight} by this value to avoid issue with view occlusion\r\n * It will need you to be further from ceiling to be able to move under them tho (since it will be like wearing a hat as tall as {@link myColliderExtraHeight})\r\n */\r\n public myColliderMaxWalkableCeilingStepHeight: number = 0;\r\n public myColliderPreventFallingFromEdges: boolean = false;\r\n public myColliderMaxMovementSteps: number | null = null;\r\n\r\n /**\r\n * Helps staying a little further from the ceiling\r\n * \r\n * If you need to increase {@link myViewOcclusionHeadRadius}, also increasing this can help preventing view occlusion happening when shouldn't\r\n */\r\n public myColliderExtraHeight: number = 0;\r\n\r\n\r\n\r\n /** Main hand (default: left) select + thumbstick press, auto switch to smooth */\r\n public myDebugFlyShortcutEnabled: boolean = false;\r\n\r\n public myDebugFlyMaxSpeedMultiplier: number = 5;\r\n\r\n /** Main hand (default: left) thumbstick pressed while moving */\r\n public myMoveThroughCollisionShortcutEnabled: boolean = false;\r\n\r\n /** Not main hand (default: right) thumbstick pressed while moving */\r\n public myMoveHeadShortcutEnabled: boolean = false;\r\n\r\n /** Main hand (default: left) select pressed while moving */\r\n public myTripleSpeedShortcutEnabled: boolean = false;\r\n\r\n\r\n public myDebugHorizontalEnabled: boolean = false;\r\n public myDebugVerticalEnabled: boolean = false;\r\n\r\n public myCollisionCheckDisabled: boolean = false;\r\n\r\n public myEngine: Readonly;\r\n\r\n\r\n constructor(engine: Readonly = Globals.getMainEngine()!) {\r\n this.myEngine = engine;\r\n }\r\n}\r\n\r\n\r\n// #TODO Add lerped snap on vertical over like half a second to avoid the \"snap effect\"\r\n// This could be done by detatching the actual vertical position of the player from the collision real one when a snap is detected above a certain threshold\r\n// with a timer, after which the vertical position is just copied, while during the detatching is lerped toward the collision vertical one\r\n/**\r\n * Tips \r\n * - Be sure that your colliders has faces on both sides of the mesh, this helps the collision check which otherise might be able to move through walls\r\n */\r\nexport class PlayerLocomotion {\r\n\r\n private readonly _myParams: PlayerLocomotionParams;\r\n\r\n private readonly _myPlayerHeadManager: PlayerHeadManager;\r\n private readonly _myPlayerTransformManager: PlayerTransformManager;\r\n private readonly _myPlayerLocomotionRotate: PlayerLocomotionRotate;\r\n private readonly _myPlayerLocomotionSmooth: PlayerLocomotionSmooth;\r\n private readonly _myPlayerLocomotionTeleport: PlayerLocomotionTeleport;\r\n private readonly _myPlayerObscureManager: PlayerObscureManager;\r\n\r\n private readonly _myLocomotionMovementFSM: FSM = new FSM();\r\n\r\n private _mySwitchToTeleportOnEnterSession: boolean = false;\r\n\r\n private _myActive: boolean = false;\r\n private _myStarted: boolean = false;\r\n private _myIdle: boolean = false;\r\n\r\n private _myResetRealOnStartCounter: number = 0;\r\n\r\n private readonly _myPreUpdateEmitter: Emitter<[number, PlayerLocomotion]> = new Emitter();\r\n private readonly _myPostUpdateEmitter: Emitter<[number, PlayerLocomotion]> = new Emitter();\r\n\r\n private _myDestroyed: boolean = false;\r\n\r\n constructor(params: PlayerLocomotionParams) {\r\n this._myParams = params;\r\n\r\n const collisionCheckParamsMovement = this._setupCollisionCheckParamsMovement();\r\n\r\n const movementRuntimeParams = new PlayerLocomotionMovementRuntimeParams();\r\n movementRuntimeParams.myIsFlying = this._myParams.myStartFlying;\r\n\r\n {\r\n const params = new PlayerHeadManagerParams(this._myParams.myEngine as any);\r\n\r\n params.mySessionChangeResyncEnabled = true;\r\n\r\n params.myBlurEndResyncEnabled = true;\r\n params.myBlurEndResyncRotation = false;\r\n\r\n params.myEnterSessionResyncHeight = false;\r\n params.myExitSessionResyncHeight = this._myParams.mySyncNonVRHeightWithVROnExitSession;\r\n params.myExitSessionResyncVerticalAngle = this._myParams.mySyncNonVRVerticalAngleWithVROnExitSession;\r\n params.myExitSessionRemoveRightTilt = true;\r\n params.myExitSessionAdjustMaxVerticalAngle = true;\r\n params.myExitSessionMaxVerticalAngle = 90;\r\n\r\n params.myNonVRFloorBasedMode = NonVRReferenceSpaceMode.FLOOR_THEN_KEEP_VR;\r\n\r\n params.myDefaultHeightNonVR = this._myParams.myDefaultHeight;\r\n params.myDefaultHeightVRWithoutFloor = this._myParams.myDefaultHeight;\r\n params.myForeheadExtraHeight = this._myParams.myForeheadExtraHeight;\r\n\r\n params.myFeetRotationKeepUp = true;\r\n\r\n params.myDebugEnabled = false;\r\n\r\n this._myPlayerHeadManager = new PlayerHeadManager(params);\r\n }\r\n\r\n {\r\n const params = new PlayerTransformManagerParams(this._myParams.myEngine);\r\n\r\n params.myPlayerHeadManager = this._myPlayerHeadManager;\r\n\r\n params.myMovementCollisionCheckParams = collisionCheckParamsMovement;\r\n params.myTeleportCollisionCheckParams = null;\r\n params.myTeleportCollisionCheckParamsCopyFromMovement = true;\r\n params.myTeleportCollisionCheckParamsCheck360 = true;\r\n params.myTeleportCollisionCheckParamsGroundAngleToIgnore = this._myParams.myColliderMaxTeleportableGroundAngle;\r\n\r\n params.myHeadCollisionBlockLayerFlags.copy(this._myParams.myViewOcclusionLayerFlags);\r\n params.myHeadCollisionObjectsToIgnore.pp_copy(params.myMovementCollisionCheckParams.myHorizontalObjectsToIgnore as any);\r\n const objectsEqualCallback = (first: Readonly, second: Readonly): boolean => first == second;\r\n for (const objectToIgnore of params.myMovementCollisionCheckParams.myVerticalObjectsToIgnore) {\r\n params.myHeadCollisionObjectsToIgnore.pp_pushUnique(objectToIgnore, objectsEqualCallback);\r\n }\r\n\r\n // To avoid obscure issues when moving when touching a tilted ceiling (which is not commong anyway)\r\n // This would be better to be less or equal than the feet radius of the character\r\n params.myHeadRadius = this._myParams.myViewOcclusionHeadRadius;\r\n params.myHeadHeight = this._myParams.myViewOcclusionHeadHeight;\r\n params.myExtraHeight = this._myParams.myColliderExtraHeight;\r\n\r\n if (!this._myParams.mySyncWithRealWorldPositionOnlyIfValid) {\r\n params.mySyncEnabledFlagMap.set(PlayerTransformManagerSyncFlag.BODY_COLLIDING, false);\r\n params.mySyncEnabledFlagMap.set(PlayerTransformManagerSyncFlag.FAR, false);\r\n params.mySyncEnabledFlagMap.set(PlayerTransformManagerSyncFlag.FLOATING, false);\r\n\r\n params.myAlwaysSyncPositionWithReal = true;\r\n }\r\n\r\n if (!this._myParams.mySyncWithRealHeightOnlyIfValid) {\r\n params.mySyncEnabledFlagMap.set(PlayerTransformManagerSyncFlag.HEIGHT_COLLIDING, false);\r\n }\r\n\r\n if (!this._myParams.myViewOcclusionInsideWallsEnabled) {\r\n params.mySyncEnabledFlagMap.set(PlayerTransformManagerSyncFlag.HEAD_COLLIDING, false);\r\n\r\n params.myAlwaysSyncHeadPositionWithReal = true;\r\n\r\n params.myUpdatePositionHeadValid = false;\r\n params.myUpdateRealPositionHeadValid = false;\r\n }\r\n\r\n params.myApplyRealToValidAdjustmentsToRealPositionToo = this._myParams.mySnapRealPositionToGround;\r\n params.myPreventRealFromColliding = this._myParams.myPreventRealFromColliding;\r\n\r\n params.myMaxDistanceFromRealToSyncEnabled = true;\r\n params.myMaxDistanceFromRealToSync = 0.5;\r\n params.myMaxDistanceFromHeadRealToSyncEnabled = true;\r\n params.myMaxDistanceFromHeadRealToSync = 0.75;\r\n if (params.myMovementCollisionCheckParams.mySplitMovementEnabled &&\r\n params.myMovementCollisionCheckParams.mySplitMovementMaxStepsEnabled &&\r\n params.myMovementCollisionCheckParams.mySplitMovementMaxLengthEnabled) {\r\n // A bit more of the max movement you can perform, so that the head always have space to move back to the real one\r\n params.myMaxDistanceFromHeadRealToSync = Math.max(params.myMaxDistanceFromHeadRealToSync, 1.1 * (params.myMovementCollisionCheckParams.mySplitMovementMaxSteps * params.myMovementCollisionCheckParams.mySplitMovementMaxLength));\r\n }\r\n\r\n params.myIsFloatingValidIfVerticalMovement = false;\r\n params.myIsFloatingValidIfVerticalMovementAndRealOnGround = false;\r\n params.myIsFloatingValidIfSteepGround = false;\r\n params.myIsFloatingValidIfVerticalMovementAndSteepGround = false;\r\n params.myIsFloatingValidIfRealOnGround = false;\r\n params.myFloatingSplitCheckEnabled = true;\r\n params.myFloatingSplitCheckMinLength = collisionCheckParamsMovement.myFeetRadius * 1.5;\r\n params.myFloatingSplitCheckMaxLength = params.myFloatingSplitCheckMinLength;\r\n\r\n params.myRealMovementAllowVerticalAdjustments = true;\r\n params.myIgnoreUpwardMovementToRealIfValidOnGround = true;\r\n\r\n params.myUpdateRealPositionValid = false;\r\n params.myUpdatePositionValid = false;\r\n\r\n params.myMinHeight = this._myParams.myMinHeight;\r\n\r\n params.myIsBodyCollidingWhenHeightBelowValue = null;\r\n params.myIsBodyCollidingWhenHeightAboveValue = null;\r\n\r\n params.myResetToValidOnEnterSession = true;\r\n params.myResetToValidOnExitSession = true;\r\n params.myResetToValidOnSessionHiddenEnd = true;\r\n\r\n params.myAlwaysResetRealPositionNonVR = true;\r\n params.myAlwaysResetRealRotationNonVR = true;\r\n params.myAlwaysResetRealHeightNonVR = true;\r\n\r\n params.myAlwaysResetRealPositionVR = false;\r\n params.myAlwaysResetRealRotationVR = false;\r\n params.myAlwaysResetRealHeightVR = false;\r\n\r\n params.myNeverResetRealPositionNonVR = false;\r\n params.myNeverResetRealRotationNonVR = true;\r\n params.myNeverResetRealHeightNonVR = false;\r\n\r\n params.myResetRealHeightNonVROnExitSession = this._myParams.mySyncNonVRHeightWithVROnExitSession;\r\n\r\n params.myResetHeadToFeetInsteadOfRealOnlyIfRealNotReachable = this._myParams.myResetHeadToFeetInsteadOfReal;\r\n params.myResetHeadToRealMinDistance = this._myParams.myResetHeadToRealMinDistance;\r\n params.myMaxHeadToRealHeadSteps = this._myParams.myMaxHeadToRealHeadSteps;\r\n\r\n params.myNeverResetRealPositionVR = false;\r\n params.myNeverResetRealRotationVR = false;\r\n params.myNeverResetRealHeightVR = true;\r\n\r\n params.myDebugEnabled = false;\r\n\r\n this._myPlayerTransformManager = new PlayerTransformManager(params);\r\n }\r\n\r\n {\r\n const params = new PlayerLocomotionRotateParams(this._myParams.myEngine as any);\r\n\r\n params.myPlayerTransformManager = this._myPlayerTransformManager;\r\n\r\n params.myMaxRotationSpeed = this._myParams.myMaxRotationSpeed;\r\n params.myIsSnapTurn = this._myParams.myIsSnapTurn;\r\n params.mySnapTurnOnlyVR = this._myParams.mySnapTurnOnlyVR;\r\n params.mySnapTurnAngle = this._myParams.mySnapTurnAngle;\r\n\r\n if (this._myParams.mySnapTurnSpeedDegrees > MathUtils.EPSILON) {\r\n params.mySmoothSnapEnabled = true;\r\n params.mySmoothSnapSpeedDegrees = this._myParams.mySnapTurnSpeedDegrees;\r\n } else {\r\n params.mySmoothSnapEnabled = false;\r\n }\r\n\r\n params.myRotationMinStickIntensityThreshold = 0.1;\r\n params.mySnapTurnActivateThreshold = 0.5;\r\n params.mySnapTurnResetThreshold = 0.4;\r\n\r\n params.myClampVerticalAngle = true;\r\n params.myMaxVerticalAngle = 89;\r\n\r\n params.myHandedness = InputUtils.getOppositeHandedness(this._myParams.myMainHand)!;\r\n\r\n this._myPlayerLocomotionRotate = new PlayerLocomotionRotate(params);\r\n }\r\n\r\n {\r\n {\r\n const params = new PlayerLocomotionSmoothParams(this._myParams.myEngine as any);\r\n\r\n params.myPlayerTransformManager = this._myPlayerTransformManager;\r\n\r\n params.myHandedness = this._myParams.myMainHand;\r\n\r\n params.myMaxSpeed = this._myParams.myMaxSpeed;\r\n params.mySpeedSlowDownPercentageOnWallSlid = this._myParams.mySpeedSlowDownPercentageOnWallSlid;\r\n\r\n params.myMovementMinStickIntensityThreshold = 0.1;\r\n\r\n params.myFlyEnabled = this._myParams.myFlyEnabled;\r\n params.myFlyWithButtonsEnabled = this._myParams.myFlyWithButtonsEnabled;\r\n params.myFlyWithViewAngleEnabled = this._myParams.myFlyWithViewAngleEnabled;\r\n params.myMinAngleToFlyUpNonVR = this._myParams.myMinAngleToFlyUpNonVR;\r\n params.myMinAngleToFlyDownNonVR = this._myParams.myMinAngleToFlyDownNonVR;\r\n params.myMinAngleToFlyUpVR = this._myParams.myMinAngleToFlyUpVR;\r\n params.myMinAngleToFlyDownVR = this._myParams.myMinAngleToFlyDownVR;\r\n params.myMinAngleToFlyRight = this._myParams.myMinAngleToFlyRight;\r\n\r\n params.myGravityAcceleration = this._myParams.myGravityAcceleration;\r\n params.myMaxGravitySpeed = this._myParams.myMaxGravitySpeed;\r\n\r\n params.myDirectionInvertForwardWhenUpsideDown = this._myParams.myDirectionInvertForwardWhenUpsideDown;\r\n params.myVRDirectionReferenceType = this._myParams.myVRDirectionReferenceType;\r\n params.myVRDirectionReferenceObject = this._myParams.myVRDirectionReferenceObject;\r\n\r\n params.myDebugFlyMaxSpeedMultiplier = this._myParams.myDebugFlyMaxSpeedMultiplier;\r\n params.myMoveThroughCollisionShortcutEnabled = this._myParams.myMoveThroughCollisionShortcutEnabled;\r\n params.myMoveHeadShortcutEnabled = this._myParams.myMoveHeadShortcutEnabled;\r\n params.myTripleSpeedShortcutEnabled = this._myParams.myTripleSpeedShortcutEnabled;\r\n\r\n this._myPlayerLocomotionSmooth = new PlayerLocomotionSmooth(params, movementRuntimeParams);\r\n }\r\n\r\n {\r\n const params = new PlayerLocomotionTeleportParams(this._myParams.myEngine as any);\r\n\r\n params.myPlayerTransformManager = this._myPlayerTransformManager;\r\n\r\n params.myHandedness = this._myParams.myMainHand;\r\n\r\n params.myDetectionParams.myMaxDistance = this._myParams.myTeleportMaxDistance;\r\n params.myDetectionParams.myMaxHeightDifference = this._myParams.myTeleportMaxHeightDifference;\r\n params.myDetectionParams.myGroundAngleToIgnoreUpward = collisionCheckParamsMovement.myGroundAngleToIgnore;\r\n params.myDetectionParams.myRotationOnUpEnabled = this._myParams.myTeleportRotationOnUpEnabled;\r\n params.myDetectionParams.myMustBeOnGround = true;\r\n params.myDetectionParams.myMustBeOnIgnorableGroundAngle = true;\r\n\r\n params.myDetectionParams.myTeleportBlockLayerFlags.copy(this._myParams.myPhysicsBlockLayerFlags);\r\n params.myDetectionParams.myTeleportFloorLayerFlags.copy(this._myParams.myTeleportFloorLayerFlags);\r\n\r\n params.myDetectionParams.myTeleportFeetPositionMustBeVisible = false;\r\n params.myDetectionParams.myTeleportHeadPositionMustBeVisible = false;\r\n params.myDetectionParams.myTeleportHeadOrFeetPositionMustBeVisible = true;\r\n\r\n params.myDetectionParams.myTeleportParableStartReferenceObject = this._myParams.myTeleportParableStartReferenceObject;\r\n\r\n params.myDetectionParams.myVisibilityBlockLayerFlags.copy(params.myDetectionParams.myTeleportBlockLayerFlags);\r\n\r\n params.myDetectionParams.myPlayerTransformManagerMustBeSyncedFlagMap.set(PlayerTransformManagerSyncFlag.HEAD_COLLIDING, false);\r\n\r\n params.myDetectionParams.myPositionRealMaxDistance = 0.4;\r\n params.myDetectionParams.myPositionHeadRealMaxDistance = this._myParams.myViewOcclusionMaxRealHeadDistance / 2;\r\n\r\n params.myDetectionParams.myPositionHeadMustBeValid = true;\r\n\r\n params.myTeleportParams.myTeleportType = this._myParams.myTeleportType;\r\n\r\n params.myVisualizerParams.myTeleportPositionObject = this._myParams.myTeleportPositionObject;\r\n params.myVisualizerParams.myTeleportValidMaterial = this._myParams.myTeleportValidMaterial;\r\n params.myVisualizerParams.myTeleportInvalidMaterial = this._myParams.myTeleportInvalidMaterial;\r\n params.myVisualizerParams.myTeleportPositionObjectRotateWithHead = this._myParams.myTeleportPositionObjectRotateWithHead;\r\n\r\n params.myPerformTeleportAsMovement = false;\r\n params.myTeleportAsMovementRemoveVerticalMovement = true;\r\n params.myTeleportAsMovementExtraVerticalMovementPerMeter = -2;\r\n\r\n params.myGravityAcceleration = this._myParams.myGravityAcceleration;\r\n params.myMaxGravitySpeed = this._myParams.myMaxGravitySpeed;\r\n\r\n params.myDebugEnabled = false;\r\n params.myDebugDetectEnabled = true;\r\n params.myDebugShowEnabled = true;\r\n params.myDebugVisibilityEnabled = false;\r\n\r\n this._myPlayerLocomotionTeleport = new PlayerLocomotionTeleport(params, movementRuntimeParams);\r\n }\r\n\r\n this._myPlayerTransformManager.setPlayerLocomotionTeleport(this._myPlayerLocomotionTeleport);\r\n\r\n {\r\n const params = new PlayerObscureManagerParams(this._myParams.myEngine as any);\r\n\r\n params.myPlayerTransformManager = this._myPlayerTransformManager;\r\n params.myPlayerLocomotionTeleport = this._myPlayerLocomotionTeleport;\r\n\r\n params.myEnabled = this._myParams.myViewOcclusionInsideWallsEnabled;\r\n\r\n params.myObscureObject = null;\r\n params.myObscureMaterial = null;\r\n params.myObscureRadius = 0.5;\r\n\r\n params.myObscureFadeOutSeconds = this._myParams.myViewOcclusionFadeOutSeconds;\r\n params.myObscureFadeInSeconds = 0.25;\r\n\r\n params.myObscureFadeEasingFunction = EasingFunction.linear;\r\n params.myObscureLevelRelativeDistanceEasingFunction = EasingFunction.linear;\r\n\r\n params.myObscureIfPositionHeadNotValid = true;\r\n\r\n params.myDistanceToStartObscureWhenBodyColliding = 0.75;\r\n params.myDistanceToStartObscureWhenHeadColliding = 0;\r\n params.myDistanceToStartObscureWhenFloating = 0.75;\r\n params.myDistanceToStartObscureWhenFar = 0.75;\r\n\r\n params.myRelativeDistanceToMaxObscureWhenBodyColliding = 0.5;\r\n params.myRelativeDistanceToMaxObscureWhenHeadColliding = this._myParams.myViewOcclusionMaxRealHeadDistance;\r\n params.myRelativeDistanceToMaxObscureWhenFloating = 0.5;\r\n params.myRelativeDistanceToMaxObscureWhenFar = 0.5;\r\n\r\n this._myPlayerObscureManager = new PlayerObscureManager(params);\r\n }\r\n\r\n }\r\n\r\n this._setupLocomotionMovementFSM();\r\n\r\n this._myResetRealOnStartCounter = this._myParams.myResetRealOnStartFramesAmount;\r\n }\r\n\r\n public start(): void {\r\n this._fixAlmostUp();\r\n\r\n this._myPlayerHeadManager.start();\r\n this._myPlayerTransformManager.start();\r\n\r\n this._myPlayerObscureManager.start();\r\n\r\n this._myPlayerLocomotionRotate.start();\r\n\r\n if (this._myParams.myDefaultLocomotionType == PlayerLocomotionType.SMOOTH) {\r\n this._myLocomotionMovementFSM.perform(\"startSmooth\");\r\n } else {\r\n this._myLocomotionMovementFSM.perform(\"startTeleport\");\r\n }\r\n\r\n if (this._myParams.myStartIdle) {\r\n this.setIdle(true);\r\n }\r\n\r\n this._myStarted = true;\r\n\r\n const currentActive = this._myActive;\r\n this._myActive = !this._myActive;\r\n this.setActive(currentActive);\r\n }\r\n\r\n /** #WARN Only a few params are actually used by this class after the setup phase, like @myCollisionCheckDisabled\r\n Params like @myMaxSpeed must be edited directly on the PlayerLocomotionSmooth object*/\r\n public getParams(): PlayerLocomotionParams {\r\n return this._myParams;\r\n }\r\n\r\n public setActive(active: boolean): void {\r\n if (this._myActive != active) {\r\n this._myActive = active;\r\n\r\n if (this._myStarted) {\r\n if (this._myActive) {\r\n this._myPlayerObscureManager.start();\r\n if (!this._myIdle) {\r\n this._myLocomotionMovementFSM.perform(\"resume\");\r\n }\r\n } else {\r\n this._myLocomotionMovementFSM.perform(\"idle\");\r\n this._myPlayerObscureManager.stop();\r\n }\r\n }\r\n }\r\n\r\n this._myPlayerHeadManager.setActive(this._myActive);\r\n this._myPlayerTransformManager.setActive(this._myActive);\r\n this._myPlayerObscureManager.setActive(this._myActive);\r\n this._myPlayerLocomotionSmooth.setActive(this._myActive);\r\n this._myPlayerLocomotionTeleport.setActive(this._myActive);\r\n }\r\n\r\n public isActive(): boolean {\r\n return this._myActive;\r\n }\r\n\r\n public isStarted(): boolean {\r\n return this._myStarted;\r\n }\r\n\r\n public canStop(): boolean {\r\n let canStop = false;\r\n\r\n if (this._myLocomotionMovementFSM.isInState(\"smooth\") && this._myPlayerLocomotionSmooth.canStop()) {\r\n canStop = true;\r\n } else if (this._myLocomotionMovementFSM.isInState(\"teleport\") && this._myPlayerLocomotionTeleport.canStop()) {\r\n canStop = true;\r\n }\r\n\r\n return canStop;\r\n }\r\n\r\n public isIdle(): boolean {\r\n return this._myIdle;\r\n }\r\n\r\n public setIdle(idle: boolean): void {\r\n if (this._myIdle != idle) {\r\n this._myIdle = idle;\r\n\r\n if (idle) {\r\n this._myLocomotionMovementFSM.perform(\"idle\");\r\n } else {\r\n this._myLocomotionMovementFSM.perform(\"resume\");\r\n }\r\n }\r\n }\r\n\r\n public getPlayerLocomotionSmooth(): PlayerLocomotionSmooth {\r\n return this._myPlayerLocomotionSmooth;\r\n }\r\n\r\n public getPlayerLocomotionTeleport(): PlayerLocomotionTeleport {\r\n return this._myPlayerLocomotionTeleport;\r\n }\r\n\r\n public getPlayerTransformManager(): PlayerTransformManager {\r\n return this._myPlayerTransformManager;\r\n }\r\n\r\n public getPlayerLocomotionRotate(): PlayerLocomotionRotate {\r\n return this._myPlayerLocomotionRotate;\r\n }\r\n\r\n public getPlayerHeadManager(): PlayerHeadManager {\r\n return this._myPlayerHeadManager;\r\n }\r\n\r\n public getPlayerObscureManager(): PlayerObscureManager {\r\n return this._myPlayerObscureManager;\r\n }\r\n\r\n public registerPreUpdateCallback(id: unknown, callback: (dt: number, playerLocomotion: PlayerLocomotion) => void): void {\r\n this._myPreUpdateEmitter.add(callback, { id: id });\r\n }\r\n\r\n public unregisterPreUpdateCallback(id: unknown): void {\r\n this._myPreUpdateEmitter.remove(id);\r\n }\r\n\r\n public registerPostUpdateCallback(id: unknown, callback: (dt: number, playerLocomotion: PlayerLocomotion) => void): void {\r\n this._myPostUpdateEmitter.add(callback, { id: id });\r\n }\r\n\r\n public unregisterPostUpdateCallback(id: unknown): void {\r\n this._myPostUpdateEmitter.remove(id);\r\n }\r\n\r\n public update(dt: number): void {\r\n if (!this._myActive) return;\r\n\r\n this._myPreUpdateEmitter.notify(dt, this);\r\n\r\n let collisionCheckEnabledBackup = false;\r\n let maxGravitySpeedBackup = 0;\r\n if (this._myParams.myCollisionCheckDisabled && Globals.isDebugEnabled(this._myParams.myEngine)) {\r\n collisionCheckEnabledBackup = CollisionCheckBridge.isCollisionCheckDisabled();\r\n maxGravitySpeedBackup = this.getPlayerLocomotionSmooth().getParams().myMaxGravitySpeed;\r\n CollisionCheckBridge.setCollisionCheckDisabled(true);\r\n this.getPlayerLocomotionSmooth().getParams().myMaxGravitySpeed = 0;\r\n }\r\n\r\n this._myPlayerHeadManager.update(dt);\r\n\r\n if (this._myParams.myResetRealOnStart && this._myResetRealOnStartCounter > 0) {\r\n this._myResetRealOnStartCounter--;\r\n\r\n this._myPlayerTransformManager.resetReal(true, true, undefined, undefined, undefined, true);\r\n this._myPlayerTransformManager.update(dt);\r\n } else {\r\n this._myPlayerTransformManager.update(dt);\r\n\r\n if (!this._myPlayerLocomotionSmooth.isDebugFlyEnabled() || !Globals.isDebugEnabled(this._myParams.myEngine)) {\r\n if (!this._myParams.myAlwaysSmoothForNonVR || XRUtils.isSessionActive(this._myParams.myEngine)) {\r\n if (this._myParams.mySwitchLocomotionTypeShortcutEnabled &&\r\n this._getMainHandGamepad().getButtonInfo(GamepadButtonID.THUMBSTICK).isPressEnd(2)) {\r\n if (this._myLocomotionMovementFSM.isInState(\"smooth\") && this._myPlayerLocomotionSmooth.canStop()) {\r\n this._myLocomotionMovementFSM.perform(\"next\");\r\n } else if (this._myLocomotionMovementFSM.isInState(\"teleport\") && this._myPlayerLocomotionTeleport.canStop()) {\r\n this._myLocomotionMovementFSM.perform(\"next\");\r\n }\r\n }\r\n }\r\n\r\n if (this._myParams.myAlwaysSmoothForNonVR && !XRUtils.isSessionActive(this._myParams.myEngine)) {\r\n if (this._myLocomotionMovementFSM.isInState(\"teleport\") && this._myPlayerLocomotionTeleport.canStop()) {\r\n this._mySwitchToTeleportOnEnterSession = true;\r\n this._myLocomotionMovementFSM.perform(\"next\");\r\n }\r\n } else if (this._mySwitchToTeleportOnEnterSession && XRUtils.isSessionActive(this._myParams.myEngine)) {\r\n if (this._myLocomotionMovementFSM.isInState(\"smooth\") && this._myPlayerLocomotionSmooth.canStop()) {\r\n this._mySwitchToTeleportOnEnterSession = false;\r\n this._myLocomotionMovementFSM.perform(\"next\");\r\n }\r\n }\r\n }\r\n\r\n if (this._myParams.myDebugFlyShortcutEnabled && Globals.isDebugEnabled(this._myParams.myEngine)) {\r\n if (GamepadUtils.areButtonsPressEnd([this._getMainHandGamepad(), GamepadButtonID.SELECT, GamepadButtonID.THUMBSTICK])) {\r\n if (this._myLocomotionMovementFSM.isInState(\"teleport\") && this._myPlayerLocomotionTeleport.canStop()) {\r\n this._myLocomotionMovementFSM.perform(\"next\");\r\n }\r\n\r\n if (this._myLocomotionMovementFSM.isInState(\"smooth\")) {\r\n this._myPlayerLocomotionSmooth.setDebugFlyEnabled(!this._myPlayerLocomotionSmooth.isDebugFlyEnabled());\r\n this._mySwitchToTeleportOnEnterSession = false;\r\n }\r\n }\r\n }\r\n\r\n if (this._myPlayerHeadManager.isSynced()) {\r\n if (!this._myIdle) {\r\n this._myPlayerLocomotionRotate.update(dt);\r\n this._myLocomotionMovementFSM.update(dt);\r\n }\r\n }\r\n }\r\n\r\n if (this._myParams.mySyncHeadWithRealAfterLocomotionUpdateIfNeeded) {\r\n this._myPlayerTransformManager.updateValidHeadToRealHeadIfNeeded();\r\n }\r\n\r\n this._myPlayerObscureManager.update(dt);\r\n\r\n if (this._myParams.myCollisionCheckDisabled && Globals.isDebugEnabled(this._myParams.myEngine)) {\r\n CollisionCheckBridge.setCollisionCheckDisabled(collisionCheckEnabledBackup);\r\n this.getPlayerLocomotionSmooth().getParams().myMaxGravitySpeed = maxGravitySpeedBackup;\r\n }\r\n\r\n this._myPostUpdateEmitter.notify(dt, this);\r\n }\r\n\r\n private _setupCollisionCheckParamsMovement(): CollisionCheckParams {\r\n const simplifiedParams = new CharacterColliderSetupSimplifiedCreationParams();\r\n\r\n simplifiedParams.myHeight = this._myParams.myDefaultHeight;\r\n simplifiedParams.myRadius = this._myParams.myCharacterRadius;\r\n simplifiedParams.myFeetRadius = this._myParams.myCharacterFeetRadius;\r\n\r\n simplifiedParams.myAccuracyLevel = this._myParams.myColliderAccuracy;\r\n\r\n simplifiedParams.myIsPlayer = true;\r\n\r\n simplifiedParams.myCheckOnlyFeet = this._myParams.myColliderCheckOnlyFeet;\r\n simplifiedParams.myCheckCeilings = this._myParams.myColliderCheckCeilings;\r\n\r\n simplifiedParams.myShouldSlideAlongWall = this._myParams.myColliderSlideAlongWall;\r\n\r\n simplifiedParams.myCollectGroundInfo = true;\r\n simplifiedParams.myMaxWalkableGroundAngle = this._myParams.myColliderMaxWalkableGroundAngle;\r\n simplifiedParams.myMaxDistanceToSnapOnGround = this._myParams.myColliderMaxDistanceToSnapOnGround;\r\n simplifiedParams.myMaxDistanceToPopOutGround = this._myParams.myColliderMaxDistanceToPopOutGround;\r\n simplifiedParams.myMaxWalkableGroundStepHeight = this._myParams.myColliderMaxWalkableGroundStepHeight;\r\n simplifiedParams.myMaxWalkableCeilingStepHeight = this._myParams.myColliderMaxWalkableCeilingStepHeight;\r\n simplifiedParams.myShouldNotFallFromEdges = this._myParams.myColliderPreventFallingFromEdges;\r\n simplifiedParams.myMaxMovementSteps = this._myParams.myColliderMaxMovementSteps;\r\n\r\n simplifiedParams.myHorizontalCheckBlockLayerFlags.copy(this._myParams.myPhysicsBlockLayerFlags);\r\n const physXComponents = Globals.getPlayerObjects(this._myParams.myEngine)!.myPlayer!.pp_getComponents(PhysXComponent);\r\n for (const physXComponent of physXComponents) {\r\n simplifiedParams.myHorizontalCheckObjectsToIgnore.pp_pushUnique(physXComponent.object, (first, second) => first == second);\r\n }\r\n simplifiedParams.myVerticalCheckBlockLayerFlags.copy(simplifiedParams.myHorizontalCheckBlockLayerFlags);\r\n simplifiedParams.myVerticalCheckObjectsToIgnore.pp_copy(simplifiedParams.myHorizontalCheckObjectsToIgnore);\r\n\r\n simplifiedParams.myHorizontalCheckDebugEnabled = this._myParams.myDebugHorizontalEnabled;\r\n simplifiedParams.myVerticalCheckDebugEnabled = this._myParams.myDebugVerticalEnabled;\r\n\r\n const colliderSetup = CharacterColliderSetupUtils.createSimplified(simplifiedParams);\r\n\r\n return CollisionCheckBridge.convertCharacterColliderSetupToCollisionCheckParams(colliderSetup);\r\n }\r\n\r\n private _fixAlmostUp(): void {\r\n // Get rotation on y and adjust if it's slightly tilted when it's almsot 0,1,0\r\n\r\n const defaultUp = vec3_create(0, 1, 0);\r\n const angleWithDefaultUp = (Globals.getPlayerObjects(this._myParams.myEngine)!.myPlayer!.pp_getUp()).vec3_angle(defaultUp);\r\n if (angleWithDefaultUp < 1) {\r\n const forward = Globals.getPlayerObjects(this._myParams.myEngine)!.myPlayer!.pp_getForward();\r\n const flatForward = forward.vec3_clone();\r\n flatForward[1] = 0;\r\n\r\n const defaultForward = vec3_create(0, 0, 1);\r\n const angleWithDefaultForward = defaultForward.vec3_angleSigned(flatForward, defaultUp);\r\n\r\n Globals.getPlayerObjects(this._myParams.myEngine)!.myPlayer!.pp_resetRotation();\r\n Globals.getPlayerObjects(this._myParams.myEngine)!.myPlayer!.pp_rotateAxis(angleWithDefaultForward, defaultUp);\r\n }\r\n }\r\n\r\n private _setupLocomotionMovementFSM(): void {\r\n //this._myLocomotionMovementFSM.setLogEnabled(true, \"Locomotion Movement\");\r\n\r\n this._myLocomotionMovementFSM.addState(\"init\");\r\n this._myLocomotionMovementFSM.addState(\"smooth\", (dt: number) => this._myPlayerLocomotionSmooth.update(dt));\r\n this._myLocomotionMovementFSM.addState(\"teleport\", (dt: number) => this._myPlayerLocomotionTeleport.update(dt));\r\n this._myLocomotionMovementFSM.addState(\"idleSmooth\");\r\n this._myLocomotionMovementFSM.addState(\"idleTeleport\");\r\n\r\n this._myLocomotionMovementFSM.addTransition(\"init\", \"smooth\", \"startSmooth\", function (this: PlayerLocomotion) {\r\n this._myPlayerLocomotionTeleport.stop();\r\n this._myPlayerLocomotionSmooth.start();\r\n }.bind(this));\r\n\r\n this._myLocomotionMovementFSM.addTransition(\"init\", \"teleport\", \"startTeleport\", function (this: PlayerLocomotion) {\r\n this._myPlayerLocomotionSmooth.stop();\r\n this._myPlayerLocomotionTeleport.start();\r\n }.bind(this));\r\n\r\n this._myLocomotionMovementFSM.addTransition(\"smooth\", \"teleport\", \"next\", function (this: PlayerLocomotion) {\r\n this._myPlayerLocomotionSmooth.stop();\r\n this._myPlayerLocomotionTeleport.start();\r\n }.bind(this));\r\n\r\n this._myLocomotionMovementFSM.addTransition(\"teleport\", \"smooth\", \"next\", function (this: PlayerLocomotion) {\r\n this._myPlayerLocomotionTeleport.stop();\r\n this._myPlayerLocomotionSmooth.start();\r\n }.bind(this));\r\n\r\n this._myLocomotionMovementFSM.addTransition(\"smooth\", \"idleSmooth\", \"idle\", function (this: PlayerLocomotion) {\r\n this._myPlayerLocomotionSmooth.stop();\r\n }.bind(this));\r\n\r\n this._myLocomotionMovementFSM.addTransition(\"teleport\", \"idleTeleport\", \"idle\", function (this: PlayerLocomotion) {\r\n this._myPlayerLocomotionTeleport.stop();\r\n }.bind(this));\r\n\r\n this._myLocomotionMovementFSM.addTransition(\"idleSmooth\", \"smooth\", \"resume\", function (this: PlayerLocomotion) {\r\n this._myPlayerLocomotionSmooth.start();\r\n }.bind(this));\r\n\r\n this._myLocomotionMovementFSM.addTransition(\"idleTeleport\", \"teleport\", \"resume\", function (this: PlayerLocomotion) {\r\n this._myPlayerLocomotionTeleport.start();\r\n }.bind(this));\r\n\r\n this._myLocomotionMovementFSM.init(\"init\");\r\n }\r\n\r\n private _getMainHandGamepad(): Gamepad {\r\n return Globals.getGamepads(this._myParams.myEngine)![this._myParams.myMainHand];\r\n }\r\n\r\n public destroy(): void {\r\n this._myDestroyed = true;\r\n\r\n this._myPlayerHeadManager.destroy();\r\n this._myPlayerLocomotionSmooth.destroy();\r\n this._myPlayerTransformManager.destroy();\r\n this._myPlayerObscureManager.destroy();\r\n this._myPlayerLocomotionTeleport.destroy();\r\n }\r\n\r\n public isDestroyed(): boolean {\r\n return this._myDestroyed;\r\n }\r\n}", "import { GamepadButtonID } from \"../gamepad_buttons.js\";\r\n\r\nlet _mySimultaneousPressMaxDelay = 0.15;\r\nlet _mySimultaneousTouchMaxDelay = 0.15;\r\n\r\nexport function setSimultaneousPressMaxDelay(simultaneousPressMaxDelay) {\r\n _mySimultaneousPressMaxDelay = simultaneousPressMaxDelay;\r\n}\r\n\r\nexport function setSimultaneousTouchMaxDelay(simultaneousTouchMaxDelay) {\r\n _mySimultaneousTouchMaxDelay = simultaneousTouchMaxDelay;\r\n}\r\n\r\nexport function getSimultaneousPressMaxDelay() {\r\n return _mySimultaneousPressMaxDelay;\r\n}\r\n\r\nexport function getSimultaneousTouchMaxDelay() {\r\n return _mySimultaneousTouchMaxDelay;\r\n}\r\n\r\n\r\n// gamepadButtonIDsList is a sequence of a gamepads and a list of buttonIDs like this ([gamepad1, squeeze, top, select], [gamepad2, bottom, squeeze, select], ...)\r\n// If the first parameter is a number it's used as multiplePressCount\r\n// If the buttonIDs list is empty for a given gamepad, it means that every button will be included\r\nexport function isAnyButtonPressStart(...gamepadButtonIDsList) {\r\n let multiplePressCount = null;\r\n let realGamepadButtonIDsList = gamepadButtonIDsList;\r\n if (!isNaN(gamepadButtonIDsList[0])) {\r\n multiplePressCount = gamepadButtonIDsList[0];\r\n realGamepadButtonIDsList = gamepadButtonIDsList.slice(1);\r\n }\r\n\r\n for (let gamepadButtonIDs of realGamepadButtonIDsList) {\r\n if (gamepadButtonIDs.length == 1) {\r\n for (let key in GamepadButtonID) {\r\n gamepadButtonIDs.push(GamepadButtonID[key]);\r\n }\r\n }\r\n }\r\n\r\n let atLeastOneButtonPressStart = false;\r\n for (let gamepadButtonIDs of realGamepadButtonIDsList) {\r\n let gamepad = gamepadButtonIDs[0];\r\n for (let i = 1; i < gamepadButtonIDs.length; i++) {\r\n let buttonID = gamepadButtonIDs[i];\r\n let button = gamepad.getButtonInfo(buttonID);\r\n\r\n if (button.isPressStart(multiplePressCount)) {\r\n atLeastOneButtonPressStart = true;\r\n break;\r\n }\r\n }\r\n\r\n if (atLeastOneButtonPressStart) {\r\n break;\r\n }\r\n }\r\n\r\n return atLeastOneButtonPressStart;\r\n}\r\n\r\n// gamepadButtonIDsList is a sequence of a gamepads and a list of buttonIDs like this ([gamepad1, squeeze, top, select], [gamepad2, bottom, squeeze, select], ...)\r\n// If the first parameter is a number it's used as multiplePressCount\r\n// If the buttonIDs list is empty for a given gamepad, it means that every button will be included\r\nexport function areButtonsPressStart(...gamepadButtonIDsList) {\r\n let multiplePressCount = null;\r\n let realGamepadButtonIDsList = gamepadButtonIDsList;\r\n if (!isNaN(gamepadButtonIDsList[0])) {\r\n multiplePressCount = gamepadButtonIDsList[0];\r\n realGamepadButtonIDsList = gamepadButtonIDsList.slice(1);\r\n }\r\n\r\n for (let gamepadButtonIDs of realGamepadButtonIDsList) {\r\n if (gamepadButtonIDs.length == 1) {\r\n for (let key in GamepadButtonID) {\r\n gamepadButtonIDs.push(GamepadButtonID[key]);\r\n }\r\n }\r\n }\r\n\r\n let areButtonPressedRecently = true;\r\n let atLeastOneButtonPressStart = false;\r\n for (let gamepadButtonIDs of realGamepadButtonIDsList) {\r\n let gamepad = gamepadButtonIDs[0];\r\n for (let i = 1; i < gamepadButtonIDs.length; i++) {\r\n let buttonID = gamepadButtonIDs[i];\r\n let button = gamepad.getButtonInfo(buttonID);\r\n\r\n if (!(button.myPressed && (multiplePressCount == null || button.myMultiplePressStartCount == multiplePressCount) && button.myTimePressed < _mySimultaneousPressMaxDelay)) {\r\n areButtonPressedRecently = false;\r\n break;\r\n }\r\n\r\n if (button.isPressStart(multiplePressCount)) {\r\n atLeastOneButtonPressStart = true;\r\n }\r\n }\r\n\r\n if (!areButtonPressedRecently) {\r\n break;\r\n }\r\n }\r\n\r\n return areButtonPressedRecently && atLeastOneButtonPressStart;\r\n}\r\n\r\nexport function isAnyButtonPressEnd(...gamepadButtonIDsList) {\r\n let multiplePressCount = null;\r\n let realGamepadButtonIDsList = gamepadButtonIDsList;\r\n if (!isNaN(gamepadButtonIDsList[0])) {\r\n multiplePressCount = gamepadButtonIDsList[0];\r\n realGamepadButtonIDsList = gamepadButtonIDsList.slice(1);\r\n }\r\n\r\n for (let gamepadButtonIDs of realGamepadButtonIDsList) {\r\n if (gamepadButtonIDs.length == 1) {\r\n for (let key in GamepadButtonID) {\r\n gamepadButtonIDs.push(GamepadButtonID[key]);\r\n }\r\n }\r\n }\r\n\r\n let atLeastOneButtonPressEnd = false;\r\n for (let gamepadButtonIDs of realGamepadButtonIDsList) {\r\n let gamepad = gamepadButtonIDs[0];\r\n for (let i = 1; i < gamepadButtonIDs.length; i++) {\r\n let buttonID = gamepadButtonIDs[i];\r\n let button = gamepad.getButtonInfo(buttonID);\r\n\r\n if (button.isPressEnd(multiplePressCount)) {\r\n atLeastOneButtonPressEnd = true;\r\n break;\r\n }\r\n }\r\n\r\n if (atLeastOneButtonPressEnd) {\r\n break;\r\n }\r\n }\r\n\r\n return atLeastOneButtonPressEnd;\r\n}\r\n\r\nexport function areButtonsPressEnd(...gamepadButtonIDsList) {\r\n let multiplePressCount = null;\r\n let realGamepadButtonIDsList = gamepadButtonIDsList;\r\n if (!isNaN(gamepadButtonIDsList[0])) {\r\n multiplePressCount = gamepadButtonIDsList[0];\r\n realGamepadButtonIDsList = gamepadButtonIDsList.slice(1);\r\n }\r\n\r\n for (let gamepadButtonIDs of realGamepadButtonIDsList) {\r\n if (gamepadButtonIDs.length == 1) {\r\n for (let key in GamepadButtonID) {\r\n gamepadButtonIDs.push(GamepadButtonID[key]);\r\n }\r\n }\r\n }\r\n\r\n let areButtonNotPressedRecently = true;\r\n let atLeastOneButtonPressEnd = false;\r\n for (let gamepadButtonIDs of realGamepadButtonIDsList) {\r\n let gamepad = gamepadButtonIDs[0];\r\n for (let i = 1; i < gamepadButtonIDs.length; i++) {\r\n let buttonID = gamepadButtonIDs[i];\r\n let button = gamepad.getButtonInfo(buttonID);\r\n\r\n if (!(!button.myPressed && (multiplePressCount == null || button.myMultiplePressEndCount == multiplePressCount) && button.myTimeNotPressed < _mySimultaneousPressMaxDelay)) {\r\n areButtonNotPressedRecently = false;\r\n break;\r\n }\r\n\r\n if (button.isPressEnd(multiplePressCount)) {\r\n atLeastOneButtonPressEnd = true;\r\n }\r\n }\r\n\r\n if (!areButtonNotPressedRecently) {\r\n break;\r\n }\r\n }\r\n\r\n return areButtonNotPressedRecently && atLeastOneButtonPressEnd;\r\n}\r\n\r\nexport function isAnyButtonTouchStart(...gamepadButtonIDsList) {\r\n let multiplePressCount = null;\r\n let realGamepadButtonIDsList = gamepadButtonIDsList;\r\n if (!isNaN(gamepadButtonIDsList[0])) {\r\n multiplePressCount = gamepadButtonIDsList[0];\r\n realGamepadButtonIDsList = gamepadButtonIDsList.slice(1);\r\n }\r\n\r\n for (let gamepadButtonIDs of realGamepadButtonIDsList) {\r\n if (gamepadButtonIDs.length == 1) {\r\n for (let key in GamepadButtonID) {\r\n gamepadButtonIDs.push(GamepadButtonID[key]);\r\n }\r\n }\r\n }\r\n\r\n let atLeastOneButtonTouchStart = false;\r\n for (let gamepadButtonIDs of realGamepadButtonIDsList) {\r\n let gamepad = gamepadButtonIDs[0];\r\n for (let i = 1; i < gamepadButtonIDs.length; i++) {\r\n let buttonID = gamepadButtonIDs[i];\r\n let button = gamepad.getButtonInfo(buttonID);\r\n\r\n if (button.isTouchStart(multiplePressCount)) {\r\n atLeastOneButtonTouchStart = true;\r\n break;\r\n }\r\n }\r\n\r\n if (atLeastOneButtonTouchStart) {\r\n break;\r\n }\r\n }\r\n\r\n return atLeastOneButtonTouchStart;\r\n}\r\n\r\nexport function areButtonsTouchStart(...gamepadButtonIDsList) {\r\n let multipleTouchCount = null;\r\n let realGamepadButtonIDsList = gamepadButtonIDsList;\r\n if (!isNaN(gamepadButtonIDsList[0])) {\r\n multipleTouchCount = gamepadButtonIDsList[0];\r\n realGamepadButtonIDsList = gamepadButtonIDsList.slice(1);\r\n }\r\n\r\n for (let gamepadButtonIDs of realGamepadButtonIDsList) {\r\n if (gamepadButtonIDs.length == 1) {\r\n for (let key in GamepadButtonID) {\r\n gamepadButtonIDs.push(GamepadButtonID[key]);\r\n }\r\n }\r\n }\r\n\r\n let areButtonTouchedRecently = true;\r\n let atLeastOneButtonTouchStart = false;\r\n for (let gamepadButtonIDs of realGamepadButtonIDsList) {\r\n let gamepad = gamepadButtonIDs[0];\r\n for (let i = 1; i < gamepadButtonIDs.length; i++) {\r\n let buttonID = gamepadButtonIDs[i];\r\n let button = gamepad.getButtonInfo(buttonID);\r\n\r\n if (!(button.myTouched && (multipleTouchCount == null || button.myMultipleTouchStartCount == multipleTouchCount) && button.myTimeTouched < _mySimultaneousTouchMaxDelay)) {\r\n areButtonTouchedRecently = false;\r\n break;\r\n }\r\n\r\n if (button.isTouchStart(multipleTouchCount)) {\r\n atLeastOneButtonTouchStart = true;\r\n }\r\n }\r\n\r\n if (!areButtonTouchedRecently) {\r\n break;\r\n }\r\n }\r\n\r\n return areButtonTouchedRecently && atLeastOneButtonTouchStart;\r\n}\r\n\r\nexport function isAnyButtonTouchEnd(...gamepadButtonIDsList) {\r\n let multiplePressCount = null;\r\n let realGamepadButtonIDsList = gamepadButtonIDsList;\r\n if (!isNaN(gamepadButtonIDsList[0])) {\r\n multiplePressCount = gamepadButtonIDsList[0];\r\n realGamepadButtonIDsList = gamepadButtonIDsList.slice(1);\r\n }\r\n\r\n for (let gamepadButtonIDs of realGamepadButtonIDsList) {\r\n if (gamepadButtonIDs.length == 1) {\r\n for (let key in GamepadButtonID) {\r\n gamepadButtonIDs.push(GamepadButtonID[key]);\r\n }\r\n }\r\n }\r\n\r\n let atLeastOneButtonTouchEnd = false;\r\n for (let gamepadButtonIDs of realGamepadButtonIDsList) {\r\n let gamepad = gamepadButtonIDs[0];\r\n for (let i = 1; i < gamepadButtonIDs.length; i++) {\r\n let buttonID = gamepadButtonIDs[i];\r\n let button = gamepad.getButtonInfo(buttonID);\r\n\r\n if (button.isTouchEnd(multiplePressCount)) {\r\n atLeastOneButtonTouchEnd = true;\r\n break;\r\n }\r\n }\r\n\r\n if (atLeastOneButtonTouchEnd) {\r\n break;\r\n }\r\n }\r\n\r\n return atLeastOneButtonTouchEnd;\r\n}\r\n\r\nexport function areButtonsTouchEnd(...gamepadButtonIDsList) {\r\n let multipleTouchCount = null;\r\n let realGamepadButtonIDsList = gamepadButtonIDsList;\r\n if (!isNaN(gamepadButtonIDsList[0])) {\r\n multipleTouchCount = gamepadButtonIDsList[0];\r\n realGamepadButtonIDsList = gamepadButtonIDsList.slice(1);\r\n }\r\n\r\n for (let gamepadButtonIDs of realGamepadButtonIDsList) {\r\n if (gamepadButtonIDs.length == 1) {\r\n for (let key in GamepadButtonID) {\r\n gamepadButtonIDs.push(GamepadButtonID[key]);\r\n }\r\n }\r\n }\r\n\r\n let areButtonNotTouchedRecently = true;\r\n let atLeastOneButtonTouchEnd = false;\r\n for (let gamepadButtonIDs of realGamepadButtonIDsList) {\r\n let gamepad = gamepadButtonIDs[0];\r\n for (let i = 1; i < gamepadButtonIDs.length; i++) {\r\n let buttonID = gamepadButtonIDs[i];\r\n let button = gamepad.getButtonInfo(buttonID);\r\n\r\n if (!(!button.myTouched && (multipleTouchCount == null || button.myMultipleTouchEndCount == multipleTouchCount) && button.myTimeNotTouched < _mySimultaneousTouchMaxDelay)) {\r\n areButtonNotTouchedRecently = false;\r\n break;\r\n }\r\n\r\n if (button.isTouchEnd(multipleTouchCount)) {\r\n atLeastOneButtonTouchEnd = true;\r\n }\r\n }\r\n\r\n if (!areButtonNotTouchedRecently) {\r\n break;\r\n }\r\n }\r\n\r\n return areButtonNotTouchedRecently && atLeastOneButtonTouchEnd;\r\n}\r\n\r\nexport let GamepadUtils = {\r\n setSimultaneousPressMaxDelay,\r\n setSimultaneousTouchMaxDelay,\r\n getSimultaneousPressMaxDelay,\r\n getSimultaneousTouchMaxDelay,\r\n isAnyButtonPressStart,\r\n areButtonsPressStart,\r\n isAnyButtonPressEnd,\r\n areButtonsPressEnd,\r\n isAnyButtonTouchStart,\r\n areButtonsTouchStart,\r\n isAnyButtonTouchEnd,\r\n areButtonsTouchEnd\r\n};", "// Even if this can be sued to generally fade, it should be called collision obscure to hint that is meant for collision obscuring\r\n\r\nimport { Timer } from \"../../../../../cauldron/cauldron/timer.js\";\r\nimport { FSM } from \"../../../../../cauldron/fsm/fsm.js\";\r\nimport { EasingFunction } from \"../../../../../cauldron/utils/math_utils.js\";\r\nimport { XRUtils } from \"../../../../../cauldron/utils/xr_utils.js\";\r\nimport { VisualMesh, VisualMeshParams } from \"../../../../../cauldron/visual/elements/visual_mesh.js\";\r\nimport { MaterialUtils } from \"../../../../../cauldron/wl/utils/material_utils.js\";\r\nimport { vec3_create, vec4_create } from \"../../../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Globals } from \"../../../../../pp/globals.js\";\r\n\r\n// Occlude\r\nexport class PlayerObscureManagerParams {\r\n\r\n constructor(engine = Globals.getMainEngine()) {\r\n this.myPlayerTransformManager = null;\r\n this.myPlayerLocomotionTeleport = null;\r\n\r\n this.myEnabled = true;\r\n\r\n this.myObscureObject = null;\r\n this.myObscureMaterial = null;\r\n this.myObscureRadius = 0;\r\n\r\n this.myObscureFadeOutSeconds = 0.1;\r\n this.myObscureFadeInSeconds = 0.1;\r\n\r\n this.myObscureFadeEasingFunction = EasingFunction.linear;\r\n\r\n this.myObscureIfPositionHeadNotValid = false;\r\n\r\n this.myDistanceToStartObscureWhenHeadColliding = 0;\r\n this.myDistanceToStartObscureWhenBodyColliding = 0;\r\n this.myDistanceToStartObscureWhenFloating = 0;\r\n this.myDistanceToStartObscureWhenFar = 0;\r\n\r\n this.myRelativeDistanceToMaxObscureWhenHeadColliding = 0; // Relative to the start distance, 1 means that in 1 meters after it started it will be completely obscured\r\n this.myRelativeDistanceToMaxObscureWhenBodyColliding = 0;\r\n this.myRelativeDistanceToMaxObscureWhenFloating = 0;\r\n this.myRelativeDistanceToMaxObscureWhenFar = 0;\r\n\r\n this.myObscureLevelRelativeDistanceEasingFunction = EasingFunction.linear;\r\n\r\n this.myDisableObscureWhileTeleporting = true;\r\n this.myDisableObscureWhileTeleportingDuration = null;\r\n\r\n this.myEngine = engine;\r\n }\r\n}\r\n\r\nexport class PlayerObscureManager {\r\n\r\n constructor(params) {\r\n this._myParams = params;\r\n\r\n this._myObscureMaterial = null;\r\n this._myObscureParentObject = null;\r\n\r\n this._myCurrentObscureLevel = 0;\r\n this._myTargetObscureLevel = 0;\r\n this._myLastTargetObscureLevel = null;\r\n this._myLastIsFadingIn = null;\r\n\r\n this._myInstantObscureFramesCount = 0;\r\n\r\n this._myFadeTimer = new Timer(0, false);\r\n\r\n this._myDisableObscureWhileTeleportingTimer = null;\r\n if (this._myParams.myDisableObscureWhileTeleportingDuration != null) {\r\n this._myDisableObscureWhileTeleportingTimer = new Timer(this._myParams.myDisableObscureWhileTeleportingDuration);\r\n } else {\r\n this._myDisableObscureWhileTeleportingTimer = new Timer(0, false);\r\n }\r\n\r\n this._myFSM = new FSM();\r\n //this._myFSM.setLogEnabled(true, \" Obscure\");\r\n\r\n this._myFSM.addState(\"init\");\r\n\r\n this._myFSM.addState(\"inactive\");\r\n this._myFSM.addState(\"idle\", this._idleUpdate.bind(this));\r\n this._myFSM.addState(\"fading\", this._fadingUpdate.bind(this));\r\n\r\n this._myFSM.addTransition(\"init\", \"inactive\", \"end\", this._setObscureLevel.bind(this, 0));\r\n\r\n this._myFSM.addTransition(\"inactive\", \"idle\", \"start\");\r\n\r\n this._myFSM.addTransition(\"idle\", \"fading\", \"fade\", this._startFading.bind(this));\r\n this._myFSM.addTransition(\"fading\", \"idle\", \"done\", this._fadingDone.bind(this));\r\n\r\n this._myFSM.addTransition(\"inactive\", \"inactive\", \"stop\", this._setObscureLevel.bind(this, 0));\r\n this._myFSM.addTransition(\"idle\", \"inactive\", \"stop\", this._setObscureLevel.bind(this, 0));\r\n this._myFSM.addTransition(\"fading\", \"inactive\", \"stop\", this._setObscureLevel.bind(this, 0));\r\n\r\n this._myFSM.init(\"init\");\r\n\r\n this._setupVisuals();\r\n\r\n this._myFSM.perform(\"end\");\r\n\r\n this._myActive = false;\r\n this.setActive(true);\r\n\r\n this._myDestroyed = false;\r\n }\r\n\r\n setActive(active) {\r\n if (this._myActive != active) {\r\n this._myActive = active;\r\n\r\n if (this._myActive) {\r\n XRUtils.registerSessionStartEndEventListeners(this, this._onXRSessionStart.bind(this), this._onXRSessionEnd.bind(this), false, false, this._myParams.myEngine);\r\n } else {\r\n XRUtils.unregisterSessionStartEndEventListeners(this, this._myParams.myEngine);\r\n\r\n this._setObscureLevel(0);\r\n }\r\n }\r\n }\r\n\r\n isActive() {\r\n return this._myActive;\r\n }\r\n\r\n start() {\r\n this._myFSM.perform(\"start\");\r\n }\r\n\r\n stop() {\r\n this._myFSM.perform(\"stop\");\r\n }\r\n\r\n getParams() {\r\n return this._myParams;\r\n }\r\n\r\n update(dt) {\r\n if (!this._myActive) return;\r\n\r\n if (!this._myParams.myPlayerLocomotionTeleport.isTeleporting()) {\r\n if (this._myParams.myDisableObscureWhileTeleportingDuration != null) {\r\n this._myDisableObscureWhileTeleportingTimer.start();\r\n } else {\r\n this._myDisableObscureWhileTeleportingTimer.reset();\r\n }\r\n } else {\r\n this._myDisableObscureWhileTeleportingTimer.update(dt);\r\n }\r\n\r\n this._myObscureParentObject.pp_resetTransformLocal();\r\n\r\n this._updateObscured();\r\n\r\n this._myFSM.update(dt);\r\n\r\n this._setObscureVisible(this.isObscured());\r\n\r\n if (this._myInstantObscureFramesCount > 0) {\r\n this._myInstantObscureFramesCount--;\r\n }\r\n }\r\n\r\n isStarted() {\r\n return !this._myFSM.isInState(\"inactive\");\r\n }\r\n\r\n isObscured() {\r\n return this._myCurrentObscureLevel > 0;\r\n }\r\n\r\n isFading() {\r\n return this._myFSM.isInState(\"fading\");\r\n }\r\n\r\n isFadingIn() {\r\n return this.isFading() && this._myCurrentObscureLevel > this._myTargetObscureLevel;\r\n }\r\n\r\n isFadingOut() {\r\n return this.isFading() && this._myCurrentObscureLevel <= this._myTargetObscureLevel;\r\n }\r\n\r\n getObscureLevel() {\r\n return this._myCurrentObscureLevel;\r\n }\r\n\r\n getTargetObscureLevel() {\r\n return this._myTargetObscureLevel;\r\n }\r\n\r\n getCurrentObscureLevel() {\r\n return this._myCurrentObscureLevel;\r\n }\r\n\r\n overrideObscureLevel(obscureLevel, instantFade = false) {\r\n if (!this._myActive) return;\r\n\r\n this._myObscureLevelOverride = obscureLevel;\r\n\r\n if (instantFade && this.isStarted()) {\r\n this._setObscureLevel(obscureLevel);\r\n }\r\n }\r\n\r\n resetObscureLevelOverride() {\r\n this._myObscureLevelOverride = null;\r\n }\r\n\r\n _idleUpdate(dt) {\r\n if (Math.abs(this._myTargetObscureLevel - this._myCurrentObscureLevel) > Math.PP_EPSILON) {\r\n if (this._myInstantObscureFramesCount > 0) {\r\n this._setObscureAlpha(this._myTargetObscureLevel);\r\n this._myCurrentObscureLevel = this._myTargetObscureLevel;\r\n } else {\r\n this._myFSM.perform(\"fade\");\r\n }\r\n }\r\n }\r\n\r\n _fadingUpdate(dt) {\r\n if (Math.abs(this._myTargetObscureLevel - this._myCurrentObscureLevel) <= Math.PP_EPSILON) {\r\n this._myFSM.perform(\"done\");\r\n return;\r\n }\r\n\r\n if (this._myLastTargetObscureLevel != this._myTargetObscureLevel) {\r\n this._refreshFadeTimer();\r\n this._myLastTargetObscureLevel = this._myTargetObscureLevel;\r\n }\r\n\r\n this._myFadeTimer.update(dt);\r\n\r\n if (this._myInstantObscureFramesCount > 0) {\r\n this._myFadeTimer.end();\r\n }\r\n\r\n let newObscureLevel = this._myParams.myObscureFadeEasingFunction(this._myFadeTimer.getPercentage());\r\n\r\n let isFadingIn = this._myCurrentObscureLevel > this._myTargetObscureLevel;\r\n if (!isFadingIn) {\r\n newObscureLevel = Math.min(newObscureLevel, this._myTargetObscureLevel);\r\n } else {\r\n newObscureLevel = Math.pp_clamp(1 - newObscureLevel, 0, 1);\r\n newObscureLevel = Math.max(newObscureLevel, this._myTargetObscureLevel);\r\n }\r\n\r\n this._setObscureAlpha(newObscureLevel);\r\n this._myCurrentObscureLevel = newObscureLevel;\r\n\r\n if (Math.abs(this._myTargetObscureLevel - this._myCurrentObscureLevel) <= Math.PP_EPSILON || this._myFadeTimer.isDone()) {\r\n this._myFSM.perform(\"done\");\r\n }\r\n }\r\n\r\n _startFading() {\r\n this._myLastTargetObscureLevel = null;\r\n this._myLastIsFadingIn = null;\r\n }\r\n\r\n _fadingDone() {\r\n this._setObscureLevel(this._myTargetObscureLevel);\r\n }\r\n\r\n _refreshFadeTimer() {\r\n let isFadingIn = this._myCurrentObscureLevel > this._myTargetObscureLevel;\r\n\r\n if (this._myLastIsFadingIn != isFadingIn) {\r\n this._setFadeTimerToObscureLevel(isFadingIn);\r\n }\r\n\r\n this._myLastIsFadingIn = isFadingIn;\r\n }\r\n\r\n _setFadeTimerToObscureLevel(isFadingIn) {\r\n let percentage = 0;\r\n let closestPercentage = 0;\r\n let steps = 1000;\r\n let increment = 1 / steps;\r\n\r\n while (percentage < 1) {\r\n if (Math.abs(this._myParams.myObscureFadeEasingFunction(percentage) - this._myCurrentObscureLevel) <\r\n Math.abs(this._myParams.myObscureFadeEasingFunction(closestPercentage) - this._myCurrentObscureLevel)) {\r\n closestPercentage = percentage;\r\n }\r\n\r\n percentage += increment;\r\n }\r\n\r\n if (Math.abs(this._myParams.myObscureFadeEasingFunction(1) - this._myCurrentObscureLevel) <\r\n Math.abs(this._myParams.myObscureFadeEasingFunction(closestPercentage) - this._myCurrentObscureLevel)) {\r\n closestPercentage = 1;\r\n }\r\n\r\n if (isFadingIn) {\r\n this._myFadeTimer.start(this._myParams.myObscureFadeInSeconds);\r\n this._myFadeTimer.setPercentage(Math.pp_clamp(1 - closestPercentage, 0, 1));\r\n } else {\r\n this._myFadeTimer.start(this._myParams.myObscureFadeOutSeconds);\r\n this._myFadeTimer.setPercentage(Math.pp_clamp(closestPercentage, 0, 1));\r\n }\r\n }\r\n\r\n _setObscureLevel(obscureLevel) {\r\n this._myTargetObscureLevel = obscureLevel;\r\n this._myCurrentObscureLevel = obscureLevel;\r\n this._setObscureAlpha(obscureLevel);\r\n this._setObscureVisible(this.isObscured());\r\n }\r\n\r\n _setObscureAlpha(alpha) {\r\n if (this._myParams.myObscureObject == null) {\r\n MaterialUtils.setAlpha(this._myObscureMaterial, alpha);\r\n } else {\r\n MaterialUtils.setObjectAlpha(this._myParams.myObscureObject, alpha);\r\n }\r\n }\r\n\r\n _updateObscured() {\r\n this._myTargetObscureLevel = 0;\r\n\r\n if (this._myParams.myEnabled) {\r\n if (this._myObscureLevelOverride != null) {\r\n this._myTargetObscureLevel = this._myObscureLevelOverride;\r\n } else if (!this._myParams.myPlayerLocomotionTeleport.isTeleporting() || !this._myParams.myDisableObscureWhileTeleporting || this._myDisableObscureWhileTeleportingTimer.isDone()) {\r\n // #TODO Check if VALID head is colliding, in that case use max obscure level\r\n // This prevent being able to see when resetting head to real even though real is colliding\r\n // For example if u stand up and go with the head in the ceiling and reset by moving\r\n // Add a setting for this though, since someone could prefer being able to see in this case,\r\n // so to be able to know where to move (since it might be resetting to this invalid position)\r\n if (!this._myParams.myPlayerTransformManager.isPositionHeadValid() && this._myParams.myObscureIfPositionHeadNotValid) {\r\n let targetObscureLevel = this._myParams.myObscureLevelRelativeDistanceEasingFunction(1);\r\n this._myTargetObscureLevel = Math.max(this._myTargetObscureLevel, targetObscureLevel);\r\n } else if (this._myParams.myPlayerTransformManager.isHeadColliding()) {\r\n let distance = this._myParams.myPlayerTransformManager.getDistanceToRealHead();\r\n let relativeDistance = distance - this._myParams.myDistanceToStartObscureWhenHeadColliding;\r\n if (relativeDistance >= 0) {\r\n let relativeDistancePercentage = Math.pp_clamp(relativeDistance / this._myParams.myRelativeDistanceToMaxObscureWhenHeadColliding, 0, 1);\r\n if (isNaN(relativeDistancePercentage)) {\r\n relativeDistancePercentage = 1;\r\n }\r\n let targetObscureLevel = this._myParams.myObscureLevelRelativeDistanceEasingFunction(relativeDistancePercentage);\r\n this._myTargetObscureLevel = Math.max(this._myTargetObscureLevel, targetObscureLevel);\r\n }\r\n }\r\n\r\n if (this._myParams.myPlayerTransformManager.isBodyColliding()) {\r\n let distance = this._myParams.myPlayerTransformManager.getDistanceToReal();\r\n let relativeDistance = distance - this._myParams.myDistanceToStartObscureWhenBodyColliding;\r\n if (relativeDistance >= 0) {\r\n let relativeDistancePercentage = Math.pp_clamp(relativeDistance / this._myParams.myRelativeDistanceToMaxObscureWhenBodyColliding, 0, 1);\r\n if (isNaN(relativeDistancePercentage)) {\r\n relativeDistancePercentage = 1;\r\n }\r\n let targetObscureLevel = this._myParams.myObscureLevelRelativeDistanceEasingFunction(relativeDistancePercentage);\r\n this._myTargetObscureLevel = Math.max(this._myTargetObscureLevel, targetObscureLevel);\r\n }\r\n }\r\n\r\n if (this._myParams.myPlayerTransformManager.isFloating()) {\r\n let distance = this._myParams.myPlayerTransformManager.getDistanceToReal();\r\n let relativeDistance = distance - this._myParams.myDistanceToStartObscureWhenFloating;\r\n if (relativeDistance >= 0) {\r\n let relativeDistancePercentage = Math.pp_clamp(relativeDistance / this._myParams.myRelativeDistanceToMaxObscureWhenFloating, 0, 1);\r\n if (isNaN(relativeDistancePercentage)) {\r\n relativeDistancePercentage = 1;\r\n }\r\n let targetObscureLevel = this._myParams.myObscureLevelRelativeDistanceEasingFunction(relativeDistancePercentage);\r\n this._myTargetObscureLevel = Math.max(this._myTargetObscureLevel, targetObscureLevel);\r\n }\r\n }\r\n\r\n if (this._myParams.myPlayerTransformManager.isFar()) {\r\n let distance = this._myParams.myPlayerTransformManager.getDistanceToReal();\r\n let relativeDistance = distance - this._myParams.myDistanceToStartObscureWhenFar;\r\n if (relativeDistance >= 0) {\r\n let relativeDistancePercentage = Math.pp_clamp(relativeDistance / this._myParams.myRelativeDistanceToMaxObscureWhenFar, 0, 1);\r\n if (isNaN(relativeDistancePercentage)) {\r\n relativeDistancePercentage = 1;\r\n }\r\n let targetObscureLevel = this._myParams.myObscureLevelRelativeDistanceEasingFunction(relativeDistancePercentage);\r\n this._myTargetObscureLevel = Math.max(this._myTargetObscureLevel, targetObscureLevel);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n _setupVisuals() {\r\n this._myObscureMaterial = null;\r\n if (this._myParams.myObscureMaterial != null) {\r\n this._myObscureMaterial = this._myParams.myObscureMaterial;\r\n } else {\r\n this._myObscureMaterial = Globals.getDefaultMaterials(this._myParams.myEngine).myFlatTransparentNoDepth.clone();\r\n this._myObscureMaterial.color = vec4_create(0, 0, 0, 1);\r\n }\r\n\r\n this._myObscureParentObject = Globals.getPlayerObjects(this._myParams.myEngine).myCauldron.pp_addChild();\r\n\r\n let obscureVisualParams = new VisualMeshParams(this._myParams.myEngine);\r\n obscureVisualParams.myMesh = Globals.getDefaultMeshes(this._myParams.myEngine).myInvertedSphere;\r\n obscureVisualParams.myMaterial = (this._myParams.myObscureMaterial != null) ? this._myParams.myObscureMaterial : this._myObscureMaterial;\r\n obscureVisualParams.myParent = this._myObscureParentObject;\r\n obscureVisualParams.myLocal = true;\r\n obscureVisualParams.myTransform.mat4_setScale(vec3_create(this._myParams.myObscureRadius, this._myParams.myObscureRadius, this._myParams.myObscureRadius));\r\n this._myObscureVisual = new VisualMesh(obscureVisualParams);\r\n\r\n if (this._myParams.myObscureObject != null) {\r\n this._myParams.myObscureObject.pp_setParent(this._myObscureParentObject, false);\r\n this._myParams.myObscureObject.pp_resetTransformLocal();\r\n }\r\n\r\n this._setObscureVisible(false);\r\n }\r\n\r\n _setObscureVisible(visible) {\r\n if (this._myParams.myObscureObject == null) {\r\n this._myObscureVisual.setVisible(visible);\r\n } else {\r\n this._myObscureVisual.setVisible(false);\r\n this._myParams.myObscureObject.pp_setActive(visible);\r\n }\r\n\r\n if (visible) {\r\n this._myObscureParentObject.pp_setParent(this._myParams.myPlayerTransformManager.getHead(), false);\r\n } else {\r\n this._myObscureParentObject.pp_setParent(Globals.getPlayerObjects(this._myParams.myEngine)?.myCauldron, false);\r\n }\r\n }\r\n\r\n _onXRSessionStart() {\r\n this._myInstantObscureFramesCount = 5;\r\n }\r\n\r\n _onXRSessionEnd() {\r\n this._myInstantObscureFramesCount = 5;\r\n }\r\n\r\n destroy() {\r\n this._myDestroyed = true;\r\n\r\n this._myObscureVisual.destroy();\r\n }\r\n\r\n isDestroyed() {\r\n return this._myDestroyed;\r\n }\r\n}", "import { PhysXComponent } from \"@wonderlandengine/api\";\r\nimport { PhysicsLayerFlags } from \"../../../../../../cauldron/physics/physics_layer_flags.js\";\r\nimport { RaycastBlockColliderType, RaycastParams, RaycastResults } from \"../../../../../../cauldron/physics/physics_raycast_params.js\";\r\nimport { PhysicsUtils } from \"../../../../../../cauldron/physics/physics_utils.js\";\r\nimport { XRUtils } from \"../../../../../../cauldron/utils/xr_utils.js\";\r\nimport { MouseButtonID } from \"../../../../../../input/cauldron/mouse.js\";\r\nimport { GamepadAxesID, GamepadButtonID } from \"../../../../../../input/gamepad/gamepad_buttons.js\";\r\nimport { quat2_create, quat_create, vec3_create, vec4_create } from \"../../../../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Globals } from \"../../../../../../pp/globals.js\";\r\nimport { CollisionRuntimeParams } from \"../../../../character_controller/collision/legacy/collision_check/collision_params.js\";\r\nimport { PlayerTransformManagerSyncFlag } from \"../player_transform_manager.js\";\r\nimport { PlayerLocomotionTeleportDetectionVisualizer } from \"./player_locomotion_teleport_detection_visualizer.js\";\r\nimport { PlayerLocomotionTeleportParable } from \"./player_locomotion_teleport_parable.js\";\r\nimport { PlayerLocomotionTeleportState } from \"./player_locomotion_teleport_state.js\";\r\n\r\nlet PlayerLocomotionTeleportDetectionTeleportHitValidResult = {\r\n VALID: 0,\r\n INVALID: 1,\r\n TOO_HIGH: 2\r\n};\r\n\r\nexport class PlayerLocomotionTeleportDetectionParams {\r\n\r\n constructor() {\r\n this.myMaxDistance = 0;\r\n this.myMaxHeightDifference = 0;\r\n\r\n // This can be used to make it so the teleport position is valid on a steeper angle when going downward by setting the higher value on the collision params\r\n // and then use this to specify that when going upward u want it to be less, basically to be able to teleprot down a cliff even on a steep ground\r\n // that would not let you go up\r\n this.myGroundAngleToIgnoreUpward = 0;\r\n\r\n this.myMustBeOnGround = false;\r\n this.myMustBeOnIgnorableGroundAngle = false;\r\n\r\n this.myTeleportBlockLayerFlags = new PhysicsLayerFlags();\r\n this.myTeleportBlockColliderType = RaycastBlockColliderType.BOTH;\r\n this.myTeleportFloorLayerFlags = new PhysicsLayerFlags();\r\n this.myTeleportFloorBlockColliderType = RaycastBlockColliderType.BOTH;\r\n\r\n this.myParableForwardMinAngleToBeValidUp = 30;\r\n this.myParableForwardMinAngleToBeValidDown = 0;\r\n\r\n this.myTeleportParableStartReferenceObject = null;\r\n\r\n // Used if reference is null\r\n this.myTeleportParableStartPositionOffset = vec3_create(0, -0.04, 0.08);\r\n this.myTeleportParableStartRotationOffset = vec3_create(30, 0, 0);\r\n\r\n this.myTeleportParableSpeed = 15;\r\n this.myTeleportParableGravity = -30;\r\n this.myTeleportParableStepLength = 0.25;\r\n\r\n this.myRotationOnUpMinStickIntensity = 0.5;\r\n this.myRotationOnUpEnabled = false;\r\n\r\n this.myTeleportFeetPositionMustBeVisible = false;\r\n this.myTeleportHeadPositionMustBeVisible = false;\r\n this.myTeleportHeadOrFeetPositionMustBeVisible = false; // Wins over previous parameters\r\n\r\n this.myVisibilityCheckRadius = 0.05;\r\n this.myVisibilityCheckFeetPositionVerticalOffset = 0.1;\r\n this.myVisibilityCheckDistanceFromHitThreshold = 0.1;\r\n this.myVisibilityCheckCircumferenceSliceAmount = 6;\r\n this.myVisibilityCheckCircumferenceStepAmount = 1;\r\n this.myVisibilityCheckCircumferenceRotationPerStep = 30;\r\n this.myVisibilityBlockLayerFlags = new PhysicsLayerFlags();\r\n this.myVisibilityBlockColliderType = RaycastBlockColliderType.BOTH;\r\n\r\n this.myPlayerTransformManagerMustBeSyncedFlagMap = new Map();\r\n this.myPlayerTransformManagerMustBeSyncedFlagMap.set(PlayerTransformManagerSyncFlag.BODY_COLLIDING, false);\r\n this.myPlayerTransformManagerMustBeSyncedFlagMap.set(PlayerTransformManagerSyncFlag.HEAD_COLLIDING, false);\r\n this.myPlayerTransformManagerMustBeSyncedFlagMap.set(PlayerTransformManagerSyncFlag.FAR, false);\r\n this.myPlayerTransformManagerMustBeSyncedFlagMap.set(PlayerTransformManagerSyncFlag.FLOATING, false);\r\n\r\n this.myPositionRealMaxDistance = null;\r\n this.myPositionHeadRealMaxDistance = null;\r\n\r\n this.myPositionHeadMustBeValid = false;\r\n }\r\n}\r\n\r\nexport class PlayerLocomotionTeleportDetectionRuntimeParams {\r\n\r\n constructor() {\r\n this.myTeleportDetectionValid = false;\r\n this.myTeleportPositionValid = false;\r\n this.myTeleportSurfaceNormal = vec3_create();\r\n this.myTeleportForward = vec3_create();\r\n\r\n this.myParable = new PlayerLocomotionTeleportParable();\r\n }\r\n}\r\n\r\nexport class PlayerLocomotionTeleportDetectionState extends PlayerLocomotionTeleportState {\r\n\r\n constructor(teleportParams, teleportRuntimeParams, locomotionRuntimeParams) {\r\n super(teleportParams, teleportRuntimeParams, locomotionRuntimeParams);\r\n\r\n this._myDetectionRuntimeParams = new PlayerLocomotionTeleportDetectionRuntimeParams();\r\n\r\n this._myVisualizer = new PlayerLocomotionTeleportDetectionVisualizer(this._myTeleportParams, this._myTeleportRuntimeParams, this._myDetectionRuntimeParams);\r\n\r\n this._myTeleportRotationOnUpQueue = [];\r\n for (let i = 0; i < 3; i++) {\r\n this._myTeleportRotationOnUpQueue.push(0);\r\n }\r\n\r\n //Globals.getEasyTuneVariables(this._myTeleportParams.myEngine).add(new EasyTuneNumber(\"Parable Steps\", this._myTeleportParams.myDetectionParams.myTeleportParableStepLength, 1, 3, 0.01, undefined, undefined, this._myTeleportParams.myEngine));\r\n //Globals.getEasyTuneVariables(this._myTeleportParams.myEngine).add(new EasyTuneNumber(\"Parable Gravity\", this._myTeleportParams.myDetectionParams.myTeleportParableGravity, 10, 3, undefined, undefined, undefined, this._myTeleportParams.myEngine));\r\n //Globals.getEasyTuneVariables(this._myTeleportParams.myEngine).add(new EasyTuneNumber(\"Parable Speed\", this._myTeleportParams.myDetectionParams.myTeleportParableSpeed, 10, 3, 0, undefined, undefined, this._myTeleportParams.myEngine));\r\n //Globals.getEasyTuneVariables(this._myTeleportParams.myEngine).add(new EasyTuneNumber(\"Teleport Max Distance\", this._myTeleportParams.myDetectionParams.myMaxDistance, 10, 3, 0, undefined, undefined, this._myTeleportParams.myEngine));\r\n\r\n this._myDestroyed = false;\r\n }\r\n\r\n start() {\r\n this._myLocomotionRuntimeParams.myIsTeleportDetecting = true;\r\n\r\n for (let i = 0; i < this._myTeleportRotationOnUpQueue.length; i++) {\r\n this._myTeleportRotationOnUpQueue[i] = 0;\r\n }\r\n\r\n this._myDetectionRuntimeParams.myTeleportPositionValid = false;\r\n\r\n this._myTeleportRuntimeParams.myTeleportPosition.vec3_zero();\r\n this._myTeleportRuntimeParams.myTeleportForward.vec3_zero();\r\n\r\n this._myDetectionRuntimeParams.myTeleportForward.vec3_zero();\r\n this._myDetectionRuntimeParams.myParable.setSpeed(this._myTeleportParams.myDetectionParams.myTeleportParableSpeed);\r\n this._myDetectionRuntimeParams.myParable.setGravity(this._myTeleportParams.myDetectionParams.myTeleportParableGravity);\r\n this._myDetectionRuntimeParams.myParable.setStepLength(this._myTeleportParams.myDetectionParams.myTeleportParableStepLength);\r\n\r\n this._myTeleportParams.myPlayerTransformManager.resetReal();\r\n\r\n this._myVisualizer.start();\r\n }\r\n\r\n end() {\r\n this._myLocomotionRuntimeParams.myIsTeleportDetecting = false;\r\n this._myVisualizer.end();\r\n }\r\n\r\n update(dt, fsm) {\r\n this._detectTeleportPosition();\r\n\r\n this._myVisualizer.update(dt);\r\n\r\n if (this._confirmTeleport()) {\r\n if (this._myDetectionRuntimeParams.myTeleportPositionValid) {\r\n fsm.perform(\"teleport\");\r\n } else {\r\n fsm.perform(\"cancel\");\r\n }\r\n } else if (this._cancelTeleport()) {\r\n fsm.perform(\"cancel\");\r\n }\r\n }\r\n\r\n _confirmTeleport() {\r\n let confirmTeleport = false;\r\n\r\n if (!XRUtils.isSessionActive(this._myTeleportParams.myEngine)) {\r\n if (Globals.getMouse(this._myTeleportParams.myEngine).isInsideView()) {\r\n confirmTeleport = Globals.getMouse(this._myTeleportParams.myEngine).isButtonPressEnd(MouseButtonID.MIDDLE);\r\n }\r\n } else {\r\n let axes = Globals.getGamepads(this._myTeleportParams.myEngine)[this._myTeleportParams.myHandedness].getAxesInfo(GamepadAxesID.THUMBSTICK).getAxes();\r\n if (axes.vec2_length() <= this._myTeleportParams.myStickIdleThreshold) {\r\n confirmTeleport = true;\r\n }\r\n }\r\n\r\n return confirmTeleport;\r\n }\r\n\r\n _cancelTeleport() {\r\n let cancelTeleport = false;\r\n\r\n if (!XRUtils.isSessionActive(this._myTeleportParams.myEngine)) {\r\n cancelTeleport = Globals.getMouse(this._myTeleportParams.myEngine).isButtonPressEnd(MouseButtonID.RIGHT) || !Globals.getMouse(this._myTeleportParams.myEngine).isInsideView();\r\n } else {\r\n cancelTeleport = Globals.getGamepads(this._myTeleportParams.myEngine)[this._myTeleportParams.myHandedness].getButtonInfo(GamepadButtonID.THUMBSTICK).isPressed();\r\n }\r\n\r\n return cancelTeleport;\r\n }\r\n\r\n _detectTeleportPosition() {\r\n //this._myDetectionRuntimeParams.myParable.setSpeed(Globals.getEasyTuneVariables(this._myTeleportParams.myEngine).get(\"Parable Speed\"));\r\n //this._myDetectionRuntimeParams.myParable.setGravity(Globals.getEasyTuneVariables(this._myTeleportParams.myEngine).get(\"Parable Gravity\"));\r\n //this._myDetectionRuntimeParams.myParable.setStepLength(Globals.getEasyTuneVariables(this._myTeleportParams.myEngine).get(\"Parable Steps\"));\r\n //this._myTeleportParams.myDetectionParams.myMaxDistance = Globals.getEasyTuneVariables(this._myTeleportParams.myEngine).get(\"Teleport Max Distance\");\r\n\r\n if (XRUtils.isSessionActive(this._myTeleportParams.myEngine)) {\r\n this._detectTeleportRotationVR();\r\n this._detectTeleportPositionVR();\r\n } else {\r\n this._detectTeleportPositionNonVR();\r\n }\r\n\r\n if (!this._myTeleportParams.myPlayerTransformManager.isSynced(this._myTeleportParams.myDetectionParams.myPlayerTransformManagerMustBeSyncedFlagMap)) {\r\n this._myDetectionRuntimeParams.myTeleportPositionValid = false;\r\n } else if (this._myTeleportParams.myDetectionParams.myPositionRealMaxDistance != null &&\r\n this._myTeleportParams.myPlayerTransformManager.getDistanceToReal() > this._myTeleportParams.myDetectionParams.myPositionRealMaxDistance) {\r\n this._myDetectionRuntimeParams.myTeleportPositionValid = false;\r\n } else if (this._myTeleportParams.myDetectionParams.myPositionHeadRealMaxDistance != null &&\r\n this._myTeleportParams.myPlayerTransformManager.getDistanceToRealHead() > this._myTeleportParams.myDetectionParams.myPositionHeadRealMaxDistance) {\r\n this._myDetectionRuntimeParams.myTeleportPositionValid = false;\r\n } else if (!this._myTeleportParams.myPlayerTransformManager.isPositionHeadValid() && this._myTeleportParams.myDetectionParams.myPositionHeadMustBeValid) {\r\n this._myDetectionRuntimeParams.myTeleportPositionValid = false;\r\n }\r\n }\r\n\r\n _isTeleportPositionValid(teleportPosition, teleportForward, checkTeleportCollisionRuntimeParams) {\r\n // Implemented outside class definition\r\n }\r\n\r\n _isTeleportHitValid(hit, teleportForward, checkTeleportCollisionRuntimeParams) {\r\n // Implemented outside class definition\r\n }\r\n\r\n _detectTeleportRotationVR(dt) {\r\n // Implemented outside class definition\r\n }\r\n\r\n destroy() {\r\n this._myDestroyed = true;\r\n\r\n this._myVisualizer.destroy();\r\n }\r\n\r\n isDestroyed() {\r\n return this._myDestroyed;\r\n }\r\n}\r\n\r\n\r\n\r\n// IMPLEMENTATION\r\n\r\nPlayerLocomotionTeleportDetectionState.prototype._detectTeleportPositionNonVR = function () {\r\n let mousePosition = vec3_create();\r\n let mouseDirection = vec3_create();\r\n\r\n let playerRotationQuat = quat_create();\r\n let playerUp = vec3_create();\r\n return function _detectTeleportPositionNonVR(dt) {\r\n this._myDetectionRuntimeParams.myTeleportPositionValid = false;\r\n this._myDetectionRuntimeParams.myTeleportDetectionValid = true;\r\n\r\n playerUp = this._myTeleportParams.myPlayerTransformManager.getRotationRealQuat(playerRotationQuat).quat_getUp(playerUp);\r\n\r\n Globals.getMouse(this._myTeleportParams.myEngine).getOriginWorld(mousePosition);\r\n Globals.getMouse(this._myTeleportParams.myEngine).getDirectionWorld(mouseDirection);\r\n\r\n this._detectTeleportPositionParable(mousePosition, mouseDirection, playerUp);\r\n };\r\n}();\r\n\r\nPlayerLocomotionTeleportDetectionState.prototype._detectTeleportPositionVR = function () {\r\n let teleportStartTransformLocal = quat2_create();\r\n let teleportStartTransformWorld = quat2_create();\r\n\r\n let teleportStartPosition = vec3_create();\r\n let teleportDirection = vec3_create();\r\n\r\n let playerRotationQuat = quat_create();\r\n let playerUp = vec3_create();\r\n let playerUpNegate = vec3_create();\r\n return function _detectTeleportPositionVR(dt) {\r\n this._myDetectionRuntimeParams.myTeleportPositionValid = false;\r\n this._myDetectionRuntimeParams.myTeleportDetectionValid = false;\r\n\r\n if (this._myTeleportParams.myDetectionParams.myTeleportParableStartReferenceObject == null) {\r\n let referenceObject = Globals.getPlayerObjects(this._myTeleportParams.myEngine).myHands[this._myTeleportParams.myHandedness];\r\n\r\n teleportStartTransformLocal.quat2_setPositionRotationDegrees(this._myTeleportParams.myDetectionParams.myTeleportParableStartPositionOffset, this._myTeleportParams.myDetectionParams.myTeleportParableStartRotationOffset);\r\n teleportStartTransformWorld = referenceObject.pp_convertTransformObjectToWorldQuat(teleportStartTransformLocal, teleportStartTransformWorld);\r\n } else {\r\n let referenceObject = this._myTeleportParams.myDetectionParams.myTeleportParableStartReferenceObject;\r\n\r\n referenceObject.pp_getTransformQuat(teleportStartTransformWorld);\r\n }\r\n\r\n teleportStartPosition = teleportStartTransformWorld.quat2_getPosition(teleportStartPosition);\r\n teleportDirection = teleportStartTransformWorld.quat2_getForward(teleportDirection);\r\n\r\n playerUp = this._myTeleportParams.myPlayerTransformManager.getRotationRealQuat(playerRotationQuat).quat_getUp(playerUp);\r\n playerUpNegate = playerUp.vec3_negate(playerUpNegate);\r\n\r\n if (teleportDirection.vec3_angle(playerUp) >= this._myTeleportParams.myDetectionParams.myParableForwardMinAngleToBeValidUp &&\r\n teleportDirection.vec3_angle(playerUpNegate) >= this._myTeleportParams.myDetectionParams.myParableForwardMinAngleToBeValidDown\r\n ) {\r\n this._myDetectionRuntimeParams.myTeleportDetectionValid = true;\r\n }\r\n\r\n if (this._myDetectionRuntimeParams.myTeleportDetectionValid) {\r\n this._detectTeleportPositionParable(teleportStartPosition, teleportDirection, playerUp);\r\n }\r\n };\r\n}();\r\n\r\nPlayerLocomotionTeleportDetectionState.prototype._detectTeleportRotationVR = function () {\r\n let axesVec3 = vec3_create();\r\n let axesForward = vec3_create(0, 0, 1);\r\n let axesUp = vec3_create(0, 1, 0);\r\n let playerUp = vec3_create();\r\n let teleportRotationQuat = quat_create();\r\n return function _detectTeleportRotationVR(dt) {\r\n if (this._myTeleportParams.myDetectionParams.myRotationOnUpEnabled) {\r\n let axes = Globals.getGamepads(this._myTeleportParams.myEngine)[this._myTeleportParams.myHandedness].getAxesInfo(GamepadAxesID.THUMBSTICK).getAxes();\r\n\r\n if (axes.vec2_length() > this._myTeleportParams.myDetectionParams.myRotationOnUpMinStickIntensity) {\r\n this._myTeleportParams.myPlayerTransformManager.getRotationRealQuat(teleportRotationQuat);\r\n teleportRotationQuat.quat_getUp(playerUp);\r\n\r\n if (this._myTeleportRotationOnUpQueue[0] != 0) {\r\n teleportRotationQuat.quat_rotateAxis(this._myTeleportRotationOnUpQueue[0], playerUp, teleportRotationQuat);\r\n teleportRotationQuat.quat2_getForward(this._myTeleportRuntimeParams.myTeleportForward);\r\n } else {\r\n this._myTeleportRuntimeParams.myTeleportForward.vec3_zero();\r\n }\r\n\r\n axesVec3.vec3_set(axes[0], 0, axes[1]);\r\n const currentRotationOnUp = axesVec3.vec3_angleSigned(axesForward, axesUp);\r\n\r\n for (let i = 0; i < this._myTeleportRotationOnUpQueue.length - 1; i++) {\r\n this._myTeleportRotationOnUpQueue[i] = this._myTeleportRotationOnUpQueue[i + 1];\r\n }\r\n\r\n this._myTeleportRotationOnUpQueue[this._myTeleportRotationOnUpQueue.length - 1] = currentRotationOnUp;\r\n\r\n if (currentRotationOnUp != 0) {\r\n this._myTeleportParams.myPlayerTransformManager.getRotationRealQuat(teleportRotationQuat);\r\n\r\n teleportRotationQuat.quat_rotateAxis(currentRotationOnUp, playerUp, teleportRotationQuat);\r\n teleportRotationQuat.quat2_getForward(this._myDetectionRuntimeParams.myTeleportForward);\r\n } else {\r\n this._myDetectionRuntimeParams.myTeleportForward.vec3_zero();\r\n }\r\n }\r\n }\r\n };\r\n}();\r\n\r\nPlayerLocomotionTeleportDetectionState.prototype._detectTeleportPositionParable = function () {\r\n let parablePosition = vec3_create();\r\n let prevParablePosition = vec3_create();\r\n let parableFinalPosition = vec3_create();\r\n\r\n let raycastParams = null;\r\n let raycastResult = new RaycastResults();\r\n\r\n let parableHitPosition = vec3_create();\r\n let parableHitNormal = vec3_create();\r\n\r\n let verticalHitOrigin = vec3_create();\r\n let verticalHitDirection = vec3_create();\r\n\r\n let flatTeleportHorizontalHitNormal = vec3_create();\r\n let flatParableHitNormal = vec3_create();\r\n let flatParableDirectionNegate = vec3_create();\r\n\r\n let teleportCollisionRuntimeParams = new CollisionRuntimeParams();\r\n\r\n let objectsEqualCallback = (first, second) => first == second;\r\n return function _detectTeleportPositionParable(startPosition, direction, up) {\r\n this._myDetectionRuntimeParams.myParable.setStartPosition(startPosition);\r\n this._myDetectionRuntimeParams.myParable.setForward(direction);\r\n this._myDetectionRuntimeParams.myParable.setUp(up);\r\n\r\n let currentPositionIndex = 1;\r\n let positionFlatDistance = 0;\r\n let positionParableDistance = 0;\r\n prevParablePosition = this._myDetectionRuntimeParams.myParable.getPosition(currentPositionIndex - 1, prevParablePosition);\r\n\r\n let teleportCollisionCheckParams = this._myTeleportParams.myPlayerTransformManager.getTeleportCollisionCheckParams();\r\n\r\n if (raycastParams == null) {\r\n raycastParams = new RaycastParams(this._myTeleportParams.myEngine);\r\n }\r\n\r\n raycastParams.myIgnoreHitsInsideCollision = true;\r\n raycastParams.myBlockLayerFlags.setMask(this._myTeleportParams.myDetectionParams.myTeleportBlockLayerFlags.getMask());\r\n raycastParams.myBlockColliderType = this._myTeleportParams.myDetectionParams.myTeleportBlockColliderType;\r\n raycastParams.myPhysics = Globals.getPhysics(this._myTeleportParams.myEngine);\r\n\r\n raycastParams.myObjectsToIgnore.pp_copy(teleportCollisionCheckParams.myHorizontalObjectsToIgnore);\r\n for (let objectToIgnore of teleportCollisionCheckParams.myVerticalObjectsToIgnore) {\r\n raycastParams.myObjectsToIgnore.pp_pushUnique(objectToIgnore, objectsEqualCallback);\r\n }\r\n\r\n let maxParableDistance = this._myTeleportParams.myDetectionParams.myMaxDistance * 2;\r\n\r\n do {\r\n parablePosition = this._myDetectionRuntimeParams.myParable.getPosition(currentPositionIndex, parablePosition);\r\n\r\n raycastParams.myOrigin.vec3_copy(prevParablePosition);\r\n raycastParams.myDirection = parablePosition.vec3_sub(prevParablePosition, raycastParams.myDirection);\r\n raycastParams.myDistance = raycastParams.myDirection.vec3_length();\r\n raycastParams.myDirection.vec3_normalize(raycastParams.myDirection);\r\n\r\n raycastResult = PhysicsUtils.raycast(raycastParams, raycastResult);\r\n\r\n if (this._myTeleportParams.myDebugEnabled && this._myTeleportParams.myDebugDetectEnabled && Globals.isDebugEnabled(this._myTeleportParams.myEngine)) {\r\n Globals.getDebugVisualManager(this._myTeleportParams.myEngine).drawRaycast(0, raycastResult);\r\n }\r\n\r\n prevParablePosition.vec3_copy(parablePosition);\r\n positionFlatDistance = parablePosition.vec3_sub(startPosition, parablePosition).vec3_removeComponentAlongAxis(up, parablePosition).vec3_length();\r\n positionParableDistance = this._myDetectionRuntimeParams.myParable.getDistance(currentPositionIndex);\r\n\r\n currentPositionIndex++;\r\n } while (\r\n positionFlatDistance <= this._myTeleportParams.myDetectionParams.myMaxDistance &&\r\n positionParableDistance <= maxParableDistance &&\r\n !raycastResult.isColliding());\r\n\r\n let maxParableDistanceOverFlatDistance = this._myDetectionRuntimeParams.myParable.getDistanceOverFlatDistance(this._myTeleportParams.myDetectionParams.myMaxDistance, maxParableDistance);\r\n\r\n let fixedPositionParableDistance = positionParableDistance;\r\n if (positionParableDistance > maxParableDistanceOverFlatDistance || positionParableDistance > maxParableDistance) {\r\n fixedPositionParableDistance = Math.min(maxParableDistanceOverFlatDistance, maxParableDistance);\r\n }\r\n\r\n this._myDetectionRuntimeParams.myParableDistance = fixedPositionParableDistance;\r\n\r\n let hitCollisionValid = false;\r\n\r\n let bottomCheckMaxLength = 100;\r\n\r\n if (raycastResult.isColliding()) {\r\n let hit = raycastResult.myHits.pp_first();\r\n\r\n let hitParableDistance = positionParableDistance - (raycastParams.myDistance - hit.myDistance);\r\n\r\n if (hitParableDistance <= fixedPositionParableDistance) {\r\n hitCollisionValid = true;\r\n\r\n this._myDetectionRuntimeParams.myParableDistance = hitParableDistance;\r\n\r\n teleportCollisionRuntimeParams.reset();\r\n this._myDetectionRuntimeParams.myTeleportPositionValid = this._isTeleportHitValid(hit, this._myTeleportRuntimeParams.myTeleportForward, teleportCollisionRuntimeParams) == PlayerLocomotionTeleportDetectionTeleportHitValidResult.VALID;\r\n\r\n this._myTeleportRuntimeParams.myTeleportPosition.vec3_copy(teleportCollisionRuntimeParams.myNewPosition);\r\n this._myDetectionRuntimeParams.myTeleportSurfaceNormal.vec3_copy(teleportCollisionRuntimeParams.myGroundNormal);\r\n\r\n parableHitPosition.vec3_copy(hit.myPosition);\r\n parableHitNormal.vec3_copy(hit.myNormal);\r\n\r\n if (!this._myDetectionRuntimeParams.myTeleportPositionValid && !this._myTeleportAsMovementFailed) {\r\n verticalHitOrigin = hit.myPosition.vec3_add(hit.myNormal.vec3_scale(0.01, verticalHitOrigin), verticalHitOrigin);\r\n verticalHitDirection = up.vec3_negate(verticalHitDirection);\r\n\r\n raycastParams.myOrigin.vec3_copy(verticalHitOrigin);\r\n raycastParams.myDirection.vec3_copy(verticalHitDirection);\r\n raycastParams.myDistance = bottomCheckMaxLength;\r\n\r\n raycastResult = PhysicsUtils.raycast(raycastParams, raycastResult);\r\n\r\n if (this._myTeleportParams.myDebugEnabled && this._myTeleportParams.myDebugDetectEnabled && Globals.isDebugEnabled(this._myTeleportParams.myEngine)) {\r\n Globals.getDebugVisualManager(this._myTeleportParams.myEngine).drawRaycast(0, raycastResult);\r\n }\r\n\r\n if (raycastResult.isColliding()) {\r\n let hit = raycastResult.myHits.pp_first();\r\n\r\n teleportCollisionRuntimeParams.reset();\r\n let teleportHitValidResult = this._isTeleportHitValid(hit, this._myTeleportRuntimeParams.myTeleportForward, teleportCollisionRuntimeParams);\r\n this._myDetectionRuntimeParams.myTeleportPositionValid = teleportHitValidResult == PlayerLocomotionTeleportDetectionTeleportHitValidResult.VALID;\r\n\r\n this._myTeleportRuntimeParams.myTeleportPosition.vec3_copy(teleportCollisionRuntimeParams.myNewPosition);\r\n this._myDetectionRuntimeParams.myTeleportSurfaceNormal.vec3_copy(teleportCollisionRuntimeParams.myGroundNormal);\r\n\r\n let teleportPositionIsTooHigh = teleportHitValidResult == PlayerLocomotionTeleportDetectionTeleportHitValidResult.TOO_HIGH;\r\n\r\n if (!teleportPositionIsTooHigh) {\r\n if (!this._myDetectionRuntimeParams.myTeleportPositionValid &&\r\n !this._myTeleportAsMovementFailed &&\r\n teleportCollisionRuntimeParams.myTeleportCanceled &&\r\n teleportCollisionRuntimeParams.myIsCollidingHorizontally) {\r\n flatTeleportHorizontalHitNormal = teleportCollisionRuntimeParams.myHorizontalCollisionHit.myNormal.vec3_removeComponentAlongAxis(up, flatTeleportHorizontalHitNormal);\r\n\r\n if (!flatTeleportHorizontalHitNormal.vec3_isZero(0.00001)) {\r\n flatTeleportHorizontalHitNormal.vec3_normalize(flatTeleportHorizontalHitNormal);\r\n\r\n let backwardStep = teleportCollisionCheckParams.myRadius * 1.1;\r\n raycastParams.myOrigin = verticalHitOrigin.vec3_add(flatTeleportHorizontalHitNormal.vec3_scale(backwardStep, raycastParams.myOrigin), raycastParams.myOrigin);\r\n raycastParams.myDirection.vec3_copy(verticalHitDirection);\r\n raycastParams.myDistance = bottomCheckMaxLength;\r\n\r\n raycastResult = PhysicsUtils.raycast(raycastParams, raycastResult);\r\n\r\n if (this._myTeleportParams.myDebugEnabled && this._myTeleportParams.myDebugDetectEnabled && Globals.isDebugEnabled(this._myTeleportParams.myEngine)) {\r\n Globals.getDebugVisualManager(this._myTeleportParams.myEngine).drawPoint(0, raycastParams.myOrigin, vec4_create(0, 0, 0, 1), 0.03);\r\n Globals.getDebugVisualManager(this._myTeleportParams.myEngine).drawRaycast(0, raycastResult);\r\n }\r\n\r\n if (raycastResult.isColliding()) {\r\n let hit = raycastResult.myHits.pp_first();\r\n\r\n teleportCollisionRuntimeParams.reset();\r\n this._myDetectionRuntimeParams.myTeleportPositionValid = this._isTeleportHitValid(hit, this._myTeleportRuntimeParams.myTeleportForward, teleportCollisionRuntimeParams) == PlayerLocomotionTeleportDetectionTeleportHitValidResult.VALID;\r\n\r\n this._myTeleportRuntimeParams.myTeleportPosition.vec3_copy(teleportCollisionRuntimeParams.myNewPosition);\r\n this._myDetectionRuntimeParams.myTeleportSurfaceNormal.vec3_copy(teleportCollisionRuntimeParams.myGroundNormal);\r\n }\r\n }\r\n } else {\r\n //console.error(\"2\", this._myDetectionRuntimeParams.myTeleportPositionValid, this._myTeleportAsMovementFailed);\r\n }\r\n\r\n if (!this._myDetectionRuntimeParams.myTeleportPositionValid && !this._myTeleportAsMovementFailed) {\r\n flatParableHitNormal = parableHitNormal.vec3_removeComponentAlongAxis(up, flatParableHitNormal);\r\n if (!flatParableHitNormal.vec3_isZero(0.00001)) {\r\n flatParableHitNormal.vec3_normalize(flatParableHitNormal);\r\n\r\n let backwardStep = teleportCollisionCheckParams.myRadius * 1.1;\r\n raycastParams.myOrigin = verticalHitOrigin.vec3_add(flatParableHitNormal.vec3_scale(backwardStep, raycastParams.myOrigin), raycastParams.myOrigin);\r\n raycastParams.myDirection.vec3_copy(verticalHitDirection);\r\n raycastParams.myDistance = bottomCheckMaxLength;\r\n\r\n raycastResult = PhysicsUtils.raycast(raycastParams, raycastResult);\r\n\r\n if (this._myTeleportParams.myDebugEnabled && this._myTeleportParams.myDebugDetectEnabled && Globals.isDebugEnabled(this._myTeleportParams.myEngine)) {\r\n Globals.getDebugVisualManager(this._myTeleportParams.myEngine).drawPoint(0, raycastParams.myOrigin, vec4_create(0, 0, 0, 1), 0.03);\r\n Globals.getDebugVisualManager(this._myTeleportParams.myEngine).drawRaycast(0, raycastResult);\r\n }\r\n\r\n if (raycastResult.isColliding()) {\r\n let hit = raycastResult.myHits.pp_first();\r\n\r\n teleportCollisionRuntimeParams.reset();\r\n this._myDetectionRuntimeParams.myTeleportPositionValid = this._isTeleportHitValid(hit, this._myTeleportRuntimeParams.myTeleportForward, teleportCollisionRuntimeParams) == PlayerLocomotionTeleportDetectionTeleportHitValidResult.VALID;\r\n\r\n this._myTeleportRuntimeParams.myTeleportPosition.vec3_copy(teleportCollisionRuntimeParams.myNewPosition);\r\n this._myDetectionRuntimeParams.myTeleportSurfaceNormal.vec3_copy(teleportCollisionRuntimeParams.myGroundNormal);\r\n }\r\n }\r\n } else {\r\n //console.error(\"3\", this._myDetectionRuntimeParams.myTeleportPositionValid, this._myTeleportAsMovementFailed);\r\n }\r\n\r\n if (!this._myDetectionRuntimeParams.myTeleportPositionValid && !this._myTeleportAsMovementFailed) {\r\n flatParableDirectionNegate = direction.vec3_negate(flatParableDirectionNegate).vec3_removeComponentAlongAxis(up, flatParableDirectionNegate).vec3_normalize(flatParableDirectionNegate);\r\n\r\n if (!flatParableDirectionNegate.vec3_isZero(0.00001)) {\r\n flatParableDirectionNegate.vec3_normalize(flatParableDirectionNegate);\r\n\r\n let backwardStep = teleportCollisionCheckParams.myRadius * 1.1;\r\n raycastParams.myOrigin = verticalHitOrigin.vec3_add(flatParableDirectionNegate.vec3_scale(backwardStep, raycastParams.myOrigin), raycastParams.myOrigin);\r\n raycastParams.myDirection.vec3_copy(verticalHitDirection);\r\n raycastParams.myDistance = bottomCheckMaxLength;\r\n\r\n raycastResult = PhysicsUtils.raycast(raycastParams, raycastResult);\r\n\r\n if (this._myTeleportParams.myDebugEnabled && this._myTeleportParams.myDebugDetectEnabled && Globals.isDebugEnabled(this._myTeleportParams.myEngine)) {\r\n Globals.getDebugVisualManager(this._myTeleportParams.myEngine).drawPoint(0, raycastParams.myOrigin, vec4_create(0, 0, 0, 1), 0.03);\r\n Globals.getDebugVisualManager(this._myTeleportParams.myEngine).drawRaycast(0, raycastResult);\r\n }\r\n\r\n if (raycastResult.isColliding()) {\r\n let hit = raycastResult.myHits.pp_first();\r\n\r\n teleportCollisionRuntimeParams.reset();\r\n this._myDetectionRuntimeParams.myTeleportPositionValid = this._isTeleportHitValid(hit, this._myTeleportRuntimeParams.myTeleportForward, teleportCollisionRuntimeParams) == PlayerLocomotionTeleportDetectionTeleportHitValidResult.VALID;\r\n\r\n this._myTeleportRuntimeParams.myTeleportPosition.vec3_copy(teleportCollisionRuntimeParams.myNewPosition);\r\n this._myDetectionRuntimeParams.myTeleportSurfaceNormal.vec3_copy(teleportCollisionRuntimeParams.myGroundNormal);\r\n }\r\n }\r\n } else {\r\n //console.error(\"4\", this._myDetectionRuntimeParams.myTeleportPositionValid, this._myTeleportAsMovementFailed);\r\n }\r\n }\r\n }\r\n } else {\r\n //console.error(\"1\", this._myDetectionRuntimeParams.myTeleportPositionValid, this._myTeleportAsMovementFailed);\r\n }\r\n }\r\n }\r\n\r\n //console.error(\"-\");\r\n\r\n if (!hitCollisionValid) {\r\n parableFinalPosition = this._myDetectionRuntimeParams.myParable.getPositionByDistance(this._myDetectionRuntimeParams.myParableDistance, parableFinalPosition);\r\n\r\n verticalHitOrigin.vec3_copy(parableFinalPosition);\r\n verticalHitDirection = up.vec3_negate(verticalHitDirection);\r\n\r\n raycastParams.myOrigin.vec3_copy(verticalHitOrigin);\r\n raycastParams.myDirection.vec3_copy(verticalHitDirection);\r\n raycastParams.myDistance = bottomCheckMaxLength;\r\n\r\n raycastResult = PhysicsUtils.raycast(raycastParams, raycastResult);\r\n\r\n if (this._myTeleportParams.myDebugEnabled && this._myTeleportParams.myDebugDetectEnabled && Globals.isDebugEnabled(this._myTeleportParams.myEngine)) {\r\n Globals.getDebugVisualManager(this._myTeleportParams.myEngine).drawRaycast(0, raycastResult);\r\n }\r\n\r\n if (raycastResult.isColliding()) {\r\n let hit = raycastResult.myHits.pp_first();\r\n\r\n teleportCollisionRuntimeParams.reset();\r\n let teleportHitValidResult = this._isTeleportHitValid(hit, this._myTeleportRuntimeParams.myTeleportForward, teleportCollisionRuntimeParams);\r\n this._myDetectionRuntimeParams.myTeleportPositionValid = teleportHitValidResult == PlayerLocomotionTeleportDetectionTeleportHitValidResult.VALID;\r\n\r\n this._myTeleportRuntimeParams.myTeleportPosition.vec3_copy(teleportCollisionRuntimeParams.myNewPosition);\r\n this._myDetectionRuntimeParams.myTeleportSurfaceNormal.vec3_copy(teleportCollisionRuntimeParams.myGroundNormal);\r\n\r\n let teleportPositionIsTooHigh = teleportHitValidResult == PlayerLocomotionTeleportDetectionTeleportHitValidResult.TOO_HIGH;\r\n\r\n if (!teleportPositionIsTooHigh) {\r\n if (!this._myDetectionRuntimeParams.myTeleportPositionValid &&\r\n !this._myTeleportAsMovementFailed &&\r\n teleportCollisionRuntimeParams.myTeleportCanceled &&\r\n teleportCollisionRuntimeParams.myIsCollidingHorizontally) {\r\n flatTeleportHorizontalHitNormal = teleportCollisionRuntimeParams.myHorizontalCollisionHit.myNormal.vec3_removeComponentAlongAxis(up, flatTeleportHorizontalHitNormal);\r\n\r\n if (!flatTeleportHorizontalHitNormal.vec3_isZero(0.00001)) {\r\n flatTeleportHorizontalHitNormal.vec3_normalize(flatTeleportHorizontalHitNormal);\r\n\r\n let backwardStep = teleportCollisionCheckParams.myRadius * 1.1;\r\n raycastParams.myOrigin = verticalHitOrigin.vec3_add(flatTeleportHorizontalHitNormal.vec3_scale(backwardStep, raycastParams.myOrigin), raycastParams.myOrigin);\r\n raycastParams.myDirection.vec3_copy(verticalHitDirection);\r\n raycastParams.myDistance = bottomCheckMaxLength;\r\n\r\n raycastResult = PhysicsUtils.raycast(raycastParams, raycastResult);\r\n\r\n if (this._myTeleportParams.myDebugEnabled && this._myTeleportParams.myDebugDetectEnabled && Globals.isDebugEnabled(this._myTeleportParams.myEngine)) {\r\n Globals.getDebugVisualManager(this._myTeleportParams.myEngine).drawPoint(0, raycastParams.myOrigin, vec4_create(0, 0, 0, 1), 0.03);\r\n Globals.getDebugVisualManager(this._myTeleportParams.myEngine).drawRaycast(0, raycastResult);\r\n }\r\n\r\n if (raycastResult.isColliding()) {\r\n let hit = raycastResult.myHits.pp_first();\r\n\r\n teleportCollisionRuntimeParams.reset();\r\n this._myDetectionRuntimeParams.myTeleportPositionValid = this._isTeleportHitValid(hit, this._myTeleportRuntimeParams.myTeleportForward, teleportCollisionRuntimeParams) == PlayerLocomotionTeleportDetectionTeleportHitValidResult.VALID;\r\n\r\n this._myTeleportRuntimeParams.myTeleportPosition.vec3_copy(teleportCollisionRuntimeParams.myNewPosition);\r\n this._myDetectionRuntimeParams.myTeleportSurfaceNormal.vec3_copy(teleportCollisionRuntimeParams.myGroundNormal);\r\n }\r\n }\r\n }\r\n\r\n if (!this._myDetectionRuntimeParams.myTeleportPositionValid && !this._myTeleportAsMovementFailed) {\r\n flatParableDirectionNegate = direction.vec3_negate(flatParableDirectionNegate).vec3_removeComponentAlongAxis(up, flatParableDirectionNegate).vec3_normalize(flatParableDirectionNegate);\r\n\r\n if (!flatParableDirectionNegate.vec3_isZero(0.00001)) {\r\n flatParableDirectionNegate.vec3_normalize(flatParableDirectionNegate);\r\n\r\n let backwardStep = teleportCollisionCheckParams.myRadius * 1.1;\r\n raycastParams.myOrigin = verticalHitOrigin.vec3_add(flatParableDirectionNegate.vec3_scale(backwardStep, raycastParams.myOrigin), raycastParams.myOrigin);\r\n raycastParams.myDirection.vec3_copy(verticalHitDirection);\r\n raycastParams.myDistance = bottomCheckMaxLength;\r\n\r\n raycastResult = PhysicsUtils.raycast(raycastParams, raycastResult);\r\n\r\n if (this._myTeleportParams.myDebugEnabled && this._myTeleportParams.myDebugDetectEnabled && Globals.isDebugEnabled(this._myTeleportParams.myEngine)) {\r\n Globals.getDebugVisualManager(this._myTeleportParams.myEngine).drawPoint(0, raycastParams.myOrigin, vec4_create(0, 0, 0, 1), 0.03);\r\n Globals.getDebugVisualManager(this._myTeleportParams.myEngine).drawRaycast(0, raycastResult);\r\n }\r\n\r\n if (raycastResult.isColliding()) {\r\n let hit = raycastResult.myHits.pp_first();\r\n\r\n teleportCollisionRuntimeParams.reset();\r\n this._myDetectionRuntimeParams.myTeleportPositionValid = this._isTeleportHitValid(hit, this._myTeleportRuntimeParams.myTeleportForward, teleportCollisionRuntimeParams) == PlayerLocomotionTeleportDetectionTeleportHitValidResult.VALID;\r\n\r\n this._myTeleportRuntimeParams.myTeleportPosition.vec3_copy(teleportCollisionRuntimeParams.myNewPosition);\r\n this._myDetectionRuntimeParams.myTeleportSurfaceNormal.vec3_copy(teleportCollisionRuntimeParams.myGroundNormal);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n };\r\n}();\r\n\r\nPlayerLocomotionTeleportDetectionState.prototype._isTeleportHitValid = function () {\r\n let playerRotationQuat = quat_create();\r\n let playerUp = vec3_create();\r\n return function _isTeleportHitValid(hit, teleportForward, checkTeleportCollisionRuntimeParams) {\r\n let isValid = PlayerLocomotionTeleportDetectionTeleportHitValidResult.INVALID;\r\n\r\n this._myTeleportAsMovementFailed = false;\r\n\r\n if (hit.isValid() && !hit.myInsideCollision) {\r\n playerUp = this._myTeleportParams.myPlayerTransformManager.getRotationRealQuat(playerRotationQuat).quat_getUp(playerUp);\r\n\r\n // #TODO is hitValidEvenWhenNotConcordant needed or was it a debug that should be removed?\r\n let hitValidEvenWhenNotConcordant = true;\r\n if (hit.myNormal.vec3_isConcordant(playerUp) || hitValidEvenWhenNotConcordant) {\r\n const physxComponent = hit.myObject.pp_getComponentSelf(PhysXComponent);\r\n if (physxComponent.groupsMask & this._myTeleportParams.myDetectionParams.myTeleportFloorLayerFlags.getMask() &&\r\n (this._myTeleportParams.myDetectionParams.myTeleportFloorBlockColliderType == RaycastBlockColliderType.BOTH ||\r\n (this._myTeleportParams.myDetectionParams.myTeleportFloorBlockColliderType == RaycastBlockColliderType.TRIGGER && physxComponent.trigger) ||\r\n (this._myTeleportParams.myDetectionParams.myTeleportFloorBlockColliderType == RaycastBlockColliderType.NORMAL && !physxComponent.trigger)\r\n )) {\r\n isValid = this._isTeleportPositionValid(hit.myPosition, teleportForward, checkTeleportCollisionRuntimeParams);\r\n }\r\n }\r\n }\r\n\r\n return isValid;\r\n };\r\n}();\r\n\r\nPlayerLocomotionTeleportDetectionState.prototype._isTeleportPositionValid = function () {\r\n let playerUp = vec3_create();\r\n let teleportRotationQuat = quat_create();\r\n let feetPosition = vec3_create();\r\n let differenceOnUpVector = vec3_create();\r\n let teleportCheckCollisionRuntimeParams = new CollisionRuntimeParams();\r\n return function _isTeleportPositionValid(teleportPosition, teleportForward, checkTeleportCollisionRuntimeParams) {\r\n let isValid = PlayerLocomotionTeleportDetectionTeleportHitValidResult.INVALID;\r\n\r\n let positionVisible = this._isTeleportPositionVisible(teleportPosition);\r\n\r\n if (positionVisible) {\r\n this._myTeleportParams.myPlayerTransformManager.getRotationRealQuat(teleportRotationQuat);\r\n teleportRotationQuat.quat_getUp(playerUp);\r\n\r\n if (!teleportForward.vec3_isZero(0.00001)) {\r\n teleportRotationQuat.quat_setUp(playerUp, teleportForward);\r\n }\r\n\r\n this._myTeleportParams.myPlayerTransformManager.getPosition(feetPosition);\r\n let differenceOnUp = teleportPosition.vec3_sub(feetPosition, differenceOnUpVector).vec3_componentAlongAxis(playerUp, differenceOnUpVector).vec3_length();\r\n\r\n if (differenceOnUp < this._myTeleportParams.myDetectionParams.myMaxHeightDifference + 0.00001) {\r\n let teleportCheckValid = false;\r\n teleportCheckCollisionRuntimeParams.copy(this._myTeleportParams.myPlayerTransformManager.getCollisionRuntimeParams());\r\n\r\n if (!this._myTeleportParams.myPerformTeleportAsMovement) {\r\n this._checkTeleport(teleportPosition, teleportRotationQuat, teleportCheckCollisionRuntimeParams, checkTeleportCollisionRuntimeParams);\r\n } else {\r\n this._checkTeleportAsMovement(teleportPosition, teleportRotationQuat, teleportCheckCollisionRuntimeParams, checkTeleportCollisionRuntimeParams);\r\n }\r\n\r\n if (!teleportCheckCollisionRuntimeParams.myTeleportCanceled) {\r\n teleportCheckValid = true;\r\n }\r\n\r\n let teleportCollisionCheckParams = this._myTeleportParams.myPlayerTransformManager.getTeleportCollisionCheckParams();\r\n if (teleportCheckValid &&\r\n (!this._myTeleportParams.myDetectionParams.myMustBeOnGround || teleportCheckCollisionRuntimeParams.myIsOnGround) &&\r\n (!this._myTeleportParams.myDetectionParams.myMustBeOnIgnorableGroundAngle ||\r\n (teleportCheckCollisionRuntimeParams.myGroundAngle < teleportCollisionCheckParams.myGroundAngleToIgnore + 0.0001))) {\r\n let groundAngleValid = true;\r\n let isTeleportingUpward = teleportCheckCollisionRuntimeParams.myNewPosition.vec3_isFartherAlongAxis(feetPosition, playerUp);\r\n if (isTeleportingUpward) {\r\n groundAngleValid = teleportCheckCollisionRuntimeParams.myGroundAngle < this._myTeleportParams.myDetectionParams.myGroundAngleToIgnoreUpward + 0.0001;\r\n }\r\n\r\n if (groundAngleValid) {\r\n isValid = PlayerLocomotionTeleportDetectionTeleportHitValidResult.VALID;\r\n }\r\n }\r\n } else {\r\n isValid = PlayerLocomotionTeleportDetectionTeleportHitValidResult.TOO_HIGH;\r\n }\r\n }\r\n\r\n return isValid;\r\n };\r\n}();\r\n\r\nPlayerLocomotionTeleportDetectionState.prototype._isTeleportPositionVisible = function () {\r\n let playerRotationQuat = quat_create();\r\n let playerUp = vec3_create();\r\n\r\n let offsetFeetTeleportPosition = vec3_create();\r\n let headTeleportPosition = vec3_create();\r\n return function _isTeleportPositionVisible(teleportPosition) {\r\n let isVisible = true;\r\n\r\n if (this._myTeleportParams.myDetectionParams.myTeleportFeetPositionMustBeVisible ||\r\n this._myTeleportParams.myDetectionParams.myTeleportHeadPositionMustBeVisible ||\r\n this._myTeleportParams.myDetectionParams.myTeleportHeadOrFeetPositionMustBeVisible) {\r\n\r\n playerUp = this._myTeleportParams.myPlayerTransformManager.getRotationRealQuat(playerRotationQuat).quat_getUp(playerUp);\r\n let isHeadVisible = false;\r\n let isFeetVisible = false;\r\n\r\n if (this._myTeleportParams.myDetectionParams.myTeleportHeadOrFeetPositionMustBeVisible ||\r\n this._myTeleportParams.myDetectionParams.myTeleportHeadPositionMustBeVisible) {\r\n let headheight = this._myTeleportParams.myPlayerTransformManager.getHeightReal();\r\n headTeleportPosition = teleportPosition.vec3_add(playerUp.vec3_scale(headheight, headTeleportPosition), headTeleportPosition);\r\n isHeadVisible = this._isPositionVisible(headTeleportPosition);\r\n } else {\r\n isHeadVisible = true;\r\n }\r\n\r\n if (this._myTeleportParams.myDetectionParams.myTeleportHeadOrFeetPositionMustBeVisible && isHeadVisible) {\r\n isFeetVisible = true;\r\n } else {\r\n if (this._myTeleportParams.myDetectionParams.myTeleportHeadOrFeetPositionMustBeVisible ||\r\n (this._myTeleportParams.myDetectionParams.myTeleportFeetPositionMustBeVisible && isHeadVisible)) {\r\n offsetFeetTeleportPosition = teleportPosition.vec3_add(playerUp.vec3_scale(this._myTeleportParams.myDetectionParams.myVisibilityCheckFeetPositionVerticalOffset, offsetFeetTeleportPosition), offsetFeetTeleportPosition);\r\n isFeetVisible = this._isPositionVisible(offsetFeetTeleportPosition);\r\n } else {\r\n isFeetVisible = true;\r\n }\r\n }\r\n\r\n isVisible = isHeadVisible && isFeetVisible;\r\n }\r\n\r\n return isVisible;\r\n };\r\n}();\r\n\r\nPlayerLocomotionTeleportDetectionState.prototype._isPositionVisible = function () {\r\n let playerRotationQuat = quat_create();\r\n let playerUp = vec3_create();\r\n let playerPosition = vec3_create();\r\n let headPosition = vec3_create();\r\n\r\n let standardUp = vec3_create(0, 1, 0);\r\n let standardUpNegated = vec3_create(0, -1, 0);\r\n let standardForward = vec3_create(0, 0, 1);\r\n let referenceUp = vec3_create();\r\n let direction = vec3_create();\r\n let fixedRight = vec3_create();\r\n let fixedForward = vec3_create();\r\n let fixedUp = vec3_create();\r\n let raycastEndPosition = vec3_create();\r\n\r\n let raycastParams = null;\r\n let raycastResult = new RaycastResults();\r\n\r\n let objectsEqualCallback = (first, second) => first == second;\r\n return function _isPositionVisible(position) {\r\n let isVisible = true;\r\n\r\n playerUp = this._myTeleportParams.myPlayerTransformManager.getRotationQuat(playerRotationQuat).quat_getUp(playerUp);\r\n this._myTeleportParams.myPlayerTransformManager.getPosition(playerPosition);\r\n let headheight = this._myTeleportParams.myPlayerTransformManager.getHeight();\r\n playerPosition.vec3_add(playerUp.vec3_scale(headheight, headPosition), headPosition);\r\n\r\n direction = position.vec3_sub(headPosition, direction).vec3_normalize(direction);\r\n\r\n referenceUp.vec3_copy(standardUp);\r\n if (direction.vec3_angle(standardUp) < 0.0001 || direction.vec3_angle(standardUpNegated) < 0.0001) {\r\n referenceUp.vec3_copy(standardForward);\r\n }\r\n\r\n fixedRight = direction.vec3_cross(referenceUp, fixedRight);\r\n fixedUp = fixedRight.vec3_cross(direction, fixedUp);\r\n fixedForward.vec3_copy(direction);\r\n\r\n fixedUp.vec3_normalize(fixedUp);\r\n fixedForward.vec3_normalize(fixedForward);\r\n\r\n let checkPositions = this._getVisibilityCheckPositions(headPosition, fixedUp, fixedForward);\r\n\r\n let distance = headPosition.vec3_distance(position);\r\n\r\n if (raycastParams == null) {\r\n raycastParams = new RaycastParams(this._myTeleportParams.myEngine);\r\n }\r\n\r\n let teleportCollisionCheckParams = this._myTeleportParams.myPlayerTransformManager.getTeleportCollisionCheckParams();\r\n for (let checkPosition of checkPositions) {\r\n raycastParams.myOrigin.vec3_copy(checkPosition);\r\n raycastParams.myDirection.vec3_copy(fixedForward);\r\n raycastParams.myDistance = distance;\r\n raycastParams.myPhysics = Globals.getPhysics(this._myTeleportParams.myEngine);\r\n\r\n raycastParams.myBlockLayerFlags.setMask(this._myTeleportParams.myDetectionParams.myVisibilityBlockLayerFlags.getMask());\r\n raycastParams.myBlockColliderType = this._myTeleportParams.myDetectionParams.myVisibilityBlockColliderType;\r\n\r\n raycastParams.myObjectsToIgnore.pp_copy(teleportCollisionCheckParams.myHorizontalObjectsToIgnore);\r\n for (let objectToIgnore of teleportCollisionCheckParams.myVerticalObjectsToIgnore) {\r\n raycastParams.myObjectsToIgnore.pp_pushUnique(objectToIgnore, objectsEqualCallback);\r\n }\r\n\r\n raycastParams.myIgnoreHitsInsideCollision = true;\r\n\r\n raycastResult = PhysicsUtils.raycast(raycastParams, raycastResult);\r\n\r\n if (this._myTeleportParams.myDebugEnabled && this._myTeleportParams.myDebugVisibilityEnabled && Globals.isDebugEnabled(this._myTeleportParams.myEngine)) {\r\n Globals.getDebugVisualManager(this._myTeleportParams.myEngine).drawRaycast(0, raycastResult);\r\n }\r\n\r\n if (raycastResult.isColliding()) {\r\n raycastEndPosition = checkPosition.vec3_add(fixedForward.vec3_scale(distance, raycastEndPosition), raycastEndPosition);\r\n let hit = raycastResult.myHits.pp_first();\r\n\r\n if (this._myTeleportParams.myDetectionParams.myVisibilityCheckDistanceFromHitThreshold == 0 || hit.myPosition.vec3_distance(raycastEndPosition) > this._myTeleportParams.myDetectionParams.myVisibilityCheckDistanceFromHitThreshold + 0.00001) {\r\n isVisible = false;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return isVisible;\r\n };\r\n}();\r\n\r\nPlayerLocomotionTeleportDetectionState.prototype._getVisibilityCheckPositions = function () {\r\n let checkPositions = [];\r\n let cachedCheckPositions = [];\r\n let currentCachedCheckPositionIndex = 0;\r\n let _localGetCachedCheckPosition = function () {\r\n let item = null;\r\n while (cachedCheckPositions.length <= currentCachedCheckPositionIndex) {\r\n cachedCheckPositions.push(vec3_create());\r\n }\r\n\r\n item = cachedCheckPositions[currentCachedCheckPositionIndex];\r\n currentCachedCheckPositionIndex++;\r\n return item;\r\n };\r\n\r\n let currentDirection = vec3_create();\r\n return function _getVisibilityCheckPositions(position, up, forward) {\r\n checkPositions.length = 0;\r\n currentCachedCheckPositionIndex = 0;\r\n\r\n {\r\n let tempCheckPosition = _localGetCachedCheckPosition();\r\n tempCheckPosition.vec3_copy(position);\r\n checkPositions.push(tempCheckPosition);\r\n }\r\n\r\n let radiusStep = this._myTeleportParams.myDetectionParams.myVisibilityCheckRadius / this._myTeleportParams.myDetectionParams.myVisibilityCheckCircumferenceStepAmount;\r\n let sliceAngle = 360 / this._myTeleportParams.myDetectionParams.myVisibilityCheckCircumferenceSliceAmount;\r\n let currentStepRotation = 0;\r\n for (let i = 0; i < this._myTeleportParams.myDetectionParams.myVisibilityCheckCircumferenceStepAmount; i++) {\r\n let currentRadius = radiusStep * (i + 1);\r\n\r\n currentDirection = up.vec3_rotateAxis(currentStepRotation, forward, currentDirection);\r\n for (let j = 0; j < this._myTeleportParams.myDetectionParams.myVisibilityCheckCircumferenceSliceAmount; j++) {\r\n let tempCheckPosition = _localGetCachedCheckPosition();\r\n let sliceDirection = currentDirection.vec3_rotateAxis(sliceAngle * j, forward, tempCheckPosition);\r\n checkPositions.push(position.vec3_add(sliceDirection.vec3_scale(currentRadius, sliceDirection), sliceDirection));\r\n }\r\n\r\n currentStepRotation += this._myTeleportParams.myDetectionParams.myVisibilityCheckCircumferenceRotationPerStep;\r\n }\r\n\r\n return checkPositions;\r\n };\r\n}();", "import { VisualArrow, VisualArrowParams } from \"../../../../../../cauldron/visual/elements/visual_arrow.js\";\r\nimport { VisualLine, VisualLineParams } from \"../../../../../../cauldron/visual/elements/visual_line.js\";\r\nimport { VisualPoint, VisualPointParams } from \"../../../../../../cauldron/visual/elements/visual_point.js\";\r\nimport { VisualTorus, VisualTorusParams } from \"../../../../../../cauldron/visual/elements/visual_torus.js\";\r\nimport { quat2_create, quat_create, vec3_create, vec4_create } from \"../../../../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Globals } from \"../../../../../../pp/globals.js\";\r\n\r\nexport class PlayerLocomotionTeleportDetectionVisualizerParams {\r\n\r\n constructor() {\r\n this.myTeleportValidMaterial = null;\r\n this.myTeleportInvalidMaterial = null;\r\n\r\n this.myTeleportPositionObject = null;\r\n this.myTeleportPositionObjectRotateWithHead = true;\r\n\r\n this.myTeleportParableLineEndOffset = 0.05;\r\n this.myTeleportParableMinVerticalDistanceToShowVerticalLine = 0.80;\r\n this.myTeleportParableShowVerticalLineMaxLength = 0.30;\r\n\r\n this.myTeleportParablePositionUpOffset = 0.05;\r\n\r\n this.myTeleportParablePositionVisualAlignOnSurface = true;\r\n\r\n this.myVisualTeleportPositionLerpEnabled = true;\r\n this.myVisualTeleportPositionLerpFactor = 10;\r\n this.myVisualTeleportPositionMinDistanceToResetLerp = 0.005;\r\n this.myVisualTeleportPositionMinDistanceToLerp = 0.15;\r\n this.myVisualTeleportPositionMaxDistanceToLerp = 5;\r\n\r\n this.myVisualTeleportPositionMinDistanceToCloseLerpFactor = 0.02;\r\n this.myVisualTeleportPositionCloseLerpFactor = 30;\r\n\r\n this.myVisualTeleportPositionMinAngleDistanceToResetLerp = 0.1;\r\n this.myVisualTeleportPositionMinAngleDistanceToLerp = 1;\r\n this.myVisualTeleportPositionMaxAngleDistanceToLerp = 180;\r\n }\r\n}\r\n\r\nexport class PlayerLocomotionTeleportDetectionVisualizer {\r\n\r\n constructor(teleportParams, teleportRuntimeParams, detectionRuntimeParams) {\r\n this._myDetectionRuntimeParams = detectionRuntimeParams;\r\n\r\n this._myTeleportParams = teleportParams;\r\n this._myTeleportRuntimeParams = teleportRuntimeParams;\r\n\r\n this._myVisualTeleportTransformQuatReset = true;\r\n this._myVisualTeleportTransformQuat = quat2_create();\r\n this._myVisualTeleportTransformPositionLerping = false;\r\n this._myVisualTeleportTransformRotationLerping = false;\r\n\r\n //Globals.getEasyTuneVariables(this._myTeleportParams.myEngine).add(new EasyTuneNumber(\"Teleport Min Distance Lerp\", this._myTeleportParams.myVisualizerParams.myVisualTeleportPositionMinDistanceToLerp, 1, 3, 0, undefined, undefined, this._myTeleportParams.myEngine));\r\n //Globals.getEasyTuneVariables(this._myTeleportParams.myEngine).add(new EasyTuneNumber(\"Teleport Max Distance Lerp\", this._myTeleportParams.myVisualizerParams.myVisualTeleportPositionMaxDistanceToLerp, 1, 3, 0, undefined, undefined, this._myTeleportParams.myEngine));\r\n //Globals.getEasyTuneVariables(this._myTeleportParams.myEngine).add(new EasyTuneNumber(\"Teleport Min Angle Distance Lerp\", this._myTeleportParams.myVisualizerParams.myVisualTeleportPositionMinAngleDistanceToLerp, 10, 3, 0, undefined, undefined, this._myTeleportParams.myEngine));\r\n //Globals.getEasyTuneVariables(this._myTeleportParams.myEngine).add(new EasyTuneNumber(\"Teleport Max Angle Distance Lerp\", this._myTeleportParams.myVisualizerParams.myVisualTeleportPositionMaxAngleDistanceToLerp, 10, 3, 0, undefined, undefined, this._myTeleportParams.myEngine));\r\n\r\n this._setupVisuals();\r\n\r\n this._myDestroyed = false;\r\n }\r\n\r\n start() {\r\n\r\n }\r\n\r\n end() {\r\n this._myVisualTeleportTransformQuatReset = true;\r\n this._myVisualTeleportTransformPositionLerping = false;\r\n this._myVisualTeleportTransformRotationLerping = false;\r\n\r\n this._hideTeleportPosition();\r\n }\r\n\r\n update(dt) {\r\n //this._myTeleportParams.myVisualizerParams.myVisualTeleportPositionMinDistanceToLerp = Globals.getEasyTuneVariables(this._myTeleportParams.myEngine).get(\"Teleport Min Distance Lerp\");\r\n //this._myTeleportParams.myVisualizerParams.myVisualTeleportPositionMaxDistanceToLerp = Globals.getEasyTuneVariables(this._myTeleportParams.myEngine).get(\"Teleport Max Distance Lerp\");\r\n //this._myTeleportParams.myVisualizerParams.myVisualTeleportPositionMinAngleDistanceToLerp = Globals.getEasyTuneVariables(this._myTeleportParams.myEngine).get(\"Teleport Min Angle Distance Lerp\");\r\n //this._myTeleportParams.myVisualizerParams.myVisualTeleportPositionMaxAngleDistanceToLerp = Globals.getEasyTuneVariables(this._myTeleportParams.myEngine).get(\"Teleport Max Angle Distance Lerp\");\r\n\r\n if (this._myDetectionRuntimeParams.myTeleportDetectionValid) {\r\n this._showTeleportPosition(dt);\r\n } else {\r\n this._myVisualTeleportTransformQuatReset = true;\r\n this._myVisualTeleportTransformPositionLerping = false;\r\n this._myVisualTeleportTransformRotationLerping = false;\r\n this._hideTeleportPosition();\r\n }\r\n }\r\n\r\n _showTeleportPosition(dt) {\r\n this._showTeleportParable(dt);\r\n }\r\n\r\n _hideTeleportPosition() {\r\n for (let visualLine of this._myValidVisualLines) {\r\n visualLine.setVisible(false);\r\n }\r\n\r\n for (let visualLine of this._myInvalidVisualLines) {\r\n visualLine.setVisible(false);\r\n }\r\n\r\n this._myValidVisualPoint.setVisible(false);\r\n this._myInvalidVisualPoint.setVisible(false);\r\n\r\n this._myValidVisualVerticalArrow.setVisible(false);\r\n\r\n this._myValidVisualTeleportPositionTorus.setVisible(false);\r\n this._myValidVisualTeleportPositionTorusInner.setVisible(false);\r\n\r\n if (this._myTeleportParams.myVisualizerParams.myTeleportPositionObject != null) {\r\n this._myTeleportParams.myVisualizerParams.myTeleportPositionObject.pp_setActive(false);\r\n }\r\n }\r\n\r\n _addVisualLines(amount) {\r\n for (let i = 0; i < amount; i++) {\r\n {\r\n let visualParams = new VisualLineParams(this._myTeleportParams.myEngine);\r\n\r\n if (this._myTeleportParams.myVisualizerParams.myTeleportValidMaterial != null) {\r\n visualParams.myMaterial = this._myTeleportParams.myVisualizerParams.myTeleportValidMaterial;\r\n } else {\r\n visualParams.myMaterial = this._myTeleportValidMaterial;\r\n }\r\n\r\n this._myValidVisualLines.push(new VisualLine(visualParams));\r\n }\r\n\r\n {\r\n let visualParams = new VisualLineParams(this._myTeleportParams.myEngine);\r\n\r\n if (this._myTeleportParams.myVisualizerParams.myTeleportValidMaterial != null) {\r\n visualParams.myMaterial = this._myTeleportParams.myVisualizerParams.myTeleportInvalidMaterial;\r\n } else {\r\n visualParams.myMaterial = this._myTeleportInvalidMaterial;\r\n }\r\n\r\n this._myInvalidVisualLines.push(new VisualLine(visualParams));\r\n }\r\n }\r\n }\r\n\r\n _showTeleportParablePosition(dt) {\r\n // Implemented outside class definition\r\n }\r\n\r\n _showTeleportParable(dt) {\r\n // Implemented outside class definition\r\n }\r\n\r\n _setupVisuals() {\r\n // Implemented outside class definition\r\n }\r\n\r\n destroy() {\r\n this._myDestroyed = true;\r\n\r\n for (let visual of this._myValidVisualLines) {\r\n visual.destroy();\r\n }\r\n\r\n for (let visual of this._myInvalidVisualLines) {\r\n visual.destroy();\r\n }\r\n\r\n this._myValidVisualPoint.destroy();\r\n this._myInvalidVisualPoint.destroy();\r\n\r\n this._myValidVisualVerticalArrow.destroy();\r\n this._myValidVisualTeleportPositionTorus.destroy();\r\n this._myValidVisualTeleportPositionTorusInner.destroy();\r\n }\r\n\r\n isDestroyed() {\r\n return this._myDestroyed;\r\n }\r\n}\r\n\r\n\r\n\r\n// IMPLEMENTATION\r\n\r\nPlayerLocomotionTeleportDetectionVisualizer.prototype._setupVisuals = function () {\r\n let innerTorusPosition = vec3_create();\r\n return function _setupVisuals() {\r\n this._myTeleportValidMaterial = Globals.getDefaultMaterials(this._myTeleportParams.myEngine).myFlatOpaque.clone();\r\n this._myTeleportValidMaterial.color = vec4_create(0, 0.5, 1, 1);\r\n this._myTeleportInvalidMaterial = Globals.getDefaultMaterials(this._myTeleportParams.myEngine).myFlatOpaque.clone();\r\n this._myTeleportInvalidMaterial.color = vec4_create(0.75, 0.05, 0, 1);\r\n\r\n this._myValidVisualLines = [];\r\n this._myInvalidVisualLines = [];\r\n this._addVisualLines(30);\r\n\r\n {\r\n let visualParams = new VisualPointParams(this._myTeleportParams.myEngine);\r\n\r\n if (this._myTeleportParams.myVisualizerParams.myTeleportValidMaterial != null) {\r\n visualParams.myMaterial = this._myTeleportParams.myVisualizerParams.myTeleportValidMaterial;\r\n } else {\r\n visualParams.myMaterial = this._myTeleportValidMaterial;\r\n }\r\n\r\n this._myValidVisualPoint = new VisualPoint(visualParams);\r\n }\r\n\r\n {\r\n let visualParams = new VisualPointParams(this._myTeleportParams.myEngine);\r\n\r\n if (this._myTeleportParams.myVisualizerParams.myTeleportInvalidMaterial != null) {\r\n visualParams.myMaterial = this._myTeleportParams.myVisualizerParams.myTeleportInvalidMaterial;\r\n } else {\r\n visualParams.myMaterial = this._myTeleportInvalidMaterial;\r\n }\r\n\r\n this._myInvalidVisualPoint = new VisualPoint(visualParams);\r\n }\r\n\r\n {\r\n let visualParams = new VisualArrowParams(this._myTeleportParams.myEngine);\r\n\r\n if (this._myTeleportParams.myVisualizerParams.myTeleportValidMaterial != null) {\r\n visualParams.myMaterial = this._myTeleportParams.myVisualizerParams.myTeleportValidMaterial;\r\n } else {\r\n visualParams.myMaterial = this._myTeleportValidMaterial;\r\n }\r\n\r\n this._myValidVisualVerticalArrow = new VisualArrow(visualParams);\r\n }\r\n\r\n this._myVisualTeleportPositionObject = Globals.getPlayerObjects(this._myTeleportParams.myEngine).myCauldron.pp_addChild();\r\n\r\n //Globals.getEasyTuneVariables(this._myTeleportParams.myEngine).add(new EasyTuneNumber(\"Teleport Torus Radius\", 0.175, 0.1, 3, undefined, undefined, undefined, this._myTeleportParams.myEngine));\r\n //Globals.getEasyTuneVariables(this._myTeleportParams.myEngine).add(new EasyTuneInt(\"Teleport Torus Segments\", 24, 1, undefined, undefined, undefined, this._myTeleportParams.myEngine));\r\n //Globals.getEasyTuneVariables(this._myTeleportParams.myEngine).add(new EasyTuneNumber(\"Teleport Torus Thickness\", 0.02, 0.1, 3, undefined, undefined, undefined, this._myTeleportParams.myEngine));\r\n\r\n //Globals.getEasyTuneVariables(this._myTeleportParams.myEngine).add(new EasyTuneNumber(\"Teleport Torus Inner Radius\", 0.04, 0.1, 3, undefined, undefined, undefined, this._myTeleportParams.myEngine));\r\n\r\n {\r\n let visualParams = new VisualTorusParams(this._myTeleportParams.myEngine);\r\n visualParams.myRadius = 0.175;\r\n visualParams.mySegmentsAmount = 24;\r\n visualParams.mySegmentThickness = 0.02;\r\n\r\n //visualParams.myRadius = Globals.getEasyTuneVariables(this._myTeleportParams.myEngine).get(\"Teleport Torus Radius\");\r\n //visualParams.mySegmentsAmount = Globals.getEasyTuneVariables(this._myTeleportParams.myEngine).get(\"Teleport Torus Segments\");\r\n //visualParams.mySegmentThickness = Globals.getEasyTuneVariables(this._myTeleportParams.myEngine).get(\"Teleport Torus Thickness\");\r\n\r\n if (this._myTeleportParams.myVisualizerParams.myTeleportValidMaterial != null) {\r\n visualParams.myMaterial = this._myTeleportParams.myVisualizerParams.myTeleportValidMaterial;\r\n } else {\r\n visualParams.myMaterial = this._myTeleportValidMaterial;\r\n }\r\n\r\n visualParams.myParent = this._myVisualTeleportPositionObject;\r\n visualParams.myLocal = true;\r\n\r\n this._myValidVisualTeleportPositionTorus = new VisualTorus(visualParams);\r\n }\r\n\r\n {\r\n let visualParams = new VisualTorusParams(this._myTeleportParams.myEngine);\r\n visualParams.myRadius = 0.04;\r\n visualParams.mySegmentsAmount = 24;\r\n visualParams.mySegmentThickness = 0.02;\r\n\r\n //visualParams.myRadius = Globals.getEasyTuneVariables(this._myTeleportParams.myEngine).get(\"Teleport Torus Inner Radius\");\r\n //visualParams.mySegmentsAmount = Globals.getEasyTuneVariables(this._myTeleportParams.myEngine).get(\"Teleport Torus Segments\");\r\n //visualParams.mySegmentThickness = Globals.getEasyTuneVariables(this._myTeleportParams.myEngine).get(\"Teleport Torus Thickness\");\r\n\r\n if (this._myTeleportParams.myVisualizerParams.myTeleportValidMaterial != null) {\r\n visualParams.myMaterial = this._myTeleportParams.myVisualizerParams.myTeleportValidMaterial;\r\n } else {\r\n visualParams.myMaterial = this._myTeleportValidMaterial;\r\n }\r\n\r\n visualParams.myParent = this._myVisualTeleportPositionObject;\r\n visualParams.myLocal = true;\r\n\r\n let visualTorusParams = this._myValidVisualTeleportPositionTorus.getParams();\r\n\r\n let innerTorusCenter = (visualTorusParams.myRadius - (visualTorusParams.mySegmentThickness / 2)) / 2;\r\n innerTorusPosition.vec3_set(0, 0, innerTorusCenter);\r\n\r\n visualParams.myTransform.mat4_setPosition(innerTorusPosition);\r\n\r\n this._myValidVisualTeleportPositionTorusInner = new VisualTorus(visualParams);\r\n }\r\n\r\n if (this._myTeleportParams.myVisualizerParams.myTeleportPositionObject != null) {\r\n this._myTeleportParams.myVisualizerParams.myTeleportPositionObject.pp_setParent(this._myVisualTeleportPositionObject);\r\n this._myTeleportParams.myVisualizerParams.myTeleportPositionObject.pp_resetTransformLocal();\r\n this._myTeleportParams.myVisualizerParams.myTeleportPositionObject.pp_setActive(false);\r\n }\r\n\r\n this._hideTeleportPosition();\r\n };\r\n}();\r\n\r\nPlayerLocomotionTeleportDetectionVisualizer.prototype._showTeleportParable = function () {\r\n let currentPosition = vec3_create();\r\n let nextPosition = vec3_create();\r\n\r\n let playerRotationQuat = quat_create();\r\n let playerUp = vec3_create();\r\n let upDifference = vec3_create();\r\n return function _showTeleportParable(dt) {\r\n let showParableDistance = Math.max(this._myDetectionRuntimeParams.myParableDistance - this._myTeleportParams.myVisualizerParams.myTeleportParableLineEndOffset);\r\n let lastParableIndex = this._myDetectionRuntimeParams.myParable.getPositionIndexByDistance(showParableDistance);\r\n let lastParableIndexDistance = this._myDetectionRuntimeParams.myParable.getDistance(lastParableIndex);\r\n\r\n if (lastParableIndex + 1 > this._myValidVisualLines.length) {\r\n this._addVisualLines(lastParableIndex + 1, this._myValidVisualLines.length);\r\n }\r\n\r\n const usedVisualLines = [];\r\n for (let i = 0; i <= lastParableIndex; i++) {\r\n currentPosition = this._myDetectionRuntimeParams.myParable.getPosition(i, currentPosition);\r\n nextPosition = this._myDetectionRuntimeParams.myParable.getPosition(i + 1, nextPosition);\r\n\r\n let visuaLine = (this._myDetectionRuntimeParams.myTeleportPositionValid) ? this._myValidVisualLines[i] : this._myInvalidVisualLines[i];\r\n usedVisualLines.push(visuaLine);\r\n\r\n let currentVisualLineParams = visuaLine.getParams();\r\n\r\n if (i == lastParableIndex) {\r\n let stepLength = Math.max(0, showParableDistance - lastParableIndexDistance);\r\n nextPosition = nextPosition.vec3_sub(currentPosition, nextPosition).vec3_normalize(nextPosition);\r\n nextPosition = currentPosition.vec3_add(nextPosition.vec3_scale(stepLength, nextPosition), nextPosition);\r\n }\r\n\r\n currentVisualLineParams.setStartEnd(currentPosition, nextPosition);\r\n currentVisualLineParams.myThickness = 0.005;\r\n\r\n visuaLine.paramsUpdated();\r\n visuaLine.setVisible(true);\r\n\r\n if (this._myTeleportParams.myDebugEnabled && this._myTeleportParams.myDebugShowEnabled && Globals.isDebugEnabled(this._myTeleportParams.myEngine)) {\r\n Globals.getDebugVisualManager(this._myTeleportParams.myEngine).drawPoint(0, currentPosition, vec4_create(1, 0, 0, 1), 0.01);\r\n }\r\n }\r\n\r\n for (let visualLine of this._myValidVisualLines) {\r\n if (usedVisualLines.indexOf(visualLine) == -1) {\r\n visualLine.setVisible(false);\r\n }\r\n }\r\n\r\n for (let visualLine of this._myInvalidVisualLines) {\r\n if (usedVisualLines.indexOf(visualLine) == -1) {\r\n visualLine.setVisible(false);\r\n }\r\n }\r\n\r\n let visualPoint = (this._myDetectionRuntimeParams.myTeleportPositionValid) ? this._myValidVisualPoint : this._myInvalidVisualPoint;\r\n let visualPointParams = visualPoint.getParams();\r\n visualPointParams.myPosition.vec3_copy(nextPosition);\r\n visualPointParams.myRadius = 0.01;\r\n visualPoint.paramsUpdated();\r\n visualPoint.setVisible(true);\r\n\r\n let unusedVisualPoint = (this._myDetectionRuntimeParams.myTeleportPositionValid) ? this._myInvalidVisualPoint : this._myValidVisualPoint;\r\n unusedVisualPoint.setVisible(false);\r\n\r\n if (this._myDetectionRuntimeParams.myTeleportPositionValid) {\r\n playerUp = this._myTeleportParams.myPlayerTransformManager.getRotationRealQuat(playerRotationQuat).quat_getUp(playerUp);\r\n\r\n upDifference = nextPosition.vec3_sub(this._myTeleportRuntimeParams.myTeleportPosition, upDifference).vec3_componentAlongAxis(playerUp, upDifference);\r\n let upDistance = upDifference.vec3_valueAlongAxis(playerUp);\r\n if (upDistance >= this._myTeleportParams.myVisualizerParams.myTeleportParableMinVerticalDistanceToShowVerticalLine) {\r\n let lineLength = Math.min(upDistance - this._myTeleportParams.myVisualizerParams.myTeleportParableMinVerticalDistanceToShowVerticalLine, this._myTeleportParams.myVisualizerParams.myTeleportParableShowVerticalLineMaxLength);\r\n\r\n let visualArrowParams = this._myValidVisualVerticalArrow.getParams();\r\n\r\n visualArrowParams.myStart.vec3_copy(nextPosition);\r\n visualArrowParams.myDirection = playerUp.vec3_negate(visualArrowParams.myDirection);\r\n visualArrowParams.myLength = lineLength;\r\n visualArrowParams.myThickness = 0.005;\r\n\r\n visualArrowParams.myArrowThickness = visualPointParams.myRadius;\r\n visualArrowParams.myArrowLength = visualArrowParams.myArrowThickness * 3.5 / 1.5;\r\n\r\n this._myValidVisualVerticalArrow.paramsUpdated();\r\n this._myValidVisualVerticalArrow.setVisible(true);\r\n } else {\r\n this._myValidVisualVerticalArrow.setVisible(false);\r\n }\r\n\r\n this._showTeleportParablePosition(dt);\r\n } else {\r\n this._myValidVisualTeleportPositionTorus.setVisible(false);\r\n this._myValidVisualTeleportPositionTorusInner.setVisible(false);\r\n\r\n this._myValidVisualVerticalArrow.setVisible(false);\r\n\r\n if (this._myTeleportParams.myVisualizerParams.myTeleportPositionObject != null) {\r\n this._myTeleportParams.myVisualizerParams.myTeleportPositionObject.pp_setActive(false);\r\n }\r\n\r\n this._myVisualTeleportTransformQuatReset = true;\r\n this._myVisualTeleportTransformPositionLerping = false;\r\n this._myVisualTeleportTransformRotationLerping = false;\r\n }\r\n };\r\n}();\r\n\r\nPlayerLocomotionTeleportDetectionVisualizer.prototype._showTeleportParablePosition = function () {\r\n let playerUp = vec3_create();\r\n let feetRotationQuat = quat_create();\r\n\r\n let parableFirstPosition = vec3_create();\r\n let parableSecondPosition = vec3_create();\r\n let parableDirection = vec3_create();\r\n\r\n let visualPosition = vec3_create();\r\n let visualForward = vec3_create();\r\n let visualRotationQuat = quat_create();\r\n\r\n let currentVisualTeleportTransformQuat = quat2_create();\r\n let currentVisualTeleportPosition = vec3_create();\r\n let currentVisualTeleportRotationQuat = quat_create();\r\n let differenceRotationQuat = quat_create();\r\n\r\n return function _showTeleportParablePosition(dt) {\r\n this._myTeleportParams.myPlayerTransformManager.getRotationRealQuat(feetRotationQuat);\r\n feetRotationQuat.quat_getUp(playerUp);\r\n\r\n visualPosition = this._myTeleportRuntimeParams.myTeleportPosition.vec3_add(playerUp.vec3_scale(this._myTeleportParams.myVisualizerParams.myTeleportParablePositionUpOffset, visualPosition), visualPosition);\r\n\r\n if (!this._myDetectionRuntimeParams.myTeleportForward.vec3_isZero(0.00001)) {\r\n visualForward.vec3_copy(this._myDetectionRuntimeParams.myTeleportForward);\r\n } else {\r\n feetRotationQuat.quat_getForward(visualForward);\r\n }\r\n\r\n if (!this._myTeleportParams.myVisualizerParams.myTeleportPositionObjectRotateWithHead) {\r\n parableFirstPosition = this._myDetectionRuntimeParams.myParable.getPosition(0, parableFirstPosition);\r\n parableSecondPosition = this._myDetectionRuntimeParams.myParable.getPosition(1, parableSecondPosition);\r\n parableDirection = parableSecondPosition.vec3_sub(parableFirstPosition, parableDirection).vec3_removeComponentAlongAxis(playerUp, parableDirection);\r\n if (parableDirection.vec3_length() > Math.PP_EPSILON) {\r\n visualForward = parableDirection.vec3_normalize(visualForward);\r\n }\r\n }\r\n\r\n if (this._myTeleportParams.myVisualizerParams.myTeleportParablePositionVisualAlignOnSurface) {\r\n visualRotationQuat.quat_setUp(this._myDetectionRuntimeParams.myTeleportSurfaceNormal, visualForward);\r\n } else {\r\n visualRotationQuat.quat_setUp(playerUp, visualForward);\r\n }\r\n\r\n this._myVisualTeleportTransformQuat.quat2_setPositionRotationQuat(visualPosition, visualRotationQuat);\r\n\r\n if (this._myVisualTeleportTransformQuatReset || !this._myTeleportParams.myVisualizerParams.myVisualTeleportPositionLerpEnabled) {\r\n this._myVisualTeleportPositionObject.pp_setTransformQuat(this._myVisualTeleportTransformQuat);\r\n this._myVisualTeleportTransformQuatReset = false;\r\n } else {\r\n currentVisualTeleportTransformQuat = this._myVisualTeleportPositionObject.pp_getTransformQuat(currentVisualTeleportTransformQuat);\r\n currentVisualTeleportPosition = currentVisualTeleportTransformQuat.quat2_getPosition(currentVisualTeleportPosition);\r\n currentVisualTeleportRotationQuat = currentVisualTeleportTransformQuat.quat2_getRotationQuat(currentVisualTeleportRotationQuat);\r\n currentVisualTeleportRotationQuat.quat_rotationToQuat(visualRotationQuat, differenceRotationQuat);\r\n\r\n let positionDistance = currentVisualTeleportPosition.vec3_distance(visualPosition);\r\n let rotationAngleDistance = differenceRotationQuat.quat_getAngle();\r\n\r\n if ((!this._myVisualTeleportTransformPositionLerping || positionDistance < this._myTeleportParams.myVisualizerParams.myVisualTeleportPositionMinDistanceToResetLerp) &&\r\n (positionDistance < this._myTeleportParams.myVisualizerParams.myVisualTeleportPositionMinDistanceToLerp ||\r\n positionDistance > this._myTeleportParams.myVisualizerParams.myVisualTeleportPositionMaxDistanceToLerp)) {\r\n this._myVisualTeleportTransformPositionLerping = false;\r\n currentVisualTeleportPosition.vec3_copy(visualPosition);\r\n } else {\r\n this._myVisualTeleportTransformPositionLerping = true;\r\n\r\n let interpolationFactor = this._myTeleportParams.myVisualizerParams.myVisualTeleportPositionLerpFactor * dt;\r\n if (positionDistance < this._myTeleportParams.myVisualizerParams.myVisualTeleportPositionMinDistanceToCloseLerpFactor) {\r\n interpolationFactor = this._myTeleportParams.myVisualizerParams.myVisualTeleportPositionCloseLerpFactor * dt;\r\n }\r\n currentVisualTeleportPosition.vec3_lerp(visualPosition, interpolationFactor, currentVisualTeleportPosition);\r\n }\r\n\r\n if ((!this._myVisualTeleportTransformRotationLerping || rotationAngleDistance < this._myTeleportParams.myVisualizerParams.myVisualTeleportPositionMinAngleDistanceToResetLerp) &&\r\n (rotationAngleDistance < this._myTeleportParams.myVisualizerParams.myVisualTeleportPositionMinAngleDistanceToLerp ||\r\n positionDistance > this._myTeleportParams.myVisualizerParams.myVisualTeleportPositionMaxAngleDistanceToLerp)) {\r\n this._myVisualTeleportTransformRotationLerping = false;\r\n currentVisualTeleportRotationQuat.quat_copy(visualRotationQuat);\r\n } else {\r\n let interpolationFactor = this._myTeleportParams.myVisualizerParams.myVisualTeleportPositionLerpFactor * dt;\r\n\r\n this._myVisualTeleportTransformRotationLerping = true;\r\n currentVisualTeleportRotationQuat.quat_slerp(visualRotationQuat, interpolationFactor, currentVisualTeleportRotationQuat);\r\n }\r\n\r\n currentVisualTeleportTransformQuat.quat2_setPositionRotationQuat(currentVisualTeleportPosition, currentVisualTeleportRotationQuat);\r\n this._myVisualTeleportPositionObject.pp_setTransformQuat(currentVisualTeleportTransformQuat);\r\n }\r\n\r\n if (this._myTeleportParams.myVisualizerParams.myTeleportPositionObject == null) {\r\n {\r\n let visualParams = this._myValidVisualTeleportPositionTorus.getParams();\r\n visualParams.myRadius = 0.175;\r\n visualParams.mySegmentsAmount = 24;\r\n visualParams.mySegmentThickness = 0.02;\r\n\r\n //visualParams.myRadius = Globals.getEasyTuneVariables(this._myTeleportParams.myEngine).get(\"Teleport Torus Radius\");\r\n //visualParams.mySegmentsAmount = Globals.getEasyTuneVariables(this._myTeleportParams.myEngine).get(\"Teleport Torus Segments\");\r\n //visualParams.mySegmentThickness = Globals.getEasyTuneVariables(this._myTeleportParams.myEngine).get(\"Teleport Torus Thickness\");\r\n\r\n this._myValidVisualTeleportPositionTorus.paramsUpdated();\r\n }\r\n\r\n {\r\n let visualParams = this._myValidVisualTeleportPositionTorusInner.getParams();\r\n visualParams.myRadius = 0.04;\r\n visualParams.mySegmentsAmount = 24;\r\n visualParams.mySegmentThickness = 0.02;\r\n\r\n //visualParams.myRadius = Globals.getEasyTuneVariables(this._myTeleportParams.myEngine).get(\"Teleport Torus Inner Radius\");\r\n //visualParams.mySegmentsAmount = Globals.getEasyTuneVariables(this._myTeleportParams.myEngine).get(\"Teleport Torus Segments\");\r\n //visualParams.mySegmentThickness = Globals.getEasyTuneVariables(this._myTeleportParams.myEngine).get(\"Teleport Torus Thickness\");\r\n\r\n this._myValidVisualTeleportPositionTorusInner.paramsUpdated();\r\n }\r\n\r\n this._myValidVisualTeleportPositionTorus.setVisible(true);\r\n this._myValidVisualTeleportPositionTorusInner.setVisible(true);\r\n } else {\r\n this._myValidVisualTeleportPositionTorus.setVisible(false);\r\n this._myValidVisualTeleportPositionTorusInner.setVisible(false);\r\n this._myTeleportParams.myVisualizerParams.myTeleportPositionObject.pp_setActive(true);\r\n }\r\n\r\n if (this._myTeleportParams.myDebugEnabled && this._myTeleportParams.myDebugShowEnabled && Globals.isDebugEnabled(this._myTeleportParams.myEngine)) {\r\n Globals.getDebugVisualManager(this._myTeleportParams.myEngine).drawPoint(0, this._myTeleportRuntimeParams.myTeleportPosition, vec4_create(0, 0, 1, 1), 0.02);\r\n }\r\n };\r\n}();", "import { vec3_create } from \"../../../../../../plugin/js/extensions/array/vec_create_extension.js\";\r\n\r\nexport class PlayerLocomotionTeleportParable {\r\n\r\n constructor() {\r\n this._myStartPosition = vec3_create();\r\n\r\n this._myForward = vec3_create();\r\n this._myUp = vec3_create();\r\n\r\n this._mySpeed = 0;\r\n this._myGravity = 0;\r\n this._myStepLength = 0;\r\n }\r\n\r\n setStartPosition(startPosition) {\r\n this._myStartPosition.vec3_copy(startPosition);\r\n }\r\n\r\n setForward(forward) {\r\n this._myForward.vec3_copy(forward);\r\n }\r\n\r\n setUp(up) {\r\n this._myUp.vec3_copy(up);\r\n }\r\n\r\n setSpeed(speed) {\r\n this._mySpeed = speed;\r\n }\r\n\r\n setGravity(gravity) {\r\n this._myGravity = gravity;\r\n }\r\n\r\n setStepLength(stepLength) {\r\n this._myStepLength = stepLength;\r\n }\r\n\r\n getPosition(positionIndex, outPosition = vec3_create()) {\r\n // Implemented outside class definition\r\n }\r\n\r\n getDistance(positionIndex) {\r\n // Implemented outside class definition\r\n }\r\n\r\n getPositionIndexByDistance(distance) {\r\n // Implemented outside class definition\r\n }\r\n\r\n getPositionByDistance(distance, outPosition = vec3_create()) {\r\n // Implemented outside class definition\r\n }\r\n\r\n getDistanceOverFlatDistance(flatDistance, maxParableDistance) {\r\n // Implemented outside class definition\r\n }\r\n\r\n getFlatDistanceOverDistance(distance) {\r\n // Implemented outside class definition\r\n }\r\n}\r\n\r\n\r\n\r\n// IMPLEMENTATION\r\n\r\nPlayerLocomotionTeleportParable.prototype.getPosition = function () {\r\n let forwardPosition = vec3_create();\r\n let upPosition = vec3_create();\r\n return function getPosition(positionIndex, outPosition = vec3_create()) {\r\n let deltaTimePerStep = this._myStepLength / this._mySpeed;\r\n\r\n let elapsedTime = deltaTimePerStep * positionIndex;\r\n\r\n forwardPosition = this._myForward.vec3_scale(this._mySpeed * elapsedTime, forwardPosition);\r\n forwardPosition = forwardPosition.vec3_add(this._myStartPosition, forwardPosition);\r\n\r\n upPosition = this._myUp.vec3_scale(this._myGravity * elapsedTime * elapsedTime / 2, upPosition);\r\n\r\n outPosition = forwardPosition.vec3_add(upPosition, outPosition);\r\n\r\n return outPosition;\r\n };\r\n}();\r\n\r\nPlayerLocomotionTeleportParable.prototype.getDistance = function () {\r\n let currentPosition = vec3_create();\r\n let prevPosition = vec3_create();\r\n return function getDistance(positionIndex) {\r\n let distance = 0;\r\n prevPosition.vec3_copy(this._myStartPosition);\r\n\r\n for (let i = 1; i <= positionIndex; i++) {\r\n currentPosition = this.getPosition(i, currentPosition);\r\n distance += currentPosition.vec3_distance(prevPosition);\r\n\r\n prevPosition.vec3_copy(currentPosition);\r\n }\r\n\r\n return distance;\r\n };\r\n}();\r\n\r\nPlayerLocomotionTeleportParable.prototype.getPositionIndexByDistance = function () {\r\n let currentPosition = vec3_create();\r\n let prevPosition = vec3_create();\r\n return function getPositionIndexByDistance(distance) {\r\n let currentDistance = 0;\r\n let currentIndex = 0;\r\n prevPosition = this.getPosition(currentIndex, prevPosition);\r\n\r\n while (currentDistance < distance) {\r\n currentPosition = this.getPosition(currentIndex + 1, currentPosition);\r\n currentDistance += currentPosition.vec3_distance(prevPosition);\r\n currentIndex++;\r\n\r\n prevPosition.vec3_copy(currentPosition);\r\n }\r\n\r\n return Math.max(0, currentIndex - 1);\r\n };\r\n}();\r\n\r\nPlayerLocomotionTeleportParable.prototype.getPositionByDistance = function () {\r\n let currentPosition = vec3_create();\r\n let prevPosition = vec3_create();\r\n let prevToCurrent = vec3_create();\r\n return function getPositionByDistance(distance, outPosition = vec3_create()) {\r\n let currentDistance = 0;\r\n let currentIndex = 0;\r\n let found = false;\r\n\r\n prevPosition = this.getPosition(currentIndex, prevPosition);\r\n while (!found) {\r\n currentPosition = this.getPosition(currentIndex + 1, currentPosition);\r\n currentDistance += currentPosition.vec3_distance(prevPosition);\r\n currentIndex++;\r\n\r\n if (currentDistance > distance) {\r\n let lengthToRemove = currentDistance - distance;\r\n prevToCurrent = currentPosition.vec3_sub(prevPosition, prevToCurrent);\r\n let lengthToAdd = prevToCurrent.vec3_length() - lengthToRemove;\r\n prevToCurrent.vec3_normalize(prevToCurrent);\r\n\r\n outPosition = prevPosition.vec3_add(prevToCurrent.vec3_scale(lengthToAdd, outPosition), outPosition);\r\n found = true;\r\n }\r\n prevPosition.vec3_copy(currentPosition);\r\n }\r\n\r\n return outPosition;\r\n };\r\n}();\r\n\r\nPlayerLocomotionTeleportParable.prototype.getDistanceOverFlatDistance = function () {\r\n let currentPosition = vec3_create();\r\n let flatCurrentPosition = vec3_create();\r\n let flatStartPosition = vec3_create();\r\n let prevPosition = vec3_create();\r\n let prevToCurrent = vec3_create();\r\n let startToCurrentFlat = vec3_create();\r\n return function getDistanceOverFlatDistance(flatDistance, maxParableDistance) {\r\n if (flatDistance < 0.00001) {\r\n return 0;\r\n }\r\n\r\n let currentDistance = 0;\r\n let currentIndex = 0;\r\n flatStartPosition = this._myStartPosition.vec3_removeComponentAlongAxis(this._myUp, flatStartPosition);\r\n prevPosition = this.getPosition(currentIndex, prevPosition);\r\n\r\n let distanceOverFlatDistance = 0;\r\n\r\n while (currentDistance <= maxParableDistance) {\r\n currentPosition = this.getPosition(currentIndex + 1, currentPosition);\r\n currentDistance += currentPosition.vec3_distance(prevPosition);\r\n currentIndex++;\r\n\r\n flatCurrentPosition = currentPosition.vec3_removeComponentAlongAxis(this._myUp, flatCurrentPosition);\r\n startToCurrentFlat = flatCurrentPosition.vec3_sub(flatStartPosition, startToCurrentFlat);\r\n let currentFlatDistance = startToCurrentFlat.vec3_length();\r\n if (currentFlatDistance >= flatDistance) {\r\n let flatDifference = currentFlatDistance - flatDistance;\r\n prevToCurrent = currentPosition.vec3_sub(prevPosition, prevToCurrent);\r\n let angleWithFlat = prevToCurrent.vec3_angleRadians(startToCurrentFlat);\r\n let cos = Math.cos(angleWithFlat);\r\n let lengthToRemove = prevToCurrent.vec3_length();\r\n if (cos != 0) {\r\n lengthToRemove = flatDifference / Math.cos(angleWithFlat);\r\n }\r\n\r\n distanceOverFlatDistance = currentDistance - lengthToRemove;\r\n break;\r\n\r\n } else {\r\n distanceOverFlatDistance = currentDistance;\r\n }\r\n\r\n prevPosition.vec3_copy(currentPosition);\r\n }\r\n\r\n return Math.min(maxParableDistance, distanceOverFlatDistance);\r\n };\r\n}();\r\n\r\nPlayerLocomotionTeleportParable.prototype.getFlatDistanceOverDistance = function () {\r\n let positionByDistance = vec3_create();\r\n let flatPositionByDistance = vec3_create();\r\n let flatStartPosition = vec3_create();\r\n return function getFlatDistanceOverDistance(distance) {\r\n positionByDistance = this.getPositionByDistance(distance, positionByDistance);\r\n\r\n flatPositionByDistance = positionByDistance.vec3_removeComponentAlongAxis(this._myUp, flatPositionByDistance);\r\n flatStartPosition = this._myStartPosition.vec3_removeComponentAlongAxis(this._myUp, flatStartPosition);\r\n\r\n return flatStartPosition.vec3_distance(flatPositionByDistance);\r\n };\r\n}();", "import { quat2_create, quat_create, vec3_create } from \"../../../../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { CollisionRuntimeParams } from \"../../../../character_controller/collision/legacy/collision_check/collision_params.js\";\r\n\r\nexport class PlayerLocomotionTeleportState {\r\n\r\n constructor(teleportParams, teleportRuntimeParams, locomotionRuntimeParams) {\r\n this._myLocomotionRuntimeParams = locomotionRuntimeParams;\r\n\r\n this._myTeleportParams = teleportParams;\r\n this._myTeleportRuntimeParams = teleportRuntimeParams;\r\n\r\n this._myTeleportAsMovementFailed = false;\r\n }\r\n\r\n cancelTeleport() {\r\n\r\n }\r\n\r\n _teleport() {\r\n this._teleportToPosition(this._myTeleportRuntimeParams.myTeleportPosition, this._myTeleportRuntimeParams.myTeleportForward);\r\n this._myLocomotionRuntimeParams.myIsTeleporting = false;\r\n this._myLocomotionRuntimeParams.myTeleportJustPerformed = true;\r\n\r\n this._myTeleportParams.myPlayerTransformManager.resetReal();\r\n }\r\n\r\n _checkTeleport(teleportPosition, teleportRotationQuat, collisionRuntimeParams, checkTeleportCollisionRuntimeParams = null) {\r\n // Implemented outside class definition\r\n }\r\n\r\n _checkTeleportAsMovement(teleportPosition, teleportRotationQuat, collisionRuntimeParams, checkTeleportCollisionRuntimeParams) {\r\n // Implemented outside class definition\r\n }\r\n\r\n _teleportToPosition(teleportPosition, teleportForward, collisionRuntimeParams, forceTeleport = false) {\r\n // Implemented outside class definition\r\n }\r\n}\r\n\r\n\r\n\r\n// IMPLEMENTATION\r\n\r\nPlayerLocomotionTeleportState.prototype._checkTeleport = function () {\r\n let teleportTransformQuat = quat2_create();\r\n return function _checkTeleport(teleportPosition, teleportRotationQuat, collisionRuntimeParams, checkTeleportCollisionRuntimeParams = null) {\r\n teleportTransformQuat.quat2_setPositionRotationQuat(teleportPosition, teleportRotationQuat);\r\n\r\n this._myTeleportParams.myPlayerTransformManager.checkTeleportToTransformQuat(teleportTransformQuat, undefined, undefined, true, collisionRuntimeParams);\r\n\r\n if (checkTeleportCollisionRuntimeParams != null) {\r\n checkTeleportCollisionRuntimeParams.copy(collisionRuntimeParams);\r\n }\r\n };\r\n}();\r\n\r\nPlayerLocomotionTeleportState.prototype._checkTeleportAsMovement = function () {\r\n let checkTeleportMovementCollisionRuntimeParams = new CollisionRuntimeParams();\r\n let feetRotationQuat = quat_create();\r\n let playerUp = vec3_create();\r\n\r\n let currentFeetPosition = vec3_create();\r\n let fixedTeleportPosition = vec3_create();\r\n\r\n let teleportMovement = vec3_create();\r\n let extraVerticalMovement = vec3_create();\r\n let movementToTeleportPosition = vec3_create();\r\n let movementFeetTransformQuat = quat2_create();\r\n return function _checkTeleportAsMovement(teleportPosition, teleportRotationQuat, collisionRuntimeParams, checkTeleportCollisionRuntimeParams) {\r\n checkTeleportMovementCollisionRuntimeParams.copy(collisionRuntimeParams);\r\n\r\n this._checkTeleport(teleportPosition, teleportRotationQuat, collisionRuntimeParams, checkTeleportCollisionRuntimeParams);\r\n\r\n // If teleport is ok then we can check movement knowing we have to move toward the teleported position (which has also snapped/fixed the position)\r\n if (!collisionRuntimeParams.myTeleportCanceled) {\r\n let teleportMovementValid = false;\r\n\r\n fixedTeleportPosition.vec3_copy(collisionRuntimeParams.myNewPosition);\r\n this._myTeleportParams.myPlayerTransformManager.getPosition(currentFeetPosition);\r\n\r\n for (let i = 0; i < this._myTeleportParams.myTeleportAsMovementMaxSteps; i++) {\r\n teleportMovement = fixedTeleportPosition.vec3_sub(currentFeetPosition, teleportMovement);\r\n\r\n if (this._myTeleportParams.myTeleportAsMovementRemoveVerticalMovement) {\r\n teleportMovement = teleportMovement.vec3_removeComponentAlongAxis(playerUp, teleportMovement);\r\n }\r\n\r\n if (this._myTeleportParams.myTeleportAsMovementExtraVerticalMovementPerMeter != 0) {\r\n let meters = teleportMovement.vec3_length();\r\n let extraVerticalMovementValue = meters * this._myTeleportParams.myTeleportAsMovementExtraVerticalMovementPerMeter;\r\n extraVerticalMovement = playerUp.vec3_scale(extraVerticalMovementValue, extraVerticalMovement);\r\n teleportMovement = teleportMovement.vec3_add(extraVerticalMovement, teleportMovement);\r\n }\r\n\r\n movementFeetTransformQuat.quat2_setPositionRotationQuat(currentFeetPosition, feetRotationQuat);\r\n\r\n {\r\n const movementCollisionCheckParams = this._myTeleportParams.myPlayerTransformManager.getMovementCollisionCheckParams();\r\n const internalSplitMovementMaxStepsDisabledBackup = movementCollisionCheckParams._myInternalSplitMovementMaxStepsDisabled;\r\n\r\n // This is used for the perform teleport as movement, so it needs to be able to do as many steps needed based on teleport distance\r\n movementCollisionCheckParams._myInternalSplitMovementMaxStepsDisabled = true;\r\n\r\n this._myTeleportParams.myPlayerTransformManager.checkMovement(teleportMovement, movementFeetTransformQuat, undefined, true, checkTeleportMovementCollisionRuntimeParams);\r\n\r\n movementCollisionCheckParams._myInternalSplitMovementMaxStepsDisabled = internalSplitMovementMaxStepsDisabledBackup;\r\n }\r\n\r\n if (!checkTeleportMovementCollisionRuntimeParams.myHorizontalMovementCanceled && !checkTeleportMovementCollisionRuntimeParams.myVerticalMovementCanceled) {\r\n movementToTeleportPosition = fixedTeleportPosition.vec3_sub(checkTeleportMovementCollisionRuntimeParams.myNewPosition, movementToTeleportPosition);\r\n //console.error(movementToTeleportPosition.vec3_length());\r\n if (movementToTeleportPosition.vec3_length() < this._myTeleportParams.myTeleportAsMovementMaxDistanceFromTeleportPosition + 0.00001) {\r\n teleportMovementValid = true;\r\n break;\r\n } else {\r\n teleportMovement.vec3_copy(movementToTeleportPosition);\r\n currentFeetPosition.vec3_copy(checkTeleportMovementCollisionRuntimeParams.myNewPosition);\r\n }\r\n } else {\r\n break;\r\n }\r\n }\r\n\r\n if (!teleportMovementValid) {\r\n collisionRuntimeParams.myTeleportCanceled = true;\r\n }\r\n\r\n this._myTeleportAsMovementFailed = !teleportMovementValid;\r\n }\r\n };\r\n}();\r\n\r\nPlayerLocomotionTeleportState.prototype._teleportToPosition = function () {\r\n let playerUp = vec3_create();\r\n let newFeetTransformQuat = quat2_create();\r\n let newFeetRotationQuat = quat_create();\r\n return function _teleportToPosition(teleportPosition, teleportForward) {\r\n this._myTeleportAsMovementFailed = false;\r\n\r\n this._myTeleportParams.myPlayerTransformManager.getRotationRealQuat(newFeetRotationQuat);\r\n\r\n if (!teleportForward.vec3_isZero(0.00001)) {\r\n newFeetRotationQuat.quat_getUp(playerUp);\r\n newFeetRotationQuat.quat_setUp(playerUp, teleportForward);\r\n }\r\n\r\n newFeetTransformQuat.quat2_setPositionRotationQuat(teleportPosition, newFeetRotationQuat);\r\n\r\n this._myTeleportParams.myPlayerTransformManager.teleportTransformQuat(newFeetTransformQuat, undefined, undefined, true);\r\n };\r\n}();", "import { MeshComponent } from \"@wonderlandengine/api\";\r\nimport { Timer } from \"../../../../../../cauldron/cauldron/timer.js\";\r\nimport { FSM } from \"../../../../../../cauldron/fsm/fsm.js\";\r\nimport { TimerState } from \"../../../../../../cauldron/fsm/states/condition_states/timer_state.js\";\r\nimport { quat_create, vec3_create, vec4_create } from \"../../../../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Globals } from \"../../../../../../pp/globals.js\";\r\nimport { NumberOverFactor } from \"../../../../../cauldron/cauldron/number_over_factor.js\";\r\nimport { PlayerLocomotionTeleportState } from \"./player_locomotion_teleport_state.js\";\r\n\r\nexport class PlayerLocomotionTeleportTeleportBlinkState extends PlayerLocomotionTeleportState {\r\n\r\n constructor(teleportParams, teleportRuntimeParams, locomotionRuntimeParams) {\r\n super(teleportParams, teleportRuntimeParams, locomotionRuntimeParams);\r\n\r\n this._myBlinkSphere = Globals.getPlayerObjects(this._myTeleportParams.myEngine).myCauldron.pp_addChild();\r\n this._myBlinkSphereMeshComponent = this._myBlinkSphere.pp_addComponent(MeshComponent);\r\n this._myBlinkSphereMeshComponent.mesh = Globals.getDefaultMeshes(this._myTeleportParams.myEngine).myInvertedSphere;\r\n this._myBlinkSphereMeshComponent.material = Globals.getDefaultMaterials(this._myTeleportParams.myEngine).myFlatTransparentNoDepth.clone();\r\n this._myBlinkSphereMaterialColor = vec4_create(\r\n this._myTeleportParams.myTeleportParams.myBlinkSphereColor[0] / 255,\r\n this._myTeleportParams.myTeleportParams.myBlinkSphereColor[1] / 255,\r\n this._myTeleportParams.myTeleportParams.myBlinkSphereColor[2] / 255,\r\n 0);\r\n\r\n this._myBlinkSphereMeshComponent.material.color = this._myBlinkSphereMaterialColor;\r\n\r\n this._myBlinkSphere.pp_resetTransformLocal();\r\n this._myBlinkSphere.pp_setScaleLocal(this._myTeleportParams.myTeleportParams.myBlinkSphereScale);\r\n this._myBlinkSphere.pp_setActive(false);\r\n\r\n this._myFSM = new FSM();\r\n //this._myFSM.setLogEnabled(true, \"Locomotion Teleport Teleport Blink\");\r\n\r\n this._myFSM.addState(\"init\");\r\n this._myFSM.addState(\"idle\");\r\n\r\n this._myFSM.addState(\"fade_out\", this._fadeOutUpdate.bind(this));\r\n this._myFSM.addState(\"wait\", new TimerState(this._myTeleportParams.myTeleportParams.myBlinkWaitSeconds, \"done\"));\r\n this._myFSM.addState(\"fade_in\", this._fadeInUpdate.bind(this));\r\n\r\n this._myFSM.addTransition(\"init\", \"idle\", \"start\");\r\n\r\n this._myFSM.addTransition(\"idle\", \"fade_out\", \"teleport\", this._startFadeOut.bind(this));\r\n this._myFSM.addTransition(\"fade_out\", \"wait\", \"done\", this._teleport.bind(this));\r\n this._myFSM.addTransition(\"wait\", \"fade_in\", \"done\", this._startFadeIn.bind(this));\r\n this._myFSM.addTransition(\"fade_in\", \"idle\", \"done\", this._teleportDone.bind(this));\r\n\r\n this._myFSM.addTransition(\"idle\", \"idle\", \"stop\");\r\n this._myFSM.addTransition(\"fade_out\", \"idle\", \"stop\", this._stop.bind(this, true));\r\n this._myFSM.addTransition(\"wait\", \"idle\", \"stop\", this._stop.bind(this, false));\r\n this._myFSM.addTransition(\"fade_in\", \"idle\", \"stop\", this._stop.bind(this, false));\r\n\r\n this._myFSM.addTransition(\"idle\", \"idle\", \"cancel\");\r\n this._myFSM.addTransition(\"fade_out\", \"idle\", \"cancel\", this._cancel.bind(this));\r\n this._myFSM.addTransition(\"wait\", \"idle\", \"cancel\", this._cancel.bind(this));\r\n this._myFSM.addTransition(\"fade_in\", \"idle\", \"cancel\", this._cancel.bind(this));\r\n\r\n this._myFSM.init(\"init\");\r\n this._myFSM.perform(\"start\");\r\n\r\n this._myFadeInTimer = new Timer(this._myTeleportParams.myTeleportParams.myBlinkFadeInSeconds);\r\n this._myFadeOutTimer = new Timer(this._myTeleportParams.myTeleportParams.myBlinkFadeOutSeconds);\r\n this._myFadeOutAlphaOverTime = new NumberOverFactor(0, 1, 0, 1);\r\n this._myFadeInAlphaOverTime = new NumberOverFactor(1, 0, 0, 1);\r\n }\r\n\r\n start(fsm) {\r\n this._myParentFSM = fsm;\r\n\r\n this._myFSM.perform(\"teleport\");\r\n }\r\n\r\n end() {\r\n this._myBlinkSphere.pp_setActive(false);\r\n this._myBlinkSphere.pp_setParent(Globals.getPlayerObjects(this._myTeleportParams.myEngine).myCauldron, false);\r\n\r\n this._myFSM.perform(\"stop\");\r\n }\r\n\r\n cancelTeleport() {\r\n this._myFSM.perform(\"cancel\");\r\n }\r\n\r\n update(dt, fsm) {\r\n this._myBlinkSphere.pp_setParent(this._myTeleportParams.myPlayerTransformManager.getPlayerHeadManager().getHead(), false);\r\n this._myBlinkSphere.pp_resetTransformLocal();\r\n\r\n this._myFSM.update(dt);\r\n }\r\n\r\n _startFadeOut() {\r\n // Implemented outside class definition\r\n }\r\n\r\n _startFadeIn() {\r\n this._myFadeInTimer.start();\r\n }\r\n\r\n _fadeOutUpdate(dt, fsm) {\r\n this._myFadeOutTimer.update(dt);\r\n\r\n let alpha = this._myFadeOutAlphaOverTime.get(this._myFadeOutTimer.getPercentage());\r\n this._myBlinkSphereMaterialColor[3] = alpha;\r\n this._myBlinkSphereMeshComponent.material.color = this._myBlinkSphereMaterialColor;\r\n\r\n if (this._myFadeOutTimer.isDone()) {\r\n fsm.perform(\"done\");\r\n }\r\n }\r\n\r\n _fadeInUpdate(dt, fsm) {\r\n this._myFadeInTimer.update(dt);\r\n\r\n let alpha = this._myFadeInAlphaOverTime.get(this._myFadeInTimer.getPercentage());\r\n this._myBlinkSphereMaterialColor[3] = alpha;\r\n this._myBlinkSphereMeshComponent.material.color = this._myBlinkSphereMaterialColor;\r\n\r\n if (this._myFadeInTimer.isDone()) {\r\n fsm.perform(\"done\");\r\n }\r\n }\r\n\r\n _teleportDone() {\r\n this._myBlinkSphere.pp_setActive(false);\r\n\r\n this._myParentFSM.performDelayed(\"done\");\r\n }\r\n\r\n _stop(teleport) {\r\n this._myBlinkSphere.pp_setActive(false);\r\n\r\n if (teleport) {\r\n this._teleport();\r\n }\r\n }\r\n\r\n _cancel() {\r\n this._myLocomotionRuntimeParams.myIsTeleporting = false;\r\n\r\n this._myBlinkSphere.pp_setActive(false);\r\n this._myBlinkSphere.pp_setParent(Globals.getPlayerObjects(this._myTeleportParams.myEngine).myCauldron, false);\r\n }\r\n}\r\n\r\n\r\n\r\n// IMPLEMENTATION\r\n\r\nPlayerLocomotionTeleportTeleportBlinkState.prototype._startFadeOut = function () {\r\n let playerUp = vec3_create();\r\n let playerForward = vec3_create();\r\n let flatTeleportForward = vec3_create();\r\n let feetRotationQuat = quat_create();\r\n return function _startFadeOut() {\r\n this._myFadeOutTimer.start();\r\n\r\n this._myBlinkSphereMaterialColor[3] = 0;\r\n this._myBlinkSphereMeshComponent.material.color = this._myBlinkSphereMaterialColor;\r\n this._myBlinkSphere.pp_setActive(true);\r\n\r\n if (!this._myTeleportRuntimeParams.myTeleportForward.vec3_isZero(0.00001)) {\r\n let angleToPerform = 0;\r\n\r\n this._myTeleportParams.myPlayerTransformManager.getRotationRealQuat(feetRotationQuat);\r\n feetRotationQuat.quat_getUp(playerUp);\r\n feetRotationQuat.quat_getForward(playerForward);\r\n this._myTeleportRuntimeParams.myTeleportForward.vec3_removeComponentAlongAxis(playerUp, flatTeleportForward);\r\n\r\n if (!flatTeleportForward.vec3_isZero(0.00001)) {\r\n flatTeleportForward.vec3_normalize(flatTeleportForward);\r\n angleToPerform = flatTeleportForward.vec3_angle(playerForward);\r\n }\r\n\r\n if (angleToPerform < this._myTeleportParams.myTeleportParams.myBlinkRotateMinAngleToRotate) {\r\n this._myTeleportRuntimeParams.myTeleportForward.vec3_zero();\r\n }\r\n }\r\n\r\n this._myLocomotionRuntimeParams.myIsTeleporting = true;\r\n };\r\n}();", "import { Timer } from \"../../../../../../cauldron/cauldron/timer.js\";\r\nimport { FSM } from \"../../../../../../cauldron/fsm/fsm.js\";\r\nimport { quat_create, vec3_create } from \"../../../../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { PlayerLocomotionTeleportState } from \"./player_locomotion_teleport_state.js\";\r\n\r\nexport class PlayerLocomotionTeleportTeleportShiftState extends PlayerLocomotionTeleportState {\r\n\r\n constructor(teleportParams, teleportRuntimeParams, locomotionRuntimeParams) {\r\n super(teleportParams, teleportRuntimeParams, locomotionRuntimeParams);\r\n\r\n this._myFSM = new FSM();\r\n //this._myFSM.setLogEnabled(true, \"Locomotion Teleport Teleport Shift\");\r\n\r\n this._myFSM.addState(\"init\");\r\n this._myFSM.addState(\"idle\");\r\n this._myFSM.addState(\"shifting\", this._shiftingUpdate.bind(this));\r\n\r\n this._myFSM.addTransition(\"init\", \"idle\", \"start\");\r\n\r\n this._myFSM.addTransition(\"idle\", \"shifting\", \"teleport\", this._startShifting.bind(this));\r\n this._myFSM.addTransition(\"shifting\", \"idle\", \"done\", this._teleportDone.bind(this));\r\n\r\n this._myFSM.addTransition(\"idle\", \"idle\", \"stop\");\r\n this._myFSM.addTransition(\"shifting\", \"idle\", \"stop\", this._stop.bind(this));\r\n\r\n this._myFSM.addTransition(\"idle\", \"idle\", \"cancel\");\r\n this._myFSM.addTransition(\"shifting\", \"idle\", \"cancel\", this._cancel.bind(this));\r\n\r\n this._myFSM.init(\"init\");\r\n this._myFSM.perform(\"start\");\r\n\r\n this._myShiftMovementTimer = new Timer(this._myTeleportParams.myTeleportParams.myShiftMovementSeconds);\r\n this._myShiftRotateTimer = new Timer(this._myTeleportParams.myTeleportParams.myShiftRotateSeconds, false);\r\n\r\n this._myFeetStartPosition = vec3_create();\r\n\r\n this._myStartForward = vec3_create();\r\n\r\n //Globals.getEasyTuneVariables(this._myTeleportParams.myEngine).add(new EasyTuneNumber(\"Shift Movement Seconds\", this._myTeleportParams.myTeleportParams.myShiftMovementSeconds, 0.5, 3, 0, undefined, undefined, this._myTeleportParams.myEngine));\r\n //Globals.getEasyTuneVariables(this._myTeleportParams.myEngine).add(new EasyTuneNumber(\"Shift Rotate Seconds\", this._myTeleportParams.myTeleportParams.myShiftRotateSeconds, 0.5, 3, 0, undefined, undefined, this._myTeleportParams.myEngine));\r\n //Globals.getEasyTuneVariables(this._myTeleportParams.myEngine).add(new EasyTuneNumber(\"Shift Rotate Start Percentage\", this._myTeleportParams.myTeleportParams.myShiftRotateStartAfterMovementPercentage, 0.5, 3, 0, 1, undefined, this._myTeleportParams.myEngine));\r\n }\r\n\r\n start(fsm) {\r\n this._myParentFSM = fsm;\r\n\r\n this._myFSM.perform(\"teleport\");\r\n }\r\n\r\n end() {\r\n this._myFSM.perform(\"stop\");\r\n }\r\n\r\n update(dt, fsm) {\r\n //this._myTeleportParams.myTeleportParams.myShiftMovementSeconds = Globals.getEasyTuneVariables(this._myTeleportParams.myEngine).get(\"Shift Movement Seconds\");\r\n //this._myTeleportParams.myTeleportParams.myShiftRotateSeconds = Globals.getEasyTuneVariables(this._myTeleportParams.myEngine).get(\"Shift Rotate Seconds\");\r\n //this._myTeleportParams.myTeleportParams.myShiftRotateStartAfterMovementPercentage = Globals.getEasyTuneVariables(this._myTeleportParams.myEngine).get(\"Shift Rotate Start Percentage\");\r\n\r\n this._myFSM.update(dt);\r\n }\r\n\r\n cancelTeleport() {\r\n this._myFSM.perform(\"cancel\");\r\n }\r\n\r\n _startShifting() {\r\n // Implemented outside class definition\r\n }\r\n\r\n _cancel() {\r\n this._myLocomotionRuntimeParams.myIsTeleporting = false;\r\n }\r\n\r\n _stop() {\r\n this._teleport();\r\n }\r\n\r\n _teleportDone() {\r\n this._teleport();\r\n this._myParentFSM.performDelayed(\"done\");\r\n }\r\n\r\n _shiftingUpdate(dt, fsm) {\r\n // Implemented outside class definition\r\n }\r\n}\r\n\r\n\r\n\r\n// IMPLEMENTATION\r\n\r\n\r\nPlayerLocomotionTeleportTeleportShiftState.prototype._startShifting = function () {\r\n let playerUp = vec3_create();\r\n let playerForward = vec3_create();\r\n let flatTeleportForward = vec3_create();\r\n let feetRotationQuat = quat_create();\r\n return function _startShifting(dt, fsm) {\r\n this._myLocomotionRuntimeParams.myIsTeleporting = true;\r\n this._myFeetStartPosition = this._myTeleportParams.myPlayerTransformManager.getPositionReal(this._myFeetStartPosition);\r\n\r\n this._myShiftMovementTimer.start(this._myTeleportParams.myTeleportParams.myShiftMovementSeconds);\r\n\r\n if (this._myTeleportParams.myTeleportParams.myShiftMovementSecondsMultiplierOverDistanceFunction) {\r\n let distance = this._myTeleportRuntimeParams.myTeleportPosition.vec3_distance(this._myFeetStartPosition);\r\n let multiplier = this._myTeleportParams.myTeleportParams.myShiftMovementSecondsMultiplierOverDistanceFunction(distance);\r\n this._myShiftMovementTimer.start(this._myTeleportParams.myTeleportParams.myShiftMovementSeconds * multiplier);\r\n }\r\n\r\n if (!this._myTeleportRuntimeParams.myTeleportForward.vec3_isZero(0.00001)) {\r\n let angleToPerform = 0;\r\n\r\n this._myTeleportParams.myPlayerTransformManager.getRotationRealQuat(feetRotationQuat);\r\n feetRotationQuat.quat_getUp(playerUp);\r\n feetRotationQuat.quat_getForward(playerForward);\r\n this._myTeleportRuntimeParams.myTeleportForward.vec3_removeComponentAlongAxis(playerUp, flatTeleportForward);\r\n\r\n if (!flatTeleportForward.vec3_isZero(0.00001)) {\r\n flatTeleportForward.vec3_normalize(flatTeleportForward);\r\n angleToPerform = flatTeleportForward.vec3_angle(playerForward);\r\n }\r\n\r\n if (angleToPerform < this._myTeleportParams.myTeleportParams.myShiftRotateMinAngleToRotate) {\r\n this._myTeleportRuntimeParams.myTeleportForward.vec3_zero();\r\n }\r\n }\r\n\r\n this._myShiftRotateTimer.reset();\r\n };\r\n}();\r\n\r\nPlayerLocomotionTeleportTeleportShiftState.prototype._shiftingUpdate = function () {\r\n let movementToTeleportFeet = vec3_create();\r\n let newFeetPosition = vec3_create();\r\n\r\n let playerUp = vec3_create();\r\n let playerForward = vec3_create();\r\n let flatTeleportForward = vec3_create();\r\n let feetRotationQuat = quat_create();\r\n let currentRotationQuat = quat_create();\r\n let targetRotationQuat = quat_create();\r\n let lerpedRotationQuat = quat_create();\r\n let lerpedForward = vec3_create();\r\n let newFeetRotationQuat = quat_create();\r\n return function _shiftingUpdate(dt, fsm) {\r\n this._myShiftMovementTimer.update(dt);\r\n this._myShiftRotateTimer.update(dt);\r\n\r\n if (this._myShiftRotateTimer.isDone() && this._myShiftMovementTimer.isDone()) {\r\n fsm.perform(\"done\");\r\n } else {\r\n newFeetPosition.vec3_copy(this._myTeleportRuntimeParams.myTeleportPosition);\r\n\r\n if (this._myShiftMovementTimer.isStarted() || this._myShiftMovementTimer.isJustDone()) {\r\n\r\n let interpolationFactor = this._myTeleportParams.myTeleportParams.myShiftMovementEasingFunction(this._myShiftMovementTimer.getPercentage());\r\n\r\n if (interpolationFactor >= this._myTeleportParams.myTeleportParams.myShiftRotateStartAfterMovementPercentage && !this._myShiftRotateTimer.isStarted()) {\r\n let angleToPerform = 0;\r\n if (!this._myTeleportRuntimeParams.myTeleportForward.vec3_isZero(0.00001)) {\r\n this._myTeleportParams.myPlayerTransformManager.getRotationRealQuat(feetRotationQuat);\r\n feetRotationQuat.quat_getUp(playerUp);\r\n feetRotationQuat.quat_getForward(playerForward);\r\n this._myTeleportRuntimeParams.myTeleportForward.vec3_removeComponentAlongAxis(playerUp, flatTeleportForward);\r\n\r\n if (!flatTeleportForward.vec3_isZero(0.00001)) {\r\n flatTeleportForward.vec3_normalize(flatTeleportForward);\r\n angleToPerform = flatTeleportForward.vec3_angle(playerForward);\r\n }\r\n\r\n this._myStartForward.vec3_copy(playerForward);\r\n }\r\n\r\n if (angleToPerform > 0 && angleToPerform >= this._myTeleportParams.myTeleportParams.myShiftRotateMinAngleToRotate) {\r\n this._myShiftRotateTimer.reset(this._myTeleportParams.myTeleportParams.myShiftRotateSeconds);\r\n if (this._myTeleportParams.myTeleportParams.myShiftRotateSecondsMultiplierOverAngleFunction) {\r\n let multiplier = this._myTeleportParams.myTeleportParams.myShiftRotateSecondsMultiplierOverAngleFunction(angleToPerform);\r\n this._myShiftRotateTimer.reset(this._myTeleportParams.myTeleportParams.myShiftRotateSeconds * multiplier);\r\n }\r\n } else {\r\n this._myTeleportRuntimeParams.myTeleportForward.vec3_zero();\r\n this._myShiftRotateTimer.reset(0);\r\n }\r\n\r\n this._myShiftRotateTimer.start();\r\n this._myShiftRotateTimer.update(dt);\r\n }\r\n\r\n movementToTeleportFeet = this._myTeleportRuntimeParams.myTeleportPosition.vec3_sub(this._myFeetStartPosition, movementToTeleportFeet);\r\n movementToTeleportFeet.vec3_scale(interpolationFactor, movementToTeleportFeet);\r\n newFeetPosition = this._myFeetStartPosition.vec3_add(movementToTeleportFeet, newFeetPosition);\r\n }\r\n\r\n this._myTeleportParams.myPlayerTransformManager.getRotationRealQuat(newFeetRotationQuat);\r\n\r\n if (!this._myTeleportRuntimeParams.myTeleportForward.vec3_isZero(0.00001)) {\r\n if (this._myShiftRotateTimer.isRunning() || this._myShiftRotateTimer.isJustDone()) {\r\n let interpolationFactor = this._myTeleportParams.myTeleportParams.myShiftRotateEasingFunction(this._myShiftRotateTimer.getPercentage());\r\n\r\n newFeetRotationQuat.quat_getUp(playerUp);\r\n currentRotationQuat.quat_copy(newFeetRotationQuat);\r\n targetRotationQuat.quat_copy(newFeetRotationQuat);\r\n\r\n currentRotationQuat.quat_setUp(playerUp, this._myStartForward);\r\n targetRotationQuat.quat_setUp(playerUp, this._myTeleportRuntimeParams.myTeleportForward);\r\n\r\n currentRotationQuat.quat_slerp(targetRotationQuat, interpolationFactor, lerpedRotationQuat);\r\n\r\n newFeetRotationQuat.quat_setUp(playerUp, lerpedRotationQuat.quat_getForward(lerpedForward));\r\n\r\n if (lerpedForward.vec3_angle(this._myTeleportRuntimeParams.myTeleportForward) <= this._myTeleportParams.myTeleportParams.myShiftRotateStopAngleThreshold) {\r\n this._myShiftRotateTimer.end();\r\n }\r\n }\r\n }\r\n\r\n let playerHeadManager = this._myTeleportParams.myPlayerTransformManager.getPlayerHeadManager();\r\n playerHeadManager.setRotationFeetQuat(newFeetRotationQuat);\r\n playerHeadManager.teleportPositionFeet(newFeetPosition);\r\n }\r\n };\r\n}();", "import { FSM, SkipStateFunction } from \"../../../../../../cauldron/fsm/fsm.js\";\r\nimport { EasingFunction } from \"../../../../../../cauldron/utils/math_utils.js\";\r\nimport { quat_create, vec3_create } from \"../../../../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { PlayerLocomotionTeleportState } from \"./player_locomotion_teleport_state.js\";\r\nimport { PlayerLocomotionTeleportTeleportBlinkState } from \"./player_locomotion_teleport_teleport_blink_state.js\";\r\nimport { PlayerLocomotionTeleportTeleportShiftState } from \"./player_locomotion_teleport_teleport_shift_state.js\";\r\n\r\nexport let PlayerLocomotionTeleportTeleportType = {\r\n INSTANT: 0,\r\n BLINK: 1,\r\n SHIFT: 2\r\n};\r\n\r\nexport class PlayerLocomotionTeleportTeleportParams {\r\n\r\n constructor() {\r\n this.myTeleportType = PlayerLocomotionTeleportTeleportType.SHIFT;\r\n\r\n this.myInstantRotateMinAngleToRotate = 25;\r\n\r\n this.myBlinkFadeOutSeconds = 0.2;\r\n this.myBlinkFadeInSeconds = 0.2;\r\n this.myBlinkWaitSeconds = 0.1;\r\n this.myBlinkSphereColor = vec3_create();\r\n this.myBlinkSphereScale = 0.5;\r\n this.myBlinkRotateMinAngleToRotate = 25;\r\n\r\n this.myShiftMovementSeconds = 0.15;\r\n this.myShiftMovementSecondsMultiplierOverDistanceFunction = null;\r\n this.myShiftMovementEasingFunction = EasingFunction.easeInOut;\r\n\r\n this.myShiftRotateSeconds = 0.75;\r\n this.myShiftRotateSecondsMultiplierOverAngleFunction = null;\r\n this.myShiftRotateEasingFunction = EasingFunction.easeOutWeak;\r\n this.myShiftRotateStartAfterMovementPercentage = 0.7;\r\n this.myShiftRotateMinAngleToRotate = 25;\r\n this.myShiftRotateStopAngleThreshold = 0.25;\r\n\r\n this.myShiftRotateSecondsMultiplierOverAngleFunction = function (angle) {\r\n return EasingFunction.easeOut(angle / 180);\r\n };\r\n }\r\n}\r\n\r\nexport class PlayerLocomotionTeleportTeleportState extends PlayerLocomotionTeleportState {\r\n\r\n constructor(teleportParams, teleportRuntimeParams, locomotionRuntimeParams) {\r\n super(teleportParams, teleportRuntimeParams, locomotionRuntimeParams);\r\n\r\n this._myFSM = new FSM();\r\n //this._myFSM.setLogEnabled(true, \"Locomotion Teleport Teleport\");\r\n\r\n this._myFSM.addState(\"init\");\r\n this._myFSM.addState(\"idle\");\r\n\r\n this._myBlinkState = new PlayerLocomotionTeleportTeleportBlinkState(teleportParams, teleportRuntimeParams, locomotionRuntimeParams);\r\n this._myShiftState = new PlayerLocomotionTeleportTeleportShiftState(teleportParams, teleportRuntimeParams, locomotionRuntimeParams);\r\n\r\n this._myFSM.addState(\"instant_teleport\", this._instantUpdate.bind(this));\r\n this._myFSM.addState(\"blink_teleport\", this._myBlinkState);\r\n this._myFSM.addState(\"shift_teleport\", this._myShiftState);\r\n\r\n this._myFSM.addTransition(\"init\", \"idle\", \"start\");\r\n\r\n this._myFSM.addTransition(\"idle\", \"instant_teleport\", \"start_instant\", this._startInstantTeleport.bind(this));\r\n this._myFSM.addTransition(\"idle\", \"blink_teleport\", \"start_blink\");\r\n this._myFSM.addTransition(\"idle\", \"shift_teleport\", \"start_shift\");\r\n\r\n this._myFSM.addTransition(\"instant_teleport\", \"idle\", \"done\", this._teleportDone.bind(this));\r\n this._myFSM.addTransition(\"blink_teleport\", \"idle\", \"done\", this._teleportDone.bind(this));\r\n this._myFSM.addTransition(\"shift_teleport\", \"idle\", \"done\", this._teleportDone.bind(this));\r\n\r\n this._myFSM.addTransition(\"idle\", \"idle\", \"stop\");\r\n this._myFSM.addTransition(\"instant_teleport\", \"idle\", \"stop\", this._instantStop.bind(this));\r\n this._myFSM.addTransition(\"blink_teleport\", \"idle\", \"stop\");\r\n this._myFSM.addTransition(\"shift_teleport\", \"idle\", \"stop\");\r\n\r\n this._myFSM.addTransition(\"idle\", \"idle\", \"cancel\");\r\n this._myFSM.addTransition(\"instant_teleport\", \"idle\", \"cancel\", this._cancelInstant.bind(this));\r\n this._myFSM.addTransition(\"blink_teleport\", \"idle\", \"cancel\", this._cancelBlink.bind(this), SkipStateFunction.END);\r\n this._myFSM.addTransition(\"shift_teleport\", \"idle\", \"cancel\", this._cancelShift.bind(this), SkipStateFunction.END);\r\n\r\n this._myFSM.init(\"init\");\r\n this._myFSM.perform(\"start\");\r\n }\r\n\r\n start(fsm) {\r\n this._myParentFSM = fsm;\r\n\r\n switch (this._myTeleportParams.myTeleportParams.myTeleportType) {\r\n case PlayerLocomotionTeleportTeleportType.INSTANT:\r\n this._myFSM.perform(\"start_instant\");\r\n break;\r\n case PlayerLocomotionTeleportTeleportType.BLINK:\r\n this._myFSM.perform(\"start_blink\");\r\n break;\r\n case PlayerLocomotionTeleportTeleportType.SHIFT:\r\n this._myFSM.perform(\"start_shift\");\r\n break;\r\n default:\r\n this._myFSM.perform(\"start_instant\");\r\n }\r\n }\r\n\r\n end() {\r\n\r\n }\r\n\r\n cancelTeleport() {\r\n this._myFSM.perform(\"cancel\");\r\n }\r\n\r\n update(dt, fsm) {\r\n this._myFSM.update(dt);\r\n }\r\n\r\n completeTeleport() {\r\n this._myFSM.perform(\"stop\");\r\n }\r\n\r\n _startInstantTeleport() {\r\n // Implemented outside class definition\r\n }\r\n\r\n _instantUpdate(dt, fsm) {\r\n this._teleport();\r\n\r\n fsm.perform(\"done\");\r\n }\r\n\r\n _instantStop(fsm) {\r\n this._teleport();\r\n }\r\n\r\n _teleportDone() {\r\n this._myParentFSM.performDelayed(\"done\");\r\n }\r\n\r\n _cancelInstant() {\r\n this._myLocomotionRuntimeParams.myIsTeleporting = false;\r\n }\r\n\r\n _cancelBlink() {\r\n this._myBlinkState.cancelTeleport();\r\n }\r\n\r\n _cancelShift() {\r\n this._myShiftState.cancelTeleport();\r\n }\r\n}\r\n\r\n\r\n\r\n// IMPLEMENTATION\r\n\r\nPlayerLocomotionTeleportTeleportState.prototype._startInstantTeleport = function () {\r\n let playerUp = vec3_create();\r\n let playerForward = vec3_create();\r\n let flatTeleportForward = vec3_create();\r\n let feetRotationQuat = quat_create();\r\n return function _startInstantTeleport() {\r\n if (!this._myTeleportRuntimeParams.myTeleportForward.vec3_isZero(0.00001)) {\r\n let angleToPerform = 0;\r\n\r\n this._myTeleportParams.myPlayerTransformManager.getRotationRealQuat(feetRotationQuat);\r\n feetRotationQuat.quat_getUp(playerUp);\r\n feetRotationQuat.quat_getForward(playerForward);\r\n this._myTeleportRuntimeParams.myTeleportForward.vec3_removeComponentAlongAxis(playerUp, flatTeleportForward);\r\n\r\n if (!flatTeleportForward.vec3_isZero(0.00001)) {\r\n flatTeleportForward.vec3_normalize(flatTeleportForward);\r\n angleToPerform = flatTeleportForward.vec3_angle(playerForward);\r\n }\r\n\r\n if (angleToPerform < this._myTeleportParams.myTeleportParams.myInstantRotateMinAngleToRotate) {\r\n this._myTeleportRuntimeParams.myTeleportForward.vec3_zero();\r\n }\r\n }\r\n\r\n this._myLocomotionRuntimeParams.myIsTeleporting = true;\r\n };\r\n}();", "import { FSM, SkipStateFunction } from \"../../../../../../cauldron/fsm/fsm.js\";\r\nimport { XRUtils } from \"../../../../../../cauldron/utils/xr_utils.js\";\r\nimport { Handedness } from \"../../../../../../input/cauldron/input_types.js\";\r\nimport { MouseButtonID } from \"../../../../../../input/cauldron/mouse.js\";\r\nimport { GamepadAxesID } from \"../../../../../../input/gamepad/gamepad_buttons.js\";\r\nimport { quat_create, vec3_create } from \"../../../../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Globals } from \"../../../../../../pp/globals.js\";\r\nimport { PlayerLocomotionMovement } from \"../player_locomotion_movement.js\";\r\nimport { PlayerLocomotionTeleportDetectionParams, PlayerLocomotionTeleportDetectionState } from \"./player_locomotion_teleport_detection_state.js\";\r\nimport { PlayerLocomotionTeleportDetectionVisualizerParams } from \"./player_locomotion_teleport_detection_visualizer.js\";\r\nimport { PlayerLocomotionTeleportTeleportParams, PlayerLocomotionTeleportTeleportState } from \"./player_locomotion_teleport_teleport_state.js\";\r\n\r\nexport class PlayerLocomotionTeleportParams {\r\n\r\n constructor(engine = Globals.getMainEngine()) {\r\n this.myPlayerTransformManager = null;\r\n\r\n this.myDetectionParams = new PlayerLocomotionTeleportDetectionParams();\r\n this.myVisualizerParams = new PlayerLocomotionTeleportDetectionVisualizerParams();\r\n this.myTeleportParams = new PlayerLocomotionTeleportTeleportParams();\r\n\r\n this.myHandedness = Handedness.LEFT;\r\n\r\n this.myPerformTeleportAsMovement = false;\r\n this.myTeleportAsMovementMaxDistanceFromTeleportPosition = 0.001;\r\n this.myTeleportAsMovementMaxSteps = 2;\r\n // When checking teleport as movement u may need to move more times to get to the position due to snap and gravity\r\n // This specifies how many movement u can try to get to the teleport position\r\n\r\n this.myTeleportAsMovementRemoveVerticalMovement = true;\r\n // This can be used to remove the vertical movement from the difference from the current and teleport position so that u can apply just\r\n // the gravity as vertical movement\r\n this.myTeleportAsMovementExtraVerticalMovementPerMeter = 1; // This simulate the gravity for the teleport movement\r\n\r\n this.myStickIdleThreshold = 0.1;\r\n\r\n this.myAdjustPositionEveryFrame = false;\r\n this.myGravityAcceleration = 0;\r\n this.myMaxGravitySpeed = 0;\r\n\r\n this.myEngine = engine;\r\n\r\n this.myDebugEnabled = false;\r\n this.myDebugDetectEnabled = false;\r\n this.myDebugShowEnabled = false;\r\n this.myDebugVisibilityEnabled = false;\r\n }\r\n}\r\n\r\nexport class PlayerLocomotionTeleportRuntimeParams {\r\n\r\n constructor() {\r\n this.myTeleportPosition = vec3_create();\r\n this.myTeleportForward = vec3_create(0, 0, 0);\r\n }\r\n}\r\n\r\nexport class PlayerLocomotionTeleport extends PlayerLocomotionMovement {\r\n\r\n constructor(teleportParams, locomotionRuntimeParams) {\r\n super(locomotionRuntimeParams);\r\n\r\n this._myTeleportParams = teleportParams;\r\n this._myTeleportRuntimeParams = new PlayerLocomotionTeleportRuntimeParams();\r\n\r\n this._myStickIdleCharge = true;\r\n\r\n this._myDetectionState = new PlayerLocomotionTeleportDetectionState(this._myTeleportParams, this._myTeleportRuntimeParams, this._myLocomotionRuntimeParams);\r\n this._myTeleportState = new PlayerLocomotionTeleportTeleportState(this._myTeleportParams, this._myTeleportRuntimeParams, this._myLocomotionRuntimeParams);\r\n\r\n this._myFSM = new FSM();\r\n //this._myFSM.setLogEnabled(true, \"Locomotion Teleport\");\r\n\r\n this._myFSM.addState(\"init\");\r\n this._myFSM.addState(\"idle\", this._idleUpdate.bind(this));\r\n this._myFSM.addState(\"detect\", this._myDetectionState);\r\n this._myFSM.addState(\"teleport\", this._myTeleportState);\r\n\r\n this._myFSM.addTransition(\"init\", \"idle\", \"start\");\r\n\r\n this._myFSM.addTransition(\"idle\", \"detect\", \"detect\");\r\n this._myFSM.addTransition(\"detect\", \"teleport\", \"teleport\");\r\n this._myFSM.addTransition(\"teleport\", \"idle\", \"done\");\r\n\r\n this._myFSM.addTransition(\"idle\", \"idle\", \"stop\");\r\n this._myFSM.addTransition(\"detect\", \"idle\", \"stop\");\r\n this._myFSM.addTransition(\"teleport\", \"idle\", \"stop\", this._completeTeleport.bind(this));\r\n\r\n this._myFSM.addTransition(\"idle\", \"idle\", \"cancel\");\r\n this._myFSM.addTransition(\"detect\", \"idle\", \"cancel\");\r\n this._myFSM.addTransition(\"teleport\", \"idle\", \"cancel\", this._cancelTeleport.bind(this), SkipStateFunction.END);\r\n\r\n this._myFSM.init(\"init\");\r\n this._myFSM.perform(\"start\");\r\n\r\n this._myIsUpdating = false;\r\n this._myDestroyed = false;\r\n\r\n this.setActive(true);\r\n }\r\n\r\n start() {\r\n }\r\n\r\n stop() {\r\n this._myFSM.perform(\"stop\");\r\n }\r\n\r\n cancelTeleport() {\r\n if (!this._myIsUpdating && this._myFSM.isInState(\"teleport\")) {\r\n this._myFSM.perform(\"cancel\");\r\n }\r\n }\r\n\r\n canStop() {\r\n return this._myFSM.isInState(\"idle\");\r\n }\r\n\r\n isTeleporting() {\r\n return this._myFSM.isInState(\"teleport\");\r\n }\r\n\r\n getParams() {\r\n return this._myTeleportParams;\r\n }\r\n\r\n getTeleportRuntimeParams() {\r\n return this._myTeleportRuntimeParams;\r\n }\r\n\r\n update(dt) {\r\n if (!this.isActive()) return;\r\n\r\n this._myIsUpdating = true;\r\n\r\n this._prepareCollisionCheckParams();\r\n\r\n this._myLocomotionRuntimeParams.myTeleportJustPerformed = false;\r\n\r\n this._myFSM.update(dt);\r\n\r\n if (!this._myLocomotionRuntimeParams.myIsTeleporting && (this._myTeleportParams.myAdjustPositionEveryFrame || this._myTeleportParams.myGravityAcceleration != 0)) {\r\n this._applyGravity(dt);\r\n }\r\n\r\n if (this._myTeleportParams.myPlayerTransformManager.getCollisionRuntimeParams().myIsOnGround) {\r\n this._myLocomotionRuntimeParams.myIsFlying = false;\r\n }\r\n\r\n this._myIsUpdating = false;\r\n }\r\n\r\n _idleUpdate(dt) {\r\n if (this._startDetecting()) {\r\n this._myFSM.perform(\"detect\");\r\n }\r\n }\r\n\r\n _startDetecting() {\r\n let startDetecting = false;\r\n\r\n if (!XRUtils.isSessionActive(this._myTeleportParams.myEngine)) {\r\n startDetecting = Globals.getMouse(this._myTeleportParams.myEngine).isButtonPressStart(MouseButtonID.MIDDLE) &&\r\n Globals.getMouse(this._myTeleportParams.myEngine).isTargetingRenderCanvas();\r\n } else {\r\n let axes = Globals.getGamepads(this._myTeleportParams.myEngine)[this._myTeleportParams.myHandedness].getAxesInfo(GamepadAxesID.THUMBSTICK).getAxes();\r\n\r\n if (axes.vec2_length() <= this._myTeleportParams.myStickIdleThreshold) {\r\n this._myStickIdleCharge = true;\r\n }\r\n\r\n if (this._myStickIdleCharge && axes[1] >= 0.75) {\r\n this._myStickIdleCharge = false;\r\n startDetecting = true;\r\n }\r\n }\r\n\r\n return startDetecting;\r\n }\r\n\r\n _completeTeleport() {\r\n this._myTeleportState.completeTeleport();\r\n }\r\n\r\n _cancelDetection() {\r\n this._myDetectionState.cancel();\r\n }\r\n\r\n _cancelTeleport() {\r\n this._myTeleportState.cancelTeleport();\r\n }\r\n\r\n _prepareCollisionCheckParams() {\r\n //this._myTeleportCollisionCheckParams.copy(this._myTeleportParams.myPlayerTransformManager.getTeleportCollisionCheckParams());\r\n\r\n // Increased so to let teleport on steep slopes from above (from below is fixed through detection myGroundAngleToIgnoreUpward)\r\n // this._myTeleportCollisionCheckParams.myGroundAngleToIgnore = Math.max(61, this._myTeleportCollisionCheckParams.myGroundAngleToIgnore);\r\n\r\n /*\r\n this._myTeleportCollisionCheckParams.myExtraTeleportCheckCallback = function (\r\n offsetTeleportPosition, endPosition, feetPosition, transformUp, transformForward, height,\r\n collisionCheckParams, prevCollisionRuntimeParams, collisionRuntimeParams, newFeetPosition\r\n\r\n ) {\r\n let isTeleportingUpward = endPosition.vec3_isFartherAlongAxis(feetPosition, transformUp);\r\n if (isTeleportingUpward) {\r\n collisionRuntimeParams.myTeleportCanceled = collisionRuntimeParams.myGroundAngle > 30 + 0.0001;\r\n console.error(collisionRuntimeParams.myTeleportCanceled);\r\n }\r\n\r\n return newFeetPosition;\r\n }\r\n */\r\n\r\n /*\r\n * This is needed for when u want to perform the teleport as a movement\r\n * Maybe this should be another set of collsion check params copied from the smooth ones?\r\n * When you teleport as move, u check with the teleport for the position, and this other params for the move, so that u can use a smaller\r\n * cone, and sliding if desired\r\n * If nothing is specified it's copied from the teleport and if greater than 90 cone is tuned down, and also the below settings are applied\r\n\r\n * You could also do this if u want to perform the teleport as movement, instead of using the smooth\r\n * but this will make even the final teleport check be halved\r\n */\r\n\r\n /*\r\n this._myTeleportCollisionCheckParams.myHalfConeAngle = 90;\r\n this._myTeleportCollisionCheckParams.myHalfConeSliceAmount = 3;\r\n this._myTeleportCollisionCheckParams.myCheckHorizontalFixedForwardEnabled = false;\r\n this._myTeleportCollisionCheckParams.mySplitMovementEnabled = true;\r\n this._myTeleportCollisionCheckParams.mySplitMovementMaxLengthEnabled = true;\r\n this._myTeleportCollisionCheckParams.mySplitMovementMaxLength = this._myTeleportCollisionCheckParams.myRadius * 0.75;\r\n this._myTeleportCollisionCheckParams.mySplitMovementMinLengthEnabled = true;\r\n this._myTeleportCollisionCheckParams.mySplitMovementMinLength = params.mySplitMovementMaxLength;\r\n this._myTeleportCollisionCheckParams.mySplitMovementStopWhenHorizontalMovementCanceled = true;\r\n this._myTeleportCollisionCheckParams.mySplitMovementStopWhenVerticalMovementCanceled = true;\r\n\r\n this._myTeleportCollisionCheckParams.myDebugEnabled = true;\r\n */\r\n }\r\n\r\n destroy() {\r\n this._myDestroyed = true;\r\n\r\n this._myDetectionState.destroy();\r\n\r\n }\r\n\r\n isDestroyed() {\r\n return this._myDestroyed;\r\n }\r\n}\r\n\r\n\r\n\r\n// IMPLEMENTATION\r\n\r\nPlayerLocomotionTeleport.prototype._applyGravity = function () {\r\n let playerRotationQuat = quat_create();\r\n let playerUp = vec3_create();\r\n let gravityMovement = vec3_create();\r\n return function _applyGravity(dt) {\r\n // If gravity is zero it's still important to move to remain snapped and gather proper surface data even when not teleporting\r\n\r\n playerUp = this._myTeleportParams.myPlayerTransformManager.getRotationQuat(playerRotationQuat).quat_getUp(playerUp);\r\n\r\n gravityMovement.vec3_zero();\r\n if (!this._myLocomotionRuntimeParams.myIsFlying && !this._myLocomotionRuntimeParams.myIsTeleporting) {\r\n this._myLocomotionRuntimeParams.myGravitySpeed += this._myTeleportParams.myGravityAcceleration * dt;\r\n\r\n if (Math.abs(this._myLocomotionRuntimeParams.myGravitySpeed) > Math.abs(this._myTeleportParams.myMaxGravitySpeed)) {\r\n this._myLocomotionRuntimeParams.myGravitySpeed = Math.pp_sign(this._myTeleportParams.myGravityAcceleration) * Math.abs(this._myTeleportParams.myMaxGravitySpeed);\r\n }\r\n\r\n gravityMovement = playerUp.vec3_scale(this._myLocomotionRuntimeParams.myGravitySpeed * dt, gravityMovement);\r\n } else {\r\n this._myLocomotionRuntimeParams.myGravitySpeed = 0;\r\n }\r\n\r\n this._myTeleportParams.myPlayerTransformManager.move(gravityMovement, false);\r\n\r\n const collisionRuntimeParams = this._myTeleportParams.myPlayerTransformManager.getCollisionRuntimeParams();\r\n if (this._myLocomotionRuntimeParams.myGravitySpeed > 0 && collisionRuntimeParams.myIsOnCeiling ||\r\n this._myLocomotionRuntimeParams.myGravitySpeed < 0 && collisionRuntimeParams.myIsOnGround) {\r\n this._myLocomotionRuntimeParams.myGravitySpeed = 0;\r\n }\r\n };\r\n}();", "import { Timer } from \"../../../../../cauldron/cauldron/timer.js\";\r\nimport { XRUtils } from \"../../../../../cauldron/utils/xr_utils.js\";\r\nimport { Handedness } from \"../../../../../input/cauldron/input_types.js\";\r\nimport { InputUtils } from \"../../../../../input/cauldron/input_utils.js\";\r\nimport { GamepadAxesID, GamepadButtonID } from \"../../../../../input/gamepad/gamepad_buttons.js\";\r\nimport { quat2_create, quat_create, vec3_create } from \"../../../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Globals } from \"../../../../../pp/globals.js\";\r\nimport { Direction2DTo3DConverter, Direction2DTo3DConverterParams } from \"../../../../cauldron/cauldron/direction_2D_to_3D_converter.js\";\r\nimport { PlayerLocomotionDirectionReferenceType } from \"./player_locomotion.js\";\r\nimport { PlayerLocomotionMovement } from \"./player_locomotion_movement.js\";\r\n\r\nexport class PlayerLocomotionSmoothParams {\r\n\r\n constructor(engine = Globals.getMainEngine()) {\r\n this.myPlayerTransformManager = null;\r\n\r\n this.myMaxSpeed = 0;\r\n this.mySpeedSlowDownPercentageOnWallSlid = 1; // this is the target value for a 90 degrees slid, the more u move toward the wall the slower u go \r\n\r\n this.myMovementMinStickIntensityThreshold = 0;\r\n\r\n this.myFlyEnabled = false;\r\n this.myFlyWithButtonsEnabled = false;\r\n this.myFlyWithViewAngleEnabled = false;\r\n this.myMinAngleToFlyUpNonVR = 0;\r\n this.myMinAngleToFlyDownNonVR = 0;\r\n this.myMinAngleToFlyUpVR = 0;\r\n this.myMinAngleToFlyDownVR = 0;\r\n this.myMinAngleToFlyRight = 0;\r\n\r\n this.myGravityAcceleration = 0;\r\n this.myMaxGravitySpeed = 0;\r\n\r\n this.myDirectionInvertForwardWhenUpsideDown = true;\r\n this.myVRDirectionReferenceType = PlayerLocomotionDirectionReferenceType.HEAD;\r\n this.myVRDirectionReferenceObject = null;\r\n\r\n this.myHandedness = Handedness.LEFT;\r\n\r\n this.myAttemptMoveAgainWhenFailedDueToCeilingPopOut = true;\r\n\r\n this.myDebugFlyMaxSpeedMultiplier = 5;\r\n this.myMoveThroughCollisionShortcutEnabled = false;\r\n this.myMoveHeadShortcutEnabled = false;\r\n this.myTripleSpeedShortcutEnabled = false;\r\n\r\n this.myEngine = engine;\r\n }\r\n}\r\n\r\nexport class PlayerLocomotionSmooth extends PlayerLocomotionMovement {\r\n\r\n constructor(params, locomotionRuntimeParams) {\r\n super(locomotionRuntimeParams);\r\n\r\n this._myParams = params;\r\n\r\n this._myCurrentSpeed = 0;\r\n this._myLastHorizontalMovement = vec3_create();\r\n\r\n this._myDirectionReference = Globals.getPlayerObjects(this._myParams.myEngine).myHead;\r\n\r\n this._myStickIdleTimer = new Timer(0.25, false);\r\n\r\n let directionConverterNonVRParams = new Direction2DTo3DConverterParams(this._myParams.myEngine);\r\n directionConverterNonVRParams.myAutoUpdateFlyForward = this._myParams.myFlyEnabled && this._myParams.myFlyWithViewAngleEnabled;\r\n directionConverterNonVRParams.myAutoUpdateFlyRight = this._myParams.myFlyEnabled && this._myParams.myFlyWithViewAngleEnabled;\r\n directionConverterNonVRParams.myMinAngleToFlyForwardUp = this._myParams.myMinAngleToFlyUpNonVR;\r\n directionConverterNonVRParams.myMinAngleToFlyForwardDown = this._myParams.myMinAngleToFlyDownNonVR;\r\n directionConverterNonVRParams.myMinAngleToFlyRightUp = this._myParams.myMinAngleToFlyRight;\r\n directionConverterNonVRParams.myMinAngleToFlyRightDown = this._myParams.myMinAngleToFlyRight;\r\n directionConverterNonVRParams.myInvertForwardWhenUpsideDown = this._myParams.myDirectionInvertForwardWhenUpsideDown;\r\n\r\n let directionConverterVRParams = new Direction2DTo3DConverterParams(this._myParams.myEngine);\r\n directionConverterVRParams.myAutoUpdateFlyForward = this._myParams.myFlyEnabled && this._myParams.myFlyWithViewAngleEnabled;\r\n directionConverterVRParams.myAutoUpdateFlyRight = this._myParams.myFlyEnabled && this._myParams.myFlyWithViewAngleEnabled;\r\n directionConverterVRParams.myMinAngleToFlyForwardUp = this._myParams.myMinAngleToFlyUpVR;\r\n directionConverterVRParams.myMinAngleToFlyForwardDown = this._myParams.myMinAngleToFlyDownVR;\r\n directionConverterVRParams.myMinAngleToFlyRightUp = this._myParams.myMinAngleToFlyRight;\r\n directionConverterVRParams.myMinAngleToFlyRightDown = this._myParams.myMinAngleToFlyRight;\r\n directionConverterVRParams.myInvertForwardWhenUpsideDown = this._myParams.myDirectionInvertForwardWhenUpsideDown;\r\n\r\n this._myDirectionConverterNonVR = new Direction2DTo3DConverter(directionConverterNonVRParams);\r\n this._myDirectionConverterVR = new Direction2DTo3DConverter(directionConverterVRParams);\r\n this._myCurrentDirectionConverter = this._myDirectionConverterNonVR;\r\n\r\n this._myDebugFlyEnabled = false;\r\n\r\n this._myDestroyed = false;\r\n\r\n this.setActive(true);\r\n }\r\n\r\n start() {\r\n this._myCurrentSpeed = 0;\r\n this._myLastHorizontalMovement.vec3_zero();\r\n }\r\n\r\n setActive(active) {\r\n if (this.isActive() != active) {\r\n if (active) {\r\n XRUtils.registerSessionStartEndEventListeners(this, this._onXRSessionStart.bind(this), this._onXRSessionEnd.bind(this), true, false, this._myParams.myEngine);\r\n } else {\r\n XRUtils.unregisterSessionStartEndEventListeners(this, this._myParams.myEngine);\r\n }\r\n }\r\n\r\n super.setActive(active);\r\n }\r\n\r\n getParams() {\r\n return this._myParams;\r\n }\r\n\r\n getCurrentSpeed() {\r\n return this._myCurrentSpeed;\r\n }\r\n\r\n getLastHorizontalSpeed() {\r\n return this._myLastHorizontalMovement;\r\n }\r\n\r\n update(dt) {\r\n // Implemented outside class definition\r\n }\r\n\r\n setDebugFlyEnabled(enabled) {\r\n if (this._myDebugFlyEnabled != enabled) {\r\n if (!enabled) {\r\n this._myLocomotionRuntimeParams.myIsFlying = false;\r\n this._myCurrentDirectionConverter.resetFly();\r\n }\r\n }\r\n\r\n this._myDebugFlyEnabled = enabled;\r\n }\r\n\r\n isDebugFlyEnabled() {\r\n return this._myDebugFlyEnabled;\r\n }\r\n\r\n _onXRSessionStart(session) {\r\n // Implemented outside class definition\r\n }\r\n\r\n _onXRSessionEnd(session) {\r\n // Implemented outside class definition\r\n }\r\n\r\n destroy() {\r\n this._myDestroyed = true;\r\n\r\n this.setActive(false);\r\n }\r\n\r\n isDestroyed() {\r\n return this._myDestroyed;\r\n }\r\n}\r\n\r\n\r\n\r\n// IMPLEMENTATION\r\n\r\nPlayerLocomotionSmooth.prototype.update = function () {\r\n let playerRotationQuat = quat_create();\r\n let playerUp = vec3_create();\r\n let horizontalMovement = vec3_create();\r\n let headMovement = vec3_create();\r\n let direction = vec3_create();\r\n let directionOnUp = vec3_create();\r\n let verticalMovement = vec3_create();\r\n\r\n let directionReferenceTransformQuat = quat2_create();\r\n return function update(dt) {\r\n if (!this.isActive()) return;\r\n\r\n let debugFlyEnabled = this._myDebugFlyEnabled && Globals.isDebugEnabled(this._myParams.myEngine);\r\n\r\n this._myCurrentSpeed = 0;\r\n this._myLastHorizontalMovement.vec3_zero();\r\n\r\n playerUp = this._myParams.myPlayerTransformManager.getRotationQuat(playerRotationQuat).quat_getUp(playerUp);\r\n\r\n horizontalMovement.vec3_zero();\r\n headMovement.vec3_zero();\r\n\r\n let axes = Globals.getGamepads(this._myParams.myEngine)[this._myParams.myHandedness].getAxesInfo(GamepadAxesID.THUMBSTICK).getAxes();\r\n axes[0] = Math.abs(axes[0]) > this._myParams.myMovementMinStickIntensityThreshold ? axes[0] : 0;\r\n axes[1] = Math.abs(axes[1]) > this._myParams.myMovementMinStickIntensityThreshold ? axes[1] : 0;\r\n\r\n let isManuallyMoving = false;\r\n let maxSpeed = this._myParams.myMaxSpeed;\r\n if (debugFlyEnabled) {\r\n maxSpeed = maxSpeed * this._myParams.myDebugFlyMaxSpeedMultiplier;\r\n }\r\n\r\n if ((this._myParams.myTripleSpeedShortcutEnabled && Globals.isDebugEnabled(this._myParams.myEngine)) || debugFlyEnabled) {\r\n if (Globals.getGamepads(this._myParams.myEngine)[this._myParams.myHandedness].getButtonInfo(GamepadButtonID.SELECT).isPressed()) {\r\n maxSpeed *= 3;\r\n }\r\n }\r\n\r\n if (debugFlyEnabled && Globals.getGamepads(this._myParams.myEngine)[InputUtils.getOppositeHandedness(this._myParams.myHandedness)].getButtonInfo(GamepadButtonID.SELECT).isPressed()) {\r\n maxSpeed = this._myParams.myMaxSpeed;\r\n }\r\n\r\n const collisionRuntimeParams = this._myParams.myPlayerTransformManager.getCollisionRuntimeParams();\r\n\r\n if (!axes.vec2_isZero()) {\r\n this._myStickIdleTimer.start();\r\n\r\n direction = this._myCurrentDirectionConverter.convertTransformQuat(axes, this._myDirectionReference.pp_getTransformQuat(directionReferenceTransformQuat), playerUp, direction);\r\n\r\n if (!direction.vec3_isZero()) {\r\n this._myLocomotionRuntimeParams.myIsFlying = this._myLocomotionRuntimeParams.myIsFlying || direction.vec3_componentAlongAxis(playerUp, directionOnUp).vec3_length() > 0.000001;\r\n if (!this._myLocomotionRuntimeParams.myIsFlying) {\r\n direction = direction.vec3_removeComponentAlongAxis(playerUp, direction);\r\n }\r\n\r\n let movementIntensity = axes.vec2_length();\r\n this._myCurrentSpeed = Math.pp_lerp(0, maxSpeed, movementIntensity);\r\n\r\n if (collisionRuntimeParams.myIsSliding && this._myParams.mySpeedSlowDownPercentageOnWallSlid != 1) {\r\n let slowPercentage = this._myParams.mySpeedSlowDownPercentageOnWallSlid;\r\n\r\n let slidStrength = Math.pp_mapToRange(Math.abs(collisionRuntimeParams.mySlidingMovementAngle), 0, 90, 0, 1);\r\n slowPercentage = Math.pp_lerp(1, slowPercentage, slidStrength);\r\n\r\n this._myCurrentSpeed = this._myCurrentSpeed * slowPercentage;\r\n }\r\n\r\n horizontalMovement = direction.vec3_scale(this._myCurrentSpeed * dt, horizontalMovement);\r\n\r\n isManuallyMoving = true;\r\n }\r\n } else {\r\n if (this._myStickIdleTimer.isRunning()) {\r\n this._myStickIdleTimer.update(dt);\r\n if (this._myStickIdleTimer.isDone()) {\r\n this._myCurrentDirectionConverter.resetFly();\r\n }\r\n }\r\n }\r\n\r\n headMovement = headMovement.vec3_add(horizontalMovement, headMovement);\r\n\r\n if ((this._myParams.myFlyEnabled && this._myParams.myFlyWithButtonsEnabled) || debugFlyEnabled) {\r\n if (Globals.getGamepads(this._myParams.myEngine)[InputUtils.getOppositeHandedness(this._myParams.myHandedness)].getButtonInfo(GamepadButtonID.TOP_BUTTON).isPressed()) {\r\n verticalMovement = playerUp.vec3_scale(maxSpeed * dt, verticalMovement);\r\n headMovement = headMovement.vec3_add(verticalMovement, headMovement);\r\n this._myLocomotionRuntimeParams.myIsFlying = true;\r\n\r\n isManuallyMoving = true;\r\n } else if (Globals.getGamepads(this._myParams.myEngine)[InputUtils.getOppositeHandedness(this._myParams.myHandedness)].getButtonInfo(GamepadButtonID.BOTTOM_BUTTON).isPressed()) {\r\n verticalMovement = playerUp.vec3_scale(-maxSpeed * dt, verticalMovement);\r\n headMovement = headMovement.vec3_add(verticalMovement, headMovement);\r\n this._myLocomotionRuntimeParams.myIsFlying = true;\r\n\r\n isManuallyMoving = true;\r\n }\r\n\r\n if (Globals.getGamepads(this._myParams.myEngine)[InputUtils.getOppositeHandedness(this._myParams.myHandedness)].getButtonInfo(GamepadButtonID.BOTTOM_BUTTON).isPressEnd(2)) {\r\n this._myLocomotionRuntimeParams.myIsFlying = false;\r\n }\r\n }\r\n\r\n if (this._myParams.myMoveHeadShortcutEnabled && Globals.isDebugEnabled(this._myParams.myEngine) &&\r\n Globals.getGamepads(this._myParams.myEngine)[InputUtils.getOppositeHandedness(this._myParams.myHandedness)].getButtonInfo(GamepadButtonID.THUMBSTICK).isPressed()) {\r\n this._myParams.myPlayerTransformManager.getPlayerHeadManager().moveFeet(headMovement);\r\n } else if ((this._myParams.myMoveThroughCollisionShortcutEnabled && Globals.isDebugEnabled(this._myParams.myEngine) &&\r\n Globals.getGamepads(this._myParams.myEngine)[this._myParams.myHandedness].getButtonInfo(GamepadButtonID.THUMBSTICK).isPressed())\r\n || debugFlyEnabled) {\r\n this._myParams.myPlayerTransformManager.move(headMovement, true, isManuallyMoving ? true : false);\r\n\r\n if (isManuallyMoving) {\r\n this._myParams.myPlayerTransformManager.resetReal();\r\n }\r\n } else {\r\n if (!this._myLocomotionRuntimeParams.myIsFlying) {\r\n this._myLocomotionRuntimeParams.myGravitySpeed += this._myParams.myGravityAcceleration * dt;\r\n\r\n if (Math.abs(this._myLocomotionRuntimeParams.myGravitySpeed) > Math.abs(this._myParams.myMaxGravitySpeed)) {\r\n this._myLocomotionRuntimeParams.myGravitySpeed = Math.pp_sign(this._myParams.myGravityAcceleration) * Math.abs(this._myParams.myMaxGravitySpeed);\r\n }\r\n\r\n verticalMovement = playerUp.vec3_scale(this._myLocomotionRuntimeParams.myGravitySpeed * dt, verticalMovement);\r\n headMovement = headMovement.vec3_add(verticalMovement, headMovement);\r\n } else {\r\n this._myLocomotionRuntimeParams.myGravitySpeed = 0;\r\n }\r\n\r\n this._myParams.myPlayerTransformManager.move(headMovement, false, isManuallyMoving ? true : false);\r\n if (this._myParams.myAttemptMoveAgainWhenFailedDueToCeilingPopOut && isManuallyMoving && !horizontalMovement.vec3_isZero(0.000001)) {\r\n const collisionRuntimeParams = this._myParams.myPlayerTransformManager.getCollisionRuntimeParams();\r\n if (collisionRuntimeParams.myHorizontalMovementCanceled &&\r\n !collisionRuntimeParams.myVerticalMovementCanceled &&\r\n collisionRuntimeParams.myHasPoppedOutCeiling\r\n ) {\r\n // The pop out means it was inside a ceiling, can happen due to moving the head up when close to the ceiling\r\n // the pop fixes this but the horizontal movement is canceled before that, so we try it again\r\n this._myParams.myPlayerTransformManager.move(horizontalMovement, false, isManuallyMoving ? true : false);\r\n }\r\n }\r\n\r\n if (isManuallyMoving) {\r\n this._myParams.myPlayerTransformManager.resetReal();\r\n\r\n collisionRuntimeParams.myFixedMovement.vec3_removeComponentAlongAxis(\r\n collisionRuntimeParams.myOriginalUp,\r\n this._myLastHorizontalMovement\r\n );\r\n }\r\n\r\n if (this._myLocomotionRuntimeParams.myGravitySpeed > 0 && collisionRuntimeParams.myIsOnCeiling ||\r\n this._myLocomotionRuntimeParams.myGravitySpeed < 0 && collisionRuntimeParams.myIsOnGround) {\r\n this._myLocomotionRuntimeParams.myGravitySpeed = 0;\r\n }\r\n }\r\n\r\n if (collisionRuntimeParams.myIsOnGround) {\r\n this._myLocomotionRuntimeParams.myIsFlying = false;\r\n this._myCurrentDirectionConverter.resetFly();\r\n }\r\n };\r\n}();\r\n\r\nPlayerLocomotionSmooth.prototype._onXRSessionStart = function () {\r\n return function _onXRSessionStart(session) {\r\n switch (this._myParams.myVRDirectionReferenceType) {\r\n case 0:\r\n this._myDirectionReference = Globals.getPlayerObjects(this._myParams.myEngine).myHead;\r\n break;\r\n case 1:\r\n this._myDirectionReference = Globals.getPlayerObjects(this._myParams.myEngine).myHands[this._myParams.myHandedness];\r\n break;\r\n case 2:\r\n this._myDirectionReference = this._myParams.myVRDirectionReferenceObject;\r\n break;\r\n }\r\n\r\n this._myCurrentDirectionConverter = this._myDirectionConverterVR;\r\n this._myCurrentDirectionConverter.resetFly();\r\n };\r\n}();\r\n\r\nPlayerLocomotionSmooth.prototype._onXRSessionEnd = function () {\r\n return function _onXRSessionEnd(session) {\r\n this._myDirectionReference = Globals.getPlayerObjects(this._myParams.myEngine).myHead;\r\n this._myCurrentDirectionConverter = this._myDirectionConverterNonVR;\r\n\r\n this._myCurrentDirectionConverter.resetFly();\r\n };\r\n}();", "import { Component, Material, Object3D, property } from \"@wonderlandengine/api\";\r\nimport { Timer } from \"../../../../../../cauldron/cauldron/timer.js\";\r\nimport { PhysicsLayerFlags } from \"../../../../../../cauldron/physics/physics_layer_flags.js\";\r\nimport { PhysicsUtils } from \"../../../../../../cauldron/physics/physics_utils.js\";\r\nimport { InputUtils } from \"../../../../../../input/cauldron/input_utils.js\";\r\nimport { BasePose } from \"../../../../../../input/pose/base_pose.js\";\r\nimport { Globals } from \"../../../../../../pp/globals.js\";\r\nimport { PlayerLocomotion, PlayerLocomotionParams } from \"../player_locomotion.js\";\r\n\r\n/**\r\n * Tips \r\n * - Be sure that your colliders has faces on both sides of the mesh, this helps the collision check which otherise might be able to move through walls\r\n */\r\nexport class PlayerLocomotionComponent extends Component {\r\n public static override TypeName = \"pp-player-locomotion\";\r\n\r\n\r\n\r\n @property.enum([\"Smooth\", \"Teleport\"], \"Smooth\")\r\n private readonly _myDefaultLocomotionType!: number;\r\n\r\n @property.bool(true)\r\n private readonly _myAlwaysSmoothForNonVR!: boolean;\r\n\r\n /** Double press main hand thumbstick (default: left) to switch */\r\n @property.bool(true)\r\n private readonly _mySwitchLocomotionTypeShortcutEnabled!: boolean;\r\n\r\n @property.bool(false)\r\n private readonly _myStartIdle!: boolean;\r\n\r\n @property.string(\"0, 0, 0, 0, 0, 0, 0, 0\")\r\n private readonly _myPhysicsBlockLayerFlags!: string;\r\n\r\n\r\n @property.float(1.70)\r\n private readonly _myDefaultHeight!: number;\r\n\r\n @property.float(0.50)\r\n private readonly _myMinHeight!: number;\r\n\r\n @property.float(0.3)\r\n private readonly _myCharacterRadius!: number;\r\n\r\n /** Set this to `-1` to auto compute the feet radius based on {@link _myCharacterRadius} */\r\n @property.float(-1)\r\n private readonly _myCharacterFeetRadius!: number;\r\n\r\n @property.float(0.1)\r\n private readonly _myForeheadExtraHeight!: number;\r\n\r\n\r\n\r\n @property.float(2)\r\n private readonly _myMaxSpeed!: number;\r\n\r\n @property.float(100)\r\n private readonly _myMaxRotationSpeed!: number;\r\n\r\n @property.float(1)\r\n private readonly _mySpeedSlowDownPercentageOnWallSlid!: number;\r\n\r\n\r\n\r\n @property.float(-20)\r\n private readonly _myGravityAcceleration!: number;\r\n\r\n @property.float(-15)\r\n private readonly _myMaxGravitySpeed!: number;\r\n\r\n\r\n\r\n @property.bool(true)\r\n private readonly _myIsSnapTurn!: boolean;\r\n\r\n @property.bool(true)\r\n private readonly _mySnapTurnOnlyVR!: boolean;\r\n\r\n @property.float(30)\r\n private readonly _mySnapTurnAngle!: number;\r\n\r\n @property.float(0)\r\n private readonly _mySnapTurnSpeedDegrees!: number;\r\n\r\n\r\n\r\n @property.bool(false)\r\n private readonly _myFlyEnabled!: boolean;\r\n\r\n @property.bool(false)\r\n private readonly _myStartFlying!: boolean;\r\n\r\n @property.bool(false)\r\n private readonly _myFlyWithButtonsEnabled!: boolean;\r\n\r\n @property.bool(false)\r\n private readonly _myFlyWithViewAngleEnabled!: boolean;\r\n\r\n @property.float(30)\r\n private readonly _myMinAngleToFlyUpNonVR!: number;\r\n\r\n @property.float(40)\r\n private readonly _myMinAngleToFlyDownNonVR!: number;\r\n\r\n @property.float(30)\r\n private readonly _myMinAngleToFlyUpVR!: number;\r\n\r\n @property.float(40)\r\n private readonly _myMinAngleToFlyDownVR!: number;\r\n\r\n @property.float(90)\r\n private readonly _myMinAngleToFlyRight!: number;\r\n\r\n\r\n\r\n @property.enum([\"Left\", \"Right\"], \"Left\")\r\n private readonly _myMainHand!: number;\r\n\r\n @property.bool(true)\r\n private readonly _myDirectionInvertForwardWhenUpsideDown!: boolean;\r\n\r\n @property.enum([\"Head\", \"Hand\", \"Custom Object\"], \"Head\")\r\n private readonly _myVRDirectionReferenceType!: number;\r\n\r\n @property.object()\r\n private readonly _myVRDirectionReferenceObject!: Readonly;\r\n\r\n\r\n\r\n @property.enum([\"Instant\", \"Blink\", \"Shift\"], \"Shift\")\r\n private readonly _myTeleportType!: number;\r\n\r\n @property.float(3)\r\n private readonly _myTeleportMaxDistance!: number;\r\n\r\n @property.float(1.25)\r\n private readonly _myTeleportMaxHeightDifference!: number;\r\n\r\n /** If empty use {@link _myPhysicsBlockLayerFlags} */\r\n @property.string(\"\")\r\n private readonly _myTeleportFloorLayerFlags!: string;\r\n\r\n @property.bool(false)\r\n private readonly _myTeleportRotationOnUpEnabled!: boolean;\r\n\r\n @property.material()\r\n private readonly _myTeleportValidMaterial!: Readonly;\r\n\r\n @property.material()\r\n private readonly _myTeleportInvalidMaterial!: Readonly;\r\n\r\n @property.object()\r\n private readonly _myTeleportPositionObject!: Readonly;\r\n\r\n @property.bool(true)\r\n private readonly _myTeleportPositionObjectRotateWithHead!: boolean;\r\n\r\n @property.object()\r\n private readonly _myTeleportParableStartReferenceObject!: Readonly;\r\n\r\n\r\n\r\n @property.bool(true)\r\n private readonly _myResetRealOnStart!: boolean;\r\n\r\n /**\r\n * #WARN With `_myResetRealOnStartFramesAmount` at `1` it can happen that you enter the session like 1 frame before the game load\r\n * and the head pose might have not been properly initialized yet in the WebXR API, so the reset real will not happen has expected \r\n * Since this is a sort of edge case (either u enter after the load, or you were already in for more than 2-3 frames), and that\r\n * setting this to more than `1` can cause a visible (even if very short) stutter after the load (due to resetting the head multiple times),\r\n * it's better to keep this value at `1` \r\n * A possible effect of the edge case is the view being obscured on start because it thinks you are colliding\r\n * \r\n * A value of `3` will make u sure that the head pose will be initialized and the reset real will happen as expected in any case \r\n * For example, if u have a total fade at start and nothing can be seen aside the clear color for at least, let's say, 10 frames, \r\n * you can set this to `3` safely, since there will be no visible stutter to be seen (beside the clear color)\r\n */\r\n @property.int(1)\r\n private readonly _myResetRealOnStartFramesAmount!: number;\r\n\r\n /** Can fix some head through floor issues, when you can move your head completely to the other side of the floor \r\n If the floors are thick enough that this can't happen, you can leave this to false */\r\n @property.bool(true)\r\n private readonly _myResetHeadToFeetInsteadOfReal!: boolean;\r\n\r\n @property.float(0.25)\r\n private readonly _myResetHeadToRealMinDistance!: number;\r\n\r\n @property.int(-1)\r\n private readonly _myMaxHeadToRealHeadSteps!: number;\r\n\r\n\r\n\r\n /** Valid means, for example, that the real player has not moved inside a wall by moving in the real space */\r\n @property.bool(true)\r\n private readonly _mySyncWithRealWorldPositionOnlyIfValid!: boolean;\r\n\r\n /** Valid means, for example, that the real player has not moved inside a wall by moving in the real space */\r\n @property.bool(true)\r\n private readonly _mySyncWithRealHeightOnlyIfValid!: boolean;\r\n\r\n @property.bool(false)\r\n private readonly _mySnapRealPositionToGround!: boolean;\r\n\r\n @property.bool(false)\r\n private readonly _myPreventRealFromColliding!: boolean;\r\n\r\n @property.bool(true)\r\n private readonly _myViewOcclusionInsideWallsEnabled!: boolean;\r\n\r\n /** If empty use {@link _myPhysicsBlockLayerFlags} */\r\n @property.string(\"\")\r\n private readonly _myViewOcclusionLayerFlags!: string;\r\n\r\n /**\r\n * To avoid occlusion issues when moving when touching a tilted ceiling (which is not commong anyway), \r\n * this value should be a bit lower than {@link _myCharacterFeetRadius}\r\n * \r\n * If you have a high camera near value, you might need to increase this value, even though the view occlusion might become more aggressive\r\n */\r\n @property.float(0.145)\r\n private readonly _myViewOcclusionHeadRadius!: number;\r\n\r\n /**\r\n * Half of this value should be a bit lower than {@link _myForeheadExtraHeight} plus {@link _myColliderExtraHeight}, otherwise view occlusion might \r\n * trigger simply when moving under a low ceiling\r\n * \r\n * If you have a high camera near value, you might need to increase this value, even though the view occlusion might become more aggressive\r\n */\r\n @property.float(0.15)\r\n private readonly _myViewOcclusionHeadHeight!: number;\r\n\r\n @property.float(0.1)\r\n private readonly _myViewOcclusionFadeOutSeconds!: number;\r\n\r\n @property.float(0.025)\r\n private readonly _myViewOcclusionMaxRealHeadDistance!: number;\r\n\r\n\r\n\r\n @property.bool(false)\r\n private readonly _mySyncNonVRHeightWithVROnExitSession!: boolean;\r\n\r\n @property.bool(false)\r\n private readonly _mySyncNonVRVerticalAngleWithVROnExitSession!: boolean;\r\n\r\n\r\n\r\n @property.bool(true)\r\n private readonly _mySyncHeadWithRealAfterLocomotionUpdateIfNeeded!: boolean;\r\n\r\n\r\n\r\n @property.enum([\"Very Low\", \"Low\", \"Medium\", \"High\", \"Very High\"], \"High\")\r\n private readonly _myColliderAccuracy!: number;\r\n\r\n /**\r\n * If you enable this, you might also want to disable {@link _myColliderCheckCeilings}, \r\n * since it doesn't make much sense to check for ceilings when not checking the height\r\n */\r\n @property.bool(false)\r\n private readonly _myColliderCheckOnlyFeet!: boolean;\r\n\r\n /**\r\n * If you enable this, you might also want to disable {@link _myColliderCheckOnlyFeet}, \r\n * since it doesn't make much sense to check for ceilings without also checking the height\r\n */\r\n @property.bool(true)\r\n private readonly _myColliderCheckCeilings!: boolean;\r\n\r\n @property.bool(true)\r\n private readonly _myColliderSlideAlongWall!: boolean;\r\n\r\n @property.float(30)\r\n private readonly _myColliderMaxWalkableGroundAngle!: number;\r\n\r\n /** \r\n * This is useful if you want the locomotion teleport feature to be able to go downhill\r\n * on surfaces steeper than {@link _myColliderMaxWalkableGroundAngle}\r\n * \r\n * By default the locomotion teleport can't go up on surfaces steeper than {@link _myColliderMaxWalkableGroundAngle} anyway,\r\n * no matter, the value of {@link _myColliderMaxTeleportableGroundAngle}\r\n * \r\n * If you set this to a value bigger than {@link _myColliderMaxWalkableGroundAngle} you will be able to teleport in any case on steeper surfaces,\r\n * so be careful if you want that, even though usually it's safe, since teleport positions, aside from the locomotion teleport ones, are predefined and\r\n * safe positions\r\n * \r\n * The idea is that with the locomotion smooth you can always go downhill but might no be able to climb back up due to the surface beeing steep,\r\n * this sort of replicates that for the locomotion, letting you teleport down on steep surfaces but not up\r\n */\r\n @property.float(-1)\r\n private readonly _myColliderMaxTeleportableGroundAngle!: number;\r\n\r\n @property.bool(true)\r\n private readonly _myColliderSnapOnGround!: boolean;\r\n\r\n @property.float(0.1)\r\n private readonly _myColliderMaxDistanceToSnapOnGround!: number;\r\n\r\n @property.float(0.2)\r\n private readonly _myColliderMaxDistanceToPopOutGround!: number;\r\n\r\n @property.float(0.1)\r\n private readonly _myColliderMaxWalkableGroundStepHeight!: number;\r\n\r\n /**\r\n * Allowing walkable steps on ceiling might create issues with view occlusion for the player (especially with a high value) \r\n * since you can go more under some low ceiling making the occlusion head collide with it\r\n * \r\n * Settings it to zero is safer, but means that the ceilings physx must be more flat, because it's easier that a small ceiling bump now blocks you\r\n * \r\n * If you want this to be higher than 0, you might also want to increase {@link _myColliderExtraHeight} by this value to avoid issue with view occlusion\r\n * It will need you to be further from ceiling to be able to move under them tho (since it will be like wearing a hat as tall as {@link _myColliderExtraHeight})\r\n */\r\n @property.float(0)\r\n private readonly _myColliderMaxWalkableCeilingStepHeight!: number;\r\n\r\n @property.bool(false)\r\n private readonly _myColliderPreventFallingFromEdges!: boolean;\r\n\r\n @property.int(3)\r\n private readonly _myColliderMaxMovementSteps!: number;\r\n\r\n /**\r\n * Helps staying a little further from the ceiling\r\n * \r\n * If you need to increase {@link _myViewOcclusionHeadRadius}, also increasing this can help preventing view occlusion happening when shouldn't\r\n */\r\n @property.float(0.025)\r\n private readonly _myColliderExtraHeight!: number;\r\n\r\n\r\n\r\n /** Main hand (default: left) select + thumbstick press, auto switch to smooth */\r\n @property.bool(false)\r\n private readonly _myDebugFlyShortcutEnabled!: boolean;\r\n\r\n @property.float(5)\r\n private readonly _myDebugFlyMaxSpeedMultiplier!: number;\r\n\r\n /** Main hand (default: left) thumbstick pressed while moving */\r\n @property.bool(false)\r\n private readonly _myMoveThroughCollisionShortcutEnabled!: boolean;\r\n\r\n /** Not main hand (default: right) thumbstick pressed while moving */\r\n @property.bool(false)\r\n private readonly _myMoveHeadShortcutEnabled!: boolean;\r\n\r\n /** Main hand (default: left) select pressed while moving */\r\n @property.bool(false)\r\n private readonly _myTripleSpeedShortcutEnabled!: boolean;\r\n\r\n\r\n\r\n @property.bool(false)\r\n private readonly _myDebugHorizontalEnabled!: boolean;\r\n\r\n @property.bool(false)\r\n private readonly _myDebugVerticalEnabled!: boolean;\r\n\r\n\r\n\r\n @property.bool(false)\r\n private readonly _myCollisionCheckDisabled!: boolean;\r\n\r\n\r\n\r\n @property.bool(false)\r\n private readonly _myRaycastCountLogEnabled!: boolean;\r\n\r\n @property.bool(false)\r\n private readonly _myRaycastVisualDebugEnabled!: boolean;\r\n\r\n @property.bool(false)\r\n private readonly _myPerformanceLogEnabled!: boolean;\r\n\r\n\r\n\r\n private readonly _myPlayerLocomotion: PlayerLocomotion | null = null;\r\n\r\n private _myRegisterToPostPoseUpdateOnNextUpdate: boolean = false;\r\n private _myActivateOnNextPostPoseUpdate: boolean = false;\r\n\r\n private readonly _myDebugPerformanceLogTimer: Timer = new Timer(0.5);\r\n private _myDebugPerformanceLogTotalTime: number = 0;\r\n private _myDebugPerformanceLogFrameCount: number = 0;\r\n\r\n\r\n\r\n private _start(): void {\r\n const params = new PlayerLocomotionParams(this.engine);\r\n\r\n params.myDefaultLocomotionType = this._myDefaultLocomotionType;\r\n params.myAlwaysSmoothForNonVR = this._myAlwaysSmoothForNonVR;\r\n params.mySwitchLocomotionTypeShortcutEnabled = this._mySwitchLocomotionTypeShortcutEnabled;\r\n params.myStartIdle = this._myStartIdle;\r\n\r\n params.myDefaultHeight = this._myDefaultHeight;\r\n params.myMinHeight = this._myMinHeight;\r\n\r\n params.myMaxSpeed = this._myMaxSpeed;\r\n params.myMaxRotationSpeed = this._myMaxRotationSpeed;\r\n params.myGravityAcceleration = this._myGravityAcceleration;\r\n params.myMaxGravitySpeed = this._myMaxGravitySpeed;\r\n\r\n params.myCharacterRadius = this._myCharacterRadius;\r\n params.myCharacterFeetRadius = this._myCharacterFeetRadius >= 0 ? this._myCharacterFeetRadius : null;\r\n\r\n params.mySpeedSlowDownPercentageOnWallSlid = this._mySpeedSlowDownPercentageOnWallSlid;\r\n\r\n params.myIsSnapTurn = this._myIsSnapTurn;\r\n params.mySnapTurnOnlyVR = this._mySnapTurnOnlyVR;\r\n params.mySnapTurnAngle = this._mySnapTurnAngle;\r\n params.mySnapTurnSpeedDegrees = this._mySnapTurnSpeedDegrees;\r\n\r\n params.myFlyEnabled = this._myFlyEnabled;\r\n params.myStartFlying = this._myStartFlying;\r\n params.myFlyWithButtonsEnabled = this._myFlyWithButtonsEnabled;\r\n params.myFlyWithViewAngleEnabled = this._myFlyWithViewAngleEnabled;\r\n params.myMinAngleToFlyUpNonVR = this._myMinAngleToFlyUpNonVR;\r\n params.myMinAngleToFlyDownNonVR = this._myMinAngleToFlyDownNonVR;\r\n params.myMinAngleToFlyUpVR = this._myMinAngleToFlyUpVR;\r\n params.myMinAngleToFlyDownVR = this._myMinAngleToFlyDownVR;\r\n params.myMinAngleToFlyRight = this._myMinAngleToFlyRight;\r\n\r\n params.myMainHand = InputUtils.getHandednessByIndex(this._myMainHand)!;\r\n\r\n params.myDirectionInvertForwardWhenUpsideDown = this._myDirectionInvertForwardWhenUpsideDown;\r\n params.myVRDirectionReferenceType = this._myVRDirectionReferenceType;\r\n params.myVRDirectionReferenceObject = this._myVRDirectionReferenceObject;\r\n\r\n params.myForeheadExtraHeight = this._myForeheadExtraHeight;\r\n\r\n params.myTeleportType = this._myTeleportType;\r\n params.myTeleportMaxDistance = this._myTeleportMaxDistance;\r\n params.myTeleportMaxHeightDifference = this._myTeleportMaxHeightDifference;\r\n params.myTeleportRotationOnUpEnabled = this._myTeleportRotationOnUpEnabled;\r\n params.myTeleportValidMaterial = this._myTeleportValidMaterial;\r\n params.myTeleportInvalidMaterial = this._myTeleportInvalidMaterial;\r\n params.myTeleportPositionObject = this._myTeleportPositionObject;\r\n params.myTeleportPositionObjectRotateWithHead = this._myTeleportPositionObjectRotateWithHead;\r\n params.myTeleportParableStartReferenceObject = this._myTeleportParableStartReferenceObject;\r\n\r\n params.myResetRealOnStart = this._myResetRealOnStart;\r\n params.myResetRealOnStartFramesAmount = this._myResetRealOnStartFramesAmount;\r\n params.myResetHeadToFeetInsteadOfReal = this._myResetHeadToFeetInsteadOfReal;\r\n params.myResetHeadToRealMinDistance = this._myResetHeadToRealMinDistance;\r\n params.myMaxHeadToRealHeadSteps = this._myMaxHeadToRealHeadSteps > 0 ? this._myMaxHeadToRealHeadSteps : null;\r\n\r\n params.mySyncWithRealWorldPositionOnlyIfValid = this._mySyncWithRealWorldPositionOnlyIfValid;\r\n params.mySyncWithRealHeightOnlyIfValid = this._mySyncWithRealHeightOnlyIfValid;\r\n params.mySnapRealPositionToGround = this._mySnapRealPositionToGround;\r\n params.myPreventRealFromColliding = this._myPreventRealFromColliding;\r\n params.myViewOcclusionInsideWallsEnabled = this._myViewOcclusionInsideWallsEnabled;\r\n params.myViewOcclusionHeadRadius = this._myViewOcclusionHeadRadius;\r\n params.myViewOcclusionHeadHeight = this._myViewOcclusionHeadHeight;\r\n params.myViewOcclusionFadeOutSeconds = this._myViewOcclusionFadeOutSeconds;\r\n params.myViewOcclusionMaxRealHeadDistance = this._myViewOcclusionMaxRealHeadDistance;\r\n\r\n params.mySyncNonVRHeightWithVROnExitSession = this._mySyncNonVRHeightWithVROnExitSession;\r\n params.mySyncNonVRVerticalAngleWithVROnExitSession = this._mySyncNonVRVerticalAngleWithVROnExitSession;\r\n\r\n params.mySyncHeadWithRealAfterLocomotionUpdateIfNeeded = this._mySyncHeadWithRealAfterLocomotionUpdateIfNeeded;\r\n\r\n params.myColliderAccuracy = this._myColliderAccuracy;\r\n params.myColliderCheckOnlyFeet = this._myColliderCheckOnlyFeet;\r\n params.myColliderCheckCeilings = this._myColliderCheckCeilings;\r\n params.myColliderSlideAlongWall = this._myColliderSlideAlongWall;\r\n params.myColliderMaxWalkableGroundAngle = this._myColliderMaxWalkableGroundAngle;\r\n params.myColliderMaxTeleportableGroundAngle = this._myColliderMaxTeleportableGroundAngle < 0 ? null : this._myColliderMaxTeleportableGroundAngle;\r\n params.myColliderSnapOnGround = this._myColliderSnapOnGround;\r\n params.myColliderMaxDistanceToSnapOnGround = this._myColliderMaxDistanceToSnapOnGround;\r\n params.myColliderMaxDistanceToPopOutGround = this._myColliderMaxDistanceToPopOutGround;\r\n params.myColliderMaxWalkableGroundStepHeight = this._myColliderMaxWalkableGroundStepHeight;\r\n params.myColliderMaxWalkableCeilingStepHeight = this._myColliderMaxWalkableCeilingStepHeight;\r\n params.myColliderPreventFallingFromEdges = this._myColliderPreventFallingFromEdges;\r\n params.myColliderMaxMovementSteps = this._myColliderMaxMovementSteps > 0 ? this._myColliderMaxMovementSteps : null;\r\n params.myColliderExtraHeight = this._myColliderExtraHeight;\r\n\r\n params.myDebugFlyShortcutEnabled = this._myDebugFlyShortcutEnabled;\r\n params.myDebugFlyMaxSpeedMultiplier = this._myDebugFlyMaxSpeedMultiplier;\r\n params.myMoveThroughCollisionShortcutEnabled = this._myMoveThroughCollisionShortcutEnabled;\r\n params.myMoveHeadShortcutEnabled = this._myMoveHeadShortcutEnabled;\r\n params.myTripleSpeedShortcutEnabled = this._myTripleSpeedShortcutEnabled;\r\n\r\n params.myDebugHorizontalEnabled = this._myDebugHorizontalEnabled;\r\n params.myDebugVerticalEnabled = this._myDebugVerticalEnabled;\r\n\r\n params.myCollisionCheckDisabled = this._myCollisionCheckDisabled;\r\n\r\n params.myPhysicsBlockLayerFlags.copy(this._getPhysicsBlockLayersFlags());\r\n params.myTeleportFloorLayerFlags.copy(this._getTeleportFloorLayersFlags());\r\n params.myViewOcclusionLayerFlags.copy(this._getViewOcclusionLayersFlags());\r\n\r\n (this._myPlayerLocomotion as PlayerLocomotion) = new PlayerLocomotion(params);\r\n }\r\n\r\n public override update(dt: number): void {\r\n if (this._myRegisterToPostPoseUpdateOnNextUpdate) {\r\n Globals.getHeadPose(this.engine)!.registerPostPoseUpdatedEventListener(this, this.onPostPoseUpdatedEvent.bind(this));\r\n\r\n this._myRegisterToPostPoseUpdateOnNextUpdate = false;\r\n }\r\n }\r\n\r\n public onPostPoseUpdatedEvent(dt: number, pose: Readonly, manualUpdate: boolean): void {\r\n if (!this.active || this._myRegisterToPostPoseUpdateOnNextUpdate) {\r\n Globals.getHeadPose(this.engine)?.unregisterPostPoseUpdatedEventListener(this);\r\n return;\r\n }\r\n\r\n if (manualUpdate) return;\r\n\r\n let setPlayerLocomotionOnGlobals = false;\r\n if (this._myActivateOnNextPostPoseUpdate) {\r\n setPlayerLocomotionOnGlobals = this._onActivate();\r\n\r\n this._myActivateOnNextPostPoseUpdate = false;\r\n }\r\n\r\n if (!setPlayerLocomotionOnGlobals && Globals.hasPlayerLocomotion(this.engine) && Globals.getPlayerLocomotion(this.engine) != this._myPlayerLocomotion) return;\r\n\r\n let startTime = 0;\r\n if (this._myPerformanceLogEnabled && Globals.isDebugEnabled(this.engine)) {\r\n startTime = window.performance.now();\r\n }\r\n\r\n let raycastVisualDebugEnabledBackup = false;\r\n if (this._myRaycastVisualDebugEnabled && Globals.isDebugEnabled(this.engine)) {\r\n raycastVisualDebugEnabledBackup = PhysicsUtils.isRaycastVisualDebugEnabled(this.engine.physics!);\r\n PhysicsUtils.setRaycastVisualDebugEnabled(true, this.engine.physics!);\r\n }\r\n\r\n if (this._myRaycastCountLogEnabled && Globals.isDebugEnabled(this.engine)) {\r\n PhysicsUtils.resetRaycastCount(this.engine.physics!);\r\n }\r\n\r\n if (!this._myPlayerLocomotion!.isStarted()) {\r\n this._myPlayerLocomotion!.start();\r\n }\r\n\r\n this._myPlayerLocomotion!.update(dt);\r\n\r\n if (this._myPerformanceLogEnabled && Globals.isDebugEnabled(this.engine)) {\r\n const endTime = window.performance.now();\r\n this._myDebugPerformanceLogTotalTime += endTime - startTime;\r\n this._myDebugPerformanceLogFrameCount++;\r\n\r\n this._myDebugPerformanceLogTimer.update(dt);\r\n if (this._myDebugPerformanceLogTimer.isDone()) {\r\n this._myDebugPerformanceLogTimer.start();\r\n\r\n const averageTime = this._myDebugPerformanceLogTotalTime / this._myDebugPerformanceLogFrameCount;\r\n\r\n console.log(\"Locomotion ms: \" + averageTime.toFixed(3));\r\n\r\n this._myDebugPerformanceLogTotalTime = 0;\r\n this._myDebugPerformanceLogFrameCount = 0;\r\n }\r\n }\r\n\r\n if (this._myRaycastVisualDebugEnabled && Globals.isDebugEnabled(this.engine)) {\r\n PhysicsUtils.setRaycastVisualDebugEnabled(raycastVisualDebugEnabledBackup, this.engine.physics!);\r\n }\r\n\r\n if (this._myRaycastCountLogEnabled && Globals.isDebugEnabled(this.engine)) {\r\n console.log(\"Raycast count: \" + PhysicsUtils.getRaycastCount(this.engine.physics!));\r\n PhysicsUtils.resetRaycastCount(this.engine.physics!);\r\n }\r\n\r\n if (setPlayerLocomotionOnGlobals && !Globals.hasPlayerLocomotion(this.engine)) {\r\n // This is done to only set the global when the locomotion is active and updated, so \"ready\"\r\n Globals.setPlayerLocomotion(this._myPlayerLocomotion!, this.engine);\r\n } else if (setPlayerLocomotionOnGlobals && Globals.getPlayerLocomotion(this.engine) != this._myPlayerLocomotion) {\r\n // If someone in some way managed to set the globals, just deactivate this one, which was just being activated since the flag is true\r\n this._myPlayerLocomotion!.setActive(false);\r\n }\r\n }\r\n\r\n public getPlayerLocomotion(): PlayerLocomotion | null {\r\n return this._myPlayerLocomotion;\r\n }\r\n\r\n public override onActivate(): void {\r\n this._myRegisterToPostPoseUpdateOnNextUpdate = true;\r\n this._myActivateOnNextPostPoseUpdate = true;\r\n }\r\n\r\n public override onDeactivate(): void {\r\n Globals.getHeadPose(this.engine)?.unregisterPostPoseUpdatedEventListener(this);\r\n\r\n if (this._myPlayerLocomotion != null) {\r\n this._myPlayerLocomotion.setActive(false);\r\n\r\n if (Globals.getPlayerLocomotion(this.engine) == this._myPlayerLocomotion) {\r\n Globals.removePlayerLocomotion(this.engine);\r\n }\r\n }\r\n }\r\n\r\n private _onActivate(): boolean {\r\n let setPlayerLocomotionOnGlobals = false;\r\n\r\n if (this._myPlayerLocomotion == null) {\r\n this._start();\r\n }\r\n\r\n if (!Globals.hasPlayerLocomotion(this.engine)) {\r\n this._myPlayerLocomotion!.setActive(true);\r\n setPlayerLocomotionOnGlobals = true;\r\n }\r\n\r\n return setPlayerLocomotionOnGlobals;\r\n }\r\n\r\n private _getPhysicsBlockLayersFlags(): PhysicsLayerFlags {\r\n return this._convertStringToLayerFlags(this._myPhysicsBlockLayerFlags);\r\n }\r\n\r\n private _getTeleportFloorLayersFlags(): PhysicsLayerFlags {\r\n if (this._myTeleportFloorLayerFlags.length == 0) {\r\n return this._getPhysicsBlockLayersFlags();\r\n }\r\n\r\n return this._convertStringToLayerFlags(this._myTeleportFloorLayerFlags);\r\n }\r\n\r\n private _getViewOcclusionLayersFlags(): PhysicsLayerFlags {\r\n if (this._myViewOcclusionLayerFlags.length == 0) {\r\n return this._getPhysicsBlockLayersFlags();\r\n }\r\n\r\n return this._convertStringToLayerFlags(this._myViewOcclusionLayerFlags);\r\n }\r\n\r\n private _convertStringToLayerFlags(string: string): PhysicsLayerFlags {\r\n const physicsFlags = new PhysicsLayerFlags();\r\n\r\n const flags = [...string.split(\",\")];\r\n for (let i = 0; i < flags.length; i++) {\r\n physicsFlags.setFlagActive(i, flags[i].trim() == \"1\");\r\n }\r\n\r\n return physicsFlags;\r\n }\r\n\r\n public override onDestroy(): void {\r\n if (this._myPlayerLocomotion != null) {\r\n this._myPlayerLocomotion.destroy();\r\n }\r\n }\r\n}", "import { CollisionComponent, Component, Object3D, PhysXComponent, property } from \"@wonderlandengine/api\";\r\nimport { Cursor, CursorTarget } from \"@wonderlandengine/components\";\r\nimport { PhysicsCollisionCollector } from \"../../../cauldron/physics/physics_collision_collector.js\";\r\nimport { Vector3 } from \"../../../cauldron/type_definitions/array_type_definitions.js\";\r\nimport { vec3_create } from \"../../../plugin/js/extensions/array/vec_create_extension.js\";\r\n\r\n/** #WARN This class is not actually a `Cursor`, but since it triggers `CursorTarget` emitters, it needs to forward a `Cursor` to them \r\n As of now, this class forward a fake cursor as `Cursor`, which is a plain object with just the info usually need, like the `handedness` value */\r\nexport class OverlapCursorComponent extends Component {\r\n public static override TypeName = \"pp-overlap-cursor\";\r\n\r\n /** \r\n * This is useful if you want to avoid the cursor entering and exiting the target when very close to the target, \r\n * due to it flickering between inside and outside. \r\n * You can scale the collision up a bit so that it needs to move a bit outside to actually exit, so that it will not collide \r\n * \r\n * #WARN When using a `PhysXComponent` sadly this require to active and deactivate it to update the extents, which triggers a collision end and a start \r\n * This is not an issue for the cursor, but if you use the same `PhysXComponent` for other queries, you might have issues due to this \r\n */\r\n @property.float(1.125)\r\n private readonly _myCollisionSizeMultiplierOnOverlap!: number;\r\n\r\n @property.float(90)\r\n private readonly _myValidOverlapAngleFromTargetForward!: number;\r\n\r\n private _myLastTarget: CursorTarget | null = null;\r\n\r\n private _myPhysXComponent: PhysXComponent | null = null;\r\n private _myPhysicsCollisionCollector: PhysicsCollisionCollector | null = null;\r\n private readonly _myPhysXComponentExtents: Vector3 = vec3_create();\r\n private _myCollisionComponent: CollisionComponent | null = null;\r\n private readonly _myCollisionComponentExtents: Vector3 = vec3_create();\r\n private readonly _myFakeCursor!: Cursor;\r\n\r\n private readonly _myCursorPositionHistory: Vector3[] = [];\r\n private readonly _myInvalidOverlapCursorTargets: CursorTarget[] = [];\r\n\r\n private _myDoubleClickTimer: number = 0;\r\n private _myTripleClickTimer: number = 0;\r\n private _myMultipleClickObject: Readonly | null = null;\r\n\r\n private static readonly _myMultipleClickDelay: number = 0.3;\r\n\r\n private static _SV = {\r\n componentEqualCallback(first: CursorTarget, second: CursorTarget): boolean {\r\n return first == second;\r\n }\r\n };\r\n\r\n public override init(): void {\r\n const fakeCursor = {\r\n handedness: null,\r\n handednessTyped: null,\r\n object: this.object,\r\n cursorPos: vec3_create()\r\n };\r\n\r\n (this._myFakeCursor as Cursor) = fakeCursor as unknown as Cursor;\r\n\r\n for (let i = 0; i < 5; i++) {\r\n this._myCursorPositionHistory.push(vec3_create());\r\n }\r\n }\r\n\r\n public override start(): void {\r\n this._myPhysXComponent = this.object.pp_getComponent(PhysXComponent);\r\n if (this._myPhysXComponent != null) {\r\n this._myPhysicsCollisionCollector = new PhysicsCollisionCollector(this._myPhysXComponent);\r\n\r\n this._myPhysXComponentExtents.vec3_copy(this._myPhysXComponent.extents);\r\n }\r\n\r\n this._myCollisionComponent = this.object.pp_getComponent(CollisionComponent);\r\n if (this._myCollisionComponent != null) {\r\n this._myCollisionComponentExtents.vec3_copy(this._myCollisionComponent.extents);\r\n }\r\n }\r\n\r\n public override update(dt: number): void {\r\n if (this._myDoubleClickTimer > 0) {\r\n this._myDoubleClickTimer -= dt;\r\n }\r\n\r\n if (this._myTripleClickTimer > 0) {\r\n this._myTripleClickTimer -= dt;\r\n }\r\n\r\n for (let i = this._myCursorPositionHistory.length - 1; i > 0; i--) {\r\n this._myCursorPositionHistory[i].vec3_copy(this._myCursorPositionHistory[i - 1]);\r\n }\r\n this.object.pp_getPosition(this._myCursorPositionHistory[0]);\r\n this._myFakeCursor.cursorPos.vec3_copy(this._myCursorPositionHistory[0]);\r\n\r\n let bestCursorTarget = null;\r\n const processedCursorTargets: CursorTarget[] = [];\r\n\r\n if (this._myCollisionComponent != null) {\r\n const collisions = this._myCollisionComponent!.queryOverlaps();\r\n for (const collision of collisions) {\r\n if (collision.group & this._myCollisionComponent!.group) {\r\n const target = collision.object.pp_getComponentSelf(CursorTarget);\r\n if (target != null && target.active) {\r\n processedCursorTargets.push(target);\r\n bestCursorTarget = this._pickBestCursorTarget(bestCursorTarget, target);\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (this._myPhysicsCollisionCollector != null) {\r\n this._myPhysicsCollisionCollector.update(dt);\r\n const collisions = this._myPhysicsCollisionCollector.getCollisions();\r\n for (const collision of collisions) {\r\n const target = collision.object.pp_getComponentSelf(CursorTarget);\r\n if (target != null && target.active) {\r\n processedCursorTargets.push(target);\r\n bestCursorTarget = this._pickBestCursorTarget(bestCursorTarget, target);\r\n }\r\n }\r\n }\r\n\r\n if (this._myInvalidOverlapCursorTargets.length > 0) {\r\n const componentEqualCallback = OverlapCursorComponent._SV.componentEqualCallback;\r\n this._myInvalidOverlapCursorTargets.pp_removeAll((elementToCheck) => {\r\n return !processedCursorTargets.pp_hasEqual(elementToCheck, componentEqualCallback);\r\n });\r\n }\r\n\r\n if (bestCursorTarget == null) {\r\n this._targetOverlapEnd();\r\n } else if (bestCursorTarget != this._myLastTarget) {\r\n this._targetOverlapEnd();\r\n\r\n this._myLastTarget = bestCursorTarget;\r\n\r\n this._targetOverlapStart();\r\n }\r\n }\r\n\r\n public override onActivate(): void {\r\n if (this._myPhysicsCollisionCollector != null) {\r\n this._myPhysicsCollisionCollector.setActive(true);\r\n }\r\n }\r\n\r\n public override onDeactivate(): void {\r\n this._targetOverlapEnd();\r\n\r\n if (this._myPhysicsCollisionCollector != null) {\r\n this._myPhysicsCollisionCollector.setActive(false);\r\n }\r\n }\r\n\r\n private _targetOverlapStart(): void {\r\n if (this._myCollisionSizeMultiplierOnOverlap != 1 && !this._myLastTarget!.isSurface) {\r\n if (this._myPhysXComponent != null) {\r\n this._myPhysXComponent.extents = this._myPhysXComponentExtents.vec3_scale(this._myCollisionSizeMultiplierOnOverlap);\r\n\r\n this._myPhysicsCollisionCollector!.setActive(false);\r\n this._myPhysXComponent.active = false;\r\n this._myPhysicsCollisionCollector!.setActive(true);\r\n this._myPhysXComponent.active = true;\r\n }\r\n\r\n if (this._myCollisionComponent != null) {\r\n this._myCollisionComponent.extents = this._myCollisionComponentExtents.vec3_scale(this._myCollisionSizeMultiplierOnOverlap);\r\n }\r\n }\r\n\r\n this._myLastTarget!.onHover.notify(this._myLastTarget!.object, this._myFakeCursor);\r\n this._myLastTarget!.onDown.notify(this._myLastTarget!.object, this._myFakeCursor);\r\n }\r\n\r\n private _targetOverlapEnd(): void {\r\n if (this._myLastTarget != null) {\r\n if (this._myCollisionSizeMultiplierOnOverlap != 1) {\r\n if (this._myPhysXComponent != null) {\r\n this._myPhysXComponent.extents = this._myPhysXComponentExtents;\r\n\r\n this._myPhysicsCollisionCollector!.setActive(false);\r\n this._myPhysXComponent.active = false;\r\n this._myPhysicsCollisionCollector!.setActive(true);\r\n this._myPhysXComponent.active = true;\r\n }\r\n\r\n if (this._myCollisionComponent != null) {\r\n this._myCollisionComponent.extents = this._myCollisionComponentExtents;\r\n }\r\n }\r\n\r\n if (!this._myLastTarget.isDestroyed && this._myLastTarget.active) {\r\n this._myLastTarget.onClick.notify(this._myLastTarget.object, this._myFakeCursor);\r\n\r\n if (this._myTripleClickTimer > 0 && this._myMultipleClickObject && this._myMultipleClickObject == this._myLastTarget.object) {\r\n this._myLastTarget.onTripleClick.notify(this._myLastTarget.object, this._myFakeCursor);\r\n\r\n this._myTripleClickTimer = 0;\r\n } else if (this._myDoubleClickTimer > 0 && this._myMultipleClickObject && this._myMultipleClickObject == this._myLastTarget.object) {\r\n this._myLastTarget.onDoubleClick.notify(this._myLastTarget.object, this._myFakeCursor);\r\n\r\n this._myTripleClickTimer = OverlapCursorComponent._myMultipleClickDelay;\r\n this._myDoubleClickTimer = 0;\r\n } else {\r\n this._myLastTarget.onSingleClick.notify(this._myLastTarget.object, this._myFakeCursor);\r\n\r\n this._myTripleClickTimer = 0;\r\n this._myDoubleClickTimer = OverlapCursorComponent._myMultipleClickDelay;\r\n this._myMultipleClickObject = this._myLastTarget.object;\r\n }\r\n\r\n this._myLastTarget.onUp.notify(this._myLastTarget.object, this._myFakeCursor);\r\n this._myLastTarget.onUpWithDown.notify(this._myLastTarget.object, this._myFakeCursor);\r\n\r\n this._myLastTarget.onUnhover.notify(this._myLastTarget.object, this._myFakeCursor);\r\n }\r\n\r\n this._myLastTarget = null;\r\n }\r\n }\r\n\r\n private _pickBestCursorTarget(currentBestCursorTarget: CursorTarget | null, cursorTarget: CursorTarget): CursorTarget | null {\r\n let bestCursorTarget = currentBestCursorTarget;\r\n\r\n if (cursorTarget == this._myLastTarget) {\r\n bestCursorTarget = cursorTarget;\r\n } else {\r\n const componentEqualCallback = OverlapCursorComponent._SV.componentEqualCallback;\r\n if (!this._myInvalidOverlapCursorTargets.pp_hasEqual(cursorTarget, componentEqualCallback)) {\r\n const isAngleValid = this._isOverlapAngleValid(cursorTarget.object);\r\n\r\n if (isAngleValid) {\r\n if (bestCursorTarget == null || (!cursorTarget.isSurface && bestCursorTarget.isSurface)) {\r\n bestCursorTarget = cursorTarget;\r\n }\r\n } else {\r\n this._myInvalidOverlapCursorTargets.push(cursorTarget);\r\n }\r\n }\r\n }\r\n\r\n return bestCursorTarget;\r\n }\r\n\r\n private static _isOverlapAngleValidSV =\r\n {\r\n cursorPosition: vec3_create(),\r\n targetPosition: vec3_create(),\r\n targetForward: vec3_create(),\r\n directionToCursor: vec3_create()\r\n };\r\n private _isOverlapAngleValid(targetObject: Readonly): boolean {\r\n if (this._myValidOverlapAngleFromTargetForward == 180) {\r\n return true;\r\n }\r\n\r\n const targetPosition = OverlapCursorComponent._isOverlapAngleValidSV.targetPosition;\r\n const targetForward = OverlapCursorComponent._isOverlapAngleValidSV.targetForward;\r\n targetObject.pp_getPosition(targetPosition);\r\n targetObject.pp_getForward(targetForward);\r\n\r\n const directionToCursor = OverlapCursorComponent._isOverlapAngleValidSV.directionToCursor;\r\n this._myCursorPositionHistory.pp_last()!.vec3_sub(targetPosition, directionToCursor).vec3_normalize(directionToCursor);\r\n\r\n const overlapAngle = directionToCursor.vec3_angle(targetForward);\r\n\r\n return overlapAngle <= this._myValidOverlapAngleFromTargetForward;\r\n }\r\n}", "import { Collider, CollisionComponent, Component, Object3D, PhysXComponent, property, Shape } from \"@wonderlandengine/api\";\r\nimport { Cursor } from \"@wonderlandengine/components\";\r\nimport { PhysicsLayerFlags } from \"../../../cauldron/physics/physics_layer_flags.js\";\r\nimport { XRUtils } from \"../../../cauldron/utils/xr_utils.js\";\r\nimport { quat2_create, vec3_create } from \"../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Globals } from \"../../../pp/globals.js\";\r\nimport { Handedness, InputSourceType, TrackedHandJointID } from \"../input_types.js\";\r\nimport { InputUtils } from \"../input_utils.js\";\r\nimport { OverlapCursorComponent } from \"./overlap_cursor_component.js\";\r\n\r\n/** #WARN This class is actually adding an `OverlapCursorComponent` so use that if you want to interact with the cursor */\r\nexport class FingerCursorComponent extends Component {\r\n public static override TypeName = \"pp-finger-cursor\";\r\n\r\n @property.enum([\"Left\", \"Right\"], \"Left\")\r\n private readonly _myHandedness!: number;\r\n\r\n @property.enum([\"Thumb\", \"Index\", \"Middle\", \"Ring\", \"Pinky\"], \"Index\")\r\n private readonly _myFinger!: number;\r\n\r\n @property.enum([\"PhysX\", \"Collision\"], \"PhysX\")\r\n private readonly _myCollisionMode!: number;\r\n\r\n @property.string(\"0, 0, 0, 0, 0, 0, 0, 0\")\r\n private readonly _myCollisionFlags!: string;\r\n\r\n @property.float(0.0125)\r\n private readonly _myCollisionSize!: number;\r\n\r\n @property.float(1.25)\r\n private readonly _myCollisionSizeMultiplierOnOverlap!: number;\r\n\r\n @property.float(90)\r\n private readonly _myValidOverlapAngleFromTargetForward!: number;\r\n\r\n @property.object()\r\n private readonly _myCursorPointerObject!: Object3D;\r\n\r\n @property.bool(true)\r\n private readonly _myDisableDefaultCursorOnTrackedHandDetected!: boolean;\r\n\r\n @property.object()\r\n private readonly _myDefaultCursorObject!: Readonly;\r\n\r\n private readonly _myHandednessType!: Handedness;\r\n private readonly _myFingerJointID!: TrackedHandJointID;\r\n private _myDefaultCursorComponent: Cursor | null = null;\r\n private _myHandInputSource: Readonly | null = null;\r\n private _myForceRefreshActiveCursor: boolean = true;\r\n\r\n private readonly _myCursorParentObject!: Object3D;\r\n private readonly _myActualCursorParentObject!: Object3D;\r\n private readonly _myOverlapCursorComponent!: OverlapCursorComponent;\r\n\r\n public override init(): void {\r\n (this._myHandednessType as Handedness) = InputUtils.getHandednessByIndex(this._myHandedness)!;\r\n\r\n switch (this._myFinger) {\r\n case 0:\r\n (this._myFingerJointID as TrackedHandJointID) = TrackedHandJointID.THUMB_TIP;\r\n break;\r\n case 1:\r\n (this._myFingerJointID as TrackedHandJointID) = TrackedHandJointID.INDEX_FINGER_TIP;\r\n break;\r\n case 2:\r\n (this._myFingerJointID as TrackedHandJointID) = TrackedHandJointID.MIDDLE_FINGER_TIP;\r\n break;\r\n case 3:\r\n (this._myFingerJointID as TrackedHandJointID) = TrackedHandJointID.RING_FINGER_TIP;\r\n break;\r\n case 4:\r\n (this._myFingerJointID as TrackedHandJointID) = TrackedHandJointID.PINKY_FINGER_TIP;\r\n break;\r\n }\r\n }\r\n\r\n public override start(): void {\r\n (this._myCursorParentObject as Object3D) = this.object.pp_addChild();\r\n\r\n if (this._myCursorPointerObject == null) {\r\n (this._myActualCursorParentObject as Object3D) = this._myCursorParentObject.pp_addChild();\r\n } else {\r\n (this._myActualCursorParentObject as Object3D) = this._myCursorPointerObject;\r\n }\r\n\r\n this._myActualCursorParentObject.pp_setParent(this._myCursorParentObject);\r\n\r\n const physicsFlags = new PhysicsLayerFlags();\r\n const flags = [...this._myCollisionFlags.split(\",\")];\r\n for (let i = 0; i < flags.length; i++) {\r\n physicsFlags.setFlagActive(i, flags[i].trim() == \"1\");\r\n }\r\n\r\n if (this._myCollisionMode == 0) {\r\n this._myActualCursorParentObject.pp_addComponent(PhysXComponent, {\r\n shape: Shape.Sphere,\r\n extents: vec3_create(this._myCollisionSize, this._myCollisionSize, this._myCollisionSize),\r\n kinematic: true,\r\n trigger: true,\r\n groupsMask: physicsFlags.getMask()\r\n })!;\r\n } else if (this._myCollisionMode == 1) {\r\n const collisionComponent = this._myActualCursorParentObject.pp_addComponent(CollisionComponent)!;\r\n collisionComponent.collider = Collider.Sphere;\r\n collisionComponent.extents = vec3_create(this._myCollisionSize, this._myCollisionSize, this._myCollisionSize);\r\n collisionComponent.group = physicsFlags.getMask();\r\n }\r\n\r\n if (this._myDisableDefaultCursorOnTrackedHandDetected) {\r\n let defaultCursorObject: Readonly = this.object;\r\n if (this._myDefaultCursorObject != null) {\r\n defaultCursorObject = this._myDefaultCursorObject;\r\n }\r\n\r\n this._myDefaultCursorComponent = defaultCursorObject.pp_getComponent(Cursor);\r\n }\r\n\r\n (this._myOverlapCursorComponent as OverlapCursorComponent) = this._myActualCursorParentObject.pp_addComponent(OverlapCursorComponent, {\r\n _myCollisionSizeMultiplierOnOverlap: this._myCollisionSizeMultiplierOnOverlap,\r\n _myValidOverlapAngleFromTargetForward: this._myValidOverlapAngleFromTargetForward,\r\n })!;\r\n\r\n this._myCursorParentObject.pp_setActive(false);\r\n }\r\n\r\n private static readonly _updateSV =\r\n {\r\n transformQuat: quat2_create()\r\n };\r\n public override update(dt: number): void {\r\n const transformQuat = FingerCursorComponent._updateSV.transformQuat;\r\n this._myCursorParentObject.pp_setTransformQuat(Globals.getPlayerObjects(this.engine)!.myReferenceSpace!.pp_getTransformQuat(transformQuat));\r\n this._updateHand();\r\n }\r\n\r\n public override onActivate(): void {\r\n this._myForceRefreshActiveCursor = true;\r\n }\r\n\r\n public override onDeactivate(): void {\r\n if (this._myCursorParentObject != null) {\r\n this._myCursorParentObject.pp_setActive(false);\r\n }\r\n }\r\n\r\n private _updateHand(): void {\r\n let newHandInputSource = null;\r\n\r\n const handPose = Globals.getHandPoses(this.engine)![this._myHandednessType];\r\n if (handPose.getInputSourceType() == InputSourceType.TRACKED_HAND) {\r\n newHandInputSource = handPose.getInputSource();\r\n }\r\n\r\n if (newHandInputSource != null && (this._myHandInputSource == null || this._myForceRefreshActiveCursor)) {\r\n if (this._myDefaultCursorComponent != null) {\r\n this._myDefaultCursorComponent.active = false;\r\n }\r\n\r\n this._myCursorParentObject.pp_setActive(true);\r\n } else if (newHandInputSource == null && (this._myHandInputSource != null || this._myForceRefreshActiveCursor)) {\r\n this._myCursorParentObject.pp_setActive(false);\r\n\r\n if (this._myDefaultCursorComponent != null) {\r\n this._myDefaultCursorComponent.active = true;\r\n }\r\n }\r\n\r\n this._myHandInputSource = newHandInputSource;\r\n\r\n if (this._myHandInputSource != null) {\r\n let tip: XRJointPose | null = null;\r\n\r\n try {\r\n const xrFrame = XRUtils.getFrame(this.engine)!;\r\n if (xrFrame.getJointPose != null) {\r\n tip = xrFrame.getJointPose(this._myHandInputSource.hand!.get(this._myFingerJointID)!, XRUtils.getReferenceSpace(this.engine)!) ?? null;\r\n }\r\n } catch (error) {\r\n // Do nothing\r\n }\r\n\r\n if (tip != null) {\r\n this._myActualCursorParentObject.pp_setRotationLocalQuat([\r\n tip.transform.orientation.x,\r\n tip.transform.orientation.y,\r\n tip.transform.orientation.z,\r\n tip.transform.orientation.w]);\r\n\r\n this._myActualCursorParentObject.pp_setPositionLocal([\r\n tip.transform.position.x,\r\n tip.transform.position.y,\r\n tip.transform.position.z]);\r\n }\r\n }\r\n }\r\n}", "import { Component, Property } from \"@wonderlandengine/api\";\r\nimport { XRUtils } from \"../../../cauldron/utils/xr_utils.js\";\r\nimport { Globals } from \"../../../pp/globals.js\";\r\nimport { InputSourceType } from \"../input_types.js\";\r\nimport { InputUtils } from \"../input_utils.js\";\r\n\r\nexport class SwitchHandObjectComponent extends Component {\r\n static TypeName = \"pp-switch-hand-object\";\r\n static Properties = {\r\n _myHandedness: Property.enum([\"Left\", \"Right\"], \"Left\"),\r\n _myGamepad: Property.object(),\r\n _myTrackedHand: Property.object(),\r\n _myDisableHandsWhenNonXR: Property.bool(true)\r\n };\r\n\r\n start() {\r\n this._myHandednessType = InputUtils.getHandednessByIndex(this._myHandedness);\r\n this._myFirstUpdate = true;\r\n\r\n this._myCurrentInputSourceType = null;\r\n\r\n this._myActivateOnNextUpdate = false;\r\n }\r\n\r\n update(dt) {\r\n if (this._myActivateOnNextUpdate) {\r\n this._onActivate();\r\n\r\n this._myActivateOnNextUpdate = false;\r\n }\r\n }\r\n\r\n _start() {\r\n if (this._myGamepad != null) {\r\n this._myGamepad.pp_setActive(false);\r\n }\r\n\r\n if (this._myTrackedHand != null) {\r\n this._myTrackedHand.pp_setActive(false);\r\n }\r\n\r\n this._myCurrentInputSourceType = null;\r\n }\r\n\r\n _onPoseUpdated(dt, pose) {\r\n if (!this.active || this._myActivateOnNextUpdate) {\r\n Globals.getHandPose(this._myHandednessType, this.engine)?.unregisterPoseUpdatedEventListener(this);\r\n return;\r\n }\r\n\r\n if (this._myFirstUpdate) {\r\n this._myFirstUpdate = false;\r\n this._start();\r\n }\r\n\r\n if (this._myDisableHandsWhenNonXR && !XRUtils.isSessionActive(this.engine)) {\r\n if (this._myCurrentInputSourceType != null) {\r\n this._myCurrentInputSourceType = null;\r\n\r\n this._myGamepad.pp_setActive(false);\r\n this._myTrackedHand.pp_setActive(false);\r\n }\r\n } else {\r\n let inputSourceType = pose.getInputSourceType();\r\n if (this._myCurrentInputSourceType != inputSourceType) {\r\n this._myCurrentInputSourceType = inputSourceType;\r\n\r\n if (inputSourceType == InputSourceType.TRACKED_HAND) {\r\n if (this._myGamepad != null) {\r\n this._myGamepad.pp_setActive(false);\r\n }\r\n if (this._myTrackedHand != null) {\r\n this._myTrackedHand.pp_setActive(true);\r\n }\r\n } else if (inputSourceType == InputSourceType.GAMEPAD) {\r\n if (this._myTrackedHand != null) {\r\n this._myTrackedHand.pp_setActive(false);\r\n }\r\n if (this._myGamepad != null) {\r\n this._myGamepad.pp_setActive(true);\r\n }\r\n } else if (inputSourceType == null) {\r\n this._myGamepad.pp_setActive(false);\r\n this._myTrackedHand.pp_setActive(false);\r\n }\r\n }\r\n }\r\n }\r\n\r\n onActivate() {\r\n this._myActivateOnNextUpdate = true;\r\n }\r\n\r\n _onActivate() {\r\n Globals.getHandPose(this._myHandednessType, this.engine).registerPoseUpdatedEventListener(this, this._onPoseUpdated.bind(this));\r\n\r\n this._myFirstUpdate = true;\r\n }\r\n\r\n onDeactivate() {\r\n Globals.getHandPose(this._myHandednessType, this.engine)?.unregisterPoseUpdatedEventListener(this);\r\n }\r\n}", "import { Component, MeshComponent, Property } from \"@wonderlandengine/api\";\r\nimport { quat2_create } from \"../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Globals } from \"../../../pp/globals.js\";\r\nimport { InputUtils } from \"../input_utils.js\";\r\n\r\nexport class TrackedHandDrawJointComponent extends Component {\r\n static TypeName = \"pp-tracked-hand-draw-joint\";\r\n static Properties = {\r\n _myHandedness: Property.enum([\"Left\", \"Right\"], \"Left\"),\r\n _myJointID: Property.enum(\r\n [\r\n \"Wrist\",\r\n \"Thumb Metacarpal\", \"Thumb Phalanx Proximal\", \"Thumb Phalanx Distal\", \"Thumb Tip\",\r\n \"Index Metacarpal\", \"Index Phalanx Proximal\", \"Index Phalanx Intermediate\", \"Index Phalanx Distal\", \"Index Tip\",\r\n \"Middle Metacarpal\", \"Middle Phalanx Proximal\", \"Middle Phalanx Intermediate\", \"Middle Phalanx Distal\", \"Middle Tip\",\r\n \"Ring Metacarpal\", \"Ring Phalanx Proximal\", \"Ring Phalanx Intermediate\", \"Ring Phalanx Distal\", \"Ring Tip\",\r\n \"Pinky Metacarpal\", \"Pinky Phalanx Proximal\", \"Pinky Phalanx Intermediate\", \"Pinky Phalanx Distal\", \"Pinky Tip\"\r\n ],\r\n \"Wrist\"),\r\n _myJointMesh: Property.mesh(),\r\n _myJointMaterial: Property.material()\r\n };\r\n\r\n start() {\r\n this._myHandednessType = InputUtils.getHandednessByIndex(this._myHandedness);\r\n this._myJointIDType = InputUtils.getJointIDByIndex(this._myJointID);\r\n\r\n this._buildTrackedHandHierarchy();\r\n }\r\n\r\n update(dt) {\r\n // Implemented outside class definition\r\n }\r\n\r\n _buildTrackedHandHierarchy() {\r\n this._myJointMeshObject = this.object.pp_addChild();\r\n\r\n let mesh = this._myJointMeshObject.pp_addComponent(MeshComponent);\r\n mesh.mesh = this._myJointMesh;\r\n mesh.material = this._myJointMaterial;\r\n\r\n this._myJointMeshObject.pp_setScaleLocal(0);\r\n }\r\n}\r\n\r\n\r\n\r\n// IMPLEMENTATION\r\n\r\nTrackedHandDrawJointComponent.prototype.update = function () {\r\n let transformQuat = quat2_create();\r\n return function update(dt) {\r\n let jointPose = Globals.getTrackedHandPose(this._myHandednessType, this.engine).getJointPose(this._myJointIDType);\r\n\r\n this._myJointMeshObject.pp_setTransformLocalQuat(jointPose.getTransformQuat(transformQuat, null));\r\n this._myJointMeshObject.pp_setScaleLocal(jointPose.getJointRadius());\r\n };\r\n}();", "import { Component, Property } from \"@wonderlandengine/api\";\r\nimport { TrackedHandJointID, TrackedHandJointIDIndex } from \"../input_types.js\";\r\nimport { TrackedHandDrawJointComponent } from \"./tracked_hand_draw_joint_component.js\";\r\n\r\nexport class TrackedHandDrawAllJointsComponent extends Component {\r\n static TypeName = \"pp-tracked-hand-draw-all-joints\";\r\n static Properties = {\r\n _myHandedness: Property.enum([\"Left\", \"Right\"], \"Left\"),\r\n _myHideMetacarpals: Property.bool(true),\r\n _myJointMesh: Property.mesh(),\r\n _myJointMaterial: Property.material()\r\n };\r\n\r\n start() {\r\n this._buildTrackedHandHierarchy();\r\n }\r\n\r\n _buildTrackedHandHierarchy() {\r\n this._myTrackedHandMeshObject = this.object.pp_addChild();\r\n\r\n this._myJointMeshObjectList = [];\r\n\r\n for (let jointIDKey in TrackedHandJointID) {\r\n let jointID = TrackedHandJointID[jointIDKey];\r\n if (!this._myHideMetacarpals ||\r\n (jointID != TrackedHandJointID.THUMB_METACARPAL &&\r\n jointID != TrackedHandJointID.INDEX_FINGER_METACARPAL && jointID != TrackedHandJointID.MIDDLE_FINGER_METACARPAL &&\r\n jointID != TrackedHandJointID.RING_FINGER_METACARPAL && jointID != TrackedHandJointID.PINKY_FINGER_METACARPAL)\r\n ) {\r\n let jointObject = this._myTrackedHandMeshObject.pp_addChild();\r\n this._myJointMeshObjectList[jointID] = jointObject;\r\n\r\n jointObject.pp_addComponent(TrackedHandDrawJointComponent,\r\n {\r\n \"_myHandedness\": this._myHandedness,\r\n \"_myJointID\": TrackedHandJointIDIndex[jointIDKey],\r\n \"_myJointMesh\": this._myJointMesh,\r\n \"_myJointMaterial\": this._myJointMaterial\r\n });\r\n\r\n }\r\n }\r\n }\r\n}", "import { Component, Property } from \"@wonderlandengine/api\";\r\nimport { ObjectUtils } from \"../../../cauldron/wl/utils/object_utils.js\";\r\nimport { quat2_create } from \"../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Globals } from \"../../../pp/globals.js\";\r\nimport { InputUtils } from \"../input_utils.js\";\r\n\r\nexport class TrackedHandDrawSkinComponent extends Component {\r\n static TypeName = \"pp-tracked-hand-draw-skin\";\r\n static Properties = {\r\n _myHandedness: Property.enum([\"Left\", \"Right\"], \"Left\"),\r\n _myHandSkin: Property.skin(null),\r\n _myIsHandSkinForwardFixed: Property.bool(false) // Should become true when I can manage to create a tracked hand skin with the forward fixed\r\n };\r\n\r\n start() {\r\n this._myHandednessType = InputUtils.getHandednessByIndex(this._myHandedness);\r\n\r\n this._prepareJoints();\r\n }\r\n\r\n update(dt) {\r\n // Implemented outside class definition\r\n }\r\n\r\n _prepareJoints() {\r\n this._myJoints = [];\r\n\r\n let skinJointIDs = this._myHandSkin.jointIds;\r\n\r\n for (let i = 0; i < skinJointIDs.length; i++) {\r\n this._myJoints[i] = ObjectUtils.wrapObject(skinJointIDs[i], this.engine);\r\n }\r\n }\r\n}\r\n\r\n\r\n\r\n// IMPLEMENTATION\r\n\r\nTrackedHandDrawSkinComponent.prototype.update = function () {\r\n let transformQuat = quat2_create();\r\n return function update(dt) {\r\n for (let i = 0; i < this._myJoints.length; i++) {\r\n let jointObject = this._myJoints[i];\r\n\r\n let jointID = jointObject.pp_getName(); // Joint name must match the TrackedHandJointID enum value\r\n let jointPose = Globals.getTrackedHandPose(this._myHandednessType, this.engine).getJointPose(jointID);\r\n\r\n let jointTransformQuat = jointPose.getTransformQuat(transformQuat, null);\r\n if (jointPose.isForwardFixed() != this._myIsHandSkinForwardFixed) {\r\n jointTransformQuat.quat2_rotateAxis(180, jointTransformQuat.quat2_getUp(), jointTransformQuat);\r\n }\r\n jointObject.pp_setTransformLocalQuat(jointTransformQuat);\r\n }\r\n };\r\n}();", "import { Component, Property } from \"@wonderlandengine/api\";\r\nimport { vec3_create } from \"../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Globals } from \"../../../pp/globals.js\";\r\nimport { HandednessIndex } from \"../../cauldron/input_types.js\";\r\nimport { GamepadAxesEvent, GamepadAxesID, GamepadButtonEvent, GamepadButtonID } from \"../gamepad_buttons.js\";\r\n\r\nexport class GamepadMeshAnimatorComponent extends Component {\r\n static TypeName = \"pp-gamepad-mesh-animator\";\r\n static Properties = {\r\n _myHandedness: Property.enum([\"Left\", \"Right\"], \"Left\"),\r\n _mySelect: Property.object(null),\r\n _mySqueeze: Property.object(null),\r\n _myThumbstick: Property.object(null),\r\n _myTopButton: Property.object(null),\r\n _myBottomButton: Property.object(null),\r\n _mySelectRotateAngle: Property.float(15),\r\n _mySqueezeRotateAngle: Property.float(11),\r\n _myThumbstickRotateAngle: Property.float(15),\r\n _myThumbstickPressOffset: Property.float(0.000625),\r\n _myTopButtonPressOffset: Property.float(0.0015),\r\n _myBottomButtonPressOffset: Property.float(0.0015),\r\n _myUsePressForSqueeze: Property.bool(false),\r\n _mySqueezePressOffset: Property.float(0.0015)\r\n };\r\n\r\n start() {\r\n if (this._mySelect != null) {\r\n this._mySelectOriginalRotation = this._mySelect.pp_getRotationLocalQuat();\r\n this._mySelectOriginalLeft = this._mySelect.pp_getLeftLocal();\r\n }\r\n\r\n if (this._mySqueeze != null) {\r\n this._mySqueezeOriginalPosition = this._mySqueeze.pp_getPositionLocal();\r\n this._mySqueezeOriginalRotation = this._mySqueeze.pp_getRotationLocalQuat();\r\n this._mySqueezeOriginalLeft = this._mySqueeze.pp_getLeftLocal();\r\n this._mySqueezeOriginalForward = this._mySqueeze.pp_getForwardLocal();\r\n }\r\n\r\n if (this._myThumbstick != null) {\r\n this._myThumbstickOriginalPosition = this._myThumbstick.pp_getPositionLocal();\r\n this._myThumbstickOriginalRotation = this._myThumbstick.pp_getRotationLocalQuat();\r\n this._myThumbstickOriginalLeft = this._myThumbstick.pp_getLeftLocal();\r\n this._myThumbstickOriginalUp = this._myThumbstick.pp_getUpLocal();\r\n this._myThumbstickOriginalForward = this._myThumbstick.pp_getForwardLocal();\r\n }\r\n\r\n if (this._myTopButton != null) {\r\n this._myTopButtonOriginalPosition = this._myTopButton.pp_getPositionLocal();\r\n this._myTopButtonOriginalUp = this._myTopButton.pp_getUpLocal();\r\n }\r\n\r\n if (this._myBottomButton != null) {\r\n this._myBottomButtonOriginalPosition = this._myBottomButton.pp_getPositionLocal();\r\n this._myBottomButtonOriginalUp = this._myBottomButton.pp_getUpLocal();\r\n }\r\n\r\n this._myActivateOnNextUpdate = true;\r\n }\r\n\r\n update(dt) {\r\n if (this._myActivateOnNextUpdate) {\r\n this._onActivate();\r\n\r\n this._myActivateOnNextUpdate = false;\r\n }\r\n }\r\n\r\n onActivate() {\r\n this._myActivateOnNextUpdate = true;\r\n }\r\n\r\n _onActivate() {\r\n let gamepad = null;\r\n if (this._myHandedness == HandednessIndex.LEFT) {\r\n gamepad = Globals.getLeftGamepad(this.engine);\r\n } else {\r\n gamepad = Globals.getRightGamepad(this.engine);\r\n }\r\n\r\n // PRESSED\r\n if (this._myThumbstick != null) {\r\n gamepad.registerButtonEventListener(GamepadButtonID.THUMBSTICK, GamepadButtonEvent.PRESS_START, this, this._thumbstickPressedStart.bind(this));\r\n gamepad.registerButtonEventListener(GamepadButtonID.THUMBSTICK, GamepadButtonEvent.PRESS_END, this, this._thumbstickPressedEnd.bind(this));\r\n }\r\n\r\n if (this._myTopButton != null) {\r\n gamepad.registerButtonEventListener(GamepadButtonID.TOP_BUTTON, GamepadButtonEvent.PRESS_START, this, this._topButtonPressedStart.bind(this));\r\n gamepad.registerButtonEventListener(GamepadButtonID.TOP_BUTTON, GamepadButtonEvent.PRESS_END, this, this._topButtonPressedEnd.bind(this));\r\n }\r\n\r\n if (this._myBottomButton != null) {\r\n\r\n gamepad.registerButtonEventListener(GamepadButtonID.BOTTOM_BUTTON, GamepadButtonEvent.PRESS_START, this, this._bottomButtonPressedStart.bind(this));\r\n gamepad.registerButtonEventListener(GamepadButtonID.BOTTOM_BUTTON, GamepadButtonEvent.PRESS_END, this, this._bottomButtonPressedEnd.bind(this));\r\n }\r\n\r\n // VALUE CHANGED\r\n if (this._mySelect != null) {\r\n gamepad.registerButtonEventListener(GamepadButtonID.SELECT, GamepadButtonEvent.VALUE_CHANGED, this, this._selectValueChanged.bind(this));\r\n }\r\n\r\n if (this._mySqueeze != null) {\r\n gamepad.registerButtonEventListener(GamepadButtonID.SQUEEZE, GamepadButtonEvent.VALUE_CHANGED, this, this._squeezeValueChanged.bind(this));\r\n }\r\n\r\n // AXES CHANGED\r\n if (this._myThumbstick != null) {\r\n gamepad.registerAxesEventListener(GamepadAxesID.THUMBSTICK, GamepadAxesEvent.AXES_CHANGED, this, this._thumbstickValueChanged.bind(this));\r\n }\r\n }\r\n\r\n onDeactivate() {\r\n let gamepad = null;\r\n if (this._myHandedness == HandednessIndex.LEFT) {\r\n gamepad = Globals.getLeftGamepad(this.engine);\r\n } else {\r\n gamepad = Globals.getRightGamepad(this.engine);\r\n }\r\n\r\n if (gamepad != null) {\r\n // PRESSED\r\n if (this._myThumbstick != null) {\r\n gamepad.unregisterButtonEventListener(GamepadButtonID.THUMBSTICK, GamepadButtonEvent.PRESS_START, this);\r\n gamepad.unregisterButtonEventListener(GamepadButtonID.THUMBSTICK, GamepadButtonEvent.PRESS_END, this);\r\n }\r\n\r\n if (this._myTopButton != null) {\r\n gamepad.unregisterButtonEventListener(GamepadButtonID.TOP_BUTTON, GamepadButtonEvent.PRESS_START, this);\r\n gamepad.unregisterButtonEventListener(GamepadButtonID.TOP_BUTTON, GamepadButtonEvent.PRESS_END, this);\r\n }\r\n\r\n if (this._myBottomButton != null) {\r\n\r\n gamepad.unregisterButtonEventListener(GamepadButtonID.BOTTOM_BUTTON, GamepadButtonEvent.PRESS_START, this);\r\n gamepad.unregisterButtonEventListener(GamepadButtonID.BOTTOM_BUTTON, GamepadButtonEvent.PRESS_END, this);\r\n }\r\n\r\n // VALUE CHANGED\r\n if (this._mySelect != null) {\r\n gamepad.unregisterButtonEventListener(GamepadButtonID.SELECT, GamepadButtonEvent.VALUE_CHANGED, this);\r\n }\r\n\r\n if (this._mySqueeze != null) {\r\n gamepad.unregisterButtonEventListener(GamepadButtonID.SQUEEZE, GamepadButtonEvent.VALUE_CHANGED, this);\r\n }\r\n\r\n // AXES CHANGED\r\n if (this._myThumbstick != null) {\r\n gamepad.unregisterAxesEventListener(GamepadAxesID.THUMBSTICK, GamepadAxesEvent.AXES_CHANGED, this);\r\n }\r\n }\r\n }\r\n\r\n _thumbstickPressedStart() {\r\n // Implemented outside class definition\r\n }\r\n\r\n _thumbstickPressedEnd(buttonInfo, gamepad) {\r\n if (!this.active || this._myActivateOnNextUpdate) {\r\n this.onDeactivate();\r\n return;\r\n }\r\n\r\n this._myThumbstick.pp_setPositionLocal(this._myThumbstickOriginalPosition);\r\n }\r\n\r\n _topButtonPressedStart(buttonInfo, gamepad) {\r\n if (!this.active || this._myActivateOnNextUpdate) {\r\n this.onDeactivate();\r\n return;\r\n }\r\n\r\n\r\n this._myTopButton.pp_translateAxisLocal(-this._myTopButtonPressOffset, this._myTopButtonOriginalUp);\r\n }\r\n\r\n _topButtonPressedEnd(buttonInfo, gamepad) {\r\n if (!this.active || this._myActivateOnNextUpdate) {\r\n this.onDeactivate();\r\n return;\r\n }\r\n\r\n this._myTopButton.pp_setPositionLocal(this._myTopButtonOriginalPosition);\r\n }\r\n\r\n _bottomButtonPressedStart(buttonInfo, gamepad) {\r\n if (!this.active || this._myActivateOnNextUpdate) {\r\n this.onDeactivate();\r\n return;\r\n }\r\n\r\n this._myBottomButton.pp_translateAxisLocal(-this._myBottomButtonPressOffset, this._myBottomButtonOriginalUp);\r\n }\r\n\r\n _bottomButtonPressedEnd(buttonInfo, gamepad) {\r\n if (!this.active || this._myActivateOnNextUpdate) {\r\n this.onDeactivate();\r\n return;\r\n }\r\n\r\n this._myBottomButton.pp_setPositionLocal(this._myBottomButtonOriginalPosition);\r\n }\r\n\r\n _selectValueChanged(buttonInfo, gamepad) {\r\n if (!this.active || this._myActivateOnNextUpdate) {\r\n this.onDeactivate();\r\n return;\r\n }\r\n\r\n this._mySelect.pp_setRotationLocalQuat(this._mySelectOriginalRotation);\r\n\r\n if (buttonInfo.getValue() > 0.00001) {\r\n this._mySelect.pp_rotateAxisLocal(this._mySelectRotateAngle * buttonInfo.getValue(), this._mySelectOriginalLeft);\r\n }\r\n }\r\n\r\n _squeezeValueChanged(buttonInfo, gamepad) {\r\n if (!this.active || this._myActivateOnNextUpdate) {\r\n this.onDeactivate();\r\n return;\r\n }\r\n\r\n this._mySqueeze.pp_setPositionLocal(this._mySqueezeOriginalPosition);\r\n this._mySqueeze.pp_setRotationLocalQuat(this._mySqueezeOriginalRotation);\r\n\r\n if (buttonInfo.getValue() > 0.00001) {\r\n if (this._myUsePressForSqueeze) {\r\n let translation = this._mySqueezePressOffset;\r\n if (this._myHandedness == 1) {\r\n translation *= -1;\r\n }\r\n\r\n this._mySqueeze.pp_translateAxisLocal(translation * buttonInfo.getValue(), this._mySqueezeOriginalLeft);\r\n } else {\r\n let rotation = -this._mySqueezeRotateAngle;\r\n if (this._myHandedness == 1) {\r\n rotation *= -1;\r\n }\r\n\r\n this._mySqueeze.pp_rotateAxisLocal(rotation * buttonInfo.getValue(), this._mySqueezeOriginalForward);\r\n }\r\n }\r\n }\r\n\r\n _thumbstickValueChanged(axesInfo, gamepad) {\r\n if (!this.active || this._myActivateOnNextUpdate) {\r\n this.onDeactivate();\r\n return;\r\n }\r\n\r\n this._myThumbstick.pp_setRotationLocalQuat(this._myThumbstickOriginalRotation);\r\n\r\n let leftRotation = this._myThumbstickRotateAngle * axesInfo.myAxes[1];\r\n let forwardRotation = this._myThumbstickRotateAngle * axesInfo.myAxes[0];\r\n\r\n if (Math.abs(leftRotation) > 0.0001) {\r\n this._myThumbstick.pp_rotateAxisLocal(leftRotation, this._myThumbstickOriginalLeft);\r\n }\r\n\r\n if (Math.abs(forwardRotation) > 0.0001) {\r\n this._myThumbstick.pp_rotateAxisLocal(forwardRotation, this._myThumbstickOriginalForward);\r\n }\r\n }\r\n}\r\n\r\n\r\n\r\n// IMPLEMENTATION\r\n\r\nGamepadMeshAnimatorComponent.prototype._thumbstickPressedStart = function () {\r\n let upTranslation = vec3_create();\r\n return function _thumbstickPressedStart(buttonInfo, gamepad) {\r\n if (!this.active || this._myActivateOnNextUpdate) {\r\n this.onDeactivate();\r\n return;\r\n }\r\n\r\n // Since thumbstick object rotate you need to specifically use its original up to translate it\r\n this._myThumbstickOriginalUp.vec3_scale(-this._myThumbstickPressOffset, upTranslation);\r\n this._myThumbstick.pp_translateLocal(upTranslation);\r\n };\r\n}();", "import { Alignment, Component, MeshComponent, Property, TextComponent, VerticalAlignment } from \"@wonderlandengine/api\";\r\nimport { vec3_create } from \"../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Globals } from \"../../../pp/globals.js\";\r\nimport { Handedness } from \"../../cauldron/input_types.js\";\r\nimport { InputUtils } from \"../../cauldron/input_utils.js\";\r\n\r\nexport class GamepadControlSchemeComponent extends Component {\r\n static TypeName = \"pp-gamepad-control-scheme\";\r\n static Properties = {\r\n _myShowOnStart: Property.bool(true),\r\n\r\n _myHandedness: Property.enum([\"Left\", \"Right\"], \"Left\"),\r\n\r\n _mySelectText: Property.string(\"\"),\r\n _mySqueezeText: Property.string(\"\"),\r\n _myThumbstickText: Property.string(\"\"),\r\n _myBottomButtonText: Property.string(\"\"),\r\n _myTopButtonText: Property.string(\"\"),\r\n\r\n _mySelect: Property.object(null),\r\n _mySqueeze: Property.object(null),\r\n _myThumbstick: Property.object(null),\r\n _myBottomButton: Property.object(null),\r\n _myTopButton: Property.object(null),\r\n\r\n _myTextScaleMultiplier: Property.float(1),\r\n _myTextOffsetMultiplier: Property.float(1),\r\n _myLineLengthMultiplier: Property.float(1),\r\n _myLineThicknessMultiplier: Property.float(1),\r\n _myDistanceFromButtonsMultiplier: Property.float(1),\r\n\r\n _myTextMaterial: Property.material(),\r\n _myLineMaterial: Property.material()\r\n };\r\n\r\n start() {\r\n this._myTextMaterialFinal = (this._myTextMaterial != null) ? this._myTextMaterial : Globals.getDefaultMaterials(this.engine).myText.clone();\r\n this._myLineMaterialFinal = (this._myLineMaterial != null) ? this._myLineMaterial : Globals.getDefaultMaterials(this.engine).myFlatOpaque.clone();\r\n\r\n this._myHandednessType = InputUtils.getHandednessByIndex(this._myHandedness);\r\n this._myControlSchemeDirection = (this._myHandednessType == Handedness.LEFT) ? 1 : -1;\r\n\r\n this._myVisible = false;\r\n this._mySetVisibleNextUpdate = false;\r\n\r\n this._createControlScheme();\r\n this.setVisible(this._myShowOnStart);\r\n\r\n this._myVisibleBackup = this._myVisible;\r\n }\r\n\r\n update(dt) {\r\n if (this._mySetVisibleNextUpdate) {\r\n this._mySetVisibleNextUpdate = false;\r\n this.setVisible(false);\r\n this.setVisible(this._myVisibleBackup);\r\n }\r\n }\r\n\r\n onActivate() {\r\n this._mySetVisibleNextUpdate = true;\r\n }\r\n\r\n onDeactivate() {\r\n if (this._myVisible != null) {\r\n this._myVisibleBackup = this._myVisible;\r\n this.setVisible(false);\r\n }\r\n }\r\n\r\n isVisible() {\r\n return this._myVisible;\r\n }\r\n\r\n setVisible(visible) {\r\n this._myVisible = visible;\r\n\r\n if (this._myParentObject != null) {\r\n this._myParentObject.pp_setActive(this._myVisible);\r\n\r\n if (this._myVisible) {\r\n this._hideEmptySchemes();\r\n }\r\n }\r\n }\r\n\r\n setSelectText(text) {\r\n this._mySelectText = text;\r\n this._mySelectTextComponent.text = this._mySelectText;\r\n this.setVisible(this._myVisible);\r\n }\r\n\r\n setSqueezeText(text) {\r\n this._mySqueezeText = text;\r\n this._mySqueezeTextComponent.text = this._mySqueezeText;\r\n this.setVisible(this._myVisible);\r\n }\r\n\r\n setThumbstickText(text) {\r\n this._myThumbstickText = text;\r\n this._myThumbstickTextComponent.text = this._myThumbstickText;\r\n this.setVisible(this._myVisible);\r\n }\r\n\r\n setBottomButtonText(text) {\r\n this._myBottomButtonText = text;\r\n this._myBottomButtonTextComponent.text = this._myBottomButtonText;\r\n this.setVisible(this._myVisible);\r\n }\r\n\r\n setTopButtonText(text) {\r\n this._myTopButtonText = text;\r\n this._myTopButtonTextComponent.text = this._myTopButtonText;\r\n this.setVisible(this._myVisible);\r\n }\r\n\r\n _createControlScheme() {\r\n this._myParentObject = this.object.pp_addChild();\r\n\r\n let distanceFromButton = 0.02 * this._myDistanceFromButtonsMultiplier;\r\n let lineLength = 0.0935 * this._myLineLengthMultiplier;\r\n\r\n let referenceObject = this._myThumbstick;\r\n\r\n this._mySelectObject = this._myParentObject.pp_addChild();\r\n this._mySelectTextComponent = this._addScheme(this._mySelect, referenceObject,\r\n vec3_create(0, 0, distanceFromButton),\r\n vec3_create(lineLength * this._myControlSchemeDirection, 0, 0),\r\n this._mySelectObject);\r\n this._mySelectTextComponent.text = this._mySelectText;\r\n\r\n this._mySqueezeObject = this._myParentObject.pp_addChild();\r\n this._mySqueezeTextComponent = this._addScheme(this._mySqueeze, referenceObject,\r\n vec3_create(distanceFromButton * this._myControlSchemeDirection, 0, 0),\r\n vec3_create(lineLength * this._myControlSchemeDirection, 0, 0),\r\n this._mySqueezeObject);\r\n this._mySqueezeTextComponent.text = this._mySqueezeText;\r\n\r\n this._myThumbstickObject = this._myParentObject.pp_addChild();\r\n this._myThumbstickTextComponent = this._addScheme(this._myThumbstick, referenceObject,\r\n vec3_create(0, distanceFromButton, 0),\r\n vec3_create(-lineLength * this._myControlSchemeDirection, 0, 0),\r\n this._myThumbstickObject);\r\n this._myThumbstickTextComponent.text = this._myThumbstickText;\r\n\r\n let thumbstickPositionLocal = this._myThumbstick.pp_getPositionLocal();\r\n let thumbstickUpLocal = this._myThumbstick.pp_getUpLocal();\r\n\r\n {\r\n let bottomButtonPositionLocal = this._myBottomButton.pp_getPositionLocal();\r\n let difference = bottomButtonPositionLocal.vec3_sub(thumbstickPositionLocal);\r\n let differenceOnUp = difference.vec3_valueAlongAxis(thumbstickUpLocal);\r\n\r\n this._myBottomButtonObject = this._myParentObject.pp_addChild();\r\n this._myBottomButtonTextComponent = this._addScheme(this._myBottomButton, referenceObject,\r\n vec3_create(0, distanceFromButton - differenceOnUp, 0),\r\n vec3_create(0, 0, -lineLength),\r\n this._myBottomButtonObject);\r\n this._myBottomButtonTextComponent.text = this._myBottomButtonText;\r\n }\r\n\r\n {\r\n let topButtonPositionLocal = this._myTopButton.pp_getPositionLocal();\r\n let difference = topButtonPositionLocal.vec3_sub(thumbstickPositionLocal);\r\n let differenceOnUp = difference.vec3_valueAlongAxis(thumbstickUpLocal);\r\n\r\n this._myTopButtonObject = this._myParentObject.pp_addChild();\r\n this._myTopButtonTextComponent = this._addScheme(this._myTopButton, referenceObject,\r\n vec3_create(0, distanceFromButton - differenceOnUp, 0),\r\n vec3_create(-lineLength * this._myControlSchemeDirection, 0, 0).vec3_rotateAxis(-45 * this._myControlSchemeDirection, vec3_create(0, 1, 0)),\r\n this._myTopButtonObject);\r\n this._myTopButtonTextComponent.text = this._myTopButtonText;\r\n }\r\n }\r\n\r\n _addScheme(buttonObject, referenceObject, startOffset, endOffset, parentObject) {\r\n let buttonPosition = buttonObject.pp_getPositionLocal();\r\n let referenceForward = referenceObject.pp_getForwardLocal();\r\n let referenceRight = referenceObject.pp_getRightLocal();\r\n let referenceUp = referenceObject.pp_getUpLocal();\r\n\r\n let lineStart = buttonPosition.vec3_add(referenceRight.vec3_scale(startOffset[0]));\r\n lineStart.vec3_add(referenceUp.vec3_scale(startOffset[1]), lineStart);\r\n lineStart.vec3_add(referenceForward.vec3_scale(startOffset[2]), lineStart);\r\n\r\n let lineEnd = lineStart.vec3_add(referenceRight.vec3_scale(endOffset[0]));\r\n lineEnd.vec3_add(referenceUp.vec3_scale(endOffset[1]), lineEnd);\r\n lineEnd.vec3_add(referenceForward.vec3_scale(endOffset[2]), lineEnd);\r\n\r\n let textOffset = 0.01 * this._myTextOffsetMultiplier;\r\n let textPosition = lineEnd.vec3_add(referenceForward.vec3_scale(-textOffset));\r\n\r\n this._addLine(lineStart, lineEnd, parentObject);\r\n let textComponent = this._addText(textPosition, referenceForward, referenceUp, parentObject);\r\n\r\n return textComponent;\r\n }\r\n\r\n _addLine(start, end, parentObject) {\r\n let lineDirection = end.vec3_sub(start);\r\n let length = lineDirection.vec3_length();\r\n lineDirection.vec3_normalize(lineDirection);\r\n\r\n let lineParentObject = parentObject.pp_addChild();\r\n let lineObject = lineParentObject.pp_addChild();\r\n\r\n let lineMesh = lineObject.pp_addComponent(MeshComponent);\r\n lineMesh.mesh = Globals.getDefaultMeshes(this.engine).myCylinder;\r\n lineMesh.material = this._myLineMaterialFinal;\r\n\r\n lineParentObject.pp_setPositionLocal(start);\r\n\r\n let thickness = 0.001 * this._myLineThicknessMultiplier;\r\n lineObject.pp_scaleObject(vec3_create(thickness / 2, length / 2, thickness / 2));\r\n\r\n lineObject.pp_setUpLocal(lineDirection);\r\n lineObject.pp_translateObject(vec3_create(0, length / 2, 0));\r\n }\r\n\r\n _addText(position, forward, up, parentObject) {\r\n let textObject = parentObject.pp_addChild();\r\n textObject.pp_setPositionLocal(position);\r\n textObject.pp_lookToLocal(up, forward);\r\n textObject.pp_scaleObject(0.0935 * this._myTextScaleMultiplier);\r\n\r\n let textComponent = textObject.pp_addComponent(TextComponent);\r\n textComponent.alignment = Alignment.Center;\r\n textComponent.verticalAlignment = VerticalAlignment.Top;\r\n textComponent.material = this._myTextMaterialFinal;\r\n\r\n return textComponent;\r\n }\r\n\r\n _hideEmptySchemes() {\r\n if (this._mySelectText.length == 0) {\r\n this._mySelectObject.pp_setActive(false);\r\n }\r\n if (this._mySqueezeText.length == 0) {\r\n this._mySqueezeObject.pp_setActive(false);\r\n }\r\n if (this._myThumbstickText.length == 0) {\r\n this._myThumbstickObject.pp_setActive(false);\r\n }\r\n if (this._myBottomButtonText.length == 0) {\r\n this._myBottomButtonObject.pp_setActive(false);\r\n }\r\n if (this._myTopButtonText.length == 0) {\r\n this._myTopButtonObject.pp_setActive(false);\r\n }\r\n }\r\n}", "import { Globals } from \"../../../pp/globals.js\";\r\n\r\nexport let VirtualGamepadIconType = {\r\n NONE: 0,\r\n LABEL: 1,\r\n IMAGE: 2,\r\n DOT: 3,\r\n CIRCLE: 4,\r\n SQUARE: 5,\r\n RING: 6,\r\n FRAME: 7\r\n};\r\n\r\nexport class VirtualGamepadIconParams {\r\n\r\n constructor() {\r\n this.myBackgroundColor = \"\";\r\n this.myBackgroundPressedColor = \"\";\r\n this.myIconColor = \"\";\r\n this.myIconPressedColor = \"\";\r\n\r\n this.myIconType = VirtualGamepadIconType.NONE;\r\n\r\n this.myOverallHoveredBrightness = 1;\r\n\r\n // If icon type is label\r\n\r\n this.myLabel = \"\";\r\n this.myLabelFontSize = 0;\r\n this.myLabelFontFamily = \"\";\r\n this.myLabelFontWeight = \"\";\r\n\r\n // If icon type is image\r\n\r\n this.myImageURL = \"\";\r\n this.myImagePressedBrightness = 1;\r\n }\r\n}\r\n\r\nexport class VirtualGamepadIcon {\r\n\r\n constructor(iconElementParent, iconParams, minSizeMultiplier, scale, engine = Globals.getMainEngine()) {\r\n this._myEngine = engine;\r\n\r\n this._myParams = iconParams;\r\n\r\n this._myIconContainerElement = null;\r\n this._myBackgroundElement = null;\r\n this._myIconElement = null;\r\n\r\n this._myPressed = false;\r\n\r\n this._myMouseHover = false;\r\n this._myMouseHoverEnabled = true;\r\n\r\n this._myDestroyed = false;\r\n\r\n this._build(iconElementParent, minSizeMultiplier, scale);\r\n }\r\n\r\n update(dt) {\r\n if (this._myPressed || !this._myMouseHover || !this._myMouseHoverEnabled) {\r\n this._myIconContainerElement.style.filter = \"none\";\r\n } else {\r\n this._myIconContainerElement.style.filter = \"brightness(\" + this._myParams.myOverallHoveredBrightness + \")\";\r\n }\r\n }\r\n\r\n reset() {\r\n this.setPressed(false);\r\n this._myMouseHover = false;\r\n this._myIconContainerElement.style.filter = \"none\";\r\n }\r\n\r\n setPressed(pressed) {\r\n if (this._myPressed != pressed) {\r\n this._myPressed = pressed;\r\n\r\n if (this._myPressed) {\r\n this._myBackgroundElement.style.fill = this._myParams.myBackgroundPressedColor;\r\n if (this._myIconElement != null) {\r\n if (this._myIconElement.style.strokeWidth.length > 0) {\r\n this._myIconElement.style.stroke = this._myParams.myIconPressedColor;\r\n } else {\r\n this._myIconElement.style.fill = this._myParams.myIconPressedColor;\r\n }\r\n\r\n if (this._myParams.myIconType == VirtualGamepadIconType.IMAGE) {\r\n this._myIconElement.style.filter = \"brightness(\" + this._myParams.myImagePressedBrightness + \")\";\r\n }\r\n }\r\n } else {\r\n this._myBackgroundElement.style.fill = this._myParams.myBackgroundColor;\r\n if (this._myIconElement != null) {\r\n if (this._myIconElement.style.strokeWidth.length > 0) {\r\n this._myIconElement.style.stroke = this._myParams.myIconColor;\r\n } else {\r\n this._myIconElement.style.fill = this._myParams.myIconColor;\r\n }\r\n\r\n if (this._myParams.myIconType == VirtualGamepadIconType.IMAGE) {\r\n this._myIconElement.style.filter = \"none\";\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n onMouseEnter() {\r\n this._myMouseHover = true;\r\n }\r\n\r\n onMouseLeave() {\r\n this._myMouseHover = false;\r\n }\r\n\r\n setMouseHoverEnabled(enabled) {\r\n this._myMouseHoverEnabled = enabled;\r\n }\r\n\r\n _build(iconElementParent, minSizeMultiplier, scale) {\r\n this._myIconContainerElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\r\n this._myIconContainerElement.style.position = \"absolute\";\r\n this._myIconContainerElement.style.width = \"100%\";\r\n this._myIconContainerElement.style.height = \"100%\";\r\n iconElementParent.appendChild(this._myIconContainerElement);\r\n\r\n this._myBackgroundElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"circle\");\r\n this._myBackgroundElement.setAttributeNS(null, \"cx\", \"50%\");\r\n this._myBackgroundElement.setAttributeNS(null, \"cy\", \"50%\");\r\n this._myBackgroundElement.setAttributeNS(null, \"r\", \"50%\");\r\n this._myBackgroundElement.style.fill = this._myParams.myBackgroundColor;\r\n this._myIconContainerElement.appendChild(this._myBackgroundElement);\r\n\r\n switch (this._myParams.myIconType) {\r\n case VirtualGamepadIconType.NONE:\r\n break;\r\n case VirtualGamepadIconType.LABEL:\r\n this._myIconElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"text\");\r\n this._myIconElement.setAttributeNS(null, \"x\", \"50%\");\r\n this._myIconElement.setAttributeNS(null, \"y\", \"50%\");\r\n this._myIconElement.style.textAlign = \"center\";\r\n this._myIconElement.style.textAnchor = \"middle\";\r\n this._myIconElement.style.dominantBaseline = \"central\";\r\n this._myIconElement.style.alignmentBaseline = \"central\";\r\n this._myIconElement.style.fontFamily = this._myParams.myLabelFontFamily;\r\n this._myIconElement.style.fontWeight = this._myParams.myLabelFontWeight;\r\n this._myIconElement.style.fontSize = this._createSizeValue(this._myParams.myLabelFontSize * scale, minSizeMultiplier);\r\n this._myIconElement.style.fill = this._myParams.myIconColor;\r\n this._myIconElement.textContent = this._myParams.myLabel;\r\n this._myIconContainerElement.appendChild(this._myIconElement);\r\n break;\r\n case VirtualGamepadIconType.IMAGE:\r\n this._myIconElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"image\");\r\n this._myIconElement.setAttributeNS(null, \"x\", \"0%\");\r\n this._myIconElement.setAttributeNS(null, \"y\", \"0%\");\r\n this._myIconElement.setAttribute(\"href\", this._myParams.myImageURL);\r\n this._myIconElement.style.width = \"100%\";\r\n this._myIconElement.style.height = \"100%\";\r\n this._myIconElement.style.filter = \"none\";\r\n this._myIconContainerElement.appendChild(this._myIconElement);\r\n break;\r\n case VirtualGamepadIconType.DOT:\r\n this._myIconElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"circle\");\r\n this._myIconElement.setAttributeNS(null, \"cx\", \"50%\");\r\n this._myIconElement.setAttributeNS(null, \"cy\", \"50%\");\r\n this._myIconElement.setAttributeNS(null, \"r\", \"17.5%\");\r\n this._myIconElement.style.fill = this._myParams.myIconColor;\r\n this._myIconContainerElement.appendChild(this._myIconElement);\r\n break;\r\n case VirtualGamepadIconType.CIRCLE:\r\n this._myIconElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"circle\");\r\n this._myIconElement.setAttributeNS(null, \"cx\", \"50%\");\r\n this._myIconElement.setAttributeNS(null, \"cy\", \"50%\");\r\n this._myIconElement.setAttributeNS(null, \"r\", \"24%\");\r\n this._myIconElement.style.fill = this._myParams.myIconColor;\r\n this._myIconContainerElement.appendChild(this._myIconElement);\r\n break;\r\n case VirtualGamepadIconType.SQUARE:\r\n this._myIconElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"rect\");\r\n this._myIconElement.setAttributeNS(null, \"x\", \"28%\");\r\n this._myIconElement.setAttributeNS(null, \"y\", \"28%\");\r\n this._myIconElement.setAttributeNS(null, \"rx\", \"10%\");\r\n this._myIconElement.setAttributeNS(null, \"ry\", \"10%\");\r\n this._myIconElement.setAttributeNS(null, \"width\", \"44%\");\r\n this._myIconElement.setAttributeNS(null, \"height\", \"44%\");\r\n this._myIconElement.style.fill = this._myParams.myIconColor;\r\n this._myIconElement.style.transformOrigin = \"center\";\r\n this._myIconContainerElement.appendChild(this._myIconElement);\r\n break;\r\n case VirtualGamepadIconType.RING:\r\n this._myIconElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"circle\");\r\n this._myIconElement.setAttributeNS(null, \"cx\", \"50%\");\r\n this._myIconElement.setAttributeNS(null, \"cy\", \"50%\");\r\n this._myIconElement.setAttributeNS(null, \"r\", \"20%\");\r\n this._myIconElement.style.fill = \"#00000000\";\r\n this._myIconElement.style.stroke = this._myParams.myIconColor;\r\n this._myIconElement.style.strokeWidth = \"10%\";\r\n this._myIconContainerElement.appendChild(this._myIconElement);\r\n break;\r\n case VirtualGamepadIconType.FRAME:\r\n this._myIconElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"rect\");\r\n this._myIconElement.setAttributeNS(null, \"x\", \"31.5%\");\r\n this._myIconElement.setAttributeNS(null, \"y\", \"31.5%\");\r\n this._myIconElement.setAttributeNS(null, \"rx\", \"10%\");\r\n this._myIconElement.setAttributeNS(null, \"ry\", \"10%\");\r\n this._myIconElement.setAttributeNS(null, \"width\", \"37%\");\r\n this._myIconElement.setAttributeNS(null, \"height\", \"37%\");\r\n this._myIconElement.style.fill = \"#00000000\";\r\n this._myIconElement.style.stroke = this._myParams.myIconColor;\r\n this._myIconElement.style.strokeWidth = \"10%\";\r\n this._myIconElement.style.transformOrigin = \"center\";\r\n this._myIconContainerElement.appendChild(this._myIconElement);\r\n break;\r\n }\r\n }\r\n\r\n _createSizeValue(value, minSizeMultiplier) {\r\n return \"min(\" + value.toFixed(3) + \"vmax,\" + (value * minSizeMultiplier).toFixed(3) + \"vw)\";\r\n }\r\n\r\n _invertColors() {\r\n if (this._myIconElement.style.strokeWidth.length > 0) {\r\n this._myBackgroundElement.style.fill = this._myParams.myIconColor;\r\n this._myIconElement.style.fill = this._myParams.myIconColor;\r\n this._myIconElement.style.stroke = this._myParams.myBackgroundColor;\r\n } else {\r\n this._myBackgroundElement.style.fill = this._myParams.myIconColor;\r\n this._myIconElement.style.fill = this._myParams.myBackgroundColor;\r\n }\r\n }\r\n\r\n destroy() {\r\n this._myDestroyed = true;\r\n\r\n this._myIconContainerElement.remove();\r\n }\r\n\r\n isDestroyed() {\r\n return this._myDestroyed;\r\n }\r\n}", "import { Globals } from \"../../../pp/globals.js\";\r\nimport { Handedness } from \"../../cauldron/input_types.js\";\r\nimport { VirtualGamepadAxesID, VirtualGamepadButtonID } from \"./virtual_gamepad.js\";\r\nimport { VirtualGamepadIconParams, VirtualGamepadIconType } from \"./virtual_gamepad_icon.js\";\r\n\r\nexport class VirtualGamepadButtonParams {\r\n\r\n constructor() {\r\n this.myIconParams = new VirtualGamepadIconParams();\r\n }\r\n}\r\n\r\nexport class VirtualGamepadThumbstickParams {\r\n\r\n constructor() {\r\n this.myBackgroundColor = \"\";\r\n\r\n this.myMaxDistanceFromCenterMultiplier = 1;\r\n\r\n this.myReleaseTransitionSeconds = 0.2;\r\n this.myMoveTransitionSeconds = 0;\r\n\r\n this.myIncludeBackgroundToDetection = false; // You can press the background of the icon to move the thumbstick, makes it harder to miss it\r\n\r\n this.myIconParams = new VirtualGamepadIconParams();\r\n }\r\n}\r\n\r\nexport class VirtualGamepadParams {\r\n\r\n constructor(engine = Globals.getMainEngine()) {\r\n this.myShowOnDesktop = false;\r\n this.myShowOnMobile = false;\r\n this.myShowOnHeadset = false; // Not 100% reliable, this is true if the device supports XR and it is Desktop\r\n\r\n this.myAutoUpdateVisibility = false;\r\n\r\n this.myOpacity = 1;\r\n\r\n this.myInterfaceScale = 1;\r\n this.myMarginScale = 1;\r\n\r\n this.myReleaseOnPointerLeave = true; // If mouse leaves the canvas it will be like it was released\r\n this.myStopPropagatingMouseDownEvents = true; // This can be used to make it so the rest of the game will ignore clicks on the virtual gamepad\r\n\r\n // Advanced Params\r\n\r\n this.myButtonParams = [];\r\n this.myButtonParams[Handedness.LEFT] = [];\r\n this.myButtonParams[Handedness.RIGHT] = [];\r\n\r\n this.myButtonParams[Handedness.LEFT][VirtualGamepadButtonID.SECOND_BUTTON] = new VirtualGamepadButtonParams();\r\n this.myButtonParams[Handedness.LEFT][VirtualGamepadButtonID.FIRST_BUTTON] = new VirtualGamepadButtonParams();\r\n this.myButtonParams[Handedness.LEFT][VirtualGamepadButtonID.FIFTH_BUTTON] = new VirtualGamepadButtonParams();\r\n this.myButtonParams[Handedness.LEFT][VirtualGamepadButtonID.THIRD_BUTTON] = new VirtualGamepadButtonParams();\r\n this.myButtonParams[Handedness.LEFT][VirtualGamepadButtonID.FOURTH_BUTTON] = new VirtualGamepadButtonParams();\r\n\r\n this.myButtonParams[Handedness.RIGHT][VirtualGamepadButtonID.SECOND_BUTTON] = new VirtualGamepadButtonParams();\r\n this.myButtonParams[Handedness.RIGHT][VirtualGamepadButtonID.FIRST_BUTTON] = new VirtualGamepadButtonParams();\r\n this.myButtonParams[Handedness.RIGHT][VirtualGamepadButtonID.FIFTH_BUTTON] = new VirtualGamepadButtonParams();\r\n this.myButtonParams[Handedness.RIGHT][VirtualGamepadButtonID.THIRD_BUTTON] = new VirtualGamepadButtonParams();\r\n this.myButtonParams[Handedness.RIGHT][VirtualGamepadButtonID.FOURTH_BUTTON] = new VirtualGamepadButtonParams();\r\n\r\n this.myThumbstickParams = [];\r\n this.myThumbstickParams[Handedness.LEFT] = [];\r\n this.myThumbstickParams[Handedness.RIGHT] = [];\r\n this.myThumbstickParams[Handedness.LEFT][VirtualGamepadAxesID.FIRST_AXES] = new VirtualGamepadThumbstickParams();\r\n this.myThumbstickParams[Handedness.RIGHT][VirtualGamepadAxesID.FIRST_AXES] = new VirtualGamepadThumbstickParams();\r\n\r\n this.myButtonsEnabled = [];\r\n this.myButtonsEnabled[Handedness.LEFT] = [];\r\n this.myButtonsEnabled[Handedness.RIGHT] = [];\r\n\r\n this.myButtonsEnabled[Handedness.LEFT][VirtualGamepadButtonID.FIRST_BUTTON] = false;\r\n this.myButtonsEnabled[Handedness.LEFT][VirtualGamepadButtonID.SECOND_BUTTON] = false;\r\n this.myButtonsEnabled[Handedness.LEFT][VirtualGamepadButtonID.THIRD_BUTTON] = false;\r\n this.myButtonsEnabled[Handedness.LEFT][VirtualGamepadButtonID.FOURTH_BUTTON] = false;\r\n this.myButtonsEnabled[Handedness.LEFT][VirtualGamepadButtonID.FIFTH_BUTTON] = false;\r\n\r\n this.myButtonsEnabled[Handedness.RIGHT][VirtualGamepadButtonID.FIRST_BUTTON] = false;\r\n this.myButtonsEnabled[Handedness.RIGHT][VirtualGamepadButtonID.SECOND_BUTTON] = false;\r\n this.myButtonsEnabled[Handedness.RIGHT][VirtualGamepadButtonID.THIRD_BUTTON] = false;\r\n this.myButtonsEnabled[Handedness.RIGHT][VirtualGamepadButtonID.FOURTH_BUTTON] = false;\r\n this.myButtonsEnabled[Handedness.RIGHT][VirtualGamepadButtonID.FIFTH_BUTTON] = false;\r\n\r\n this.myThumbsticksEnabled = [];\r\n this.myThumbsticksEnabled[Handedness.LEFT] = [];\r\n this.myThumbsticksEnabled[Handedness.RIGHT] = [];\r\n\r\n this.myThumbsticksEnabled[Handedness.LEFT][VirtualGamepadAxesID.FIRST_AXES] = false;\r\n this.myThumbsticksEnabled[Handedness.RIGHT][VirtualGamepadAxesID.FIRST_AXES] = false;\r\n\r\n // Even More Advanced Params\r\n\r\n this.myValidPointerButtons = [];\r\n\r\n this.myMarginLeft = 0;\r\n this.myMarginRight = 0;\r\n this.myMarginBottom = 0;\r\n\r\n this.myThumbstickSize = 0;\r\n\r\n this.myButtonSize = 0;\r\n this.myButtonsRingRadius = 0;\r\n this.myButtonsRingStartAngle = 0;\r\n this.myButtonsRingEndAngle = 0;\r\n\r\n this.myFontSize = 0;\r\n\r\n this.myMinSizeMultiplier = 0; // Can be used to specify a min size based on the view width for when the view is in portrait mode\r\n\r\n this.myDisableMouseHoverWhenPressed = false;\r\n\r\n this.myEngine = engine;\r\n }\r\n\r\n defaultConfig() {\r\n this.myShowOnMobile = true;\r\n this.myAutoUpdateVisibility = true;\r\n\r\n this.myOpacity = 0.5;\r\n\r\n // Params\r\n\r\n let backgroundColor = \"#616161\";\r\n let iconColor = \"#e0e0e0\";\r\n\r\n let buttonHoveredBrightness = 0.75;\r\n let thumbstickHoveredBrightness = 0.75;\r\n\r\n let thumbstickIncludeBackgroundToDetection = true;\r\n\r\n for (let handedness in this.myButtonParams) {\r\n for (let gamepadButtonID in this.myButtonParams[handedness]) {\r\n let buttonParams = this.myButtonParams[handedness][gamepadButtonID];\r\n buttonParams.myIconParams.myBackgroundColor = backgroundColor;\r\n buttonParams.myIconParams.myBackgroundPressedColor = iconColor;\r\n buttonParams.myIconParams.myIconColor = iconColor;\r\n buttonParams.myIconParams.myIconPressedColor = backgroundColor;\r\n buttonParams.myIconParams.myOverallHoveredBrightness = buttonHoveredBrightness;\r\n }\r\n }\r\n\r\n this.myButtonParams[Handedness.LEFT][VirtualGamepadButtonID.FIRST_BUTTON].myIconParams.myIconType = VirtualGamepadIconType.SQUARE;\r\n this.myButtonParams[Handedness.RIGHT][VirtualGamepadButtonID.FIRST_BUTTON].myIconParams.myIconType = VirtualGamepadIconType.SQUARE;\r\n\r\n this.myButtonParams[Handedness.LEFT][VirtualGamepadButtonID.SECOND_BUTTON].myIconParams.myIconType = VirtualGamepadIconType.FRAME;\r\n this.myButtonParams[Handedness.RIGHT][VirtualGamepadButtonID.SECOND_BUTTON].myIconParams.myIconType = VirtualGamepadIconType.FRAME;\r\n\r\n this.myButtonParams[Handedness.LEFT][VirtualGamepadButtonID.THIRD_BUTTON].myIconParams.myIconType = VirtualGamepadIconType.CIRCLE;\r\n this.myButtonParams[Handedness.RIGHT][VirtualGamepadButtonID.THIRD_BUTTON].myIconParams.myIconType = VirtualGamepadIconType.CIRCLE;\r\n\r\n this.myButtonParams[Handedness.LEFT][VirtualGamepadButtonID.FOURTH_BUTTON].myIconParams.myIconType = VirtualGamepadIconType.RING;\r\n this.myButtonParams[Handedness.RIGHT][VirtualGamepadButtonID.FOURTH_BUTTON].myIconParams.myIconType = VirtualGamepadIconType.RING;\r\n\r\n this.myButtonParams[Handedness.LEFT][VirtualGamepadButtonID.FIFTH_BUTTON].myIconParams.myIconType = VirtualGamepadIconType.DOT;\r\n this.myButtonParams[Handedness.RIGHT][VirtualGamepadButtonID.FIFTH_BUTTON].myIconParams.myIconType = VirtualGamepadIconType.DOT;\r\n\r\n for (let handedness in this.myThumbstickParams) {\r\n for (let gamepadAxesID in this.myThumbstickParams[handedness]) {\r\n let thumbstickParams = this.myThumbstickParams[handedness][gamepadAxesID];\r\n thumbstickParams.myBackgroundColor = backgroundColor;\r\n thumbstickParams.myIconParams.myBackgroundColor = iconColor;\r\n thumbstickParams.myIconParams.myBackgroundPressedColor = iconColor;\r\n thumbstickParams.myIconParams.myIconColor = backgroundColor;\r\n thumbstickParams.myIconParams.myIconPressedColor = backgroundColor;\r\n thumbstickParams.myIconParams.myOverallHoveredBrightness = thumbstickHoveredBrightness;\r\n\r\n thumbstickParams.myIncludeBackgroundToDetection = thumbstickIncludeBackgroundToDetection;\r\n }\r\n }\r\n\r\n // Enabled\r\n\r\n this.myButtonsEnabled[Handedness.LEFT][VirtualGamepadButtonID.FIRST_BUTTON] = true;\r\n this.myButtonsEnabled[Handedness.LEFT][VirtualGamepadButtonID.SECOND_BUTTON] = true;\r\n this.myButtonsEnabled[Handedness.LEFT][VirtualGamepadButtonID.THIRD_BUTTON] = true;\r\n this.myButtonsEnabled[Handedness.LEFT][VirtualGamepadButtonID.FOURTH_BUTTON] = true;\r\n this.myButtonsEnabled[Handedness.LEFT][VirtualGamepadButtonID.FIFTH_BUTTON] = true;\r\n\r\n this.myButtonsEnabled[Handedness.RIGHT][VirtualGamepadButtonID.FIRST_BUTTON] = true;\r\n this.myButtonsEnabled[Handedness.RIGHT][VirtualGamepadButtonID.SECOND_BUTTON] = true;\r\n this.myButtonsEnabled[Handedness.RIGHT][VirtualGamepadButtonID.THIRD_BUTTON] = true;\r\n this.myButtonsEnabled[Handedness.RIGHT][VirtualGamepadButtonID.FOURTH_BUTTON] = true;\r\n this.myButtonsEnabled[Handedness.RIGHT][VirtualGamepadButtonID.FIFTH_BUTTON] = true;\r\n\r\n this.myThumbsticksEnabled[Handedness.LEFT][VirtualGamepadAxesID.FIRST_AXES] = true;\r\n this.myThumbsticksEnabled[Handedness.RIGHT][VirtualGamepadAxesID.FIRST_AXES] = true;\r\n\r\n // Sizes\r\n\r\n this.myMarginLeft = 3;\r\n this.myMarginRight = 3;\r\n this.myMarginBottom = 3;\r\n\r\n this.myThumbstickSize = 15;\r\n\r\n this.myButtonSize = 5;\r\n this.myButtonsRingRadius = 12;\r\n this.myButtonsRingStartAngle = 385;\r\n this.myButtonsRingEndAngle = 245;\r\n\r\n this.myMinSizeMultiplier = 5 / 3;\r\n\r\n // Cauldron\r\n\r\n this.myDisableMouseHoverWhenPressed = true;\r\n this.myValidPointerButtons = [0];\r\n }\r\n}", "import { Handedness } from \"../../cauldron/input_types.js\";\r\nimport { VirtualGamepadIcon } from \"./virtual_gamepad_icon.js\";\r\n\r\nexport class VirtualGamepadVirtualButton {\r\n\r\n constructor(buttonElementParent, virtualGamepadParams, virtualButtonHandedness, virtualGamepadButtonID) {\r\n this._myButtonElement = null;\r\n this._myButtonIcon = null;\r\n this._myButtonDetectionElement = null;\r\n\r\n this._myActive = true;\r\n\r\n this._myPointerID = null;\r\n this._myPointerButton = null;\r\n\r\n this._myPressed = false;\r\n\r\n this._myVirtualGamepadParams = virtualGamepadParams;\r\n this._myParams = this._myVirtualGamepadParams.myButtonParams[virtualButtonHandedness][virtualGamepadButtonID];\r\n\r\n this._myButtonElementParent = buttonElementParent;\r\n this._build(virtualButtonHandedness, virtualGamepadButtonID);\r\n\r\n this._myPointerDownEventListener = this._onPointerDown.bind(this, this._myVirtualGamepadParams.myStopPropagatingPointerDownEvents);\r\n this._myPointerUpEventListener = this._onPointerUp.bind(this);\r\n this._myPointerLeaveEventListener = this._onPointerLeave.bind(this);\r\n this._myMouseEnterEventListener = this._onButtonEnter.bind(this);\r\n this._myMouseLeaveEventListener = this._onButtonLeave.bind(this);\r\n\r\n this._myButtonDetectionElement.addEventListener(\"pointerdown\", this._myPointerDownEventListener);\r\n document.body.addEventListener(\"pointerup\", this._myPointerUpEventListener);\r\n\r\n if (this._myVirtualGamepadParams.myReleaseOnPointerLeave) {\r\n document.body.addEventListener(\"pointerleave\", this._myPointerLeaveEventListener);\r\n }\r\n\r\n this._myButtonDetectionElement.addEventListener(\"mouseenter\", this._myMouseEnterEventListener);\r\n this._myButtonDetectionElement.addEventListener(\"mouseleave\", this._myMouseLeaveEventListener);\r\n\r\n this._myDestroyed = false;\r\n }\r\n\r\n isPressed() {\r\n return this._myActive && this._myPressed;\r\n }\r\n\r\n setActive(active) {\r\n if (this._myActive != active) {\r\n this._myActive = active;\r\n\r\n this.reset();\r\n this._myButtonIcon.reset();\r\n\r\n if (this._myActive) {\r\n this._myButtonDetectionElement.addEventListener(\"pointerdown\", this._myPointerDownEventListener);\r\n document.body.addEventListener(\"pointerup\", this._myPointerUpEventListener);\r\n\r\n if (this._myVirtualGamepadParams.myReleaseOnPointerLeave) {\r\n document.body.addEventListener(\"pointerleave\", this._myPointerLeaveEventListener);\r\n }\r\n\r\n this._myButtonDetectionElement.addEventListener(\"mouseenter\", this._myMouseEnterEventListener);\r\n this._myButtonDetectionElement.addEventListener(\"mouseleave\", this._myMouseLeaveEventListener);\r\n\r\n this._myButtonElementParent.appendChild(this._myButtonContainer);\r\n } else {\r\n this._myButtonDetectionElement.removeEventListener(\"pointerdown\", this._myPointerDownEventListener);\r\n\r\n document.body.removeEventListener(\"pointerup\", this._myPointerUpEventListener);\r\n document.body.removeEventListener(\"pointerleave\", this._myPointerLeaveEventListener);\r\n\r\n this._myButtonDetectionElement.removeEventListener(\"mouseenter\", this._myMouseEnterEventListener);\r\n this._myButtonDetectionElement.removeEventListener(\"mouseleave\", this._myMouseLeaveEventListener);\r\n\r\n this._myButtonContainer.remove();\r\n }\r\n }\r\n }\r\n\r\n setMouseHoverEnabled(hoverActive) {\r\n this._myButtonIcon.setMouseHoverEnabled(hoverActive);\r\n }\r\n\r\n reset() {\r\n this._myButtonIcon.setPressed(false);\r\n\r\n this._myPressed = false;\r\n this._myPointerID = null;\r\n this._myPointerButton = null;\r\n }\r\n\r\n update(dt) {\r\n this._myButtonIcon.update(dt);\r\n }\r\n\r\n _onPointerDown(stopPropagatingPointerDownEvents, event) {\r\n if (!this._myActive) return;\r\n if (this._myPressed) return;\r\n if (!this._myVirtualGamepadParams.myValidPointerButtons.pp_hasEqual(event.button)) return;\r\n\r\n if (stopPropagatingPointerDownEvents) {\r\n event.stopPropagation();\r\n }\r\n event.preventDefault();\r\n\r\n this._myButtonIcon.setPressed(true);\r\n\r\n this._myPointerID = event.pointerId;\r\n this._myPointerButton = event.button;\r\n\r\n this._myPressed = true;\r\n }\r\n\r\n _onPointerUp(event) {\r\n if (!this._myActive) return;\r\n if (!this._myPressed) return;\r\n if (this._myPointerID != event.pointerId) return;\r\n if (this._myPointerButton != null && this._myPointerButton != event.button) return;\r\n\r\n this.reset();\r\n }\r\n\r\n _onPointerLeave(event) {\r\n if (!this._myActive) return;\r\n if (this._myPointerID != event.pointerId) return;\r\n\r\n this.reset();\r\n }\r\n\r\n _onButtonEnter(event) {\r\n if (!this._myActive) return;\r\n\r\n this._myButtonIcon.onMouseEnter(event);\r\n }\r\n\r\n _onButtonLeave(event) {\r\n if (!this._myActive) return;\r\n\r\n this._myButtonIcon.onMouseLeave(event);\r\n }\r\n\r\n _build(virtualButtonHandedness, virtualButtonIndex) {\r\n // Config variables used for the sizes and the like\r\n\r\n let buttonSize = this._myVirtualGamepadParams.myButtonSize * this._myVirtualGamepadParams.myInterfaceScale;\r\n let buttonsRingRadius = this._myVirtualGamepadParams.myButtonsRingRadius * this._myVirtualGamepadParams.myInterfaceScale;\r\n\r\n let thumbstickSize = this._myVirtualGamepadParams.myThumbstickSize * this._myVirtualGamepadParams.myInterfaceScale;\r\n\r\n let marginBottom = this._myVirtualGamepadParams.myMarginBottom * this._myVirtualGamepadParams.myInterfaceScale * this._myVirtualGamepadParams.myMarginScale;\r\n let marginLeft = this._myVirtualGamepadParams.myMarginLeft * this._myVirtualGamepadParams.myInterfaceScale * this._myVirtualGamepadParams.myMarginScale;\r\n let marginRight = this._myVirtualGamepadParams.myMarginRight * this._myVirtualGamepadParams.myInterfaceScale * this._myVirtualGamepadParams.myMarginScale;\r\n\r\n let buttonRingStartAngle = this._myVirtualGamepadParams.myButtonsRingStartAngle;\r\n let buttonRingEndAngle = this._myVirtualGamepadParams.myButtonsRingEndAngle;\r\n\r\n let minSizeMultiplier = Math.max(1, this._myVirtualGamepadParams.myMinSizeMultiplier / this._myVirtualGamepadParams.myInterfaceScale);\r\n\r\n let buttonsAmount = this._myVirtualGamepadParams.myButtonsEnabled[Handedness.LEFT].length;\r\n\r\n let angleStep = (buttonRingEndAngle - buttonRingStartAngle) / (buttonsAmount - 1);\r\n\r\n let currentAngle = Math.pp_angleClamp(buttonRingStartAngle + angleStep * virtualButtonIndex);\r\n\r\n if (virtualButtonHandedness == Handedness.RIGHT) {\r\n currentAngle = 270 + (270 - currentAngle);\r\n currentAngle = Math.pp_angleClamp(currentAngle, true);\r\n }\r\n\r\n let counterAngle = 360 - currentAngle;\r\n\r\n // Actual button creation\r\n\r\n this._myButtonContainer = document.createElement(\"div\");\r\n this._myButtonContainer.style.position = \"absolute\";\r\n this._myButtonContainer.style.width = this._createSizeValue(buttonSize, minSizeMultiplier);\r\n this._myButtonContainer.style.height = this._createSizeValue(buttonSize, minSizeMultiplier);\r\n\r\n let centerOnThumbstickBottom = marginBottom + thumbstickSize / 2 - buttonSize / 2;\r\n\r\n this._myButtonContainer.style.bottom = this._createSizeValue(centerOnThumbstickBottom, minSizeMultiplier);\r\n\r\n if (virtualButtonHandedness == Handedness.LEFT) {\r\n let centerOnThumbstickLeft = marginLeft + thumbstickSize / 2 - buttonSize / 2;\r\n this._myButtonContainer.style.left = this._createSizeValue(centerOnThumbstickLeft, minSizeMultiplier);\r\n } else {\r\n let centerOnThumbstickRight = marginRight + thumbstickSize / 2 - buttonSize / 2;\r\n this._myButtonContainer.style.right = this._createSizeValue(centerOnThumbstickRight, minSizeMultiplier);\r\n }\r\n\r\n this._myButtonContainer.style.transform = \"rotate(\" + currentAngle + \"deg) translateX(\" + this._createSizeValue(buttonsRingRadius, minSizeMultiplier) + \")\";\r\n this._myButtonElementParent.appendChild(this._myButtonContainer);\r\n\r\n this._myButtonElement = document.createElement(\"div\");\r\n this._myButtonElement.style.position = \"absolute\";\r\n this._myButtonElement.style.width = \"100%\";\r\n this._myButtonElement.style.height = \"100%\";\r\n this._myButtonElement.style.transform = \"rotate(\" + counterAngle + \"deg)\";\r\n this._myButtonContainer.appendChild(this._myButtonElement);\r\n\r\n this._myButtonIcon = new VirtualGamepadIcon(this._myButtonElement, this._myParams.myIconParams, minSizeMultiplier, this._myVirtualGamepadParams.myInterfaceScale, this._myVirtualGamepadParams.myEngine);\r\n\r\n let buttonElementStill = document.createElement(\"div\");\r\n buttonElementStill.style.position = \"absolute\";\r\n buttonElementStill.style.width = \"100%\";\r\n buttonElementStill.style.height = \"100%\";\r\n buttonElementStill.style.transform = \"rotate(\" + counterAngle + \"deg)\";\r\n this._myButtonContainer.appendChild(buttonElementStill);\r\n\r\n let buttonDetectionElementSVG = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\r\n buttonDetectionElementSVG.style.position = \"absolute\";\r\n buttonDetectionElementSVG.style.width = \"100%\";\r\n buttonDetectionElementSVG.style.height = \"100%\";\r\n buttonElementStill.appendChild(buttonDetectionElementSVG);\r\n\r\n let buttonDetectionElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"circle\");\r\n buttonDetectionElement.setAttributeNS(null, \"cx\", \"50%\");\r\n buttonDetectionElement.setAttributeNS(null, \"cy\", \"50%\");\r\n buttonDetectionElement.setAttributeNS(null, \"r\", \"50%\");\r\n buttonDetectionElement.style.fill = \"#00000000\";\r\n buttonDetectionElementSVG.appendChild(buttonDetectionElement);\r\n\r\n this._myButtonDetectionElement = buttonDetectionElement;\r\n }\r\n\r\n _createSizeValue(value, minSizeMultiplier) {\r\n return \"min(\" + value.toFixed(3) + \"vmax,\" + (value * minSizeMultiplier).toFixed(3) + \"vw)\";\r\n }\r\n\r\n destroy() {\r\n this._myDestroyed = true;\r\n\r\n this.setActive(false);\r\n\r\n this._myButtonIcon.destroy();\r\n }\r\n\r\n isDestroyed() {\r\n return this._myDestroyed;\r\n }\r\n}", "import { vec2_create } from \"../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Handedness } from \"../../cauldron/input_types.js\";\r\nimport { VirtualGamepadIcon } from \"./virtual_gamepad_icon.js\";\r\n\r\nexport class VirtualGamepadVirtualThumbstick {\r\n\r\n constructor(thumbstickElementParent, virtualGamepadParams, virtualThumbstickHandedness, virtualGamepadAxesID) {\r\n this._myThumbstickElement = null;\r\n this._myThumbstickIcon = null;\r\n\r\n this._myThumbstickBackground = null;\r\n this._myThumbstickBackgroundResizeObserver = null;\r\n this._myThumbstickBackgroundWidth = 0;\r\n\r\n this._myThumbstickDetectionElement = null;\r\n\r\n this._myActive = true;\r\n\r\n this._myPointerID = null;\r\n this._myPointerButton = null;\r\n\r\n this._myThumbstickDragStartPosition = vec2_create();\r\n\r\n this._myAxes = vec2_create();\r\n this._myPressed = false;\r\n\r\n this._myVirtualGamepadParams = virtualGamepadParams;\r\n this._myParams = this._myVirtualGamepadParams.myThumbstickParams[virtualThumbstickHandedness][virtualGamepadAxesID];\r\n\r\n this._myThumbstickElementParent = thumbstickElementParent;\r\n this._build(virtualThumbstickHandedness);\r\n\r\n this._myPointerDownEventListener = this._onPointerDown.bind(this, this._myVirtualGamepadParams.myStopPropagatingPointerDownEvents);\r\n this._myPointerUpEventListener = this._onPointerUp.bind(this);\r\n this._myPointerMoveEventListener = this._onPointerMove.bind(this);\r\n this._myPointerLeaveEventListener = this._onPointerLeave.bind(this);\r\n this._myMouseEnterEventListener = this._onThumbstickEnter.bind(this);\r\n this._myMouseLeaveEventListener = this._onThumbstickLeave.bind(this);\r\n\r\n this._myThumbstickDetectionElement.addEventListener(\"pointerdown\", this._myPointerDownEventListener);\r\n document.body.addEventListener(\"pointerup\", this._myPointerUpEventListener);\r\n document.body.addEventListener(\"pointermove\", this._myPointerMoveEventListener);\r\n\r\n if (this._myVirtualGamepadParams.myReleaseOnPointerLeave) {\r\n document.body.addEventListener(\"pointerleave\", this._myPointerLeaveEventListener);\r\n }\r\n\r\n this._myThumbstickDetectionElement.addEventListener(\"mouseenter\", this._myMouseEnterEventListener);\r\n this._myThumbstickDetectionElement.addEventListener(\"mouseleave\", this._myMouseLeaveEventListener);\r\n\r\n this._myDestroyed = false;\r\n }\r\n\r\n isPressed() {\r\n return this._myActive && this._myPressed;\r\n }\r\n\r\n getAxes() {\r\n return this._myAxes;\r\n }\r\n\r\n setActive(active) {\r\n if (this._myActive != active) {\r\n this._myActive = active;\r\n\r\n this.reset();\r\n this._myThumbstickIcon.reset();\r\n\r\n if (this._myActive) {\r\n this._myThumbstickDetectionElement.addEventListener(\"pointerdown\", this._myPointerDownEventListener);\r\n document.body.addEventListener(\"pointerup\", this._myPointerUpEventListener);\r\n document.body.addEventListener(\"pointermove\", this._myPointerMoveEventListener);\r\n\r\n if (this._myVirtualGamepadParams.myReleaseOnPointerLeave) {\r\n document.body.addEventListener(\"pointerleave\", this._myPointerLeaveEventListener);\r\n }\r\n\r\n this._myThumbstickDetectionElement.addEventListener(\"mouseenter\", this._myMouseEnterEventListener);\r\n this._myThumbstickDetectionElement.addEventListener(\"mouseleave\", this._myMouseLeaveEventListener);\r\n\r\n this._myThumbstickBackgroundResizeObserver.observe(this._myThumbstickBackground);\r\n\r\n\r\n this._myThumbstickElementParent.appendChild(this._myThumbstickContainer);\r\n } else {\r\n this._myThumbstickDetectionElement.removeEventListener(\"pointerdown\", this._myPointerDownEventListener);\r\n\r\n document.body.removeEventListener(\"pointerup\", this._myPointerUpEventListener);\r\n document.body.removeEventListener(\"pointermove\", this._myPointerMoveEventListener);\r\n document.body.removeEventListener(\"pointerleave\", this._myPointerLeaveEventListener);\r\n\r\n this._myThumbstickDetectionElement.removeEventListener(\"mouseenter\", this._myMouseEnterEventListener);\r\n this._myThumbstickDetectionElement.removeEventListener(\"mouseleave\", this._myPointerUpEventLis_myMouseLeaveEventListenertener);\r\n\r\n this._myThumbstickBackgroundResizeObserver.disconnect();\r\n\r\n this._myThumbstickContainer.remove();\r\n }\r\n }\r\n }\r\n\r\n setMouseHoverEnabled(hoverActive) {\r\n this._myThumbstickIcon.setMouseHoverEnabled(hoverActive);\r\n }\r\n\r\n reset() {\r\n this._myThumbstickIcon.setPressed(false);\r\n\r\n this._myAxes[0] = 0;\r\n this._myAxes[1] = 0;\r\n this._myPressed = false;\r\n this._myPointerID = null;\r\n this._myPointerButton = null;\r\n\r\n this._myThumbstickElement.style.transition = \"all \" + this._myParams.myReleaseTransitionSeconds + \"s ease 0s\";\r\n this._myThumbstickElement.style.transform = \"translate(0px, 0px)\";\r\n }\r\n\r\n update(dt) {\r\n this._myThumbstickIcon.update(dt);\r\n }\r\n\r\n _onPointerDown(stopPropagatingPointerDownEvents, event) {\r\n if (!this._myActive) return;\r\n if (this._myPressed) return;\r\n if (!this._myVirtualGamepadParams.myValidPointerButtons.pp_hasEqual(event.button)) return;\r\n\r\n if (stopPropagatingPointerDownEvents) {\r\n event.stopPropagation();\r\n }\r\n event.preventDefault();\r\n\r\n this._myThumbstickIcon.setPressed(true);\r\n\r\n this._myPointerID = event.pointerId;\r\n this._myPointerButton = event.button;\r\n\r\n this._myThumbstickDragStartPosition[0] = event.clientX;\r\n this._myThumbstickDragStartPosition[1] = event.clientY;\r\n\r\n this._myPressed = true;\r\n }\r\n\r\n _onPointerUp(event) {\r\n if (!this._myActive) return;\r\n if (!this._myPressed) return;\r\n if (this._myPointerID != event.pointerId) return;\r\n if (this._myPointerButton != null && this._myPointerButton != event.button) return;\r\n\r\n this.reset();\r\n }\r\n\r\n _onPointerLeave(event) {\r\n if (!this._myActive) return;\r\n if (this._myPointerID != event.pointerId) return;\r\n\r\n this.reset();\r\n }\r\n\r\n _onThumbstickEnter(event) {\r\n this._myThumbstickIcon.onMouseEnter(event);\r\n }\r\n\r\n _onThumbstickLeave(event) {\r\n this._myThumbstickIcon.onMouseLeave(event);\r\n }\r\n\r\n _onPointerMove(event) {\r\n if (!this._myActive) return;\r\n if (!this._myPressed) return;\r\n\r\n if (event.pointerId != this._myPointerID) return;\r\n\r\n let mouseX = event.clientX;\r\n let mouseY = event.clientY;\r\n\r\n let maxDistanceFromCenter = (this._myThumbstickBackgroundWidth / 2) * this._myParams.myMaxDistanceFromCenterMultiplier;\r\n\r\n let xDiff = mouseX - this._myThumbstickDragStartPosition[0];\r\n let yDiff = mouseY - this._myThumbstickDragStartPosition[1];\r\n\r\n let angle = Math.atan2(yDiff, xDiff);\r\n let distanceFromDragStart = Math.min(maxDistanceFromCenter, Math.hypot(xDiff, yDiff));\r\n\r\n let translateThumbstickX = distanceFromDragStart * Math.cos(angle);\r\n let translateThumbstickY = distanceFromDragStart * Math.sin(angle);\r\n\r\n this._myThumbstickElement.style.transition = \"all \" + this._myParams.myMoveTransitionSeconds + \"s ease-out 0s\";\r\n this._myThumbstickElement.style.transform = \"translate(\" + translateThumbstickX + \"px, \" + translateThumbstickY + \"px)\";\r\n\r\n this._myAxes[0] = translateThumbstickX / maxDistanceFromCenter;\r\n this._myAxes[1] = -(translateThumbstickY / maxDistanceFromCenter);\r\n }\r\n\r\n _build(virtualThumbstickHandedness) {\r\n // Config variables used for the sizes and the like\r\n\r\n let thumbstickSize = this._myVirtualGamepadParams.myThumbstickSize * this._myVirtualGamepadParams.myInterfaceScale;\r\n\r\n let marginBottom = this._myVirtualGamepadParams.myMarginBottom * this._myVirtualGamepadParams.myInterfaceScale * this._myVirtualGamepadParams.myMarginScale;\r\n let marginLeft = this._myVirtualGamepadParams.myMarginLeft * this._myVirtualGamepadParams.myInterfaceScale * this._myVirtualGamepadParams.myMarginScale;\r\n let marginRight = this._myVirtualGamepadParams.myMarginRight * this._myVirtualGamepadParams.myInterfaceScale * this._myVirtualGamepadParams.myMarginScale;\r\n\r\n let minSizeMultiplier = Math.max(1, this._myVirtualGamepadParams.myMinSizeMultiplier / this._myVirtualGamepadParams.myInterfaceScale);\r\n\r\n // Actual thumbstick creation\r\n\r\n this._myThumbstickContainer = document.createElement(\"div\");\r\n this._myThumbstickContainer.style.position = \"absolute\";\r\n this._myThumbstickContainer.style.width = this._createSizeValue(thumbstickSize, minSizeMultiplier);\r\n this._myThumbstickContainer.style.height = this._createSizeValue(thumbstickSize, minSizeMultiplier);\r\n this._myThumbstickContainer.style.bottom = this._createSizeValue(marginBottom, minSizeMultiplier);\r\n\r\n if (virtualThumbstickHandedness == Handedness.LEFT) {\r\n this._myThumbstickContainer.style.left = this._createSizeValue(marginLeft, minSizeMultiplier);\r\n } else {\r\n this._myThumbstickContainer.style.right = this._createSizeValue(marginRight, minSizeMultiplier);\r\n }\r\n\r\n this._myThumbstickElementParent.appendChild(this._myThumbstickContainer);\r\n\r\n let thumbstickContainerSVG = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\r\n thumbstickContainerSVG.style.position = \"absolute\";\r\n thumbstickContainerSVG.style.width = \"100%\";\r\n thumbstickContainerSVG.style.height = \"100%\";\r\n this._myThumbstickContainer.appendChild(thumbstickContainerSVG);\r\n\r\n this._myThumbstickBackground = document.createElementNS(\"http://www.w3.org/2000/svg\", \"circle\");\r\n this._myThumbstickBackground.setAttributeNS(null, \"cx\", \"50%\");\r\n this._myThumbstickBackground.setAttributeNS(null, \"cy\", \"50%\");\r\n this._myThumbstickBackground.setAttributeNS(null, \"r\", \"48%\");\r\n this._myThumbstickBackground.style.fill = this._myParams.myBackgroundColor;\r\n thumbstickContainerSVG.appendChild(this._myThumbstickBackground);\r\n\r\n this._myThumbstickElement = document.createElement(\"div\");\r\n this._myThumbstickElement.style.position = \"absolute\";\r\n this._myThumbstickElement.style.width = \"34%\";\r\n this._myThumbstickElement.style.height = \"34%\";\r\n this._myThumbstickElement.style.top = \"33%\";\r\n this._myThumbstickElement.style.left = \"33%\";\r\n this._myThumbstickContainer.appendChild(this._myThumbstickElement);\r\n\r\n this._myThumbstickIcon = new VirtualGamepadIcon(this._myThumbstickElement, this._myParams.myIconParams, minSizeMultiplier, this._myVirtualGamepadParams.myScale, this._myVirtualGamepadParams.myEngine);\r\n\r\n if (this._myParams.myIncludeBackgroundToDetection) {\r\n let thumbstickBackgroundDetectionElementSVG = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\r\n thumbstickBackgroundDetectionElementSVG.style.position = \"absolute\";\r\n thumbstickBackgroundDetectionElementSVG.style.width = \"100%\";\r\n thumbstickBackgroundDetectionElementSVG.style.height = \"100%\";\r\n this._myThumbstickContainer.appendChild(thumbstickBackgroundDetectionElementSVG);\r\n\r\n let thumbstickBackgroundDetectionElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"circle\");\r\n thumbstickBackgroundDetectionElement.setAttributeNS(null, \"cx\", \"50%\");\r\n thumbstickBackgroundDetectionElement.setAttributeNS(null, \"cy\", \"50%\");\r\n thumbstickBackgroundDetectionElement.setAttributeNS(null, \"r\", \"48%\");\r\n thumbstickBackgroundDetectionElement.style.fill = \"#00000000\";\r\n thumbstickBackgroundDetectionElementSVG.appendChild(thumbstickBackgroundDetectionElement);\r\n\r\n this._myThumbstickDetectionElement = thumbstickBackgroundDetectionElement;\r\n } else {\r\n let thumbstickElementStill = document.createElement(\"div\");\r\n thumbstickElementStill.style.position = \"absolute\";\r\n thumbstickElementStill.style.width = \"34%\";\r\n thumbstickElementStill.style.height = \"34%\";\r\n thumbstickElementStill.style.top = \"33%\";\r\n thumbstickElementStill.style.left = \"33%\";\r\n this._myThumbstickContainer.appendChild(thumbstickElementStill);\r\n\r\n let thumbstickDetectionElementSVG = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\r\n thumbstickDetectionElementSVG.style.position = \"absolute\";\r\n thumbstickDetectionElementSVG.style.width = \"100%\";\r\n thumbstickDetectionElementSVG.style.height = \"100%\";\r\n thumbstickElementStill.appendChild(thumbstickDetectionElementSVG);\r\n\r\n let thumbstickDetectionElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"circle\");\r\n thumbstickDetectionElement.setAttributeNS(null, \"cx\", \"50%\");\r\n thumbstickDetectionElement.setAttributeNS(null, \"cy\", \"50%\");\r\n thumbstickDetectionElement.setAttributeNS(null, \"r\", \"50%\");\r\n thumbstickDetectionElement.style.fill = \"#00000000\";\r\n thumbstickDetectionElementSVG.appendChild(thumbstickDetectionElement);\r\n\r\n this._myThumbstickDetectionElement = thumbstickDetectionElement;\r\n }\r\n\r\n this._myThumbstickBackgroundResizeObserver = new ResizeObserver(() => {\r\n let backgroundRect = this._myThumbstickBackground.getBoundingClientRect();\r\n this._myThumbstickBackgroundWidth = backgroundRect.width;\r\n });\r\n }\r\n\r\n _createSizeValue(value, minSizeMultiplier) {\r\n return \"min(\" + value.toFixed(3) + \"vmax,\" + (value * minSizeMultiplier).toFixed(3) + \"vw)\";\r\n }\r\n\r\n destroy() {\r\n this._myDestroyed = true;\r\n\r\n this.setActive(false);\r\n\r\n this._myThumbstickIcon.destroy();\r\n }\r\n\r\n isDestroyed() {\r\n return this._myDestroyed;\r\n }\r\n}", "import { BrowserUtils } from \"../../../cauldron/utils/browser_utils.js\";\r\nimport { XRUtils } from \"../../../cauldron/utils/xr_utils.js\";\r\nimport { vec2_create } from \"../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Handedness } from \"../../cauldron/input_types.js\";\r\nimport { VirtualGamepadParams } from \"./virtual_gamepad_params.js\";\r\nimport { VirtualGamepadVirtualButton } from \"./virtual_gamepad_virtual_button.js\";\r\nimport { VirtualGamepadVirtualThumbstick } from \"./virtual_gamepad_virtual_thumbstick.js\";\r\n\r\nexport let VirtualGamepadButtonID = {\r\n FIRST_BUTTON: 0,\r\n SECOND_BUTTON: 1,\r\n THIRD_BUTTON: 2,\r\n FOURTH_BUTTON: 3,\r\n FIFTH_BUTTON: 4\r\n};\r\n\r\nexport let VirtualGamepadAxesID = {\r\n FIRST_AXES: 0\r\n};\r\n\r\nexport class VirtualGamepad {\r\n\r\n constructor(params = new VirtualGamepadParams()) {\r\n this._myParams = params;\r\n\r\n this._myVisible = true;\r\n\r\n this._myVirtualGamepadContainer = null;\r\n\r\n this._myVirtualGamepadVirtualButtons = [];\r\n this._myVirtualGamepadVirtualButtons[Handedness.LEFT] = [];\r\n this._myVirtualGamepadVirtualButtons[Handedness.RIGHT] = [];\r\n\r\n this._myVirtualGamepadVirtualButtons[Handedness.LEFT][VirtualGamepadButtonID.FIRST_BUTTON] = null;\r\n this._myVirtualGamepadVirtualButtons[Handedness.LEFT][VirtualGamepadButtonID.SECOND_BUTTON] = null;\r\n this._myVirtualGamepadVirtualButtons[Handedness.LEFT][VirtualGamepadButtonID.THIRD_BUTTON] = null;\r\n this._myVirtualGamepadVirtualButtons[Handedness.LEFT][VirtualGamepadButtonID.FOURTH_BUTTON] = null;\r\n this._myVirtualGamepadVirtualButtons[Handedness.LEFT][VirtualGamepadButtonID.FIFTH_BUTTON] = null;\r\n\r\n this._myVirtualGamepadVirtualButtons[Handedness.RIGHT][VirtualGamepadButtonID.FIRST_BUTTON] = null;\r\n this._myVirtualGamepadVirtualButtons[Handedness.RIGHT][VirtualGamepadButtonID.SECOND_BUTTON] = null;\r\n this._myVirtualGamepadVirtualButtons[Handedness.RIGHT][VirtualGamepadButtonID.THIRD_BUTTON] = null;\r\n this._myVirtualGamepadVirtualButtons[Handedness.RIGHT][VirtualGamepadButtonID.FOURTH_BUTTON] = null;\r\n this._myVirtualGamepadVirtualButtons[Handedness.RIGHT][VirtualGamepadButtonID.FIFTH_BUTTON] = null;\r\n\r\n this._myButtonsAmount = this._myVirtualGamepadVirtualButtons[Handedness.LEFT].length;\r\n\r\n this._myVirtualGamepadVirtualThumbsticks = [];\r\n this._myVirtualGamepadVirtualThumbsticks[Handedness.LEFT] = [];\r\n this._myVirtualGamepadVirtualThumbsticks[Handedness.RIGHT] = [];\r\n this._myVirtualGamepadVirtualThumbsticks[Handedness.LEFT][VirtualGamepadAxesID.FIRST_AXES] = null;\r\n this._myVirtualGamepadVirtualThumbsticks[Handedness.RIGHT][VirtualGamepadAxesID.FIRST_AXES] = null;\r\n\r\n this._myGestureStartEventListener = null;\r\n\r\n this._myDestroyed = false;\r\n }\r\n\r\n isVisible() {\r\n return this._myVisible;\r\n }\r\n\r\n setVisible(visible) {\r\n if (this._myVisible != visible) {\r\n this._myVisible = visible;\r\n\r\n if (this._myVirtualGamepadContainer != null) {\r\n for (let handedness in this._myVirtualGamepadVirtualButtons) {\r\n for (let virtualGamepadButtonID in this._myVirtualGamepadVirtualButtons[handedness]) {\r\n let button = this._myVirtualGamepadVirtualButtons[handedness][virtualGamepadButtonID];\r\n if (button != null) {\r\n button.setActive(this._myVisible);\r\n }\r\n }\r\n }\r\n\r\n for (let handedness in this._myVirtualGamepadVirtualThumbsticks) {\r\n for (let virtualGamepadAxesID in this._myVirtualGamepadVirtualThumbsticks[handedness]) {\r\n let thumbstick = this._myVirtualGamepadVirtualThumbsticks[handedness][virtualGamepadAxesID];\r\n if (thumbstick != null) {\r\n thumbstick.setActive(this._myVisible);\r\n }\r\n }\r\n }\r\n\r\n if (this._myVisible) {\r\n document.body.appendChild(this._myVirtualGamepadContainer);\r\n } else {\r\n this._myVirtualGamepadContainer?.remove();\r\n }\r\n }\r\n\r\n if (this._myVisible) {\r\n document.addEventListener(\"gesturestart\", this._myGestureStartEventListener);\r\n } else {\r\n document.removeEventListener(\"gesturestart\", this._myGestureStartEventListener);\r\n }\r\n }\r\n }\r\n\r\n isButtonPressed(handedness, virtualGamepadButtonID) {\r\n if (!this._myVisible) return false;\r\n\r\n let button = this._myVirtualGamepadVirtualButtons[handedness][virtualGamepadButtonID];\r\n if (button != null) {\r\n return button.isPressed();\r\n }\r\n\r\n return false;\r\n }\r\n\r\n getAxes(handedness, virtualGamepadAxesID, outAxes = vec2_create(0, 0)) {\r\n if (!this._myVisible) return outAxes;\r\n\r\n let thumbstick = this._myVirtualGamepadVirtualThumbsticks[handedness][virtualGamepadAxesID];\r\n if (thumbstick != null) {\r\n outAxes.vec2_copy(thumbstick.getAxes());\r\n }\r\n\r\n return outAxes;\r\n }\r\n\r\n start() {\r\n this._buildVirtualGamepad();\r\n\r\n let currentVisible = this._myVisible;\r\n this._myVisible = !this._myVisible;\r\n this.setVisible(currentVisible);\r\n }\r\n\r\n update(dt) {\r\n if (this._myParams.myAutoUpdateVisibility) {\r\n if (XRUtils.isSessionActive(this._myParams.myEngine) && XRUtils.isVRSupported(this._myParams.myEngine)) {\r\n this.setVisible(false);\r\n } else if (this._myParams.myShowOnDesktop && BrowserUtils.isDesktop() && !XRUtils.isVRSupported(this._myParams.myEngine)) {\r\n this.setVisible(true);\r\n } else if (this._myParams.myShowOnHeadset && BrowserUtils.isDesktop() && XRUtils.isVRSupported(this._myParams.myEngine)) {\r\n this.setVisible(true);\r\n } else if (this._myParams.myShowOnMobile && BrowserUtils.isMobile()) {\r\n this.setVisible(true);\r\n } else {\r\n this.setVisible(false);\r\n }\r\n }\r\n\r\n if (this._myVisible) {\r\n for (let handedness in this._myVirtualGamepadVirtualButtons) {\r\n for (let virtualGamepadButtonID in this._myVirtualGamepadVirtualButtons[handedness]) {\r\n let button = this._myVirtualGamepadVirtualButtons[handedness][virtualGamepadButtonID];\r\n if (button != null) {\r\n button.update(dt);\r\n }\r\n }\r\n }\r\n\r\n for (let handedness in this._myVirtualGamepadVirtualThumbsticks) {\r\n for (let virtualGamepadAxesID in this._myVirtualGamepadVirtualThumbsticks[handedness]) {\r\n let thumbstick = this._myVirtualGamepadVirtualThumbsticks[handedness][virtualGamepadAxesID];\r\n if (thumbstick != null) {\r\n thumbstick.update(dt);\r\n }\r\n }\r\n }\r\n\r\n this._setMouseHoverEnabled(!(this._myParams.myDisableMouseHoverWhenPressed && this._isAnyElementPressed()));\r\n }\r\n }\r\n\r\n _buildVirtualGamepad() {\r\n this._setupDocumentBody();\r\n\r\n this._myVirtualGamepadContainer = document.createElement(\"div\");\r\n this._myVirtualGamepadContainer.style.display = \"block\";\r\n this._myVirtualGamepadContainer.style.opacity = this._myParams.myOpacity.toString();\r\n document.body.appendChild(this._myVirtualGamepadContainer);\r\n\r\n let leftDiv = document.createElement(\"div\");\r\n this._myVirtualGamepadContainer.appendChild(leftDiv);\r\n\r\n let rightDiv = document.createElement(\"div\");\r\n this._myVirtualGamepadContainer.appendChild(rightDiv);\r\n\r\n for (let virtualGamepadButtonID in this._myParams.myButtonsEnabled[Handedness.LEFT]) {\r\n if (this._myParams.myButtonsEnabled[Handedness.LEFT][virtualGamepadButtonID] != null) {\r\n let enabled = this._myParams.myButtonsEnabled[Handedness.LEFT][virtualGamepadButtonID];\r\n if (enabled) {\r\n this._buildButton(leftDiv, Handedness.LEFT, virtualGamepadButtonID);\r\n }\r\n }\r\n\r\n if (this._myParams.myButtonsEnabled[Handedness.RIGHT][virtualGamepadButtonID] != null) {\r\n let enabled = this._myParams.myButtonsEnabled[Handedness.RIGHT][virtualGamepadButtonID];\r\n if (enabled) {\r\n this._buildButton(rightDiv, Handedness.RIGHT, virtualGamepadButtonID);\r\n }\r\n }\r\n }\r\n\r\n for (let virtualGamepadAxesID in this._myParams.myThumbsticksEnabled[Handedness.LEFT]) {\r\n if (this._myParams.myThumbsticksEnabled[Handedness.LEFT][virtualGamepadAxesID] != null) {\r\n let enabled = this._myParams.myThumbsticksEnabled[Handedness.LEFT][virtualGamepadAxesID];\r\n if (enabled) {\r\n this._buildThumbstick(leftDiv, Handedness.LEFT, virtualGamepadAxesID);\r\n }\r\n }\r\n\r\n if (this._myParams.myThumbsticksEnabled[Handedness.RIGHT][virtualGamepadAxesID] != null) {\r\n let enabled = this._myParams.myThumbsticksEnabled[Handedness.RIGHT][virtualGamepadAxesID];\r\n if (enabled) {\r\n this._buildThumbstick(rightDiv, Handedness.RIGHT, virtualGamepadAxesID);\r\n }\r\n }\r\n }\r\n }\r\n\r\n _setupDocumentBody() {\r\n document.body.style.overflow = \"hidden\";\r\n document.body.style.userSelect = \"none\";\r\n document.body.style.webkitUserSelect = \"none\";\r\n document.body.style.webkitTapHighlightColor = \"transparent\";\r\n document.body.style.touchAction = \"none\";\r\n\r\n this._myGestureStartEventListener = function (e) {\r\n e.preventDefault();\r\n };\r\n document.addEventListener(\"gesturestart\", this._myGestureStartEventListener);\r\n }\r\n\r\n _buildButton(buttonElementParent, virtualButtonHandedness, virtualGamepadButtonID) {\r\n let virtualGamepadVirtualButton = new VirtualGamepadVirtualButton(buttonElementParent, this._myParams, virtualButtonHandedness, virtualGamepadButtonID);\r\n this._myVirtualGamepadVirtualButtons[virtualButtonHandedness][virtualGamepadButtonID] = virtualGamepadVirtualButton;\r\n }\r\n\r\n _buildThumbstick(thumbstickElementParent, virtualThumbstickHandedness, virtualGamepadAxesID) {\r\n let virtualGamepadVirtualThumbstick = new VirtualGamepadVirtualThumbstick(thumbstickElementParent, this._myParams, virtualThumbstickHandedness, virtualGamepadAxesID);\r\n this._myVirtualGamepadVirtualThumbsticks[virtualThumbstickHandedness][virtualGamepadAxesID] = virtualGamepadVirtualThumbstick;\r\n }\r\n\r\n _createSizeValue(value, minSizeMultiplier) {\r\n return \"min(\" + value.toFixed(3) + \"vmax,\" + (value * minSizeMultiplier).toFixed(3) + \"vw)\";\r\n }\r\n\r\n _isAnyElementPressed() {\r\n let anyElementPressed = false;\r\n\r\n for (let handedness in this._myVirtualGamepadVirtualButtons) {\r\n for (let virtualGamepadButtonID in this._myVirtualGamepadVirtualButtons[handedness]) {\r\n let button = this._myVirtualGamepadVirtualButtons[handedness][virtualGamepadButtonID];\r\n if (button != null && button.isPressed()) {\r\n anyElementPressed = true;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if (!anyElementPressed) {\r\n for (let handedness in this._myVirtualGamepadVirtualThumbsticks) {\r\n for (let virtualGamepadAxesID in this._myVirtualGamepadVirtualThumbsticks[handedness]) {\r\n let thumbstick = this._myVirtualGamepadVirtualThumbsticks[handedness][virtualGamepadAxesID];\r\n if (thumbstick != null && thumbstick.isPressed()) {\r\n anyElementPressed = true;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n return anyElementPressed;\r\n }\r\n\r\n _setMouseHoverEnabled(hoverActive) {\r\n for (let handedness in this._myVirtualGamepadVirtualButtons) {\r\n for (let virtualGamepadButtonID in this._myVirtualGamepadVirtualButtons[handedness]) {\r\n let button = this._myVirtualGamepadVirtualButtons[handedness][virtualGamepadButtonID];\r\n if (button != null) {\r\n button.setMouseHoverEnabled(hoverActive);\r\n }\r\n }\r\n }\r\n\r\n for (let handedness in this._myVirtualGamepadVirtualThumbsticks) {\r\n for (let virtualGamepadAxesID in this._myVirtualGamepadVirtualThumbsticks[handedness]) {\r\n let thumbstick = this._myVirtualGamepadVirtualThumbsticks[handedness][virtualGamepadAxesID];\r\n if (thumbstick != null) {\r\n thumbstick.setMouseHoverEnabled(hoverActive);\r\n }\r\n }\r\n }\r\n }\r\n\r\n destroy() {\r\n this._myDestroyed = true;\r\n\r\n this.setVisible(false);\r\n\r\n for (let handedness in this._myVirtualGamepadVirtualButtons) {\r\n for (let virtualGamepadButtonID in this._myVirtualGamepadVirtualButtons[handedness]) {\r\n let button = this._myVirtualGamepadVirtualButtons[handedness][virtualGamepadButtonID];\r\n if (button != null) {\r\n button.destroy();\r\n }\r\n }\r\n }\r\n\r\n for (let handedness in this._myVirtualGamepadVirtualThumbsticks) {\r\n for (let virtualGamepadAxesID in this._myVirtualGamepadVirtualThumbsticks[handedness]) {\r\n let thumbstick = this._myVirtualGamepadVirtualThumbsticks[handedness][virtualGamepadAxesID];\r\n if (thumbstick != null) {\r\n thumbstick.destroy();\r\n }\r\n }\r\n }\r\n }\r\n\r\n isDestroyed() {\r\n return this._myDestroyed;\r\n }\r\n}", "import { GamepadRawAxesData, GamepadRawButtonData } from \"../gamepad.js\";\r\nimport { GamepadAxesID, GamepadButtonID } from \"../gamepad_buttons.js\";\r\nimport { VirtualGamepadAxesID, VirtualGamepadButtonID } from \"../virtual_gamepad/virtual_gamepad.js\";\r\nimport { GamepadCore } from \"./gamepad_core.js\";\r\n\r\nexport class VirtualGamepadGamepadCore extends GamepadCore {\r\n\r\n constructor(virtualGamepad, handPose, gamepadToVirtualGamepadButtonIDMap = null, gamepadToVirtualGamepadAxesIDMap = null) {\r\n super(handPose);\r\n\r\n this.myGamepadToVirtualGamepadButtonIDMap = new Map();\r\n if (gamepadToVirtualGamepadButtonIDMap == null) {\r\n this.myGamepadToVirtualGamepadButtonIDMap.set(GamepadButtonID.SQUEEZE, [this.getHandedness(), VirtualGamepadButtonID.FIRST_BUTTON]);\r\n this.myGamepadToVirtualGamepadButtonIDMap.set(GamepadButtonID.SELECT, [this.getHandedness(), VirtualGamepadButtonID.SECOND_BUTTON]);\r\n this.myGamepadToVirtualGamepadButtonIDMap.set(GamepadButtonID.TOP_BUTTON, [this.getHandedness(), VirtualGamepadButtonID.THIRD_BUTTON]);\r\n this.myGamepadToVirtualGamepadButtonIDMap.set(GamepadButtonID.BOTTOM_BUTTON, [this.getHandedness(), VirtualGamepadButtonID.FOURTH_BUTTON]);\r\n this.myGamepadToVirtualGamepadButtonIDMap.set(GamepadButtonID.THUMBSTICK, [this.getHandedness(), VirtualGamepadButtonID.FIFTH_BUTTON]);\r\n } else {\r\n this.myGamepadToVirtualGamepadButtonIDMap = gamepadToVirtualGamepadButtonIDMap;\r\n }\r\n\r\n this.myGamepadToVirtualGamepadAxesIDMap = new Map();\r\n if (gamepadToVirtualGamepadAxesIDMap == null) {\r\n this.myGamepadToVirtualGamepadAxesIDMap.set(GamepadAxesID.THUMBSTICK, [this.getHandedness(), VirtualGamepadAxesID.FIRST_AXES]);\r\n } else {\r\n this.myGamepadToVirtualGamepadAxesIDMap = gamepadToVirtualGamepadAxesIDMap;\r\n }\r\n\r\n this._myVirtualGamepad = virtualGamepad;\r\n\r\n // Support Variables\r\n this._myButtonData = new GamepadRawButtonData();\r\n this._myAxesData = new GamepadRawAxesData();\r\n this._myHapticActuators = [];\r\n }\r\n\r\n isGamepadCoreActive() {\r\n return this.isActive() && this._myVirtualGamepad.isVisible();\r\n }\r\n\r\n getButtonData(buttonID) {\r\n this._myButtonData.reset();\r\n\r\n if (this.isGamepadCoreActive()) {\r\n const virtualGamepadButtonInfo = this.myGamepadToVirtualGamepadButtonIDMap.get(buttonID);\r\n if (virtualGamepadButtonInfo != null && this._myVirtualGamepad.isButtonPressed(virtualGamepadButtonInfo[0], virtualGamepadButtonInfo[1])) {\r\n this._myButtonData.myPressed = true;\r\n this._myButtonData.myTouched = true;\r\n this._myButtonData.myValue = 1;\r\n }\r\n }\r\n\r\n return this._myButtonData;\r\n }\r\n\r\n getAxesData(axesID) {\r\n this._myAxesData.reset();\r\n\r\n if (this.isGamepadCoreActive()) {\r\n const virtualGamepadAxesInfo = this.myGamepadToVirtualGamepadAxesIDMap.get(axesID);\r\n if (virtualGamepadAxesInfo != null) {\r\n this._myVirtualGamepad.getAxes(virtualGamepadAxesInfo[0], virtualGamepadAxesInfo[1], this._myAxesData.myAxes);\r\n }\r\n }\r\n\r\n return this._myAxesData;\r\n }\r\n\r\n getHapticActuators() {\r\n return this._myHapticActuators;\r\n }\r\n}", "import { Component, Property } from \"@wonderlandengine/api\";\r\nimport { InputUtils } from \"../../../input/cauldron/input_utils.js\";\r\nimport { Globals } from \"../../../pp/globals.js\";\r\nimport { Handedness } from \"../../cauldron/input_types.js\";\r\nimport { GamepadAxesID, GamepadButtonID } from \"../gamepad_buttons.js\";\r\nimport { VirtualGamepadGamepadCore } from \"../gamepad_cores/virtual_gamepad_gamepad_core.js\";\r\nimport { VirtualGamepad, VirtualGamepadAxesID, VirtualGamepadButtonID } from \"./virtual_gamepad.js\";\r\nimport { VirtualGamepadParams } from \"./virtual_gamepad_params.js\";\r\n\r\nexport class VirtualGamepadComponent extends Component {\r\n static TypeName = \"pp-virtual-gamepad\";\r\n static Properties = {\r\n _myShowOnDesktop: Property.bool(false), // You may have to enable headset too\r\n _myShowOnMobile: Property.bool(true),\r\n _myShowOnHeadset: Property.bool(false), // Not 100% reliable, this is true if the device supports XR and it is Desktop\r\n _myAddToUniversalGamepad: Property.bool(true),\r\n _myOpacity: Property.float(0.5),\r\n _myIconColor: Property.string(\"#e0e0e0\"),\r\n _myBackgroundColor: Property.string(\"#616161\"),\r\n _myInterfaceScale: Property.float(1),\r\n _myMarginScale: Property.float(1),\r\n\r\n ADVANCED_PARAMS_BELOW: Property.string(\"\"),\r\n\r\n _myLabelFontSize: Property.float(2),\r\n _myLabelFontFamily: Property.string(\"sans-serif\"),\r\n _myLabelFontWeight: Property.string(\"bold\"),\r\n _myImagePressedBrightness: Property.float(0.5),\r\n\r\n _myLeftFirstButtonEnabled: Property.bool(true),\r\n _myLeftFirstButtonGamepadButtonID: Property.enum([\"Select\", \"Squeeze\", \"Thumbstick\", \"Top Button\", \"Bottom Button\", \"Left Button\", \"Right Button\", \"Menu\", \"Touchpad\", \"Thumb Rest\"], \"Squeeze\"),\r\n _myLeftFirstButtonGamepadHandedness: Property.enum([\"Left\", \"Right\"], \"Left\"),\r\n _myLeftFirstButtonIconType: Property.enum([\"None\", \"Label\", \"Image\", \"Dot\", \"Circle\", \"Square\", \"Ring\", \"Frame\"], \"Square\"),\r\n _myLeftFirstButtonIconLabelOrImageUrl: Property.string(\"\"),\r\n\r\n _myLeftSecondButtonEnabled: Property.bool(true),\r\n _myLeftSecondButtonGamepadButtonID: Property.enum([\"Select\", \"Squeeze\", \"Thumbstick\", \"Top Button\", \"Bottom Button\", \"Left Button\", \"Right Button\", \"Menu\", \"Touchpad\", \"Thumb Rest\"], \"Select\"),\r\n _myLeftSecondButtonGamepadHandedness: Property.enum([\"Left\", \"Right\"], \"Left\"),\r\n _myLeftSecondButtonIconType: Property.enum([\"None\", \"Label\", \"Image\", \"Dot\", \"Circle\", \"Square\", \"Ring\", \"Frame\"], \"Frame\"),\r\n _myLeftSecondButtonIconLabelOrImageUrl: Property.string(\"\"),\r\n\r\n _myLeftThirdButtonEnabled: Property.bool(true),\r\n _myLeftThirdButtonGamepadButtonID: Property.enum([\"Select\", \"Squeeze\", \"Thumbstick\", \"Top Button\", \"Bottom Button\", \"Left Button\", \"Right Button\", \"Menu\", \"Touchpad\", \"Thumb Rest\"], \"Top Button\"),\r\n _myLeftThirdButtonGamepadHandedness: Property.enum([\"Left\", \"Right\"], \"Left\"),\r\n _myLeftThirdButtonIconType: Property.enum([\"None\", \"Label\", \"Image\", \"Dot\", \"Circle\", \"Square\", \"Ring\", \"Frame\"], \"Circle\"),\r\n _myLeftThirdButtonIconLabelOrImageUrl: Property.string(\"\"),\r\n\r\n _myLeftFourthButtonEnabled: Property.bool(true),\r\n _myLeftFourthButtonGamepadButtonID: Property.enum([\"Select\", \"Squeeze\", \"Thumbstick\", \"Top Button\", \"Bottom Button\", \"Left Button\", \"Right Button\", \"Menu\", \"Touchpad\", \"Thumb Rest\"], \"Bottom Button\"),\r\n _myLeftFourthButtonGamepadHandedness: Property.enum([\"Left\", \"Right\"], \"Left\"),\r\n _myLeftFourthButtonIconType: Property.enum([\"None\", \"Label\", \"Image\", \"Dot\", \"Circle\", \"Square\", \"Ring\", \"Frame\"], \"Ring\"),\r\n _myLeftFourthButtonIconLabelOrImageUrl: Property.string(\"\"),\r\n\r\n _myLeftFifthButtonEnabled: Property.bool(true),\r\n _myLeftFifthButtonGamepadButtonID: Property.enum([\"Select\", \"Squeeze\", \"Thumbstick\", \"Top Button\", \"Bottom Button\", \"Left Button\", \"Right Button\", \"Menu\", \"Touchpad\", \"Thumb Rest\"], \"Thumbstick\"),\r\n _myLeftFifthButtonGamepadHandedness: Property.enum([\"Left\", \"Right\"], \"Left\"),\r\n _myLeftFifthButtonIconType: Property.enum([\"None\", \"Label\", \"Image\", \"Dot\", \"Circle\", \"Square\", \"Ring\", \"Frame\"], \"Dot\"),\r\n _myLeftFifthButtonIconLabelOrImageUrl: Property.string(\"\"),\r\n\r\n _myLeftThumbstickEnabled: Property.bool(true),\r\n _myLeftThumbstickGamepadHandedness: Property.enum([\"Left\", \"Right\"], \"Left\"),\r\n\r\n _myRightFirstButtonEnabled: Property.bool(true),\r\n _myRightFirstButtonGamepadButtonID: Property.enum([\"Select\", \"Squeeze\", \"Thumbstick\", \"Top Button\", \"Bottom Button\", \"Left Button\", \"Right Button\", \"Menu\", \"Touchpad\", \"Thumb Rest\"], \"Squeeze\"),\r\n _myRightFirstButtonGamepadHandedness: Property.enum([\"Left\", \"Right\"], \"Right\"),\r\n _myRightFirstButtonIconType: Property.enum([\"None\", \"Label\", \"Image\", \"Dot\", \"Circle\", \"Square\", \"Ring\", \"Frame\"], \"Square\"),\r\n _myRightFirstButtonIconLabelOrImageUrl: Property.string(\"\"),\r\n\r\n _myRightSecondButtonEnabled: Property.bool(true),\r\n _myRightSecondButtonGamepadButtonID: Property.enum([\"Select\", \"Squeeze\", \"Thumbstick\", \"Top Button\", \"Bottom Button\", \"Left Button\", \"Right Button\", \"Menu\", \"Touchpad\", \"Thumb Rest\"], \"Select\"),\r\n _myRightSecondButtonGamepadHandedness: Property.enum([\"Left\", \"Right\"], \"Right\"),\r\n _myRightSecondButtonIconType: Property.enum([\"None\", \"Label\", \"Image\", \"Dot\", \"Circle\", \"Square\", \"Ring\", \"Frame\"], \"Frame\"),\r\n _myRightSecondButtonIconLabelOrImageUrl: Property.string(\"\"),\r\n\r\n _myRightThirdButtonEnabled: Property.bool(true),\r\n _myRightThirdButtonGamepadButtonID: Property.enum([\"Select\", \"Squeeze\", \"Thumbstick\", \"Top Button\", \"Bottom Button\", \"Left Button\", \"Right Button\", \"Menu\", \"Touchpad\", \"Thumb Rest\"], \"Top Button\"),\r\n _myRightThirdButtonGamepadHandedness: Property.enum([\"Left\", \"Right\"], \"Right\"),\r\n _myRightThirdButtonIconType: Property.enum([\"None\", \"Label\", \"Image\", \"Dot\", \"Circle\", \"Square\", \"Ring\", \"Frame\"], \"Circle\"),\r\n _myRightThirdButtonIconLabelOrImageUrl: Property.string(\"\"),\r\n\r\n _myRightFourthButtonEnabled: Property.bool(true),\r\n _myRightFourthButtonGamepadButtonID: Property.enum([\"Select\", \"Squeeze\", \"Thumbstick\", \"Top Button\", \"Bottom Button\", \"Left Button\", \"Right Button\", \"Menu\", \"Touchpad\", \"Thumb Rest\"], \"Bottom Button\"),\r\n _myRightFourthButtonGamepadHandedness: Property.enum([\"Left\", \"Right\"], \"Right\"),\r\n _myRightFourthButtonIconType: Property.enum([\"None\", \"Label\", \"Image\", \"Dot\", \"Circle\", \"Square\", \"Ring\", \"Frame\"], \"Ring\"),\r\n _myRightFourthButtonIconLabelOrImageUrl: Property.string(\"\"),\r\n\r\n _myRightFifthButtonEnabled: Property.bool(true),\r\n _myRightFifthButtonGamepadButtonID: Property.enum([\"Select\", \"Squeeze\", \"Thumbstick\", \"Top Button\", \"Bottom Button\", \"Left Button\", \"Right Button\", \"Menu\", \"Touchpad\", \"Thumb Rest\"], \"Thumbstick\"),\r\n _myRightFifthButtonGamepadHandedness: Property.enum([\"Left\", \"Right\"], \"Right\"),\r\n _myRightFifthButtonIconType: Property.enum([\"None\", \"Label\", \"Image\", \"Dot\", \"Circle\", \"Square\", \"Ring\", \"Frame\"], \"Dot\"),\r\n _myRightFifthButtonIconLabelOrImageUrl: Property.string(\"\"),\r\n\r\n _myRightThumbstickEnabled: Property.bool(true),\r\n _myRightThumbstickGamepadHandedness: Property.enum([\"Left\", \"Right\"], \"Right\")\r\n };\r\n\r\n start() {\r\n let params = new VirtualGamepadParams(this.engine);\r\n params.defaultConfig();\r\n\r\n for (let handedness in params.myButtonParams) {\r\n for (let gamepadButtonID in params.myButtonParams[handedness]) {\r\n let buttonParams = params.myButtonParams[handedness][gamepadButtonID];\r\n buttonParams.myIconParams.myBackgroundColor = this._myBackgroundColor;\r\n buttonParams.myIconParams.myBackgroundPressedColor = this._myIconColor;\r\n buttonParams.myIconParams.myIconColor = this._myIconColor;\r\n buttonParams.myIconParams.myIconPressedColor = this._myBackgroundColor;\r\n }\r\n }\r\n\r\n for (let handedness in params.myThumbstickParams) {\r\n for (let gamepadAxesID in params.myThumbstickParams[handedness]) {\r\n let thumbstickParams = params.myThumbstickParams[handedness][gamepadAxesID];\r\n thumbstickParams.myBackgroundColor = this._myBackgroundColor;\r\n thumbstickParams.myIconParams.myBackgroundColor = this._myIconColor;\r\n thumbstickParams.myIconParams.myBackgroundPressedColor = this._myIconColor;\r\n thumbstickParams.myIconParams.myIconColor = this._myBackgroundColor;\r\n thumbstickParams.myIconParams.myIconPressedColor = this._myBackgroundColor;\r\n }\r\n }\r\n\r\n params.myOpacity = this._myOpacity;\r\n\r\n params.myInterfaceScale = this._myInterfaceScale;\r\n params.myMarginScale = this._myMarginScale;\r\n\r\n params.myShowOnDesktop = this._myShowOnDesktop;\r\n params.myShowOnMobile = this._myShowOnMobile;\r\n params.myShowOnHeadset = this._myShowOnHeadset;\r\n\r\n if (params.myShowOnDesktop || params.myShowOnMobile || params.myShowOnHeadset) {\r\n params.myAutoUpdateVisibility = true;\r\n } else {\r\n params.myAutoUpdateVisibility = false;\r\n }\r\n\r\n this._advancedConfig(params);\r\n\r\n this._myVirtualGamepad = new VirtualGamepad(params);\r\n this._myVirtualGamepad.setVisible(false);\r\n\r\n this._myVirtualGamepad.start();\r\n\r\n this._myFirstUpdate = true;\r\n\r\n this._myLeftVirtualGamepadGamepadCore = null;\r\n this._myRightVirtualGamepadGamepadCore = null;\r\n\r\n this._myActivateOnNextUpdate = false;\r\n }\r\n\r\n update(dt) {\r\n if (this._myActivateOnNextUpdate) {\r\n this._onActivate();\r\n\r\n this._myActivateOnNextUpdate = false;\r\n }\r\n\r\n if (this._myFirstUpdate) {\r\n this._myFirstUpdate = false;\r\n\r\n if (this._myAddToUniversalGamepad) {\r\n this._addToUniversalGamepad();\r\n }\r\n }\r\n\r\n this._myVirtualGamepad.update(dt);\r\n }\r\n\r\n _advancedConfig(params) {\r\n {\r\n let buttonParams = params.myButtonParams[Handedness.LEFT][VirtualGamepadButtonID.SECOND_BUTTON];\r\n buttonParams.myIconParams.myIconType = this._myLeftSecondButtonIconType;\r\n buttonParams.myIconParams.myLabel = this._myLeftSecondButtonIconLabelOrImageUrl;\r\n buttonParams.myIconParams.myImageURL = this._myLeftSecondButtonIconLabelOrImageUrl;\r\n buttonParams.myIconParams.myLabelFontSize = this._myLabelFontSize;\r\n buttonParams.myIconParams.myLabelFontFamily = this._myLabelFontFamily;\r\n buttonParams.myIconParams.myLabelFontWeight = this._myLabelFontWeight;\r\n buttonParams.myIconParams.myImagePressedBrightness = this._myImagePressedBrightness;\r\n\r\n params.myButtonsEnabled[Handedness.LEFT][VirtualGamepadButtonID.SECOND_BUTTON] = this._myLeftSecondButtonEnabled;\r\n }\r\n\r\n {\r\n let buttonParams = params.myButtonParams[Handedness.LEFT][VirtualGamepadButtonID.FIRST_BUTTON];\r\n buttonParams.myIconParams.myIconType = this._myLeftFirstButtonIconType;\r\n buttonParams.myIconParams.myLabel = this._myLeftFirstButtonIconLabelOrImageUrl;\r\n buttonParams.myIconParams.myImageURL = this._myLeftFirstButtonIconLabelOrImageUrl;\r\n buttonParams.myIconParams.myLabelFontSize = this._myLabelFontSize;\r\n buttonParams.myIconParams.myLabelFontFamily = this._myLabelFontFamily;\r\n buttonParams.myIconParams.myLabelFontWeight = this._myLabelFontWeight;\r\n buttonParams.myIconParams.myImagePressedBrightness = this._myImagePressedBrightness;\r\n\r\n params.myButtonsEnabled[Handedness.LEFT][VirtualGamepadButtonID.FIRST_BUTTON] = this._myLeftFirstButtonEnabled;\r\n }\r\n\r\n {\r\n let buttonParams = params.myButtonParams[Handedness.LEFT][VirtualGamepadButtonID.FIFTH_BUTTON];\r\n buttonParams.myIconParams.myIconType = this._myLeftFifthButtonIconType;\r\n buttonParams.myIconParams.myLabel = this._myLeftFifthButtonIconLabelOrImageUrl;\r\n buttonParams.myIconParams.myImageURL = this._myLeftFifthButtonIconLabelOrImageUrl;\r\n buttonParams.myIconParams.myLabelFontSize = this._myLabelFontSize;\r\n buttonParams.myIconParams.myLabelFontFamily = this._myLabelFontFamily;\r\n buttonParams.myIconParams.myLabelFontWeight = this._myLabelFontWeight;\r\n buttonParams.myIconParams.myImagePressedBrightness = this._myImagePressedBrightness;\r\n\r\n params.myButtonsEnabled[Handedness.LEFT][VirtualGamepadButtonID.FIFTH_BUTTON] = this._myLeftFifthButtonEnabled;\r\n }\r\n\r\n {\r\n let buttonParams = params.myButtonParams[Handedness.LEFT][VirtualGamepadButtonID.THIRD_BUTTON];\r\n buttonParams.myIconParams.myIconType = this._myLeftThirdButtonIconType;\r\n buttonParams.myIconParams.myLabel = this._myLeftThirdButtonIconLabelOrImageUrl;\r\n buttonParams.myIconParams.myImageURL = this._myLeftThirdButtonIconLabelOrImageUrl;\r\n buttonParams.myIconParams.myLabelFontSize = this._myLabelFontSize;\r\n buttonParams.myIconParams.myLabelFontFamily = this._myLabelFontFamily;\r\n buttonParams.myIconParams.myLabelFontWeight = this._myLabelFontWeight;\r\n buttonParams.myIconParams.myImagePressedBrightness = this._myImagePressedBrightness;\r\n\r\n params.myButtonsEnabled[Handedness.LEFT][VirtualGamepadButtonID.THIRD_BUTTON] = this._myLeftThirdButtonEnabled;\r\n }\r\n\r\n {\r\n let buttonParams = params.myButtonParams[Handedness.LEFT][VirtualGamepadButtonID.FOURTH_BUTTON];\r\n buttonParams.myIconParams.myIconType = this._myLeftFourthButtonIconType;\r\n buttonParams.myIconParams.myLabel = this._myLeftFourthButtonIconLabelOrImageUrl;\r\n buttonParams.myIconParams.myImageURL = this._myLeftFourthButtonIconLabelOrImageUrl;\r\n buttonParams.myIconParams.myLabelFontSize = this._myLabelFontSize;\r\n buttonParams.myIconParams.myLabelFontFamily = this._myLabelFontFamily;\r\n buttonParams.myIconParams.myLabelFontWeight = this._myLabelFontWeight;\r\n buttonParams.myIconParams.myImagePressedBrightness = this._myImagePressedBrightness;\r\n\r\n params.myButtonsEnabled[Handedness.LEFT][VirtualGamepadButtonID.FOURTH_BUTTON] = this._myLeftFourthButtonEnabled;\r\n }\r\n\r\n {\r\n let buttonParams = params.myButtonParams[Handedness.RIGHT][VirtualGamepadButtonID.SECOND_BUTTON];\r\n buttonParams.myIconParams.myIconType = this._myRightSecondButtonIconType;\r\n buttonParams.myIconParams.myLabel = this._myRightSecondButtonIconLabelOrImageUrl;\r\n buttonParams.myIconParams.myImageURL = this._myRightSecondButtonIconLabelOrImageUrl;\r\n buttonParams.myIconParams.myLabelFontSize = this._myLabelFontSize;\r\n buttonParams.myIconParams.myLabelFontFamily = this._myLabelFontFamily;\r\n buttonParams.myIconParams.myLabelFontWeight = this._myLabelFontWeight;\r\n buttonParams.myIconParams.myImagePressedBrightness = this._myImagePressedBrightness;\r\n\r\n params.myButtonsEnabled[Handedness.RIGHT][VirtualGamepadButtonID.SECOND_BUTTON] = this._myRightSecondButtonEnabled;\r\n }\r\n\r\n {\r\n let buttonParams = params.myButtonParams[Handedness.RIGHT][VirtualGamepadButtonID.FIRST_BUTTON];\r\n buttonParams.myIconParams.myIconType = this._myRightFirstButtonIconType;\r\n buttonParams.myIconParams.myLabel = this._myRightFirstButtonIconLabelOrImageUrl;\r\n buttonParams.myIconParams.myImageURL = this._myRightFirstButtonIconLabelOrImageUrl;\r\n buttonParams.myIconParams.myLabelFontSize = this._myLabelFontSize;\r\n buttonParams.myIconParams.myLabelFontFamily = this._myLabelFontFamily;\r\n buttonParams.myIconParams.myLabelFontWeight = this._myLabelFontWeight;\r\n buttonParams.myIconParams.myImagePressedBrightness = this._myImagePressedBrightness;\r\n\r\n params.myButtonsEnabled[Handedness.RIGHT][VirtualGamepadButtonID.FIRST_BUTTON] = this._myRightFirstButtonEnabled;\r\n }\r\n\r\n {\r\n let buttonParams = params.myButtonParams[Handedness.RIGHT][VirtualGamepadButtonID.FIFTH_BUTTON];\r\n buttonParams.myIconParams.myIconType = this._myRightFifthButtonIconType;\r\n buttonParams.myIconParams.myLabel = this._myRightFifthButtonIconLabelOrImageUrl;\r\n buttonParams.myIconParams.myImageURL = this._myRightFifthButtonIconLabelOrImageUrl;\r\n buttonParams.myIconParams.myLabelFontSize = this._myLabelFontSize;\r\n buttonParams.myIconParams.myLabelFontFamily = this._myLabelFontFamily;\r\n buttonParams.myIconParams.myLabelFontWeight = this._myLabelFontWeight;\r\n buttonParams.myIconParams.myImagePressedBrightness = this._myImagePressedBrightness;\r\n\r\n params.myButtonsEnabled[Handedness.RIGHT][VirtualGamepadButtonID.FIFTH_BUTTON] = this._myRightFifthButtonEnabled;\r\n }\r\n\r\n {\r\n let buttonParams = params.myButtonParams[Handedness.RIGHT][VirtualGamepadButtonID.THIRD_BUTTON];\r\n buttonParams.myIconParams.myIconType = this._myRightThirdButtonIconType;\r\n buttonParams.myIconParams.myLabel = this._myRightThirdButtonIconLabelOrImageUrl;\r\n buttonParams.myIconParams.myImageURL = this._myRightThirdButtonIconLabelOrImageUrl;\r\n buttonParams.myIconParams.myLabelFontSize = this._myLabelFontSize;\r\n buttonParams.myIconParams.myLabelFontFamily = this._myLabelFontFamily;\r\n buttonParams.myIconParams.myLabelFontWeight = this._myLabelFontWeight;\r\n buttonParams.myIconParams.myImagePressedBrightness = this._myImagePressedBrightness;\r\n\r\n params.myButtonsEnabled[Handedness.RIGHT][VirtualGamepadButtonID.THIRD_BUTTON] = this._myRightThirdButtonEnabled;\r\n }\r\n\r\n {\r\n let buttonParams = params.myButtonParams[Handedness.RIGHT][VirtualGamepadButtonID.FOURTH_BUTTON];\r\n buttonParams.myIconParams.myIconType = this._myRightFourthButtonIconType;\r\n buttonParams.myIconParams.myLabel = this._myRightFourthButtonIconLabelOrImageUrl;\r\n buttonParams.myIconParams.myImageURL = this._myRightFourthButtonIconLabelOrImageUrl;\r\n buttonParams.myIconParams.myLabelFontSize = this._myLabelFontSize;\r\n buttonParams.myIconParams.myLabelFontFamily = this._myLabelFontFamily;\r\n buttonParams.myIconParams.myLabelFontWeight = this._myLabelFontWeight;\r\n buttonParams.myIconParams.myImagePressedBrightness = this._myImagePressedBrightness;\r\n\r\n params.myButtonsEnabled[Handedness.RIGHT][VirtualGamepadButtonID.FOURTH_BUTTON] = this._myRightFourthButtonEnabled;\r\n }\r\n\r\n params.myThumbsticksEnabled[Handedness.LEFT][VirtualGamepadAxesID.FIRST_AXES] = this._myLeftThumbstickEnabled;\r\n params.myThumbsticksEnabled[Handedness.RIGHT][VirtualGamepadAxesID.FIRST_AXES] = this._myRightThumbstickEnabled;\r\n }\r\n\r\n _addToUniversalGamepad() {\r\n const leftGamepadToVirtualGamepadButtonIDMap = new Map();\r\n const rightGamepadToVirtualGamepadButtonIDMap = new Map();\r\n\r\n if (this._myLeftFirstButtonEnabled) {\r\n if (InputUtils.getHandednessByIndex(this._myLeftFirstButtonGamepadHandedness) == Handedness.LEFT) {\r\n leftGamepadToVirtualGamepadButtonIDMap.set(this._gamepadPropertyButtonIDToEnum(this._myLeftFirstButtonGamepadButtonID), [Handedness.LEFT, VirtualGamepadButtonID.FIRST_BUTTON]);\r\n } else {\r\n rightGamepadToVirtualGamepadButtonIDMap.set(this._gamepadPropertyButtonIDToEnum(this._myLeftFirstButtonGamepadButtonID), [Handedness.LEFT, VirtualGamepadButtonID.FIRST_BUTTON]);\r\n }\r\n }\r\n\r\n if (this._myLeftSecondButtonEnabled) {\r\n if (InputUtils.getHandednessByIndex(this._myLeftSecondButtonGamepadHandedness) == Handedness.LEFT) {\r\n leftGamepadToVirtualGamepadButtonIDMap.set(this._gamepadPropertyButtonIDToEnum(this._myLeftSecondButtonGamepadButtonID), [Handedness.LEFT, VirtualGamepadButtonID.SECOND_BUTTON]);\r\n } else {\r\n rightGamepadToVirtualGamepadButtonIDMap.set(this._gamepadPropertyButtonIDToEnum(this._myLeftSecondButtonGamepadButtonID), [Handedness.LEFT, VirtualGamepadButtonID.SECOND_BUTTON]);\r\n }\r\n }\r\n\r\n if (this._myLeftThirdButtonEnabled) {\r\n if (InputUtils.getHandednessByIndex(this._myLeftThirdButtonGamepadHandedness) == Handedness.LEFT) {\r\n leftGamepadToVirtualGamepadButtonIDMap.set(this._gamepadPropertyButtonIDToEnum(this._myLeftThirdButtonGamepadButtonID), [Handedness.LEFT, VirtualGamepadButtonID.THIRD_BUTTON]);\r\n } else {\r\n rightGamepadToVirtualGamepadButtonIDMap.set(this._gamepadPropertyButtonIDToEnum(this._myLeftThirdButtonGamepadButtonID), [Handedness.LEFT, VirtualGamepadButtonID.THIRD_BUTTON]);\r\n }\r\n }\r\n\r\n if (this._myLeftFourthButtonEnabled) {\r\n if (InputUtils.getHandednessByIndex(this._myLeftFourthButtonGamepadHandedness) == Handedness.LEFT) {\r\n leftGamepadToVirtualGamepadButtonIDMap.set(this._gamepadPropertyButtonIDToEnum(this._myLeftFourthButtonGamepadButtonID), [Handedness.LEFT, VirtualGamepadButtonID.FOURTH_BUTTON]);\r\n } else {\r\n rightGamepadToVirtualGamepadButtonIDMap.set(this._gamepadPropertyButtonIDToEnum(this._myLeftFourthButtonGamepadButtonID), [Handedness.LEFT, VirtualGamepadButtonID.FOURTH_BUTTON]);\r\n }\r\n }\r\n\r\n if (this._myLeftFifthButtonEnabled) {\r\n if (InputUtils.getHandednessByIndex(this._myLeftFifthButtonGamepadHandedness) == Handedness.LEFT) {\r\n leftGamepadToVirtualGamepadButtonIDMap.set(this._gamepadPropertyButtonIDToEnum(this._myLeftFifthButtonGamepadButtonID), [Handedness.LEFT, VirtualGamepadButtonID.FIFTH_BUTTON]);\r\n } else {\r\n rightGamepadToVirtualGamepadButtonIDMap.set(this._gamepadPropertyButtonIDToEnum(this._myLeftFifthButtonGamepadButtonID), [Handedness.LEFT, VirtualGamepadButtonID.FIFTH_BUTTON]);\r\n }\r\n }\r\n\r\n if (this._myRightFirstButtonEnabled) {\r\n if (InputUtils.getHandednessByIndex(this._myRightFirstButtonGamepadHandedness) == Handedness.LEFT) {\r\n leftGamepadToVirtualGamepadButtonIDMap.set(this._gamepadPropertyButtonIDToEnum(this._myRightFirstButtonGamepadButtonID), [Handedness.RIGHT, VirtualGamepadButtonID.FIRST_BUTTON]);\r\n } else {\r\n rightGamepadToVirtualGamepadButtonIDMap.set(this._gamepadPropertyButtonIDToEnum(this._myRightFirstButtonGamepadButtonID), [Handedness.RIGHT, VirtualGamepadButtonID.FIRST_BUTTON]);\r\n }\r\n }\r\n\r\n if (this._myRightSecondButtonEnabled) {\r\n if (InputUtils.getHandednessByIndex(this._myRightSecondButtonGamepadHandedness) == Handedness.LEFT) {\r\n leftGamepadToVirtualGamepadButtonIDMap.set(this._gamepadPropertyButtonIDToEnum(this._myRightSecondButtonGamepadButtonID), [Handedness.RIGHT, VirtualGamepadButtonID.SECOND_BUTTON]);\r\n } else {\r\n rightGamepadToVirtualGamepadButtonIDMap.set(this._gamepadPropertyButtonIDToEnum(this._myRightSecondButtonGamepadButtonID), [Handedness.RIGHT, VirtualGamepadButtonID.SECOND_BUTTON]);\r\n }\r\n }\r\n\r\n if (this._myRightThirdButtonEnabled) {\r\n if (InputUtils.getHandednessByIndex(this._myRightThirdButtonGamepadHandedness) == Handedness.LEFT) {\r\n leftGamepadToVirtualGamepadButtonIDMap.set(this._gamepadPropertyButtonIDToEnum(this._myRightThirdButtonGamepadButtonID), [Handedness.RIGHT, VirtualGamepadButtonID.THIRD_BUTTON]);\r\n } else {\r\n rightGamepadToVirtualGamepadButtonIDMap.set(this._gamepadPropertyButtonIDToEnum(this._myRightThirdButtonGamepadButtonID), [Handedness.RIGHT, VirtualGamepadButtonID.THIRD_BUTTON]);\r\n }\r\n }\r\n\r\n if (this._myRightFourthButtonEnabled) {\r\n if (InputUtils.getHandednessByIndex(this._myRightFourthButtonGamepadHandedness) == Handedness.LEFT) {\r\n leftGamepadToVirtualGamepadButtonIDMap.set(this._gamepadPropertyButtonIDToEnum(this._myRightFourthButtonGamepadButtonID), [Handedness.RIGHT, VirtualGamepadButtonID.FOURTH_BUTTON]);\r\n } else {\r\n rightGamepadToVirtualGamepadButtonIDMap.set(this._gamepadPropertyButtonIDToEnum(this._myRightFourthButtonGamepadButtonID), [Handedness.RIGHT, VirtualGamepadButtonID.FOURTH_BUTTON]);\r\n }\r\n }\r\n\r\n if (this._myRightFifthButtonEnabled) {\r\n if (InputUtils.getHandednessByIndex(this._myRightFifthButtonGamepadHandedness) == Handedness.LEFT) {\r\n leftGamepadToVirtualGamepadButtonIDMap.set(this._gamepadPropertyButtonIDToEnum(this._myRightFifthButtonGamepadButtonID), [Handedness.RIGHT, VirtualGamepadButtonID.FIFTH_BUTTON]);\r\n } else {\r\n rightGamepadToVirtualGamepadButtonIDMap.set(this._gamepadPropertyButtonIDToEnum(this._myRightFifthButtonGamepadButtonID), [Handedness.RIGHT, VirtualGamepadButtonID.FIFTH_BUTTON]);\r\n }\r\n }\r\n\r\n const leftGamepadToVirtualGamepadAxesIDMap = new Map();\r\n const rightGamepadToVirtualGamepadAxesIDMap = new Map();\r\n\r\n if (this._myLeftThumbstickEnabled) {\r\n if (InputUtils.getHandednessByIndex(this._myLeftThumbstickGamepadHandedness) == Handedness.LEFT) {\r\n leftGamepadToVirtualGamepadAxesIDMap.set(GamepadAxesID.THUMBSTICK, [Handedness.LEFT, VirtualGamepadAxesID.FIRST_AXES]);\r\n } else {\r\n rightGamepadToVirtualGamepadAxesIDMap.set(GamepadAxesID.THUMBSTICK, [Handedness.LEFT, VirtualGamepadAxesID.FIRST_AXES]);\r\n }\r\n }\r\n\r\n if (this._myRightThumbstickEnabled) {\r\n if (InputUtils.getHandednessByIndex(this._myRightThumbstickGamepadHandedness) == Handedness.LEFT) {\r\n leftGamepadToVirtualGamepadAxesIDMap.set(GamepadAxesID.THUMBSTICK, [Handedness.RIGHT, VirtualGamepadAxesID.FIRST_AXES]);\r\n } else {\r\n rightGamepadToVirtualGamepadAxesIDMap.set(GamepadAxesID.THUMBSTICK, [Handedness.RIGHT, VirtualGamepadAxesID.FIRST_AXES]);\r\n }\r\n }\r\n\r\n const leftHandPose = Globals.getLeftGamepad(this.engine).getGamepadCore(\"pp_left_xr_gamepad\").getHandPose();\r\n const rightHandPose = Globals.getRightGamepad(this.engine).getGamepadCore(\"pp_right_xr_gamepad\").getHandPose();\r\n this._myLeftVirtualGamepadGamepadCore = new VirtualGamepadGamepadCore(this._myVirtualGamepad, leftHandPose, leftGamepadToVirtualGamepadButtonIDMap, leftGamepadToVirtualGamepadAxesIDMap);\r\n this._myRightVirtualGamepadGamepadCore = new VirtualGamepadGamepadCore(this._myVirtualGamepad, rightHandPose, rightGamepadToVirtualGamepadButtonIDMap, rightGamepadToVirtualGamepadAxesIDMap);\r\n\r\n Globals.getLeftGamepad(this.engine).addGamepadCore(\"pp_left_virtual_gamepad\", this._myLeftVirtualGamepadGamepadCore);\r\n Globals.getRightGamepad(this.engine).addGamepadCore(\"pp_right_virtual_gamepad\", this._myRightVirtualGamepadGamepadCore);\r\n\r\n }\r\n\r\n _gamepadPropertyButtonIDToEnum(propertyButtonID) {\r\n let buttonID = null;\r\n\r\n switch (propertyButtonID) {\r\n case 0:\r\n buttonID = GamepadButtonID.SELECT;\r\n break;\r\n case 1:\r\n buttonID = GamepadButtonID.SQUEEZE;\r\n break;\r\n case 2:\r\n buttonID = GamepadButtonID.THUMBSTICK;\r\n break;\r\n case 3:\r\n buttonID = GamepadButtonID.TOP_BUTTON;\r\n break;\r\n case 4:\r\n buttonID = GamepadButtonID.BOTTOM_BUTTON;\r\n break;\r\n case 5:\r\n buttonID = GamepadButtonID.LEFT_BUTTON;\r\n break;\r\n case 6:\r\n buttonID = GamepadButtonID.RIGHT_BUTTON;\r\n break;\r\n case 7:\r\n buttonID = GamepadButtonID.MENU;\r\n break;\r\n case 8:\r\n buttonID = GamepadButtonID.TOUCHPAD;\r\n break;\r\n case 9:\r\n buttonID = GamepadButtonID.THUMB_REST;\r\n break;\r\n }\r\n\r\n return buttonID;\r\n }\r\n\r\n onActivate() {\r\n this._myActivateOnNextUpdate = true;\r\n }\r\n\r\n _onActivate() {\r\n if (!this._myFirstUpdate && this._myAddToUniversalGamepad) {\r\n Globals.getLeftGamepad(this.engine).addGamepadCore(\"pp_left_virtual_gamepad\", this._myLeftVirtualGamepadGamepadCore);\r\n Globals.getRightGamepad(this.engine).addGamepadCore(\"pp_right_virtual_gamepad\", this._myRightVirtualGamepadGamepadCore);\r\n }\r\n }\r\n\r\n onDeactivate() {\r\n this._myVirtualGamepad?.setVisible(false);\r\n\r\n if (!this._myFirstUpdate && this._myAddToUniversalGamepad) {\r\n // Sadly here, if it can't manage to remove them due to global gamepads being null,\r\n // then if the gamepad is activated again it will still have and use the virtual gamepad cores\r\n // Usually not an issue since this is happens only when the whole scene is deactivated\r\n Globals.getLeftGamepad(this.engine)?.removeGamepadCore(\"pp_left_virtual_gamepad\");\r\n Globals.getRightGamepad(this.engine)?.removeGamepadCore(\"pp_right_virtual_gamepad\");\r\n\r\n this._myLeftVirtualGamepadGamepadCore.setActive(false);\r\n this._myRightVirtualGamepadGamepadCore.setActive(false);\r\n }\r\n }\r\n\r\n onDestroy() {\r\n this._myLeftVirtualGamepadGamepadCore?.destroy();\r\n this._myRightVirtualGamepadGamepadCore?.destroy();\r\n\r\n this._myVirtualGamepad?.destroy();\r\n }\r\n}", "import { Component, Property } from \"@wonderlandengine/api\";\r\nimport { XRUtils } from \"../../../cauldron/utils/xr_utils.js\";\r\nimport { vec3_create } from \"../../../plugin/js/extensions/array/vec_create_extension.js\";\r\n\r\nexport class SetPlayerHeightComponent extends Component {\r\n static TypeName = \"pp-set-player-height\";\r\n static Properties = {\r\n _myEyesHeight: Property.float(1.65),\r\n _mySetOnlyOnStart: Property.bool(false)\r\n };\r\n\r\n start() {\r\n let localPosition = this.object.pp_getPositionLocal();\r\n this.object.pp_setPositionLocal(vec3_create(localPosition[0], this._myEyesHeight, localPosition[2]));\r\n\r\n this._myHeightSetOnce = false;\r\n }\r\n\r\n onActivate() {\r\n XRUtils.registerSessionStartEndEventListeners(this, this._onXRSessionStart.bind(this), this._onXRSessionEnd.bind(this), true, false, this.engine);\r\n }\r\n\r\n onDeactivate() {\r\n XRUtils.unregisterSessionStartEndEventListeners(this, this.engine);\r\n }\r\n\r\n _onXRSessionStart() {\r\n if (this.active && (!this._mySetOnlyOnStart || !this._myHeightSetOnce)) {\r\n let localPosition = this.object.pp_getPositionLocal();\r\n if (XRUtils.isReferenceSpaceFloorBased(this.engine)) {\r\n this.object.pp_setPositionLocal(vec3_create(localPosition[0], 0, localPosition[2]));\r\n } else {\r\n this.object.pp_setPositionLocal(vec3_create(localPosition[0], this._myEyesHeight, localPosition[2]));\r\n }\r\n\r\n this._myHeightSetOnce = true;\r\n }\r\n }\r\n\r\n _onXRSessionEnd() {\r\n if (this.active && !this._mySetOnlyOnStart) {\r\n let localPosition = this.object.pp_getPositionLocal();\r\n this.object.pp_setPositionLocal(vec3_create(localPosition[0], this._myEyesHeight, localPosition[2]));\r\n }\r\n }\r\n}", "import { Component, Property } from \"@wonderlandengine/api\";\r\nimport { XRUtils } from \"../../../cauldron/utils/xr_utils.js\";\r\nimport { quat2_create } from \"../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Globals } from \"../../../pp/globals.js\";\r\nimport { InputUtils } from \"../../cauldron/input_utils.js\";\r\n\r\nexport class SetHandLocalTransformComponent extends Component {\r\n static TypeName = \"pp-set-hand-local-transform\";\r\n static Properties = {\r\n _myHandedness: Property.enum([\"Left\", \"Right\"], \"Left\")\r\n };\r\n\r\n start() {\r\n this._myHandednessType = InputUtils.getHandednessByIndex(this._myHandedness);\r\n\r\n this._myActivateOnNextUpdate = false;\r\n }\r\n\r\n update(dt) {\r\n if (this._myActivateOnNextUpdate) {\r\n this._onActivate();\r\n\r\n this._myActivateOnNextUpdate = false;\r\n }\r\n }\r\n\r\n _onPoseUpdated(dt, pose) {\r\n // Implemented outside class definition\r\n }\r\n\r\n onActivate() {\r\n this._myActivateOnNextUpdate = true;\r\n }\r\n\r\n _onActivate() {\r\n Globals.getHandPose(this._myHandednessType, this.engine).registerPoseUpdatedEventListener(this, this._onPoseUpdated.bind(this));\r\n }\r\n\r\n onDeactivate() {\r\n Globals.getHandPose(this._myHandednessType, this.engine)?.unregisterPoseUpdatedEventListener(this);\r\n }\r\n}\r\n\r\n\r\n\r\n// IMPLEMENTATION\r\n\r\nSetHandLocalTransformComponent.prototype._onPoseUpdated = function () {\r\n let handPoseTransform = quat2_create();\r\n return function _onPoseUpdated(dt, pose) {\r\n if (!this.active || this._myActivateOnNextUpdate) {\r\n this.onDeactivate();\r\n return;\r\n }\r\n\r\n if (XRUtils.isSessionActive(this.engine)) {\r\n if (pose.isValid()) {\r\n this.object.pp_setTransformLocalQuat(pose.getTransformQuat(handPoseTransform, null));\r\n }\r\n }\r\n };\r\n}();", "import { Component, Property } from \"@wonderlandengine/api\";\r\nimport { XRUtils } from \"../../../cauldron/utils/xr_utils.js\";\r\nimport { quat2_create } from \"../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Globals } from \"../../../pp/globals.js\";\r\nimport { InputUtils } from \"../../cauldron/input_utils.js\";\r\n\r\nexport class SetHandRayLocalTransformComponent extends Component {\r\n static TypeName = \"pp-set-hand-ray-local-transform\";\r\n static Properties = {\r\n _myHandedness: Property.enum([\"Left\", \"Right\"], \"Left\")\r\n };\r\n\r\n start() {\r\n this._myHandednessType = InputUtils.getHandednessByIndex(this._myHandedness);\r\n\r\n this._myActivateOnNextUpdate = false;\r\n }\r\n\r\n update(dt) {\r\n if (this._myActivateOnNextUpdate) {\r\n this._onActivate();\r\n\r\n this._myActivateOnNextUpdate = false;\r\n }\r\n }\r\n\r\n _onPoseUpdated(dt, pose) {\r\n // Implemented outside class definition\r\n }\r\n\r\n onActivate() {\r\n this._myActivateOnNextUpdate = true;\r\n }\r\n\r\n _onActivate() {\r\n Globals.getHandRayPose(this._myHandednessType, this.engine).registerPoseUpdatedEventListener(this, this._onPoseUpdated.bind(this));\r\n }\r\n\r\n onDeactivate() {\r\n Globals.getHandRayPose(this._myHandednessType, this.engine)?.unregisterPoseUpdatedEventListener(this);\r\n }\r\n}\r\n\r\n\r\n\r\n// IMPLEMENTATION\r\n\r\nSetHandRayLocalTransformComponent.prototype._onPoseUpdated = function () {\r\n let handPoseTransform = quat2_create();\r\n return function _onPoseUpdated(dt, pose) {\r\n if (!this.active || this._myActivateOnNextUpdate) {\r\n this.onDeactivate();\r\n return;\r\n }\r\n\r\n if (XRUtils.isSessionActive(this.engine)) {\r\n if (pose.isValid()) {\r\n this.object.pp_setTransformLocalQuat(pose.getTransformQuat(handPoseTransform, null));\r\n }\r\n }\r\n };\r\n}();", "import { Component } from \"@wonderlandengine/api\";\r\nimport { XRUtils } from \"../../../cauldron/utils/xr_utils.js\";\r\nimport { quat2_create, quat_create, vec3_create } from \"../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Globals } from \"../../../pp/globals.js\";\r\nimport { BasePose } from \"../base_pose.js\";\r\n\r\nexport class SetHeadLocalTransformComponent extends Component {\r\n public static override TypeName = \"pp-set-head-local-transform\";\r\n\r\n private _myActivateOnNextUpdate: boolean = false;\r\n\r\n public override update(dt: number): void {\r\n if (this._myActivateOnNextUpdate) {\r\n this._onActivate();\r\n\r\n this._myActivateOnNextUpdate = false;\r\n }\r\n }\r\n\r\n private static readonly _onPoseUpdatedSV =\r\n {\r\n cameraNonXRRotation: quat_create(),\r\n cameraNonXRUp: vec3_create(),\r\n cameraNonXRPosition: vec3_create(),\r\n headPoseTransform: quat2_create()\r\n };\r\n private _onPoseUpdated(dt: number, pose: Readonly): void {\r\n if (!this.active || this._myActivateOnNextUpdate) {\r\n this.onDeactivate();\r\n return;\r\n }\r\n\r\n if (!XRUtils.isSessionActive(this.engine)) {\r\n const cameraNonXR = Globals.getPlayerObjects(this.engine)!.myCameraNonXR!;\r\n\r\n const cameraNonXRRotation = SetHeadLocalTransformComponent._onPoseUpdatedSV.cameraNonXRRotation;\r\n cameraNonXR.pp_getRotationLocalQuat(cameraNonXRRotation);\r\n\r\n if (Globals.isPoseForwardFixed(this.engine)) {\r\n const cameraNonXRUp = SetHeadLocalTransformComponent._onPoseUpdatedSV.cameraNonXRUp;\r\n cameraNonXRRotation.quat_rotateAxisRadians(Math.PI, cameraNonXRRotation.quat_getUp(cameraNonXRUp), cameraNonXRRotation);\r\n }\r\n\r\n const cameraNonXRPosition = SetHeadLocalTransformComponent._onPoseUpdatedSV.cameraNonXRPosition;\r\n this.object.pp_setPositionLocal(cameraNonXR.pp_getPositionLocal(cameraNonXRPosition));\r\n this.object.pp_setRotationLocalQuat(cameraNonXRRotation);\r\n } else {\r\n if (pose.isValid()) {\r\n const headPoseTransform = SetHeadLocalTransformComponent._onPoseUpdatedSV.headPoseTransform;\r\n this.object.pp_setTransformLocalQuat(pose.getTransformQuat(headPoseTransform, null));\r\n }\r\n }\r\n }\r\n\r\n public override onActivate(): void {\r\n this._myActivateOnNextUpdate = true;\r\n }\r\n\r\n private _onActivate(): void {\r\n Globals.getHeadPose(this.engine)!.registerPoseUpdatedEventListener(this, this._onPoseUpdated.bind(this));\r\n }\r\n\r\n public override onDeactivate(): void {\r\n Globals.getHeadPose(this.engine)?.unregisterPoseUpdatedEventListener(this);\r\n }\r\n}", "import { Component, Property } from \"@wonderlandengine/api\";\r\nimport { XRUtils } from \"../../../cauldron/utils/xr_utils.js\";\r\nimport { quat2_create } from \"../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Globals } from \"../../../pp/globals.js\";\r\nimport { InputUtils } from \"../../cauldron/input_utils.js\";\r\n\r\nexport class SetTrackedHandJointLocalTransformComponent extends Component {\r\n static TypeName = \"pp-set-tracked-hand-joint-local-transform\";\r\n static Properties = {\r\n _myHandedness: Property.enum([\"Left\", \"Right\"], \"Left\"),\r\n _mySetLocalScaleAsJointRadius: Property.bool(false),\r\n _myJointID: Property.enum(\r\n [\r\n \"Wrist\",\r\n \"Thumb Metacarpal\", \"Thumb Phalanx Proximal\", \"Thumb Phalanx Distal\", \"Thumb Tip\",\r\n \"Index Metacarpal\", \"Index Phalanx Proximal\", \"Index Phalanx Intermediate\", \"Index Phalanx Distal\", \"Index Tip\",\r\n \"Middle Metacarpal\", \"Middle Phalanx Proximal\", \"Middle Phalanx Intermediate\", \"Middle Phalanx Distal\", \"Middle Tip\",\r\n \"Ring Metacarpal\", \"Ring Phalanx Proximal\", \"Ring Phalanx Intermediate\", \"Ring Phalanx Distal\", \"Ring Tip\",\r\n \"Pinky Metacarpal\", \"Pinky Phalanx Proximal\", \"Pinky Phalanx Intermediate\", \"Pinky Phalanx Distal\", \"Pinky Tip\"\r\n ],\r\n \"Wrist\")\r\n };\r\n\r\n start() {\r\n this._myHandednessType = InputUtils.getHandednessByIndex(this._myHandedness);\r\n this._myJointIDType = InputUtils.getJointIDByIndex(this._myJointID);\r\n\r\n this._myActivateOnNextUpdate = false;\r\n }\r\n\r\n update(dt) {\r\n if (this._myActivateOnNextUpdate) {\r\n this._onActivate();\r\n\r\n this._myActivateOnNextUpdate = false;\r\n }\r\n }\r\n\r\n _onPoseUpdated(dt, pose) {\r\n // Implemented outside class definition\r\n }\r\n\r\n onActivate() {\r\n this._myActivateOnNextUpdate = true;\r\n }\r\n\r\n _onActivate() {\r\n Globals.getTrackedHandPose(this._myHandednessType, this.engine).getJointPose(this._myJointIDType).registerPoseUpdatedEventListener(this, this._onPoseUpdated.bind(this));\r\n }\r\n\r\n onDeactivate() {\r\n Globals.getTrackedHandPose(this._myHandednessType, this.engine)?.getJointPose(this._myJointIDType)?.unregisterPoseUpdatedEventListener(this);\r\n }\r\n}\r\n\r\n\r\n\r\n// IMPLEMENTATION\r\n\r\nSetTrackedHandJointLocalTransformComponent.prototype._onPoseUpdated = function () {\r\n let jointPoseTransform = quat2_create();\r\n return function _onPoseUpdated(dt, pose) {\r\n if (!this.active || this._myActivateOnNextUpdate) {\r\n this.onDeactivate();\r\n return;\r\n }\r\n\r\n if (XRUtils.isSessionActive(this.engine)) {\r\n if (pose.isValid()) {\r\n this.object.pp_setTransformLocalQuat(pose.getTransformQuat(jointPoseTransform, null));\r\n\r\n if (this._mySetLocalScaleAsJointRadius) {\r\n this.object.pp_setScaleLocal(pose.getJointRadius());\r\n }\r\n }\r\n }\r\n };\r\n}();", "import { Component, Property } from \"@wonderlandengine/api\";\r\nimport { Globals } from \"../../../pp/globals.js\";\r\nimport { InputUtils } from \"../../cauldron/input_utils.js\";\r\n\r\nexport class CopyHandTransformComponent extends Component {\r\n static TypeName = \"pp-copy-hand-transform\";\r\n static Properties = {\r\n _myHandedness: Property.enum([\"Left\", \"Right\"], \"Left\")\r\n };\r\n\r\n init() {\r\n this._myHandednessType = InputUtils.getHandednessByIndex(this._myHandedness);\r\n }\r\n\r\n update(dt) {\r\n let hand = Globals.getPlayerObjects(this.engine).myHands[this._myHandednessType];\r\n this.object.pp_setTransformQuat(hand.pp_getTransformQuat());\r\n this.object.pp_setScale(hand.pp_getScale());\r\n }\r\n}", "import { Component } from \"@wonderlandengine/api\";\r\nimport { Globals } from \"../../../pp/globals.js\";\r\n\r\nexport class CopyHeadTransformComponent extends Component {\r\n static TypeName = \"pp-copy-head-transform\";\r\n\r\n update(dt) {\r\n let head = Globals.getPlayerObjects(this.engine).myHead;\r\n this.object.pp_setTransformQuat(head.pp_getTransformQuat());\r\n this.object.pp_setScale(head.pp_getScale());\r\n }\r\n}", "import { Component } from \"@wonderlandengine/api\";\r\nimport { Globals } from \"../../../pp/globals.js\";\r\n\r\nexport class CopyPlayerTransformComponent extends Component {\r\n static TypeName = \"pp-copy-player-transform\";\r\n\r\n update(dt) {\r\n let player = Globals.getPlayerObjects(this.engine).myPlayer;\r\n this.object.pp_setTransformQuat(player.pp_getTransformQuat());\r\n this.object.pp_setScale(player.pp_getScale());\r\n }\r\n}", "import { Component } from \"@wonderlandengine/api\";\r\nimport { Globals } from \"../../../pp/globals.js\";\r\n\r\nexport class CopyReferenceSpaceTransformComponent extends Component {\r\n static TypeName = \"pp-copy-reference-space-transform\";\r\n\r\n update(dt) {\r\n let referenceSpace = Globals.getPlayerObjects(this.engine).myReferenceSpace;\r\n this.object.pp_setTransformQuat(referenceSpace.pp_getTransformQuat());\r\n this.object.pp_setScale(referenceSpace.pp_getScale());\r\n }\r\n}", "export let ToolHandedness = {\r\n NONE: null,\r\n LEFT: \"left\",\r\n RIGHT: \"right\"\r\n};\r\n\r\nexport let ToolInputSourceType = {\r\n NONE: null,\r\n GAMEPAD: 0,\r\n TRACKED_HAND: 1\r\n};", "import { Component, MeshComponent, Property, ViewComponent } from \"@wonderlandengine/api\";\r\nimport { Cursor, CursorTarget } from \"@wonderlandengine/components\";\r\nimport { PhysicsUtils } from \"../../../cauldron/physics/physics_utils.js\";\r\nimport { XRUtils } from \"../../../cauldron/utils/xr_utils.js\";\r\nimport { FingerCursorComponent } from \"../../../input/cauldron/components/finger_cursor_component.js\";\r\nimport { InputUtils } from \"../../../input/cauldron/input_utils.js\";\r\nimport { quat2_create, vec3_create, vec4_create } from \"../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Globals } from \"../../../pp/globals.js\";\r\n\r\nexport class ToolCursorComponent extends Component {\r\n static TypeName = \"pp-tool-cursor\";\r\n static Properties = {\r\n _myHandedness: Property.enum([\"Left\", \"Right\"], \"Left\"),\r\n _myApplyDefaultCursorOffset: Property.bool(true),\r\n _myPulseOnHover: Property.bool(false),\r\n _myShowFingerCursor: Property.bool(false),\r\n _myUpdatePointerCursorStyle: Property.bool(true)\r\n };\r\n\r\n init() {\r\n this._myHandednessType = InputUtils.getHandednessByIndex(this._myHandedness);\r\n\r\n this._myCursorPositionDefaultOffset = vec3_create(0, -0.035, 0.05);\r\n this._myCursorRotationDefaultOffset = vec3_create(30, 0, 0);\r\n\r\n this._myCursorMeshScale = vec3_create(0.0025, 0.0025, 0.0025);\r\n this._myCursorColor = vec4_create(255 / 255, 255 / 255, 255 / 255, 1);\r\n\r\n this._myCursorTargetCollisionGroup = 7; // Keep this in sync with Widgets \r\n\r\n this._myStarted = false;\r\n }\r\n\r\n start() {\r\n if (Globals.isToolEnabled(this.engine)) {\r\n this._myToolCursorObject = this.object.pp_addChild();\r\n\r\n this._myCursorObjectXR = this._myToolCursorObject.pp_addChild();\r\n\r\n if (this._myApplyDefaultCursorOffset) {\r\n this._myCursorObjectXR.pp_setPositionLocal(this._myCursorPositionDefaultOffset);\r\n this._myCursorObjectXR.pp_rotateObject(this._myCursorRotationDefaultOffset);\r\n }\r\n\r\n {\r\n this._myCursorMeshobject = this._myCursorObjectXR.pp_addChild();\r\n this._myCursorMeshobject.pp_setScale(this._myCursorMeshScale);\r\n\r\n let cursorMeshComponent = this._myCursorMeshobject.pp_addComponent(MeshComponent);\r\n cursorMeshComponent.mesh = Globals.getDefaultMeshes(this.engine).mySphere;\r\n cursorMeshComponent.material = Globals.getDefaultMaterials(this.engine).myFlatOpaque.clone();\r\n cursorMeshComponent.material.color = this._myCursorColor;\r\n\r\n this._myCursorComponentXR = this._myCursorObjectXR.pp_addComponent(Cursor, {\r\n \"collisionGroup\": this._myCursorTargetCollisionGroup,\r\n \"handedness\": this._myHandedness + 1,\r\n \"cursorObject\": this._myCursorMeshobject,\r\n \"styleCursor\": false\r\n });\r\n\r\n this._myCursorComponentXR.rayCastMode = 0; // Collision\r\n }\r\n\r\n this._myCursorObjectNonXR = this._myToolCursorObject.pp_addChild();\r\n\r\n {\r\n this._myCursorComponentNonXR = this._myCursorObjectNonXR.pp_addComponent(Cursor, {\r\n \"collisionGroup\": this._myCursorTargetCollisionGroup,\r\n \"handedness\": this._myHandedness + 1,\r\n \"styleCursor\": this._myUpdatePointerCursorStyle\r\n });\r\n\r\n this._myCursorComponentNonXR.rayCastMode = 0; // Collision\r\n this._myCursorComponentNonXR.pp_setViewComponent(Globals.getPlayerObjects(this.engine).myCameraNonXR.pp_getComponent(ViewComponent));\r\n }\r\n\r\n let fingerCursorMeshObject = null;\r\n let fingerCollisionSize = 0.0125;\r\n\r\n if (this._myShowFingerCursor) {\r\n fingerCursorMeshObject = this._myToolCursorObject.pp_addChild();\r\n\r\n let meshComponent = fingerCursorMeshObject.pp_addComponent(MeshComponent);\r\n meshComponent.mesh = Globals.getDefaultMeshes(this.engine).mySphere;\r\n meshComponent.material = Globals.getDefaultMaterials(this.engine).myFlatOpaque.clone();\r\n meshComponent.material.color = this._myCursorColor;\r\n\r\n fingerCursorMeshObject.pp_setScale(fingerCollisionSize);\r\n }\r\n\r\n let collisionFlags = \"\";\r\n for (let i = 0; i < PhysicsUtils.getLayerFlagsNames().length; i++) {\r\n if (i == this._myCursorTargetCollisionGroup) {\r\n collisionFlags += \"1\";\r\n } else {\r\n collisionFlags += \"0\";\r\n }\r\n\r\n if (i != PhysicsUtils.getLayerFlagsNames().length - 1) {\r\n collisionFlags += \", \";\r\n }\r\n }\r\n\r\n this._myFingerCursorObject = this._myToolCursorObject.pp_addChild();\r\n this._myFingerCursorComponent = this._myFingerCursorObject.pp_addComponent(FingerCursorComponent, {\r\n \"_myHandedness\": this._myHandedness,\r\n \"_myDisableDefaultCursorOnTrackedHandDetected\": false,\r\n \"_myMultipleClicksEnabled\": true,\r\n \"_myCollisionMode\": 1,\r\n \"_myCollisionFlags\": collisionFlags,\r\n \"_myCollisionSize\": fingerCollisionSize,\r\n \"_myCursorPointerObject\": fingerCursorMeshObject\r\n });\r\n\r\n this._myCursorComponentXR.active = false;\r\n this._myCursorComponentNonXR.active = false;\r\n this._myFingerCursorComponent.active = false;\r\n\r\n this._myStarted = true;\r\n }\r\n }\r\n\r\n update(dt) {\r\n // Implemented outside class definition\r\n }\r\n\r\n _isUsingHand() {\r\n let usingHand = false;\r\n\r\n if (XRUtils.getSession(this.engine) && XRUtils.getSession(this.engine).inputSources != null) {\r\n for (let i = 0; i < XRUtils.getSession(this.engine).inputSources.length; i++) {\r\n let input = XRUtils.getSession(this.engine).inputSources[i];\r\n if (input.hand && input.handedness == this._myHandednessType) {\r\n usingHand = true;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return usingHand;\r\n }\r\n\r\n _pulseOnHover(object) {\r\n let targetComponent = object.pp_getComponent(CursorTarget);\r\n\r\n if (targetComponent && !targetComponent.isSurface) {\r\n if (this._myHandedness == 0) {\r\n if (Globals.getLeftGamepad(this.engine) != null) {\r\n Globals.getLeftGamepad(this.engine).pulse(0.4, 0);\r\n }\r\n } else {\r\n if (Globals.getRightGamepad(this.engine) != null) {\r\n Globals.getRightGamepad(this.engine).pulse(0.4, 0);\r\n }\r\n }\r\n }\r\n }\r\n\r\n onActivate() {\r\n if (this._myStarted && this._myPulseOnHover) {\r\n this._myCursorComponentXR.globalTarget.onHover.add(this._pulseOnHover.bind(this), { id: this });\r\n this._myCursorComponentNonXR.globalTarget.onHover.add(this._pulseOnHover.bind(this), { id: this });\r\n }\r\n }\r\n\r\n onDeactivate() {\r\n if (this._myStarted) {\r\n this._myCursorComponentXR.globalTarget.onHover.remove(this);\r\n this._myCursorComponentNonXR.globalTarget.onHover.remove(this);\r\n }\r\n }\r\n}\r\n\r\n\r\n\r\n// IMPLEMENTATION\r\n\r\nToolCursorComponent.prototype.update = function () {\r\n let transformQuat = quat2_create();\r\n return function update(dt) {\r\n if (Globals.isToolEnabled(this.engine)) {\r\n if (this._myStarted) {\r\n let usingHand = this._isUsingHand();\r\n\r\n this._myFingerCursorComponent.active = usingHand;\r\n\r\n if (usingHand) {\r\n this._myCursorComponentXR.active = false;\r\n this._myCursorComponentNonXR.active = false;\r\n } else {\r\n if (XRUtils.isSessionActive(this.engine)) {\r\n this._myCursorComponentXR.active = !usingHand;\r\n this._myCursorComponentNonXR.active = false;\r\n } else {\r\n this._myCursorComponentNonXR.active = !usingHand;\r\n this._myCursorComponentXR.active = false;\r\n\r\n this._myCursorObjectNonXR.pp_setTransformQuat(Globals.getPlayerObjects(this.engine).myCameraNonXR.pp_getTransformQuat(transformQuat));\r\n }\r\n }\r\n }\r\n }\r\n };\r\n}();", "import { Alignment, Collider, VerticalAlignment } from \"@wonderlandengine/api\";\r\nimport { vec3_create, vec4_create } from \"../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { ToolHandedness } from \"../cauldron/tool_types.js\";\r\nimport { ConsoleVRWidgetMessageType } from \"./console_vr_types.js\";\r\n\r\nexport class ConsoleVRWidgetConfig {\r\n\r\n constructor() {\r\n this._setupBuildConfig();\r\n this._setupRuntimeConfig();\r\n }\r\n\r\n _setupBuildConfig() {\r\n // General\r\n this.myBackgroundColor = vec4_create(46 / 255, 46 / 255, 46 / 255, 1);\r\n\r\n this.myCursorTargetCollisionCollider = Collider.Box;\r\n this.myCursorTargetCollisionGroup = 7; // Keep this in sync with Tool Cursor\r\n this.myCursorTargetCollisionThickness = 0.001;\r\n\r\n this.myDefaultTextColor = vec4_create(255 / 255, 255 / 255, 255 / 255, 1);\r\n\r\n this.myTextAlignment = Alignment.Center;\r\n this.myTextVerticalAlignment = VerticalAlignment.Middle;\r\n this.myTextColor = this.myDefaultTextColor;\r\n\r\n this.myMessageTypeColors = [];\r\n this.myMessageTypeColors[ConsoleVRWidgetMessageType.LOG] = this.myDefaultTextColor;\r\n this.myMessageTypeColors[ConsoleVRWidgetMessageType.ERROR] = vec4_create(255 / 255, 40 / 255, 40 / 255, 1);\r\n this.myMessageTypeColors[ConsoleVRWidgetMessageType.WARN] = vec4_create(250 / 255, 220 / 255, 40 / 255, 1);\r\n this.myMessageTypeColors[ConsoleVRWidgetMessageType.DEBUG] = vec4_create(60 / 255, 200 / 255, 255 / 255, 1);\r\n\r\n // Messages\r\n this.myMessagesPanelPosition = vec3_create(0, 0.075, 0);\r\n\r\n this.myMessagesBackgroundScale = vec3_create(0.34, 0.15, 1);\r\n\r\n {\r\n let xPaddingPercentage = 0.03;\r\n let yPaddingPercentage = xPaddingPercentage * this.myMessagesBackgroundScale[0] / this.myMessagesBackgroundScale[1] * 0.8; // A bit less padding\r\n let xPosition = -this.myMessagesBackgroundScale[0] + this.myMessagesBackgroundScale[0] * xPaddingPercentage;\r\n let yPosition = this.myMessagesBackgroundScale[1] - this.myMessagesBackgroundScale[1] * yPaddingPercentage;\r\n this.myMessagesTextsPanelPosition = vec3_create(xPosition, yPosition, 0.007);\r\n }\r\n this.myMessagesTextsPanelScale = vec3_create(0.1, 0.1, 0.1);\r\n\r\n this.myMessagesTextStartString = \".\\n\"; // To avoid issue with text component padding\r\n this.myMessagesTextAlignment = Alignment.Left;\r\n this.myMessagesTextVerticalAlignment = VerticalAlignment.Top;\r\n\r\n this.myMessagesTextPositions = [];\r\n this.myMessagesTextPositions[ConsoleVRWidgetMessageType.LOG] = vec3_create(0, 0, 0.0002);\r\n this.myMessagesTextPositions[ConsoleVRWidgetMessageType.ERROR] = vec3_create(0, 0, 0);\r\n this.myMessagesTextPositions[ConsoleVRWidgetMessageType.WARN] = vec3_create(0, 0, 0);\r\n this.myMessagesTextPositions[ConsoleVRWidgetMessageType.DEBUG] = vec3_create(0, 0, 0);\r\n\r\n this.myMessagesTextColors = [];\r\n this.myMessagesTextColors[ConsoleVRWidgetMessageType.LOG] = this.myMessageTypeColors[ConsoleVRWidgetMessageType.LOG];\r\n this.myMessagesTextColors[ConsoleVRWidgetMessageType.ERROR] = this.myMessageTypeColors[ConsoleVRWidgetMessageType.ERROR];\r\n this.myMessagesTextColors[ConsoleVRWidgetMessageType.WARN] = this.myMessageTypeColors[ConsoleVRWidgetMessageType.WARN];\r\n this.myMessagesTextColors[ConsoleVRWidgetMessageType.DEBUG] = this.myMessageTypeColors[ConsoleVRWidgetMessageType.DEBUG];\r\n\r\n // Buttons \r\n this.myButtonsPanelPosition = vec3_create(0, -0.11, 0.015);\r\n\r\n this.myButtonBackgroundScale = vec3_create(0.04, 0.02, 1);\r\n\r\n this.myButtonTextPosition = vec3_create(0, 0, 0.007);\r\n this.myButtonTextScale = vec3_create(0.18, 0.18, 0.18);\r\n\r\n this.myButtonCursorTargetPosition = vec3_create(0, 0, 0);\r\n this.myButtonCursorTargetPosition[2] = this.myButtonTextPosition[2];\r\n\r\n this.myButtonsCollisionCollider = this.myCursorTargetCollisionCollider;\r\n this.myButtonsCollisionGroup = this.myCursorTargetCollisionGroup;\r\n this.myButtonsCollisionExtents = this.myButtonBackgroundScale.pp_clone();\r\n this.myButtonsCollisionExtents[2] = this.myCursorTargetCollisionThickness;\r\n\r\n this.myClearButtonTextLabel = \"clear\";\r\n this.myUpButtonTextLabel = \"up\";\r\n this.myDownButtonTextLabel = \"down\";\r\n\r\n this.myFilterButtonsTextColors = [];\r\n this.myFilterButtonsTextColors[ConsoleVRWidgetMessageType.LOG] = this.myMessageTypeColors[ConsoleVRWidgetMessageType.LOG];\r\n this.myFilterButtonsTextColors[ConsoleVRWidgetMessageType.ERROR] = this.myMessageTypeColors[ConsoleVRWidgetMessageType.ERROR];\r\n this.myFilterButtonsTextColors[ConsoleVRWidgetMessageType.WARN] = this.myMessageTypeColors[ConsoleVRWidgetMessageType.WARN];\r\n this.myFilterButtonsTextColors[ConsoleVRWidgetMessageType.DEBUG] = this.myMessageTypeColors[ConsoleVRWidgetMessageType.DEBUG];\r\n\r\n this.myFilterButtonsTextLabel = [];\r\n this.myFilterButtonsTextLabel[ConsoleVRWidgetMessageType.LOG] = \"log\";\r\n this.myFilterButtonsTextLabel[ConsoleVRWidgetMessageType.ERROR] = \"error\";\r\n this.myFilterButtonsTextLabel[ConsoleVRWidgetMessageType.WARN] = \"warn\";\r\n this.myFilterButtonsTextLabel[ConsoleVRWidgetMessageType.DEBUG] = \"debug\";\r\n\r\n // Buttons positioning\r\n {\r\n let numberOfButtons = 7;\r\n let buttonsHorizontalSpace = Math.max(0.68, this.myButtonBackgroundScale[0] * numberOfButtons);\r\n // 2 at start, 3 between filters, 4 spaces between filter and clear and 4 spaces between clear and up/down, 1 space between up and down, 1 at end\r\n let numberOfSpacesBetweenButtons = 2 + 3 + 4 + 4 + 1 + 2;\r\n let spaceWidth = Math.max((buttonsHorizontalSpace - numberOfButtons * this.myButtonBackgroundScale[0] * 2) / numberOfSpacesBetweenButtons, 0);\r\n let halfButtonWidth = this.myButtonBackgroundScale[0];\r\n let initialPosition = - buttonsHorizontalSpace / 2;\r\n\r\n this.myFilterButtonsPositions = [];\r\n this.myFilterButtonsPositions[ConsoleVRWidgetMessageType.LOG] = [initialPosition + spaceWidth * 2 + halfButtonWidth, 0, 0];\r\n this.myFilterButtonsPositions[ConsoleVRWidgetMessageType.ERROR] = [this.myFilterButtonsPositions[ConsoleVRWidgetMessageType.LOG][0] + halfButtonWidth + spaceWidth + halfButtonWidth, 0, 0];\r\n this.myFilterButtonsPositions[ConsoleVRWidgetMessageType.WARN] = [this.myFilterButtonsPositions[ConsoleVRWidgetMessageType.ERROR][0] + halfButtonWidth + spaceWidth + halfButtonWidth, 0, 0];\r\n this.myFilterButtonsPositions[ConsoleVRWidgetMessageType.DEBUG] = [this.myFilterButtonsPositions[ConsoleVRWidgetMessageType.WARN][0] + halfButtonWidth + spaceWidth + halfButtonWidth, 0, 0];\r\n\r\n this.myClearButtonPosition = [this.myFilterButtonsPositions[ConsoleVRWidgetMessageType.DEBUG][0] + halfButtonWidth + spaceWidth * 4 + halfButtonWidth, 0, 0];\r\n this.myUpButtonPosition = [this.myClearButtonPosition[0] + halfButtonWidth + spaceWidth * 4 + halfButtonWidth, 0, 0];\r\n this.myDownButtonPosition = [this.myUpButtonPosition[0] + halfButtonWidth + spaceWidth + halfButtonWidth, 0, 0];\r\n }\r\n\r\n // Notify Icon\r\n this.myNotifyIconBackgroundScale = vec3_create(0.01, 0.01, 1);\r\n\r\n this.myNotifyIconPanelPositions = [];\r\n this.myNotifyIconPanelPositions[ToolHandedness.NONE] = vec3_create(0, 0, 0);\r\n this.myNotifyIconPanelPositions[ToolHandedness.NONE][0] = -this.myMessagesBackgroundScale[0] + this.myNotifyIconBackgroundScale[0] + 0.01;\r\n this.myNotifyIconPanelPositions[ToolHandedness.NONE][1] = -this.myMessagesBackgroundScale[1] + this.myNotifyIconBackgroundScale[1] + 0.01;\r\n this.myNotifyIconPanelPositions[ToolHandedness.NONE][2] = this.myMessagesTextsPanelPosition[2] - 0.00001; // Prevent glitches with text\r\n\r\n this.myNotifyIconPanelPositions[ToolHandedness.LEFT] = this.myNotifyIconPanelPositions[ToolHandedness.NONE];\r\n\r\n this.myNotifyIconPanelPositions[ToolHandedness.RIGHT] = this.myNotifyIconPanelPositions[ToolHandedness.NONE];\r\n\r\n this.myNotifyIconCursorTargetPosition = vec3_create(0, 0, 0);\r\n this.myNotifyIconCursorTargetPosition[2] = this.myButtonsPanelPosition[2] + this.myButtonTextPosition[2] - this.myMessagesTextsPanelPosition[2]; // A little behind the button target to avoid hiding it\r\n\r\n this.myNotifyIconCollisionExtents = this.myNotifyIconBackgroundScale.pp_clone();\r\n this.myNotifyIconCollisionExtents[2] = this.myCursorTargetCollisionThickness;\r\n\r\n this.myNotifyIconColor = vec4_create(210 / 255, 210 / 255, 210 / 255, 1);\r\n\r\n // Pointer\r\n this.myPointerCollisionCollider = this.myCursorTargetCollisionCollider;\r\n this.myPointerCollisionGroup = this.myCursorTargetCollisionGroup;\r\n\r\n {\r\n let spaceBetweenMessagesAndButtons = Math.abs((this.myMessagesPanelPosition[1] - this.myMessagesBackgroundScale[1]) - (this.myButtonsPanelPosition[1] + this.myButtonBackgroundScale[1]));\r\n let pointerCollisionHalfHeight = this.myMessagesBackgroundScale[1] + this.myButtonBackgroundScale[1] + spaceBetweenMessagesAndButtons / 2;\r\n this.myPointerCollisionExtents = vec3_create(this.myMessagesBackgroundScale[0], pointerCollisionHalfHeight, this.myCursorTargetCollisionThickness);\r\n }\r\n\r\n this.myPointerCursorTargetPosition = vec3_create(0, 0, 0);\r\n this.myPointerCursorTargetPosition[1] = (this.myMessagesPanelPosition[1] + this.myMessagesBackgroundScale[1]) - this.myPointerCollisionExtents[1];\r\n this.myPointerCursorTargetPosition[2] = this.myButtonsPanelPosition[2] + this.myButtonTextPosition[2] - 0.0002; // A little behind the button target to avoid hiding it\r\n }\r\n\r\n _setupRuntimeConfig() {\r\n this.myTabString = \" \";\r\n this.myAssertStartString = \"Assertion failed:\";\r\n\r\n this.myMaxCharactersPerLine = 100;\r\n this.myMaxLineSplits = 500; // Prevent infinite splitting\r\n this.myMaxLines = 22;\r\n this.myMaxMessages = 2000;\r\n this.myMaxMessagesDeletePad = 2000; // To prevent deleting at every message, delay the delete after the limit is exceed by this value\r\n\r\n this.myLinesBetweenMessages = 1;\r\n\r\n this.myButtonHoverColor = vec4_create(150 / 255, 150 / 255, 150 / 255, 1);\r\n this.myButtonDisabledTextColor = this.myBackgroundColor;\r\n this.myButtonDisabledBackgroundColor = vec4_create(110 / 255, 110 / 255, 110 / 255, 1);\r\n\r\n this.myFilterButtonDisabledTextColor = this.myButtonDisabledTextColor;\r\n this.myFilterButtonDisabledBackgroundColor = this.myButtonDisabledBackgroundColor;\r\n\r\n this.myScrollDelay = 0.1;\r\n this.myScrollAmount = 1;\r\n this.myScrollThumbstickHandedness = ToolHandedness.RIGHT;\r\n this.myScrollThumbstickDelay = 0.1;\r\n this.myScrollThumbstickMinThreshold = 0.2;\r\n this.myScrollThumbstickAmount = 3;\r\n\r\n this.myPulseDelay = 5;\r\n this.myPulseIntensity = 0.3;\r\n this.myPulseDuration = 0.085;\r\n\r\n this.myClearBrowserConsoleWhenClearPressed = false;\r\n\r\n this.myGamepadScrollOnlyOnHover = true;\r\n }\r\n}", "export let ConsoleVRWidgetConsoleFunction = {\r\n DEBUG: 0,\r\n WARN: 1,\r\n ERROR: 2,\r\n LOG: 3,\r\n INFO: 4,\r\n ASSERT: 5\r\n};\r\n\r\nexport let ConsoleVRWidgetSender = {\r\n BROWSER_CONSOLE: 0,\r\n CONSOLE_VR: 1,\r\n WINDOW: 2\r\n};\r\n\r\nexport let ConsoleVRWidgetPulseOnNewMessage = {\r\n NEVER: 0,\r\n ALWAYS: 1,\r\n WHEN_HIDDEN: 2\r\n};\r\n\r\nexport let ConsoleVRWidgetMessageType = {\r\n DEBUG: 0,\r\n WARN: 1,\r\n ERROR: 2,\r\n LOG: 3\r\n};\r\n\r\nexport let OverrideBrowserConsoleFunctions = {\r\n NONE: 0,\r\n ALL: 1,\r\n ERRORS_AND_WARNS: 2\r\n};", "import { CollisionComponent, MeshComponent, TextComponent } from \"@wonderlandengine/api\";\r\nimport { CursorTarget } from \"@wonderlandengine/components\";\r\nimport { XRUtils } from \"../../cauldron/utils/xr_utils.js\";\r\nimport { Globals } from \"../../pp/globals.js\";\r\nimport { ToolHandedness } from \"../cauldron/tool_types.js\";\r\nimport { ConsoleVRWidgetMessageType } from \"./console_vr_types.js\";\r\n\r\nexport class ConsoleVRWidgetUI {\r\n\r\n constructor(engine = Globals.getMainEngine()) {\r\n this._myEngine = engine;\r\n\r\n this._myActive = false;\r\n this._myDestroyed = false;\r\n }\r\n\r\n build(parentObject, config, params) {\r\n this._myParentObject = parentObject;\r\n this._myConfig = config;\r\n this._myParams = params;\r\n\r\n this._myPlaneMesh = Globals.getDefaultMeshes(this._myEngine).myDoubleSidedPlane;\r\n\r\n this._createSkeleton();\r\n this._setTransforms();\r\n this._addComponents();\r\n\r\n this._setTransformForNonXR();\r\n\r\n this.setActive(true);\r\n }\r\n\r\n setVisible(visible) {\r\n this.myPivotObject.pp_setActive(visible);\r\n }\r\n\r\n // Skeleton\r\n _createSkeleton() {\r\n this.myPivotObject = this._myParentObject.pp_addChild();\r\n\r\n this._createMessagesSkeleton();\r\n this._createButtonsSkeleton();\r\n this._createPointerSkeleton();\r\n }\r\n\r\n _createMessagesSkeleton() {\r\n this.myMessagesPanel = this.myPivotObject.pp_addChild();\r\n this.myMessagesBackground = this.myMessagesPanel.pp_addChild();\r\n this.myMessagesTextsPanel = this.myMessagesPanel.pp_addChild();\r\n\r\n this.myMessagesTexts = [];\r\n for (let key in ConsoleVRWidgetMessageType) {\r\n this.myMessagesTexts[ConsoleVRWidgetMessageType[key]] = this.myMessagesTextsPanel.pp_addChild();\r\n }\r\n\r\n this.myNotifyIconPanel = this.myMessagesPanel.pp_addChild();\r\n this.myNotifyIconBackground = this.myNotifyIconPanel.pp_addChild();\r\n this.myNotifyIconCursorTarget = this.myNotifyIconPanel.pp_addChild();\r\n }\r\n\r\n _createButtonsSkeleton() {\r\n this.myButtonsPanel = this.myPivotObject.pp_addChild();\r\n\r\n this.myFilterButtonsPanels = [];\r\n this.myFilterButtonsBackgrounds = [];\r\n this.myFilterButtonsTexts = [];\r\n this.myFilterButtonsCursorTargets = [];\r\n\r\n for (let key in ConsoleVRWidgetMessageType) {\r\n this.myFilterButtonsPanels[ConsoleVRWidgetMessageType[key]] = this.myButtonsPanel.pp_addChild();\r\n this.myFilterButtonsBackgrounds[ConsoleVRWidgetMessageType[key]] = this.myFilterButtonsPanels[ConsoleVRWidgetMessageType[key]].pp_addChild();\r\n this.myFilterButtonsTexts[ConsoleVRWidgetMessageType[key]] = this.myFilterButtonsPanels[ConsoleVRWidgetMessageType[key]].pp_addChild();\r\n this.myFilterButtonsCursorTargets[ConsoleVRWidgetMessageType[key]] = this.myFilterButtonsPanels[ConsoleVRWidgetMessageType[key]].pp_addChild();\r\n }\r\n\r\n this.myClearButtonPanel = this.myButtonsPanel.pp_addChild();\r\n this.myClearButtonBackground = this.myClearButtonPanel.pp_addChild();\r\n this.myClearButtonText = this.myClearButtonPanel.pp_addChild();\r\n this.myClearButtonCursorTarget = this.myClearButtonPanel.pp_addChild();\r\n\r\n this.myUpButtonPanel = this.myButtonsPanel.pp_addChild();\r\n this.myUpButtonBackground = this.myUpButtonPanel.pp_addChild();\r\n this.myUpButtonText = this.myUpButtonPanel.pp_addChild();\r\n this.myUpButtonCursorTarget = this.myUpButtonPanel.pp_addChild();\r\n\r\n this.myDownButtonPanel = this.myButtonsPanel.pp_addChild();\r\n this.myDownButtonBackground = this.myDownButtonPanel.pp_addChild();\r\n this.myDownButtonText = this.myDownButtonPanel.pp_addChild();\r\n this.myDownButtonCursorTarget = this.myDownButtonPanel.pp_addChild();\r\n }\r\n\r\n _createPointerSkeleton() {\r\n this.myPointerCursorTarget = this.myPivotObject.pp_addChild();\r\n }\r\n\r\n // Transforms\r\n _setTransforms() {\r\n this.myPivotObject.pp_markDirty();\r\n\r\n this._setMessagesTransforms();\r\n this._setButtonsTransforms();\r\n this._setPointerTransform();\r\n }\r\n\r\n _setMessagesTransforms() {\r\n this.myMessagesPanel.pp_setPositionLocal(this._myConfig.myMessagesPanelPosition);\r\n this.myMessagesBackground.pp_scaleObject(this._myConfig.myMessagesBackgroundScale);\r\n\r\n this.myMessagesTextsPanel.pp_setPositionLocal(this._myConfig.myMessagesTextsPanelPosition);\r\n this.myMessagesTextsPanel.pp_scaleObject(this._myConfig.myMessagesTextsPanelScale);\r\n for (let key in ConsoleVRWidgetMessageType) {\r\n this.myMessagesTexts[ConsoleVRWidgetMessageType[key]].pp_setPositionLocal(this._myConfig.myMessagesTextPositions[ConsoleVRWidgetMessageType[key]]);\r\n }\r\n\r\n this.myNotifyIconPanel.pp_setPositionLocal(this._myConfig.myNotifyIconPanelPositions[this._myParams.myHandedness]);\r\n this.myNotifyIconBackground.pp_scaleObject(this._myConfig.myNotifyIconBackgroundScale);\r\n this.myNotifyIconCursorTarget.pp_setPositionLocal(this._myConfig.myNotifyIconCursorTargetPosition);\r\n }\r\n\r\n _setButtonsTransforms() {\r\n this.myButtonsPanel.pp_setPositionLocal(this._myConfig.myButtonsPanelPosition);\r\n\r\n // Filter Buttons\r\n for (let key in ConsoleVRWidgetMessageType) {\r\n this.myFilterButtonsPanels[ConsoleVRWidgetMessageType[key]].pp_setPositionLocal(this._myConfig.myFilterButtonsPositions[ConsoleVRWidgetMessageType[key]]);\r\n\r\n this.myFilterButtonsBackgrounds[ConsoleVRWidgetMessageType[key]].pp_scaleObject(this._myConfig.myButtonBackgroundScale);\r\n\r\n this.myFilterButtonsTexts[ConsoleVRWidgetMessageType[key]].pp_setPositionLocal(this._myConfig.myButtonTextPosition);\r\n this.myFilterButtonsTexts[ConsoleVRWidgetMessageType[key]].pp_scaleObject(this._myConfig.myButtonTextScale);\r\n\r\n this.myFilterButtonsCursorTargets[ConsoleVRWidgetMessageType[key]].pp_setPositionLocal(this._myConfig.myButtonCursorTargetPosition);\r\n }\r\n\r\n // Clear\r\n {\r\n this.myClearButtonPanel.pp_setPositionLocal(this._myConfig.myClearButtonPosition);\r\n\r\n this.myClearButtonBackground.pp_scaleObject(this._myConfig.myButtonBackgroundScale);\r\n\r\n this.myClearButtonText.pp_setPositionLocal(this._myConfig.myButtonTextPosition);\r\n this.myClearButtonText.pp_scaleObject(this._myConfig.myButtonTextScale);\r\n\r\n this.myClearButtonCursorTarget.pp_setPositionLocal(this._myConfig.myButtonCursorTargetPosition);\r\n }\r\n\r\n // Up\r\n {\r\n this.myUpButtonPanel.pp_setPositionLocal(this._myConfig.myUpButtonPosition);\r\n\r\n this.myUpButtonBackground.pp_scaleObject(this._myConfig.myButtonBackgroundScale);\r\n\r\n this.myUpButtonText.pp_setPositionLocal(this._myConfig.myButtonTextPosition);\r\n this.myUpButtonText.pp_scaleObject(this._myConfig.myButtonTextScale);\r\n\r\n this.myUpButtonCursorTarget.pp_setPositionLocal(this._myConfig.myButtonCursorTargetPosition);\r\n }\r\n\r\n // Down\r\n {\r\n this.myDownButtonPanel.pp_setPositionLocal(this._myConfig.myDownButtonPosition);\r\n\r\n this.myDownButtonBackground.pp_scaleObject(this._myConfig.myButtonBackgroundScale);\r\n\r\n this.myDownButtonText.pp_setPositionLocal(this._myConfig.myButtonTextPosition);\r\n this.myDownButtonText.pp_scaleObject(this._myConfig.myButtonTextScale);\r\n\r\n this.myDownButtonCursorTarget.pp_setPositionLocal(this._myConfig.myButtonCursorTargetPosition);\r\n }\r\n }\r\n\r\n _setPointerTransform() {\r\n this.myPointerCursorTarget.pp_setPositionLocal(this._myConfig.myPointerCursorTargetPosition);\r\n }\r\n\r\n // Components\r\n _addComponents() {\r\n this._addMessagesComponents();\r\n this._addButtonsComponents();\r\n this._addPointerComponents();\r\n }\r\n\r\n _addMessagesComponents() {\r\n let messagesBackgroundMeshComp = this.myMessagesBackground.pp_addComponent(MeshComponent);\r\n messagesBackgroundMeshComp.mesh = this._myPlaneMesh;\r\n messagesBackgroundMeshComp.material = this._myParams.myPlaneMaterial.clone();\r\n messagesBackgroundMeshComp.material.color = this._myConfig.myBackgroundColor;\r\n\r\n this.myMessagesTextComponents = [];\r\n for (let key in ConsoleVRWidgetMessageType) {\r\n let textComp = this.myMessagesTexts[ConsoleVRWidgetMessageType[key]].pp_addComponent(TextComponent);\r\n\r\n textComp.alignment = this._myConfig.myMessagesTextAlignment;\r\n textComp.verticalAlignment = this._myConfig.myMessagesTextVerticalAlignment;\r\n textComp.material = this._myParams.myTextMaterial.clone();\r\n textComp.material.color = this._myConfig.myMessagesTextColors[ConsoleVRWidgetMessageType[key]];\r\n textComp.lineSpacing = 1.2;\r\n textComp.text = this._myConfig.myMessagesTextStartString;\r\n\r\n this.myMessagesTextComponents[ConsoleVRWidgetMessageType[key]] = textComp;\r\n }\r\n\r\n this.myNotifyIconBackgroundComponent = this.myNotifyIconBackground.pp_addComponent(MeshComponent);\r\n this.myNotifyIconBackgroundComponent.mesh = this._myPlaneMesh;\r\n this.myNotifyIconBackgroundComponent.material = this._myParams.myPlaneMaterial.clone();\r\n this.myNotifyIconBackgroundComponent.material.color = this._myConfig.myNotifyIconColor;\r\n\r\n this.myNotifyIconCursorTargetComponent = this.myNotifyIconCursorTarget.pp_addComponent(CursorTarget);\r\n\r\n this.myNotifyIconCollisionComponent = this.myNotifyIconCursorTarget.pp_addComponent(CollisionComponent);\r\n this.myNotifyIconCollisionComponent.collider = this._myConfig.myCursorTargetCollisionCollider;\r\n this.myNotifyIconCollisionComponent.group = 1 << this._myConfig.myCursorTargetCollisionGroup;\r\n this.myNotifyIconCollisionComponent.extents = this._myConfig.myNotifyIconCollisionExtents;\r\n }\r\n\r\n _addButtonsComponents() {\r\n // Worship the code copy pasteness\r\n\r\n this.myFilterButtonsBackgroundComponents = [];\r\n this.myFilterButtonsTextComponents = [];\r\n this.myFilterButtonsCursorTargetComponents = [];\r\n this.myFilterButtonsCollisionComponents = [];\r\n\r\n // Filter Buttons\r\n for (let key in ConsoleVRWidgetMessageType) {\r\n let buttonBackgroundMeshComp = this.myFilterButtonsBackgrounds[ConsoleVRWidgetMessageType[key]].pp_addComponent(MeshComponent);\r\n buttonBackgroundMeshComp.mesh = this._myPlaneMesh;\r\n buttonBackgroundMeshComp.material = this._myParams.myPlaneMaterial.clone();\r\n buttonBackgroundMeshComp.material.color = this._myConfig.myBackgroundColor;\r\n\r\n let buttonTextComp = this.myFilterButtonsTexts[ConsoleVRWidgetMessageType[key]].pp_addComponent(TextComponent);\r\n this._setupButtonTextComponent(buttonTextComp);\r\n buttonTextComp.material.color = this._myConfig.myFilterButtonsTextColors[ConsoleVRWidgetMessageType[key]];\r\n buttonTextComp.text = this._myConfig.myFilterButtonsTextLabel[ConsoleVRWidgetMessageType[key]];\r\n\r\n let buttonCursorTargetComp = this.myFilterButtonsCursorTargets[ConsoleVRWidgetMessageType[key]].pp_addComponent(CursorTarget);\r\n\r\n let buttonCollisionComp = this.myFilterButtonsCursorTargets[ConsoleVRWidgetMessageType[key]].pp_addComponent(CollisionComponent);\r\n buttonCollisionComp.collider = this._myConfig.myButtonsCollisionCollider;\r\n buttonCollisionComp.group = 1 << this._myConfig.myButtonsCollisionGroup;\r\n buttonCollisionComp.extents = this._myConfig.myButtonsCollisionExtents;\r\n\r\n this.myFilterButtonsBackgroundComponents[ConsoleVRWidgetMessageType[key]] = buttonBackgroundMeshComp;\r\n this.myFilterButtonsTextComponents[ConsoleVRWidgetMessageType[key]] = buttonTextComp;\r\n this.myFilterButtonsCursorTargetComponents[ConsoleVRWidgetMessageType[key]] = buttonCursorTargetComp;\r\n this.myFilterButtonsCollisionComponents[ConsoleVRWidgetMessageType[key]] = buttonCollisionComp;\r\n }\r\n\r\n // Clear \r\n {\r\n let buttonBackgroundMeshComp = this.myClearButtonBackground.pp_addComponent(MeshComponent);\r\n buttonBackgroundMeshComp.mesh = this._myPlaneMesh;\r\n buttonBackgroundMeshComp.material = this._myParams.myPlaneMaterial.clone();\r\n buttonBackgroundMeshComp.material.color = this._myConfig.myBackgroundColor;\r\n\r\n let buttonTextComp = this.myClearButtonText.pp_addComponent(TextComponent);\r\n this._setupButtonTextComponent(buttonTextComp);\r\n buttonTextComp.text = this._myConfig.myClearButtonTextLabel;\r\n\r\n let buttonCursorTargetComp = this.myClearButtonCursorTarget.pp_addComponent(CursorTarget);\r\n\r\n let buttonCollisionComp = this.myClearButtonCursorTarget.pp_addComponent(CollisionComponent);\r\n buttonCollisionComp.collider = this._myConfig.myButtonsCollisionCollider;\r\n buttonCollisionComp.group = 1 << this._myConfig.myButtonsCollisionGroup;\r\n buttonCollisionComp.extents = this._myConfig.myButtonsCollisionExtents;\r\n\r\n this.myClearButtonBackgroundComponent = buttonBackgroundMeshComp;\r\n this.myClearButtonTextComponent = buttonTextComp;\r\n this.myClearButtonCursorTargetComponent = buttonCursorTargetComp;\r\n this.myClearButtonCollisionComponent = buttonCollisionComp;\r\n }\r\n\r\n // Up \r\n {\r\n let buttonBackgroundMeshComp = this.myUpButtonBackground.pp_addComponent(MeshComponent);\r\n buttonBackgroundMeshComp.mesh = this._myPlaneMesh;\r\n buttonBackgroundMeshComp.material = this._myParams.myPlaneMaterial.clone();\r\n buttonBackgroundMeshComp.material.color = this._myConfig.myBackgroundColor;\r\n\r\n let buttonTextComp = this.myUpButtonText.pp_addComponent(TextComponent);\r\n this._setupButtonTextComponent(buttonTextComp);\r\n buttonTextComp.text = this._myConfig.myUpButtonTextLabel;\r\n\r\n let buttonCursorTargetComp = this.myUpButtonCursorTarget.pp_addComponent(CursorTarget);\r\n\r\n let buttonCollisionComp = this.myUpButtonCursorTarget.pp_addComponent(CollisionComponent);\r\n buttonCollisionComp.collider = this._myConfig.myButtonsCollisionCollider;\r\n buttonCollisionComp.group = 1 << this._myConfig.myButtonsCollisionGroup;\r\n buttonCollisionComp.extents = this._myConfig.myButtonsCollisionExtents;\r\n\r\n this.myUpButtonBackgroundComponent = buttonBackgroundMeshComp;\r\n this.myUpButtonTextComponent = buttonTextComp;\r\n this.myUpButtonCursorTargetComponent = buttonCursorTargetComp;\r\n this.myUpButtonCollisionComponent = buttonCollisionComp;\r\n }\r\n\r\n // Down \r\n {\r\n let buttonBackgroundMeshComp = this.myDownButtonBackground.pp_addComponent(MeshComponent);\r\n buttonBackgroundMeshComp.mesh = this._myPlaneMesh;\r\n buttonBackgroundMeshComp.material = this._myParams.myPlaneMaterial.clone();\r\n buttonBackgroundMeshComp.material.color = this._myConfig.myBackgroundColor;\r\n\r\n let buttonTextComp = this.myDownButtonText.pp_addComponent(TextComponent);\r\n this._setupButtonTextComponent(buttonTextComp);\r\n buttonTextComp.text = this._myConfig.myDownButtonTextLabel;\r\n\r\n let buttonCursorTargetComp = this.myDownButtonCursorTarget.pp_addComponent(CursorTarget);\r\n\r\n let buttonCollisionComp = this.myDownButtonCursorTarget.pp_addComponent(CollisionComponent);\r\n buttonCollisionComp.collider = this._myConfig.myButtonsCollisionCollider;\r\n buttonCollisionComp.group = 1 << this._myConfig.myButtonsCollisionGroup;\r\n buttonCollisionComp.extents = this._myConfig.myButtonsCollisionExtents;\r\n\r\n this.myDownButtonBackgroundComponent = buttonBackgroundMeshComp;\r\n this.myDownButtonTextComponent = buttonTextComp;\r\n this.myDownButtonCursorTargetComponent = buttonCursorTargetComp;\r\n this.myDownButtonCollisionComponent = buttonCollisionComp;\r\n }\r\n }\r\n\r\n _addPointerComponents() {\r\n this.myPointerCursorTargetComponent = this.myPointerCursorTarget.pp_addComponent(CursorTarget);\r\n this.myPointerCursorTargetComponent.isSurface = true;\r\n\r\n let collisionComp = this.myPointerCursorTarget.pp_addComponent(CollisionComponent);\r\n collisionComp.collider = this._myConfig.myPointerCollisionCollider;\r\n collisionComp.group = 1 << this._myConfig.myPointerCollisionGroup;\r\n collisionComp.extents = this._myConfig.myPointerCollisionExtents;\r\n\r\n this.myPointerCollisionComponent = collisionComp;\r\n }\r\n\r\n _setupButtonTextComponent(textComponent) {\r\n textComponent.alignment = this._myConfig.myTextAlignment;\r\n textComponent.verticalAlignment = this._myConfig.myTextVerticalAlignment;\r\n textComponent.material = this._myParams.myTextMaterial.clone();\r\n textComponent.material.color = this._myConfig.myTextColor;\r\n textComponent.text = \"\";\r\n }\r\n\r\n _onXRSessionStart() {\r\n this._setTransformForXR();\r\n }\r\n\r\n _onXRSessionEnd() {\r\n this._setTransformForNonXR();\r\n }\r\n\r\n _setTransformForXR() {\r\n this.myNotifyIconPanel.pp_setPositionLocal(this._myConfig.myNotifyIconPanelPositions[this._myParams.myHandedness]);\r\n }\r\n\r\n _setTransformForNonXR() {\r\n this.myNotifyIconPanel.pp_setPositionLocal(this._myConfig.myNotifyIconPanelPositions[ToolHandedness.NONE]);\r\n }\r\n\r\n setActive(active) {\r\n if (this._myActive != active) {\r\n this._myActive = active;\r\n\r\n if (this._myActive) {\r\n XRUtils.registerSessionStartEndEventListeners(this, this._onXRSessionStart.bind(this), this._onXRSessionEnd.bind(this), true, false, this._myEngine);\r\n } else {\r\n XRUtils.unregisterSessionStartEndEventListeners(this, this._myEngine);\r\n }\r\n }\r\n }\r\n\r\n destroy() {\r\n this._myDestroyed = true;\r\n\r\n this.setActive(false);\r\n }\r\n\r\n isDestroyed() {\r\n return this._myDestroyed;\r\n }\r\n}", "import { Emitter } from \"@wonderlandengine/api\";\r\nimport { Globals } from \"../../pp/globals.js\";\r\nimport { ToolHandedness } from \"../cauldron/tool_types.js\";\r\nimport { WidgetFrameConfig } from \"./widget_frame_config.js\";\r\nimport { WidgetFrameUI } from \"./widget_frame_ui.js\";\r\n\r\nexport class WidgetParams {\r\n\r\n constructor() {\r\n this.myHandedness = ToolHandedness.NONE;\r\n\r\n this.myPlaneMaterial = null;\r\n this.myTextMaterial = null;\r\n }\r\n}\r\n\r\nexport class WidgetFrame {\r\n\r\n constructor(widgetLetterID, buttonsColumnIndex, engine = Globals.getMainEngine()) {\r\n this._myWidgetVisible = true;\r\n this._myPinned = false;\r\n\r\n this._myConfig = new WidgetFrameConfig(widgetLetterID, buttonsColumnIndex);\r\n this._myParams = null;\r\n\r\n this._myUI = new WidgetFrameUI(engine);\r\n this._myShowVisibilityButton = false;\r\n\r\n this._myWidgetVisibleChangedEmitter = new Emitter(); // Signature: listener(widgetVisible)\r\n this._myPinChangedEmitter = new Emitter(); // Signature: listener(pinned)\r\n\r\n this._myUnhoverCallbacks = [];\r\n\r\n this._myDestroyed = false;\r\n }\r\n\r\n getWidgetObject() {\r\n return this._myUI.myWidgetObject;\r\n }\r\n\r\n setVisible(visible) {\r\n this._myWidgetVisible = !visible;\r\n this._toggleVisibility(false, true);\r\n }\r\n\r\n isVisible() {\r\n return this._myWidgetVisible;\r\n }\r\n\r\n toggleVisibility() {\r\n this._toggleVisibility(false, true);\r\n }\r\n\r\n togglePin() {\r\n this._togglePin(false);\r\n }\r\n\r\n registerWidgetVisibleChangedEventListener(id, listener) {\r\n this._myWidgetVisibleChangedEmitter.add(listener, { id: id });\r\n }\r\n\r\n unregisterWidgetVisibleChangedEventListener(id) {\r\n this._myWidgetVisibleChangedEmitter.remove(id);\r\n }\r\n\r\n registerPinChangedEventListener(id, listener) {\r\n this._myPinChangedEmitter.add(listener, { id: id });\r\n }\r\n\r\n unregisterPinChangedEventListener(id) {\r\n this._myPinChangedEmitter.remove(id);\r\n }\r\n\r\n start(parentObject, params) {\r\n this._myParams = params;\r\n\r\n this._myUI.build(parentObject, this._myConfig, params);\r\n this._myUI.setVisibilityButtonVisible(params.myShowVisibilityButton);\r\n this._myShowVisibilityButton = params.myShowVisibilityButton;\r\n if (!params.myShowOnStart) {\r\n this._toggleVisibility(false, false);\r\n }\r\n\r\n this._addListeners();\r\n }\r\n\r\n update(dt) {\r\n this._myUI.update(dt);\r\n }\r\n\r\n _addListeners() {\r\n let ui = this._myUI;\r\n\r\n this._myUnhoverCallbacks = [];\r\n\r\n ui.myPinButtonCursorTargetComponent.onClick.add(this._togglePin.bind(this, true));\r\n ui.myPinButtonCursorTargetComponent.onHover.add(this._genericHover.bind(this, ui.myPinButtonBackgroundComponent.material));\r\n ui.myPinButtonCursorTargetComponent.onUnhover.add(this._pinUnhover.bind(this, ui.myPinButtonBackgroundComponent.material));\r\n\r\n this._myUnhoverCallbacks.push(this._pinUnhover.bind(this, ui.myPinButtonBackgroundComponent.material));\r\n\r\n ui.myVisibilityButtonCursorTargetComponent.onClick.add(this._toggleVisibility.bind(this, true, true));\r\n ui.myVisibilityButtonCursorTargetComponent.onHover.add(this._genericHover.bind(this, ui.myVisibilityButtonBackgroundComponent.material));\r\n ui.myVisibilityButtonCursorTargetComponent.onUnhover.add(this._visibilityUnhover.bind(this, ui.myVisibilityButtonBackgroundComponent.material));\r\n\r\n this._myUnhoverCallbacks.push(this._visibilityUnhover.bind(this, ui.myVisibilityButtonBackgroundComponent.material));\r\n }\r\n\r\n _toggleVisibility(isButton, notify) {\r\n this._myWidgetVisible = !this._myWidgetVisible;\r\n\r\n this._myUI.setWidgetVisible(this._myWidgetVisible);\r\n\r\n for (const unhoverCallback of this._myUnhoverCallbacks) {\r\n unhoverCallback();\r\n }\r\n\r\n let textMaterial = this._myUI.myVisibilityButtonTextComponent.material;\r\n let backgroundMaterial = this._myUI.myVisibilityButtonBackgroundComponent.material;\r\n if (this._myWidgetVisible) {\r\n textMaterial.color = this._myConfig.myDefaultTextColor;\r\n if (!isButton) {\r\n backgroundMaterial.color = this._myConfig.myBackgroundColor;\r\n }\r\n } else {\r\n textMaterial.color = this._myConfig.myButtonDisabledTextColor;\r\n if (!isButton) {\r\n backgroundMaterial.color = this._myConfig.myButtonDisabledBackgroundColor;\r\n }\r\n }\r\n\r\n if (notify) {\r\n this._myWidgetVisibleChangedEmitter.notify(this._myWidgetVisible);\r\n }\r\n\r\n this._myUI.setVisibilityButtonVisible(this._myShowVisibilityButton);\r\n }\r\n\r\n _togglePin(isButton) {\r\n if (this._myWidgetVisible) {\r\n this._myPinned = !this._myPinned;\r\n\r\n this._myUI.setPinned(this._myPinned);\r\n\r\n let textMaterial = this._myUI.myPinButtonTextComponent.material;\r\n let backgroundMaterial = this._myUI.myPinButtonBackgroundComponent.material;\r\n if (this._myPinned) {\r\n textMaterial.color = this._myConfig.myDefaultTextColor;\r\n if (!isButton) {\r\n backgroundMaterial.color = this._myConfig.myBackgroundColor;\r\n }\r\n } else {\r\n textMaterial.color = this._myConfig.myButtonDisabledTextColor;\r\n if (!isButton) {\r\n backgroundMaterial.color = this._myConfig.myButtonDisabledBackgroundColor;\r\n }\r\n }\r\n\r\n this._myPinChangedEmitter.notify(this._myPinned);\r\n }\r\n }\r\n\r\n _genericHover(material) {\r\n material.color = this._myConfig.myButtonHoverColor;\r\n }\r\n\r\n _visibilityUnhover(material) {\r\n if (this._myWidgetVisible) {\r\n material.color = this._myConfig.myBackgroundColor;\r\n } else {\r\n material.color = this._myConfig.myButtonDisabledBackgroundColor;\r\n }\r\n }\r\n\r\n _pinUnhover(material) {\r\n if (this._myPinned) {\r\n material.color = this._myConfig.myBackgroundColor;\r\n } else {\r\n material.color = this._myConfig.myButtonDisabledBackgroundColor;\r\n }\r\n }\r\n\r\n setActive(active) {\r\n this._myUI.setActive(active);\r\n }\r\n\r\n destroy() {\r\n this._myDestroyed = true;\r\n\r\n this.setActive(false);\r\n\r\n if (this._myUI != null) {\r\n this._myUI.destroy();\r\n }\r\n }\r\n\r\n isDestroyed() {\r\n return this._myDestroyed;\r\n }\r\n}", "import { Alignment, Collider, VerticalAlignment } from \"@wonderlandengine/api\";\r\nimport { quat_create, vec3_create, vec4_create } from \"../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { ToolHandedness, ToolInputSourceType } from \"../cauldron/tool_types.js\";\r\n\r\nexport class WidgetFrameConfig {\r\n\r\n constructor(widgetLetterID, buttonsColumnIndex) {\r\n\r\n this._setupBuildConfig(widgetLetterID, buttonsColumnIndex);\r\n this._setupRuntimeConfig();\r\n }\r\n\r\n _setupBuildConfig(widgetLetterID, buttonsColumnIndex) {\r\n // General\r\n this.myBackgroundColor = vec4_create(46 / 255, 46 / 255, 46 / 255, 1);\r\n\r\n this.myCursorTargetCollisionCollider = Collider.Box;\r\n this.myCursorTargetCollisionGroup = 7; // Keep this in sync with Tool Cursor\r\n this.myCursorTargetCollisionThickness = 0.001;\r\n\r\n this.myDefaultTextColor = vec4_create(255 / 255, 255 / 255, 255 / 255, 1);\r\n\r\n this.myTextAlignment = Alignment.Center;\r\n this.myTextVerticalAlignment = VerticalAlignment.Middle;\r\n this.myTextColor = this.myDefaultTextColor;\r\n\r\n this.myButtonTextScale = vec3_create(0.18, 0.18, 0.18);\r\n\r\n this.myVisibilityButtonBackgroundScale = vec3_create(0.015, 0.015, 1);\r\n this.myVisibilityButtonTextPosition = vec3_create(0, 0, 0.007);\r\n this.myVisibilityButtonTextScale = this.myButtonTextScale;\r\n\r\n let distanceBetweenToolsVisibilityButtons = 0.01;\r\n let buttonXOffset = this.myVisibilityButtonBackgroundScale[0] * (2 * buttonsColumnIndex) + distanceBetweenToolsVisibilityButtons * buttonsColumnIndex;\r\n\r\n this.myVisibilityButtonPosition = [];\r\n this.myVisibilityButtonPosition[ToolHandedness.NONE] = {};\r\n this.myVisibilityButtonPosition[ToolHandedness.NONE].myPosition = vec3_create(-0.3 + buttonXOffset, -0.205, 0.035);\r\n\r\n this.myVisibilityButtonPosition[ToolHandedness.LEFT] = {};\r\n this.myVisibilityButtonPosition[ToolHandedness.LEFT].myPosition = vec3_create(-0.2 + buttonXOffset, 0.025, 0.015);\r\n\r\n this.myVisibilityButtonPosition[ToolHandedness.RIGHT] = {};\r\n this.myVisibilityButtonPosition[ToolHandedness.RIGHT].myPosition = vec3_create(0.2 - buttonXOffset, 0.025, 0.015);\r\n\r\n this.myVisibilityButtonText = widgetLetterID;\r\n\r\n this.myVisibilityButtonCursorTargetPosition = vec3_create(0, 0, 0);\r\n this.myVisibilityButtonCursorTargetPosition[2] = this.myVisibilityButtonTextPosition[2];\r\n this.myVisibilityButtonCollisionExtents = this.myVisibilityButtonBackgroundScale.pp_clone();\r\n this.myVisibilityButtonCollisionExtents[2] = this.myCursorTargetCollisionThickness;\r\n\r\n this.myFlagButtonBackgroundScale = vec3_create(0.0125, 0.0125, 1);\r\n this.myFlagButtonTextPosition = vec3_create(0, 0, 0.007);\r\n this.myFlagButtonTextScale = vec3_create(0.15, 0.15, 0.15);\r\n\r\n let distanceBetweenFlagButtons = 0.0075;\r\n let pinFlagIndex = 0;\r\n let pinButtonYOffset = this.myVisibilityButtonBackgroundScale[1] + this.myFlagButtonBackgroundScale[1] + distanceBetweenFlagButtons +\r\n this.myFlagButtonBackgroundScale[1] * (2 * pinFlagIndex) + distanceBetweenFlagButtons * pinFlagIndex;\r\n\r\n this.myPinButtonPosition = [];\r\n this.myPinButtonPosition[ToolHandedness.NONE] = {};\r\n this.myPinButtonPosition[ToolHandedness.NONE].myPosition = this.myVisibilityButtonPosition[ToolHandedness.NONE].myPosition.pp_clone();\r\n this.myPinButtonPosition[ToolHandedness.NONE].myPosition[1] += pinButtonYOffset;\r\n\r\n this.myPinButtonPosition[ToolHandedness.LEFT] = {};\r\n this.myPinButtonPosition[ToolHandedness.LEFT].myPosition = this.myVisibilityButtonPosition[ToolHandedness.LEFT].myPosition.pp_clone();\r\n this.myPinButtonPosition[ToolHandedness.LEFT].myPosition[1] += pinButtonYOffset;\r\n\r\n this.myPinButtonPosition[ToolHandedness.RIGHT] = {};\r\n this.myPinButtonPosition[ToolHandedness.RIGHT].myPosition = this.myVisibilityButtonPosition[ToolHandedness.RIGHT].myPosition.pp_clone();\r\n this.myPinButtonPosition[ToolHandedness.RIGHT].myPosition[1] += pinButtonYOffset;\r\n\r\n this.myPinButtonText = \"P\";\r\n\r\n this.myPinButtonCursorTargetPosition = vec3_create(0, 0, 0);\r\n this.myPinButtonCursorTargetPosition[2] = this.myFlagButtonTextPosition[2];\r\n this.myPinButtonCollisionExtents = this.myFlagButtonBackgroundScale.pp_clone();\r\n this.myPinButtonCollisionExtents[2] = this.myCursorTargetCollisionThickness;\r\n }\r\n\r\n _setupRuntimeConfig() {\r\n this._initializeObjectsTransforms();\r\n\r\n this.myButtonHoverColor = vec4_create(150 / 255, 150 / 255, 150 / 255, 1);\r\n this.myButtonDisabledTextColor = this.myBackgroundColor;\r\n this.myButtonDisabledBackgroundColor = vec4_create(110 / 255, 110 / 255, 110 / 255, 1);\r\n }\r\n\r\n _initializeObjectsTransforms() {\r\n this.myPivotObjectTransforms = this._createDefaultObjectTransforms();\r\n\r\n this.myPivotObjectTransforms[ToolInputSourceType.GAMEPAD][ToolHandedness.LEFT].myRotation = quat_create(-0.645, 0.425, 0.25, 0.584);\r\n this.myPivotObjectTransforms[ToolInputSourceType.GAMEPAD][ToolHandedness.LEFT].myRotation.quat_normalize(this.myPivotObjectTransforms[ToolInputSourceType.GAMEPAD][ToolHandedness.LEFT].myRotation);\r\n\r\n this.myPivotObjectTransforms[ToolInputSourceType.GAMEPAD][ToolHandedness.RIGHT].myRotation = quat_create(-0.645, -0.425, -0.25, 0.584);\r\n this.myPivotObjectTransforms[ToolInputSourceType.GAMEPAD][ToolHandedness.RIGHT].myRotation.quat_normalize(this.myPivotObjectTransforms[ToolInputSourceType.GAMEPAD][ToolHandedness.RIGHT].myRotation);\r\n\r\n this.myPivotObjectTransforms[ToolInputSourceType.TRACKED_HAND][ToolHandedness.LEFT].myRotation = quat_create(-0.645, 0.425, 0.25, 0.584);\r\n this.myPivotObjectTransforms[ToolInputSourceType.TRACKED_HAND][ToolHandedness.LEFT].myRotation.quat_normalize(this.myPivotObjectTransforms[ToolInputSourceType.GAMEPAD][ToolHandedness.LEFT].myRotation);\r\n\r\n this.myPivotObjectTransforms[ToolInputSourceType.TRACKED_HAND][ToolHandedness.RIGHT].myRotation = quat_create(-0.645, -0.425, -0.25, 0.584);\r\n this.myPivotObjectTransforms[ToolInputSourceType.TRACKED_HAND][ToolHandedness.RIGHT].myRotation.quat_normalize(this.myPivotObjectTransforms[ToolInputSourceType.GAMEPAD][ToolHandedness.RIGHT].myRotation);\r\n\r\n /*\r\n this.myPivotObjectTransforms[ToolInputSourceType.TRACKED_HAND][ToolHandedness.LEFT].myPosition = vec3_create(-0.04, 0.045, -0.055);\r\n this.myPivotObjectTransforms[ToolInputSourceType.TRACKED_HAND][ToolHandedness.LEFT].myRotation = quat_create(0, 0.536, -0.43, 0.727);\r\n this.myPivotObjectTransforms[ToolInputSourceType.TRACKED_HAND][ToolHandedness.LEFT].myRotation.quat_normalize(this.myPivotObjectTransforms[ToolInputSourceType.TRACKED_HAND][ToolHandedness.LEFT].myRotation);\r\n\r\n this.myPivotObjectTransforms[ToolInputSourceType.TRACKED_HAND][ToolHandedness.RIGHT].myPosition = vec3_create(0.04, 0.045, -0.055);\r\n this.myPivotObjectTransforms[ToolInputSourceType.TRACKED_HAND][ToolHandedness.RIGHT].myRotation = quat_create(0, -0.536, 0.43, 0.727);\r\n this.myPivotObjectTransforms[ToolInputSourceType.TRACKED_HAND][ToolHandedness.RIGHT].myRotation.quat_normalize(this.myPivotObjectTransforms[ToolInputSourceType.TRACKED_HAND][ToolHandedness.RIGHT].myRotation);\r\n */\r\n\r\n this.myWidgetObjectTransforms = this._createDefaultObjectTransforms();\r\n\r\n this.myWidgetObjectTransforms[ToolInputSourceType.GAMEPAD][ToolHandedness.LEFT].myPosition = vec3_create(0.1, 0.23, -0.02);\r\n this.myWidgetObjectTransforms[ToolInputSourceType.GAMEPAD][ToolHandedness.RIGHT].myPosition = vec3_create(0.07, 0.23, -0.02);\r\n\r\n this.myWidgetObjectTransforms[ToolInputSourceType.TRACKED_HAND][ToolHandedness.LEFT].myPosition = vec3_create(0.1, 0.23, -0.02);\r\n this.myWidgetObjectTransforms[ToolInputSourceType.TRACKED_HAND][ToolHandedness.RIGHT].myPosition = vec3_create(0.07, 0.23, -0.02);\r\n\r\n this._myPivotObjectDistanceFromHeadNonXR = 0.6;\r\n }\r\n\r\n _createDefaultObjectTransforms() {\r\n let defaultObjectTransforms = [];\r\n\r\n for (let inputSourceTypeKey in ToolInputSourceType) {\r\n let inputSourceType = ToolInputSourceType[inputSourceTypeKey];\r\n defaultObjectTransforms[inputSourceType] = [];\r\n for (let handednessKey in ToolHandedness) {\r\n let handedness = ToolHandedness[handednessKey];\r\n defaultObjectTransforms[inputSourceType][handedness] = {};\r\n defaultObjectTransforms[inputSourceType][handedness].myPosition = vec3_create(0, 0, 0);\r\n defaultObjectTransforms[inputSourceType][handedness].myRotation = quat_create(0, 0, 0, 1);\r\n }\r\n }\r\n\r\n return defaultObjectTransforms;\r\n }\r\n}", "import { CollisionComponent, MeshComponent, TextComponent } from \"@wonderlandengine/api\";\r\nimport { CursorTarget } from \"@wonderlandengine/components\";\r\nimport { XRUtils } from \"../../cauldron/utils/xr_utils.js\";\r\nimport { vec3_create } from \"../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Globals } from \"../../pp/globals.js\";\r\nimport { ToolHandedness, ToolInputSourceType } from \"../cauldron/tool_types.js\";\r\n\r\nexport class WidgetFrameUI {\r\n\r\n constructor(engine = Globals.getMainEngine()) {\r\n this._myInputSourceType = null;\r\n\r\n this._myParentObject = null;\r\n this._myPinned = false;\r\n\r\n this._myWidgetVisible = true;\r\n this._myVisibilityButtonVisible = true;\r\n\r\n this._myEngine = engine;\r\n\r\n this._myActive = false;\r\n this._myDestroyed = false;\r\n }\r\n\r\n build(parentObject, config, params) {\r\n this._myParentObject = parentObject;\r\n this._myConfig = config;\r\n this._myParams = params;\r\n this._myPlaneMesh = Globals.getDefaultMeshes(this._myEngine).myDoubleSidedPlane;\r\n\r\n this._createSkeleton();\r\n this._setTransforms();\r\n this._addComponents();\r\n\r\n this._setTransformForNonXR();\r\n\r\n this.setActive(true);\r\n }\r\n\r\n setWidgetVisible(visible) {\r\n this._myWidgetVisible = visible;\r\n this.myFlagsButtonPanel.pp_setActive(visible);\r\n if (visible) {\r\n this._updateObjectsTransforms(true);\r\n }\r\n }\r\n\r\n setVisibilityButtonVisible(visible) {\r\n this._myVisibilityButtonVisible = visible;\r\n this.myVisibilityButtonPanel.pp_setActive(visible);\r\n }\r\n\r\n setPinned(pinned) {\r\n if (pinned != this._myPinned) {\r\n this._myPinned = pinned;\r\n if (this._myPinned) {\r\n this.myPivotObject.pp_setParent(Globals.getSceneObjects(this._myEngine).myTools);\r\n } else {\r\n this.myPivotObject.pp_setParent(this.myFixForwardObject);\r\n\r\n if (!XRUtils.isSessionActive(this._myEngine)) {\r\n this._setTransformForNonXR();\r\n }\r\n\r\n this._updateObjectsTransforms(true);\r\n }\r\n }\r\n }\r\n\r\n update(dt) {\r\n this._updateObjectsTransforms(false);\r\n }\r\n\r\n _updateObjectsTransforms(forceRefreshObjectsTransforms) {\r\n if (XRUtils.isSessionActive(this._myEngine)) {\r\n let inputSourceType = Globals.getHandPoses(this._myEngine)[this._myParams.myHandedness].getInputSourceType();\r\n\r\n if (inputSourceType != this._myInputSourceType || forceRefreshObjectsTransforms) {\r\n this._myInputSourceType = inputSourceType;\r\n\r\n if (!this._myPinned) {\r\n this.myPivotObject.pp_setPositionLocal(this._myConfig.myPivotObjectTransforms[this._myInputSourceType][this._myParams.myHandedness].myPosition);\r\n this.myPivotObject.pp_resetRotationLocal();\r\n this.myPivotObject.pp_rotateObjectQuat(this._myConfig.myPivotObjectTransforms[this._myInputSourceType][this._myParams.myHandedness].myRotation);\r\n\r\n this.myWidgetObject.pp_setPositionLocal(this._myConfig.myWidgetObjectTransforms[this._myInputSourceType][this._myParams.myHandedness].myPosition);\r\n this.myWidgetObject.pp_resetRotationLocal();\r\n this.myWidgetObject.pp_rotateObjectQuat(this._myConfig.myWidgetObjectTransforms[this._myInputSourceType][this._myParams.myHandedness].myRotation);\r\n\r\n this.myVisibilityButtonPanel.pp_setPositionLocal(this._myConfig.myVisibilityButtonPosition[this._myParams.myHandedness].myPosition);\r\n this.myPinButtonPanel.pp_setPositionLocal(this._myConfig.myPinButtonPosition[this._myParams.myHandedness].myPosition);\r\n }\r\n }\r\n } else {\r\n this.myVisibilityButtonPanel.pp_setActive(this._myWidgetVisible || this._myVisibilityButtonVisible);\r\n }\r\n }\r\n\r\n // Skeleton\r\n _createSkeleton() {\r\n this.myFixForwardObject = this._myParentObject.pp_addChild();\r\n\r\n if (Globals.isPoseForwardFixed(this._myEngine)) {\r\n this.myFixForwardObject.pp_rotateObject(vec3_create(0, 180, 0));\r\n }\r\n\r\n this.myPivotObject = this.myFixForwardObject.pp_addChild();\r\n this.myWidgetObject = this.myPivotObject.pp_addChild();\r\n\r\n this.myVisibilityButtonPanel = this.myPivotObject.pp_addChild();\r\n this.myVisibilityButtonBackground = this.myVisibilityButtonPanel.pp_addChild();\r\n this.myVisibilityButtonText = this.myVisibilityButtonPanel.pp_addChild();\r\n this.myVisibilityButtonCursorTarget = this.myVisibilityButtonPanel.pp_addChild();\r\n\r\n this.myFlagsButtonPanel = this.myPivotObject.pp_addChild();\r\n\r\n this.myPinButtonPanel = this.myFlagsButtonPanel.pp_addChild();\r\n this.myPinButtonBackground = this.myPinButtonPanel.pp_addChild();\r\n this.myPinButtonText = this.myPinButtonPanel.pp_addChild();\r\n this.myPinButtonCursorTarget = this.myPinButtonPanel.pp_addChild();\r\n\r\n this.myNonXRParentObject = Globals.getPlayerObjects(this._myEngine).myCameraNonXR.pp_addChild();\r\n this.myNonXRParentObject.pp_translateLocal(vec3_create(0, 0, -this._myConfig._myPivotObjectDistanceFromHeadNonXR));\r\n this.myNonXRParentObject.pp_lookToLocal(vec3_create(0, 0, 1), vec3_create(0, 1, 0));\r\n\r\n }\r\n\r\n // Transforms\r\n _setTransforms() {\r\n this.myPivotObject.pp_markDirty();\r\n\r\n this.myVisibilityButtonPanel.pp_setPositionLocal(this._myConfig.myVisibilityButtonPosition[this._myParams.myHandedness].myPosition);\r\n this.myVisibilityButtonBackground.pp_scaleObject(this._myConfig.myVisibilityButtonBackgroundScale);\r\n this.myVisibilityButtonText.pp_setPositionLocal(this._myConfig.myVisibilityButtonTextPosition);\r\n this.myVisibilityButtonText.pp_scaleObject(this._myConfig.myVisibilityButtonTextScale);\r\n this.myVisibilityButtonCursorTarget.pp_setPositionLocal(this._myConfig.myVisibilityButtonCursorTargetPosition);\r\n\r\n this.myPinButtonPanel.pp_setPositionLocal(this._myConfig.myPinButtonPosition[this._myParams.myHandedness].myPosition);\r\n\r\n this.myPinButtonBackground.pp_scaleObject(this._myConfig.myFlagButtonBackgroundScale);\r\n this.myPinButtonText.pp_setPositionLocal(this._myConfig.myFlagButtonTextPosition);\r\n this.myPinButtonText.pp_scaleObject(this._myConfig.myFlagButtonTextScale);\r\n this.myPinButtonCursorTarget.pp_setPositionLocal(this._myConfig.myPinButtonCursorTargetPosition);\r\n }\r\n\r\n // Components\r\n _addComponents() {\r\n this.myVisibilityButtonBackgroundComponent = this.myVisibilityButtonBackground.pp_addComponent(MeshComponent);\r\n this.myVisibilityButtonBackgroundComponent.mesh = this._myPlaneMesh;\r\n this.myVisibilityButtonBackgroundComponent.material = this._myParams.myPlaneMaterial.clone();\r\n this.myVisibilityButtonBackgroundComponent.material.color = this._myConfig.myBackgroundColor;\r\n\r\n this.myVisibilityButtonTextComponent = this.myVisibilityButtonText.pp_addComponent(TextComponent);\r\n this._setupButtonTextComponent(this.myVisibilityButtonTextComponent);\r\n this.myVisibilityButtonTextComponent.text = this._myConfig.myVisibilityButtonText;\r\n\r\n this.myVisibilityButtonCursorTargetComponent = this.myVisibilityButtonCursorTarget.pp_addComponent(CursorTarget);\r\n this.myVisibilityButtonCollisionComponent = this.myVisibilityButtonCursorTarget.pp_addComponent(CollisionComponent);\r\n this.myVisibilityButtonCollisionComponent.collider = this._myConfig.myCursorTargetCollisionCollider;\r\n this.myVisibilityButtonCollisionComponent.group = 1 << this._myConfig.myCursorTargetCollisionGroup;\r\n this.myVisibilityButtonCollisionComponent.extents = this._myConfig.myVisibilityButtonCollisionExtents;\r\n\r\n this.myPinButtonBackgroundComponent = this.myPinButtonBackground.pp_addComponent(MeshComponent);\r\n this.myPinButtonBackgroundComponent.mesh = this._myPlaneMesh;\r\n this.myPinButtonBackgroundComponent.material = this._myParams.myPlaneMaterial.clone();\r\n this.myPinButtonBackgroundComponent.material.color = this._myConfig.myButtonDisabledBackgroundColor;\r\n\r\n this.myPinButtonTextComponent = this.myPinButtonText.pp_addComponent(TextComponent);\r\n this._setupButtonTextComponent(this.myPinButtonTextComponent);\r\n this.myPinButtonTextComponent.material.color = this._myConfig.myButtonDisabledTextColor;\r\n this.myPinButtonTextComponent.text = this._myConfig.myPinButtonText;\r\n\r\n this.myPinButtonCursorTargetComponent = this.myPinButtonCursorTarget.pp_addComponent(CursorTarget);\r\n\r\n this.myPinButtonCollisionComponent = this.myPinButtonCursorTarget.pp_addComponent(CollisionComponent);\r\n this.myPinButtonCollisionComponent.collider = this._myConfig.myCursorTargetCollisionCollider;\r\n this.myPinButtonCollisionComponent.group = 1 << this._myConfig.myCursorTargetCollisionGroup;\r\n this.myPinButtonCollisionComponent.extents = this._myConfig.myPinButtonCollisionExtents;\r\n }\r\n\r\n _setupButtonTextComponent(textComponent) {\r\n textComponent.alignment = this._myConfig.myTextAlignment;\r\n textComponent.verticalAlignment = this._myConfig.myTextVerticalAlignment;\r\n textComponent.material = this._myParams.myTextMaterial.clone();\r\n textComponent.material.color = this._myConfig.myTextColor;\r\n textComponent.text = \"\";\r\n }\r\n\r\n _onXRSessionStart() {\r\n this.myVisibilityButtonPanel.pp_setActive(this._myVisibilityButtonVisible);\r\n\r\n this._setTransformForXR();\r\n }\r\n\r\n _onXRSessionEnd() {\r\n this._setTransformForNonXR();\r\n }\r\n\r\n _setTransformForXR() {\r\n this.myFixForwardObject.pp_setParent(this._myParentObject);\r\n\r\n this.myFixForwardObject.pp_resetTransformLocal();\r\n\r\n if (Globals.isPoseForwardFixed(this._myEngine)) {\r\n this.myFixForwardObject.pp_rotateObject(vec3_create(0, 180, 0));\r\n }\r\n\r\n this._updateObjectsTransforms(true);\r\n }\r\n\r\n _setTransformForNonXR() {\r\n if (!this._myPinned) {\r\n this.myFixForwardObject.pp_setParent(this.myNonXRParentObject);\r\n this.myFixForwardObject.pp_resetTransformLocal();\r\n\r\n this.myPivotObject.pp_setPositionLocal(this._myConfig.myPivotObjectTransforms[ToolInputSourceType.NONE][ToolHandedness.NONE].myPosition);\r\n this.myPivotObject.pp_resetRotationLocal();\r\n this.myPivotObject.pp_rotateObjectQuat(this._myConfig.myPivotObjectTransforms[ToolInputSourceType.NONE][ToolHandedness.NONE].myRotation);\r\n\r\n this.myWidgetObject.pp_setPositionLocal(this._myConfig.myWidgetObjectTransforms[ToolInputSourceType.NONE][ToolHandedness.NONE].myPosition);\r\n this.myWidgetObject.pp_resetRotationLocal();\r\n this.myWidgetObject.pp_rotateObjectQuat(this._myConfig.myWidgetObjectTransforms[ToolInputSourceType.NONE][ToolHandedness.NONE].myRotation);\r\n\r\n this.myVisibilityButtonPanel.pp_setPositionLocal(this._myConfig.myVisibilityButtonPosition[ToolHandedness.NONE].myPosition);\r\n this.myPinButtonPanel.pp_setPositionLocal(this._myConfig.myPinButtonPosition[ToolHandedness.NONE].myPosition);\r\n }\r\n }\r\n\r\n setActive(active) {\r\n if (this._myActive != active) {\r\n this._myActive = active;\r\n\r\n if (this._myActive) {\r\n XRUtils.registerSessionStartEndEventListeners(this, this._onXRSessionStart.bind(this), this._onXRSessionEnd.bind(this), true, false, this._myEngine);\r\n } else {\r\n XRUtils.unregisterSessionStartEndEventListeners(this, this._myEngine);\r\n }\r\n }\r\n }\r\n\r\n destroy() {\r\n this._myDestroyed = true;\r\n\r\n this.setActive(false);\r\n }\r\n\r\n isDestroyed() {\r\n return this._myDestroyed;\r\n }\r\n}", "import { GamepadAxesID, GamepadButtonID } from \"../../input/gamepad/gamepad_buttons.js\";\r\nimport { vec2_create } from \"../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Globals } from \"../../pp/globals.js\";\r\nimport { ToolHandedness } from \"../cauldron/tool_types.js\";\r\nimport { WidgetFrame, WidgetParams } from \"../widget_frame/widget_frame.js\";\r\nimport { ConsoleOriginalFunctions } from \"./console_original_functions.js\";\r\nimport { ConsoleVR } from \"./console_vr.js\";\r\nimport { ConsoleVRWidgetConsoleFunction, ConsoleVRWidgetMessageType, ConsoleVRWidgetPulseOnNewMessage, ConsoleVRWidgetSender, OverrideBrowserConsoleFunctions } from \"./console_vr_types.js\";\r\nimport { ConsoleVRWidgetConfig } from \"./console_vr_widget_config.js\";\r\nimport { ConsoleVRWidgetUI } from \"./console_vr_widget_ui.js\";\r\n\r\nexport class ConsoleVRWidgetParams extends WidgetParams {\r\n\r\n constructor() {\r\n super();\r\n\r\n this.myOverrideBrowserConsoleFunctions = false;\r\n this.myShowOnStart = false;\r\n this.myShowVisibilityButton = false;\r\n this.myPulseOnNewMessage = ConsoleVRWidgetPulseOnNewMessage.NEVER;\r\n\r\n this.myResetToOverwrittenConsoleFunctionsOnDeactivate = false;\r\n this.myResetToConsoleOriginalFunctionsOnDeactivate = true;\r\n\r\n this.myResetToOverwrittenConsoleFunctionsOnDestroy = false;\r\n this.myResetToConsoleOriginalFunctionsOnDestroy = false;\r\n }\r\n}\r\n\r\nexport class ConsoleVRWidgetMessage {\r\n\r\n constructor(messageType, messageLines) {\r\n this.myType = messageType;\r\n this.myLines = messageLines;\r\n\r\n this._myOriginalText = messageLines.join(\"\\n\");\r\n\r\n this._myMessagesCount = 1;\r\n }\r\n\r\n hasSameInfo(message) {\r\n return this._myOriginalText == message._myOriginalText && this.myType == message.myType;\r\n }\r\n\r\n increaseCount() {\r\n this._myMessagesCount += 1;\r\n\r\n let countString = ((\"(x\").concat(this._myMessagesCount)).concat(\") \");\r\n\r\n let text = this._myOriginalText;\r\n text = countString.concat(text);\r\n this.myLines = text.split(\"\\n\");\r\n }\r\n}\r\n\r\n// Does Not Support:\r\n// - Placeholder like %d and other similar kind of way to build strings\r\n//\r\n// Known Issues:\r\n// - Since the actual call to the browser console is done by the widget, u will not be able to click\r\n// on the browser console source code link (usually on the right of the logged message) to go to the line where \r\n// the console function has been called, since it will always go to the line where \r\n// the console VR widget forwards the call to the browser console\r\nexport class ConsoleVRWidget {\r\n\r\n constructor(engine = Globals.getMainEngine()) {\r\n this._myWidgetFrame = new WidgetFrame(\"C\", 0, engine);\r\n this._myWidgetFrame.registerWidgetVisibleChangedEventListener(this, this._widgetVisibleChanged.bind(this));\r\n\r\n this._myConfig = new ConsoleVRWidgetConfig();\r\n this._myParams = null;\r\n\r\n this._myUI = new ConsoleVRWidgetUI(engine);\r\n\r\n this._myMessages = [];\r\n\r\n this._myOldBrowserConsole = [];\r\n this._myOldConsoleVR = [];\r\n\r\n this._myTypeFilters = [];\r\n for (let key in ConsoleVRWidgetMessageType) {\r\n this._myTypeFilters[ConsoleVRWidgetMessageType[key]] = false;\r\n }\r\n\r\n this._myScrollUp = false;\r\n this._myScrollDown = false;\r\n this._myScrollOffset = 0;\r\n this._myScrollTimer = 0;\r\n this._myScrollThumbstickTimer = 0;\r\n\r\n this._myPulseTimer = 0;\r\n\r\n this._myGamepadScrollEnabled = true;\r\n if (this._myConfig.myGamepadScrollOnlyOnHover) {\r\n this._myGamepadScrollEnabled = false;\r\n }\r\n\r\n this._myErrorEventListener = null;\r\n this._myUnhandledRejectionEventListener = null;\r\n\r\n this._myConsolePrintAddMessageEnabled = true;\r\n this._myConsolePrintAddMessageEnabledReset = false;\r\n this._myTextDirty = false;\r\n\r\n this._myEngine = engine;\r\n\r\n this._myStarted = false;\r\n this._myActive = true;\r\n this._myVisibleBackup = null;\r\n\r\n this._myUnhoverCallbacks = [];\r\n\r\n this._myDestroyed = false;\r\n }\r\n\r\n setVisible(visible) {\r\n if (this._myActive) {\r\n this._myWidgetFrame.setVisible(visible);\r\n } else {\r\n this._myVisibleBackup = visible;\r\n }\r\n }\r\n\r\n isVisible() {\r\n return this._myWidgetFrame.isVisible();\r\n }\r\n\r\n start(parentObject, params) {\r\n this._myLeftGamepad = Globals.getLeftGamepad(this._myEngine);\r\n this._myRightGamepad = Globals.getRightGamepad(this._myEngine);\r\n\r\n this._myParams = params;\r\n\r\n this._myWidgetFrame.start(parentObject, params);\r\n\r\n this._myUI.build(this._myWidgetFrame.getWidgetObject(), this._myConfig, params);\r\n this._myUI.setVisible(this._myWidgetFrame.isVisible());\r\n this._setNotifyIconActive(false);\r\n\r\n this._addListeners();\r\n\r\n this._overrideConsolesFunctions();\r\n\r\n this._myStarted = true;\r\n }\r\n\r\n update(dt) {\r\n if (!this._myActive) return;\r\n\r\n if (this._myConsolePrintAddMessageEnabledReset) {\r\n this._myConsolePrintAddMessageEnabledReset = false;\r\n this._myConsolePrintAddMessageEnabled = true;\r\n }\r\n\r\n this._myWidgetFrame.update(dt);\r\n\r\n if (this._myWidgetFrame.isVisible()) {\r\n if (this._myTextDirty) {\r\n this._updateAllTexts();\r\n }\r\n\r\n this._updateScroll(dt);\r\n }\r\n\r\n this._updateGamepadsExtraActions(dt);\r\n }\r\n\r\n isActive() {\r\n return this._myActive;\r\n }\r\n\r\n setActive(active) {\r\n if (!this._myStarted) return;\r\n\r\n this._myUI.setActive(active);\r\n this._myWidgetFrame.setActive(active);\r\n\r\n if (this._myActive != active) {\r\n if (active) {\r\n this._myActive = active;\r\n if (this._myVisibleBackup != null) {\r\n this.setVisible(false);\r\n this.setVisible(this._myVisibleBackup);\r\n\r\n this._myVisibleBackup = null;\r\n }\r\n } else {\r\n if (this._myVisibleBackup == null) {\r\n this._myVisibleBackup = this.isVisible();\r\n }\r\n\r\n if (this.isVisible()) {\r\n this.setVisible(false);\r\n }\r\n this._myActive = active;\r\n }\r\n\r\n if (active) {\r\n if (this._myParams.myResetToConsoleOriginalFunctionsOnDeactivate || this._myParams.myResetToOverwrittenConsoleFunctionsOnDeactivate) {\r\n this._overrideConsolesFunctions();\r\n } else {\r\n if (this._myParams.myOverrideBrowserConsoleFunctions != OverrideBrowserConsoleFunctions.NONE) {\r\n window.addEventListener(\"error\", this._myErrorEventListener);\r\n window.addEventListener(\"unhandledrejection\", this._myUnhandledRejectionEventListener);\r\n }\r\n }\r\n } else {\r\n window.removeEventListener(\"error\", this._myErrorEventListener);\r\n window.removeEventListener(\"unhandledrejection\", this._myUnhandledRejectionEventListener);\r\n\r\n if (this._myParams.myResetToConsoleOriginalFunctionsOnDeactivate) {\r\n console.log = ConsoleOriginalFunctions.getLog(this._myEngine);\r\n console.error = ConsoleOriginalFunctions.getError(this._myEngine);\r\n console.warn = ConsoleOriginalFunctions.getWarn(this._myEngine);\r\n console.info = ConsoleOriginalFunctions.getInfo(this._myEngine);\r\n console.debug = ConsoleOriginalFunctions.getDebug(this._myEngine);\r\n console.assert = ConsoleOriginalFunctions.getAssert(this._myEngine);\r\n console.clear = ConsoleOriginalFunctions.getClear(this._myEngine);\r\n\r\n if (Globals.getConsoleVR(this._myEngine) != null) {\r\n Globals.getConsoleVR(this._myEngine).log = ConsoleVR.myOriginalLog;\r\n Globals.getConsoleVR(this._myEngine).error = ConsoleVR.myOriginalError;\r\n Globals.getConsoleVR(this._myEngine).warn = ConsoleVR.myOriginalWarn;\r\n Globals.getConsoleVR(this._myEngine).info = ConsoleVR.myOriginalInfo;\r\n Globals.getConsoleVR(this._myEngine).debug = ConsoleVR.myOriginalDebug;\r\n Globals.getConsoleVR(this._myEngine).assert = ConsoleVR.myOriginalAssert;\r\n Globals.getConsoleVR(this._myEngine).clear = ConsoleVR.myOriginalClear;\r\n }\r\n } else if (this._myParams.myResetToOverwrittenConsoleFunctionsOnDeactivate) {\r\n console.log = this._myOldBrowserConsole[ConsoleVRWidgetConsoleFunction.LOG];\r\n console.error = this._myOldBrowserConsole[ConsoleVRWidgetConsoleFunction.ERROR];\r\n console.warn = this._myOldBrowserConsole[ConsoleVRWidgetConsoleFunction.WARN];\r\n console.info = this._myOldBrowserConsole[ConsoleVRWidgetConsoleFunction.INFO];\r\n console.debug = this._myOldBrowserConsole[ConsoleVRWidgetConsoleFunction.DEBUG];\r\n console.assert = this._myOldBrowserConsole[ConsoleVRWidgetConsoleFunction.ASSERT];\r\n console.clear = this._myOldBrowserConsoleClear;\r\n\r\n if (Globals.getConsoleVR(this._myEngine) != null) {\r\n Globals.getConsoleVR(this._myEngine).log = this._myOldConsoleVR[ConsoleVRWidgetConsoleFunction.LOG];\r\n Globals.getConsoleVR(this._myEngine).error = this._myOldConsoleVR[ConsoleVRWidgetConsoleFunction.ERROR];\r\n Globals.getConsoleVR(this._myEngine).warn = this._myOldConsoleVR[ConsoleVRWidgetConsoleFunction.WARN];\r\n Globals.getConsoleVR(this._myEngine).info = this._myOldConsoleVR[ConsoleVRWidgetConsoleFunction.INFO];\r\n Globals.getConsoleVR(this._myEngine).debug = this._myOldConsoleVR[ConsoleVRWidgetConsoleFunction.DEBUG];\r\n Globals.getConsoleVR(this._myEngine).assert = this._myOldConsoleVR[ConsoleVRWidgetConsoleFunction.ASSERT];\r\n Globals.getConsoleVR(this._myEngine).clear = this._myOldConsoleVRClear;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n // This must be done only when all the setup is complete, to avoid issues with other part of the code calling the console and then triggering the console vr while not ready yet\r\n _overrideConsolesFunctions() {\r\n this._myOldBrowserConsole[ConsoleVRWidgetConsoleFunction.LOG] = console.log;\r\n this._myOldBrowserConsole[ConsoleVRWidgetConsoleFunction.ERROR] = console.error;\r\n this._myOldBrowserConsole[ConsoleVRWidgetConsoleFunction.WARN] = console.warn;\r\n this._myOldBrowserConsole[ConsoleVRWidgetConsoleFunction.INFO] = console.info;\r\n this._myOldBrowserConsole[ConsoleVRWidgetConsoleFunction.DEBUG] = console.debug;\r\n this._myOldBrowserConsole[ConsoleVRWidgetConsoleFunction.ASSERT] = console.assert;\r\n this._myOldBrowserConsoleClear = console.clear;\r\n\r\n if (this._myParams.myOverrideBrowserConsoleFunctions != OverrideBrowserConsoleFunctions.NONE) {\r\n\r\n if (this._myParams.myOverrideBrowserConsoleFunctions == OverrideBrowserConsoleFunctions.ALL) {\r\n console.log = this._consolePrint.bind(this, ConsoleVRWidgetConsoleFunction.LOG, ConsoleVRWidgetSender.BROWSER_CONSOLE);\r\n }\r\n\r\n console.error = this._consolePrint.bind(this, ConsoleVRWidgetConsoleFunction.ERROR, ConsoleVRWidgetSender.BROWSER_CONSOLE);\r\n console.warn = this._consolePrint.bind(this, ConsoleVRWidgetConsoleFunction.WARN, ConsoleVRWidgetSender.BROWSER_CONSOLE);\r\n\r\n if (this._myParams.myOverrideBrowserConsoleFunctions == OverrideBrowserConsoleFunctions.ALL) {\r\n console.info = this._consolePrint.bind(this, ConsoleVRWidgetConsoleFunction.INFO, ConsoleVRWidgetSender.BROWSER_CONSOLE);\r\n console.debug = this._consolePrint.bind(this, ConsoleVRWidgetConsoleFunction.DEBUG, ConsoleVRWidgetSender.BROWSER_CONSOLE);\r\n }\r\n\r\n console.assert = this._consolePrint.bind(this, ConsoleVRWidgetConsoleFunction.ASSERT, ConsoleVRWidgetSender.BROWSER_CONSOLE);\r\n\r\n console.clear = this._clearConsole.bind(this, true, ConsoleVRWidgetSender.BROWSER_CONSOLE);\r\n\r\n this._myErrorEventListener = function (errorEvent) {\r\n if (errorEvent.error != null) {\r\n this._consolePrint(ConsoleVRWidgetConsoleFunction.ERROR, ConsoleVRWidgetSender.WINDOW, \"Uncaught\", errorEvent.error.stack);\r\n } else {\r\n this._consolePrint(ConsoleVRWidgetConsoleFunction.ERROR, ConsoleVRWidgetSender.WINDOW, \"Uncaught\", errorEvent.message);\r\n }\r\n }.bind(this);\r\n\r\n this._myUnhandledRejectionEventListener = function (errorEvent) {\r\n this._consolePrint(ConsoleVRWidgetConsoleFunction.ERROR, ConsoleVRWidgetSender.WINDOW, \"Uncaught (in promise)\", errorEvent.reason);\r\n }.bind(this);\r\n\r\n window.addEventListener(\"error\", this._myErrorEventListener);\r\n window.addEventListener(\"unhandledrejection\", this._myUnhandledRejectionEventListener);\r\n }\r\n\r\n this._myOldConsoleVR[ConsoleVRWidgetConsoleFunction.LOG] = Globals.getConsoleVR(this._myEngine).log;\r\n this._myOldConsoleVR[ConsoleVRWidgetConsoleFunction.ERROR] = Globals.getConsoleVR(this._myEngine).error;\r\n this._myOldConsoleVR[ConsoleVRWidgetConsoleFunction.WARN] = Globals.getConsoleVR(this._myEngine).warn;\r\n this._myOldConsoleVR[ConsoleVRWidgetConsoleFunction.INFO] = Globals.getConsoleVR(this._myEngine).info;\r\n this._myOldConsoleVR[ConsoleVRWidgetConsoleFunction.DEBUG] = Globals.getConsoleVR(this._myEngine).debug;\r\n this._myOldConsoleVR[ConsoleVRWidgetConsoleFunction.ASSERT] = Globals.getConsoleVR(this._myEngine).assert;\r\n this._myOldConsoleVRClear = Globals.getConsoleVR(this._myEngine).clear;\r\n\r\n Globals.getConsoleVR(this._myEngine).log = this._consolePrint.bind(this, ConsoleVRWidgetConsoleFunction.LOG, ConsoleVRWidgetSender.CONSOLE_VR);\r\n Globals.getConsoleVR(this._myEngine).error = this._consolePrint.bind(this, ConsoleVRWidgetConsoleFunction.ERROR, ConsoleVRWidgetSender.CONSOLE_VR);\r\n Globals.getConsoleVR(this._myEngine).warn = this._consolePrint.bind(this, ConsoleVRWidgetConsoleFunction.WARN, ConsoleVRWidgetSender.CONSOLE_VR);\r\n Globals.getConsoleVR(this._myEngine).info = this._consolePrint.bind(this, ConsoleVRWidgetConsoleFunction.INFO, ConsoleVRWidgetSender.CONSOLE_VR);\r\n Globals.getConsoleVR(this._myEngine).debug = this._consolePrint.bind(this, ConsoleVRWidgetConsoleFunction.DEBUG, ConsoleVRWidgetSender.CONSOLE_VR);\r\n Globals.getConsoleVR(this._myEngine).assert = this._consolePrint.bind(this, ConsoleVRWidgetConsoleFunction.ASSERT, ConsoleVRWidgetSender.CONSOLE_VR);\r\n Globals.getConsoleVR(this._myEngine).clear = this._clearConsole.bind(this, true, ConsoleVRWidgetSender.CONSOLE_VR);\r\n }\r\n\r\n // Text section\r\n\r\n _updateText(messageType) {\r\n let consoleText = \"\";\r\n\r\n if (!this._myTypeFilters[messageType]) {\r\n let linesCount = 0;\r\n let i = this._myMessages.length - 1;\r\n\r\n let scrollLinesToSkip = Math.round(this._myScrollOffset);\r\n\r\n while (i >= 0 && linesCount < this._myConfig.myMaxLines) {\r\n let message = this._myMessages[i];\r\n\r\n // Skip filtered messages\r\n if (this._myTypeFilters[message.myType]) {\r\n i -= 1;\r\n continue;\r\n }\r\n\r\n let messageLines = message.myLines.length;\r\n\r\n // Compute line to skip due to scroll offset\r\n let linesToSkip = 0;\r\n if (scrollLinesToSkip > 0) {\r\n let additionalEmptyLines = 0;\r\n if (i != this._myMessages.length - 1) {\r\n additionalEmptyLines = this._myConfig.myLinesBetweenMessages;\r\n }\r\n\r\n if (scrollLinesToSkip >= messageLines + additionalEmptyLines) { // + empty lines between messages\r\n scrollLinesToSkip -= messageLines + additionalEmptyLines;\r\n linesToSkip = messageLines + additionalEmptyLines;\r\n } else {\r\n linesToSkip = scrollLinesToSkip;\r\n scrollLinesToSkip = 0;\r\n }\r\n }\r\n\r\n // Add empty lines between messages\r\n if (i != this._myMessages.length - 1) {\r\n let emptyLinesToSkip = this._myConfig.myLinesBetweenMessages - Math.max(this._myConfig.myLinesBetweenMessages - linesToSkip, 0);\r\n let emptyLinesToShow = this._myConfig.myLinesBetweenMessages - emptyLinesToSkip;\r\n if (linesCount + emptyLinesToShow > this._myConfig.myMaxLines) {\r\n emptyLinesToShow = this._myMaxLines - linesCount;\r\n }\r\n\r\n for (let j = 0; j < emptyLinesToShow; j++) {\r\n consoleText = (\"\\n\").concat(consoleText);\r\n }\r\n\r\n linesCount += emptyLinesToShow;\r\n linesToSkip -= emptyLinesToSkip;\r\n }\r\n\r\n // Computing the number of message lines to show\r\n let linesToShow = messageLines - linesToSkip;\r\n if (linesCount + linesToShow > this._myConfig.myMaxLines) {\r\n linesToShow = this._myConfig.myMaxLines - linesCount;\r\n }\r\n\r\n if (linesToShow > 0) {\r\n if (message.myType == messageType) {\r\n // If the message is the same type of this message text component, add the message lines\r\n\r\n let linesToPrint = message.myLines.slice(messageLines - linesToShow - linesToSkip, messageLines - linesToSkip);\r\n let text = linesToPrint.join(\"\\n\");\r\n consoleText = (text.concat(\"\\n\")).concat(consoleText);\r\n\r\n linesCount += linesToShow;\r\n } else {\r\n // Otherwise add empty lines, so that the text component with the correct type will have space to show this message\r\n\r\n for (let j = 0; j < linesToShow; j++) {\r\n consoleText = (\"\\n\").concat(consoleText);\r\n }\r\n\r\n linesCount += linesToShow;\r\n }\r\n }\r\n\r\n i -= 1;\r\n }\r\n }\r\n\r\n consoleText = this._myConfig.myMessagesTextStartString.concat(consoleText);\r\n\r\n this._myUI.myMessagesTextComponents[messageType].text = consoleText;\r\n }\r\n\r\n _consolePrint(consoleFunction, sender, ...args) {\r\n if (!this._myActive && sender == ConsoleVRWidgetSender.CONSOLE_VR) {\r\n this._deactivateFix();\r\n }\r\n\r\n switch (sender) {\r\n case ConsoleVRWidgetSender.BROWSER_CONSOLE:\r\n this._myOldBrowserConsole[consoleFunction].apply(console, args);\r\n break;\r\n case ConsoleVRWidgetSender.CONSOLE_VR:\r\n this._myOldConsoleVR[consoleFunction].apply(Globals.getConsoleVR(this._myEngine), args);\r\n break;\r\n default:\r\n this._myOldBrowserConsole[consoleFunction].apply(console, args);\r\n break;\r\n }\r\n\r\n if (this._myActive && this._myConsolePrintAddMessageEnabled && (consoleFunction != ConsoleVRWidgetConsoleFunction.ASSERT || (args.length > 0 && !args[0]))) {\r\n this._myTextDirty = true;\r\n this._pulseGamepad();\r\n\r\n try {\r\n let message = this._argsToMessage(consoleFunction, ...args);\r\n this._addMessage(message);\r\n\r\n if (this._myMessages.length >= this._myConfig.myMaxMessages + this._myConfig.myMaxMessagesDeletePad) {\r\n this._myMessages = this._myMessages.slice(this._myMessages.length - this._myConfig.myMaxMessages);\r\n this._clampScrollOffset();\r\n }\r\n } catch (error) {\r\n this._myConsolePrintAddMessageEnabled = false;\r\n this._myConsolePrintAddMessageEnabledReset = true;\r\n\r\n try {\r\n let errorMessage = \"An error occurred while trying to add a new message to the Console VR Widget\";\r\n let message = new ConsoleVRWidgetMessage(ConsoleVRWidgetMessageType.ERROR, [errorMessage]);\r\n this._myMessages.push(message);\r\n ConsoleOriginalFunctions.error(this._myEngine, errorMessage);\r\n } catch (anotherError) {\r\n // Do nothing\r\n }\r\n\r\n throw error;\r\n }\r\n }\r\n }\r\n\r\n _argsToMessage(consoleFunction, ...args) {\r\n if (consoleFunction == ConsoleVRWidgetConsoleFunction.ASSERT) {\r\n args = args.slice(1);\r\n args.splice(0, 0, this._myConfig.myAssertStartString);\r\n }\r\n\r\n let messageType = this._consoleFunctionToMessageType(consoleFunction);\r\n\r\n let formattedText = this._formatArgs(...args);\r\n\r\n let lines = this._splitLongLines(formattedText);\r\n\r\n if (messageType == ConsoleVRWidgetMessageType.INFO) {\r\n messageType = ConsoleVRWidgetMessageType.LOG;\r\n } else if (messageType == ConsoleVRWidgetMessageType.EXCEPTION || messageType == ConsoleVRWidgetMessageType.ASSERT) {\r\n messageType = ConsoleVRWidgetMessageType.ERROR;\r\n }\r\n\r\n\r\n let message = new ConsoleVRWidgetMessage(messageType, lines);\r\n\r\n return message;\r\n }\r\n\r\n _consoleFunctionToMessageType(consoleFunction) {\r\n let messageType = ConsoleVRWidgetMessageType.LOG;\r\n\r\n if (consoleFunction < ConsoleVRWidgetConsoleFunction.INFO) {\r\n messageType = consoleFunction;\r\n } else if (consoleFunction == ConsoleVRWidgetConsoleFunction.INFO) {\r\n messageType = ConsoleVRWidgetMessageType.LOG;\r\n } else {\r\n messageType = ConsoleVRWidgetMessageType.ERROR;\r\n }\r\n\r\n return messageType;\r\n }\r\n\r\n // Here the formatting using placeholder like %d could be implemented in the future\r\n _formatArgs(...args) {\r\n let stringifiedArgs = [];\r\n for (let i = 0; i < args.length; i++) {\r\n if (args[i] === undefined) {\r\n stringifiedArgs.push(\"undefined\");\r\n } else {\r\n stringifiedArgs.push(this._stringifyItem(args[i]));\r\n }\r\n }\r\n\r\n let formattedString = stringifiedArgs.join(\" \");\r\n\r\n return formattedString;\r\n }\r\n\r\n _stringifyItem(item) {\r\n let stringifiedItem = null;\r\n\r\n if (item instanceof Error) {\r\n stringifiedItem = item.stack;\r\n } else if (typeof item == \"object\") {\r\n let linesBetweenItems = 2;\r\n\r\n try {\r\n stringifiedItem = JSON.stringify(item, this._jsonReplacer.bind(this), linesBetweenItems);\r\n } catch (error) {\r\n let cache = new WeakSet();\r\n\r\n stringifiedItem = JSON.stringify(item, function (key, value) {\r\n if (value != null && typeof value == \"object\") {\r\n if (cache.has(value)) {\r\n return \"\"; // Try to avoid circular reference, a repeated object will be caught in this check too sadly\r\n }\r\n cache.add(value);\r\n }\r\n\r\n return this._jsonReplacer(key, value);\r\n }.bind(this), linesBetweenItems);\r\n }\r\n\r\n stringifiedItem = stringifiedItem.replaceAll(\"\\\"[\", \"[\");\r\n stringifiedItem = stringifiedItem.replaceAll(\"'[\", \"[\");\r\n stringifiedItem = stringifiedItem.replaceAll(\"]\\\"\", \"]\");\r\n stringifiedItem = stringifiedItem.replaceAll(\"]'\", \"]\");\r\n } else {\r\n stringifiedItem = item;\r\n }\r\n\r\n return stringifiedItem;\r\n }\r\n\r\n _splitLongLines(messageText) {\r\n let linesToSplit = messageText.split(\"\\n\");\r\n let lines = [];\r\n for (let i = 0; i < linesToSplit.length; i++) {\r\n let lineToSplit = linesToSplit[i];\r\n\r\n if (lineToSplit.length > this._myConfig.myMaxCharactersPerLine) {\r\n let spacesAtStart = this._getSpacesAtStart(lineToSplit);\r\n let spaceToAdd = this._myConfig.myTabString.concat(spacesAtStart);\r\n let lineSplits = 0;\r\n\r\n while (lineToSplit.length > this._myConfig.myMaxCharactersPerLine && lineSplits < this._myConfig.myMaxLineSplits) {\r\n let firstSub = lineToSplit.substr(0, this._myConfig.myMaxCharactersPerLine - 1);\r\n let secondSub = lineToSplit.substr(this._myConfig.myMaxCharactersPerLine - 1);\r\n secondSub = spaceToAdd.concat(secondSub);\r\n\r\n lines.push(firstSub);\r\n\r\n lineToSplit = secondSub;\r\n lineSplits++;\r\n }\r\n lines.push(lineToSplit);\r\n } else {\r\n lines.push(lineToSplit);\r\n }\r\n }\r\n\r\n return lines;\r\n }\r\n\r\n _getSpacesAtStart(text) {\r\n let spaces = \"\";\r\n let i = 0;\r\n\r\n while (i < text.length && text[i] == \" \") {\r\n spaces = spaces.concat(\" \");\r\n i++;\r\n }\r\n\r\n return spaces;\r\n }\r\n\r\n _addMessage(message) {\r\n let hasSameInfoAsPrev = false;\r\n if (this._myMessages.length > 0) {\r\n let lastMessage = this._myMessages[this._myMessages.length - 1];\r\n if (lastMessage.hasSameInfo(message)) {\r\n lastMessage.increaseCount();\r\n hasSameInfoAsPrev = true;\r\n }\r\n }\r\n\r\n if (!hasSameInfoAsPrev) {\r\n this._myMessages.push(message);\r\n }\r\n\r\n this._adjustScrollOffsetAfterMessageAdded(message, hasSameInfoAsPrev);\r\n this._updateNotifyIcon(message);\r\n }\r\n\r\n // If you have scrolled, new messages does not move the scroll position\r\n _adjustScrollOffsetAfterMessageAdded(message, hasSameInfoAsPrev) {\r\n if (!hasSameInfoAsPrev && !(this._myTypeFilters[message.myType]) && this._myScrollOffset > 0) {\r\n this._myScrollOffset += message.myLines.length + this._myConfig.myLinesBetweenMessages;\r\n }\r\n }\r\n\r\n _updateAllTexts() {\r\n if (this._myWidgetFrame.isVisible()) {\r\n for (let key in ConsoleVRWidgetMessageType) {\r\n this._updateText(ConsoleVRWidgetMessageType[key]);\r\n }\r\n\r\n this._myTextDirty = false;\r\n }\r\n }\r\n\r\n _updateNotifyIcon(message) {\r\n if (!(this._myTypeFilters[message.myType]) && this._myScrollOffset > 0) {\r\n this._setNotifyIconActive(true);\r\n }\r\n }\r\n\r\n _updateScroll(dt) {\r\n if (this._myScrollUp) {\r\n this._myScrollTimer += dt;\r\n while (this._myScrollTimer > this._myConfig.myScrollDelay) {\r\n this._myScrollTimer -= this._myConfig.myScrollDelay;\r\n this._myScrollOffset += this._myConfig.myScrollAmount;\r\n }\r\n } else if (this._myScrollDown) {\r\n this._myScrollTimer += dt;\r\n while (this._myScrollTimer > this._myConfig.myScrollDelay) {\r\n this._myScrollTimer -= this._myConfig.myScrollDelay;\r\n this._myScrollOffset -= this._myConfig.myScrollAmount;\r\n }\r\n }\r\n\r\n this._clampScrollOffset();\r\n\r\n if (this._myScrollUp || this._myScrollDown) {\r\n this._updateAllTexts();\r\n }\r\n\r\n if (this._myScrollOffset == 0) {\r\n this._setNotifyIconActive(false);\r\n }\r\n }\r\n\r\n _clampScrollOffset() {\r\n let maxScroll = this._getMaxScrollOffset();\r\n this._myScrollOffset = Math.pp_clamp(this._myScrollOffset, 0, maxScroll);\r\n }\r\n\r\n _getMaxScrollOffset() {\r\n return Math.max(this._getLinesCount() - this._myConfig.myMaxLines, 0);\r\n }\r\n\r\n _getLinesCount() {\r\n let linesCount = 0;\r\n for (let message of this._myMessages) {\r\n if (!this._myTypeFilters[message.myType]) {\r\n linesCount += message.myLines.length + this._myConfig.myLinesBetweenMessages;\r\n }\r\n }\r\n linesCount -= this._myConfig.myLinesBetweenMessages; // Empty line is added only between messages\r\n linesCount = Math.max(linesCount, 0);\r\n\r\n return linesCount;\r\n }\r\n\r\n // Listener section\r\n\r\n _addListeners() {\r\n let ui = this._myUI;\r\n\r\n for (let key in ConsoleVRWidgetMessageType) {\r\n let cursorTarget = ui.myFilterButtonsCursorTargetComponents[ConsoleVRWidgetMessageType[key]];\r\n let backgroundMaterial = ui.myFilterButtonsBackgroundComponents[ConsoleVRWidgetMessageType[key]].material;\r\n let textMaterial = ui.myFilterButtonsTextComponents[ConsoleVRWidgetMessageType[key]].material;\r\n\r\n cursorTarget.onSingleClick.add(this._toggleFilter.bind(this, ConsoleVRWidgetMessageType[key], textMaterial), { id: this });\r\n cursorTarget.onDoubleClick.add(this._filterAllButOne.bind(this, ConsoleVRWidgetMessageType[key], textMaterial), { id: this });\r\n cursorTarget.onTripleClick.add(this._resetFilters.bind(this, ConsoleVRWidgetMessageType[key]), { id: this });\r\n cursorTarget.onHover.add(this._filterHover.bind(this, ConsoleVRWidgetMessageType[key], backgroundMaterial), { id: this });\r\n cursorTarget.onUnhover.add(this._filterUnhover.bind(this, ConsoleVRWidgetMessageType[key], backgroundMaterial), { id: this });\r\n\r\n this._myUnhoverCallbacks.push(this._filterUnhover.bind(this, ConsoleVRWidgetMessageType[key], backgroundMaterial));\r\n }\r\n\r\n {\r\n let cursorTarget = ui.myClearButtonCursorTargetComponent;\r\n let backgroundMaterial = ui.myClearButtonBackgroundComponent.material;\r\n\r\n cursorTarget.onClick.add(this._clearConsole.bind(this, false, null), { id: this });\r\n cursorTarget.onHover.add(this._genericHover.bind(this, backgroundMaterial), { id: this });\r\n cursorTarget.onUnhover.add(this._genericUnhover.bind(this, backgroundMaterial), { id: this });\r\n\r\n this._myUnhoverCallbacks.push(this._genericUnhover.bind(this, backgroundMaterial));\r\n }\r\n\r\n {\r\n let cursorTarget = ui.myUpButtonCursorTargetComponent;\r\n let backgroundMaterial = ui.myUpButtonBackgroundComponent.material;\r\n\r\n cursorTarget.onDoubleClick.add(this._instantScrollUp.bind(this, true), { id: this });\r\n cursorTarget.onDown.add(this._setScrollUp.bind(this, true), { id: this });\r\n cursorTarget.onDownOnHover.add(this._setScrollUp.bind(this, true), { id: this });\r\n cursorTarget.onUp.add(this._setScrollUp.bind(this, false), { id: this });\r\n cursorTarget.onUnhover.add(this._setScrollUp.bind(this, false), { id: this });\r\n cursorTarget.onHover.add(this._genericHover.bind(this, backgroundMaterial), { id: this });\r\n cursorTarget.onUnhover.add(this._genericUnhover.bind(this, backgroundMaterial), { id: this });\r\n\r\n this._myUnhoverCallbacks.push(this._genericUnhover.bind(this, backgroundMaterial));\r\n }\r\n\r\n {\r\n let cursorTarget = ui.myDownButtonCursorTargetComponent;\r\n let backgroundMaterial = ui.myDownButtonBackgroundComponent.material;\r\n\r\n cursorTarget.onDoubleClick.add(this._instantScrollDown.bind(this), { id: this });\r\n cursorTarget.onDown.add(this._setScrollDown.bind(this, true), { id: this });\r\n cursorTarget.onDownOnHover.add(this._setScrollDown.bind(this, true), { id: this });\r\n cursorTarget.onUp.add(this._setScrollDown.bind(this, false), { id: this });\r\n cursorTarget.onUnhover.add(this._setScrollDown.bind(this, false), { id: this });\r\n cursorTarget.onHover.add(this._genericHover.bind(this, backgroundMaterial), { id: this });\r\n cursorTarget.onUnhover.add(this._genericUnhover.bind(this, backgroundMaterial), { id: this });\r\n\r\n this._myUnhoverCallbacks.push(this._genericUnhover.bind(this, backgroundMaterial));\r\n }\r\n\r\n {\r\n let cursorTarget = ui.myNotifyIconCursorTargetComponent;\r\n let backgroundMaterial = ui.myNotifyIconBackgroundComponent.material;\r\n\r\n cursorTarget.onClick.add(this._instantScrollDown.bind(this), { id: this });\r\n cursorTarget.onHover.add(this._genericHover.bind(this, backgroundMaterial), { id: this });\r\n cursorTarget.onUnhover.add(this._notifyIconUnhover.bind(this), { id: this });\r\n\r\n this._myUnhoverCallbacks.push(this._notifyIconUnhover.bind(this));\r\n }\r\n\r\n ui.myPointerCursorTargetComponent.onHover.add(this._setGamepadScrollEnabled.bind(this, true), { id: this });\r\n ui.myPointerCursorTargetComponent.onUnhover.add(this._setGamepadScrollEnabled.bind(this, false), { id: this });\r\n\r\n this._myUnhoverCallbacks.push(this._setGamepadScrollEnabled.bind(this, false));\r\n }\r\n\r\n _resetFilters(messageType) {\r\n if (this._myWidgetFrame.isVisible()) {\r\n for (let key in ConsoleVRWidgetMessageType) {\r\n let backgroundMaterial = this._myUI.myFilterButtonsBackgroundComponents[ConsoleVRWidgetMessageType[key]].material;\r\n let filterTextMaterial = this._myUI.myFilterButtonsTextComponents[ConsoleVRWidgetMessageType[key]].material;\r\n\r\n this._myTypeFilters[ConsoleVRWidgetMessageType[key]] = false;\r\n filterTextMaterial.color = this._myConfig.myMessageTypeColors[ConsoleVRWidgetMessageType[key]];\r\n if (ConsoleVRWidgetMessageType[key] != messageType) {\r\n backgroundMaterial.color = this._myConfig.myBackgroundColor;\r\n }\r\n }\r\n\r\n this._clampScrollOffset();\r\n this._updateAllTexts();\r\n }\r\n }\r\n\r\n _filterAllButOne(messageType) {\r\n if (this._myWidgetFrame.isVisible()) {\r\n for (let key in ConsoleVRWidgetMessageType) {\r\n let backgroundMaterial = this._myUI.myFilterButtonsBackgroundComponents[ConsoleVRWidgetMessageType[key]].material;\r\n let filterTextMaterial = this._myUI.myFilterButtonsTextComponents[ConsoleVRWidgetMessageType[key]].material;\r\n if (ConsoleVRWidgetMessageType[key] != messageType) {\r\n this._myTypeFilters[ConsoleVRWidgetMessageType[key]] = true;\r\n backgroundMaterial.color = this._myConfig.myFilterButtonDisabledBackgroundColor;\r\n filterTextMaterial.color = this._myConfig.myFilterButtonDisabledTextColor;\r\n } else {\r\n this._myTypeFilters[ConsoleVRWidgetMessageType[key]] = false;\r\n filterTextMaterial.color = this._myConfig.myMessageTypeColors[messageType];\r\n }\r\n }\r\n\r\n this._clampScrollOffset();\r\n this._updateAllTexts();\r\n }\r\n }\r\n\r\n _toggleFilter(messageType, textMaterial) {\r\n if (this._myWidgetFrame.isVisible()) {\r\n\r\n this._myTypeFilters[messageType] = !this._myTypeFilters[messageType];\r\n if (this._myTypeFilters[messageType]) {\r\n textMaterial.color = this._myConfig.myFilterButtonDisabledTextColor;\r\n } else {\r\n textMaterial.color = this._myConfig.myMessageTypeColors[messageType];\r\n }\r\n\r\n this._clampScrollOffset();\r\n this._updateAllTexts();\r\n }\r\n }\r\n\r\n _clearConsole(codeDrivenClear = false, sender = null) {\r\n if (this._myWidgetFrame.isVisible() || codeDrivenClear) {\r\n this._myMessages = [];\r\n this._clampScrollOffset();\r\n this._updateAllTexts();\r\n\r\n if (codeDrivenClear) {\r\n switch (sender) {\r\n case ConsoleVRWidgetSender.BROWSER_CONSOLE:\r\n this._myOldBrowserConsoleClear.apply(console);\r\n break;\r\n case ConsoleVRWidgetSender.CONSOLE_VR:\r\n this._myOldConsoleVRClear.apply(Globals.getConsoleVR(this._myEngine));\r\n break;\r\n default:\r\n break;\r\n }\r\n } else if (this._myConfig.myClearBrowserConsoleWhenClearPressed) {\r\n ConsoleOriginalFunctions.clear(this._myEngine);\r\n }\r\n }\r\n }\r\n\r\n _setScrollUp(value) {\r\n if (this._myWidgetFrame.isVisible() || !value) {\r\n if (value) {\r\n this._myScrollTimer = 0;\r\n }\r\n\r\n this._myScrollUp = value;\r\n }\r\n }\r\n\r\n _setScrollDown(value) {\r\n if (this._myWidgetFrame.isVisible() || !value) {\r\n if (value) {\r\n this._myScrollTimer = 0;\r\n }\r\n\r\n this._myScrollDown = value;\r\n }\r\n }\r\n\r\n _instantScrollUp() {\r\n if (this._myWidgetFrame.isVisible()) {\r\n this._myScrollOffset = this._getMaxScrollOffset();\r\n this._updateAllTexts();\r\n }\r\n }\r\n\r\n _instantScrollDown() {\r\n if (this._myWidgetFrame.isVisible()) {\r\n this._myScrollOffset = 0;\r\n this._setNotifyIconActive(false);\r\n this._updateAllTexts();\r\n }\r\n }\r\n\r\n _setNotifyIconActive(active) {\r\n this._myUI.myNotifyIconPanel.pp_setActive(active && this._myWidgetFrame.isVisible());\r\n }\r\n\r\n _notifyIconUnhover() {\r\n let material = this._myUI.myNotifyIconBackgroundComponent.material;\r\n material.color = this._myConfig.myNotifyIconColor;\r\n }\r\n\r\n _filterHover(messageType, material) {\r\n this._genericHover(material);\r\n }\r\n\r\n _filterUnhover(messageType, material) {\r\n if (this._myTypeFilters[messageType]) {\r\n material.color = this._myConfig.myFilterButtonDisabledBackgroundColor;\r\n } else {\r\n material.color = this._myConfig.myBackgroundColor;\r\n }\r\n }\r\n\r\n _genericHover(material) {\r\n material.color = this._myConfig.myButtonHoverColor;\r\n }\r\n\r\n _genericUnhover(material) {\r\n material.color = this._myConfig.myBackgroundColor;\r\n }\r\n\r\n // Gamepad section\r\n\r\n _updateGamepadsExtraActions(dt) {\r\n if (this._myLeftGamepad && this._myRightGamepad) {\r\n if ((this._myLeftGamepad.getButtonInfo(GamepadButtonID.THUMBSTICK).isPressStart() && this._myRightGamepad.getButtonInfo(GamepadButtonID.THUMBSTICK).isPressed()) ||\r\n (this._myRightGamepad.getButtonInfo(GamepadButtonID.THUMBSTICK).isPressStart() && this._myLeftGamepad.getButtonInfo(GamepadButtonID.THUMBSTICK).isPressed())) {\r\n this._toggleVisibility();\r\n }\r\n\r\n this._myPulseTimer = Math.max(this._myPulseTimer - dt, 0);\r\n\r\n this._updateScrollWithThumbstick(dt);\r\n }\r\n }\r\n\r\n _toggleVisibility() {\r\n this._myWidgetFrame.toggleVisibility();\r\n }\r\n\r\n _widgetVisibleChanged(visible) {\r\n this._myUI.setVisible(visible);\r\n\r\n for (const unhoverCallback of this._myUnhoverCallbacks) {\r\n unhoverCallback();\r\n }\r\n\r\n if (visible) {\r\n this._updateAllTexts();\r\n }\r\n }\r\n\r\n _updateScrollWithThumbstick(dt) {\r\n if (this._myWidgetFrame.isVisible() && this._myGamepadScrollEnabled) {\r\n let axes = vec2_create(0, 0);\r\n if (this._myConfig.myScrollThumbstickHandedness == ToolHandedness.LEFT) {\r\n axes = this._myLeftGamepad.getAxesInfo(GamepadAxesID.THUMBSTICK).myAxes;\r\n } else if (this._myConfig.myScrollThumbstickHandedness == ToolHandedness.RIGHT) {\r\n axes = this._myRightGamepad.getAxesInfo(GamepadAxesID.THUMBSTICK).myAxes;\r\n }\r\n\r\n if (Math.abs(axes[1]) > this._myConfig.myScrollThumbstickMinThreshold) {\r\n this._myScrollThumbstickTimer += dt;\r\n\r\n while (this._myScrollThumbstickTimer > this._myConfig.myScrollThumbstickDelay) {\r\n this._myScrollThumbstickTimer -= this._myConfig.myScrollThumbstickDelay;\r\n\r\n let normalizedScrollAmount = (Math.abs(axes[1]) - this._myConfig.myScrollThumbstickMinThreshold) / (1 - this._myConfig.myScrollThumbstickMinThreshold);\r\n this._myScrollOffset += Math.sign(axes[1]) * normalizedScrollAmount * this._myConfig.myScrollThumbstickAmount;\r\n }\r\n\r\n this._clampScrollOffset();\r\n this._updateAllTexts();\r\n } else {\r\n this._myScrollThumbstickTimer = 0;\r\n }\r\n }\r\n }\r\n\r\n _pulseGamepad() {\r\n if (this._myLeftGamepad && this._myRightGamepad) {\r\n let pulseType = this._myParams.myPulseOnNewMessage;\r\n let pulseEnabled = pulseType == ConsoleVRWidgetPulseOnNewMessage.ALWAYS || (!this._myWidgetFrame.isVisible() && pulseType == ConsoleVRWidgetPulseOnNewMessage.WHEN_HIDDEN);\r\n if (pulseEnabled && this._myPulseTimer == 0) {\r\n if (this._myParams.myHandedness == ToolHandedness.RIGHT) {\r\n this._myRightGamepad.pulse(this._myConfig.myPulseIntensity, this._myConfig.myPulseDuration);\r\n } else {\r\n this._myLeftGamepad.pulse(this._myConfig.myPulseIntensity, this._myConfig.myPulseDuration);\r\n }\r\n this._myPulseTimer = this._myConfig.myPulseDelay;\r\n }\r\n }\r\n }\r\n\r\n _isSimpleArray(array) {\r\n if (this._isSpecialSimpleArray(array)) {\r\n return true;\r\n } else if (Array.isArray(array)) {\r\n let builtInArray = true;\r\n for (let element of array) {\r\n if (element instanceof Object) {\r\n builtInArray = false;\r\n break;\r\n }\r\n }\r\n\r\n return builtInArray;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n _isSpecialSimpleArray(item) {\r\n return item && item.constructor &&\r\n (\r\n item.constructor.name == \"Uint8ClampedArray\" ||\r\n item.constructor.name == \"Uint8Array\" ||\r\n item.constructor.name == \"Uint16Array\" ||\r\n item.constructor.name == \"Uint32Array\" ||\r\n item.constructor.name == \"Int8Array\" ||\r\n item.constructor.name == \"Int16Array\" ||\r\n item.constructor.name == \"Int32Array\" ||\r\n item.constructor.name == \"Float32Array\" ||\r\n item.constructor.name == \"Float64Array\"\r\n );\r\n }\r\n\r\n _setGamepadScrollEnabled(enabled) {\r\n this._myGamepadScrollEnabled = enabled;\r\n\r\n if (!this._myConfig.myGamepadScrollOnlyOnHover) {\r\n this._myGamepadScrollEnabled = true;\r\n }\r\n }\r\n\r\n _jsonReplacer(key, value) {\r\n if (value instanceof Map) {\r\n return Array.from(value.entries());\r\n } else if (this._isSimpleArray(value)) {\r\n let array = value;\r\n if (this._isSpecialSimpleArray(array)) {\r\n let arrayCopy = []; // Special arrays like Float32Array do not print like Array\r\n for (let i = 0; i < array.length; i++) {\r\n arrayCopy[i] = array[i];\r\n }\r\n\r\n array = arrayCopy;\r\n }\r\n\r\n let stringifiedArray = JSON.stringify(array);\r\n stringifiedArray = stringifiedArray.split(\",\").join(\", \");\r\n return stringifiedArray;\r\n } else {\r\n return value;\r\n }\r\n }\r\n\r\n _deactivateFix() {\r\n if (this._myParams.myResetToConsoleOriginalFunctionsOnDeactivate || this._myParams.myResetToOverwrittenConsoleFunctionsOnDeactivate) {\r\n if (this._myParams.myResetToConsoleOriginalFunctionsOnDeactivate) {\r\n Globals.getConsoleVR(this._myEngine).log = ConsoleVR.myOriginalLog;\r\n Globals.getConsoleVR(this._myEngine).error = ConsoleVR.myOriginalError;\r\n Globals.getConsoleVR(this._myEngine).warn = ConsoleVR.myOriginalWarn;\r\n Globals.getConsoleVR(this._myEngine).info = ConsoleVR.myOriginalInfo;\r\n Globals.getConsoleVR(this._myEngine).debug = ConsoleVR.myOriginalDebug;\r\n Globals.getConsoleVR(this._myEngine).assert = ConsoleVR.myOriginalAssert;\r\n Globals.getConsoleVR(this._myEngine).clear = ConsoleVR.myOriginalClear;\r\n } else if (this._myParams.myResetToOverwrittenConsoleFunctionsOnDeactivate) {\r\n Globals.getConsoleVR(this._myEngine).log = this._myOldConsoleVR[ConsoleVRWidgetConsoleFunction.LOG];\r\n Globals.getConsoleVR(this._myEngine).error = this._myOldConsoleVR[ConsoleVRWidgetConsoleFunction.ERROR];\r\n Globals.getConsoleVR(this._myEngine).warn = this._myOldConsoleVR[ConsoleVRWidgetConsoleFunction.WARN];\r\n Globals.getConsoleVR(this._myEngine).info = this._myOldConsoleVR[ConsoleVRWidgetConsoleFunction.INFO];\r\n Globals.getConsoleVR(this._myEngine).debug = this._myOldConsoleVR[ConsoleVRWidgetConsoleFunction.DEBUG];\r\n Globals.getConsoleVR(this._myEngine).assert = this._myOldConsoleVR[ConsoleVRWidgetConsoleFunction.ASSERT];\r\n Globals.getConsoleVR(this._myEngine).clear = this._myOldConsoleVRClear;\r\n }\r\n\r\n this._myOldConsoleVR[ConsoleVRWidgetConsoleFunction.LOG] = Globals.getConsoleVR(this._myEngine).log;\r\n this._myOldConsoleVR[ConsoleVRWidgetConsoleFunction.ERROR] = Globals.getConsoleVR(this._myEngine).error;\r\n this._myOldConsoleVR[ConsoleVRWidgetConsoleFunction.WARN] = Globals.getConsoleVR(this._myEngine).warn;\r\n this._myOldConsoleVR[ConsoleVRWidgetConsoleFunction.INFO] = Globals.getConsoleVR(this._myEngine).info;\r\n this._myOldConsoleVR[ConsoleVRWidgetConsoleFunction.DEBUG] = Globals.getConsoleVR(this._myEngine).debug;\r\n this._myOldConsoleVR[ConsoleVRWidgetConsoleFunction.ASSERT] = Globals.getConsoleVR(this._myEngine).assert;\r\n this._myOldConsoleVRClear = Globals.getConsoleVR(this._myEngine).clear;\r\n }\r\n }\r\n\r\n destroy() {\r\n this._myDestroyed = true;\r\n\r\n this._myUI.destroy();\r\n this._myWidgetFrame.destroy();\r\n\r\n if (this._myParams.myResetToConsoleOriginalFunctionsOnDestroy) {\r\n console.log = ConsoleOriginalFunctions.getLog(this._myEngine);\r\n console.error = ConsoleOriginalFunctions.getError(this._myEngine);\r\n console.warn = ConsoleOriginalFunctions.getWarn(this._myEngine);\r\n console.info = ConsoleOriginalFunctions.getInfo(this._myEngine);\r\n console.debug = ConsoleOriginalFunctions.getDebug(this._myEngine);\r\n console.assert = ConsoleOriginalFunctions.getAssert(this._myEngine);\r\n console.clear = ConsoleOriginalFunctions.getClear(this._myEngine);\r\n\r\n Globals.getConsoleVR(this._myEngine).log = ConsoleVR.myOriginalLog;\r\n Globals.getConsoleVR(this._myEngine).error = ConsoleVR.myOriginalError;\r\n Globals.getConsoleVR(this._myEngine).warn = ConsoleVR.myOriginalWarn;\r\n Globals.getConsoleVR(this._myEngine).info = ConsoleVR.myOriginalInfo;\r\n Globals.getConsoleVR(this._myEngine).debug = ConsoleVR.myOriginalDebug;\r\n Globals.getConsoleVR(this._myEngine).assert = ConsoleVR.myOriginalAssert;\r\n Globals.getConsoleVR(this._myEngine).clear = ConsoleVR.myOriginalClear;\r\n } else if (this._myParams.myResetToOverwrittenConsoleFunctionsOnDestroy) {\r\n console.log = this._myOldBrowserConsole[ConsoleVRWidgetConsoleFunction.LOG];\r\n console.error = this._myOldBrowserConsole[ConsoleVRWidgetConsoleFunction.ERROR];\r\n console.warn = this._myOldBrowserConsole[ConsoleVRWidgetConsoleFunction.WARN];\r\n console.info = this._myOldBrowserConsole[ConsoleVRWidgetConsoleFunction.INFO];\r\n console.debug = this._myOldBrowserConsole[ConsoleVRWidgetConsoleFunction.DEBUG];\r\n console.assert = this._myOldBrowserConsole[ConsoleVRWidgetConsoleFunction.ASSERT];\r\n console.clear = this._myOldBrowserConsoleClear;\r\n\r\n Globals.getConsoleVR(this._myEngine).log = this._myOldBrowserConsole[ConsoleVRWidgetConsoleFunction.LOG];\r\n Globals.getConsoleVR(this._myEngine).error = this._myOldBrowserConsole[ConsoleVRWidgetConsoleFunction.ERROR];\r\n Globals.getConsoleVR(this._myEngine).warn = this._myOldBrowserConsole[ConsoleVRWidgetConsoleFunction.WARN];\r\n Globals.getConsoleVR(this._myEngine).info = this._myOldBrowserConsole[ConsoleVRWidgetConsoleFunction.INFO];\r\n Globals.getConsoleVR(this._myEngine).debug = this._myOldBrowserConsole[ConsoleVRWidgetConsoleFunction.DEBUG];\r\n Globals.getConsoleVR(this._myEngine).assert = this._myOldBrowserConsole[ConsoleVRWidgetConsoleFunction.ASSERT];\r\n Globals.getConsoleVR(this._myEngine).clear = this._myOldConsoleVRClear;\r\n }\r\n }\r\n\r\n isDestroyed() {\r\n return this._myDestroyed;\r\n }\r\n}", "import { Component, Property } from \"@wonderlandengine/api\";\r\nimport { Globals } from \"../../../pp/globals.js\";\r\nimport { ConsoleVRWidget, ConsoleVRWidgetParams } from \"../console_vr_widget.js\";\r\n\r\nexport class ConsoleVRToolComponent extends Component {\r\n static TypeName = \"pp-console-vr-tool\";\r\n static Properties = {\r\n _myHandedness: Property.enum([\"None\", \"Left\", \"Right\"], \"None\"),\r\n _myOverrideBrowserConsoleFunctions: Property.enum([\"None\", \"All\", \"Errors & Warns\"], \"All\"),\r\n _myShowOnStart: Property.bool(false),\r\n _myShowVisibilityButton: Property.bool(false),\r\n _myPulseOnNewMessage: Property.enum([\"Never\", \"Always\", \"When Hidden\"], \"Never\")\r\n };\r\n\r\n _start() {\r\n this._myWidget = new ConsoleVRWidget(this.engine);\r\n\r\n let params = new ConsoleVRWidgetParams(this.engine);\r\n params.myHandedness = [null, \"left\", \"right\"][this._myHandedness];\r\n params.myOverrideBrowserConsoleFunctions = this._myOverrideBrowserConsoleFunctions;\r\n params.myShowOnStart = this._myShowOnStart;\r\n params.myShowVisibilityButton = this._myShowVisibilityButton;\r\n params.myPulseOnNewMessage = this._myPulseOnNewMessage;\r\n params.myPlaneMaterial = Globals.getDefaultMaterials(this.engine).myFlatOpaque.clone();\r\n params.myTextMaterial = Globals.getDefaultMaterials(this.engine).myText.clone();\r\n\r\n this._myWidget.start(this.object, params);\r\n\r\n this._myStarted = true;\r\n\r\n if (!Globals.hasConsoleVRWidget(this.engine)) {\r\n Globals.setConsoleVRWidget(this._myWidget, this.engine);\r\n }\r\n }\r\n\r\n update(dt) {\r\n if (Globals.isToolEnabled(this.engine) && (!Globals.hasConsoleVRWidget(this.engine) || Globals.getConsoleVRWidget(this.engine) == this._myWidget)) {\r\n if (this._myStarted) {\r\n this._myWidget.setActive(true);\r\n this._myWidget.update(dt);\r\n } else {\r\n this._start();\r\n }\r\n } else if (this._myStarted) {\r\n this._myWidget.setActive(false);\r\n }\r\n }\r\n\r\n onActivate() {\r\n if (this._myStarted) {\r\n if (!Globals.hasConsoleVRWidget(this.engine)) {\r\n Globals.setConsoleVRWidget(this._myWidget, this.engine);\r\n }\r\n }\r\n }\r\n\r\n onDeactivate() {\r\n if (this._myStarted) {\r\n this._myWidget.setActive(false);\r\n\r\n if (Globals.getConsoleVRWidget(this.engine) == this._myWidget) {\r\n Globals.removeConsoleVRWidget(this.engine);\r\n }\r\n }\r\n }\r\n\r\n onDestroy() {\r\n if (this._myStarted) {\r\n this._myWidget.destroy();\r\n }\r\n }\r\n}", "import { Component, property } from \"@wonderlandengine/api\";\r\nimport { GamepadButtonID } from \"../../../input/gamepad/gamepad_buttons.js\";\r\nimport { Globals } from \"../../../pp/globals.js\";\r\nimport { EasyTuneUtils } from \"../easy_tune_utils.js\";\r\nimport { EasyTuneWidget, EasyTuneWidgetParams } from \"../easy_tune_widgets/easy_tune_widget.js\";\r\n\r\nexport class EasyTuneToolComponent extends Component {\r\n public static override TypeName = \"pp-easy-tune-tool\";\r\n\r\n @property.enum([\"None\", \"Left\", \"Right\"], \"None\")\r\n private readonly _myHandedness!: number;\r\n\r\n @property.bool(false)\r\n private readonly _myShowOnStart!: boolean;\r\n\r\n @property.bool(false)\r\n private readonly _myShowVisibilityButton!: boolean;\r\n\r\n @property.bool(true)\r\n private readonly _myGamepadScrollVariableEnabled!: boolean;\r\n\r\n\r\n @property.bool(false)\r\n private readonly _myShowVariablesImportExportButtons!: boolean;\r\n\r\n\r\n\r\n /**\r\n * Can contain parameters inside brackets, like `my-url.com/{param}`, \r\n * which will be replaced with the same one on the current page url, like `www.currentpage.com/?param=2` \r\n * If empty, it will import from the clipboard\r\n */\r\n @property.string(\"\")\r\n private readonly _myVariablesImportURL!: string;\r\n\r\n /**\r\n * Can contain parameters inside brackets, like `my-url.com/{param}`, \r\n * which will be replaced with the same one on the current page url, like `www.currentpage.com/?param=2` \r\n * If empty, it will import from the clipboard\r\n */\r\n @property.string(\"\")\r\n private readonly _myVariablesExportURL!: string;\r\n\r\n @property.bool(false)\r\n private readonly _myImportVariablesOnStart!: boolean;\r\n\r\n @property.bool(false)\r\n private readonly _myResetVariablesDefaultValueOnImport!: boolean;\r\n\r\n @property.bool(true)\r\n private readonly _myKeepImportVariablesOnExport!: boolean;\r\n\r\n @property.bool(true)\r\n private readonly _myAvoidExportingVariablesWithValueAsDefault!: boolean;\r\n\r\n private readonly _myWidget!: EasyTuneWidget;\r\n\r\n private _myStarted: boolean = false;\r\n private _myFirstUpdate: boolean = true;\r\n\r\n private _start(): void {\r\n (this._myWidget as EasyTuneWidget) = new EasyTuneWidget(this.engine);\r\n\r\n const params = new EasyTuneWidgetParams();\r\n params.myHandedness = [null, \"left\", \"right\"][this._myHandedness];\r\n params.myShowOnStart = this._myShowOnStart;\r\n params.myShowVisibilityButton = this._myShowVisibilityButton;\r\n params.myShowAdditionalButtons = true;\r\n params.myGamepadScrollVariableEnabled = this._myGamepadScrollVariableEnabled;\r\n params.myPlaneMaterial = Globals.getDefaultMaterials(this.engine)!.myFlatOpaque!.clone();\r\n params.myTextMaterial = Globals.getDefaultMaterials(this.engine)!.myText!.clone();\r\n\r\n params.myShowVariablesImportExportButtons = this._myShowVariablesImportExportButtons;\r\n params.myVariablesImportCallback = function (this: EasyTuneToolComponent, onSuccessCallback?: () => void, onFailureCallback?: () => void) {\r\n EasyTuneUtils.importVariables(this._myVariablesImportURL, this._myResetVariablesDefaultValueOnImport, false, true, onSuccessCallback, onFailureCallback, this.engine);\r\n }.bind(this);\r\n params.myVariablesExportCallback = function (this: EasyTuneToolComponent, onSuccessCallback?: () => void, onFailureCallback?: () => void) {\r\n if (Globals.getLeftGamepad()!.getButtonInfo(GamepadButtonID.SELECT).isPressed() &&\r\n Globals.getLeftGamepad()!.getButtonInfo(GamepadButtonID.SQUEEZE).isPressed() &&\r\n Globals.getLeftGamepad()!.getButtonInfo(GamepadButtonID.TOP_BUTTON).isPressed() &&\r\n Globals.getLeftGamepad()!.getButtonInfo(GamepadButtonID.BOTTOM_BUTTON).isPressed() &&\r\n Globals.getLeftGamepad()!.getButtonInfo(GamepadButtonID.THUMBSTICK).isPressed()) {\r\n\r\n EasyTuneUtils.clearExportedVariables(this._myVariablesExportURL, onSuccessCallback, onFailureCallback, this.engine);\r\n } else if (this._myKeepImportVariablesOnExport) {\r\n EasyTuneUtils.getImportVariablesJSON(this._myVariablesImportURL, (variablesToKeepJSON) => {\r\n let variablesToKeep = null;\r\n try {\r\n variablesToKeep = JSON.parse(variablesToKeepJSON);\r\n } catch (error) {\r\n // Do nothing\r\n }\r\n\r\n EasyTuneUtils.exportVariables(this._myVariablesExportURL, this._myAvoidExportingVariablesWithValueAsDefault, variablesToKeep, onSuccessCallback, onFailureCallback, this.engine);\r\n }, () => {\r\n EasyTuneUtils.exportVariables(this._myVariablesExportURL, this._myAvoidExportingVariablesWithValueAsDefault, undefined, onSuccessCallback, onFailureCallback, this.engine);\r\n }, this.engine);\r\n } else {\r\n EasyTuneUtils.exportVariables(this._myVariablesExportURL, this._myAvoidExportingVariablesWithValueAsDefault, undefined, onSuccessCallback, onFailureCallback, this.engine);\r\n }\r\n }.bind(this);\r\n\r\n this._myWidget.start(this.object, params, Globals.getEasyTuneVariables(this.engine));\r\n\r\n EasyTuneUtils.addSetWidgetCurrentVariableCallback(this, (variableName: string) => { this._myWidget.setCurrentVariable(variableName); }, this.engine);\r\n EasyTuneUtils.addRefreshWidgetCallback(this, () => { this._myWidget.refresh(); }, this.engine);\r\n\r\n this._myStarted = true;\r\n this._myFirstUpdate = true;\r\n\r\n if (!Globals.hasEasyTuneWidget(this.engine)) {\r\n Globals.setEasyTuneWidget(this._myWidget, this.engine);\r\n }\r\n }\r\n\r\n public override update(dt: number): void {\r\n if (Globals.isToolEnabled(this.engine) && (!Globals.hasEasyTuneWidget(this.engine) || Globals.getEasyTuneWidget(this.engine) == this._myWidget)) {\r\n if (this._myStarted) {\r\n if (this._myFirstUpdate) {\r\n this._myFirstUpdate = false;\r\n if (this._myImportVariablesOnStart) {\r\n EasyTuneUtils.importVariables(this._myVariablesImportURL, this._myResetVariablesDefaultValueOnImport, false, false, undefined, undefined, this.engine);\r\n }\r\n }\r\n\r\n this._myWidget.setActive(true);\r\n this._myWidget.update(dt);\r\n } else {\r\n this._start();\r\n }\r\n } else if (this._myStarted) {\r\n this._myWidget.setActive(false);\r\n }\r\n }\r\n\r\n public override onActivate(): void {\r\n if (this._myStarted) {\r\n if (!Globals.hasEasyTuneWidget(this.engine)) {\r\n Globals.setEasyTuneWidget(this._myWidget, this.engine);\r\n }\r\n\r\n EasyTuneUtils.addSetWidgetCurrentVariableCallback(this, (variableName: string) => { this._myWidget.setCurrentVariable(variableName); }, this.engine);\r\n EasyTuneUtils.addRefreshWidgetCallback(this, () => { this._myWidget.refresh(); }, this.engine);\r\n }\r\n }\r\n\r\n public override onDeactivate(): void {\r\n if (this._myStarted) {\r\n this._myWidget.setActive(false);\r\n\r\n EasyTuneUtils.removeSetWidgetCurrentVariableCallback(this, this.engine);\r\n EasyTuneUtils.removeRefreshWidgetCallback(this, this.engine);\r\n\r\n if (Globals.getEasyTuneWidget(this.engine) == this._myWidget) {\r\n Globals.removeEasyTuneWidget(this.engine);\r\n }\r\n }\r\n }\r\n\r\n public override onDestroy(): void {\r\n if (this._myStarted) {\r\n this._myWidget.destroy();\r\n }\r\n }\r\n}", "import { Emitter } from \"@wonderlandengine/api\";\r\nimport { Timer } from \"../../../../cauldron/cauldron/timer.js\";\r\n\r\nexport class EasyTuneBaseWidgetParams {\r\n\r\n constructor() {\r\n this.myVariablesImportCallback = null; // Signature: callback()\r\n this.myVariablesExportCallback = null; // Signature: callback()\r\n }\r\n}\r\n\r\nexport class EasyTuneBaseWidget {\r\n\r\n constructor(params) {\r\n this._myConfig = null;\r\n this._myUI = null;\r\n\r\n this._myParams = params;\r\n\r\n this._myVariable = null;\r\n\r\n this._myVisible = true;\r\n\r\n this._myScrollVariableRequestEmitter = new Emitter(); // Signature: listener(scrollAmount)\r\n\r\n this._myAppendToVariableName = \"\";\r\n\r\n this._myScrollVariableActive = false;\r\n this._myScrollDirection = 0;\r\n this._myScrollVariableTimer = 0;\r\n this._myHasScrolled = false;\r\n\r\n this._myResetImportLabelTimer = new Timer(0, false);\r\n this._myResetExportLabelTimer = new Timer(0, false);\r\n\r\n this._myUnhoverCallbacks = [];\r\n\r\n this._myDestroyed = false;\r\n\r\n }\r\n\r\n setVisible(visible) {\r\n if (visible) {\r\n this._refreshUI();\r\n }\r\n\r\n this._myUI.setVisible(visible);\r\n\r\n if (this._myVisible != visible) {\r\n for (const unhoverCallback of this._myUnhoverCallbacks) {\r\n unhoverCallback();\r\n }\r\n }\r\n\r\n this._myVisible = visible;\r\n }\r\n\r\n setEasyTuneVariable(variable, appendToVariableName) {\r\n this._myVariable = variable;\r\n\r\n if (appendToVariableName != null) {\r\n this._myAppendToVariableName = appendToVariableName;\r\n } else {\r\n this._myAppendToVariableName = \"\";\r\n }\r\n\r\n this._setEasyTuneVariableHook();\r\n\r\n this._refreshUI();\r\n }\r\n\r\n isScrollVariableActive() {\r\n return this._myScrollVariableActive;\r\n }\r\n\r\n getScrollVariableDirection() {\r\n return this._myScrollDirection;\r\n }\r\n\r\n setScrollVariableActive(active, scrollDirection) {\r\n this._myScrollVariableActive = active;\r\n this._myScrollDirection = scrollDirection;\r\n this._myScrollVariableTimer = this._myConfig.myScrollVariableDelay;\r\n this._myHasScrolled = false;\r\n }\r\n\r\n getWidget() {\r\n return this;\r\n }\r\n\r\n syncWidget(otherEasyTuneWidget) {\r\n if (otherEasyTuneWidget != null) {\r\n if (otherEasyTuneWidget._myResetImportLabelTimer.isRunning()) {\r\n this._myResetImportLabelTimer.start(otherEasyTuneWidget._myResetImportLabelTimer.getTimeLeft());\r\n } else {\r\n this._myResetImportLabelTimer.reset();\r\n }\r\n\r\n if (otherEasyTuneWidget._myResetExportLabelTimer.isRunning()) {\r\n this._myResetExportLabelTimer.start(otherEasyTuneWidget._myResetExportLabelTimer.getTimeLeft());\r\n } else {\r\n this._myResetExportLabelTimer.reset();\r\n }\r\n\r\n this._myUI.myImportButtonTextComponent.text = otherEasyTuneWidget._myUI.myImportButtonTextComponent.text;\r\n this._myUI.myExportButtonTextComponent.text = otherEasyTuneWidget._myUI.myExportButtonTextComponent.text;\r\n\r\n this.setScrollVariableActive(otherEasyTuneWidget.isScrollVariableActive(), otherEasyTuneWidget.getScrollVariableDirection());\r\n } else {\r\n this._myResetImportLabelTimer.reset();\r\n this._myUI.myImportButtonTextComponent.text = this._myConfig.myImportButtonText;\r\n\r\n this._myResetExportLabelTimer.reset();\r\n this._myUI.myExportButtonTextComponent.text = this._myConfig.myExportButtonText;\r\n }\r\n }\r\n\r\n onImportSuccess() {\r\n this._myUI.myImportButtonTextComponent.text = this._myConfig.myImportSuccessButtonText;\r\n this._myResetImportLabelTimer.start(this._myConfig.myImportExportResetLabelSeconds);\r\n }\r\n\r\n onImportFailure() {\r\n this._myUI.myImportButtonTextComponent.text = this._myConfig.myImportFailureButtonText;\r\n this._myResetImportLabelTimer.start(this._myConfig.myImportExportResetLabelSeconds);\r\n }\r\n\r\n onExportSuccess() {\r\n this._myUI.myExportButtonTextComponent.text = this._myConfig.myExportSuccessButtonText;\r\n this._myResetExportLabelTimer.start(this._myConfig.myImportExportResetLabelSeconds);\r\n }\r\n\r\n onExportFailure() {\r\n this._myUI.myExportButtonTextComponent.text = this._myConfig.myExportFailureButtonText;\r\n this._myResetExportLabelTimer.start(this._myConfig.myImportExportResetLabelSeconds);\r\n }\r\n\r\n registerScrollVariableRequestEventListener(id, listener) {\r\n this._myScrollVariableRequestEmitter.add(listener, { id: id });\r\n }\r\n\r\n unregisterScrollVariableRequestEventListener(id) {\r\n this._myScrollVariableRequestEmitter.remove(id);\r\n }\r\n\r\n start(parentObject, easyTuneParams) {\r\n this._myConfig.build();\r\n\r\n this._myResetImportLabelTimer.reset(this._myConfig.myImportExportResetLabelSeconds);\r\n this._myResetExportLabelTimer.reset(this._myConfig.myImportExportResetLabelSeconds);\r\n\r\n this._myUI.build(parentObject, this._myConfig, easyTuneParams);\r\n this._myUI.setImportExportButtonsVisible(easyTuneParams.myShowVariablesImportExportButtons);\r\n\r\n this._startHook(parentObject, easyTuneParams);\r\n\r\n this._addListeners();\r\n }\r\n\r\n update(dt) {\r\n if (this._isActive()) {\r\n this._updateHook(dt);\r\n\r\n this._updateScrollVariable(dt);\r\n\r\n this._updateImportExportLabel(dt);\r\n }\r\n }\r\n\r\n // Hooks\r\n\r\n _setEasyTuneVariableHook() {\r\n }\r\n\r\n _refreshUIHook() {\r\n }\r\n\r\n _startHook(parentObject, easyTuneParams) {\r\n }\r\n\r\n _addListenersHook() {\r\n }\r\n\r\n _updateHook(dt) {\r\n }\r\n\r\n // Hooks end\r\n\r\n _refreshUI() {\r\n if (this._myVariable) {\r\n if (this._myVariable.getName() != null) {\r\n this._myUI.myVariableLabelTextComponent.text = this._myVariable.getName().concat(this._myAppendToVariableName);\r\n } else {\r\n let name = \"Unknown\";\r\n this._myUI.myVariableLabelTextComponent.text = name.concat(this._myAppendToVariableName);\r\n }\r\n\r\n this._refreshUIHook();\r\n }\r\n }\r\n\r\n _updateScrollVariable(dt) {\r\n if (this._myScrollVariableActive) {\r\n if (this._myScrollVariableTimer <= 0) {\r\n this._scrollVariableRequest(this._myScrollDirection);\r\n this._myScrollVariableTimer = this._myConfig.myScrollVariableDelay;\r\n this._myHasScrolled = true;\r\n } else {\r\n this._myScrollVariableTimer -= dt;\r\n }\r\n }\r\n }\r\n\r\n _updateImportExportLabel(dt) {\r\n if (this._myResetImportLabelTimer.isRunning(dt)) {\r\n this._myResetImportLabelTimer.update(dt);\r\n if (this._myResetImportLabelTimer.isDone()) {\r\n this._myResetImportLabelTimer.reset();\r\n this._myUI.myImportButtonTextComponent.text = this._myConfig.myImportButtonText;\r\n }\r\n }\r\n\r\n if (this._myResetExportLabelTimer.isRunning(dt)) {\r\n this._myResetExportLabelTimer.update(dt);\r\n if (this._myResetExportLabelTimer.isDone()) {\r\n this._myResetExportLabelTimer.reset();\r\n this._myUI.myExportButtonTextComponent.text = this._myConfig.myExportButtonText;\r\n }\r\n }\r\n }\r\n\r\n _isActive() {\r\n return this._myVisible && this._myVariable;\r\n }\r\n\r\n _addListeners() {\r\n let ui = this._myUI;\r\n\r\n this._myUnhoverCallbacks = [];\r\n\r\n ui.myNextButtonCursorTargetComponent.onDown.add(this._setScrollVariableActive.bind(this, true, 1, false));\r\n ui.myNextButtonCursorTargetComponent.onDownOnHover.add(this._setScrollVariableActive.bind(this, true, 1, false));\r\n ui.myNextButtonCursorTargetComponent.onUpWithDown.add(this._setScrollVariableActive.bind(this, false, 0, false));\r\n ui.myNextButtonCursorTargetComponent.onUpWithNoDown.add(this._setScrollVariableActive.bind(this, false, 0, true));\r\n ui.myNextButtonCursorTargetComponent.onUnhover.add(this._setScrollVariableActive.bind(this, false, 0, true));\r\n ui.myNextButtonCursorTargetComponent.onHover.add(this._genericHover.bind(this, ui.myNextButtonBackgroundComponent.material));\r\n ui.myNextButtonCursorTargetComponent.onUnhover.add(this._genericUnhover.bind(this, ui.myNextButtonBackgroundComponent.material));\r\n\r\n this._myUnhoverCallbacks.push(this._setScrollVariableActive.bind(this, false, 0, true));\r\n this._myUnhoverCallbacks.push(this._genericUnhover.bind(this, ui.myNextButtonBackgroundComponent.material));\r\n\r\n ui.myPreviousButtonCursorTargetComponent.onDown.add(this._setScrollVariableActive.bind(this, true, -1, false));\r\n ui.myPreviousButtonCursorTargetComponent.onDownOnHover.add(this._setScrollVariableActive.bind(this, true, -1, false));\r\n ui.myPreviousButtonCursorTargetComponent.onUpWithDown.add(this._setScrollVariableActive.bind(this, false, 0, false));\r\n ui.myPreviousButtonCursorTargetComponent.onUpWithNoDown.add(this._setScrollVariableActive.bind(this, false, 0, true));\r\n ui.myPreviousButtonCursorTargetComponent.onUnhover.add(this._setScrollVariableActive.bind(this, false, 0, true));\r\n ui.myPreviousButtonCursorTargetComponent.onHover.add(this._genericHover.bind(this, ui.myPreviousButtonBackgroundComponent.material));\r\n ui.myPreviousButtonCursorTargetComponent.onUnhover.add(this._genericUnhover.bind(this, ui.myPreviousButtonBackgroundComponent.material));\r\n\r\n this._myUnhoverCallbacks.push(this._setScrollVariableActive.bind(this, false, 0, true));\r\n this._myUnhoverCallbacks.push(this._genericUnhover.bind(this, ui.myPreviousButtonBackgroundComponent.material));\r\n\r\n ui.myImportButtonCursorTargetComponent.onUpWithDown.add(this._importVariables.bind(this));\r\n ui.myImportButtonCursorTargetComponent.onHover.add(this._genericHover.bind(this, ui.myImportButtonBackgroundComponent.material));\r\n ui.myImportButtonCursorTargetComponent.onUnhover.add(this._genericUnhover.bind(this, ui.myImportButtonBackgroundComponent.material));\r\n\r\n this._myUnhoverCallbacks.push(this._genericUnhover.bind(this, ui.myImportButtonBackgroundComponent.material));\r\n\r\n ui.myExportButtonCursorTargetComponent.onUpWithDown.add(this._exportVariables.bind(this));\r\n ui.myExportButtonCursorTargetComponent.onHover.add(this._genericHover.bind(this, ui.myExportButtonBackgroundComponent.material));\r\n ui.myExportButtonCursorTargetComponent.onUnhover.add(this._genericUnhover.bind(this, ui.myExportButtonBackgroundComponent.material));\r\n\r\n this._myUnhoverCallbacks.push(this._genericUnhover.bind(this, ui.myExportButtonBackgroundComponent.material));\r\n\r\n this._addListenersHook();\r\n }\r\n\r\n _setScrollVariableActive(active, scrollDirection, skipForceScroll) {\r\n if (this._isActive() || !active) {\r\n let forceScroll = !active && !this._myHasScrolled && !skipForceScroll;\r\n let oldScrollDirection = this._myScrollDirection;\r\n\r\n this.setScrollVariableActive(active, scrollDirection);\r\n\r\n if (forceScroll) {\r\n this._scrollVariableRequest(oldScrollDirection);\r\n }\r\n }\r\n }\r\n\r\n _scrollVariableRequest(amount) {\r\n if (this._isActive() && amount != 0) {\r\n this._myScrollVariableRequestEmitter.notify(amount);\r\n }\r\n }\r\n\r\n _genericHover(material) {\r\n material.color = this._myConfig.myButtonHoverColor;\r\n }\r\n\r\n _genericUnhover(material) {\r\n material.color = this._myConfig.myBackgroundColor;\r\n }\r\n\r\n _importVariables() {\r\n if (this._myUI.myImportButtonTextComponent.text == this._myConfig.myImportButtonText) {\r\n this._myUI.myImportButtonTextComponent.text = this._myConfig.myImportingButtonText;\r\n this._myResetImportLabelTimer.reset();\r\n\r\n this._myParams.myVariablesImportCallback();\r\n }\r\n }\r\n\r\n _exportVariables() {\r\n if (this._myUI.myExportButtonTextComponent.text == this._myConfig.myExportButtonText) {\r\n this._myUI.myExportButtonTextComponent.text = this._myConfig.myExportingButtonText;\r\n this._myResetExportLabelTimer.reset();\r\n\r\n this._myParams.myVariablesExportCallback();\r\n }\r\n }\r\n\r\n setActive(active) {\r\n this._myUI.setActive(active);\r\n }\r\n\r\n destroy() {\r\n this._myDestroyed = true;\r\n\r\n this.setActive(false);\r\n\r\n if (this._myUI != null) {\r\n this._myUI.destroy();\r\n }\r\n }\r\n\r\n isDestroyed() {\r\n return this._myDestroyed;\r\n }\r\n}", "import { Emitter } from \"@wonderlandengine/api\";\r\nimport { Globals } from \"../../../../pp/globals.js\";\r\n\r\nexport class EasyTuneBaseArrayWidgetSelector {\r\n\r\n constructor(params, gamepad, engine = Globals.getMainEngine()) {\r\n this._myGamepad = gamepad;\r\n\r\n this._myParentObject = null;\r\n\r\n this._myParams = params;\r\n this._myEasyTuneParams = null;\r\n\r\n this._myWidgets = new Map();\r\n\r\n this._myVariable = null;\r\n this._myVisible = true;\r\n\r\n this._myAppendToVariableName = null;\r\n\r\n this._myScrollVariableRequestEmitter = new Emitter(); // Signature: listener(scrollAmount)\r\n\r\n this._myCurrentArraySize = null;\r\n\r\n this._myEngine = engine;\r\n\r\n this._myActive = true;\r\n this._myDestroyed = false;\r\n }\r\n\r\n setEasyTuneVariable(variable, appendToVariableName, skipSetVisible = false) {\r\n this._myVariable = variable;\r\n\r\n this._myCurrentArraySize = this._myVariable.getValue().length; // null for non array variable\r\n\r\n this._myAppendToVariableName = appendToVariableName;\r\n\r\n if (!this._myWidgets.has(this._myCurrentArraySize)) {\r\n this._createWidget(this._myCurrentArraySize);\r\n }\r\n\r\n let widget = this._myWidgets.get(this._myCurrentArraySize);\r\n if (widget) {\r\n widget.setEasyTuneVariable(variable, appendToVariableName);\r\n }\r\n\r\n if (!skipSetVisible) {\r\n this.setVisible(this._myVisible);\r\n }\r\n }\r\n\r\n setVisible(visible) {\r\n if (this._myVariable) {\r\n this._sizeChangedCheck(true);\r\n\r\n let currentWidget = this._myWidgets.get(this._myCurrentArraySize);\r\n\r\n for (let widget of this._myWidgets.values()) {\r\n if (currentWidget != widget) {\r\n widget.setVisible(false);\r\n }\r\n }\r\n\r\n if (currentWidget) {\r\n currentWidget.setVisible(visible);\r\n }\r\n } else {\r\n for (let widget of this._myWidgets.values()) {\r\n widget.setVisible(false);\r\n }\r\n }\r\n\r\n this._myVisible = visible;\r\n }\r\n\r\n isScrollVariableActive() {\r\n let widget = this._myWidgets.get(this._myCurrentArraySize);\r\n if (widget) {\r\n return widget.isScrollVariableActive();\r\n }\r\n\r\n return false;\r\n }\r\n\r\n getScrollVariableDirection() {\r\n let widget = this._myWidgets.get(this._myCurrentArraySize);\r\n if (widget) {\r\n return widget.getScrollVariableDirection();\r\n }\r\n\r\n return 0;\r\n }\r\n\r\n setScrollVariableActive(active, scrollDirection) {\r\n let widget = this._myWidgets.get(this._myCurrentArraySize);\r\n if (widget) {\r\n widget.setScrollVariableActive(active, scrollDirection);\r\n }\r\n }\r\n\r\n getWidget() {\r\n return this._myWidgets.get(this._myCurrentArraySize);\r\n }\r\n\r\n registerScrollVariableRequestEventListener(id, listener) {\r\n this._myScrollVariableRequestEmitter.add(listener, { id: id });\r\n }\r\n\r\n unregisterScrollVariableRequestEventListener(id) {\r\n this._myScrollVariableRequestEmitter.remove(id);\r\n }\r\n\r\n start(parentObject, easyTuneParams) {\r\n this._myParentObject = parentObject;\r\n this._myEasyTuneParams = easyTuneParams;\r\n\r\n this._createWidget(1);\r\n\r\n if (this._myVariable) {\r\n this.setEasyTuneVariable(this._myVariable, this._myAppendToVariableName);\r\n }\r\n }\r\n\r\n update(dt) {\r\n if (this._isActive()) {\r\n this._sizeChangedCheck();\r\n\r\n let widget = this._myWidgets.get(this._myCurrentArraySize);\r\n if (widget) {\r\n widget.update(dt);\r\n }\r\n }\r\n }\r\n\r\n onImportSuccess() {\r\n let widget = this._myWidgets.get(this._myCurrentArraySize);\r\n if (widget) {\r\n widget.onImportSuccess();\r\n }\r\n }\r\n\r\n onImportFailure() {\r\n let widget = this._myWidgets.get(this._myCurrentArraySize);\r\n if (widget) {\r\n widget.onImportFailure();\r\n }\r\n }\r\n\r\n onExportSuccess() {\r\n let widget = this._myWidgets.get(this._myCurrentArraySize);\r\n if (widget) {\r\n widget.onExportSuccess();\r\n }\r\n }\r\n\r\n onExportFailure() {\r\n let widget = this._myWidgets.get(this._myCurrentArraySize);\r\n if (widget) {\r\n widget.onExportFailure();\r\n }\r\n }\r\n\r\n _isActive() {\r\n return this._myVisible && this._myVariable;\r\n }\r\n\r\n _scrollVariableRequest(amount) {\r\n this._myScrollVariableRequestEmitter.notify(amount);\r\n }\r\n\r\n _createWidget(arraySize) {\r\n this._myWidgets.set(arraySize, this._getEasyTuneArrayWidget(arraySize));\r\n this._myWidgets.get(arraySize).start(this._myParentObject, this._myEasyTuneParams);\r\n this._myWidgets.get(arraySize).setVisible(false);\r\n this._myWidgets.get(arraySize).registerScrollVariableRequestEventListener(this, this._scrollVariableRequest.bind(this));\r\n this._myWidgets.get(arraySize).setActive(this._myActive);\r\n }\r\n\r\n _sizeChangedCheck(skipSetVisible = false) {\r\n if (this._myVariable.getValue().length != this._myCurrentArraySize) {\r\n this.setEasyTuneVariable(this._myVariable, this._myAppendToVariableName, skipSetVisible);\r\n }\r\n }\r\n\r\n /**\r\n * TS type inference helper\r\n * \r\n * @returns {any}\r\n */\r\n _getEasyTuneArrayWidget(arraySize) {\r\n return null;\r\n }\r\n\r\n setActive(active) {\r\n this._myActive = active;\r\n for (let widget of this._myWidgets.values()) {\r\n widget.setActive(active);\r\n }\r\n }\r\n\r\n destroy() {\r\n this._myDestroyed = true;\r\n\r\n this.setActive(false);\r\n\r\n for (let widget of this._myWidgets.values()) {\r\n widget.destroy();\r\n }\r\n }\r\n\r\n isDestroyed() {\r\n return this._myDestroyed;\r\n }\r\n}", "import { Alignment, Collider, VerticalAlignment } from \"@wonderlandengine/api\";\r\nimport { vec3_create, vec4_create } from \"../../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { ToolHandedness } from \"../../../cauldron/tool_types.js\";\r\n\r\nexport class EasyTuneBaseWidgetConfig {\r\n\r\n constructor() {\r\n\r\n }\r\n\r\n build() {\r\n this._setupBuildConfig();\r\n this._setupRuntimeConfig();\r\n }\r\n\r\n // Hooks\r\n\r\n _getBackPanelMaxY() {\r\n return this.myDisplayPanelPosition[1] + this.myVariableLabelPanelPosition[1] + this.mySideButtonBackgroundScale[1] + this._mySideButtonDistanceFromBorder * 1.25;\r\n }\r\n\r\n _getBackPanelMinY() {\r\n return this.myDisplayPanelPosition[1] - this._mySideButtonDistanceFromBorder * 1.25 - this.mySideButtonBackgroundScale[1];\r\n }\r\n\r\n _getBackPanelMaxX() {\r\n return this._mySideButtonPanelHalfWidth;\r\n }\r\n\r\n _getBackPanelMinX() {\r\n return -this._mySideButtonPanelHalfWidth;\r\n }\r\n\r\n // Small Z offset to avoid glitching with other widgets\r\n _getPivotZOffset() {\r\n return 0;\r\n }\r\n\r\n _setupBuildConfigHook() {\r\n }\r\n\r\n _setupRuntimeConfigHook() {\r\n }\r\n\r\n // Hooks end\r\n\r\n _setupBuildConfig() {\r\n // General\r\n\r\n this.myBackgroundColor = vec4_create(46 / 255, 46 / 255, 46 / 255, 1);\r\n\r\n this.myCursorTargetCollisionCollider = Collider.Box;\r\n this.myCursorTargetCollisionGroup = 7; // Keep this in sync with Tool Cursor\r\n this.myCursorTargetCollisionThickness = 0.001;\r\n\r\n this.myDefaultTextColor = vec4_create(255 / 255, 255 / 255, 255 / 255, 1);\r\n\r\n this.myTextAlignment = Alignment.Center;\r\n this.myTextVerticalAlignment = VerticalAlignment.Middle;\r\n this.myTextColor = this.myDefaultTextColor;\r\n\r\n this.myLabelTextScale = vec3_create(0.18, 0.18, 0.18);\r\n this.myButtonTextScale = vec3_create(0.18, 0.18, 0.18);\r\n\r\n this._myPanelZOffset = 0.01;\r\n this._myColliderZOffset = 0.017;\r\n this._mySideButtonDistanceFromBorder = 0.0125;\r\n this._mySideButtonPanelHalfWidth = 0.2;\r\n\r\n // Pivot\r\n\r\n this.myPivotObjectPositions = [];\r\n this.myPivotObjectPositions[ToolHandedness.NONE] = vec3_create(0, 0, this._getPivotZOffset());\r\n this.myPivotObjectPositions[ToolHandedness.LEFT] = vec3_create(-0.04, 0.02, this._getPivotZOffset());\r\n this.myPivotObjectPositions[ToolHandedness.RIGHT] = vec3_create(-0.08, 0.02, this._getPivotZOffset());\r\n\r\n this.mySideButtonBackgroundScale = vec3_create(0.015, 0.015, 1);\r\n this.mySideButtonTextScale = this.myButtonTextScale;\r\n this.mySideButtonTextPosition = vec3_create(0, 0, 0.007);\r\n\r\n this.mySideButtonCursorTargetPosition = vec3_create(0, 0, 0);\r\n this.mySideButtonCursorTargetPosition[2] = this._myColliderZOffset - this._myPanelZOffset;\r\n this.mySideButtonCollisionExtents = this.mySideButtonBackgroundScale.pp_clone();\r\n this.mySideButtonCollisionExtents[2] = this.myCursorTargetCollisionThickness;\r\n\r\n this.myLeftSideButtonPosition = vec3_create(0, 0, -0.00001);\r\n this.myLeftSideButtonPosition[0] = -this._mySideButtonPanelHalfWidth + this.mySideButtonBackgroundScale[0] + this._mySideButtonDistanceFromBorder;\r\n\r\n this.myRightSideButtonPosition = vec3_create(0, 0, -0.00001);\r\n this.myRightSideButtonPosition[0] = -this.myLeftSideButtonPosition[0];\r\n\r\n // Display\r\n\r\n this.myDisplayPanelPosition = vec3_create(0, 0.1, 0);\r\n\r\n this.myVariableLabelPanelPosition = vec3_create(0, 0.025, this._myPanelZOffset);\r\n this.myVariableLabelTextScale = this.myLabelTextScale;\r\n\r\n this.myVariableLabelCursorTargetPosition = vec3_create(0, 0, 0);\r\n this.myVariableLabelCursorTargetPosition[2] = this._myColliderZOffset - this._myPanelZOffset;\r\n this.myVariableLabelCollisionExtents = vec3_create(0.065, 0.0175, 1);\r\n this.myVariableLabelCollisionExtents[2] = this.myCursorTargetCollisionThickness;\r\n\r\n this.myNextButtonText = \">\";\r\n this.myPreviousButtonText = \"<\";\r\n\r\n this._setupBuildConfigHook();\r\n\r\n // Background\r\n\r\n {\r\n let maxX = this._getBackPanelMaxX();\r\n let minX = this._getBackPanelMinX();\r\n let maxY = this._getBackPanelMaxY();\r\n let minY = this._getBackPanelMinY();\r\n\r\n this.myBackPanelPosition = [(maxX + minX) / 2, (maxY + minY) / 2, 0];\r\n this.myBackBackgroundScale = [(maxX - minX) / 2, (maxY - minY) / 2, 1];\r\n\r\n this.myBackBackgroundColor = vec4_create(70 / 255, 70 / 255, 70 / 255, 1);\r\n }\r\n\r\n // Import Export\r\n\r\n this.myImportExportButtonBackgroundScale = vec3_create(0.04, 0.02, 1);\r\n this.myImportExportButtonTextScale = this.myButtonTextScale;\r\n this.myImportExportButtonTextPosition = vec3_create(0, 0, 0.007);\r\n\r\n this.myImportExportPanelPosition = [0, this._getBackPanelMaxY() + this._mySideButtonDistanceFromBorder + this.myImportExportButtonBackgroundScale[1], this._myPanelZOffset];\r\n\r\n this.myImportExportButtonCursorTargetPosition = vec3_create(0, 0, 0);\r\n this.myImportExportButtonCursorTargetPosition[2] = this._myColliderZOffset - this._myPanelZOffset;\r\n this.myImportExportButtonCollisionExtents = this.myImportExportButtonBackgroundScale.pp_clone();\r\n this.myImportExportButtonCollisionExtents[2] = this.myCursorTargetCollisionThickness;\r\n\r\n this.myImportButtonText = \"Import\";\r\n this.myExportButtonText = \"Export\";\r\n\r\n this.myImportExportResetLabelSeconds = 2;\r\n\r\n this.myImportingButtonText = \"...\";\r\n this.myImportSuccessButtonText = \"Done\";\r\n this.myImportFailureButtonText = \"Error\";\r\n\r\n this.myExportingButtonText = \"...\";\r\n this.myExportSuccessButtonText = \"Done\";\r\n this.myExportFailureButtonText = \"Error\";\r\n\r\n this.myImportButtonPosition = vec3_create(0, 0, -0.00001);\r\n this.myImportButtonPosition[0] = -this.myImportExportButtonBackgroundScale[0] - this._mySideButtonDistanceFromBorder / 2;\r\n\r\n this.myExportButtonPosition = vec3_create(0, 0, -0.00001);\r\n this.myExportButtonPosition[0] = -this.myImportButtonPosition[0];\r\n\r\n\r\n // Pointer\r\n\r\n this.myPointerCollisionExtents = this.myBackBackgroundScale.pp_clone();\r\n this.myPointerCollisionExtents[2] = this.myCursorTargetCollisionThickness;\r\n this.myPointerCursorTargetPosition = this.myBackPanelPosition.pp_clone();\r\n this.myPointerCursorTargetPosition[2] = this._myColliderZOffset - 0.0002; // A little behind the button target to avoid hiding it\r\n }\r\n\r\n _setupRuntimeConfig() {\r\n this.myButtonHoverColor = vec4_create(150 / 255, 150 / 255, 150 / 255, 1);\r\n\r\n this.myScrollVariableDelay = 0.5;\r\n\r\n this._setupRuntimeConfigHook();\r\n }\r\n}", "import { vec3_create } from \"../../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { EasyTuneBaseWidgetConfig } from \"../base/easy_tune_base_widget_config.js\";\r\n\r\nexport class EasyTuneBoolArrayWidgetConfig extends EasyTuneBaseWidgetConfig {\r\n\r\n constructor(arraySize) {\r\n super();\r\n\r\n this.myArraySize = arraySize;\r\n }\r\n\r\n _getBackPanelMinY() {\r\n let valuePanelLastPosition = (this.myValuePanelsPositions[this.myArraySize - 1]) ? this.myValuePanelsPositions[this.myArraySize - 1][1] : 0;\r\n return super._getBackPanelMinY() + this.myValuesPanelPosition[1] + valuePanelLastPosition;\r\n }\r\n\r\n _getPivotZOffset() {\r\n return 0.00802713;\r\n }\r\n\r\n _setupBuildConfigHook() {\r\n this.myIncreaseButtonText = \"+\";\r\n this.myDecreaseButtonText = \"-\";\r\n\r\n this._myValuePanelDistanceFromVariableLabelPanel = 0.055;\r\n this._myDistanceBetweenValues = this.mySideButtonBackgroundScale[1] * 2 + 0.015;\r\n\r\n this.myValuesPanelPosition = [0, this.myVariableLabelPanelPosition[1] - this._myValuePanelDistanceFromVariableLabelPanel, this._myPanelZOffset];\r\n\r\n this.myValueTextScale = vec3_create(0.4, 0.4, 0.4);\r\n\r\n this.myValueCursorTargetPosition = vec3_create(0, 0, 0);\r\n this.myValueCursorTargetPosition[2] = this._myColliderZOffset - this._myPanelZOffset;\r\n this.myValueCollisionExtents = vec3_create(0.065, 0.02, 1);\r\n this.myValueCollisionExtents[2] = this.myCursorTargetCollisionThickness;\r\n\r\n this.myValuePanelsPositions = [];\r\n this.myValuePanelsPositions[0] = vec3_create(0, 0, 0);\r\n for (let i = 1; i < this.myArraySize; i++) {\r\n this.myValuePanelsPositions[i] = this.myValuePanelsPositions[i - 1].pp_clone();\r\n this.myValuePanelsPositions[i][1] -= this._myDistanceBetweenValues;\r\n }\r\n }\r\n\r\n _setupRuntimeConfigHook() {\r\n this.myTextHoverScaleMultiplier = vec3_create(1.1, 1.1, 1.1);\r\n\r\n this.myThumbstickToggleThreshold = 0.6;\r\n this.myButtonEditDelay = 0;\r\n }\r\n}", "import { CollisionComponent, MeshComponent, TextComponent } from \"@wonderlandengine/api\";\r\nimport { CursorTarget } from \"@wonderlandengine/components\";\r\nimport { EasyTuneBaseWidgetUI } from \"../base/easy_tune_base_widget_ui.js\";\r\n\r\nexport class EasyTuneBoolArrayWidgetUI extends EasyTuneBaseWidgetUI {\r\n\r\n constructor(engine) {\r\n super(engine);\r\n }\r\n\r\n setAdditionalButtonsVisible(visible) {\r\n this._myAdditionalButtonsVisible = visible;\r\n\r\n for (let i = 0; i < this._myConfig.myArraySize; i++) {\r\n this.myValueIncreaseButtonPanels[i].pp_setActive(this._myAdditionalButtonsVisible);\r\n this.myValueDecreaseButtonPanels[i].pp_setActive(this._myAdditionalButtonsVisible);\r\n }\r\n }\r\n\r\n _buildHook() {\r\n this._myAdditionalButtonsVisible = true;\r\n }\r\n\r\n _createSkeletonHook() {\r\n this.myValuesPanel = this.myDisplayPanel.pp_addChild();\r\n\r\n this.myValuePanels = [];\r\n this.myValueTexts = [];\r\n this.myValueCursorTargets = [];\r\n\r\n this.myValueIncreaseButtonPanels = [];\r\n this.myValueIncreaseButtonBackgrounds = [];\r\n this.myValueIncreaseButtonTexts = [];\r\n this.myValueIncreaseButtonCursorTargets = [];\r\n\r\n this.myValueDecreaseButtonPanels = [];\r\n this.myValueDecreaseButtonBackgrounds = [];\r\n this.myValueDecreaseButtonTexts = [];\r\n this.myValueDecreaseButtonCursorTargets = [];\r\n\r\n for (let i = 0; i < this._myConfig.myArraySize; i++) {\r\n this.myValuePanels[i] = this.myValuesPanel.pp_addChild();\r\n this.myValueTexts[i] = this.myValuePanels[i].pp_addChild();\r\n this.myValueCursorTargets[i] = this.myValuePanels[i].pp_addChild();\r\n\r\n this.myValueIncreaseButtonPanels[i] = this.myValuePanels[i].pp_addChild();\r\n this.myValueIncreaseButtonBackgrounds[i] = this.myValueIncreaseButtonPanels[i].pp_addChild();\r\n this.myValueIncreaseButtonTexts[i] = this.myValueIncreaseButtonPanels[i].pp_addChild();\r\n this.myValueIncreaseButtonCursorTargets[i] = this.myValueIncreaseButtonPanels[i].pp_addChild();\r\n\r\n this.myValueDecreaseButtonPanels[i] = this.myValuePanels[i].pp_addChild();\r\n this.myValueDecreaseButtonBackgrounds[i] = this.myValueDecreaseButtonPanels[i].pp_addChild();\r\n this.myValueDecreaseButtonTexts[i] = this.myValueDecreaseButtonPanels[i].pp_addChild();\r\n this.myValueDecreaseButtonCursorTargets[i] = this.myValueDecreaseButtonPanels[i].pp_addChild();\r\n }\r\n }\r\n\r\n _setTransformHook() {\r\n this.myValuesPanel.pp_setPositionLocal(this._myConfig.myValuesPanelPosition);\r\n\r\n for (let i = 0; i < this._myConfig.myArraySize; i++) {\r\n this.myValuePanels[i].pp_setPositionLocal(this._myConfig.myValuePanelsPositions[i]);\r\n this.myValueTexts[i].pp_scaleObject(this._myConfig.myValueTextScale);\r\n this.myValueCursorTargets[i].pp_setPositionLocal(this._myConfig.myValueCursorTargetPosition);\r\n\r\n this.myValueIncreaseButtonPanels[i].pp_setPositionLocal(this._myConfig.myRightSideButtonPosition);\r\n this.myValueIncreaseButtonBackgrounds[i].pp_scaleObject(this._myConfig.mySideButtonBackgroundScale);\r\n this.myValueIncreaseButtonTexts[i].pp_setPositionLocal(this._myConfig.mySideButtonTextPosition);\r\n this.myValueIncreaseButtonTexts[i].pp_scaleObject(this._myConfig.mySideButtonTextScale);\r\n this.myValueIncreaseButtonCursorTargets[i].pp_setPositionLocal(this._myConfig.mySideButtonCursorTargetPosition);\r\n\r\n this.myValueDecreaseButtonPanels[i].pp_setPositionLocal(this._myConfig.myLeftSideButtonPosition);\r\n this.myValueDecreaseButtonBackgrounds[i].pp_scaleObject(this._myConfig.mySideButtonBackgroundScale);\r\n this.myValueDecreaseButtonTexts[i].pp_setPositionLocal(this._myConfig.mySideButtonTextPosition);\r\n this.myValueDecreaseButtonTexts[i].pp_scaleObject(this._myConfig.mySideButtonTextScale);\r\n this.myValueDecreaseButtonCursorTargets[i].pp_setPositionLocal(this._myConfig.mySideButtonCursorTargetPosition);\r\n }\r\n }\r\n\r\n _addComponentsHook() {\r\n this.myValueTextComponents = [];\r\n this.myValueCursorTargetComponents = [];\r\n this.myValueCollisionComponents = [];\r\n\r\n this.myValueIncreaseButtonBackgroundComponents = [];\r\n this.myValueIncreaseButtonTextComponents = [];\r\n this.myValueIncreaseButtonCursorTargetComponents = [];\r\n this.myValueIncreaseButtonCollisionComponents = [];\r\n\r\n this.myValueDecreaseButtonBackgroundComponents = [];\r\n this.myValueDecreaseButtonTextComponents = [];\r\n this.myValueDecreaseButtonCursorTargetComponents = [];\r\n this.myValueDecreaseButtonCollisionComponents = [];\r\n\r\n\r\n for (let i = 0; i < this._myConfig.myArraySize; i++) {\r\n this.myValueTextComponents[i] = this.myValueTexts[i].pp_addComponent(TextComponent);\r\n this._setupTextComponent(this.myValueTextComponents[i]);\r\n this.myValueTextComponents[i].text = \" \";\r\n\r\n this.myValueCursorTargetComponents[i] = this.myValueCursorTargets[i].pp_addComponent(CursorTarget);\r\n this.myValueCollisionComponents[i] = this.myValueCursorTargets[i].pp_addComponent(CollisionComponent);\r\n this.myValueCollisionComponents[i].collider = this._myConfig.myCursorTargetCollisionCollider;\r\n this.myValueCollisionComponents[i].group = 1 << this._myConfig.myCursorTargetCollisionGroup;\r\n this.myValueCollisionComponents[i].extents = this._myConfig.myValueCollisionExtents;\r\n\r\n this.myValueIncreaseButtonBackgroundComponents[i] = this.myValueIncreaseButtonBackgrounds[i].pp_addComponent(MeshComponent);\r\n this.myValueIncreaseButtonBackgroundComponents[i].mesh = this._myPlaneMesh;\r\n this.myValueIncreaseButtonBackgroundComponents[i].material = this._myParams.myPlaneMaterial.clone();\r\n this.myValueIncreaseButtonBackgroundComponents[i].material.color = this._myConfig.myBackgroundColor;\r\n\r\n this.myValueIncreaseButtonTextComponents[i] = this.myValueIncreaseButtonTexts[i].pp_addComponent(TextComponent);\r\n this._setupTextComponent(this.myValueIncreaseButtonTextComponents[i]);\r\n this.myValueIncreaseButtonTextComponents[i].text = this._myConfig.myIncreaseButtonText;\r\n\r\n this.myValueIncreaseButtonCursorTargetComponents[i] = this.myValueIncreaseButtonCursorTargets[i].pp_addComponent(CursorTarget);\r\n this.myValueIncreaseButtonCollisionComponents[i] = this.myValueIncreaseButtonCursorTargets[i].pp_addComponent(CollisionComponent);\r\n this.myValueIncreaseButtonCollisionComponents[i].collider = this._myConfig.myCursorTargetCollisionCollider;\r\n this.myValueIncreaseButtonCollisionComponents[i].group = 1 << this._myConfig.myCursorTargetCollisionGroup;\r\n this.myValueIncreaseButtonCollisionComponents[i].extents = this._myConfig.mySideButtonCollisionExtents;\r\n\r\n this.myValueDecreaseButtonBackgroundComponents[i] = this.myValueDecreaseButtonBackgrounds[i].pp_addComponent(MeshComponent);\r\n this.myValueDecreaseButtonBackgroundComponents[i].mesh = this._myPlaneMesh;\r\n this.myValueDecreaseButtonBackgroundComponents[i].material = this._myParams.myPlaneMaterial.clone();\r\n this.myValueDecreaseButtonBackgroundComponents[i].material.color = this._myConfig.myBackgroundColor;\r\n\r\n this.myValueDecreaseButtonTextComponents[i] = this.myValueDecreaseButtonTexts[i].pp_addComponent(TextComponent);\r\n this._setupTextComponent(this.myValueDecreaseButtonTextComponents[i]);\r\n this.myValueDecreaseButtonTextComponents[i].text = this._myConfig.myDecreaseButtonText;\r\n\r\n this.myValueDecreaseButtonCursorTargetComponents[i] = this.myValueDecreaseButtonCursorTargets[i].pp_addComponent(CursorTarget);\r\n this.myValueDecreaseButtonCollisionComponents[i] = this.myValueDecreaseButtonCursorTargets[i].pp_addComponent(CollisionComponent);\r\n this.myValueDecreaseButtonCollisionComponents[i].collider = this._myConfig.myCursorTargetCollisionCollider;\r\n this.myValueDecreaseButtonCollisionComponents[i].group = 1 << this._myConfig.myCursorTargetCollisionGroup;\r\n this.myValueDecreaseButtonCollisionComponents[i].extents = this._myConfig.mySideButtonCollisionExtents;\r\n }\r\n }\r\n\r\n _setVisibleHook(visible) {\r\n if (visible) {\r\n this.setAdditionalButtonsVisible(this._myAdditionalButtonsVisible);\r\n }\r\n }\r\n}", "import { CollisionComponent, MeshComponent, TextComponent } from \"@wonderlandengine/api\";\r\nimport { CursorTarget } from \"@wonderlandengine/components\";\r\nimport { XRUtils } from \"../../../../cauldron/utils/xr_utils.js\";\r\nimport { Globals } from \"../../../../pp/globals.js\";\r\nimport { ToolHandedness } from \"../../../cauldron/tool_types.js\";\r\n\r\nexport class EasyTuneBaseWidgetUI {\r\n\r\n constructor(engine = Globals.getMainEngine()) {\r\n this._myEngine = engine;\r\n\r\n this._myActive = false;\r\n this._myDestroyed = false;\r\n }\r\n\r\n build(parentObject, config, params) {\r\n this._myParentObject = parentObject;\r\n this._myConfig = config;\r\n this._myParams = params;\r\n\r\n this._myImportExportButtonsVisible = true;\r\n\r\n this._myPlaneMesh = Globals.getDefaultMeshes(this._myEngine).myDoubleSidedPlane;\r\n\r\n this._buildHook();\r\n\r\n this._createSkeleton();\r\n this._setTransforms();\r\n this._addComponents();\r\n\r\n this._setTransformForNonXR();\r\n\r\n this.setActive(true);\r\n }\r\n\r\n setVisible(visible) {\r\n this.myPivotObject.pp_setActive(visible);\r\n\r\n if (visible) {\r\n this.setImportExportButtonsVisible(this._myImportExportButtonsVisible);\r\n }\r\n\r\n this._setVisibleHook(visible);\r\n }\r\n\r\n setImportExportButtonsVisible(visible) {\r\n this._myImportExportButtonsVisible = visible;\r\n\r\n this.myImportExportPanel.pp_setActive(this._myImportExportButtonsVisible);\r\n }\r\n\r\n // Hooks\r\n\r\n _buildHook() {\r\n }\r\n\r\n _setVisibleHook(visible) {\r\n }\r\n\r\n _createSkeletonHook() {\r\n }\r\n\r\n _setTransformHook() {\r\n }\r\n\r\n _addComponentsHook() {\r\n }\r\n\r\n // Hooks end\r\n\r\n // Skeleton\r\n\r\n _createSkeleton() {\r\n this.myPivotObject = this._myParentObject.pp_addChild();\r\n\r\n this.myBackPanel = this.myPivotObject.pp_addChild();\r\n this.myBackBackground = this.myBackPanel.pp_addChild();\r\n\r\n // Display\r\n\r\n this.myDisplayPanel = this.myPivotObject.pp_addChild();\r\n\r\n this.myVariableLabelPanel = this.myDisplayPanel.pp_addChild();\r\n this.myVariableLabelText = this.myVariableLabelPanel.pp_addChild();\r\n this.myVariableLabelCursorTarget = this.myVariableLabelPanel.pp_addChild();\r\n\r\n // Next/Previous\r\n\r\n this.myNextButtonPanel = this.myVariableLabelPanel.pp_addChild();\r\n this.myNextButtonBackground = this.myNextButtonPanel.pp_addChild();\r\n this.myNextButtonText = this.myNextButtonPanel.pp_addChild();\r\n this.myNextButtonCursorTarget = this.myNextButtonPanel.pp_addChild();\r\n\r\n this.myPreviousButtonPanel = this.myVariableLabelPanel.pp_addChild();\r\n this.myPreviousButtonBackground = this.myPreviousButtonPanel.pp_addChild();\r\n this.myPreviousButtonText = this.myPreviousButtonPanel.pp_addChild();\r\n this.myPreviousButtonCursorTarget = this.myPreviousButtonPanel.pp_addChild();\r\n\r\n // Import/Export\r\n\r\n this.myImportExportPanel = this.myPivotObject.pp_addChild();\r\n\r\n this.myImportButtonPanel = this.myImportExportPanel.pp_addChild();\r\n this.myImportButtonBackground = this.myImportButtonPanel.pp_addChild();\r\n this.myImportButtonText = this.myImportButtonPanel.pp_addChild();\r\n this.myImportButtonCursorTarget = this.myImportButtonPanel.pp_addChild();\r\n\r\n this.myExportButtonPanel = this.myImportExportPanel.pp_addChild();\r\n this.myExportButtonBackground = this.myExportButtonPanel.pp_addChild();\r\n this.myExportButtonText = this.myExportButtonPanel.pp_addChild();\r\n this.myExportButtonCursorTarget = this.myExportButtonPanel.pp_addChild();\r\n\r\n // Pointer\r\n\r\n this.myPointerCursorTarget = this.myPivotObject.pp_addChild();\r\n\r\n this._createSkeletonHook();\r\n }\r\n\r\n // Transforms\r\n\r\n _setTransforms() {\r\n this.myPivotObject.pp_setPositionLocal(this._myConfig.myPivotObjectPositions[this._myParams.myHandedness]);\r\n\r\n this.myBackPanel.pp_setPositionLocal(this._myConfig.myBackPanelPosition);\r\n this.myBackBackground.pp_scaleObject(this._myConfig.myBackBackgroundScale);\r\n\r\n // Display\r\n this.myDisplayPanel.pp_setPositionLocal(this._myConfig.myDisplayPanelPosition);\r\n\r\n this.myVariableLabelPanel.pp_setPositionLocal(this._myConfig.myVariableLabelPanelPosition);\r\n this.myVariableLabelText.pp_scaleObject(this._myConfig.myVariableLabelTextScale);\r\n this.myVariableLabelCursorTarget.pp_setPositionLocal(this._myConfig.myVariableLabelCursorTargetPosition);\r\n\r\n // Next/Previous\r\n\r\n this.myNextButtonPanel.pp_setPositionLocal(this._myConfig.myRightSideButtonPosition);\r\n this.myNextButtonBackground.pp_scaleObject(this._myConfig.mySideButtonBackgroundScale);\r\n this.myNextButtonText.pp_setPositionLocal(this._myConfig.mySideButtonTextPosition);\r\n this.myNextButtonText.pp_scaleObject(this._myConfig.mySideButtonTextScale);\r\n this.myNextButtonCursorTarget.pp_setPositionLocal(this._myConfig.mySideButtonCursorTargetPosition);\r\n\r\n this.myPreviousButtonPanel.pp_setPositionLocal(this._myConfig.myLeftSideButtonPosition);\r\n this.myPreviousButtonBackground.pp_scaleObject(this._myConfig.mySideButtonBackgroundScale);\r\n this.myPreviousButtonText.pp_setPositionLocal(this._myConfig.mySideButtonTextPosition);\r\n this.myPreviousButtonText.pp_scaleObject(this._myConfig.mySideButtonTextScale);\r\n this.myPreviousButtonCursorTarget.pp_setPositionLocal(this._myConfig.mySideButtonCursorTargetPosition);\r\n\r\n // Import/Export\r\n\r\n this.myImportExportPanel.pp_setPositionLocal(this._myConfig.myImportExportPanelPosition);\r\n\r\n this.myImportButtonPanel.pp_setPositionLocal(this._myConfig.myImportButtonPosition);\r\n this.myImportButtonBackground.pp_scaleObject(this._myConfig.myImportExportButtonBackgroundScale);\r\n this.myImportButtonText.pp_setPositionLocal(this._myConfig.myImportExportButtonTextPosition);\r\n this.myImportButtonText.pp_scaleObject(this._myConfig.myImportExportButtonTextScale);\r\n this.myImportButtonCursorTarget.pp_setPositionLocal(this._myConfig.myImportExportButtonCursorTargetPosition);\r\n\r\n this.myExportButtonPanel.pp_setPositionLocal(this._myConfig.myExportButtonPosition);\r\n this.myExportButtonBackground.pp_scaleObject(this._myConfig.myImportExportButtonBackgroundScale);\r\n this.myExportButtonText.pp_setPositionLocal(this._myConfig.myImportExportButtonTextPosition);\r\n this.myExportButtonText.pp_scaleObject(this._myConfig.myImportExportButtonTextScale);\r\n this.myExportButtonCursorTarget.pp_setPositionLocal(this._myConfig.myImportExportButtonCursorTargetPosition);\r\n\r\n // Pointer\r\n\r\n this.myPointerCursorTarget.pp_setPositionLocal(this._myConfig.myPointerCursorTargetPosition);\r\n\r\n this._setTransformHook();\r\n }\r\n\r\n // Components\r\n\r\n _addComponents() {\r\n this.myBackBackgroundComponent = this.myBackBackground.pp_addComponent(MeshComponent);\r\n this.myBackBackgroundComponent.mesh = this._myPlaneMesh;\r\n this.myBackBackgroundComponent.material = this._myParams.myPlaneMaterial.clone();\r\n this.myBackBackgroundComponent.material.color = this._myConfig.myBackBackgroundColor;\r\n\r\n // Display\r\n\r\n this.myVariableLabelTextComponent = this.myVariableLabelText.pp_addComponent(TextComponent);\r\n this._setupTextComponent(this.myVariableLabelTextComponent);\r\n this.myVariableLabelTextComponent.text = \" \";\r\n\r\n this.myVariableLabelCursorTargetComponent = this.myVariableLabelCursorTarget.pp_addComponent(CursorTarget);\r\n this.myVariableLabelCollisionComponent = this.myVariableLabelCursorTarget.pp_addComponent(CollisionComponent);\r\n this.myVariableLabelCollisionComponent.collider = this._myConfig.myCursorTargetCollisionCollider;\r\n this.myVariableLabelCollisionComponent.group = 1 << this._myConfig.myCursorTargetCollisionGroup;\r\n this.myVariableLabelCollisionComponent.extents = this._myConfig.myVariableLabelCollisionExtents;\r\n\r\n // Next/Previous\r\n\r\n this.myNextButtonBackgroundComponent = this.myNextButtonBackground.pp_addComponent(MeshComponent);\r\n this.myNextButtonBackgroundComponent.mesh = this._myPlaneMesh;\r\n this.myNextButtonBackgroundComponent.material = this._myParams.myPlaneMaterial.clone();\r\n this.myNextButtonBackgroundComponent.material.color = this._myConfig.myBackgroundColor;\r\n\r\n this.myNextButtonTextComponent = this.myNextButtonText.pp_addComponent(TextComponent);\r\n this._setupTextComponent(this.myNextButtonTextComponent);\r\n this.myNextButtonTextComponent.text = this._myConfig.myNextButtonText;\r\n\r\n this.myNextButtonCursorTargetComponent = this.myNextButtonCursorTarget.pp_addComponent(CursorTarget);\r\n this.myNextButtonCollisionComponent = this.myNextButtonCursorTarget.pp_addComponent(CollisionComponent);\r\n this.myNextButtonCollisionComponent.collider = this._myConfig.myCursorTargetCollisionCollider;\r\n this.myNextButtonCollisionComponent.group = 1 << this._myConfig.myCursorTargetCollisionGroup;\r\n this.myNextButtonCollisionComponent.extents = this._myConfig.mySideButtonCollisionExtents;\r\n\r\n this.myPreviousButtonBackgroundComponent = this.myPreviousButtonBackground.pp_addComponent(MeshComponent);\r\n this.myPreviousButtonBackgroundComponent.mesh = this._myPlaneMesh;\r\n this.myPreviousButtonBackgroundComponent.material = this._myParams.myPlaneMaterial.clone();\r\n this.myPreviousButtonBackgroundComponent.material.color = this._myConfig.myBackgroundColor;\r\n\r\n this.myPreviousButtonTextComponent = this.myPreviousButtonText.pp_addComponent(TextComponent);\r\n this._setupTextComponent(this.myPreviousButtonTextComponent);\r\n this.myPreviousButtonTextComponent.text = this._myConfig.myPreviousButtonText;\r\n\r\n this.myPreviousButtonCursorTargetComponent = this.myPreviousButtonCursorTarget.pp_addComponent(CursorTarget);\r\n this.myPreviousButtonCollisionComponent = this.myPreviousButtonCursorTarget.pp_addComponent(CollisionComponent);\r\n this.myPreviousButtonCollisionComponent.collider = this._myConfig.myCursorTargetCollisionCollider;\r\n this.myPreviousButtonCollisionComponent.group = 1 << this._myConfig.myCursorTargetCollisionGroup;\r\n this.myPreviousButtonCollisionComponent.extents = this._myConfig.mySideButtonCollisionExtents;\r\n\r\n // Import/Export\r\n\r\n this.myImportButtonBackgroundComponent = this.myImportButtonBackground.pp_addComponent(MeshComponent);\r\n this.myImportButtonBackgroundComponent.mesh = this._myPlaneMesh;\r\n this.myImportButtonBackgroundComponent.material = this._myParams.myPlaneMaterial.clone();\r\n this.myImportButtonBackgroundComponent.material.color = this._myConfig.myBackgroundColor;\r\n\r\n this.myImportButtonTextComponent = this.myImportButtonText.pp_addComponent(TextComponent);\r\n this._setupTextComponent(this.myImportButtonTextComponent);\r\n this.myImportButtonTextComponent.text = this._myConfig.myImportButtonText;\r\n\r\n this.myImportButtonCursorTargetComponent = this.myImportButtonCursorTarget.pp_addComponent(CursorTarget);\r\n this.myImportButtonCollisionComponent = this.myImportButtonCursorTarget.pp_addComponent(CollisionComponent);\r\n this.myImportButtonCollisionComponent.collider = this._myConfig.myCursorTargetCollisionCollider;\r\n this.myImportButtonCollisionComponent.group = 1 << this._myConfig.myCursorTargetCollisionGroup;\r\n this.myImportButtonCollisionComponent.extents = this._myConfig.myImportExportButtonCollisionExtents;\r\n\r\n this.myExportButtonBackgroundComponent = this.myExportButtonBackground.pp_addComponent(MeshComponent);\r\n this.myExportButtonBackgroundComponent.mesh = this._myPlaneMesh;\r\n this.myExportButtonBackgroundComponent.material = this._myParams.myPlaneMaterial.clone();\r\n this.myExportButtonBackgroundComponent.material.color = this._myConfig.myBackgroundColor;\r\n\r\n this.myExportButtonTextComponent = this.myExportButtonText.pp_addComponent(TextComponent);\r\n this._setupTextComponent(this.myExportButtonTextComponent);\r\n this.myExportButtonTextComponent.text = this._myConfig.myExportButtonText;\r\n\r\n this.myExportButtonCursorTargetComponent = this.myExportButtonCursorTarget.pp_addComponent(CursorTarget);\r\n this.myExportButtonCollisionComponent = this.myExportButtonCursorTarget.pp_addComponent(CollisionComponent);\r\n this.myExportButtonCollisionComponent.collider = this._myConfig.myCursorTargetCollisionCollider;\r\n this.myExportButtonCollisionComponent.group = 1 << this._myConfig.myCursorTargetCollisionGroup;\r\n this.myExportButtonCollisionComponent.extents = this._myConfig.myImportExportButtonCollisionExtents;\r\n\r\n // Pointer\r\n\r\n this.myPointerCollisionComponent = this.myPointerCursorTarget.pp_addComponent(CollisionComponent);\r\n this.myPointerCollisionComponent.collider = this._myConfig.myCursorTargetCollisionCollider;\r\n this.myPointerCollisionComponent.group = 1 << this._myConfig.myCursorTargetCollisionGroup;\r\n this.myPointerCollisionComponent.extents = this._myConfig.myPointerCollisionExtents;\r\n\r\n this._addComponentsHook();\r\n }\r\n\r\n _setupTextComponent(textComponent) {\r\n textComponent.alignment = this._myConfig.myTextAlignment;\r\n textComponent.verticalAlignment = this._myConfig.myTextVerticalAlignment;\r\n textComponent.material = this._myParams.myTextMaterial.clone();\r\n textComponent.material.color = this._myConfig.myTextColor;\r\n textComponent.text = \"\";\r\n }\r\n\r\n _onXRSessionStart() {\r\n this._setTransformForXR();\r\n }\r\n\r\n _onXRSessionEnd() {\r\n this._setTransformForNonXR();\r\n }\r\n\r\n _setTransformForXR() {\r\n this.myPivotObject.pp_setPositionLocal(this._myConfig.myPivotObjectPositions[this._myParams.myHandedness]);\r\n }\r\n\r\n _setTransformForNonXR() {\r\n this.myPivotObject.pp_setPositionLocal(this._myConfig.myPivotObjectPositions[ToolHandedness.NONE]);\r\n }\r\n\r\n setActive(active) {\r\n if (this._myActive != active) {\r\n this._myActive = active;\r\n\r\n if (this._myActive) {\r\n XRUtils.registerSessionStartEndEventListeners(this, this._onXRSessionStart.bind(this), this._onXRSessionEnd.bind(this), true, false, this._myEngine);\r\n } else {\r\n XRUtils.unregisterSessionStartEndEventListeners(this, this._myEngine);\r\n }\r\n }\r\n }\r\n\r\n destroy() {\r\n this._myDestroyed = true;\r\n\r\n this.setActive(false);\r\n }\r\n\r\n isDestroyed() {\r\n return this._myDestroyed;\r\n }\r\n}", "import { GamepadAxesID } from \"../../../../input/gamepad/gamepad_buttons.js\";\r\nimport { Globals } from \"../../../../pp/globals.js\";\r\nimport { EasyTuneBaseWidget } from \"../base/easy_tune_base_widget.js\";\r\nimport { EasyTuneBoolArrayWidgetConfig } from \"./easy_tune_bool_array_widget_config.js\";\r\nimport { EasyTuneBoolArrayWidgetUI } from \"./easy_tune_bool_array_widget_ui.js\";\r\n\r\nexport class EasyTuneBoolArrayWidget extends EasyTuneBaseWidget {\r\n\r\n constructor(params, arraySize, gamepad, engine = Globals.getMainEngine()) {\r\n super(params);\r\n\r\n this._myNonArray = arraySize == null;\r\n this._myArraySize = this._myNonArray ? 1 : arraySize;\r\n\r\n this._myConfig = new EasyTuneBoolArrayWidgetConfig(this._myArraySize);\r\n this._myUI = new EasyTuneBoolArrayWidgetUI(engine);\r\n\r\n this._myGamepad = gamepad;\r\n\r\n this._myValueEditIndex = 0;\r\n this._myValueButtonEditIntensity = 0;\r\n this._myValueButtonEditIntensityTimer = 0;\r\n this._myValueEditEnabled = false;\r\n\r\n this._myTempValue = [];\r\n\r\n this._myTempNonArrayValue = [0];\r\n this._myTempNonArrayDefaultValue = [0];\r\n }\r\n\r\n _refreshUIHook() {\r\n for (let i = 0; i < this._myArraySize; i++) {\r\n this._myUI.myValueTextComponents[i].text = (this._getVariableValue()[i]) ? \"true\" : \"false\";\r\n }\r\n }\r\n\r\n _startHook(parentObject, easyTuneParams) {\r\n this._myUI.setAdditionalButtonsVisible(easyTuneParams.myShowAdditionalButtons);\r\n }\r\n\r\n _setEasyTuneVariableHook() {\r\n if (this._myVariable != null) {\r\n this._myTempValue.pp_copy(this._getVariableValue());\r\n }\r\n }\r\n\r\n _updateHook(dt) {\r\n this._updateValue(dt);\r\n }\r\n\r\n _updateValue(dt) {\r\n let stickVariableIntensity = 0;\r\n\r\n if (this._myGamepad) {\r\n stickVariableIntensity = this._myGamepad.getAxesInfo(GamepadAxesID.THUMBSTICK).myAxes[1];\r\n }\r\n\r\n let valueIntensity = 0;\r\n if (this._myValueEditEnabled) {\r\n valueIntensity = stickVariableIntensity;\r\n } else if (this._myValueButtonEditIntensity != 0) {\r\n if (this._myValueButtonEditIntensityTimer <= 0) {\r\n valueIntensity = this._myValueButtonEditIntensity;\r\n } else {\r\n this._myValueButtonEditIntensityTimer -= dt;\r\n }\r\n }\r\n\r\n if (this._myValueEditIndex >= 0 && this._myValueEditIndex < this._getVariableValue().length) {\r\n if (Math.abs(valueIntensity) > this._myConfig.myThumbstickToggleThreshold) {\r\n this._myTempValue.pp_copy(this._getVariableValue());\r\n this._myTempValue[this._myValueEditIndex] = valueIntensity > 0;\r\n this._setVariableValue(this._myTempValue);\r\n this._refreshUI();\r\n }\r\n }\r\n }\r\n\r\n _addListenersHook() {\r\n let ui = this._myUI;\r\n\r\n ui.myVariableLabelCursorTargetComponent.onClick.add(this._resetAllValues.bind(this));\r\n ui.myVariableLabelCursorTargetComponent.onHover.add(this._genericTextHover.bind(this, ui.myVariableLabelText));\r\n ui.myVariableLabelCursorTargetComponent.onUnhover.add(this._genericTextUnhover.bind(this, ui.myVariableLabelText, this._myConfig.myVariableLabelTextScale));\r\n\r\n this._myUnhoverCallbacks.push(this._genericTextUnhover.bind(this, ui.myVariableLabelText, this._myConfig.myVariableLabelTextScale));\r\n\r\n for (let i = 0; i < this._myArraySize; i++) {\r\n ui.myValueIncreaseButtonCursorTargetComponents[i].onDown.add(this._setValueEditIntensity.bind(this, i, 1));\r\n ui.myValueIncreaseButtonCursorTargetComponents[i].onDownOnHover.add(this._setValueEditIntensity.bind(this, i, 1));\r\n ui.myValueIncreaseButtonCursorTargetComponents[i].onUp.add(this._setValueEditIntensity.bind(this, i, 0));\r\n ui.myValueIncreaseButtonCursorTargetComponents[i].onUnhover.add(this._setValueEditIntensity.bind(this, i, 0));\r\n ui.myValueDecreaseButtonCursorTargetComponents[i].onDown.add(this._setValueEditIntensity.bind(this, i, -1));\r\n ui.myValueDecreaseButtonCursorTargetComponents[i].onDownOnHover.add(this._setValueEditIntensity.bind(this, i, -1));\r\n ui.myValueDecreaseButtonCursorTargetComponents[i].onUp.add(this._setValueEditIntensity.bind(this, i, 0));\r\n ui.myValueDecreaseButtonCursorTargetComponents[i].onUnhover.add(this._setValueEditIntensity.bind(this, i, 0));\r\n\r\n this._myUnhoverCallbacks.push(this._setValueEditIntensity.bind(this, i, 0));\r\n\r\n ui.myValueIncreaseButtonCursorTargetComponents[i].onHover.add(this._genericHover.bind(this, ui.myValueIncreaseButtonBackgroundComponents[i].material));\r\n ui.myValueIncreaseButtonCursorTargetComponents[i].onUnhover.add(this._genericUnhover.bind(this, ui.myValueIncreaseButtonBackgroundComponents[i].material));\r\n ui.myValueDecreaseButtonCursorTargetComponents[i].onHover.add(this._genericHover.bind(this, ui.myValueDecreaseButtonBackgroundComponents[i].material));\r\n ui.myValueDecreaseButtonCursorTargetComponents[i].onUnhover.add(this._genericUnhover.bind(this, ui.myValueDecreaseButtonBackgroundComponents[i].material));\r\n\r\n this._myUnhoverCallbacks.push(this._genericUnhover.bind(this, ui.myValueIncreaseButtonBackgroundComponents[i].material));\r\n this._myUnhoverCallbacks.push(this._genericUnhover.bind(this, ui.myValueDecreaseButtonBackgroundComponents[i].material));\r\n\r\n ui.myValueCursorTargetComponents[i].onClick.add(this._resetValue.bind(this, i));\r\n ui.myValueCursorTargetComponents[i].onHover.add(this._setValueEditEnabled.bind(this, i, ui.myValueTexts[i], true));\r\n ui.myValueCursorTargetComponents[i].onUnhover.add(this._setValueEditEnabled.bind(this, i, ui.myValueTexts[i], false));\r\n\r\n this._myUnhoverCallbacks.push(this._setValueEditEnabled.bind(this, i, ui.myValueTexts[i], false));\r\n }\r\n }\r\n\r\n _setValueEditIntensity(index, value) {\r\n if (this._isActive() || value == 0) {\r\n if (value != 0) {\r\n this._myValueButtonEditIntensityTimer = this._myConfig.myButtonEditDelay;\r\n this._myValueEditIndex = index;\r\n }\r\n\r\n this._myValueButtonEditIntensity = value;\r\n }\r\n }\r\n\r\n _setValueEditEnabled(index, text, enabled) {\r\n if (this._isActive() || !enabled) {\r\n if (enabled) {\r\n this._myValueEditIndex = index;\r\n text.pp_scaleObject(this._myConfig.myTextHoverScaleMultiplier);\r\n } else {\r\n text.pp_setScaleLocal(this._myConfig.myValueTextScale);\r\n }\r\n\r\n this._myValueEditEnabled = enabled;\r\n }\r\n }\r\n\r\n _resetValue(index) {\r\n if (this._isActive()) {\r\n this._myTempValue.pp_copy(this._getVariableValue());\r\n this._myTempValue[index] = this._getVariableDefaultValue()[index];\r\n this._setVariableValue(this._myTempValue);\r\n\r\n this._myUI.myValueTextComponents[index].text = (this._getVariableValue()[index]) ? \"true\" : \"false\";\r\n }\r\n }\r\n\r\n _resetAllValues() {\r\n for (let i = 0; i < this._myArraySize; i++) {\r\n this._resetValue(i);\r\n }\r\n }\r\n\r\n _genericTextHover(text) {\r\n text.pp_scaleObject(this._myConfig.myTextHoverScaleMultiplier);\r\n }\r\n\r\n _genericTextUnhover(text, originalScale) {\r\n text.pp_setScaleLocal(originalScale);\r\n }\r\n\r\n _getVariableValue() {\r\n if (this._myNonArray) {\r\n this._myTempNonArrayValue[0] = this._myVariable.getValue();\r\n return this._myTempNonArrayValue;\r\n }\r\n\r\n return this._myVariable.getValue();\r\n }\r\n\r\n _getVariableDefaultValue() {\r\n if (this._myNonArray) {\r\n this._myTempNonArrayDefaultValue[0] = this._myVariable.getDefaultValue();\r\n return this._myTempNonArrayDefaultValue;\r\n }\r\n\r\n return this._myVariable.getDefaultValue();\r\n }\r\n\r\n _setVariableValue(value) {\r\n if (this._myNonArray) {\r\n this._myVariable.setValue(value[0]);\r\n } else {\r\n this._myVariable.setValue(this._myTempValue);\r\n }\r\n }\r\n}", "import { EasyTuneBaseArrayWidgetSelector } from \"../base/easy_tune_base_array_widget_selector.js\";\r\nimport { EasyTuneBoolArrayWidget } from \"./easy_tune_bool_array_widget.js\";\r\n\r\nexport class EasyTuneBoolArrayWidgetSelector extends EasyTuneBaseArrayWidgetSelector {\r\n\r\n _getEasyTuneArrayWidget(arraySize) {\r\n return new EasyTuneBoolArrayWidget(this._myParams, arraySize, this._myGamepad, this._myEngine);\r\n }\r\n}", "import { ToolHandedness } from \"../../cauldron/tool_types.js\";\r\n\r\nexport class EasyTuneWidgetConfig {\r\n\r\n constructor() {\r\n this._setupRuntimeConfig();\r\n }\r\n\r\n _setupRuntimeConfig() {\r\n this.myGamepadHandedness = ToolHandedness.RIGHT;\r\n\r\n this.myScrollVariableDelay = 0.5;\r\n this.myScrollVariableMinXThreshold = 0.6;\r\n this.myScrollVariableMaxYThreshold = 0.25;\r\n this.myScrollVariableButtonID = null;\r\n\r\n this.myRefreshVariablesDelay = null;\r\n }\r\n}", "import { vec3_create } from \"../../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { EasyTuneBaseWidgetConfig } from \"../base/easy_tune_base_widget_config.js\";\r\n\r\nexport class EasyTuneNoneWidgetConfig extends EasyTuneBaseWidgetConfig {\r\n\r\n _getBackPanelMinY() {\r\n return super._getBackPanelMinY() + this.myTypeNotSupportedPanelPosition[1];\r\n }\r\n\r\n _getPivotZOffset() {\r\n return 0.00804713;\r\n }\r\n\r\n _setupBuildConfigHook() {\r\n this.myTypeNotSupportedPanelPosition = vec3_create(0, -0.03, this._myPanelZOffset);\r\n this.myTypeNotSupportedTextScale = vec3_create(0.275, 0.275, 0.275);\r\n this.myTypeNotSupportedText = \"Type Not Supported\";\r\n }\r\n}", "import { TextComponent } from \"@wonderlandengine/api\";\r\nimport { EasyTuneBaseWidgetUI } from \"../base/easy_tune_base_widget_ui.js\";\r\n\r\nexport class EasyTuneNoneWidgetUI extends EasyTuneBaseWidgetUI {\r\n\r\n constructor(engine) {\r\n super(engine);\r\n }\r\n\r\n _createSkeletonHook() {\r\n this.myTypeNotSupportedPanel = this.myDisplayPanel.pp_addChild();\r\n this.myTypeNotSupportedText = this.myTypeNotSupportedPanel.pp_addChild();\r\n this.myTypeNotSupportedCursorTarget = this.myTypeNotSupportedPanel.pp_addChild();\r\n }\r\n\r\n _setTransformHook() {\r\n this.myTypeNotSupportedPanel.pp_setPositionLocal(this._myConfig.myTypeNotSupportedPanelPosition);\r\n this.myTypeNotSupportedText.pp_scaleObject(this._myConfig.myTypeNotSupportedTextScale);\r\n }\r\n\r\n _addComponentsHook() {\r\n this.myTypeNotSupportedTextComponent = this.myTypeNotSupportedText.pp_addComponent(TextComponent);\r\n this._setupTextComponent(this.myTypeNotSupportedTextComponent);\r\n this.myTypeNotSupportedTextComponent.text = this._myConfig.myTypeNotSupportedText;\r\n }\r\n}", "import { Globals } from \"../../../../pp/globals.js\";\r\nimport { EasyTuneBaseWidget } from \"../base/easy_tune_base_widget.js\";\r\nimport { EasyTuneNoneWidgetConfig } from \"./easy_tune_none_widget_config.js\";\r\nimport { EasyTuneNoneWidgetUI } from \"./easy_tune_none_widget_ui.js\";\r\n\r\nexport class EasyTuneNoneWidget extends EasyTuneBaseWidget {\r\n\r\n constructor(params, engine = Globals.getMainEngine()) {\r\n super(params);\r\n\r\n this._myConfig = new EasyTuneNoneWidgetConfig();\r\n this._myUI = new EasyTuneNoneWidgetUI(engine);\r\n }\r\n}", "import { vec3_create } from \"../../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { EasyTuneBaseWidgetConfig } from \"../base/easy_tune_base_widget_config.js\";\r\n\r\nexport class EasyTuneNumberArrayWidgetConfig extends EasyTuneBaseWidgetConfig {\r\n\r\n constructor(arraySize) {\r\n super();\r\n\r\n this.myArraySize = arraySize;\r\n }\r\n\r\n _getBackPanelMinY() {\r\n return this.myStepPanelPosition[1] - this._mySideButtonDistanceFromBorder * 1.25 - this.mySideButtonBackgroundScale[1];\r\n }\r\n\r\n _getPivotZOffset() {\r\n return 0.00803713;\r\n }\r\n\r\n _setupBuildConfigHook() {\r\n this.myIncreaseButtonText = \"+\";\r\n this.myDecreaseButtonText = \"-\";\r\n\r\n this._myValuePanelDistanceFromVariableLabelPanel = 0.055;\r\n this._myDistanceBetweenValues = this.mySideButtonBackgroundScale[1] * 2 + 0.015;\r\n\r\n this.myValuesPanelPosition = [0, this.myVariableLabelPanelPosition[1] - this._myValuePanelDistanceFromVariableLabelPanel, this._myPanelZOffset];\r\n\r\n this.myValueTextScale = vec3_create(0.4, 0.4, 0.4);\r\n\r\n this.myValueCursorTargetPosition = vec3_create(0, 0, 0);\r\n this.myValueCursorTargetPosition[2] = this._myColliderZOffset - this._myPanelZOffset;\r\n this.myValueCollisionExtents = vec3_create(0.065, 0.02, 1);\r\n this.myValueCollisionExtents[2] = this.myCursorTargetCollisionThickness;\r\n\r\n this.myValuePanelsPositions = [];\r\n this.myValuePanelsPositions[0] = vec3_create(0, 0, 0);\r\n for (let i = 1; i < this.myArraySize; i++) {\r\n this.myValuePanelsPositions[i] = this.myValuePanelsPositions[i - 1].pp_clone();\r\n this.myValuePanelsPositions[i][1] -= this._myDistanceBetweenValues;\r\n }\r\n\r\n let valuePanelLastPosition = (this.myValuePanelsPositions[this.myArraySize - 1]) ? this.myValuePanelsPositions[this.myArraySize - 1][1] : 0;\r\n this.myStepPanelPosition = [0, this.myDisplayPanelPosition[1] + this.myValuesPanelPosition[1] + valuePanelLastPosition - this._myValuePanelDistanceFromVariableLabelPanel, this._myPanelZOffset];\r\n this.myStepTextScale = this.myLabelTextScale;\r\n this.myStepStartString = \"Step: \";\r\n\r\n this.myStepCursorTargetPosition = vec3_create(0, 0, 0);\r\n this.myStepCursorTargetPosition[2] = this._myColliderZOffset - this.myStepPanelPosition[2];\r\n this.myStepCollisionExtents = vec3_create(0.065, 0.0175, 1);\r\n this.myStepCollisionExtents[2] = this.myCursorTargetCollisionThickness;\r\n }\r\n\r\n _setupRuntimeConfigHook() {\r\n this.myTextHoverScaleMultiplier = vec3_create(1.1, 1.1, 1.1);\r\n\r\n this.myEditThumbstickMinThreshold = 0.35;\r\n this.myStepMultiplierStepPerSecond = 2.25;\r\n this.myButtonEditDelay = 0;\r\n }\r\n}", "import { CollisionComponent, MeshComponent, TextComponent } from \"@wonderlandengine/api\";\r\nimport { CursorTarget } from \"@wonderlandengine/components\";\r\nimport { EasyTuneBaseWidgetUI } from \"../base/easy_tune_base_widget_ui.js\";\r\n\r\nexport class EasyTuneNumberArrayWidgetUI extends EasyTuneBaseWidgetUI {\r\n\r\n constructor(engine) {\r\n super(engine);\r\n }\r\n\r\n setAdditionalButtonsVisible(visible) {\r\n this._myAdditionalButtonsVisible = visible;\r\n\r\n for (let i = 0; i < this._myConfig.myArraySize; i++) {\r\n this.myValueIncreaseButtonPanels[i].pp_setActive(this._myAdditionalButtonsVisible);\r\n this.myValueDecreaseButtonPanels[i].pp_setActive(this._myAdditionalButtonsVisible);\r\n }\r\n\r\n this.myStepIncreaseButtonPanel.pp_setActive(this._myAdditionalButtonsVisible);\r\n this.myStepDecreaseButtonPanel.pp_setActive(this._myAdditionalButtonsVisible);\r\n }\r\n\r\n _buildHook() {\r\n this._myAdditionalButtonsVisible = true;\r\n }\r\n\r\n _createSkeletonHook() {\r\n this.myValuesPanel = this.myDisplayPanel.pp_addChild();\r\n\r\n this.myValuePanels = [];\r\n this.myValueTexts = [];\r\n this.myValueCursorTargets = [];\r\n\r\n this.myValueIncreaseButtonPanels = [];\r\n this.myValueIncreaseButtonBackgrounds = [];\r\n this.myValueIncreaseButtonTexts = [];\r\n this.myValueIncreaseButtonCursorTargets = [];\r\n\r\n this.myValueDecreaseButtonPanels = [];\r\n this.myValueDecreaseButtonBackgrounds = [];\r\n this.myValueDecreaseButtonTexts = [];\r\n this.myValueDecreaseButtonCursorTargets = [];\r\n\r\n for (let i = 0; i < this._myConfig.myArraySize; i++) {\r\n this.myValuePanels[i] = this.myValuesPanel.pp_addChild();\r\n this.myValueTexts[i] = this.myValuePanels[i].pp_addChild();\r\n this.myValueCursorTargets[i] = this.myValuePanels[i].pp_addChild();\r\n\r\n this.myValueIncreaseButtonPanels[i] = this.myValuePanels[i].pp_addChild();\r\n this.myValueIncreaseButtonBackgrounds[i] = this.myValueIncreaseButtonPanels[i].pp_addChild();\r\n this.myValueIncreaseButtonTexts[i] = this.myValueIncreaseButtonPanels[i].pp_addChild();\r\n this.myValueIncreaseButtonCursorTargets[i] = this.myValueIncreaseButtonPanels[i].pp_addChild();\r\n\r\n this.myValueDecreaseButtonPanels[i] = this.myValuePanels[i].pp_addChild();\r\n this.myValueDecreaseButtonBackgrounds[i] = this.myValueDecreaseButtonPanels[i].pp_addChild();\r\n this.myValueDecreaseButtonTexts[i] = this.myValueDecreaseButtonPanels[i].pp_addChild();\r\n this.myValueDecreaseButtonCursorTargets[i] = this.myValueDecreaseButtonPanels[i].pp_addChild();\r\n }\r\n\r\n this.myStepPanel = this.myPivotObject.pp_addChild();\r\n this.myStepText = this.myStepPanel.pp_addChild();\r\n this.myStepCursorTarget = this.myStepPanel.pp_addChild();\r\n\r\n this.myStepIncreaseButtonPanel = this.myStepPanel.pp_addChild();\r\n this.myStepIncreaseButtonBackground = this.myStepIncreaseButtonPanel.pp_addChild();\r\n this.myStepIncreaseButtonText = this.myStepIncreaseButtonPanel.pp_addChild();\r\n this.myStepIncreaseButtonCursorTarget = this.myStepIncreaseButtonPanel.pp_addChild();\r\n\r\n this.myStepDecreaseButtonPanel = this.myStepPanel.pp_addChild();\r\n this.myStepDecreaseButtonBackground = this.myStepDecreaseButtonPanel.pp_addChild();\r\n this.myStepDecreaseButtonText = this.myStepDecreaseButtonPanel.pp_addChild();\r\n this.myStepDecreaseButtonCursorTarget = this.myStepDecreaseButtonPanel.pp_addChild();\r\n }\r\n\r\n _setTransformHook() {\r\n this.myValuesPanel.pp_setPositionLocal(this._myConfig.myValuesPanelPosition);\r\n\r\n for (let i = 0; i < this._myConfig.myArraySize; i++) {\r\n this.myValuePanels[i].pp_setPositionLocal(this._myConfig.myValuePanelsPositions[i]);\r\n this.myValueTexts[i].pp_scaleObject(this._myConfig.myValueTextScale);\r\n this.myValueCursorTargets[i].pp_setPositionLocal(this._myConfig.myValueCursorTargetPosition);\r\n\r\n this.myValueIncreaseButtonPanels[i].pp_setPositionLocal(this._myConfig.myRightSideButtonPosition);\r\n this.myValueIncreaseButtonBackgrounds[i].pp_scaleObject(this._myConfig.mySideButtonBackgroundScale);\r\n this.myValueIncreaseButtonTexts[i].pp_setPositionLocal(this._myConfig.mySideButtonTextPosition);\r\n this.myValueIncreaseButtonTexts[i].pp_scaleObject(this._myConfig.mySideButtonTextScale);\r\n this.myValueIncreaseButtonCursorTargets[i].pp_setPositionLocal(this._myConfig.mySideButtonCursorTargetPosition);\r\n\r\n this.myValueDecreaseButtonPanels[i].pp_setPositionLocal(this._myConfig.myLeftSideButtonPosition);\r\n this.myValueDecreaseButtonBackgrounds[i].pp_scaleObject(this._myConfig.mySideButtonBackgroundScale);\r\n this.myValueDecreaseButtonTexts[i].pp_setPositionLocal(this._myConfig.mySideButtonTextPosition);\r\n this.myValueDecreaseButtonTexts[i].pp_scaleObject(this._myConfig.mySideButtonTextScale);\r\n this.myValueDecreaseButtonCursorTargets[i].pp_setPositionLocal(this._myConfig.mySideButtonCursorTargetPosition);\r\n }\r\n\r\n this.myStepPanel.pp_setPositionLocal(this._myConfig.myStepPanelPosition);\r\n this.myStepText.pp_scaleObject(this._myConfig.myStepTextScale);\r\n this.myStepCursorTarget.pp_setPositionLocal(this._myConfig.myStepCursorTargetPosition);\r\n\r\n this.myStepIncreaseButtonPanel.pp_setPositionLocal(this._myConfig.myRightSideButtonPosition);\r\n this.myStepIncreaseButtonBackground.pp_scaleObject(this._myConfig.mySideButtonBackgroundScale);\r\n this.myStepIncreaseButtonText.pp_setPositionLocal(this._myConfig.mySideButtonTextPosition);\r\n this.myStepIncreaseButtonText.pp_scaleObject(this._myConfig.mySideButtonTextScale);\r\n this.myStepIncreaseButtonCursorTarget.pp_setPositionLocal(this._myConfig.mySideButtonCursorTargetPosition);\r\n\r\n this.myStepDecreaseButtonPanel.pp_setPositionLocal(this._myConfig.myLeftSideButtonPosition);\r\n this.myStepDecreaseButtonBackground.pp_scaleObject(this._myConfig.mySideButtonBackgroundScale);\r\n this.myStepDecreaseButtonText.pp_setPositionLocal(this._myConfig.mySideButtonTextPosition);\r\n this.myStepDecreaseButtonText.pp_scaleObject(this._myConfig.mySideButtonTextScale);\r\n this.myStepDecreaseButtonCursorTarget.pp_setPositionLocal(this._myConfig.mySideButtonCursorTargetPosition);\r\n }\r\n\r\n _addComponentsHook() {\r\n this.myValueTextComponents = [];\r\n this.myValueCursorTargetComponents = [];\r\n this.myValueCollisionComponents = [];\r\n\r\n this.myValueIncreaseButtonBackgroundComponents = [];\r\n this.myValueIncreaseButtonTextComponents = [];\r\n this.myValueIncreaseButtonCursorTargetComponents = [];\r\n this.myValueIncreaseButtonCollisionComponents = [];\r\n\r\n this.myValueDecreaseButtonBackgroundComponents = [];\r\n this.myValueDecreaseButtonTextComponents = [];\r\n this.myValueDecreaseButtonCursorTargetComponents = [];\r\n this.myValueDecreaseButtonCollisionComponents = [];\r\n\r\n\r\n for (let i = 0; i < this._myConfig.myArraySize; i++) {\r\n this.myValueTextComponents[i] = this.myValueTexts[i].pp_addComponent(TextComponent);\r\n this._setupTextComponent(this.myValueTextComponents[i]);\r\n this.myValueTextComponents[i].text = \" \";\r\n\r\n this.myValueCursorTargetComponents[i] = this.myValueCursorTargets[i].pp_addComponent(CursorTarget);\r\n this.myValueCollisionComponents[i] = this.myValueCursorTargets[i].pp_addComponent(CollisionComponent);\r\n this.myValueCollisionComponents[i].collider = this._myConfig.myCursorTargetCollisionCollider;\r\n this.myValueCollisionComponents[i].group = 1 << this._myConfig.myCursorTargetCollisionGroup;\r\n this.myValueCollisionComponents[i].extents = this._myConfig.myValueCollisionExtents;\r\n\r\n this.myValueIncreaseButtonBackgroundComponents[i] = this.myValueIncreaseButtonBackgrounds[i].pp_addComponent(MeshComponent);\r\n this.myValueIncreaseButtonBackgroundComponents[i].mesh = this._myPlaneMesh;\r\n this.myValueIncreaseButtonBackgroundComponents[i].material = this._myParams.myPlaneMaterial.clone();\r\n this.myValueIncreaseButtonBackgroundComponents[i].material.color = this._myConfig.myBackgroundColor;\r\n\r\n this.myValueIncreaseButtonTextComponents[i] = this.myValueIncreaseButtonTexts[i].pp_addComponent(TextComponent);\r\n this._setupTextComponent(this.myValueIncreaseButtonTextComponents[i]);\r\n this.myValueIncreaseButtonTextComponents[i].text = this._myConfig.myIncreaseButtonText;\r\n\r\n this.myValueIncreaseButtonCursorTargetComponents[i] = this.myValueIncreaseButtonCursorTargets[i].pp_addComponent(CursorTarget);\r\n this.myValueIncreaseButtonCollisionComponents[i] = this.myValueIncreaseButtonCursorTargets[i].pp_addComponent(CollisionComponent);\r\n this.myValueIncreaseButtonCollisionComponents[i].collider = this._myConfig.myCursorTargetCollisionCollider;\r\n this.myValueIncreaseButtonCollisionComponents[i].group = 1 << this._myConfig.myCursorTargetCollisionGroup;\r\n this.myValueIncreaseButtonCollisionComponents[i].extents = this._myConfig.mySideButtonCollisionExtents;\r\n\r\n this.myValueDecreaseButtonBackgroundComponents[i] = this.myValueDecreaseButtonBackgrounds[i].pp_addComponent(MeshComponent);\r\n this.myValueDecreaseButtonBackgroundComponents[i].mesh = this._myPlaneMesh;\r\n this.myValueDecreaseButtonBackgroundComponents[i].material = this._myParams.myPlaneMaterial.clone();\r\n this.myValueDecreaseButtonBackgroundComponents[i].material.color = this._myConfig.myBackgroundColor;\r\n\r\n this.myValueDecreaseButtonTextComponents[i] = this.myValueDecreaseButtonTexts[i].pp_addComponent(TextComponent);\r\n this._setupTextComponent(this.myValueDecreaseButtonTextComponents[i]);\r\n this.myValueDecreaseButtonTextComponents[i].text = this._myConfig.myDecreaseButtonText;\r\n\r\n this.myValueDecreaseButtonCursorTargetComponents[i] = this.myValueDecreaseButtonCursorTargets[i].pp_addComponent(CursorTarget);\r\n this.myValueDecreaseButtonCollisionComponents[i] = this.myValueDecreaseButtonCursorTargets[i].pp_addComponent(CollisionComponent);\r\n this.myValueDecreaseButtonCollisionComponents[i].collider = this._myConfig.myCursorTargetCollisionCollider;\r\n this.myValueDecreaseButtonCollisionComponents[i].group = 1 << this._myConfig.myCursorTargetCollisionGroup;\r\n this.myValueDecreaseButtonCollisionComponents[i].extents = this._myConfig.mySideButtonCollisionExtents;\r\n }\r\n\r\n this.myStepTextComponent = this.myStepText.pp_addComponent(TextComponent);\r\n this._setupTextComponent(this.myStepTextComponent);\r\n this.myStepTextComponent.text = \" \";\r\n\r\n this.myStepCursorTargetComponent = this.myStepCursorTarget.pp_addComponent(CursorTarget);\r\n this.myStepCollisionComponent = this.myStepCursorTarget.pp_addComponent(CollisionComponent);\r\n this.myStepCollisionComponent.collider = this._myConfig.myCursorTargetCollisionCollider;\r\n this.myStepCollisionComponent.group = 1 << this._myConfig.myCursorTargetCollisionGroup;\r\n this.myStepCollisionComponent.extents = this._myConfig.myStepCollisionExtents;\r\n\r\n // Increase/Decrease\r\n this.myStepIncreaseButtonBackgroundComponent = this.myStepIncreaseButtonBackground.pp_addComponent(MeshComponent);\r\n this.myStepIncreaseButtonBackgroundComponent.mesh = this._myPlaneMesh;\r\n this.myStepIncreaseButtonBackgroundComponent.material = this._myParams.myPlaneMaterial.clone();\r\n this.myStepIncreaseButtonBackgroundComponent.material.color = this._myConfig.myBackgroundColor;\r\n\r\n this.myStepIncreaseButtonTextComponent = this.myStepIncreaseButtonText.pp_addComponent(TextComponent);\r\n this._setupTextComponent(this.myStepIncreaseButtonTextComponent);\r\n this.myStepIncreaseButtonTextComponent.text = this._myConfig.myIncreaseButtonText;\r\n\r\n this.myStepIncreaseButtonCursorTargetComponent = this.myStepIncreaseButtonCursorTarget.pp_addComponent(CursorTarget);\r\n this.myStepIncreaseButtonCollisionComponent = this.myStepIncreaseButtonCursorTarget.pp_addComponent(CollisionComponent);\r\n this.myStepIncreaseButtonCollisionComponent.collider = this._myConfig.myCursorTargetCollisionCollider;\r\n this.myStepIncreaseButtonCollisionComponent.group = 1 << this._myConfig.myCursorTargetCollisionGroup;\r\n this.myStepIncreaseButtonCollisionComponent.extents = this._myConfig.mySideButtonCollisionExtents;\r\n\r\n this.myStepDecreaseButtonBackgroundComponent = this.myStepDecreaseButtonBackground.pp_addComponent(MeshComponent);\r\n this.myStepDecreaseButtonBackgroundComponent.mesh = this._myPlaneMesh;\r\n this.myStepDecreaseButtonBackgroundComponent.material = this._myParams.myPlaneMaterial.clone();\r\n this.myStepDecreaseButtonBackgroundComponent.material.color = this._myConfig.myBackgroundColor;\r\n\r\n this.myStepDecreaseButtonTextComponent = this.myStepDecreaseButtonText.pp_addComponent(TextComponent);\r\n this._setupTextComponent(this.myStepDecreaseButtonTextComponent);\r\n this.myStepDecreaseButtonTextComponent.text = this._myConfig.myDecreaseButtonText;\r\n\r\n this.myStepDecreaseButtonCursorTargetComponent = this.myStepDecreaseButtonCursorTarget.pp_addComponent(CursorTarget);\r\n this.myStepDecreaseButtonCollisionComponent = this.myStepDecreaseButtonCursorTarget.pp_addComponent(CollisionComponent);\r\n this.myStepDecreaseButtonCollisionComponent.collider = this._myConfig.myCursorTargetCollisionCollider;\r\n this.myStepDecreaseButtonCollisionComponent.group = 1 << this._myConfig.myCursorTargetCollisionGroup;\r\n this.myStepDecreaseButtonCollisionComponent.extents = this._myConfig.mySideButtonCollisionExtents;\r\n }\r\n\r\n _setVisibleHook(visible) {\r\n if (visible) {\r\n this.setAdditionalButtonsVisible(this._myAdditionalButtonsVisible);\r\n }\r\n }\r\n}", "import { GamepadAxesID } from \"../../../../input/gamepad/gamepad_buttons.js\";\r\nimport { Globals } from \"../../../../pp/globals.js\";\r\nimport { EasyTuneBaseWidget } from \"../base/easy_tune_base_widget.js\";\r\nimport { EasyTuneNumberArrayWidgetConfig } from \"./easy_tune_number_array_widget_config.js\";\r\nimport { EasyTuneNumberArrayWidgetUI } from \"./easy_tune_number_array_widget_ui.js\";\r\n\r\nexport class EasyTuneNumberArrayWidget extends EasyTuneBaseWidget {\r\n\r\n constructor(params, arraySize, gamepad, engine = Globals.getMainEngine()) {\r\n super(params);\r\n\r\n this._myGamepad = gamepad;\r\n\r\n this._myNonArray = arraySize == null;\r\n this._myArraySize = this._myNonArray ? 1 : arraySize;\r\n\r\n this._myConfig = new EasyTuneNumberArrayWidgetConfig(this._myArraySize);\r\n this._myUI = new EasyTuneNumberArrayWidgetUI(engine);\r\n\r\n this._myValueEditIndex = -1;\r\n\r\n this._myValueButtonEditIntensity = 0;\r\n this._myValueButtonEditIntensityTimer = 0;\r\n this._myStepButtonEditIntensity = 0;\r\n this._myStepButtonEditIntensityTimer = 0;\r\n\r\n this._myValueEditEnabled = false;\r\n this._myStepEditEnabled = false;\r\n\r\n this._myValueRealValue = 0;\r\n this._myStepMultiplierValue = 0;\r\n this._myStepFastEdit = false;\r\n\r\n this._myTempValue = [];\r\n\r\n this._myTempNonArrayValue = [0];\r\n this._myTempNonArrayDefaultValue = [0];\r\n }\r\n\r\n _refreshUIHook() {\r\n for (let i = 0; i < this._myArraySize; i++) {\r\n this._myUI.myValueTextComponents[i].text = this._getVariableValue()[i].toFixed(this._myVariable._myDecimalPlaces);\r\n }\r\n\r\n this._myUI.myStepTextComponent.text = this._myConfig.myStepStartString.concat(this._myVariable._myStepPerSecond);\r\n }\r\n\r\n\r\n _startHook(parentObject, easyTuneParams) {\r\n this._myUI.setAdditionalButtonsVisible(easyTuneParams.myShowAdditionalButtons);\r\n }\r\n\r\n _setEasyTuneVariableHook() {\r\n if (this._myVariable != null) {\r\n if (this._myValueEditIndex >= 0 && this._myValueEditIndex < this._getVariableValue().length) {\r\n this._myValueRealValue = this._getVariableValue()[this._myValueEditIndex];\r\n } else {\r\n this._myValueRealValue = 0;\r\n }\r\n\r\n this._myTempValue.pp_copy(this._getVariableValue());\r\n\r\n this._myStepMultiplierValue = 0;\r\n this._myStepFastEdit = false;\r\n }\r\n }\r\n\r\n _updateHook(dt) {\r\n this._updateValue(dt);\r\n }\r\n\r\n _updateValue(dt) {\r\n let stickVariableIntensity = 0;\r\n\r\n if (this._myGamepad) {\r\n let y = this._myGamepad.getAxesInfo(GamepadAxesID.THUMBSTICK).myAxes[1];\r\n\r\n if (Math.abs(y) > this._myConfig.myEditThumbstickMinThreshold) {\r\n let normalizedEditAmount = (Math.abs(y) - this._myConfig.myEditThumbstickMinThreshold) / (1 - this._myConfig.myEditThumbstickMinThreshold);\r\n stickVariableIntensity = Math.sign(y) * normalizedEditAmount;\r\n }\r\n }\r\n\r\n let valueIntensity = 0;\r\n if (this._myValueEditEnabled) {\r\n valueIntensity = stickVariableIntensity;\r\n } else if (this._myValueButtonEditIntensity != 0) {\r\n if (this._myValueButtonEditIntensityTimer <= 0) {\r\n valueIntensity = this._myValueButtonEditIntensity;\r\n } else {\r\n this._myValueButtonEditIntensityTimer -= dt;\r\n }\r\n }\r\n\r\n if (this._myValueEditIndex >= 0 && this._myValueEditIndex < this._getVariableValue().length) {\r\n if (valueIntensity != 0) {\r\n let amountToAdd = valueIntensity * this._myVariable._myStepPerSecond * dt;\r\n\r\n this._myValueRealValue += amountToAdd;\r\n\r\n if (this._myVariable._myMin != null && this._myVariable._myMax != null) {\r\n this._myValueRealValue = Math.pp_clamp(this._myValueRealValue, this._myVariable._myMin, this._myVariable._myMax);\r\n } else if (this._myVariable._myMin != null) {\r\n this._myValueRealValue = Math.max(this._myValueRealValue, this._myVariable._myMin);\r\n } else if (this._myVariable._myMax != null) {\r\n this._myValueRealValue = Math.min(this._myValueRealValue, this._myVariable._myMax);\r\n }\r\n\r\n let decimalPlacesMultiplier = Math.pow(10, this._myVariable._myDecimalPlaces);\r\n\r\n this._myTempValue.pp_copy(this._getVariableValue());\r\n\r\n if (!this._myNonArray && this._myVariable._myEditAllValuesTogether) {\r\n let newValue = Math.round(this._myValueRealValue * decimalPlacesMultiplier + Number.EPSILON) / decimalPlacesMultiplier;\r\n let difference = newValue - this._myTempValue[this._myValueEditIndex];\r\n\r\n for (let i = 0; i < this._myArraySize; i++) {\r\n this._myTempValue[i] = Math.round((this._myTempValue[i] + difference) * decimalPlacesMultiplier + Number.EPSILON) / decimalPlacesMultiplier;\r\n\r\n if (this._myVariable._myMin != null && this._myVariable._myMax != null) {\r\n this._myTempValue[i] = Math.pp_clamp(this._myTempValue[i], this._myVariable._myMin, this._myVariable._myMax);\r\n } else if (this._myVariable._myMin != null) {\r\n this._myTempValue[i] = Math.max(this._myTempValue[i], this._myVariable._myMin);\r\n } else if (this._myVariable._myMax != null) {\r\n this._myTempValue[i] = Math.min(this._myTempValue[i], this._myVariable._myMax);\r\n }\r\n\r\n this._myUI.myValueTextComponents[i].text = this._myTempValue[i].toFixed(this._myVariable._myDecimalPlaces);\r\n }\r\n\r\n } else {\r\n this._myTempValue[this._myValueEditIndex] = Math.round(this._myValueRealValue * decimalPlacesMultiplier + Number.EPSILON) / decimalPlacesMultiplier;\r\n\r\n if (this._myVariable._myMin != null && this._myVariable._myMax != null) {\r\n this._myTempValue[this._myValueEditIndex] = Math.pp_clamp(this._myTempValue[this._myValueEditIndex], this._myVariable._myMin, this._myVariable._myMax);\r\n } else if (this._myVariable._myMin != null) {\r\n this._myTempValue[this._myValueEditIndex] = Math.max(this._myTempValue[this._myValueEditIndex], this._myVariable._myMin);\r\n } else if (this._myVariable._myMax != null) {\r\n this._myTempValue[this._myValueEditIndex] = Math.min(this._myTempValue[this._myValueEditIndex], this._myVariable._myMax);\r\n }\r\n\r\n this._myUI.myValueTextComponents[this._myValueEditIndex].text = this._myTempValue[this._myValueEditIndex].toFixed(this._myVariable._myDecimalPlaces);\r\n }\r\n\r\n this._setVariableValue(this._myTempValue);\r\n } else {\r\n this._myValueRealValue = this._getVariableValue()[this._myValueEditIndex];\r\n }\r\n }\r\n\r\n let stepIntensity = 0;\r\n if (this._myStepEditEnabled) {\r\n stepIntensity = stickVariableIntensity;\r\n } else if (this._myStepButtonEditIntensity != 0) {\r\n if (this._myStepButtonEditIntensityTimer <= 0) {\r\n stepIntensity = this._myStepButtonEditIntensity;\r\n } else {\r\n this._myStepButtonEditIntensityTimer -= dt;\r\n }\r\n }\r\n\r\n if (stepIntensity != 0) {\r\n let amountToAdd = 0;\r\n if (this._myStepFastEdit) {\r\n amountToAdd = Math.sign(stepIntensity) * 1;\r\n this._myStepFastEdit = false;\r\n } else {\r\n amountToAdd = stepIntensity * this._myConfig.myStepMultiplierStepPerSecond * dt;\r\n }\r\n\r\n this._myStepMultiplierValue += amountToAdd;\r\n if (Math.abs(this._myStepMultiplierValue) >= 1) {\r\n if (Math.sign(this._myStepMultiplierValue) > 0) {\r\n this._myStepMultiplierValue -= 1;\r\n this._changeStep(this._myVariable._myStepPerSecond * 10);\r\n } else {\r\n this._myStepMultiplierValue += 1;\r\n this._changeStep(this._myVariable._myStepPerSecond * 0.1);\r\n }\r\n }\r\n } else {\r\n this._myStepMultiplierValue = 0;\r\n this._myStepFastEdit = true;\r\n }\r\n }\r\n\r\n _addListenersHook() {\r\n let ui = this._myUI;\r\n\r\n ui.myVariableLabelCursorTargetComponent.onClick.add(this._resetAllValues.bind(this));\r\n ui.myVariableLabelCursorTargetComponent.onHover.add(this._genericTextHover.bind(this, ui.myVariableLabelText));\r\n ui.myVariableLabelCursorTargetComponent.onUnhover.add(this._genericTextUnhover.bind(this, ui.myVariableLabelText, this._myConfig.myVariableLabelTextScale));\r\n\r\n this._myUnhoverCallbacks.push(this._genericTextUnhover.bind(this, ui.myVariableLabelText, this._myConfig.myVariableLabelTextScale));\r\n\r\n for (let i = 0; i < this._myArraySize; i++) {\r\n ui.myValueIncreaseButtonCursorTargetComponents[i].onDown.add(this._setValueEditIntensity.bind(this, i, 1));\r\n ui.myValueIncreaseButtonCursorTargetComponents[i].onDownOnHover.add(this._setValueEditIntensity.bind(this, i, 1));\r\n ui.myValueIncreaseButtonCursorTargetComponents[i].onUp.add(this._setValueEditIntensity.bind(this, i, 0));\r\n ui.myValueIncreaseButtonCursorTargetComponents[i].onUnhover.add(this._setValueEditIntensity.bind(this, i, 0));\r\n ui.myValueDecreaseButtonCursorTargetComponents[i].onDown.add(this._setValueEditIntensity.bind(this, i, -1));\r\n ui.myValueDecreaseButtonCursorTargetComponents[i].onDownOnHover.add(this._setValueEditIntensity.bind(this, i, -1));\r\n ui.myValueDecreaseButtonCursorTargetComponents[i].onUp.add(this._setValueEditIntensity.bind(this, i, 0));\r\n ui.myValueDecreaseButtonCursorTargetComponents[i].onUnhover.add(this._setValueEditIntensity.bind(this, i, 0));\r\n\r\n this._myUnhoverCallbacks.push(this._setValueEditIntensity.bind(this, i, 0));\r\n\r\n ui.myValueIncreaseButtonCursorTargetComponents[i].onHover.add(this._genericHover.bind(this, ui.myValueIncreaseButtonBackgroundComponents[i].material));\r\n ui.myValueIncreaseButtonCursorTargetComponents[i].onUnhover.add(this._genericUnhover.bind(this, ui.myValueIncreaseButtonBackgroundComponents[i].material));\r\n ui.myValueDecreaseButtonCursorTargetComponents[i].onHover.add(this._genericHover.bind(this, ui.myValueDecreaseButtonBackgroundComponents[i].material));\r\n ui.myValueDecreaseButtonCursorTargetComponents[i].onUnhover.add(this._genericUnhover.bind(this, ui.myValueDecreaseButtonBackgroundComponents[i].material));\r\n\r\n this._myUnhoverCallbacks.push(this._genericUnhover.bind(this, ui.myValueIncreaseButtonBackgroundComponents[i].material));\r\n this._myUnhoverCallbacks.push(this._genericUnhover.bind(this, ui.myValueDecreaseButtonBackgroundComponents[i].material));\r\n\r\n ui.myValueCursorTargetComponents[i].onClick.add(this._resetValue.bind(this, i));\r\n ui.myValueCursorTargetComponents[i].onHover.add(this._setValueEditEnabled.bind(this, i, ui.myValueTexts[i], true));\r\n ui.myValueCursorTargetComponents[i].onUnhover.add(this._setValueEditEnabled.bind(this, i, ui.myValueTexts[i], false));\r\n\r\n this._myUnhoverCallbacks.push(this._setValueEditEnabled.bind(this, i, ui.myValueTexts[i], false));\r\n }\r\n\r\n ui.myStepCursorTargetComponent.onClick.add(this._resetStep.bind(this));\r\n ui.myStepCursorTargetComponent.onHover.add(this._setStepEditEnabled.bind(this, ui.myStepText, true));\r\n ui.myStepCursorTargetComponent.onUnhover.add(this._setStepEditEnabled.bind(this, ui.myStepText, false));\r\n\r\n this._myUnhoverCallbacks.push(this._setStepEditEnabled.bind(this, ui.myStepText, false));\r\n\r\n ui.myStepIncreaseButtonCursorTargetComponent.onDown.add(this._setStepEditIntensity.bind(this, 1));\r\n ui.myStepIncreaseButtonCursorTargetComponent.onDownOnHover.add(this._setStepEditIntensity.bind(this, 1));\r\n ui.myStepIncreaseButtonCursorTargetComponent.onUp.add(this._setStepEditIntensity.bind(this, 0));\r\n ui.myStepIncreaseButtonCursorTargetComponent.onUnhover.add(this._setStepEditIntensity.bind(this, 0));\r\n ui.myStepDecreaseButtonCursorTargetComponent.onDown.add(this._setStepEditIntensity.bind(this, -1));\r\n ui.myStepDecreaseButtonCursorTargetComponent.onDownOnHover.add(this._setStepEditIntensity.bind(this, -1));\r\n ui.myStepDecreaseButtonCursorTargetComponent.onUp.add(this._setStepEditIntensity.bind(this, 0));\r\n ui.myStepDecreaseButtonCursorTargetComponent.onUnhover.add(this._setStepEditIntensity.bind(this, 0));\r\n\r\n this._myUnhoverCallbacks.push(this._setStepEditIntensity.bind(this, 0));\r\n\r\n ui.myStepIncreaseButtonCursorTargetComponent.onHover.add(this._genericHover.bind(this, ui.myStepIncreaseButtonBackgroundComponent.material));\r\n ui.myStepIncreaseButtonCursorTargetComponent.onUnhover.add(this._genericUnhover.bind(this, ui.myStepIncreaseButtonBackgroundComponent.material));\r\n ui.myStepDecreaseButtonCursorTargetComponent.onHover.add(this._genericHover.bind(this, ui.myStepDecreaseButtonBackgroundComponent.material));\r\n ui.myStepDecreaseButtonCursorTargetComponent.onUnhover.add(this._genericUnhover.bind(this, ui.myStepDecreaseButtonBackgroundComponent.material));\r\n\r\n this._myUnhoverCallbacks.push(this._genericUnhover.bind(this, ui.myStepIncreaseButtonBackgroundComponent.material));\r\n this._myUnhoverCallbacks.push(this._genericUnhover.bind(this, ui.myStepDecreaseButtonBackgroundComponent.material));\r\n }\r\n\r\n _setValueEditIntensity(index, value) {\r\n if (this._isActive() || value == 0) {\r\n if (value != 0) {\r\n this._myValueButtonEditIntensityTimer = this._myConfig.myButtonEditDelay;\r\n this._myValueRealValue = this._getVariableValue()[index];\r\n this._myValueEditIndex = index;\r\n }\r\n\r\n this._myValueButtonEditIntensity = value;\r\n }\r\n }\r\n\r\n _setStepEditIntensity(value) {\r\n if (this._isActive() || value == 0) {\r\n if (value != 0) {\r\n this._myStepButtonEditIntensityTimer = this._myConfig.myButtonEditDelay;\r\n }\r\n\r\n this._myStepButtonEditIntensity = value;\r\n }\r\n }\r\n\r\n _setValueEditEnabled(index, text, enabled) {\r\n if (this._isActive() || !enabled) {\r\n if (enabled) {\r\n this._myValueRealValue = this._getVariableValue()[index];\r\n this._myValueEditIndex = index;\r\n text.pp_scaleObject(this._myConfig.myTextHoverScaleMultiplier);\r\n } else {\r\n text.pp_setScaleLocal(this._myConfig.myValueTextScale);\r\n }\r\n\r\n this._myValueEditEnabled = enabled;\r\n }\r\n }\r\n\r\n _setStepEditEnabled(text, enabled) {\r\n if (this._isActive() || !enabled) {\r\n if (enabled) {\r\n text.pp_scaleObject(this._myConfig.myTextHoverScaleMultiplier);\r\n } else {\r\n text.pp_setScaleLocal(this._myConfig.myStepTextScale);\r\n }\r\n\r\n this._myStepEditEnabled = enabled;\r\n }\r\n }\r\n\r\n _resetValue(index) {\r\n if (this._isActive()) {\r\n this._myTempValue.pp_copy(this._getVariableValue());\r\n this._myTempValue[index] = this._getVariableDefaultValue()[index];\r\n this._setVariableValue(this._myTempValue);\r\n\r\n this._myUI.myValueTextComponents[index].text = this._getVariableValue()[index].toFixed(this._myVariable._myDecimalPlaces);\r\n }\r\n }\r\n\r\n _resetAllValues() {\r\n for (let i = 0; i < this._myArraySize; i++) {\r\n this._resetValue(i);\r\n }\r\n }\r\n\r\n _resetStep() {\r\n if (this._isActive()) {\r\n this._changeStep(this._myVariable._myDefaultStepPerSecond);\r\n }\r\n }\r\n\r\n _changeStep(step) {\r\n step = Math.pp_roundDecimal(step, 10);\r\n this._myVariable._myStepPerSecond = step;\r\n this._myUI.myStepTextComponent.text = this._myConfig.myStepStartString.concat(this._myVariable._myStepPerSecond);\r\n }\r\n\r\n _genericTextHover(text) {\r\n text.pp_scaleObject(this._myConfig.myTextHoverScaleMultiplier);\r\n }\r\n\r\n _genericTextUnhover(text, originalScale) {\r\n text.pp_setScaleLocal(originalScale);\r\n }\r\n\r\n _getVariableValue() {\r\n if (this._myNonArray) {\r\n this._myTempNonArrayValue[0] = this._myVariable.getValue();\r\n return this._myTempNonArrayValue;\r\n }\r\n\r\n return this._myVariable.getValue();\r\n }\r\n\r\n _getVariableDefaultValue() {\r\n if (this._myNonArray) {\r\n this._myTempNonArrayDefaultValue[0] = this._myVariable.getDefaultValue();\r\n return this._myTempNonArrayDefaultValue;\r\n }\r\n\r\n return this._myVariable.getDefaultValue();\r\n }\r\n\r\n _setVariableValue(value) {\r\n if (this._myNonArray) {\r\n this._myVariable.setValue(value[0]);\r\n } else {\r\n this._myVariable.setValue(this._myTempValue);\r\n }\r\n }\r\n}", "import { EasyTuneBaseArrayWidgetSelector } from \"../base/easy_tune_base_array_widget_selector.js\";\r\nimport { EasyTuneNumberArrayWidget } from \"./easy_tune_number_array_widget.js\";\r\n\r\nexport class EasyTuneNumberArrayWidgetSelector extends EasyTuneBaseArrayWidgetSelector {\r\n\r\n _getEasyTuneArrayWidget(arraySize) {\r\n return new EasyTuneNumberArrayWidget(this._myParams, arraySize, this._myGamepad, this._myEngine);\r\n }\r\n}", "import { vec3_create } from \"../../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { EasyTuneBaseWidgetConfig } from \"../base/easy_tune_base_widget_config.js\";\r\n\r\nexport class EasyTuneTransformWidgetConfig extends EasyTuneBaseWidgetConfig {\r\n\r\n _getBackPanelMinY() {\r\n return super._getBackPanelMinY() + this.myPositionPanelPosition[1] + this.myStepPanelPosition[1];\r\n }\r\n\r\n _getBackPanelMaxX() {\r\n return this.myDisplayPanelPosition[0] + this.myRotationPanelPosition[0] + this.myIncreaseButtonPosition[0] + this.mySideButtonBackgroundScale[0] + this._mySideButtonDistanceFromBorder;\r\n }\r\n\r\n _getBackPanelMinX() {\r\n return this.myDisplayPanelPosition[0] + this.myScalePanelPosition[0] + this.myDecreaseButtonPosition[0] - this.mySideButtonBackgroundScale[0] - this._mySideButtonDistanceFromBorder;\r\n }\r\n\r\n _getPivotZOffset() {\r\n return 0.00805713;\r\n }\r\n\r\n _setupBuildConfigHook() {\r\n this.myIncreaseButtonText = \"+\";\r\n this.myDecreaseButtonText = \"-\";\r\n\r\n this.myDecreaseButtonPosition = vec3_create(-0.13, 0, -0.00001);\r\n this.myIncreaseButtonPosition = vec3_create(-this.myDecreaseButtonPosition[0], 0, -0.00001);\r\n\r\n let distanceBetweenComponents = Math.abs(this.myIncreaseButtonPosition[0]) + Math.abs(this.myRightSideButtonPosition[0]);\r\n let distanceFromVariableLabel = 0.045;\r\n this.myPositionPanelPosition = [0, this.myVariableLabelPanelPosition[1] - distanceFromVariableLabel, this._myPanelZOffset];\r\n this.myRotationPanelPosition = [this.myPositionPanelPosition[0] + distanceBetweenComponents, this.myVariableLabelPanelPosition[1] - distanceFromVariableLabel, this._myPanelZOffset];\r\n this.myScalePanelPosition = [this.myPositionPanelPosition[0] - distanceBetweenComponents, this.myVariableLabelPanelPosition[1] - distanceFromVariableLabel, this._myPanelZOffset];\r\n\r\n this.myPositionText = \"Position\";\r\n this.myRotationText = \"Rotation\";\r\n this.myScaleText = \"Scale\";\r\n\r\n this.myComponentLabelTextScale = this.myLabelTextScale;\r\n this.myComponentLabelCursorTargetPosition = vec3_create(0, 0, 0);\r\n this.myComponentLabelCursorTargetPosition[2] = this._myColliderZOffset - this._myPanelZOffset;\r\n this.myComponentLabelCollisionExtents = vec3_create(0.065, 0.0175, 1);\r\n this.myComponentLabelCollisionExtents[2] = this.myCursorTargetCollisionThickness;\r\n\r\n this._myValuePanelDistanceFromVariableLabelPanel = 0.055;\r\n this._myDistanceBetweenValues = this.mySideButtonBackgroundScale[1] * 2 + 0.015;\r\n\r\n this.myValueTextScale = vec3_create(0.4, 0.4, 0.4);\r\n\r\n this.myValueCursorTargetPosition = vec3_create(0, 0, 0);\r\n this.myValueCursorTargetPosition[2] = this._myColliderZOffset - this._myPanelZOffset;\r\n this.myValueCollisionExtents = vec3_create(0.065, 0.02, 1);\r\n this.myValueCollisionExtents[2] = this.myCursorTargetCollisionThickness;\r\n\r\n this.myValuePanelsPositions = [];\r\n this.myValuePanelsPositions[0] = vec3_create(0, -this._myValuePanelDistanceFromVariableLabelPanel, 0);\r\n for (let i = 1; i < 3; i++) {\r\n this.myValuePanelsPositions[i] = this.myValuePanelsPositions[i - 1].pp_clone();\r\n this.myValuePanelsPositions[i][1] -= this._myDistanceBetweenValues;\r\n }\r\n\r\n let valuePanelLastPosition = this.myValuePanelsPositions[2][1];\r\n this.myStepPanelPosition = [0, valuePanelLastPosition - this._myValuePanelDistanceFromVariableLabelPanel, 0];\r\n this.myStepTextScale = this.myLabelTextScale;\r\n this.myStepStartString = \"Step: \";\r\n\r\n this.myStepCursorTargetPosition = vec3_create(0, 0, 0);\r\n this.myStepCursorTargetPosition[2] = this._myColliderZOffset - this.myStepPanelPosition[2];\r\n this.myStepCollisionExtents = vec3_create(0.065, 0.0175, 1);\r\n this.myStepCollisionExtents[2] = this.myCursorTargetCollisionThickness;\r\n }\r\n\r\n _setupRuntimeConfigHook() {\r\n this.myTextHoverScaleMultiplier = vec3_create(1.1, 1.1, 1.1);\r\n\r\n this.myEditThumbstickMinThreshold = 0.35;\r\n this.myStepMultiplierStepPerSecond = 2.25;\r\n this.myButtonEditDelay = 0;\r\n }\r\n}", "import { CollisionComponent, MeshComponent, TextComponent } from \"@wonderlandengine/api\";\r\nimport { CursorTarget } from \"@wonderlandengine/components\";\r\nimport { EasyTuneBaseWidgetUI } from \"../base/easy_tune_base_widget_ui.js\";\r\n\r\nexport class EasyTuneTransformWidgetUI extends EasyTuneBaseWidgetUI {\r\n\r\n constructor(engine) {\r\n super(engine);\r\n }\r\n\r\n setAdditionalButtonsVisible(visible) {\r\n this._myAdditionalButtonsVisible = visible;\r\n\r\n for (let i = 0; i < 3; i++) {\r\n this.myPositionIncreaseButtonPanels[i].pp_setActive(this._myAdditionalButtonsVisible);\r\n this.myPositionDecreaseButtonPanels[i].pp_setActive(this._myAdditionalButtonsVisible);\r\n }\r\n this.myPositionStepIncreaseButtonPanel.pp_setActive(this._myAdditionalButtonsVisible);\r\n this.myPositionStepDecreaseButtonPanel.pp_setActive(this._myAdditionalButtonsVisible);\r\n\r\n for (let i = 0; i < 3; i++) {\r\n this.myRotationIncreaseButtonPanels[i].pp_setActive(this._myAdditionalButtonsVisible);\r\n this.myRotationDecreaseButtonPanels[i].pp_setActive(this._myAdditionalButtonsVisible);\r\n }\r\n this.myRotationStepIncreaseButtonPanel.pp_setActive(this._myAdditionalButtonsVisible);\r\n this.myRotationStepDecreaseButtonPanel.pp_setActive(this._myAdditionalButtonsVisible);\r\n\r\n for (let i = 0; i < 3; i++) {\r\n this.myScaleIncreaseButtonPanels[i].pp_setActive(this._myAdditionalButtonsVisible);\r\n this.myScaleDecreaseButtonPanels[i].pp_setActive(this._myAdditionalButtonsVisible);\r\n }\r\n this.myScaleStepIncreaseButtonPanel.pp_setActive(this._myAdditionalButtonsVisible);\r\n this.myScaleStepDecreaseButtonPanel.pp_setActive(this._myAdditionalButtonsVisible);\r\n }\r\n\r\n _buildHook() {\r\n this._myAdditionalButtonsVisible = true;\r\n }\r\n\r\n _createSkeletonHook() {\r\n // Position\r\n\r\n this.myPositionPanel = this.myDisplayPanel.pp_addChild();\r\n this.myPositionLabelText = this.myPositionPanel.pp_addChild();\r\n this.myPositionLabelCursorTarget = this.myPositionPanel.pp_addChild();\r\n\r\n this.myPositionPanels = [];\r\n this.myPositionTexts = [];\r\n this.myPositionCursorTargets = [];\r\n\r\n this.myPositionIncreaseButtonPanels = [];\r\n this.myPositionIncreaseButtonBackgrounds = [];\r\n this.myPositionIncreaseButtonTexts = [];\r\n this.myPositionIncreaseButtonCursorTargets = [];\r\n\r\n this.myPositionDecreaseButtonPanels = [];\r\n this.myPositionDecreaseButtonBackgrounds = [];\r\n this.myPositionDecreaseButtonTexts = [];\r\n this.myPositionDecreaseButtonCursorTargets = [];\r\n\r\n for (let i = 0; i < 3; i++) {\r\n this.myPositionPanels[i] = this.myPositionPanel.pp_addChild();\r\n this.myPositionTexts[i] = this.myPositionPanels[i].pp_addChild();\r\n this.myPositionCursorTargets[i] = this.myPositionPanels[i].pp_addChild();\r\n\r\n this.myPositionIncreaseButtonPanels[i] = this.myPositionPanels[i].pp_addChild();\r\n this.myPositionIncreaseButtonBackgrounds[i] = this.myPositionIncreaseButtonPanels[i].pp_addChild();\r\n this.myPositionIncreaseButtonTexts[i] = this.myPositionIncreaseButtonPanels[i].pp_addChild();\r\n this.myPositionIncreaseButtonCursorTargets[i] = this.myPositionIncreaseButtonPanels[i].pp_addChild();\r\n\r\n this.myPositionDecreaseButtonPanels[i] = this.myPositionPanels[i].pp_addChild();\r\n this.myPositionDecreaseButtonBackgrounds[i] = this.myPositionDecreaseButtonPanels[i].pp_addChild();\r\n this.myPositionDecreaseButtonTexts[i] = this.myPositionDecreaseButtonPanels[i].pp_addChild();\r\n this.myPositionDecreaseButtonCursorTargets[i] = this.myPositionDecreaseButtonPanels[i].pp_addChild();\r\n }\r\n\r\n // Rotation\r\n\r\n this.myRotationPanel = this.myDisplayPanel.pp_addChild();\r\n this.myRotationLabelText = this.myRotationPanel.pp_addChild();\r\n this.myRotationLabelCursorTarget = this.myRotationPanel.pp_addChild();\r\n\r\n this.myRotationPanels = [];\r\n this.myRotationTexts = [];\r\n this.myRotationCursorTargets = [];\r\n\r\n this.myRotationIncreaseButtonPanels = [];\r\n this.myRotationIncreaseButtonBackgrounds = [];\r\n this.myRotationIncreaseButtonTexts = [];\r\n this.myRotationIncreaseButtonCursorTargets = [];\r\n\r\n this.myRotationDecreaseButtonPanels = [];\r\n this.myRotationDecreaseButtonBackgrounds = [];\r\n this.myRotationDecreaseButtonTexts = [];\r\n this.myRotationDecreaseButtonCursorTargets = [];\r\n\r\n for (let i = 0; i < 3; i++) {\r\n this.myRotationPanels[i] = this.myRotationPanel.pp_addChild();\r\n this.myRotationTexts[i] = this.myRotationPanels[i].pp_addChild();\r\n this.myRotationCursorTargets[i] = this.myRotationPanels[i].pp_addChild();\r\n\r\n this.myRotationIncreaseButtonPanels[i] = this.myRotationPanels[i].pp_addChild();\r\n this.myRotationIncreaseButtonBackgrounds[i] = this.myRotationIncreaseButtonPanels[i].pp_addChild();\r\n this.myRotationIncreaseButtonTexts[i] = this.myRotationIncreaseButtonPanels[i].pp_addChild();\r\n this.myRotationIncreaseButtonCursorTargets[i] = this.myRotationIncreaseButtonPanels[i].pp_addChild();\r\n\r\n this.myRotationDecreaseButtonPanels[i] = this.myRotationPanels[i].pp_addChild();\r\n this.myRotationDecreaseButtonBackgrounds[i] = this.myRotationDecreaseButtonPanels[i].pp_addChild();\r\n this.myRotationDecreaseButtonTexts[i] = this.myRotationDecreaseButtonPanels[i].pp_addChild();\r\n this.myRotationDecreaseButtonCursorTargets[i] = this.myRotationDecreaseButtonPanels[i].pp_addChild();\r\n }\r\n\r\n // Scale\r\n\r\n this.myScalePanel = this.myDisplayPanel.pp_addChild();\r\n this.myScaleLabelText = this.myScalePanel.pp_addChild();\r\n this.myScaleLabelCursorTarget = this.myScalePanel.pp_addChild();\r\n\r\n this.myScalePanels = [];\r\n this.myScaleTexts = [];\r\n this.myScaleCursorTargets = [];\r\n\r\n this.myScaleIncreaseButtonPanels = [];\r\n this.myScaleIncreaseButtonBackgrounds = [];\r\n this.myScaleIncreaseButtonTexts = [];\r\n this.myScaleIncreaseButtonCursorTargets = [];\r\n\r\n this.myScaleDecreaseButtonPanels = [];\r\n this.myScaleDecreaseButtonBackgrounds = [];\r\n this.myScaleDecreaseButtonTexts = [];\r\n this.myScaleDecreaseButtonCursorTargets = [];\r\n\r\n for (let i = 0; i < 3; i++) {\r\n this.myScalePanels[i] = this.myScalePanel.pp_addChild();\r\n this.myScaleTexts[i] = this.myScalePanels[i].pp_addChild();\r\n this.myScaleCursorTargets[i] = this.myScalePanels[i].pp_addChild();\r\n\r\n this.myScaleIncreaseButtonPanels[i] = this.myScalePanels[i].pp_addChild();\r\n this.myScaleIncreaseButtonBackgrounds[i] = this.myScaleIncreaseButtonPanels[i].pp_addChild();\r\n this.myScaleIncreaseButtonTexts[i] = this.myScaleIncreaseButtonPanels[i].pp_addChild();\r\n this.myScaleIncreaseButtonCursorTargets[i] = this.myScaleIncreaseButtonPanels[i].pp_addChild();\r\n\r\n this.myScaleDecreaseButtonPanels[i] = this.myScalePanels[i].pp_addChild();\r\n this.myScaleDecreaseButtonBackgrounds[i] = this.myScaleDecreaseButtonPanels[i].pp_addChild();\r\n this.myScaleDecreaseButtonTexts[i] = this.myScaleDecreaseButtonPanels[i].pp_addChild();\r\n this.myScaleDecreaseButtonCursorTargets[i] = this.myScaleDecreaseButtonPanels[i].pp_addChild();\r\n }\r\n\r\n // Steps\r\n\r\n // Position\r\n\r\n this.myPositionStepPanel = this.myPositionPanel.pp_addChild();\r\n this.myPositionStepText = this.myPositionStepPanel.pp_addChild();\r\n this.myPositionStepCursorTarget = this.myPositionStepPanel.pp_addChild();\r\n\r\n this.myPositionStepIncreaseButtonPanel = this.myPositionStepPanel.pp_addChild();\r\n this.myPositionStepIncreaseButtonBackground = this.myPositionStepIncreaseButtonPanel.pp_addChild();\r\n this.myPositionStepIncreaseButtonText = this.myPositionStepIncreaseButtonPanel.pp_addChild();\r\n this.myPositionStepIncreaseButtonCursorTarget = this.myPositionStepIncreaseButtonPanel.pp_addChild();\r\n\r\n this.myPositionStepDecreaseButtonPanel = this.myPositionStepPanel.pp_addChild();\r\n this.myPositionStepDecreaseButtonBackground = this.myPositionStepDecreaseButtonPanel.pp_addChild();\r\n this.myPositionStepDecreaseButtonText = this.myPositionStepDecreaseButtonPanel.pp_addChild();\r\n this.myPositionStepDecreaseButtonCursorTarget = this.myPositionStepDecreaseButtonPanel.pp_addChild();\r\n\r\n // Rotation\r\n\r\n this.myRotationStepPanel = this.myRotationPanel.pp_addChild();\r\n this.myRotationStepText = this.myRotationStepPanel.pp_addChild();\r\n this.myRotationStepCursorTarget = this.myRotationStepPanel.pp_addChild();\r\n\r\n this.myRotationStepIncreaseButtonPanel = this.myRotationStepPanel.pp_addChild();\r\n this.myRotationStepIncreaseButtonBackground = this.myRotationStepIncreaseButtonPanel.pp_addChild();\r\n this.myRotationStepIncreaseButtonText = this.myRotationStepIncreaseButtonPanel.pp_addChild();\r\n this.myRotationStepIncreaseButtonCursorTarget = this.myRotationStepIncreaseButtonPanel.pp_addChild();\r\n\r\n this.myRotationStepDecreaseButtonPanel = this.myRotationStepPanel.pp_addChild();\r\n this.myRotationStepDecreaseButtonBackground = this.myRotationStepDecreaseButtonPanel.pp_addChild();\r\n this.myRotationStepDecreaseButtonText = this.myRotationStepDecreaseButtonPanel.pp_addChild();\r\n this.myRotationStepDecreaseButtonCursorTarget = this.myRotationStepDecreaseButtonPanel.pp_addChild();\r\n\r\n // Scale\r\n\r\n this.myScaleStepPanel = this.myScalePanel.pp_addChild();\r\n this.myScaleStepText = this.myScaleStepPanel.pp_addChild();\r\n this.myScaleStepCursorTarget = this.myScaleStepPanel.pp_addChild();\r\n\r\n this.myScaleStepIncreaseButtonPanel = this.myScaleStepPanel.pp_addChild();\r\n this.myScaleStepIncreaseButtonBackground = this.myScaleStepIncreaseButtonPanel.pp_addChild();\r\n this.myScaleStepIncreaseButtonText = this.myScaleStepIncreaseButtonPanel.pp_addChild();\r\n this.myScaleStepIncreaseButtonCursorTarget = this.myScaleStepIncreaseButtonPanel.pp_addChild();\r\n\r\n this.myScaleStepDecreaseButtonPanel = this.myScaleStepPanel.pp_addChild();\r\n this.myScaleStepDecreaseButtonBackground = this.myScaleStepDecreaseButtonPanel.pp_addChild();\r\n this.myScaleStepDecreaseButtonText = this.myScaleStepDecreaseButtonPanel.pp_addChild();\r\n this.myScaleStepDecreaseButtonCursorTarget = this.myScaleStepDecreaseButtonPanel.pp_addChild();\r\n }\r\n\r\n _setTransformHook() {\r\n // Position\r\n\r\n this.myPositionPanel.pp_setPositionLocal(this._myConfig.myPositionPanelPosition);\r\n this.myPositionLabelText.pp_scaleObject(this._myConfig.myComponentLabelTextScale);\r\n this.myPositionLabelCursorTarget.pp_setPositionLocal(this._myConfig.myComponentLabelCursorTargetPosition);\r\n\r\n for (let i = 0; i < 3; i++) {\r\n this.myPositionPanels[i].pp_setPositionLocal(this._myConfig.myValuePanelsPositions[i]);\r\n this.myPositionTexts[i].pp_scaleObject(this._myConfig.myValueTextScale);\r\n this.myPositionCursorTargets[i].pp_setPositionLocal(this._myConfig.myValueCursorTargetPosition);\r\n\r\n this.myPositionIncreaseButtonPanels[i].pp_setPositionLocal(this._myConfig.myIncreaseButtonPosition);\r\n this.myPositionIncreaseButtonBackgrounds[i].pp_scaleObject(this._myConfig.mySideButtonBackgroundScale);\r\n this.myPositionIncreaseButtonTexts[i].pp_setPositionLocal(this._myConfig.mySideButtonTextPosition);\r\n this.myPositionIncreaseButtonTexts[i].pp_scaleObject(this._myConfig.mySideButtonTextScale);\r\n this.myPositionIncreaseButtonCursorTargets[i].pp_setPositionLocal(this._myConfig.mySideButtonCursorTargetPosition);\r\n\r\n this.myPositionDecreaseButtonPanels[i].pp_setPositionLocal(this._myConfig.myDecreaseButtonPosition);\r\n this.myPositionDecreaseButtonBackgrounds[i].pp_scaleObject(this._myConfig.mySideButtonBackgroundScale);\r\n this.myPositionDecreaseButtonTexts[i].pp_setPositionLocal(this._myConfig.mySideButtonTextPosition);\r\n this.myPositionDecreaseButtonTexts[i].pp_scaleObject(this._myConfig.mySideButtonTextScale);\r\n this.myPositionDecreaseButtonCursorTargets[i].pp_setPositionLocal(this._myConfig.mySideButtonCursorTargetPosition);\r\n }\r\n\r\n // Rotation\r\n\r\n this.myRotationPanel.pp_setPositionLocal(this._myConfig.myRotationPanelPosition);\r\n this.myRotationLabelText.pp_scaleObject(this._myConfig.myComponentLabelTextScale);\r\n this.myRotationLabelCursorTarget.pp_setPositionLocal(this._myConfig.myComponentLabelCursorTargetPosition);\r\n\r\n for (let i = 0; i < 3; i++) {\r\n this.myRotationPanels[i].pp_setPositionLocal(this._myConfig.myValuePanelsPositions[i]);\r\n this.myRotationTexts[i].pp_scaleObject(this._myConfig.myValueTextScale);\r\n this.myRotationCursorTargets[i].pp_setPositionLocal(this._myConfig.myValueCursorTargetPosition);\r\n\r\n this.myRotationIncreaseButtonPanels[i].pp_setPositionLocal(this._myConfig.myIncreaseButtonPosition);\r\n this.myRotationIncreaseButtonBackgrounds[i].pp_scaleObject(this._myConfig.mySideButtonBackgroundScale);\r\n this.myRotationIncreaseButtonTexts[i].pp_setPositionLocal(this._myConfig.mySideButtonTextPosition);\r\n this.myRotationIncreaseButtonTexts[i].pp_scaleObject(this._myConfig.mySideButtonTextScale);\r\n this.myRotationIncreaseButtonCursorTargets[i].pp_setPositionLocal(this._myConfig.mySideButtonCursorTargetPosition);\r\n\r\n this.myRotationDecreaseButtonPanels[i].pp_setPositionLocal(this._myConfig.myDecreaseButtonPosition);\r\n this.myRotationDecreaseButtonBackgrounds[i].pp_scaleObject(this._myConfig.mySideButtonBackgroundScale);\r\n this.myRotationDecreaseButtonTexts[i].pp_setPositionLocal(this._myConfig.mySideButtonTextPosition);\r\n this.myRotationDecreaseButtonTexts[i].pp_scaleObject(this._myConfig.mySideButtonTextScale);\r\n this.myRotationDecreaseButtonCursorTargets[i].pp_setPositionLocal(this._myConfig.mySideButtonCursorTargetPosition);\r\n }\r\n\r\n // Scale\r\n\r\n this.myScalePanel.pp_setPositionLocal(this._myConfig.myScalePanelPosition);\r\n this.myScaleLabelText.pp_scaleObject(this._myConfig.myComponentLabelTextScale);\r\n this.myScaleLabelCursorTarget.pp_setPositionLocal(this._myConfig.myComponentLabelCursorTargetPosition);\r\n\r\n for (let i = 0; i < 3; i++) {\r\n this.myScalePanels[i].pp_setPositionLocal(this._myConfig.myValuePanelsPositions[i]);\r\n this.myScaleTexts[i].pp_scaleObject(this._myConfig.myValueTextScale);\r\n this.myScaleCursorTargets[i].pp_setPositionLocal(this._myConfig.myValueCursorTargetPosition);\r\n\r\n this.myScaleIncreaseButtonPanels[i].pp_setPositionLocal(this._myConfig.myIncreaseButtonPosition);\r\n this.myScaleIncreaseButtonBackgrounds[i].pp_scaleObject(this._myConfig.mySideButtonBackgroundScale);\r\n this.myScaleIncreaseButtonTexts[i].pp_setPositionLocal(this._myConfig.mySideButtonTextPosition);\r\n this.myScaleIncreaseButtonTexts[i].pp_scaleObject(this._myConfig.mySideButtonTextScale);\r\n this.myScaleIncreaseButtonCursorTargets[i].pp_setPositionLocal(this._myConfig.mySideButtonCursorTargetPosition);\r\n\r\n this.myScaleDecreaseButtonPanels[i].pp_setPositionLocal(this._myConfig.myDecreaseButtonPosition);\r\n this.myScaleDecreaseButtonBackgrounds[i].pp_scaleObject(this._myConfig.mySideButtonBackgroundScale);\r\n this.myScaleDecreaseButtonTexts[i].pp_setPositionLocal(this._myConfig.mySideButtonTextPosition);\r\n this.myScaleDecreaseButtonTexts[i].pp_scaleObject(this._myConfig.mySideButtonTextScale);\r\n this.myScaleDecreaseButtonCursorTargets[i].pp_setPositionLocal(this._myConfig.mySideButtonCursorTargetPosition);\r\n }\r\n\r\n // Steps\r\n\r\n // Position\r\n\r\n this.myPositionStepPanel.pp_setPositionLocal(this._myConfig.myStepPanelPosition);\r\n this.myPositionStepText.pp_scaleObject(this._myConfig.myStepTextScale);\r\n this.myPositionStepCursorTarget.pp_setPositionLocal(this._myConfig.myStepCursorTargetPosition);\r\n\r\n this.myPositionStepIncreaseButtonPanel.pp_setPositionLocal(this._myConfig.myIncreaseButtonPosition);\r\n this.myPositionStepIncreaseButtonBackground.pp_scaleObject(this._myConfig.mySideButtonBackgroundScale);\r\n this.myPositionStepIncreaseButtonText.pp_setPositionLocal(this._myConfig.mySideButtonTextPosition);\r\n this.myPositionStepIncreaseButtonText.pp_scaleObject(this._myConfig.mySideButtonTextScale);\r\n this.myPositionStepIncreaseButtonCursorTarget.pp_setPositionLocal(this._myConfig.mySideButtonCursorTargetPosition);\r\n\r\n this.myPositionStepDecreaseButtonPanel.pp_setPositionLocal(this._myConfig.myDecreaseButtonPosition);\r\n this.myPositionStepDecreaseButtonBackground.pp_scaleObject(this._myConfig.mySideButtonBackgroundScale);\r\n this.myPositionStepDecreaseButtonText.pp_setPositionLocal(this._myConfig.mySideButtonTextPosition);\r\n this.myPositionStepDecreaseButtonText.pp_scaleObject(this._myConfig.mySideButtonTextScale);\r\n this.myPositionStepDecreaseButtonCursorTarget.pp_setPositionLocal(this._myConfig.mySideButtonCursorTargetPosition);\r\n\r\n // Rotation\r\n\r\n this.myRotationStepPanel.pp_setPositionLocal(this._myConfig.myStepPanelPosition);\r\n this.myRotationStepText.pp_scaleObject(this._myConfig.myStepTextScale);\r\n this.myRotationStepCursorTarget.pp_setPositionLocal(this._myConfig.myStepCursorTargetPosition);\r\n\r\n this.myRotationStepIncreaseButtonPanel.pp_setPositionLocal(this._myConfig.myIncreaseButtonPosition);\r\n this.myRotationStepIncreaseButtonBackground.pp_scaleObject(this._myConfig.mySideButtonBackgroundScale);\r\n this.myRotationStepIncreaseButtonText.pp_setPositionLocal(this._myConfig.mySideButtonTextPosition);\r\n this.myRotationStepIncreaseButtonText.pp_scaleObject(this._myConfig.mySideButtonTextScale);\r\n this.myRotationStepIncreaseButtonCursorTarget.pp_setPositionLocal(this._myConfig.mySideButtonCursorTargetPosition);\r\n\r\n this.myRotationStepDecreaseButtonPanel.pp_setPositionLocal(this._myConfig.myDecreaseButtonPosition);\r\n this.myRotationStepDecreaseButtonBackground.pp_scaleObject(this._myConfig.mySideButtonBackgroundScale);\r\n this.myRotationStepDecreaseButtonText.pp_setPositionLocal(this._myConfig.mySideButtonTextPosition);\r\n this.myRotationStepDecreaseButtonText.pp_scaleObject(this._myConfig.mySideButtonTextScale);\r\n this.myRotationStepDecreaseButtonCursorTarget.pp_setPositionLocal(this._myConfig.mySideButtonCursorTargetPosition);\r\n\r\n // Scale\r\n\r\n this.myScaleStepPanel.pp_setPositionLocal(this._myConfig.myStepPanelPosition);\r\n this.myScaleStepText.pp_scaleObject(this._myConfig.myStepTextScale);\r\n this.myScaleStepCursorTarget.pp_setPositionLocal(this._myConfig.myStepCursorTargetPosition);\r\n\r\n this.myScaleStepIncreaseButtonPanel.pp_setPositionLocal(this._myConfig.myIncreaseButtonPosition);\r\n this.myScaleStepIncreaseButtonBackground.pp_scaleObject(this._myConfig.mySideButtonBackgroundScale);\r\n this.myScaleStepIncreaseButtonText.pp_setPositionLocal(this._myConfig.mySideButtonTextPosition);\r\n this.myScaleStepIncreaseButtonText.pp_scaleObject(this._myConfig.mySideButtonTextScale);\r\n this.myScaleStepIncreaseButtonCursorTarget.pp_setPositionLocal(this._myConfig.mySideButtonCursorTargetPosition);\r\n\r\n this.myScaleStepDecreaseButtonPanel.pp_setPositionLocal(this._myConfig.myDecreaseButtonPosition);\r\n this.myScaleStepDecreaseButtonBackground.pp_scaleObject(this._myConfig.mySideButtonBackgroundScale);\r\n this.myScaleStepDecreaseButtonText.pp_setPositionLocal(this._myConfig.mySideButtonTextPosition);\r\n this.myScaleStepDecreaseButtonText.pp_scaleObject(this._myConfig.mySideButtonTextScale);\r\n this.myScaleStepDecreaseButtonCursorTarget.pp_setPositionLocal(this._myConfig.mySideButtonCursorTargetPosition);\r\n }\r\n\r\n _addComponentsHook() {\r\n // Position\r\n\r\n this.myPositionLabelTextComponent = this.myPositionLabelText.pp_addComponent(TextComponent);\r\n this._setupTextComponent(this.myPositionLabelTextComponent);\r\n this.myPositionLabelTextComponent.text = this._myConfig.myPositionText;\r\n\r\n this.myPositionLabelCursorTargetComponent = this.myPositionLabelCursorTarget.pp_addComponent(CursorTarget);\r\n this.myPositionLabelCollisionComponent = this.myPositionLabelCursorTarget.pp_addComponent(CollisionComponent);\r\n this.myPositionLabelCollisionComponent.collider = this._myConfig.myCursorTargetCollisionCollider;\r\n this.myPositionLabelCollisionComponent.group = 1 << this._myConfig.myCursorTargetCollisionGroup;\r\n this.myPositionLabelCollisionComponent.extents = this._myConfig.myComponentLabelCollisionExtents;\r\n\r\n this.myPositionTextComponents = [];\r\n this.myPositionCursorTargetComponents = [];\r\n this.myPositionCollisionComponents = [];\r\n\r\n this.myPositionIncreaseButtonBackgroundComponents = [];\r\n this.myPositionIncreaseButtonTextComponents = [];\r\n this.myPositionIncreaseButtonCursorTargetComponents = [];\r\n this.myPositionIncreaseButtonCollisionComponents = [];\r\n\r\n this.myPositionDecreaseButtonBackgroundComponents = [];\r\n this.myPositionDecreaseButtonTextComponents = [];\r\n this.myPositionDecreaseButtonCursorTargetComponents = [];\r\n this.myPositionDecreaseButtonCollisionComponents = [];\r\n\r\n for (let i = 0; i < 3; i++) {\r\n this.myPositionTextComponents[i] = this.myPositionTexts[i].pp_addComponent(TextComponent);\r\n this._setupTextComponent(this.myPositionTextComponents[i]);\r\n this.myPositionTextComponents[i].text = \" \";\r\n\r\n this.myPositionCursorTargetComponents[i] = this.myPositionCursorTargets[i].pp_addComponent(CursorTarget);\r\n this.myPositionCollisionComponents[i] = this.myPositionCursorTargets[i].pp_addComponent(CollisionComponent);\r\n this.myPositionCollisionComponents[i].collider = this._myConfig.myCursorTargetCollisionCollider;\r\n this.myPositionCollisionComponents[i].group = 1 << this._myConfig.myCursorTargetCollisionGroup;\r\n this.myPositionCollisionComponents[i].extents = this._myConfig.myValueCollisionExtents;\r\n\r\n this.myPositionIncreaseButtonBackgroundComponents[i] = this.myPositionIncreaseButtonBackgrounds[i].pp_addComponent(MeshComponent);\r\n this.myPositionIncreaseButtonBackgroundComponents[i].mesh = this._myPlaneMesh;\r\n this.myPositionIncreaseButtonBackgroundComponents[i].material = this._myParams.myPlaneMaterial.clone();\r\n this.myPositionIncreaseButtonBackgroundComponents[i].material.color = this._myConfig.myBackgroundColor;\r\n\r\n this.myPositionIncreaseButtonTextComponents[i] = this.myPositionIncreaseButtonTexts[i].pp_addComponent(TextComponent);\r\n this._setupTextComponent(this.myPositionIncreaseButtonTextComponents[i]);\r\n this.myPositionIncreaseButtonTextComponents[i].text = this._myConfig.myIncreaseButtonText;\r\n\r\n this.myPositionIncreaseButtonCursorTargetComponents[i] = this.myPositionIncreaseButtonCursorTargets[i].pp_addComponent(CursorTarget);\r\n this.myPositionIncreaseButtonCollisionComponents[i] = this.myPositionIncreaseButtonCursorTargets[i].pp_addComponent(CollisionComponent);\r\n this.myPositionIncreaseButtonCollisionComponents[i].collider = this._myConfig.myCursorTargetCollisionCollider;\r\n this.myPositionIncreaseButtonCollisionComponents[i].group = 1 << this._myConfig.myCursorTargetCollisionGroup;\r\n this.myPositionIncreaseButtonCollisionComponents[i].extents = this._myConfig.mySideButtonCollisionExtents;\r\n\r\n this.myPositionDecreaseButtonBackgroundComponents[i] = this.myPositionDecreaseButtonBackgrounds[i].pp_addComponent(MeshComponent);\r\n this.myPositionDecreaseButtonBackgroundComponents[i].mesh = this._myPlaneMesh;\r\n this.myPositionDecreaseButtonBackgroundComponents[i].material = this._myParams.myPlaneMaterial.clone();\r\n this.myPositionDecreaseButtonBackgroundComponents[i].material.color = this._myConfig.myBackgroundColor;\r\n\r\n this.myPositionDecreaseButtonTextComponents[i] = this.myPositionDecreaseButtonTexts[i].pp_addComponent(TextComponent);\r\n this._setupTextComponent(this.myPositionDecreaseButtonTextComponents[i]);\r\n this.myPositionDecreaseButtonTextComponents[i].text = this._myConfig.myDecreaseButtonText;\r\n\r\n this.myPositionDecreaseButtonCursorTargetComponents[i] = this.myPositionDecreaseButtonCursorTargets[i].pp_addComponent(CursorTarget);\r\n this.myPositionDecreaseButtonCollisionComponents[i] = this.myPositionDecreaseButtonCursorTargets[i].pp_addComponent(CollisionComponent);\r\n this.myPositionDecreaseButtonCollisionComponents[i].collider = this._myConfig.myCursorTargetCollisionCollider;\r\n this.myPositionDecreaseButtonCollisionComponents[i].group = 1 << this._myConfig.myCursorTargetCollisionGroup;\r\n this.myPositionDecreaseButtonCollisionComponents[i].extents = this._myConfig.mySideButtonCollisionExtents;\r\n }\r\n\r\n // Rotation\r\n\r\n this.myRotationLabelTextComponent = this.myRotationLabelText.pp_addComponent(TextComponent);\r\n this._setupTextComponent(this.myRotationLabelTextComponent);\r\n this.myRotationLabelTextComponent.text = this._myConfig.myRotationText;\r\n\r\n this.myRotationLabelCursorTargetComponent = this.myRotationLabelCursorTarget.pp_addComponent(CursorTarget);\r\n this.myRotationLabelCollisionComponent = this.myRotationLabelCursorTarget.pp_addComponent(CollisionComponent);\r\n this.myRotationLabelCollisionComponent.collider = this._myConfig.myCursorTargetCollisionCollider;\r\n this.myRotationLabelCollisionComponent.group = 1 << this._myConfig.myCursorTargetCollisionGroup;\r\n this.myRotationLabelCollisionComponent.extents = this._myConfig.myComponentLabelCollisionExtents;\r\n\r\n this.myRotationTextComponents = [];\r\n this.myRotationCursorTargetComponents = [];\r\n this.myRotationCollisionComponents = [];\r\n\r\n this.myRotationIncreaseButtonBackgroundComponents = [];\r\n this.myRotationIncreaseButtonTextComponents = [];\r\n this.myRotationIncreaseButtonCursorTargetComponents = [];\r\n this.myRotationIncreaseButtonCollisionComponents = [];\r\n\r\n this.myRotationDecreaseButtonBackgroundComponents = [];\r\n this.myRotationDecreaseButtonTextComponents = [];\r\n this.myRotationDecreaseButtonCursorTargetComponents = [];\r\n this.myRotationDecreaseButtonCollisionComponents = [];\r\n\r\n for (let i = 0; i < 3; i++) {\r\n this.myRotationTextComponents[i] = this.myRotationTexts[i].pp_addComponent(TextComponent);\r\n this._setupTextComponent(this.myRotationTextComponents[i]);\r\n this.myRotationTextComponents[i].text = \" \";\r\n\r\n this.myRotationCursorTargetComponents[i] = this.myRotationCursorTargets[i].pp_addComponent(CursorTarget);\r\n this.myRotationCollisionComponents[i] = this.myRotationCursorTargets[i].pp_addComponent(CollisionComponent);\r\n this.myRotationCollisionComponents[i].collider = this._myConfig.myCursorTargetCollisionCollider;\r\n this.myRotationCollisionComponents[i].group = 1 << this._myConfig.myCursorTargetCollisionGroup;\r\n this.myRotationCollisionComponents[i].extents = this._myConfig.myValueCollisionExtents;\r\n\r\n this.myRotationIncreaseButtonBackgroundComponents[i] = this.myRotationIncreaseButtonBackgrounds[i].pp_addComponent(MeshComponent);\r\n this.myRotationIncreaseButtonBackgroundComponents[i].mesh = this._myPlaneMesh;\r\n this.myRotationIncreaseButtonBackgroundComponents[i].material = this._myParams.myPlaneMaterial.clone();\r\n this.myRotationIncreaseButtonBackgroundComponents[i].material.color = this._myConfig.myBackgroundColor;\r\n\r\n this.myRotationIncreaseButtonTextComponents[i] = this.myRotationIncreaseButtonTexts[i].pp_addComponent(TextComponent);\r\n this._setupTextComponent(this.myRotationIncreaseButtonTextComponents[i]);\r\n this.myRotationIncreaseButtonTextComponents[i].text = this._myConfig.myIncreaseButtonText;\r\n\r\n this.myRotationIncreaseButtonCursorTargetComponents[i] = this.myRotationIncreaseButtonCursorTargets[i].pp_addComponent(CursorTarget);\r\n this.myRotationIncreaseButtonCollisionComponents[i] = this.myRotationIncreaseButtonCursorTargets[i].pp_addComponent(CollisionComponent);\r\n this.myRotationIncreaseButtonCollisionComponents[i].collider = this._myConfig.myCursorTargetCollisionCollider;\r\n this.myRotationIncreaseButtonCollisionComponents[i].group = 1 << this._myConfig.myCursorTargetCollisionGroup;\r\n this.myRotationIncreaseButtonCollisionComponents[i].extents = this._myConfig.mySideButtonCollisionExtents;\r\n\r\n this.myRotationDecreaseButtonBackgroundComponents[i] = this.myRotationDecreaseButtonBackgrounds[i].pp_addComponent(MeshComponent);\r\n this.myRotationDecreaseButtonBackgroundComponents[i].mesh = this._myPlaneMesh;\r\n this.myRotationDecreaseButtonBackgroundComponents[i].material = this._myParams.myPlaneMaterial.clone();\r\n this.myRotationDecreaseButtonBackgroundComponents[i].material.color = this._myConfig.myBackgroundColor;\r\n\r\n this.myRotationDecreaseButtonTextComponents[i] = this.myRotationDecreaseButtonTexts[i].pp_addComponent(TextComponent);\r\n this._setupTextComponent(this.myRotationDecreaseButtonTextComponents[i]);\r\n this.myRotationDecreaseButtonTextComponents[i].text = this._myConfig.myDecreaseButtonText;\r\n\r\n this.myRotationDecreaseButtonCursorTargetComponents[i] = this.myRotationDecreaseButtonCursorTargets[i].pp_addComponent(CursorTarget);\r\n this.myRotationDecreaseButtonCollisionComponents[i] = this.myRotationDecreaseButtonCursorTargets[i].pp_addComponent(CollisionComponent);\r\n this.myRotationDecreaseButtonCollisionComponents[i].collider = this._myConfig.myCursorTargetCollisionCollider;\r\n this.myRotationDecreaseButtonCollisionComponents[i].group = 1 << this._myConfig.myCursorTargetCollisionGroup;\r\n this.myRotationDecreaseButtonCollisionComponents[i].extents = this._myConfig.mySideButtonCollisionExtents;\r\n }\r\n\r\n // Scale\r\n\r\n this.myScaleLabelTextComponent = this.myScaleLabelText.pp_addComponent(TextComponent);\r\n this._setupTextComponent(this.myScaleLabelTextComponent);\r\n this.myScaleLabelTextComponent.text = this._myConfig.myScaleText;\r\n\r\n this.myScaleLabelCursorTargetComponent = this.myScaleLabelCursorTarget.pp_addComponent(CursorTarget);\r\n this.myScaleLabelCollisionComponent = this.myScaleLabelCursorTarget.pp_addComponent(CollisionComponent);\r\n this.myScaleLabelCollisionComponent.collider = this._myConfig.myCursorTargetCollisionCollider;\r\n this.myScaleLabelCollisionComponent.group = 1 << this._myConfig.myCursorTargetCollisionGroup;\r\n this.myScaleLabelCollisionComponent.extents = this._myConfig.myComponentLabelCollisionExtents;\r\n\r\n this.myScaleTextComponents = [];\r\n this.myScaleCursorTargetComponents = [];\r\n this.myScaleCollisionComponents = [];\r\n\r\n this.myScaleIncreaseButtonBackgroundComponents = [];\r\n this.myScaleIncreaseButtonTextComponents = [];\r\n this.myScaleIncreaseButtonCursorTargetComponents = [];\r\n this.myScaleIncreaseButtonCollisionComponents = [];\r\n\r\n this.myScaleDecreaseButtonBackgroundComponents = [];\r\n this.myScaleDecreaseButtonTextComponents = [];\r\n this.myScaleDecreaseButtonCursorTargetComponents = [];\r\n this.myScaleDecreaseButtonCollisionComponents = [];\r\n\r\n for (let i = 0; i < 3; i++) {\r\n this.myScaleTextComponents[i] = this.myScaleTexts[i].pp_addComponent(TextComponent);\r\n this._setupTextComponent(this.myScaleTextComponents[i]);\r\n this.myScaleTextComponents[i].text = \" \";\r\n\r\n this.myScaleCursorTargetComponents[i] = this.myScaleCursorTargets[i].pp_addComponent(CursorTarget);\r\n this.myScaleCollisionComponents[i] = this.myScaleCursorTargets[i].pp_addComponent(CollisionComponent);\r\n this.myScaleCollisionComponents[i].collider = this._myConfig.myCursorTargetCollisionCollider;\r\n this.myScaleCollisionComponents[i].group = 1 << this._myConfig.myCursorTargetCollisionGroup;\r\n this.myScaleCollisionComponents[i].extents = this._myConfig.myValueCollisionExtents;\r\n\r\n this.myScaleIncreaseButtonBackgroundComponents[i] = this.myScaleIncreaseButtonBackgrounds[i].pp_addComponent(MeshComponent);\r\n this.myScaleIncreaseButtonBackgroundComponents[i].mesh = this._myPlaneMesh;\r\n this.myScaleIncreaseButtonBackgroundComponents[i].material = this._myParams.myPlaneMaterial.clone();\r\n this.myScaleIncreaseButtonBackgroundComponents[i].material.color = this._myConfig.myBackgroundColor;\r\n\r\n this.myScaleIncreaseButtonTextComponents[i] = this.myScaleIncreaseButtonTexts[i].pp_addComponent(TextComponent);\r\n this._setupTextComponent(this.myScaleIncreaseButtonTextComponents[i]);\r\n this.myScaleIncreaseButtonTextComponents[i].text = this._myConfig.myIncreaseButtonText;\r\n\r\n this.myScaleIncreaseButtonCursorTargetComponents[i] = this.myScaleIncreaseButtonCursorTargets[i].pp_addComponent(CursorTarget);\r\n this.myScaleIncreaseButtonCollisionComponents[i] = this.myScaleIncreaseButtonCursorTargets[i].pp_addComponent(CollisionComponent);\r\n this.myScaleIncreaseButtonCollisionComponents[i].collider = this._myConfig.myCursorTargetCollisionCollider;\r\n this.myScaleIncreaseButtonCollisionComponents[i].group = 1 << this._myConfig.myCursorTargetCollisionGroup;\r\n this.myScaleIncreaseButtonCollisionComponents[i].extents = this._myConfig.mySideButtonCollisionExtents;\r\n\r\n this.myScaleDecreaseButtonBackgroundComponents[i] = this.myScaleDecreaseButtonBackgrounds[i].pp_addComponent(MeshComponent);\r\n this.myScaleDecreaseButtonBackgroundComponents[i].mesh = this._myPlaneMesh;\r\n this.myScaleDecreaseButtonBackgroundComponents[i].material = this._myParams.myPlaneMaterial.clone();\r\n this.myScaleDecreaseButtonBackgroundComponents[i].material.color = this._myConfig.myBackgroundColor;\r\n\r\n this.myScaleDecreaseButtonTextComponents[i] = this.myScaleDecreaseButtonTexts[i].pp_addComponent(TextComponent);\r\n this._setupTextComponent(this.myScaleDecreaseButtonTextComponents[i]);\r\n this.myScaleDecreaseButtonTextComponents[i].text = this._myConfig.myDecreaseButtonText;\r\n\r\n this.myScaleDecreaseButtonCursorTargetComponents[i] = this.myScaleDecreaseButtonCursorTargets[i].pp_addComponent(CursorTarget);\r\n this.myScaleDecreaseButtonCollisionComponents[i] = this.myScaleDecreaseButtonCursorTargets[i].pp_addComponent(CollisionComponent);\r\n this.myScaleDecreaseButtonCollisionComponents[i].collider = this._myConfig.myCursorTargetCollisionCollider;\r\n this.myScaleDecreaseButtonCollisionComponents[i].group = 1 << this._myConfig.myCursorTargetCollisionGroup;\r\n this.myScaleDecreaseButtonCollisionComponents[i].extents = this._myConfig.mySideButtonCollisionExtents;\r\n }\r\n\r\n // Steps\r\n\r\n // Position \r\n this.myPositionStepTextComponent = this.myPositionStepText.pp_addComponent(TextComponent);\r\n this._setupTextComponent(this.myPositionStepTextComponent);\r\n this.myPositionStepTextComponent.text = \" \";\r\n\r\n this.myPositionStepCursorTargetComponent = this.myPositionStepCursorTarget.pp_addComponent(CursorTarget);\r\n this.myPositionStepCollisionComponent = this.myPositionStepCursorTarget.pp_addComponent(CollisionComponent);\r\n this.myPositionStepCollisionComponent.collider = this._myConfig.myCursorTargetCollisionCollider;\r\n this.myPositionStepCollisionComponent.group = 1 << this._myConfig.myCursorTargetCollisionGroup;\r\n this.myPositionStepCollisionComponent.extents = this._myConfig.myStepCollisionExtents;\r\n\r\n this.myPositionStepIncreaseButtonBackgroundComponent = this.myPositionStepIncreaseButtonBackground.pp_addComponent(MeshComponent);\r\n this.myPositionStepIncreaseButtonBackgroundComponent.mesh = this._myPlaneMesh;\r\n this.myPositionStepIncreaseButtonBackgroundComponent.material = this._myParams.myPlaneMaterial.clone();\r\n this.myPositionStepIncreaseButtonBackgroundComponent.material.color = this._myConfig.myBackgroundColor;\r\n\r\n this.myPositionStepIncreaseButtonTextComponent = this.myPositionStepIncreaseButtonText.pp_addComponent(TextComponent);\r\n this._setupTextComponent(this.myPositionStepIncreaseButtonTextComponent);\r\n this.myPositionStepIncreaseButtonTextComponent.text = this._myConfig.myIncreaseButtonText;\r\n\r\n this.myPositionStepIncreaseButtonCursorTargetComponent = this.myPositionStepIncreaseButtonCursorTarget.pp_addComponent(CursorTarget);\r\n this.myPositionStepIncreaseButtonCollisionComponent = this.myPositionStepIncreaseButtonCursorTarget.pp_addComponent(CollisionComponent);\r\n this.myPositionStepIncreaseButtonCollisionComponent.collider = this._myConfig.myCursorTargetCollisionCollider;\r\n this.myPositionStepIncreaseButtonCollisionComponent.group = 1 << this._myConfig.myCursorTargetCollisionGroup;\r\n this.myPositionStepIncreaseButtonCollisionComponent.extents = this._myConfig.mySideButtonCollisionExtents;\r\n\r\n this.myPositionStepDecreaseButtonBackgroundComponent = this.myPositionStepDecreaseButtonBackground.pp_addComponent(MeshComponent);\r\n this.myPositionStepDecreaseButtonBackgroundComponent.mesh = this._myPlaneMesh;\r\n this.myPositionStepDecreaseButtonBackgroundComponent.material = this._myParams.myPlaneMaterial.clone();\r\n this.myPositionStepDecreaseButtonBackgroundComponent.material.color = this._myConfig.myBackgroundColor;\r\n\r\n this.myPositionStepDecreaseButtonTextComponent = this.myPositionStepDecreaseButtonText.pp_addComponent(TextComponent);\r\n this._setupTextComponent(this.myPositionStepDecreaseButtonTextComponent);\r\n this.myPositionStepDecreaseButtonTextComponent.text = this._myConfig.myDecreaseButtonText;\r\n\r\n this.myPositionStepDecreaseButtonCursorTargetComponent = this.myPositionStepDecreaseButtonCursorTarget.pp_addComponent(CursorTarget);\r\n this.myPositionStepDecreaseButtonCollisionComponent = this.myPositionStepDecreaseButtonCursorTarget.pp_addComponent(CollisionComponent);\r\n this.myPositionStepDecreaseButtonCollisionComponent.collider = this._myConfig.myCursorTargetCollisionCollider;\r\n this.myPositionStepDecreaseButtonCollisionComponent.group = 1 << this._myConfig.myCursorTargetCollisionGroup;\r\n this.myPositionStepDecreaseButtonCollisionComponent.extents = this._myConfig.mySideButtonCollisionExtents;\r\n\r\n // Rotation\r\n\r\n this.myRotationStepTextComponent = this.myRotationStepText.pp_addComponent(TextComponent);\r\n this._setupTextComponent(this.myRotationStepTextComponent);\r\n this.myRotationStepTextComponent.text = \" \";\r\n\r\n this.myRotationStepCursorTargetComponent = this.myRotationStepCursorTarget.pp_addComponent(CursorTarget);\r\n this.myRotationStepCollisionComponent = this.myRotationStepCursorTarget.pp_addComponent(CollisionComponent);\r\n this.myRotationStepCollisionComponent.collider = this._myConfig.myCursorTargetCollisionCollider;\r\n this.myRotationStepCollisionComponent.group = 1 << this._myConfig.myCursorTargetCollisionGroup;\r\n this.myRotationStepCollisionComponent.extents = this._myConfig.myStepCollisionExtents;\r\n\r\n this.myRotationStepIncreaseButtonBackgroundComponent = this.myRotationStepIncreaseButtonBackground.pp_addComponent(MeshComponent);\r\n this.myRotationStepIncreaseButtonBackgroundComponent.mesh = this._myPlaneMesh;\r\n this.myRotationStepIncreaseButtonBackgroundComponent.material = this._myParams.myPlaneMaterial.clone();\r\n this.myRotationStepIncreaseButtonBackgroundComponent.material.color = this._myConfig.myBackgroundColor;\r\n\r\n this.myRotationStepIncreaseButtonTextComponent = this.myRotationStepIncreaseButtonText.pp_addComponent(TextComponent);\r\n this._setupTextComponent(this.myRotationStepIncreaseButtonTextComponent);\r\n this.myRotationStepIncreaseButtonTextComponent.text = this._myConfig.myIncreaseButtonText;\r\n\r\n this.myRotationStepIncreaseButtonCursorTargetComponent = this.myRotationStepIncreaseButtonCursorTarget.pp_addComponent(CursorTarget);\r\n this.myRotationStepIncreaseButtonCollisionComponent = this.myRotationStepIncreaseButtonCursorTarget.pp_addComponent(CollisionComponent);\r\n this.myRotationStepIncreaseButtonCollisionComponent.collider = this._myConfig.myCursorTargetCollisionCollider;\r\n this.myRotationStepIncreaseButtonCollisionComponent.group = 1 << this._myConfig.myCursorTargetCollisionGroup;\r\n this.myRotationStepIncreaseButtonCollisionComponent.extents = this._myConfig.mySideButtonCollisionExtents;\r\n\r\n this.myRotationStepDecreaseButtonBackgroundComponent = this.myRotationStepDecreaseButtonBackground.pp_addComponent(MeshComponent);\r\n this.myRotationStepDecreaseButtonBackgroundComponent.mesh = this._myPlaneMesh;\r\n this.myRotationStepDecreaseButtonBackgroundComponent.material = this._myParams.myPlaneMaterial.clone();\r\n this.myRotationStepDecreaseButtonBackgroundComponent.material.color = this._myConfig.myBackgroundColor;\r\n\r\n this.myRotationStepDecreaseButtonTextComponent = this.myRotationStepDecreaseButtonText.pp_addComponent(TextComponent);\r\n this._setupTextComponent(this.myRotationStepDecreaseButtonTextComponent);\r\n this.myRotationStepDecreaseButtonTextComponent.text = this._myConfig.myDecreaseButtonText;\r\n\r\n this.myRotationStepDecreaseButtonCursorTargetComponent = this.myRotationStepDecreaseButtonCursorTarget.pp_addComponent(CursorTarget);\r\n this.myRotationStepDecreaseButtonCollisionComponent = this.myRotationStepDecreaseButtonCursorTarget.pp_addComponent(CollisionComponent);\r\n this.myRotationStepDecreaseButtonCollisionComponent.collider = this._myConfig.myCursorTargetCollisionCollider;\r\n this.myRotationStepDecreaseButtonCollisionComponent.group = 1 << this._myConfig.myCursorTargetCollisionGroup;\r\n this.myRotationStepDecreaseButtonCollisionComponent.extents = this._myConfig.mySideButtonCollisionExtents;\r\n\r\n // Scale\r\n\r\n this.myScaleStepTextComponent = this.myScaleStepText.pp_addComponent(TextComponent);\r\n this._setupTextComponent(this.myScaleStepTextComponent);\r\n this.myScaleStepTextComponent.text = \" \";\r\n\r\n this.myScaleStepCursorTargetComponent = this.myScaleStepCursorTarget.pp_addComponent(CursorTarget);\r\n this.myScaleStepCollisionComponent = this.myScaleStepCursorTarget.pp_addComponent(CollisionComponent);\r\n this.myScaleStepCollisionComponent.collider = this._myConfig.myCursorTargetCollisionCollider;\r\n this.myScaleStepCollisionComponent.group = 1 << this._myConfig.myCursorTargetCollisionGroup;\r\n this.myScaleStepCollisionComponent.extents = this._myConfig.myStepCollisionExtents;\r\n\r\n this.myScaleStepIncreaseButtonBackgroundComponent = this.myScaleStepIncreaseButtonBackground.pp_addComponent(MeshComponent);\r\n this.myScaleStepIncreaseButtonBackgroundComponent.mesh = this._myPlaneMesh;\r\n this.myScaleStepIncreaseButtonBackgroundComponent.material = this._myParams.myPlaneMaterial.clone();\r\n this.myScaleStepIncreaseButtonBackgroundComponent.material.color = this._myConfig.myBackgroundColor;\r\n\r\n this.myScaleStepIncreaseButtonTextComponent = this.myScaleStepIncreaseButtonText.pp_addComponent(TextComponent);\r\n this._setupTextComponent(this.myScaleStepIncreaseButtonTextComponent);\r\n this.myScaleStepIncreaseButtonTextComponent.text = this._myConfig.myIncreaseButtonText;\r\n\r\n this.myScaleStepIncreaseButtonCursorTargetComponent = this.myScaleStepIncreaseButtonCursorTarget.pp_addComponent(CursorTarget);\r\n this.myScaleStepIncreaseButtonCollisionComponent = this.myScaleStepIncreaseButtonCursorTarget.pp_addComponent(CollisionComponent);\r\n this.myScaleStepIncreaseButtonCollisionComponent.collider = this._myConfig.myCursorTargetCollisionCollider;\r\n this.myScaleStepIncreaseButtonCollisionComponent.group = 1 << this._myConfig.myCursorTargetCollisionGroup;\r\n this.myScaleStepIncreaseButtonCollisionComponent.extents = this._myConfig.mySideButtonCollisionExtents;\r\n\r\n this.myScaleStepDecreaseButtonBackgroundComponent = this.myScaleStepDecreaseButtonBackground.pp_addComponent(MeshComponent);\r\n this.myScaleStepDecreaseButtonBackgroundComponent.mesh = this._myPlaneMesh;\r\n this.myScaleStepDecreaseButtonBackgroundComponent.material = this._myParams.myPlaneMaterial.clone();\r\n this.myScaleStepDecreaseButtonBackgroundComponent.material.color = this._myConfig.myBackgroundColor;\r\n\r\n this.myScaleStepDecreaseButtonTextComponent = this.myScaleStepDecreaseButtonText.pp_addComponent(TextComponent);\r\n this._setupTextComponent(this.myScaleStepDecreaseButtonTextComponent);\r\n this.myScaleStepDecreaseButtonTextComponent.text = this._myConfig.myDecreaseButtonText;\r\n\r\n this.myScaleStepDecreaseButtonCursorTargetComponent = this.myScaleStepDecreaseButtonCursorTarget.pp_addComponent(CursorTarget);\r\n this.myScaleStepDecreaseButtonCollisionComponent = this.myScaleStepDecreaseButtonCursorTarget.pp_addComponent(CollisionComponent);\r\n this.myScaleStepDecreaseButtonCollisionComponent.collider = this._myConfig.myCursorTargetCollisionCollider;\r\n this.myScaleStepDecreaseButtonCollisionComponent.group = 1 << this._myConfig.myCursorTargetCollisionGroup;\r\n this.myScaleStepDecreaseButtonCollisionComponent.extents = this._myConfig.mySideButtonCollisionExtents;\r\n }\r\n\r\n _addStepComponents() {\r\n // Position\r\n this.myPositionStepTextComponent = this.myPositionStepText.pp_addComponent(TextComponent);\r\n this._setupTextComponent(this.myPositionStepTextComponent);\r\n this.myPositionStepTextComponent.text = \" \";\r\n\r\n this.myPositionStepCursorTargetComponent = this.myPositionStepCursorTarget.pp_addComponent(CursorTarget);\r\n this.myPositionStepCollisionComponent = this.myPositionStepCursorTarget.pp_addComponent(CollisionComponent);\r\n this.myPositionStepCollisionComponent.collider = this._myConfig.myCursorTargetCollisionCollider;\r\n this.myPositionStepCollisionComponent.group = 1 << this._myConfig.myCursorTargetCollisionGroup;\r\n this.myPositionStepCollisionComponent.extents = this._myConfig.myStepCollisionExtents;\r\n\r\n // Increase/Decrease\r\n this.myPositionStepIncreaseButtonBackgroundComponent = this.myPositionStepIncreaseButtonBackground.pp_addComponent(MeshComponent);\r\n this.myPositionStepIncreaseButtonBackgroundComponent.mesh = this._myPlaneMesh;\r\n this.myPositionStepIncreaseButtonBackgroundComponent.material = this._myParams.myPlaneMaterial.clone();\r\n this.myPositionStepIncreaseButtonBackgroundComponent.material.color = this._myConfig.myBackgroundColor;\r\n\r\n this.myPositionStepIncreaseButtonTextComponent = this.myPositionStepIncreaseButtonText.pp_addComponent(TextComponent);\r\n this._setupTextComponent(this.myPositionStepIncreaseButtonTextComponent);\r\n this.myPositionStepIncreaseButtonTextComponent.text = this._myConfig.myIncreaseButtonText;\r\n\r\n this.myPositionStepIncreaseButtonCursorTargetComponent = this.myPositionStepIncreaseButtonCursorTarget.pp_addComponent(CursorTarget);\r\n this.myPositionStepIncreaseButtonCollisionComponent = this.myPositionStepIncreaseButtonCursorTarget.pp_addComponent(CollisionComponent);\r\n this.myPositionStepIncreaseButtonCollisionComponent.collider = this._myConfig.myCursorTargetCollisionCollider;\r\n this.myPositionStepIncreaseButtonCollisionComponent.group = 1 << this._myConfig.myCursorTargetCollisionGroup;\r\n this.myPositionStepIncreaseButtonCollisionComponent.extents = this._myConfig.mySideButtonCollisionExtents;\r\n\r\n this.myPositionStepDecreaseButtonBackgroundComponent = this.myPositionStepDecreaseButtonBackground.pp_addComponent(MeshComponent);\r\n this.myPositionStepDecreaseButtonBackgroundComponent.mesh = this._myPlaneMesh;\r\n this.myPositionStepDecreaseButtonBackgroundComponent.material = this._myParams.myPlaneMaterial.clone();\r\n this.myPositionStepDecreaseButtonBackgroundComponent.material.color = this._myConfig.myBackgroundColor;\r\n\r\n this.myPositionStepDecreaseButtonTextComponent = this.myPositionStepDecreaseButtonText.pp_addComponent(TextComponent);\r\n this._setupTextComponent(this.myPositionStepDecreaseButtonTextComponent);\r\n this.myPositionStepDecreaseButtonTextComponent.text = this._myConfig.myDecreaseButtonText;\r\n\r\n this.myPositionStepDecreaseButtonCursorTargetComponent = this.myPositionStepDecreaseButtonCursorTarget.pp_addComponent(CursorTarget);\r\n this.myPositionStepDecreaseButtonCollisionComponent = this.myPositionStepDecreaseButtonCursorTarget.pp_addComponent(CollisionComponent);\r\n this.myPositionStepDecreaseButtonCollisionComponent.collider = this._myConfig.myCursorTargetCollisionCollider;\r\n this.myPositionStepDecreaseButtonCollisionComponent.group = 1 << this._myConfig.myCursorTargetCollisionGroup;\r\n this.myPositionStepDecreaseButtonCollisionComponent.extents = this._myConfig.mySideButtonCollisionExtents;\r\n\r\n // Rotation\r\n this.myRotationStepTextComponent = this.myRotationStepText.pp_addComponent(TextComponent);\r\n this._setupTextComponent(this.myRotationStepTextComponent);\r\n this.myRotationStepTextComponent.text = \" \";\r\n\r\n this.myRotationStepCursorTargetComponent = this.myRotationStepCursorTarget.pp_addComponent(CursorTarget);\r\n this.myRotationStepCollisionComponent = this.myRotationStepCursorTarget.pp_addComponent(CollisionComponent);\r\n this.myRotationStepCollisionComponent.collider = this._myConfig.myCursorTargetCollisionCollider;\r\n this.myRotationStepCollisionComponent.group = 1 << this._myConfig.myCursorTargetCollisionGroup;\r\n this.myRotationStepCollisionComponent.extents = this._myConfig.myStepCollisionExtents;\r\n\r\n // Increase/Decrease\r\n this.myRotationStepIncreaseButtonBackgroundComponent = this.myRotationStepIncreaseButtonBackground.pp_addComponent(MeshComponent);\r\n this.myRotationStepIncreaseButtonBackgroundComponent.mesh = this._myPlaneMesh;\r\n this.myRotationStepIncreaseButtonBackgroundComponent.material = this._myParams.myPlaneMaterial.clone();\r\n this.myRotationStepIncreaseButtonBackgroundComponent.material.color = this._myConfig.myBackgroundColor;\r\n\r\n this.myRotationStepIncreaseButtonTextComponent = this.myRotationStepIncreaseButtonText.pp_addComponent(TextComponent);\r\n this._setupTextComponent(this.myRotationStepIncreaseButtonTextComponent);\r\n this.myRotationStepIncreaseButtonTextComponent.text = this._myConfig.myIncreaseButtonText;\r\n\r\n this.myRotationStepIncreaseButtonCursorTargetComponent = this.myRotationStepIncreaseButtonCursorTarget.pp_addComponent(CursorTarget);\r\n this.myRotationStepIncreaseButtonCollisionComponent = this.myRotationStepIncreaseButtonCursorTarget.pp_addComponent(CollisionComponent);\r\n this.myRotationStepIncreaseButtonCollisionComponent.collider = this._myConfig.myCursorTargetCollisionCollider;\r\n this.myRotationStepIncreaseButtonCollisionComponent.group = 1 << this._myConfig.myCursorTargetCollisionGroup;\r\n this.myRotationStepIncreaseButtonCollisionComponent.extents = this._myConfig.mySideButtonCollisionExtents;\r\n\r\n this.myRotationStepDecreaseButtonBackgroundComponent = this.myRotationStepDecreaseButtonBackground.pp_addComponent(MeshComponent);\r\n this.myRotationStepDecreaseButtonBackgroundComponent.mesh = this._myPlaneMesh;\r\n this.myRotationStepDecreaseButtonBackgroundComponent.material = this._myParams.myPlaneMaterial.clone();\r\n this.myRotationStepDecreaseButtonBackgroundComponent.material.color = this._myConfig.myBackgroundColor;\r\n\r\n this.myRotationStepDecreaseButtonTextComponent = this.myRotationStepDecreaseButtonText.pp_addComponent(TextComponent);\r\n this._setupTextComponent(this.myRotationStepDecreaseButtonTextComponent);\r\n this.myRotationStepDecreaseButtonTextComponent.text = this._myConfig.myDecreaseButtonText;\r\n\r\n this.myRotationStepDecreaseButtonCursorTargetComponent = this.myRotationStepDecreaseButtonCursorTarget.pp_addComponent(CursorTarget);\r\n this.myRotationStepDecreaseButtonCollisionComponent = this.myRotationStepDecreaseButtonCursorTarget.pp_addComponent(CollisionComponent);\r\n this.myRotationStepDecreaseButtonCollisionComponent.collider = this._myConfig.myCursorTargetCollisionCollider;\r\n this.myRotationStepDecreaseButtonCollisionComponent.group = 1 << this._myConfig.myCursorTargetCollisionGroup;\r\n this.myRotationStepDecreaseButtonCollisionComponent.extents = this._myConfig.mySideButtonCollisionExtents;\r\n\r\n // Scale\r\n this.myScaleStepTextComponent = this.myScaleStepText.pp_addComponent(TextComponent);\r\n this._setupTextComponent(this.myScaleStepTextComponent);\r\n this.myScaleStepTextComponent.text = \" \";\r\n\r\n this.myScaleStepCursorTargetComponent = this.myScaleStepCursorTarget.pp_addComponent(CursorTarget);\r\n this.myScaleStepCollisionComponent = this.myScaleStepCursorTarget.pp_addComponent(CollisionComponent);\r\n this.myScaleStepCollisionComponent.collider = this._myConfig.myCursorTargetCollisionCollider;\r\n this.myScaleStepCollisionComponent.group = 1 << this._myConfig.myCursorTargetCollisionGroup;\r\n this.myScaleStepCollisionComponent.extents = this._myConfig.myStepCollisionExtents;\r\n\r\n // Increase/Decrease\r\n this.myScaleStepIncreaseButtonBackgroundComponent = this.myScaleStepIncreaseButtonBackground.pp_addComponent(MeshComponent);\r\n this.myScaleStepIncreaseButtonBackgroundComponent.mesh = this._myPlaneMesh;\r\n this.myScaleStepIncreaseButtonBackgroundComponent.material = this._myParams.myPlaneMaterial.clone();\r\n this.myScaleStepIncreaseButtonBackgroundComponent.material.color = this._myConfig.myBackgroundColor;\r\n\r\n this.myScaleStepIncreaseButtonTextComponent = this.myScaleStepIncreaseButtonText.pp_addComponent(TextComponent);\r\n this._setupTextComponent(this.myScaleStepIncreaseButtonTextComponent);\r\n this.myScaleStepIncreaseButtonTextComponent.text = this._myConfig.myIncreaseButtonText;\r\n\r\n this.myScaleStepIncreaseButtonCursorTargetComponent = this.myScaleStepIncreaseButtonCursorTarget.pp_addComponent(CursorTarget);\r\n this.myScaleStepIncreaseButtonCollisionComponent = this.myScaleStepIncreaseButtonCursorTarget.pp_addComponent(CollisionComponent);\r\n this.myScaleStepIncreaseButtonCollisionComponent.collider = this._myConfig.myCursorTargetCollisionCollider;\r\n this.myScaleStepIncreaseButtonCollisionComponent.group = 1 << this._myConfig.myCursorTargetCollisionGroup;\r\n this.myScaleStepIncreaseButtonCollisionComponent.extents = this._myConfig.mySideButtonCollisionExtents;\r\n\r\n this.myScaleStepDecreaseButtonBackgroundComponent = this.myScaleStepDecreaseButtonBackground.pp_addComponent(MeshComponent);\r\n this.myScaleStepDecreaseButtonBackgroundComponent.mesh = this._myPlaneMesh;\r\n this.myScaleStepDecreaseButtonBackgroundComponent.material = this._myParams.myPlaneMaterial.clone();\r\n this.myScaleStepDecreaseButtonBackgroundComponent.material.color = this._myConfig.myBackgroundColor;\r\n\r\n this.myScaleStepDecreaseButtonTextComponent = this.myScaleStepDecreaseButtonText.pp_addComponent(TextComponent);\r\n this._setupTextComponent(this.myScaleStepDecreaseButtonTextComponent);\r\n this.myScaleStepDecreaseButtonTextComponent.text = this._myConfig.myDecreaseButtonText;\r\n\r\n this.myScaleStepDecreaseButtonCursorTargetComponent = this.myScaleStepDecreaseButtonCursorTarget.pp_addComponent(CursorTarget);\r\n this.myScaleStepDecreaseButtonCollisionComponent = this.myScaleStepDecreaseButtonCursorTarget.pp_addComponent(CollisionComponent);\r\n this.myScaleStepDecreaseButtonCollisionComponent.collider = this._myConfig.myCursorTargetCollisionCollider;\r\n this.myScaleStepDecreaseButtonCollisionComponent.group = 1 << this._myConfig.myCursorTargetCollisionGroup;\r\n this.myScaleStepDecreaseButtonCollisionComponent.extents = this._myConfig.mySideButtonCollisionExtents;\r\n }\r\n}", "import { GamepadAxesID } from \"../../../../input/gamepad/gamepad_buttons.js\";\r\nimport { mat4_create, vec3_create } from \"../../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Globals } from \"../../../../pp/globals.js\";\r\nimport { EasyTuneBaseWidget } from \"../base/easy_tune_base_widget.js\";\r\nimport { EasyTuneTransformWidgetConfig } from \"./easy_tune_transform_widget_config.js\";\r\nimport { EasyTuneTransformWidgetUI } from \"./easy_tune_transform_widget_ui.js\";\r\n\r\nexport class EasyTuneTransformWidget extends EasyTuneBaseWidget {\r\n\r\n constructor(params, gamepad, engine = Globals.getMainEngine()) {\r\n super(params);\r\n\r\n this._myGamepad = gamepad;\r\n\r\n this._myConfig = new EasyTuneTransformWidgetConfig();\r\n this._myUI = new EasyTuneTransformWidgetUI(engine);\r\n\r\n this._myValueButtonEditIntensity = 0;\r\n this._myValueButtonEditIntensityTimer = 0;\r\n this._myStepButtonEditIntensity = 0;\r\n this._myStepButtonEditIntensityTimer = 0;\r\n\r\n this._myValueEditEnabled = false;\r\n this._myStepEditEnabled = false;\r\n\r\n this._myValueRealValue = 0;\r\n this._myComponentStepValue = 0;\r\n this._myStepMultiplierValue = 0;\r\n this._myStepFastEdit = false;\r\n\r\n this._myValueEditIndex = -1;\r\n this._myComponentIndex = 0;\r\n this._myStepIndex = 0;\r\n\r\n this._myTempTransformValue = mat4_create();\r\n this._myTempPositionValue = vec3_create();\r\n this._myTempRotationValue = vec3_create();\r\n this._myTempScaleValue = vec3_create();\r\n }\r\n\r\n _refreshUIHook() {\r\n for (let i = 0; i < 3; i++) {\r\n this._myUI.myPositionTextComponents[i].text = this._myVariable._myPosition[i].toFixed(this._myVariable._myDecimalPlaces);\r\n }\r\n this._myUI.myPositionStepTextComponent.text = this._myConfig.myStepStartString.concat(this._myVariable._myPositionStepPerSecond);\r\n\r\n for (let i = 0; i < 3; i++) {\r\n this._myUI.myRotationTextComponents[i].text = this._myVariable._myRotation[i].toFixed(this._myVariable._myDecimalPlaces);\r\n }\r\n this._myUI.myRotationStepTextComponent.text = this._myConfig.myStepStartString.concat(this._myVariable._myRotationStepPerSecond);\r\n\r\n for (let i = 0; i < 3; i++) {\r\n this._myUI.myScaleTextComponents[i].text = this._myVariable._myScale[i].toFixed(this._myVariable._myDecimalPlaces);\r\n }\r\n this._myUI.myScaleStepTextComponent.text = this._myConfig.myStepStartString.concat(this._myVariable._myScaleStepPerSecond);\r\n }\r\n\r\n _startHook(parentObject, easyTuneParams) {\r\n this._myUI.setAdditionalButtonsVisible(easyTuneParams.myShowAdditionalButtons);\r\n }\r\n\r\n _setEasyTuneVariableHook() {\r\n if (this._myVariable != null) {\r\n if (this._myValueEditIndex >= 0 && this._myValueEditIndex < 3) {\r\n switch (this._myComponentIndex) {\r\n case 0:\r\n this._myValueRealValue = this._myVariable._myPosition[this._myValueEditIndex];\r\n this._myComponentStepValue = this._myVariable._myPositionStepPerSecond;\r\n break;\r\n case 1:\r\n this._myValueRealValue = this._myVariable._myRotation[this._myValueEditIndex];\r\n this._myComponentStepValue = this._myVariable._myRotationStepPerSecond;\r\n break;\r\n case 2:\r\n this._myValueRealValue = this._myVariable._myScale[this._myValueEditIndex];\r\n this._myComponentStepValue = this._myVariable._myScaleStepPerSecond;\r\n break;\r\n }\r\n }\r\n\r\n this._myTempPositionValue.pp_copy(this._myVariable._myPosition);\r\n this._myTempRotationValue.pp_copy(this._myVariable._myRotation);\r\n this._myTempScaleValue.pp_copy(this._myVariable._myScale);\r\n\r\n this._myStepMultiplierValue = 0;\r\n this._myStepFastEdit = false;\r\n }\r\n }\r\n\r\n _updateHook(dt) {\r\n this._updateValue(dt);\r\n }\r\n\r\n _updateValue(dt) {\r\n let stickVariableIntensity = 0;\r\n\r\n if (this._myGamepad) {\r\n let y = this._myGamepad.getAxesInfo(GamepadAxesID.THUMBSTICK).myAxes[1];\r\n\r\n if (Math.abs(y) > this._myConfig.myEditThumbstickMinThreshold) {\r\n let normalizedEditAmount = (Math.abs(y) - this._myConfig.myEditThumbstickMinThreshold) / (1 - this._myConfig.myEditThumbstickMinThreshold);\r\n stickVariableIntensity = Math.sign(y) * normalizedEditAmount;\r\n }\r\n }\r\n\r\n let valueIntensity = 0;\r\n if (this._myValueEditEnabled) {\r\n valueIntensity = stickVariableIntensity;\r\n } else if (this._myValueButtonEditIntensity != 0) {\r\n if (this._myValueButtonEditIntensityTimer <= 0) {\r\n valueIntensity = this._myValueButtonEditIntensity;\r\n } else {\r\n this._myValueButtonEditIntensityTimer -= dt;\r\n }\r\n }\r\n\r\n if (this._myValueEditIndex >= 0 && this._myValueEditIndex < 3) {\r\n if (valueIntensity != 0) {\r\n this._myTempPositionValue.pp_copy(this._myVariable._myPosition);\r\n this._myTempRotationValue.pp_copy(this._myVariable._myRotation);\r\n this._myTempScaleValue.pp_copy(this._myVariable._myScale);\r\n\r\n let amountToAdd = valueIntensity * this._myComponentStepValue * dt;\r\n\r\n this._myValueRealValue += amountToAdd;\r\n\r\n let decimalPlacesMultiplier = Math.pow(10, this._myVariable._myDecimalPlaces);\r\n\r\n switch (this._myComponentIndex) {\r\n case 0:\r\n this._myTempPositionValue[this._myValueEditIndex] = Math.round(this._myValueRealValue * decimalPlacesMultiplier + Number.EPSILON) / decimalPlacesMultiplier;\r\n this._myUI.myPositionTextComponents[this._myValueEditIndex].text = this._myTempPositionValue[this._myValueEditIndex].toFixed(this._myVariable._myDecimalPlaces);\r\n break;\r\n case 1:\r\n if (this._myValueRealValue > 180) {\r\n while (this._myValueRealValue > 180) {\r\n this._myValueRealValue -= 180;\r\n }\r\n this._myValueRealValue = -180 + this._myValueRealValue;\r\n }\r\n\r\n if (this._myValueRealValue < -180) {\r\n while (this._myValueRealValue < - 180) {\r\n this._myValueRealValue += 180;\r\n }\r\n this._myValueRealValue = 180 - this._myValueRealValue;\r\n }\r\n\r\n this._myTempRotationValue[this._myValueEditIndex] = Math.round(this._myValueRealValue * decimalPlacesMultiplier + Number.EPSILON) / decimalPlacesMultiplier;\r\n this._myUI.myRotationTextComponents[this._myValueEditIndex].text = this._myTempRotationValue[this._myValueEditIndex].toFixed(this._myVariable._myDecimalPlaces);\r\n break;\r\n case 2:\r\n if (this._myValueRealValue <= 0) {\r\n this._myValueRealValue = 1 / decimalPlacesMultiplier;\r\n }\r\n\r\n if (this._myVariable._myScaleAsOne) {\r\n let newValue = Math.round(this._myValueRealValue * decimalPlacesMultiplier + Number.EPSILON) / decimalPlacesMultiplier;\r\n let difference = newValue - this._myTempScaleValue[this._myValueEditIndex];\r\n\r\n for (let i = 0; i < 3; i++) {\r\n this._myTempScaleValue[i] = Math.round((this._myTempScaleValue[i] + difference) * decimalPlacesMultiplier + Number.EPSILON) / decimalPlacesMultiplier;\r\n this._myTempScaleValue[i] = Math.max(this._myTempScaleValue[i], 1 / decimalPlacesMultiplier);\r\n this._myUI.myScaleTextComponents[i].text = this._myTempScaleValue[i].toFixed(this._myVariable._myDecimalPlaces);\r\n }\r\n } else {\r\n this._myTempScaleValue[this._myValueEditIndex] = Math.round(this._myValueRealValue * decimalPlacesMultiplier + Number.EPSILON) / decimalPlacesMultiplier;\r\n this._myTempScaleValue[this._myValueEditIndex] = Math.max(this._myTempScaleValue[this._myValueEditIndex], 1 / decimalPlacesMultiplier);\r\n this._myUI.myScaleTextComponents[this._myValueEditIndex].text = this._myTempScaleValue[this._myValueEditIndex].toFixed(this._myVariable._myDecimalPlaces);\r\n }\r\n break;\r\n }\r\n\r\n this._myTempTransformValue.mat4_setPositionRotationDegreesScale(this._myTempPositionValue, this._myTempRotationValue, this._myTempScaleValue);\r\n this._myVariable.setValue(this._myTempTransformValue);\r\n } else {\r\n switch (this._myComponentIndex) {\r\n case 0:\r\n this._myValueRealValue = this._myVariable._myPosition[this._myValueEditIndex];\r\n break;\r\n case 1:\r\n this._myValueRealValue = this._myVariable._myRotation[this._myValueEditIndex];\r\n break;\r\n case 2:\r\n this._myValueRealValue = this._myVariable._myScale[this._myValueEditIndex];\r\n break;\r\n }\r\n }\r\n }\r\n\r\n let stepIntensity = 0;\r\n if (this._myStepEditEnabled) {\r\n stepIntensity = stickVariableIntensity;\r\n } else if (this._myStepButtonEditIntensity != 0) {\r\n if (this._myStepButtonEditIntensityTimer <= 0) {\r\n stepIntensity = this._myStepButtonEditIntensity;\r\n } else {\r\n this._myStepButtonEditIntensityTimer -= dt;\r\n }\r\n }\r\n\r\n if (stepIntensity != 0) {\r\n let amountToAdd = 0;\r\n if (this._myStepFastEdit) {\r\n amountToAdd = Math.sign(stepIntensity) * 1;\r\n this._myStepFastEdit = false;\r\n } else {\r\n amountToAdd = stepIntensity * this._myConfig.myStepMultiplierStepPerSecond * dt;\r\n }\r\n\r\n this._myStepMultiplierValue += amountToAdd;\r\n if (Math.abs(this._myStepMultiplierValue) >= 1) {\r\n let stepValue = 0;\r\n switch (this._myStepIndex) {\r\n case 0:\r\n stepValue = this._myVariable._myPositionStepPerSecond;\r\n break;\r\n case 1:\r\n stepValue = this._myVariable._myRotationStepPerSecond;\r\n break;\r\n case 2:\r\n stepValue = this._myVariable._myScaleStepPerSecond;\r\n break;\r\n default:\r\n stepValue = 0;\r\n }\r\n if (Math.sign(this._myStepMultiplierValue) > 0) {\r\n this._myStepMultiplierValue -= 1;\r\n this._changeStep(this._myStepIndex, stepValue * 10);\r\n } else {\r\n this._myStepMultiplierValue += 1;\r\n this._changeStep(this._myStepIndex, stepValue * 0.1);\r\n }\r\n }\r\n } else {\r\n this._myStepMultiplierValue = 0;\r\n this._myStepFastEdit = true;\r\n }\r\n }\r\n\r\n _addListenersHook() {\r\n let ui = this._myUI;\r\n\r\n ui.myVariableLabelCursorTargetComponent.onClick.add(this._resetAllValues.bind(this));\r\n ui.myVariableLabelCursorTargetComponent.onHover.add(this._genericTextHover.bind(this, ui.myVariableLabelText));\r\n ui.myVariableLabelCursorTargetComponent.onUnhover.add(this._genericTextUnhover.bind(this, ui.myVariableLabelText, this._myConfig.myVariableLabelTextScale));\r\n\r\n this._myUnhoverCallbacks.push(this._genericTextUnhover.bind(this, ui.myVariableLabelText, this._myConfig.myVariableLabelTextScale));\r\n\r\n ui.myPositionLabelCursorTargetComponent.onClick.add(this._resetComponentValues.bind(this, 0));\r\n ui.myPositionLabelCursorTargetComponent.onHover.add(this._genericTextHover.bind(this, ui.myPositionLabelText));\r\n ui.myPositionLabelCursorTargetComponent.onUnhover.add(this._genericTextUnhover.bind(this, ui.myPositionLabelText, this._myConfig.myComponentLabelTextScale));\r\n\r\n this._myUnhoverCallbacks.push(this._genericTextUnhover.bind(this, ui.myPositionLabelText, this._myConfig.myComponentLabelTextScale));\r\n\r\n for (let i = 0; i < 3; i++) {\r\n ui.myPositionIncreaseButtonCursorTargetComponents[i].onDown.add(this._setValueEditIntensity.bind(this, 0, i, 1));\r\n ui.myPositionIncreaseButtonCursorTargetComponents[i].onDownOnHover.add(this._setValueEditIntensity.bind(this, 0, i, 1));\r\n ui.myPositionIncreaseButtonCursorTargetComponents[i].onUp.add(this._setValueEditIntensity.bind(this, 0, i, 0));\r\n ui.myPositionIncreaseButtonCursorTargetComponents[i].onUnhover.add(this._setValueEditIntensity.bind(this, 0, i, 0));\r\n ui.myPositionDecreaseButtonCursorTargetComponents[i].onDown.add(this._setValueEditIntensity.bind(this, 0, i, -1));\r\n ui.myPositionDecreaseButtonCursorTargetComponents[i].onDownOnHover.add(this._setValueEditIntensity.bind(this, 0, i, -1));\r\n ui.myPositionDecreaseButtonCursorTargetComponents[i].onUp.add(this._setValueEditIntensity.bind(this, 0, i, 0));\r\n ui.myPositionDecreaseButtonCursorTargetComponents[i].onUnhover.add(this._setValueEditIntensity.bind(this, 0, i, 0));\r\n\r\n this._myUnhoverCallbacks.push(this._setValueEditIntensity.bind(this, 0, i, 0));\r\n\r\n ui.myPositionIncreaseButtonCursorTargetComponents[i].onHover.add(this._genericHover.bind(this, ui.myPositionIncreaseButtonBackgroundComponents[i].material));\r\n ui.myPositionIncreaseButtonCursorTargetComponents[i].onUnhover.add(this._genericUnhover.bind(this, ui.myPositionIncreaseButtonBackgroundComponents[i].material));\r\n ui.myPositionDecreaseButtonCursorTargetComponents[i].onHover.add(this._genericHover.bind(this, ui.myPositionDecreaseButtonBackgroundComponents[i].material));\r\n ui.myPositionDecreaseButtonCursorTargetComponents[i].onUnhover.add(this._genericUnhover.bind(this, ui.myPositionDecreaseButtonBackgroundComponents[i].material));\r\n\r\n this._myUnhoverCallbacks.push(this._genericUnhover.bind(this, ui.myPositionIncreaseButtonBackgroundComponents[i].material));\r\n this._myUnhoverCallbacks.push(this._genericUnhover.bind(this, ui.myPositionDecreaseButtonBackgroundComponents[i].material));\r\n\r\n ui.myPositionCursorTargetComponents[i].onClick.add(this._resetValue.bind(this, 0, i));\r\n ui.myPositionCursorTargetComponents[i].onHover.add(this._setValueEditEnabled.bind(this, 0, i, ui.myPositionTexts[i], true));\r\n ui.myPositionCursorTargetComponents[i].onUnhover.add(this._setValueEditEnabled.bind(this, 0, i, ui.myPositionTexts[i], false));\r\n\r\n this._myUnhoverCallbacks.push(this._setValueEditEnabled.bind(this, 0, i, ui.myPositionTexts[i], false));\r\n }\r\n\r\n ui.myRotationLabelCursorTargetComponent.onClick.add(this._resetComponentValues.bind(this, 1));\r\n ui.myRotationLabelCursorTargetComponent.onHover.add(this._genericTextHover.bind(this, ui.myRotationLabelText));\r\n ui.myRotationLabelCursorTargetComponent.onUnhover.add(this._genericTextUnhover.bind(this, ui.myRotationLabelText, this._myConfig.myComponentLabelTextScale));\r\n\r\n this._myUnhoverCallbacks.push(this._genericTextUnhover.bind(this, ui.myRotationLabelText, this._myConfig.myComponentLabelTextScale));\r\n\r\n for (let i = 0; i < 3; i++) {\r\n ui.myRotationIncreaseButtonCursorTargetComponents[i].onDown.add(this._setValueEditIntensity.bind(this, 1, i, 1));\r\n ui.myRotationIncreaseButtonCursorTargetComponents[i].onDownOnHover.add(this._setValueEditIntensity.bind(this, 1, i, 1));\r\n ui.myRotationIncreaseButtonCursorTargetComponents[i].onUp.add(this._setValueEditIntensity.bind(this, 1, i, 0));\r\n ui.myRotationIncreaseButtonCursorTargetComponents[i].onUnhover.add(this._setValueEditIntensity.bind(this, 1, i, 0));\r\n ui.myRotationDecreaseButtonCursorTargetComponents[i].onDown.add(this._setValueEditIntensity.bind(this, 1, i, -1));\r\n ui.myRotationDecreaseButtonCursorTargetComponents[i].onDownOnHover.add(this._setValueEditIntensity.bind(this, 1, i, -1));\r\n ui.myRotationDecreaseButtonCursorTargetComponents[i].onUp.add(this._setValueEditIntensity.bind(this, 1, i, 0));\r\n ui.myRotationDecreaseButtonCursorTargetComponents[i].onUnhover.add(this._setValueEditIntensity.bind(this, 1, i, 0));\r\n\r\n this._myUnhoverCallbacks.push(this._setValueEditIntensity.bind(this, 1, i, 0));\r\n\r\n ui.myRotationIncreaseButtonCursorTargetComponents[i].onHover.add(this._genericHover.bind(this, ui.myRotationIncreaseButtonBackgroundComponents[i].material));\r\n ui.myRotationIncreaseButtonCursorTargetComponents[i].onUnhover.add(this._genericUnhover.bind(this, ui.myRotationIncreaseButtonBackgroundComponents[i].material));\r\n ui.myRotationDecreaseButtonCursorTargetComponents[i].onHover.add(this._genericHover.bind(this, ui.myRotationDecreaseButtonBackgroundComponents[i].material));\r\n ui.myRotationDecreaseButtonCursorTargetComponents[i].onUnhover.add(this._genericUnhover.bind(this, ui.myRotationDecreaseButtonBackgroundComponents[i].material));\r\n\r\n this._myUnhoverCallbacks.push(this._genericUnhover.bind(this, ui.myRotationIncreaseButtonBackgroundComponents[i].material));\r\n this._myUnhoverCallbacks.push(this._genericUnhover.bind(this, ui.myRotationDecreaseButtonBackgroundComponents[i].material));\r\n\r\n ui.myRotationCursorTargetComponents[i].onClick.add(this._resetValue.bind(this, 1, i));\r\n ui.myRotationCursorTargetComponents[i].onHover.add(this._setValueEditEnabled.bind(this, 1, i, ui.myRotationTexts[i], true));\r\n ui.myRotationCursorTargetComponents[i].onUnhover.add(this._setValueEditEnabled.bind(this, 1, i, ui.myRotationTexts[i], false));\r\n\r\n this._myUnhoverCallbacks.push(this._setValueEditEnabled.bind(this, 1, i, ui.myRotationTexts[i], false));\r\n }\r\n\r\n ui.myScaleLabelCursorTargetComponent.onClick.add(this._resetComponentValues.bind(this, 2));\r\n ui.myScaleLabelCursorTargetComponent.onHover.add(this._genericTextHover.bind(this, ui.myScaleLabelText));\r\n ui.myScaleLabelCursorTargetComponent.onUnhover.add(this._genericTextUnhover.bind(this, ui.myScaleLabelText, this._myConfig.myComponentLabelTextScale));\r\n\r\n this._myUnhoverCallbacks.push(this._genericTextUnhover.bind(this, ui.myScaleLabelText, this._myConfig.myComponentLabelTextScale));\r\n\r\n for (let i = 0; i < 3; i++) {\r\n ui.myScaleIncreaseButtonCursorTargetComponents[i].onDown.add(this._setValueEditIntensity.bind(this, 2, i, 1));\r\n ui.myScaleIncreaseButtonCursorTargetComponents[i].onDownOnHover.add(this._setValueEditIntensity.bind(this, 2, i, 1));\r\n ui.myScaleIncreaseButtonCursorTargetComponents[i].onUp.add(this._setValueEditIntensity.bind(this, 2, i, 0));\r\n ui.myScaleIncreaseButtonCursorTargetComponents[i].onUnhover.add(this._setValueEditIntensity.bind(this, 2, i, 0));\r\n ui.myScaleDecreaseButtonCursorTargetComponents[i].onDown.add(this._setValueEditIntensity.bind(this, 2, i, -1));\r\n ui.myScaleDecreaseButtonCursorTargetComponents[i].onDownOnHover.add(this._setValueEditIntensity.bind(this, 2, i, -1));\r\n ui.myScaleDecreaseButtonCursorTargetComponents[i].onUp.add(this._setValueEditIntensity.bind(this, 2, i, 0));\r\n ui.myScaleDecreaseButtonCursorTargetComponents[i].onUnhover.add(this._setValueEditIntensity.bind(this, 2, i, 0));\r\n\r\n this._myUnhoverCallbacks.push(this._setValueEditIntensity.bind(this, 2, i, 0));\r\n\r\n ui.myScaleIncreaseButtonCursorTargetComponents[i].onHover.add(this._genericHover.bind(this, ui.myScaleIncreaseButtonBackgroundComponents[i].material));\r\n ui.myScaleIncreaseButtonCursorTargetComponents[i].onUnhover.add(this._genericUnhover.bind(this, ui.myScaleIncreaseButtonBackgroundComponents[i].material));\r\n ui.myScaleDecreaseButtonCursorTargetComponents[i].onHover.add(this._genericHover.bind(this, ui.myScaleDecreaseButtonBackgroundComponents[i].material));\r\n ui.myScaleDecreaseButtonCursorTargetComponents[i].onUnhover.add(this._genericUnhover.bind(this, ui.myScaleDecreaseButtonBackgroundComponents[i].material));\r\n\r\n this._myUnhoverCallbacks.push(this._genericUnhover.bind(this, ui.myScaleIncreaseButtonBackgroundComponents[i].material));\r\n this._myUnhoverCallbacks.push(this._genericUnhover.bind(this, ui.myScaleDecreaseButtonBackgroundComponents[i].material));\r\n\r\n ui.myScaleCursorTargetComponents[i].onClick.add(this._resetValue.bind(this, 2, i));\r\n ui.myScaleCursorTargetComponents[i].onHover.add(this._setValueEditEnabled.bind(this, 2, i, ui.myScaleTexts[i], true));\r\n ui.myScaleCursorTargetComponents[i].onUnhover.add(this._setValueEditEnabled.bind(this, 2, i, ui.myScaleTexts[i], false));\r\n\r\n this._myUnhoverCallbacks.push(this._setValueEditEnabled.bind(this, 2, i, ui.myScaleTexts[i], false));\r\n }\r\n\r\n ui.myPositionStepCursorTargetComponent.onClick.add(this._resetStep.bind(this, 0));\r\n ui.myPositionStepCursorTargetComponent.onHover.add(this._setStepEditEnabled.bind(this, 0, ui.myPositionStepText, true));\r\n ui.myPositionStepCursorTargetComponent.onUnhover.add(this._setStepEditEnabled.bind(this, 0, ui.myPositionStepText, false));\r\n\r\n this._myUnhoverCallbacks.push(this._setStepEditEnabled.bind(this, 0, ui.myPositionStepText, false));\r\n\r\n ui.myPositionStepIncreaseButtonCursorTargetComponent.onDown.add(this._setStepEditIntensity.bind(this, 0, 1));\r\n ui.myPositionStepIncreaseButtonCursorTargetComponent.onDownOnHover.add(this._setStepEditIntensity.bind(this, 0, 1));\r\n ui.myPositionStepIncreaseButtonCursorTargetComponent.onUp.add(this._setStepEditIntensity.bind(this, 0, 0));\r\n ui.myPositionStepIncreaseButtonCursorTargetComponent.onUnhover.add(this._setStepEditIntensity.bind(this, 0, 0));\r\n ui.myPositionStepDecreaseButtonCursorTargetComponent.onDown.add(this._setStepEditIntensity.bind(this, 0, -1));\r\n ui.myPositionStepDecreaseButtonCursorTargetComponent.onDownOnHover.add(this._setStepEditIntensity.bind(this, 0, -1));\r\n ui.myPositionStepDecreaseButtonCursorTargetComponent.onUp.add(this._setStepEditIntensity.bind(this, 0, 0));\r\n ui.myPositionStepDecreaseButtonCursorTargetComponent.onUnhover.add(this._setStepEditIntensity.bind(this, 0, 0));\r\n\r\n this._myUnhoverCallbacks.push(this._setStepEditIntensity.bind(this, 0, 0));\r\n\r\n ui.myPositionStepIncreaseButtonCursorTargetComponent.onHover.add(this._genericHover.bind(this, ui.myPositionStepIncreaseButtonBackgroundComponent.material));\r\n ui.myPositionStepIncreaseButtonCursorTargetComponent.onUnhover.add(this._genericUnhover.bind(this, ui.myPositionStepIncreaseButtonBackgroundComponent.material));\r\n ui.myPositionStepDecreaseButtonCursorTargetComponent.onHover.add(this._genericHover.bind(this, ui.myPositionStepDecreaseButtonBackgroundComponent.material));\r\n ui.myPositionStepDecreaseButtonCursorTargetComponent.onUnhover.add(this._genericUnhover.bind(this, ui.myPositionStepDecreaseButtonBackgroundComponent.material));\r\n\r\n this._myUnhoverCallbacks.push(this._genericUnhover.bind(this, ui.myPositionStepIncreaseButtonBackgroundComponent.material));\r\n this._myUnhoverCallbacks.push(this._genericUnhover.bind(this, ui.myPositionStepDecreaseButtonBackgroundComponent.material));\r\n\r\n ui.myRotationStepCursorTargetComponent.onClick.add(this._resetStep.bind(this, 1));\r\n ui.myRotationStepCursorTargetComponent.onHover.add(this._setStepEditEnabled.bind(this, 1, ui.myRotationStepText, true));\r\n ui.myRotationStepCursorTargetComponent.onUnhover.add(this._setStepEditEnabled.bind(this, 1, ui.myRotationStepText, false));\r\n\r\n this._myUnhoverCallbacks.push(this._setStepEditEnabled.bind(this, 1, ui.myRotationStepText, false));\r\n\r\n ui.myRotationStepIncreaseButtonCursorTargetComponent.onDown.add(this._setStepEditIntensity.bind(this, 1, 1));\r\n ui.myRotationStepIncreaseButtonCursorTargetComponent.onDownOnHover.add(this._setStepEditIntensity.bind(this, 1, 1));\r\n ui.myRotationStepIncreaseButtonCursorTargetComponent.onUp.add(this._setStepEditIntensity.bind(this, 1, 0));\r\n ui.myRotationStepIncreaseButtonCursorTargetComponent.onUnhover.add(this._setStepEditIntensity.bind(this, 1, 0));\r\n ui.myRotationStepDecreaseButtonCursorTargetComponent.onDown.add(this._setStepEditIntensity.bind(this, 1, -1));\r\n ui.myRotationStepDecreaseButtonCursorTargetComponent.onDownOnHover.add(this._setStepEditIntensity.bind(this, 1, -1));\r\n ui.myRotationStepDecreaseButtonCursorTargetComponent.onUp.add(this._setStepEditIntensity.bind(this, 1, 0));\r\n ui.myRotationStepDecreaseButtonCursorTargetComponent.onUnhover.add(this._setStepEditIntensity.bind(this, 1, 0));\r\n\r\n this._myUnhoverCallbacks.push(this._setStepEditIntensity.bind(this, 1, 0));\r\n\r\n ui.myRotationStepIncreaseButtonCursorTargetComponent.onHover.add(this._genericHover.bind(this, ui.myRotationStepIncreaseButtonBackgroundComponent.material));\r\n ui.myRotationStepIncreaseButtonCursorTargetComponent.onUnhover.add(this._genericUnhover.bind(this, ui.myRotationStepIncreaseButtonBackgroundComponent.material));\r\n ui.myRotationStepDecreaseButtonCursorTargetComponent.onHover.add(this._genericHover.bind(this, ui.myRotationStepDecreaseButtonBackgroundComponent.material));\r\n ui.myRotationStepDecreaseButtonCursorTargetComponent.onUnhover.add(this._genericUnhover.bind(this, ui.myRotationStepDecreaseButtonBackgroundComponent.material));\r\n\r\n this._myUnhoverCallbacks.push(this._genericUnhover.bind(this, ui.myRotationStepIncreaseButtonBackgroundComponent.material));\r\n this._myUnhoverCallbacks.push(this._genericUnhover.bind(this, ui.myRotationStepDecreaseButtonBackgroundComponent.material));\r\n\r\n ui.myScaleStepCursorTargetComponent.onClick.add(this._resetStep.bind(this, 2));\r\n ui.myScaleStepCursorTargetComponent.onHover.add(this._setStepEditEnabled.bind(this, 2, ui.myScaleStepText, true));\r\n ui.myScaleStepCursorTargetComponent.onUnhover.add(this._setStepEditEnabled.bind(this, 2, ui.myScaleStepText, false));\r\n\r\n this._myUnhoverCallbacks.push(this._setStepEditEnabled.bind(this, 2, ui.myScaleStepText, false));\r\n\r\n ui.myScaleStepIncreaseButtonCursorTargetComponent.onDown.add(this._setStepEditIntensity.bind(this, 2, 1));\r\n ui.myScaleStepIncreaseButtonCursorTargetComponent.onDownOnHover.add(this._setStepEditIntensity.bind(this, 2, 1));\r\n ui.myScaleStepIncreaseButtonCursorTargetComponent.onUp.add(this._setStepEditIntensity.bind(this, 2, 0));\r\n ui.myScaleStepIncreaseButtonCursorTargetComponent.onUnhover.add(this._setStepEditIntensity.bind(this, 2, 0));\r\n ui.myScaleStepDecreaseButtonCursorTargetComponent.onDown.add(this._setStepEditIntensity.bind(this, 2, -1));\r\n ui.myScaleStepDecreaseButtonCursorTargetComponent.onDownOnHover.add(this._setStepEditIntensity.bind(this, 2, -1));\r\n ui.myScaleStepDecreaseButtonCursorTargetComponent.onUp.add(this._setStepEditIntensity.bind(this, 2, 0));\r\n ui.myScaleStepDecreaseButtonCursorTargetComponent.onUnhover.add(this._setStepEditIntensity.bind(this, 2, 0));\r\n\r\n this._myUnhoverCallbacks.push(this._setStepEditIntensity.bind(this, 2, 0));\r\n\r\n ui.myScaleStepIncreaseButtonCursorTargetComponent.onHover.add(this._genericHover.bind(this, ui.myScaleStepIncreaseButtonBackgroundComponent.material));\r\n ui.myScaleStepIncreaseButtonCursorTargetComponent.onUnhover.add(this._genericUnhover.bind(this, ui.myScaleStepIncreaseButtonBackgroundComponent.material));\r\n ui.myScaleStepDecreaseButtonCursorTargetComponent.onHover.add(this._genericHover.bind(this, ui.myScaleStepDecreaseButtonBackgroundComponent.material));\r\n ui.myScaleStepDecreaseButtonCursorTargetComponent.onUnhover.add(this._genericUnhover.bind(this, ui.myScaleStepDecreaseButtonBackgroundComponent.material));\r\n\r\n this._myUnhoverCallbacks.push(this._genericUnhover.bind(this, ui.myScaleStepIncreaseButtonBackgroundComponent.material));\r\n this._myUnhoverCallbacks.push(this._genericUnhover.bind(this, ui.myScaleStepDecreaseButtonBackgroundComponent.material));\r\n\r\n }\r\n\r\n _setValueEditIntensity(componentIndex, index, value) {\r\n if (this._isActive() || value == 0) {\r\n if (value != 0) {\r\n switch (componentIndex) {\r\n case 0:\r\n this._myValueRealValue = this._myVariable._myPosition[index];\r\n this._myComponentStepValue = this._myVariable._myPositionStepPerSecond;\r\n break;\r\n case 1:\r\n this._myValueRealValue = this._myVariable._myRotation[index];\r\n this._myComponentStepValue = this._myVariable._myRotationStepPerSecond;\r\n break;\r\n case 2:\r\n this._myValueRealValue = this._myVariable._myScale[index];\r\n this._myComponentStepValue = this._myVariable._myScaleStepPerSecond;\r\n break;\r\n }\r\n\r\n this._myValueButtonEditIntensityTimer = this._myConfig.myButtonEditDelay;\r\n this._myValueEditIndex = index;\r\n this._myComponentIndex = componentIndex;\r\n }\r\n\r\n this._myValueButtonEditIntensity = value;\r\n }\r\n }\r\n\r\n _setStepEditIntensity(index, value) {\r\n if (this._isActive() || value == 0) {\r\n if (value != 0) {\r\n this._myStepButtonEditIntensityTimer = this._myConfig.myButtonEditDelay;\r\n }\r\n\r\n this._myStepButtonEditIntensity = value;\r\n\r\n this._myStepIndex = index;\r\n }\r\n }\r\n\r\n _setValueEditEnabled(componentIndex, index, text, enabled) {\r\n if (this._isActive() || !enabled) {\r\n if (enabled) {\r\n switch (componentIndex) {\r\n case 0:\r\n this._myValueRealValue = this._myVariable._myPosition[index];\r\n this._myComponentStepValue = this._myVariable._myPositionStepPerSecond;\r\n break;\r\n case 1:\r\n this._myValueRealValue = this._myVariable._myRotation[index];\r\n this._myComponentStepValue = this._myVariable._myRotationStepPerSecond;\r\n break;\r\n case 2:\r\n this._myValueRealValue = this._myVariable._myScale[index];\r\n this._myComponentStepValue = this._myVariable._myScaleStepPerSecond;\r\n break;\r\n }\r\n\r\n this._myValueEditIndex = index;\r\n this._myComponentIndex = componentIndex;\r\n text.pp_scaleObject(this._myConfig.myTextHoverScaleMultiplier);\r\n } else {\r\n text.pp_setScaleLocal(this._myConfig.myValueTextScale);\r\n }\r\n\r\n this._myValueEditEnabled = enabled;\r\n }\r\n }\r\n\r\n _setStepEditEnabled(index, text, enabled) {\r\n if (this._isActive() || !enabled) {\r\n if (enabled) {\r\n text.pp_scaleObject(this._myConfig.myTextHoverScaleMultiplier);\r\n } else {\r\n text.pp_setScaleLocal(this._myConfig.myStepTextScale);\r\n }\r\n\r\n this._myStepEditEnabled = enabled;\r\n this._myStepIndex = index;\r\n }\r\n }\r\n\r\n _resetValue(componentIndex, index) {\r\n if (this._isActive()) {\r\n this._myTempPositionValue.pp_copy(this._myVariable._myPosition);\r\n this._myTempRotationValue.pp_copy(this._myVariable._myRotation);\r\n this._myTempScaleValue.pp_copy(this._myVariable._myScale);\r\n\r\n switch (componentIndex) {\r\n case 0:\r\n this._myTempPositionValue[index] = this._myVariable._myDefaultPosition[index];\r\n this._myUI.myPositionTextComponents[index].text = this._myTempPositionValue[index].toFixed(this._myVariable._myDecimalPlaces);\r\n break;\r\n case 1:\r\n this._myTempRotationValue[index] = this._myVariable._myDefaultRotation[index];\r\n this._myUI.myRotationTextComponents[index].text = this._myTempRotationValue[index].toFixed(this._myVariable._myDecimalPlaces);\r\n break;\r\n case 2:\r\n this._myTempScaleValue[index] = this._myVariable._myDefaultScale[index];\r\n this._myUI.myScaleTextComponents[index].text = this._myTempScaleValue[index].toFixed(this._myVariable._myDecimalPlaces);\r\n break;\r\n\r\n }\r\n\r\n this._myTempTransformValue.mat4_setPositionRotationDegreesScale(this._myTempPositionValue, this._myTempRotationValue, this._myTempScaleValue);\r\n this._myVariable.setValue(this._myTempTransformValue);\r\n }\r\n }\r\n\r\n _resetAllValues() {\r\n for (let i = 0; i < 3; i++) {\r\n this._resetComponentValues(i);\r\n }\r\n }\r\n\r\n _resetComponentValues(index) {\r\n for (let i = 0; i < 3; i++) {\r\n this._resetValue(index, i);\r\n }\r\n }\r\n\r\n _resetStep(index) {\r\n if (this._isActive()) {\r\n let defaultValue = 0;\r\n switch (index) {\r\n case 0:\r\n defaultValue = this._myVariable._myDefaultPositionStepPerSecond;\r\n break;\r\n case 1:\r\n defaultValue = this._myVariable._myDefaultRotationStepPerSecond;\r\n break;\r\n case 2:\r\n defaultValue = this._myVariable._myDefaultScaleStepPerSecond;\r\n break;\r\n default:\r\n defaultValue = 0;\r\n }\r\n\r\n this._changeStep(index, defaultValue);\r\n }\r\n }\r\n\r\n _changeStep(index, step) {\r\n step = Math.pp_roundDecimal(step, 10);\r\n\r\n switch (index) {\r\n case 0:\r\n this._myVariable._myPositionStepPerSecond = step;\r\n this._myUI.myPositionStepTextComponent.text = this._myConfig.myStepStartString.concat(this._myVariable._myPositionStepPerSecond);\r\n break;\r\n case 1:\r\n this._myVariable._myRotationStepPerSecond = step;\r\n this._myUI.myRotationStepTextComponent.text = this._myConfig.myStepStartString.concat(this._myVariable._myRotationStepPerSecond);\r\n break;\r\n case 2:\r\n this._myVariable._myScaleStepPerSecond = step;\r\n this._myUI.myScaleStepTextComponent.text = this._myConfig.myStepStartString.concat(this._myVariable._myScaleStepPerSecond);\r\n break;\r\n }\r\n }\r\n\r\n _genericTextHover(text) {\r\n text.pp_scaleObject(this._myConfig.myTextHoverScaleMultiplier);\r\n }\r\n\r\n _genericTextUnhover(text, originalScale) {\r\n text.pp_setScaleLocal(originalScale);\r\n }\r\n}", "import { GamepadAxesID, GamepadButtonID } from \"../../../input/gamepad/gamepad_buttons.js\";\r\nimport { Globals } from \"../../../pp/globals.js\";\r\nimport { ToolHandedness } from \"../../cauldron/tool_types.js\";\r\nimport { WidgetFrame, WidgetParams } from \"../../widget_frame/widget_frame.js\";\r\nimport { EasyTuneVariableType } from \"../easy_tune_variable_types.js\";\r\nimport { EasyTuneBaseWidgetParams } from \"./base/easy_tune_base_widget.js\";\r\nimport { EasyTuneBoolArrayWidgetSelector } from \"./bool/easy_tune_bool_array_widget_selector.js\";\r\nimport { EasyTuneWidgetConfig } from \"./easy_tune_widget_config.js\";\r\nimport { EasyTuneNoneWidget } from \"./none/easy_tune_none_widget.js\";\r\nimport { EasyTuneNumberArrayWidgetSelector } from \"./number/easy_tune_number_widget_selector.js\";\r\nimport { EasyTuneTransformWidget } from \"./transform/easy_tune_transform_widget.js\";\r\n\r\nexport class EasyTuneWidgetParams extends WidgetParams {\r\n\r\n constructor() {\r\n super();\r\n\r\n this.myShowOnStart = false;\r\n this.myShowVisibilityButton = false;\r\n this.myShowAdditionalButtons = false;\r\n this.myGamepadScrollVariableEnabled = false;\r\n\r\n this.myShowVariablesImportExportButtons = false;\r\n this.myVariablesImportCallback = null; // Signature: callback()\r\n this.myVariablesExportCallback = null; // Signature: callback()\r\n }\r\n}\r\n\r\nexport class EasyTuneWidget {\r\n\r\n constructor(engine = Globals.getMainEngine()) {\r\n this._myStarted = false;\r\n this._myStartVariable = null;\r\n\r\n this._myActive = true;\r\n this._myVisibleBackup = null;\r\n\r\n this._myWidgetFrame = new WidgetFrame(\"E\", 1, engine);\r\n this._myWidgetFrame.registerWidgetVisibleChangedEventListener(this, this._widgetVisibleChanged.bind(this));\r\n\r\n this._myConfig = new EasyTuneWidgetConfig();\r\n this._myParams = null;\r\n\r\n this._myWidgets = [];\r\n\r\n this._myEasyTuneVariables = null;\r\n this._myEasyTuneLastSize = 0;\r\n this._myVariableNames = null;\r\n\r\n this._myCurrentWidget = null;\r\n this._myCurrentVariable = null;\r\n\r\n this._myScrollVariableTimer = 0;\r\n\r\n this._myGamepad = null;\r\n\r\n this._myRefreshVariablesTimer = 0;\r\n\r\n this._myDirty = false;\r\n\r\n this._myEngine = engine;\r\n\r\n this._myDestroyed = false;\r\n }\r\n\r\n setCurrentVariable(variableName) {\r\n if (!this._myStarted) {\r\n this._myStartVariable = variableName;\r\n } else if (this._myEasyTuneVariables.has(variableName)) {\r\n this._myCurrentVariable = this._myEasyTuneVariables.getEasyTuneVariable(variableName);\r\n this._selectCurrentWidget();\r\n } else {\r\n console.warn(\"Can't change easy tune current variable to inexistent variable:\", variableName);\r\n }\r\n }\r\n\r\n refresh() {\r\n if (this._myWidgetFrame.isVisible()) {\r\n this._myDirty = true;\r\n }\r\n }\r\n\r\n setVisible(visible) {\r\n if (this._myActive) {\r\n this._myWidgetFrame.setVisible(visible);\r\n } else {\r\n this._myVisibleBackup = visible;\r\n }\r\n }\r\n\r\n isVisible() {\r\n return this._myWidgetFrame.isVisible();\r\n }\r\n\r\n start(parentObject, params, easyTuneVariables) {\r\n this._myRightGamepad = Globals.getRightGamepad(this._myEngine);\r\n this._myLeftGamepad = Globals.getLeftGamepad(this._myEngine);\r\n if (this._myConfig.myGamepadHandedness == ToolHandedness.RIGHT) {\r\n this._myGamepad = this._myRightGamepad;\r\n } else if (this._myConfig.myGamepadHandedness == ToolHandedness.LEFT) {\r\n this._myGamepad = this._myLeftGamepad;\r\n }\r\n\r\n this._myStarted = true;\r\n\r\n this._myParams = params;\r\n\r\n this._myWidgetFrame.start(parentObject, params);\r\n\r\n this._myEasyTuneVariables = easyTuneVariables;\r\n this._myEasyTuneLastSize = this.getValidEasyTuneVariablesLength();\r\n this._myVariableNames = this.getValidEasyTuneVariablesNames();\r\n\r\n if (this.getValidEasyTuneVariablesLength() > 0) {\r\n this._myCurrentVariable = this._myEasyTuneVariables.getEasyTuneVariable(this._myVariableNames[0]);\r\n }\r\n\r\n if (this._myStartVariable != null) {\r\n if (this._myEasyTuneVariables.has(this._myStartVariable)) {\r\n this._myCurrentVariable = this._myEasyTuneVariables.getEasyTuneVariable(this._myStartVariable);\r\n } else {\r\n console.warn(\"Can't change easy tune current variable to inexistent variable:\", this._myStartVariable);\r\n }\r\n }\r\n\r\n this._initializeWidgets();\r\n }\r\n\r\n update(dt) {\r\n if (!this._myActive) return;\r\n\r\n this._myWidgetFrame.update(dt);\r\n\r\n if (this.getValidEasyTuneVariablesLength() != this._myEasyTuneLastSize || this._myDirty) {\r\n this._refreshEasyTuneVariables();\r\n }\r\n\r\n if (this._myWidgetFrame.isVisible() && this.getValidEasyTuneVariablesLength() > 0) {\r\n if (this._myConfig.myRefreshVariablesDelay != null) {\r\n this._myRefreshVariablesTimer += dt;\r\n if (this._myRefreshVariablesTimer > this._myConfig.myRefreshVariablesDelay) {\r\n this._myRefreshVariablesTimer = 0;\r\n this._refreshEasyTuneVariables();\r\n }\r\n }\r\n\r\n if (this._myCurrentWidget) {\r\n this._myCurrentWidget.update(dt);\r\n }\r\n\r\n if (this._myParams.myGamepadScrollVariableEnabled) {\r\n this._updateGamepadScrollVariable(dt);\r\n }\r\n }\r\n\r\n this._updateGamepadWidgetVisibility();\r\n\r\n this._updateWidgetCurrentVariable();\r\n }\r\n\r\n isActive() {\r\n return this._myActive;\r\n }\r\n\r\n setActive(active) {\r\n if (!this._myStarted) return;\r\n\r\n for (let widget of this._myWidgets) {\r\n widget.setActive(active);\r\n }\r\n this._myWidgetFrame.setActive(active);\r\n\r\n if (this._myActive != active) {\r\n if (active) {\r\n this._myActive = active;\r\n if (this._myVisibleBackup != null) {\r\n this.setVisible(false);\r\n this.setVisible(this._myVisibleBackup);\r\n\r\n this._myVisibleBackup = null;\r\n }\r\n } else {\r\n if (this._myVisibleBackup == null) {\r\n this._myVisibleBackup = this.isVisible();\r\n }\r\n\r\n if (this.isVisible()) {\r\n this.setVisible(false);\r\n }\r\n this._myActive = active;\r\n }\r\n }\r\n }\r\n\r\n _initializeWidgets() {\r\n let widgetParams = new EasyTuneBaseWidgetParams();\r\n widgetParams.myVariablesImportCallback = this._importVariables.bind(this);\r\n widgetParams.myVariablesExportCallback = this._exportVariables.bind(this);\r\n\r\n this._myWidgets[EasyTuneVariableType.NONE] = new EasyTuneNoneWidget(widgetParams, this._myEngine);\r\n this._myWidgets[EasyTuneVariableType.NUMBER] = new EasyTuneNumberArrayWidgetSelector(widgetParams, this._myGamepad, this._myEngine);\r\n this._myWidgets[EasyTuneVariableType.BOOL] = new EasyTuneBoolArrayWidgetSelector(widgetParams, this._myGamepad, this._myEngine);\r\n this._myWidgets[EasyTuneVariableType.TRANSFORM] = new EasyTuneTransformWidget(widgetParams, this._myGamepad, this._myEngine);\r\n\r\n for (let widget of this._myWidgets) {\r\n widget.start(this._myWidgetFrame.getWidgetObject(), this._myParams);\r\n widget.setVisible(false);\r\n widget.registerScrollVariableRequestEventListener(this, this._scrollVariable.bind(this));\r\n }\r\n\r\n this._selectCurrentWidget();\r\n }\r\n\r\n _selectCurrentWidget() {\r\n if (this.getValidEasyTuneVariablesLength() <= 0) {\r\n return;\r\n } else if (this._myCurrentVariable == null) {\r\n this._myVariableNames = this.getValidEasyTuneVariablesNames();\r\n this._myCurrentVariable = this._myEasyTuneVariables.getEasyTuneVariable(this._myVariableNames[0]);\r\n }\r\n\r\n let prevWidget = null;\r\n if (this._myCurrentWidget != null) {\r\n prevWidget = this._myCurrentWidget.getWidget();\r\n }\r\n\r\n if (this._myCurrentVariable.getType() in this._myWidgets) {\r\n this._myCurrentWidget = this._myWidgets[this._myCurrentVariable.getType()];\r\n } else {\r\n this._myCurrentWidget = this._myWidgets[EasyTuneVariableType.NONE];\r\n }\r\n\r\n this._myCurrentWidget.setEasyTuneVariable(this._myCurrentVariable, this._createIndexString());\r\n this._myCurrentWidget.getWidget().syncWidget(prevWidget);\r\n\r\n if (prevWidget != null && this._myCurrentWidget.getWidget() != prevWidget) {\r\n prevWidget.setVisible(false);\r\n }\r\n\r\n this._myCurrentWidget.setVisible(this._myWidgetFrame.isVisible());\r\n }\r\n\r\n _refreshEasyTuneVariables() {\r\n this._myVariableNames = this.getValidEasyTuneVariablesNames();\r\n this._myEasyTuneLastSize = this.getValidEasyTuneVariablesLength();\r\n\r\n if (this.getValidEasyTuneVariablesLength() > 0) {\r\n if (this._myCurrentVariable && this._myVariableNames.pp_hasEqual(this._myCurrentVariable.getName())) {\r\n this._myCurrentVariable = this._myEasyTuneVariables.getEasyTuneVariable(this._myCurrentVariable.getName());\r\n } else {\r\n this._myCurrentVariable = this._myEasyTuneVariables.getEasyTuneVariable(this._myVariableNames[0]);\r\n }\r\n\r\n this._selectCurrentWidget();\r\n } else {\r\n this._myCurrentVariable = null;\r\n if (this._myCurrentWidget) {\r\n this._myCurrentWidget.setVisible(false);\r\n this._myCurrentWidget = null;\r\n }\r\n }\r\n\r\n this._myDirty = false;\r\n }\r\n\r\n _updateGamepadWidgetVisibility() {\r\n if (this._myGamepad) {\r\n if ((this._myGamepad.getButtonInfo(GamepadButtonID.BOTTOM_BUTTON).isPressStart() && this._myGamepad.getButtonInfo(GamepadButtonID.TOP_BUTTON).isPressed()) ||\r\n (this._myGamepad.getButtonInfo(GamepadButtonID.TOP_BUTTON).isPressStart() && this._myGamepad.getButtonInfo(GamepadButtonID.BOTTOM_BUTTON).isPressed())) {\r\n this._toggleVisibility();\r\n }\r\n }\r\n }\r\n\r\n _toggleVisibility() {\r\n this._myWidgetFrame.toggleVisibility();\r\n }\r\n\r\n _widgetVisibleChanged(visible) {\r\n for (let widget of this._myWidgets) {\r\n widget.setVisible(false);\r\n }\r\n\r\n if (this._myCurrentWidget) {\r\n if (this.getValidEasyTuneVariablesLength() > 0) {\r\n this._myCurrentWidget.setVisible(visible);\r\n } else {\r\n this._myCurrentWidget.setVisible(false);\r\n }\r\n }\r\n\r\n if (visible) {\r\n this._refreshEasyTuneVariables();\r\n }\r\n }\r\n\r\n _updateGamepadScrollVariable(dt) {\r\n if (this._myGamepad && (!this._myConfig.myScrollVariableButtonID || this._myGamepad.getButtonInfo(this._myConfig.myScrollVariableButtonID).isPressed())) {\r\n let x = this._myGamepad.getAxesInfo(GamepadAxesID.THUMBSTICK).myAxes[0];\r\n let y = this._myGamepad.getAxesInfo(GamepadAxesID.THUMBSTICK).myAxes[1];\r\n if (Math.abs(x) > this._myConfig.myScrollVariableMinXThreshold && Math.abs(y) < this._myConfig.myScrollVariableMaxYThreshold) {\r\n this._myScrollVariableTimer += dt;\r\n while (this._myScrollVariableTimer > this._myConfig.myScrollVariableDelay) {\r\n this._myScrollVariableTimer -= this._myConfig.myScrollVariableDelay;\r\n this._scrollVariable(Math.sign(x));\r\n }\r\n } else {\r\n this._myScrollVariableTimer = this._myConfig.myScrollVariableDelay;\r\n }\r\n } else {\r\n this._myScrollVariableTimer = this._myConfig.myScrollVariableDelay;\r\n }\r\n }\r\n\r\n _scrollVariable(amount) {\r\n if (this.getValidEasyTuneVariablesLength() <= 0) {\r\n return;\r\n }\r\n\r\n let variableIndex = this._getVariableIndex(this._myCurrentVariable);\r\n if (variableIndex >= 0) {\r\n // Manage negative numbers\r\n let newIndex = (((variableIndex + amount) % this._myVariableNames.length) + this._myVariableNames.length) % this._myVariableNames.length;\r\n if (this._myEasyTuneVariables.has(this._myVariableNames[newIndex])) {\r\n this._myCurrentVariable = this._myEasyTuneVariables.getEasyTuneVariable(this._myVariableNames[newIndex]);\r\n this._selectCurrentWidget();\r\n } else {\r\n this._refreshEasyTuneVariables();\r\n }\r\n } else {\r\n this._refreshEasyTuneVariables();\r\n }\r\n }\r\n\r\n _createIndexString() {\r\n let indexString = \" (\";\r\n let index = (this._getVariableIndex(this._myCurrentVariable) + 1).toString();\r\n let length = (this.getValidEasyTuneVariablesLength()).toString();\r\n while (index.length < length.length) {\r\n index = \"0\".concat(index);\r\n }\r\n\r\n indexString = indexString.concat(index).concat(\" - \").concat(length).concat(\")\");\r\n\r\n return indexString;\r\n }\r\n\r\n _getVariableIndex(variable) {\r\n let variableIndex = this._myVariableNames.indexOf(variable.getName());\r\n return variableIndex;\r\n }\r\n\r\n _updateWidgetCurrentVariable() {\r\n for (let variable of this._myEasyTuneVariables.getEasyTuneVariablesList()) {\r\n variable.setWidgetCurrentVariable(false);\r\n }\r\n\r\n if (this._myWidgetFrame.isVisible() && this._myCurrentVariable) {\r\n this._myCurrentVariable.setWidgetCurrentVariable(true);\r\n }\r\n }\r\n\r\n _importVariables() {\r\n this._myParams.myVariablesImportCallback(this._onImportSuccess.bind(this), this._onImportFailure.bind(this));\r\n }\r\n\r\n _exportVariables() {\r\n this._myParams.myVariablesExportCallback(this._onExportSuccess.bind(this), this._onExportFailure.bind(this));\r\n }\r\n\r\n _onImportSuccess() {\r\n if (this._myCurrentWidget) {\r\n this._myCurrentWidget.onImportSuccess();\r\n }\r\n }\r\n\r\n _onImportFailure() {\r\n if (this._myCurrentWidget) {\r\n this._myCurrentWidget.onImportFailure();\r\n }\r\n }\r\n\r\n _onExportSuccess() {\r\n if (this._myCurrentWidget) {\r\n this._myCurrentWidget.onExportSuccess();\r\n }\r\n }\r\n\r\n _onExportFailure() {\r\n if (this._myCurrentWidget) {\r\n this._myCurrentWidget.onExportFailure();\r\n }\r\n }\r\n\r\n destroy() {\r\n this._myDestroyed = true;\r\n\r\n this.setActive(false);\r\n\r\n for (let widget of this._myWidgets) {\r\n widget.destroy();\r\n }\r\n\r\n this._myWidgetFrame.destroy();\r\n }\r\n\r\n isDestroyed() {\r\n return this._myDestroyed;\r\n }\r\n\r\n\r\n getValidEasyTuneVariablesLength() {\r\n return this.getValidEasyTuneVariablesNames().length;\r\n }\r\n\r\n getValidEasyTuneVariablesNames() {\r\n let names = this._myEasyTuneVariables.getEasyTuneVariablesNames();\r\n\r\n let validNames = [];\r\n for (let name of names) {\r\n let variable = this._myEasyTuneVariables.getEasyTuneVariable(name);\r\n if (variable.isShownOnWidget()) {\r\n validNames.push(name);\r\n }\r\n }\r\n\r\n return validNames;\r\n }\r\n}", "import { Component, Property } from \"@wonderlandengine/api\";\r\nimport { EasyTuneUtils } from \"../easy_tune_utils.js\";\r\n\r\nexport class EasyTuneImportVariablesComponent extends Component {\r\n static TypeName = \"pp-easy-tune-import-variables\";\r\n static Properties = {\r\n _myVariablesImportURL: Property.string(\"\"),\r\n _myResetVariablesDefaultValueOnImport: Property.bool(true)\r\n };\r\n\r\n start() {\r\n this._myFirstUpdate = true;\r\n }\r\n\r\n update(dt) {\r\n if (this._myFirstUpdate) {\r\n this._myFirstUpdate = false;\r\n EasyTuneUtils.importVariables(this._myVariablesImportURL, this._myResetVariablesDefaultValueOnImport, false, false, undefined, undefined, this.engine);\r\n }\r\n }\r\n}", "import { LightComponent, Object3D, WonderlandEngine } from \"@wonderlandengine/api\";\r\nimport { EasyTuneNumber } from \"../easy_tune_variable_types.js\";\r\nimport { EasyObjectTuner } from \"./easy_object_tuner.js\";\r\n\r\nexport class EasyLightAttenuation extends EasyObjectTuner {\r\n\r\n constructor(object: Object3D, variableName: string, setAsWidgetCurrentVariable: boolean, useTuneTarget: boolean, engine?: Readonly) {\r\n super(object, variableName, setAsWidgetCurrentVariable, useTuneTarget, engine);\r\n }\r\n\r\n protected override _getVariableNamePrefix(): string {\r\n return \"Light Attenuation \";\r\n }\r\n\r\n protected override _createEasyTuneVariable(variableName: string): EasyTuneNumber {\r\n return new EasyTuneNumber(variableName, this._getDefaultValue(), null, true, 3, 0.01, 0, 1, undefined, this._myEngine);\r\n }\r\n\r\n protected override _getObjectValue(object: Readonly): Readonly {\r\n let attenuation = this._getDefaultValue();\r\n\r\n const light = object.pp_getComponent(LightComponent);\r\n if (light != null) {\r\n attenuation = light.color[3];\r\n }\r\n\r\n return attenuation;\r\n }\r\n\r\n protected override _getDefaultValue(): Readonly {\r\n return 0;\r\n }\r\n\r\n protected override _areValueEqual(first: Readonly, second: Readonly): boolean {\r\n return first == second;\r\n }\r\n\r\n protected override _updateObjectValue(object: Object3D, value: Readonly): void {\r\n const attenuation = value;\r\n\r\n const light = object.pp_getComponent(LightComponent);\r\n if (light) {\r\n light.color[3] = attenuation;\r\n }\r\n }\r\n}", "import { LightComponent, Object3D, WonderlandEngine } from \"@wonderlandengine/api\";\r\nimport { Vector3 } from \"../../../cauldron/type_definitions/array_type_definitions.js\";\r\nimport { ColorModel, ColorUtils } from \"../../../cauldron/utils/color_utils.js\";\r\nimport { GamepadButtonID } from \"../../../input/gamepad/gamepad_buttons.js\";\r\nimport { vec3_create } from \"../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Globals } from \"../../../pp/globals.js\";\r\nimport { EasyTuneIntArray } from \"../easy_tune_variable_types.js\";\r\nimport { EasyObjectTuner } from \"./easy_object_tuner.js\";\r\n\r\nexport class EasyLightColor extends EasyObjectTuner {\r\n\r\n private _myColorModel: ColorModel;\r\n\r\n constructor(colorModel: ColorModel, object: Object3D, variableName: string, setAsWidgetCurrentVariable: boolean, useTuneTarget: boolean, engine?: Readonly) {\r\n super(object, variableName, setAsWidgetCurrentVariable, useTuneTarget, engine);\r\n\r\n this._myColorModel = colorModel;\r\n }\r\n\r\n protected override _getVariableNamePrefix(): string {\r\n let nameFirstPart = null;\r\n\r\n if (this._myColorModel == ColorModel.RGB) {\r\n nameFirstPart = \"Light RGB \";\r\n } else {\r\n nameFirstPart = \"Light HSV \";\r\n }\r\n\r\n return nameFirstPart;\r\n }\r\n\r\n protected override _createEasyTuneVariable(variableName: string): EasyTuneIntArray {\r\n return new EasyTuneIntArray(variableName, this._getDefaultValue(), null, true, 100, 0, 255, false, undefined, this._myEngine);\r\n }\r\n\r\n protected override _getObjectValue(object: Readonly): Readonly {\r\n let color = null;\r\n\r\n const lightColor = this._getLightColor(object);\r\n if (lightColor) {\r\n if (this._myColorModel == ColorModel.RGB) {\r\n color = ColorUtils.colorNormalizedToInt(lightColor);\r\n } else {\r\n color = ColorUtils.colorNormalizedToInt(ColorUtils.rgbToHSV(lightColor));\r\n }\r\n } else {\r\n color = this._getDefaultValue();\r\n }\r\n\r\n return color;\r\n }\r\n\r\n protected override _getDefaultValue(): Readonly {\r\n return vec3_create();\r\n }\r\n\r\n protected override _areValueEqual(first: Readonly, second: Readonly): boolean {\r\n return first.vec_equals(second);\r\n }\r\n\r\n protected override _updateObjectValue(object: Object3D, value: Readonly): void {\r\n let color = value;\r\n\r\n if (this._myColorModel == 0) {\r\n color = ColorUtils.colorIntToNormalized(color);\r\n } else {\r\n color = ColorUtils.hsvToRGB(ColorUtils.colorIntToNormalized(color));\r\n }\r\n\r\n const light = object.pp_getComponent(LightComponent);\r\n if (light != null) {\r\n light.color[0] = color[0];\r\n light.color[1] = color[1];\r\n light.color[2] = color[2];\r\n }\r\n\r\n if ((Globals.getRightGamepad(this._myEngine)!.getButtonInfo(GamepadButtonID.TOP_BUTTON).isPressStart() && Globals.getLeftGamepad(this._myEngine)!.getButtonInfo(GamepadButtonID.TOP_BUTTON).isPressed()) ||\r\n (Globals.getLeftGamepad(this._myEngine)!.getButtonInfo(GamepadButtonID.TOP_BUTTON).isPressStart() && Globals.getRightGamepad(this._myEngine)!.getButtonInfo(GamepadButtonID.TOP_BUTTON).isPressed())) {\r\n\r\n const hsvColor = ColorUtils.colorNormalizedToInt(ColorUtils.rgbToHSV(color));\r\n const rgbColor = ColorUtils.colorNormalizedToInt(color);\r\n\r\n console.log(\"RGB:\", rgbColor.vec_toString(0), \"- HSV:\", hsvColor.vec_toString(0));\r\n }\r\n }\r\n\r\n private _getLightColor(object: Readonly): Readonly | null {\r\n let color = null;\r\n\r\n const light = object.pp_getComponent(LightComponent);\r\n if (light != null) {\r\n color = light.color.slice();\r\n }\r\n\r\n return color;\r\n }\r\n}", "import { Material, MeshComponent, Object3D, WonderlandEngine } from \"@wonderlandengine/api\";\r\nimport { Vector4 } from \"../../../cauldron/type_definitions/array_type_definitions.js\";\r\nimport { ColorModel, ColorUtils } from \"../../../cauldron/utils/color_utils.js\";\r\nimport { GamepadButtonID } from \"../../../input/gamepad/gamepad_buttons.js\";\r\nimport { vec4_create } from \"../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Globals } from \"../../../pp/globals.js\";\r\nimport { EasyTuneIntArray } from \"../easy_tune_variable_types.js\";\r\nimport { EasyObjectTuner } from \"./easy_object_tuner.js\";\r\n\r\nexport enum EasyMeshColorColorType {\r\n COLOR,\r\n DIFFUSE_COLOR,\r\n AMBIENT_COLOR,\r\n SPECULAR_COLOR,\r\n EMISSIVE_COLOR,\r\n FOG_COLOR\r\n}\r\n\r\nexport class EasyMeshColor extends EasyObjectTuner {\r\n\r\n private _myColorModel: ColorModel;\r\n private _myColorType: EasyMeshColorColorType;\r\n\r\n private static readonly _myColorVariableNames: Record = {\r\n [EasyMeshColorColorType.COLOR]: \"color\",\r\n [EasyMeshColorColorType.DIFFUSE_COLOR]: \"diffuseColor\",\r\n [EasyMeshColorColorType.AMBIENT_COLOR]: \"ambientColor\",\r\n [EasyMeshColorColorType.SPECULAR_COLOR]: \"specularColor\",\r\n [EasyMeshColorColorType.EMISSIVE_COLOR]: \"emissiveColor\",\r\n [EasyMeshColorColorType.FOG_COLOR]: \"fogColor\"\r\n };\r\n\r\n constructor(colorModel: ColorModel, colorType: EasyMeshColorColorType, object: Object3D, variableName: string, setAsWidgetCurrentVariable: boolean, useTuneTarget: boolean, engine?: Readonly) {\r\n super(object, variableName, setAsWidgetCurrentVariable, useTuneTarget, engine);\r\n\r\n this._myColorModel = colorModel;\r\n this._myColorType = colorType;\r\n }\r\n\r\n protected override _getVariableNamePrefix(): string {\r\n let nameFirstPart = null;\r\n\r\n if (this._myColorModel == ColorModel.RGB) {\r\n nameFirstPart = \"Mesh RGB \";\r\n } else {\r\n nameFirstPart = \"Mesh HSV \";\r\n }\r\n\r\n return nameFirstPart;\r\n }\r\n\r\n protected override _createEasyTuneVariable(variableName: string): EasyTuneIntArray {\r\n return new EasyTuneIntArray(variableName, this._getDefaultValue(), null, true, 100, 0, 255, false, undefined, this._myEngine);\r\n }\r\n\r\n protected override _getObjectValue(object: Readonly): Readonly {\r\n let color = null;\r\n\r\n const meshMaterial: Record = this._getMeshMaterial(object) as unknown as Record;\r\n if (meshMaterial != null) {\r\n color = meshMaterial[EasyMeshColor._myColorVariableNames[this._myColorType]].pp_clone();\r\n\r\n if (this._myColorModel == ColorModel.RGB) {\r\n color = ColorUtils.colorNormalizedToInt(color);\r\n } else {\r\n color = ColorUtils.colorNormalizedToInt(ColorUtils.rgbToHSV(color));\r\n }\r\n } else {\r\n color = this._getDefaultValue();\r\n }\r\n\r\n return color;\r\n }\r\n\r\n protected override _getDefaultValue(): Readonly {\r\n return vec4_create();\r\n }\r\n\r\n protected override _areValueEqual(first: Readonly, second: Readonly): boolean {\r\n return first.vec_equals(second);\r\n }\r\n\r\n protected override _updateObjectValue(object: Object3D, value: Readonly): void {\r\n let color = value;\r\n\r\n if (this._myColorModel == 0) {\r\n color = ColorUtils.colorIntToNormalized(color);\r\n } else {\r\n color = ColorUtils.hsvToRGB(ColorUtils.colorIntToNormalized(color));\r\n }\r\n\r\n const meshMaterial: Record = this._getMeshMaterial(object) as unknown as Record;\r\n if (meshMaterial) {\r\n meshMaterial[EasyMeshColor._myColorVariableNames[this._myColorType]] = color;\r\n }\r\n\r\n if ((Globals.getRightGamepad(this._myEngine)!.getButtonInfo(GamepadButtonID.TOP_BUTTON).isPressStart() && Globals.getLeftGamepad(this._myEngine)!.getButtonInfo(GamepadButtonID.TOP_BUTTON).isPressed()) ||\r\n (Globals.getLeftGamepad(this._myEngine)!.getButtonInfo(GamepadButtonID.TOP_BUTTON).isPressStart() && Globals.getRightGamepad(this._myEngine)!.getButtonInfo(GamepadButtonID.TOP_BUTTON).isPressed())) {\r\n\r\n const hsvColor = ColorUtils.colorNormalizedToInt(ColorUtils.rgbToHSV(color));\r\n const rgbColor = ColorUtils.colorNormalizedToInt(color);\r\n\r\n console.log(\"RGB:\", rgbColor.vec_toString(0), \"- HSV:\", hsvColor.vec_toString(0));\r\n }\r\n }\r\n\r\n private _getMeshMaterial(object: Readonly): Material | null {\r\n let material = null;\r\n const mesh = object.pp_getComponent(MeshComponent);\r\n if (mesh != null) {\r\n material = mesh.material;\r\n }\r\n\r\n return material;\r\n }\r\n}", "import { Object3D, WonderlandEngine } from \"@wonderlandengine/api\";\r\nimport { Vector3 } from \"../../../cauldron/type_definitions/array_type_definitions.js\";\r\nimport { vec3_create } from \"../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { EasyTuneNumberArray } from \"../easy_tune_variable_types.js\";\r\nimport { EasyObjectTuner } from \"./easy_object_tuner.js\";\r\n\r\nexport class EasyScale extends EasyObjectTuner {\r\n\r\n private _myLocal: boolean;\r\n private _myScaleAsOne: boolean;\r\n private _myStepPerSecond: number;\r\n\r\n constructor(local: boolean, scaleAsOne: boolean, stepPerSecond: number, object: Object3D, variableName: string, setAsWidgetCurrentVariable: boolean, useTuneTarget: boolean, engine?: Readonly) {\r\n super(object, variableName, setAsWidgetCurrentVariable, useTuneTarget, engine);\r\n\r\n this._myLocal = local;\r\n this._myScaleAsOne = scaleAsOne;\r\n this._myStepPerSecond = stepPerSecond;\r\n }\r\n\r\n protected override _getVariableNamePrefix(): string {\r\n return \"Scale \";\r\n }\r\n\r\n protected override _createEasyTuneVariable(variableName: string): EasyTuneNumberArray {\r\n return new EasyTuneNumberArray(variableName, this._getDefaultValue(), null, true, 3, this._myStepPerSecond, 0.001, undefined, this._myScaleAsOne, undefined, this._myEngine);\r\n }\r\n\r\n protected override _getObjectValue(object: Readonly): Readonly {\r\n return this._myLocal ? object.pp_getScaleLocal() : object.pp_getScale();\r\n }\r\n\r\n protected override _getDefaultValue(): Readonly {\r\n return vec3_create(1, 1, 1);\r\n }\r\n\r\n protected override _areValueEqual(first: Readonly, second: Readonly): boolean {\r\n return first.vec_equals(second);\r\n }\r\n\r\n protected override _updateObjectValue(object: Object3D, value: Readonly): void {\r\n if (this._myLocal) {\r\n object.pp_setScaleLocal(value);\r\n } else {\r\n object.pp_setScale(value);\r\n }\r\n }\r\n}", "import { Object3D, WonderlandEngine } from \"@wonderlandengine/api\";\r\nimport { Matrix4 } from \"../../../cauldron/type_definitions/array_type_definitions.js\";\r\nimport { mat4_create } from \"../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { EasyTuneTransform } from \"../easy_tune_variable_types.js\";\r\nimport { EasyObjectTuner } from \"./easy_object_tuner.js\";\r\n\r\nexport class EasyTransform extends EasyObjectTuner {\r\n\r\n private _myLocal: boolean;\r\n private _myScaleAsOne: boolean;\r\n private _myPositionStepPerSecond: number;\r\n private _myRotationStepPerSecond: number;\r\n private _myScaleStepPerSecond: number;\r\n\r\n constructor(local: boolean, scaleAsOne: boolean, positionStepPerSecond: number, rotationStepPerSecond: number, scaleStepPerSecond: number, object: Object3D, variableName: string, setAsWidgetCurrentVariable: boolean, useTuneTarget: boolean, engine?: Readonly) {\r\n super(object, variableName, setAsWidgetCurrentVariable, useTuneTarget, engine);\r\n\r\n this._myLocal = local;\r\n this._myScaleAsOne = scaleAsOne;\r\n this._myPositionStepPerSecond = positionStepPerSecond;\r\n this._myRotationStepPerSecond = rotationStepPerSecond;\r\n this._myScaleStepPerSecond = scaleStepPerSecond;\r\n }\r\n\r\n protected override _getVariableNamePrefix(): string {\r\n return \"Transform \";\r\n }\r\n\r\n protected override _createEasyTuneVariable(variableName: string): EasyTuneTransform {\r\n return new EasyTuneTransform(variableName, this._getDefaultValue(), null, true, this._myScaleAsOne, 3, this._myPositionStepPerSecond, this._myRotationStepPerSecond, this._myScaleStepPerSecond, undefined, this._myEngine);\r\n }\r\n\r\n protected override _getObjectValue(object: Readonly): Readonly {\r\n return this._myLocal ? object.pp_getTransformLocal() : object.pp_getTransform();\r\n }\r\n\r\n protected override _getDefaultValue(): Readonly {\r\n return mat4_create();\r\n }\r\n\r\n protected override _areValueEqual(first: Readonly, second: Readonly): boolean {\r\n return first.vec_equals(second);\r\n }\r\n\r\n protected override _updateObjectValue(object: Object3D, value: Readonly): void {\r\n if (this._myLocal) {\r\n object.pp_setTransformLocal(value);\r\n } else {\r\n object.pp_setTransform(value);\r\n }\r\n }\r\n}", "import { Material, Object3D, TextComponent, WonderlandEngine } from \"@wonderlandengine/api\";\r\nimport { Vector4 } from \"../../../cauldron/type_definitions/array_type_definitions.js\";\r\nimport { ColorModel, ColorUtils } from \"../../../cauldron/utils/color_utils.js\";\r\nimport { GamepadButtonID } from \"../../../input/gamepad/gamepad_buttons.js\";\r\nimport { vec4_create } from \"../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Globals } from \"../../../pp/globals.js\";\r\nimport { EasyTuneIntArray } from \"../easy_tune_variable_types.js\";\r\nimport { EasyObjectTuner } from \"./easy_object_tuner.js\";\r\n\r\nexport enum EasyTextColorColorType {\r\n COLOR,\r\n EFFECT_COLOR\r\n}\r\n\r\nexport class EasyTextColor extends EasyObjectTuner {\r\n\r\n private _myColorModel: ColorModel;\r\n private _myColorType: EasyTextColorColorType;\r\n\r\n private static readonly _myColorVariableNames: Record = {\r\n [EasyTextColorColorType.COLOR]: \"color\",\r\n [EasyTextColorColorType.EFFECT_COLOR]: \"effectColor\"\r\n };\r\n\r\n constructor(colorModel: ColorModel, colorType: EasyTextColorColorType, object: Object3D, variableName: string, setAsWidgetCurrentVariable: boolean, useTuneTarget: boolean, engine?: Readonly) {\r\n super(object, variableName, setAsWidgetCurrentVariable, useTuneTarget, engine);\r\n\r\n this._myColorModel = colorModel;\r\n this._myColorType = colorType;\r\n }\r\n\r\n protected override _getVariableNamePrefix(): string {\r\n let nameFirstPart = null;\r\n\r\n if (this._myColorModel == ColorModel.RGB) {\r\n nameFirstPart = \"Text RGB \";\r\n } else {\r\n nameFirstPart = \"Text HSV \";\r\n }\r\n\r\n return nameFirstPart;\r\n }\r\n\r\n protected override _createEasyTuneVariable(variableName: string): EasyTuneIntArray {\r\n return new EasyTuneIntArray(variableName, this._getDefaultValue(), null, true, 100, 0, 255, false, undefined, this._myEngine);\r\n }\r\n\r\n protected override _getObjectValue(object: Readonly): Readonly {\r\n let color = null;\r\n\r\n const textMaterial: Record = this._getMeshMaterial(object) as unknown as Record;\r\n if (textMaterial != null) {\r\n color = textMaterial[EasyTextColor._myColorVariableNames[this._myColorType]].pp_clone();\r\n\r\n if (this._myColorModel == 0) {\r\n color = ColorUtils.colorNormalizedToInt(color);\r\n } else {\r\n color = ColorUtils.colorNormalizedToInt(ColorUtils.rgbToHSV(color));\r\n }\r\n } else {\r\n color = this._getDefaultValue();\r\n }\r\n\r\n return color;\r\n }\r\n\r\n protected override _getDefaultValue(): Readonly {\r\n return vec4_create();\r\n }\r\n\r\n protected override _areValueEqual(first: Readonly, second: Readonly): boolean {\r\n return first.vec_equals(second);\r\n }\r\n\r\n protected override _updateObjectValue(object: Object3D, value: Readonly): void {\r\n let color = value;\r\n\r\n if (this._myColorModel == 0) {\r\n color = ColorUtils.colorIntToNormalized(color);\r\n } else {\r\n color = ColorUtils.hsvToRGB(ColorUtils.colorIntToNormalized(color));\r\n }\r\n\r\n const textMaterial: Record = this._getMeshMaterial(object) as unknown as Record;\r\n if (textMaterial != null) {\r\n textMaterial[EasyTextColor._myColorVariableNames[this._myColorType]] = color;\r\n }\r\n\r\n if ((Globals.getRightGamepad(this._myEngine)!.getButtonInfo(GamepadButtonID.TOP_BUTTON).isPressStart() && Globals.getLeftGamepad(this._myEngine)!.getButtonInfo(GamepadButtonID.TOP_BUTTON).isPressed()) ||\r\n (Globals.getLeftGamepad(this._myEngine)!.getButtonInfo(GamepadButtonID.TOP_BUTTON).isPressStart() && Globals.getRightGamepad(this._myEngine)!.getButtonInfo(GamepadButtonID.TOP_BUTTON).isPressed())) {\r\n\r\n const hsvColor = ColorUtils.colorNormalizedToInt(ColorUtils.rgbToHSV(color));\r\n const rgbColor = ColorUtils.colorNormalizedToInt(color);\r\n\r\n console.log(\"RGB:\", rgbColor.vec_toString(0), \"- HSV:\", hsvColor.vec_toString(0));\r\n }\r\n }\r\n\r\n private _getMeshMaterial(object: Readonly): Material | null {\r\n let material = null;\r\n const text = object.pp_getComponent(TextComponent);\r\n if (text != null) {\r\n material = text.material;\r\n }\r\n\r\n return material;\r\n }\r\n}", "import { Component, Object3D, property } from \"@wonderlandengine/api\";\r\nimport { ComponentUtils } from \"../../../../cauldron/wl/utils/component_utils.js\";\r\nimport { Globals } from \"../../../../pp/globals.js\";\r\nimport { EasyLightAttenuation } from \"../easy_light_attenuation.js\";\r\n\r\nexport class EasyLightAttenuationComponent extends Component {\r\n public static override TypeName = \"pp-easy-light-attenuation\";\r\n\r\n @property.string(\"\")\r\n private readonly _myVariableName!: string;\r\n\r\n @property.bool(false)\r\n private readonly _mySetAsWidgetCurrentVariable!: boolean;\r\n\r\n @property.bool(false)\r\n private readonly _myUseTuneTarget!: boolean;\r\n\r\n\r\n\r\n private _myEasyObjectTuner: EasyLightAttenuation | null = null;\r\n\r\n public override update(dt: number): void {\r\n if (Globals.isToolEnabled(this.engine)) {\r\n if (this._myEasyObjectTuner != null) {\r\n this._myEasyObjectTuner.update(dt);\r\n } else {\r\n this._myEasyObjectTuner = new EasyLightAttenuation(this.object, this._myVariableName, this._mySetAsWidgetCurrentVariable, this._myUseTuneTarget);\r\n this._myEasyObjectTuner.start();\r\n }\r\n }\r\n }\r\n\r\n public override onActivate(): void {\r\n if (this._myEasyObjectTuner != null) {\r\n this._myEasyObjectTuner.setActive(true);\r\n }\r\n }\r\n\r\n public override onDeactivate(): void {\r\n if (this._myEasyObjectTuner != null) {\r\n this._myEasyObjectTuner.setActive(false);\r\n }\r\n }\r\n\r\n public getEasyObjectTuner(): EasyLightAttenuation | null {\r\n return this._myEasyObjectTuner;\r\n }\r\n\r\n public pp_clone(targetObject: Object3D): EasyLightAttenuationComponent | null {\r\n const clonedComponent = ComponentUtils.cloneDefault(this, targetObject);\r\n return clonedComponent as any;\r\n }\r\n}", "import { Component, Object3D, property } from \"@wonderlandengine/api\";\r\nimport { ColorModel } from \"../../../../cauldron/utils/color_utils.js\";\r\nimport { ComponentUtils } from \"../../../../cauldron/wl/utils/component_utils.js\";\r\nimport { Globals } from \"../../../../pp/globals.js\";\r\nimport { EasyLightColor } from \"../easy_light_color.js\";\r\n\r\nexport class EasyLightColorComponent extends Component {\r\n public static override TypeName = \"pp-easy-light-color\";\r\n\r\n @property.string(\"\")\r\n private readonly _myVariableName!: string;\r\n\r\n @property.bool(false)\r\n private readonly _mySetAsWidgetCurrentVariable!: boolean;\r\n\r\n @property.bool(false)\r\n private readonly _myUseTuneTarget!: boolean;\r\n\r\n\r\n\r\n @property.enum([ColorModel[ColorModel.RGB], ColorModel[ColorModel.HSV]], ColorModel[ColorModel.HSV])\r\n private readonly _myColorModel!: number;\r\n\r\n\r\n\r\n private _myEasyObjectTuner: EasyLightColor | null = null;\r\n\r\n public override update(dt: number): void {\r\n if (Globals.isToolEnabled(this.engine)) {\r\n if (this._myEasyObjectTuner != null) {\r\n this._myEasyObjectTuner.update(dt);\r\n } else {\r\n this._myEasyObjectTuner = new EasyLightColor(this._myColorModel, this.object, this._myVariableName, this._mySetAsWidgetCurrentVariable, this._myUseTuneTarget, this.engine);\r\n this._myEasyObjectTuner.start();\r\n }\r\n }\r\n }\r\n\r\n public override onActivate(): void {\r\n if (this._myEasyObjectTuner != null) {\r\n this._myEasyObjectTuner.setActive(true);\r\n }\r\n }\r\n\r\n public override onDeactivate(): void {\r\n if (this._myEasyObjectTuner != null) {\r\n this._myEasyObjectTuner.setActive(false);\r\n }\r\n }\r\n\r\n public getEasyObjectTuner(): EasyLightColor | null {\r\n return this._myEasyObjectTuner;\r\n }\r\n\r\n public pp_clone(targetObject: Object3D): EasyLightColorComponent | null {\r\n const clonedComponent = ComponentUtils.cloneDefault(this, targetObject);\r\n return clonedComponent as any;\r\n }\r\n}", "import { Component, Object3D, property } from \"@wonderlandengine/api\";\r\nimport { ColorModel } from \"../../../../cauldron/utils/color_utils.js\";\r\nimport { ComponentUtils } from \"../../../../cauldron/wl/utils/component_utils.js\";\r\nimport { Globals } from \"../../../../pp/globals.js\";\r\nimport { EasyMeshColor } from \"../easy_mesh_color.js\";\r\n\r\nexport class EasyMeshColorComponent extends Component {\r\n public static override TypeName = \"pp-easy-mesh-color\";\r\n\r\n @property.string(\"\")\r\n private readonly _myVariableName!: string;\r\n\r\n @property.bool(false)\r\n private readonly _mySetAsWidgetCurrentVariable!: boolean;\r\n\r\n @property.bool(false)\r\n private readonly _myUseTuneTarget!: boolean;\r\n\r\n\r\n\r\n @property.enum([ColorModel[ColorModel.RGB], ColorModel[ColorModel.HSV]], ColorModel[ColorModel.HSV])\r\n private readonly _myColorModel!: number;\r\n\r\n @property.enum([\"Color\", \"Diffuse Color\", \"Ambient Color\", \"Specular Color\", \"Emissive Color\", \"Fog Color\"], \"Color\")\r\n private readonly _myColorType!: number;\r\n\r\n\r\n\r\n private _myEasyObjectTuner: EasyMeshColor | null = null;\r\n\r\n public override update(dt: number): void {\r\n if (Globals.isToolEnabled(this.engine)) {\r\n if (this._myEasyObjectTuner != null) {\r\n this._myEasyObjectTuner.update(dt);\r\n } else {\r\n this._myEasyObjectTuner = new EasyMeshColor(this._myColorModel, this._myColorType, this.object, this._myVariableName, this._mySetAsWidgetCurrentVariable, this._myUseTuneTarget, this.engine);\r\n this._myEasyObjectTuner.start();\r\n }\r\n }\r\n }\r\n\r\n public override onActivate(): void {\r\n if (this._myEasyObjectTuner != null) {\r\n this._myEasyObjectTuner.setActive(true);\r\n }\r\n }\r\n\r\n public override onDeactivate(): void {\r\n if (this._myEasyObjectTuner != null) {\r\n this._myEasyObjectTuner.setActive(false);\r\n }\r\n }\r\n\r\n public getEasyObjectTuner(): EasyMeshColor | null {\r\n return this._myEasyObjectTuner;\r\n }\r\n\r\n public pp_clone(targetObject: Object3D): EasyMeshColorComponent | null {\r\n const clonedComponent = ComponentUtils.cloneDefault(this, targetObject);\r\n return clonedComponent as any;\r\n }\r\n}", "import { Component, Object3D, property } from \"@wonderlandengine/api\";\r\nimport { ComponentUtils } from \"../../../../cauldron/wl/utils/component_utils.js\";\r\nimport { Globals } from \"../../../../pp/globals.js\";\r\nimport { EasyScale } from \"../easy_scale.js\";\r\n\r\nexport class EasyScaleComponent extends Component {\r\n public static override TypeName = \"pp-easy-scale\";\r\n\r\n @property.string(\"\")\r\n private readonly _myVariableName!: string;\r\n\r\n @property.bool(false)\r\n private readonly _mySetAsWidgetCurrentVariable!: boolean;\r\n\r\n @property.bool(false)\r\n private readonly _myUseTuneTarget!: boolean;\r\n\r\n\r\n\r\n @property.bool(true)\r\n private readonly _myLocal!: boolean;\r\n\r\n /** Edit all scale values together */\r\n @property.bool(true)\r\n private readonly _myScaleAsOne!: boolean;\r\n\r\n @property.float(1)\r\n private readonly _myStepPerSecond!: number;\r\n\r\n\r\n\r\n private _myEasyObjectTuner: EasyScale | null = null;\r\n\r\n public override update(dt: number): void {\r\n if (Globals.isToolEnabled(this.engine)) {\r\n if (this._myEasyObjectTuner != null) {\r\n this._myEasyObjectTuner.update(dt);\r\n } else {\r\n this._myEasyObjectTuner = new EasyScale(this._myLocal, this._myScaleAsOne, this._myStepPerSecond, this.object, this._myVariableName, this._mySetAsWidgetCurrentVariable, this._myUseTuneTarget);\r\n this._myEasyObjectTuner.start();\r\n }\r\n }\r\n }\r\n\r\n public override onActivate(): void {\r\n if (this._myEasyObjectTuner != null) {\r\n this._myEasyObjectTuner.setActive(true);\r\n }\r\n }\r\n\r\n public override onDeactivate(): void {\r\n if (this._myEasyObjectTuner != null) {\r\n this._myEasyObjectTuner.setActive(false);\r\n }\r\n }\r\n\r\n public getEasyObjectTuner(): EasyScale | null {\r\n return this._myEasyObjectTuner;\r\n }\r\n\r\n public pp_clone(targetObject: Object3D): EasyScaleComponent | null {\r\n const clonedComponent = ComponentUtils.cloneDefault(this, targetObject);\r\n return clonedComponent as any;\r\n }\r\n}", "import { Component, Property } from \"@wonderlandengine/api\";\r\nimport { Globals } from \"../../../../pp/globals.js\";\r\nimport { EasyTuneUtils } from \"../../easy_tune_utils.js\";\r\nimport { EasyTuneInt } from \"../../easy_tune_variable_types.js\";\r\n\r\nexport class EasySetTuneTargetChildNumberComponent extends Component {\r\n static TypeName = \"pp-easy-set-tune-target-child-number\";\r\n static Properties = {\r\n _myVariableName: Property.string(\"\"),\r\n _mySetAsWidgetCurrentVariable: Property.bool(false)\r\n };\r\n\r\n start() {\r\n if (Globals.isToolEnabled(this.engine)) {\r\n this._myEasyTuneVariableName = \"Target Child \";\r\n\r\n if (this._myVariableName == \"\") {\r\n this._myEasyTuneVariableName = this._myEasyTuneVariableName.concat(this.object.pp_getID());\r\n } else {\r\n this._myEasyTuneVariableName = this._myEasyTuneVariableName.concat(this._myVariableName);\r\n }\r\n\r\n let childrenCount = this.object.pp_getChildren().length;\r\n let min = 1;\r\n let max = childrenCount;\r\n if (childrenCount == 0) {\r\n min = 0;\r\n max = 0;\r\n }\r\n\r\n this._mySetupDone = false;\r\n\r\n this._myEasyTuneVariable = new EasyTuneInt(this._myEasyTuneVariableName, 0, null, true, 10, min, max, undefined, this.engine);\r\n Globals.getEasyTuneVariables(this.engine).add(this._myEasyTuneVariable);\r\n\r\n this._myCurrentChildIndex = -1;\r\n this._myCurrentChildrenCount = childrenCount;\r\n\r\n this._myEasyTuneTarget = null;\r\n }\r\n }\r\n\r\n update(dt) {\r\n if (Globals.isToolEnabled(this.engine)) {\r\n if (!this._mySetupDone) {\r\n if (Globals.hasEasyTuneWidget()) {\r\n if (this._mySetAsWidgetCurrentVariable) {\r\n EasyTuneUtils.setWidgetCurrentVariable(this._myEasyTuneVariableName, this.engine);\r\n }\r\n\r\n this._mySetupDone = true;\r\n }\r\n }\r\n\r\n if (Globals.getEasyTuneVariables(this.engine).isWidgetCurrentVariable(this._myEasyTuneVariable.getName())) {\r\n let childrenCount = this.object.pp_getChildren().length;\r\n if (childrenCount != this._myCurrentChildrenCount) {\r\n this._myCurrentChildrenCount = childrenCount;\r\n\r\n let min = 1;\r\n let max = childrenCount;\r\n if (childrenCount == 0) {\r\n min = 0;\r\n max = 0;\r\n }\r\n\r\n this._myEasyTuneVariable.setMin(min);\r\n this._myEasyTuneVariable.setMax(max);\r\n }\r\n\r\n let childIndex = this._myEasyTuneVariable.getValue();\r\n if (childIndex != this._myCurrentChildIndex) {\r\n if (childIndex == 0 && this._myCurrentChildIndex != -1) {\r\n if (Globals.getEasyTuneTarget(this.engine) == this._myEasyTuneTarget) {\r\n Globals.removeEasyTuneTarget(this.engine);\r\n }\r\n this._myEasyTuneTarget = null;\r\n } else if (childIndex > 0) {\r\n this._myEasyTuneTarget = this.object.pp_getChildren()[childIndex - 1];\r\n Globals.setEasyTuneTarget(this._myEasyTuneTarget, this.engine);\r\n }\r\n\r\n this._myCurrentChildIndex = childIndex;\r\n }\r\n }\r\n }\r\n }\r\n}", "import { Component } from \"@wonderlandengine/api\";\r\nimport { GrabberHandComponent } from \"../../../../gameplay/grab_throw/grabber_hand_component.js\";\r\nimport { Globals } from \"../../../../pp/globals.js\";\r\n\r\nexport class EasySetTuneTargeetGrabComponent extends Component {\r\n static TypeName = \"pp-easy-set-tune-target-grab\";\r\n\r\n start() {\r\n this._myGrabber = null;\r\n this._myEasyTuneTarget = null;\r\n }\r\n\r\n update(dt) {\r\n if (Globals.isToolEnabled(this.engine)) {\r\n if (this._myGrabber == null) {\r\n this._myGrabber = this.object.pp_getComponent(GrabberHandComponent);\r\n\r\n //this._myGrabber.registerGrabEventListener(this, this._onGrab.bind(this));\r\n this._myGrabber.registerThrowEventListener(this, this._onRelease.bind(this));\r\n }\r\n }\r\n }\r\n\r\n _onRelease(grabber, grabbable) {\r\n if (Globals.isToolEnabled(this.engine)) {\r\n this._myEasyTuneTarget = grabbable.object;\r\n Globals.setEasyTuneTarget(this._myEasyTuneTarget, this.engine);\r\n }\r\n }\r\n\r\n _onGrab(grabber, grabbable) {\r\n if (Globals.isToolEnabled(this.engine)) {\r\n if (Globals.getEasyTuneTarget(this.engine) == this._myEasyTuneTarget) {\r\n Globals.removeEasyTuneTarget(this.engine);\r\n }\r\n this._myEasyTuneTarget = null;\r\n }\r\n }\r\n\r\n onActivate() {\r\n if (this._myGrabber != null) {\r\n //this._myGrabber.registerGrabEventListener(this, this._onGrab.bind(this));\r\n this._myGrabber.registerThrowEventListener(this, this._onRelease.bind(this));\r\n }\r\n }\r\n\r\n onDeactivate() {\r\n if (this._myGrabber != null) {\r\n //this._myGrabber.unregisterGrabEventListener(this);\r\n this._myGrabber.unregisterThrowEventListener(this);\r\n }\r\n }\r\n}", "import { Component, Object3D, property } from \"@wonderlandengine/api\";\r\nimport { ColorModel } from \"../../../../cauldron/utils/color_utils.js\";\r\nimport { ComponentUtils } from \"../../../../cauldron/wl/utils/component_utils.js\";\r\nimport { Globals } from \"../../../../pp/globals.js\";\r\nimport { EasyTextColor } from \"../easy_text_color.js\";\r\n\r\nexport class EasyTextColorComponent extends Component {\r\n public static override TypeName = \"pp-easy-text-color\";\r\n\r\n @property.string(\"\")\r\n private readonly _myVariableName!: string;\r\n\r\n @property.bool(false)\r\n private readonly _mySetAsWidgetCurrentVariable!: boolean;\r\n\r\n @property.bool(false)\r\n private readonly _myUseTuneTarget!: boolean;\r\n\r\n\r\n\r\n @property.enum([ColorModel[ColorModel.RGB], ColorModel[ColorModel.HSV]], ColorModel[ColorModel.HSV])\r\n private readonly _myColorModel!: number;\r\n\r\n @property.enum([\"Color\", \"Effect Color\"], \"Color\")\r\n private readonly _myColorType!: number;\r\n\r\n\r\n\r\n private _myEasyObjectTuner: EasyTextColor | null = null;\r\n\r\n public override update(dt: number): void {\r\n if (Globals.isToolEnabled(this.engine)) {\r\n if (this._myEasyObjectTuner != null) {\r\n this._myEasyObjectTuner.update(dt);\r\n } else {\r\n this._myEasyObjectTuner = new EasyTextColor(this._myColorModel, this._myColorType, this.object, this._myVariableName, this._mySetAsWidgetCurrentVariable, this._myUseTuneTarget, this.engine);\r\n this._myEasyObjectTuner.start();\r\n }\r\n }\r\n }\r\n\r\n public override onActivate(): void {\r\n if (this._myEasyObjectTuner != null) {\r\n this._myEasyObjectTuner.setActive(true);\r\n }\r\n }\r\n\r\n public override onDeactivate(): void {\r\n if (this._myEasyObjectTuner != null) {\r\n this._myEasyObjectTuner.setActive(false);\r\n }\r\n }\r\n\r\n public getEasyObjectTuner(): EasyTextColor | null {\r\n return this._myEasyObjectTuner;\r\n }\r\n\r\n public pp_clone(targetObject: Object3D): EasyTextColorComponent | null {\r\n const clonedComponent = ComponentUtils.cloneDefault(this, targetObject);\r\n return clonedComponent as any;\r\n }\r\n}", "import { Component, Object3D, property } from \"@wonderlandengine/api\";\r\nimport { ComponentUtils } from \"../../../../cauldron/wl/utils/component_utils.js\";\r\nimport { Globals } from \"../../../../pp/globals.js\";\r\nimport { EasyTransform } from \"../easy_transform.js\";\r\n\r\nexport class EasyTransformComponent extends Component {\r\n public static override TypeName = \"pp-easy-transform\";\r\n\r\n @property.string(\"\")\r\n private readonly _myVariableName!: string;\r\n\r\n @property.bool(false)\r\n private readonly _mySetAsWidgetCurrentVariable!: boolean;\r\n\r\n @property.bool(false)\r\n private readonly _myUseTuneTarget!: boolean;\r\n\r\n\r\n\r\n @property.bool(true)\r\n private readonly _myLocal!: boolean;\r\n\r\n /** Edit all scale values together */\r\n @property.bool(true)\r\n private readonly _myScaleAsOne!: boolean;\r\n\r\n @property.float(1)\r\n private readonly _myPositionStepPerSecond!: number;\r\n\r\n @property.float(50)\r\n private readonly _myRotationStepPerSecond!: number;\r\n\r\n @property.float(1)\r\n private readonly _myScaleStepPerSecond!: number;\r\n\r\n\r\n\r\n private _myEasyObjectTuner: EasyTransform | null = null;\r\n\r\n public override update(dt: number): void {\r\n if (Globals.isToolEnabled(this.engine)) {\r\n if (this._myEasyObjectTuner != null) {\r\n this._myEasyObjectTuner.update(dt);\r\n } else {\r\n this._myEasyObjectTuner = new EasyTransform(this._myLocal, this._myScaleAsOne, this._myPositionStepPerSecond, this._myRotationStepPerSecond, this._myScaleStepPerSecond, this.object, this._myVariableName, this._mySetAsWidgetCurrentVariable, this._myUseTuneTarget, this.engine);\r\n this._myEasyObjectTuner.start();\r\n }\r\n }\r\n }\r\n\r\n public override onActivate(): void {\r\n if (this._myEasyObjectTuner != null) {\r\n this._myEasyObjectTuner.setActive(true);\r\n }\r\n }\r\n\r\n public override onDeactivate(): void {\r\n if (this._myEasyObjectTuner != null) {\r\n this._myEasyObjectTuner.setActive(false);\r\n }\r\n }\r\n\r\n public getEasyObjectTuner(): EasyTransform | null {\r\n return this._myEasyObjectTuner;\r\n }\r\n\r\n public pp_clone(targetObject: Object3D): EasyTransformComponent | null {\r\n const clonedComponent = ComponentUtils.cloneDefault(this, targetObject);\r\n return clonedComponent as any;\r\n }\r\n}"], - "mappings": "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A,oBAAAC;EACA;EACA,iBAAAC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,UAAAO;EACA;EACA;EACA,SAAAG;EACA;EACA;EACA,YAAAC;EACA;EACA;EACA,aAAAG;EACA;EACA;EACA,OAAAG;EACA;EACA;EACA,SAAAG;EACA;EACA;EACA,SAAAG;EACA;EACA;EACA,UAAAG;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,QAAAgB;EACA,eAAAC;EACA,eAAAC;EACA;EACA,YAAAC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,YAAAY;EACA,mBAAAE;EACA,mBAAAC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,cAAAI;EACA,qBAAAC;EACA,qBAAAC;EACA;EACA,kBAAAC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,kBAAAa;EACA,yBAAAC;EACA,yBAAAC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,iBAAAkB;EACA;EACA;EACA,OAAAG;EACA;EACA;EACA;EACA;EACA;EACA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", + "sourcesContent": ["// PP\r\nexport * from \"./pp/register_pp_components.js\";\r\nexport { Globals } from \"./pp/globals.js\";\r\n\r\nexport * from \"./pp/components/pp_gateway_component.js\";\r\nexport * from \"./pp/components/add_pp_to_window_component.js\";\r\n\r\n//\tPLUGIN\r\nexport { PluginUtils } from \"./plugin/utils/plugin_utils.js\";\r\n\r\nexport * from \"./plugin/js/extensions/array/vec_create_extension.js\";\r\nexport { ArrayExtensionUtils } from \"./plugin/js/extensions/array/array_extension_utils.js\";\r\n\r\n//\tAUDIO\r\nexport * from \"./audio/audio_manager.js\";\r\nexport * from \"./audio/audio_player.js\";\r\nexport * from \"./audio/audio_setup.js\";\r\nexport { AudioUtils } from \"./audio/audio_utils.js\";\r\n\r\nexport * from \"./audio/howler/howler_audio_player.js\";\r\n\r\nexport * from \"./audio/components/audio_manager_component.js\";\r\nexport * from \"./audio/components/mute_everything_component.js\";\r\nexport * from \"./audio/components/spatial_audio_listener_component.js\";\r\n\r\n//\tCAULDRON\r\n\r\n// BENCHMARKS\r\nexport * from \"./cauldron/benchmarks/benchmark_max_physx_component.js\";\r\nexport * from \"./cauldron/benchmarks/benchmark_max_visible_triangles_component.js\";\r\n\r\n// CAULDRON\r\nexport * from \"./cauldron/cauldron/save_manager.js\";\r\nexport * from \"./cauldron/cauldron/analytics_manager.js\";\r\nexport * from \"./cauldron/cauldron/timer.js\";\r\n\r\nexport * from \"./cauldron/cauldron/components/adjust_hierarchy_physx_scale_component.js\";\r\nexport * from \"./cauldron/cauldron/components/analytics_manager_component.js\";\r\nexport * from \"./cauldron/cauldron/components/clear_console_component.js\";\r\nexport * from \"./cauldron/cauldron/components/reset_local_transform_component.js\";\r\nexport * from \"./cauldron/cauldron/components/save_manager_component.js\";\r\nexport * from \"./cauldron/cauldron/components/set_active_component.js\";\r\nexport * from \"./cauldron/cauldron/components/set_engine_log_level_component.js\";\r\nexport * from \"./cauldron/cauldron/components/show_xr_buttons_component.js\";\r\n\r\n// FSM\r\nexport * from \"./cauldron/fsm/fsm.js\";\r\nexport * from \"./cauldron/fsm/state.js\";\r\nexport * from \"./cauldron/fsm/transition.js\";\r\nexport * from \"./cauldron/fsm/states/condition_states/base_condition_state.js\";\r\nexport * from \"./cauldron/fsm/states/condition_states/condition_state.js\";\r\nexport * from \"./cauldron/fsm/states/condition_states/timer_state.js\";\r\nexport * from \"./cauldron/fsm/states/condition_states/frames_countdown_state.js\";\r\nexport * from \"./cauldron/fsm/states/condition_states/delay_state.js\";\r\nexport * from \"./cauldron/fsm/states/cauldron/branch_state.js\";\r\n\r\n// OBJECT POOL\r\nexport * from \"./cauldron/object_pool/object_pool.js\";\r\nexport * from \"./cauldron/object_pool/object_pool_manager.js\";\r\nexport * from \"./cauldron/object_pool/components/object_pool_manager_component.js\";\r\n\r\n// TYPE DEFINITIONS\r\nexport * from \"./cauldron/type_definitions/array_type_definitions.js\";\r\n\r\n// UTILS\r\nexport { ColorUtils, ColorModel } from \"./cauldron/utils/color_utils.js\";\r\nexport { SaveUtils } from \"./cauldron/utils/save_utils.js\";\r\nexport { XRUtils } from \"./cauldron/utils/xr_utils.js\";\r\nexport { BrowserUtils } from \"./cauldron/utils/browser_utils.js\";\r\nexport { AnalyticsUtils } from \"./cauldron/utils/analytics_utils.js\";\r\n\r\nexport { ArrayUtils } from \"./cauldron/utils/array/array_utils.js\";\r\nexport { VecUtils } from \"./cauldron/utils/array/vec_utils.js\";\r\nexport { Vec2Utils } from \"./cauldron/utils/array/vec2_utils.js\";\r\nexport { Vec3Utils } from \"./cauldron/utils/array/vec3_utils.js\";\r\nexport { Vec4Utils } from \"./cauldron/utils/array/vec4_utils.js\";\r\nexport { QuatUtils } from \"./cauldron/utils/array/quat_utils.js\";\r\nexport { Quat2Utils } from \"./cauldron/utils/array/quat2_utils.js\";\r\nexport { Mat3Utils } from \"./cauldron/utils/array/mat3_utils.js\";\r\nexport { Mat4Utils } from \"./cauldron/utils/array/mat4_utils.js\";\r\nexport { VecAllocationUtils } from \"./cauldron/utils/array/vec_allocation_utils.js\";\r\n\r\nexport { JSUtils } from \"./cauldron/utils/js_utils.js\";\r\nexport { MathUtils, EasingFunction, EasingFunctionName, WaveFunction } from \"./cauldron/utils/math_utils.js\";\r\n\r\n// PHYSICS\r\nexport { PhysicsUtils } from \"./cauldron/physics/physics_utils.js\";\r\nexport * from \"./cauldron/physics/physics_raycast_params.js\";\r\nexport * from \"./cauldron/physics/physics_layer_flags.js\";\r\nexport * from \"./cauldron/physics/physics_collision_collector.js\";\r\n\r\n// VISUAL\r\nexport * from \"./cauldron/visual/visual_manager.js\";\r\nexport * from \"./cauldron/visual/visual_resources.js\";\r\n\r\nexport * from \"./cauldron/visual/elements/visual_element_types.js\";\r\nexport * from \"./cauldron/visual/elements/visual_line.js\";\r\nexport * from \"./cauldron/visual/elements/visual_mesh.js\";\r\nexport * from \"./cauldron/visual/elements/visual_point.js\";\r\nexport * from \"./cauldron/visual/elements/visual_arrow.js\";\r\nexport * from \"./cauldron/visual/elements/visual_text.js\";\r\nexport * from \"./cauldron/visual/elements/visual_transform.js\";\r\nexport * from \"./cauldron/visual/elements/visual_raycast.js\";\r\nexport * from \"./cauldron/visual/elements/visual_torus.js\";\r\n\r\nexport * from \"./cauldron/visual/components/visual_manager_component.js\";\r\n\r\n// WL\r\nexport * from \"./cauldron/wl/register_wl_components.js\";\r\nexport * from \"./cauldron/wl/components/add_wl_to_window_component.js\";\r\nexport { ObjectUtils, ObjectCloneParams } from \"./cauldron/wl/utils/object_utils.js\";\r\nexport { ComponentUtils, ComponentDeepCloneParams, ComponentCustomCloneParams } from \"./cauldron/wl/utils/component_utils.js\";\r\nexport { WLComponentDefaultCloneCallbacks } from \"./cauldron/wl/utils/wl_component_default_clone_callbacks.js\";\r\nexport { MaterialUtils } from \"./cauldron/wl/utils/material_utils.js\";\r\nexport { MeshUtils, MeshCreationVertexParams, MeshCreationTriangleParams, MeshCreationParams } from \"./cauldron/wl/utils/mesh_utils.js\";\r\nexport { TextUtils } from \"./cauldron/wl/utils/text_utils.js\";\r\nexport * from \"./cauldron/wl/getters/scene_objects.js\";\r\nexport * from \"./cauldron/wl/getters/default_resources.js\";\r\nexport * from \"./cauldron/wl/getters/components/get_scene_objects_component.js\";\r\nexport * from \"./cauldron/wl/getters/components/get_default_resources_component.js\";\r\nexport * from \"./cauldron/wl/type_definitions/material_type_definitions.js\";\r\n\r\n//\tDEBUG\r\nexport * from \"./debug/debug_manager.js\";\r\nexport * from \"./debug/debug_visual_manager.js\";\r\n\r\nexport * from \"./debug/components/debug_transform_component.js\";\r\nexport * from \"./debug/components/debug_manager_component.js\";\r\nexport * from \"./debug/components/enable_debug_component.js\";\r\nexport * from \"./debug/components/show_fps_component.js\";\r\nexport * from \"./debug/components/toggle_active_on_button_press_component.js\";\r\n\r\nexport * from \"./debug/debug_functions_overwriter/debug_functions_overwriter.js\";\r\nexport * from \"./debug/debug_functions_overwriter/debug_functions_performance_analyzer/debug_functions_performance_analyzer.js\";\r\nexport * from \"./debug/debug_functions_overwriter/debug_functions_performance_analyzer/debug_functions_performance_analysis_results_logger.js\";\r\nexport * from \"./debug/debug_functions_overwriter/debug_functions_performance_analyzer/components/debug_functions_performance_analyzer_component.js\";\r\nexport * from \"./debug/debug_functions_overwriter/debug_functions_performance_analyzer/components/debug_pp_functions_performance_analyzer_component.js\";\r\nexport * from \"./debug/debug_functions_overwriter/debug_functions_performance_analyzer/components/debug_array_functions_performance_analyzer_component.js\";\r\nexport * from \"./debug/debug_functions_overwriter/debug_functions_performance_analyzer/components/debug_pp_array_creation_performance_analyzer_component.js\";\r\nexport * from \"./debug/debug_functions_overwriter/debug_functions_performance_analyzer/components/debug_wl_function_performance_analyzer_component.js\";\r\nexport * from \"./debug/debug_functions_overwriter/debug_functions_performance_analyzer/components/debug_wl_components_function_performance_analyzer_component.js\";\r\n\r\n//\tGAMEPLAY\r\n\r\n// CAULDRON\r\nexport * from \"./gameplay/cauldron/cauldron/direction_2D_to_3D_converter.js\";\r\nexport * from \"./gameplay/cauldron/cauldron/number_over_factor.js\";\r\nexport * from \"./gameplay/cauldron/cauldron/animated_number.js\";\r\n\r\nexport * from \"./gameplay/cauldron/cauldron/components/cursor_button_component.js\";\r\n\r\n// ROUGH\r\nexport * from \"./gameplay/cauldron/rough/components/scale_on_spawn_component.js\";\r\n\r\n// GRAB & THROW\r\nexport * from \"./gameplay/grab_throw/grabbable_component.js\";\r\nexport * from \"./gameplay/grab_throw/grabber_hand_component.js\";\r\n\r\n// INTEGRATIONS\r\nexport { CAUtils, CAError } from \"./gameplay/integrations/construct_arcade/ca_utils.js\";\r\nexport * from \"./gameplay/integrations/construct_arcade/ca_dummy_server.js\";\r\nexport * from \"./gameplay/integrations/construct_arcade/ca_display_leaderboard_component.js\";\r\n\r\n// EXPERIMENTAL\r\n\r\n// CHARACTER CONTROLLER\r\nexport * from \"./gameplay/experimental/character_controller/collision/legacy/collision_check/collision_params.js\";\r\nexport { CollisionCheck } from \"./gameplay/experimental/character_controller/collision/legacy/collision_check/collision_check.js\";\r\nexport { CollisionCheckUtils } from \"./gameplay/experimental/character_controller/collision/legacy/collision_check/collision_check_utils.js\";\r\n\r\nexport { CollisionCheckBridge } from \"./gameplay/experimental/character_controller/collision/collision_check_bridge.js\";\r\nexport * from \"./gameplay/experimental/character_controller/collision/character_collider_setup.js\";\r\nexport { CharacterControllerUtils } from \"./gameplay/experimental/character_controller/character_controller_utils.js\";\r\nexport { CharacterColliderSetupUtils, CharacterColliderSetupSimplifiedCreationParams, CharacterColliderSetupSimplifiedCreationAccuracyLevel } from \"./gameplay/experimental/character_controller/collision/character_collider_setup_utils.js\";\r\nexport * from \"./gameplay/experimental/character_controller/collision/character_collision_results.js\";\r\nexport * from \"./gameplay/experimental/character_controller/collision/character_collision_system.js\";\r\nexport * from \"./gameplay/experimental/character_controller/collision/components/character_collision_system_component.js\";\r\n\r\n// LOCOMOTION\r\nexport * from \"./gameplay/experimental/locomotion/legacy/locomotion/player_head_manager.js\";\r\nexport * from \"./gameplay/experimental/locomotion/legacy/locomotion/player_transform_manager.js\";\r\nexport * from \"./gameplay/experimental/locomotion/legacy/locomotion/player_locomotion_rotate.js\";\r\nexport * from \"./gameplay/experimental/locomotion/legacy/locomotion/player_locomotion_movement.js\";\r\nexport * from \"./gameplay/experimental/locomotion/legacy/locomotion/player_locomotion_smooth.js\";\r\nexport * from \"./gameplay/experimental/locomotion/legacy/locomotion/player_obscure_manager.js\";\r\nexport * from \"./gameplay/experimental/locomotion/legacy/locomotion/player_locomotion.js\";\r\nexport * from \"./gameplay/experimental/locomotion/legacy/locomotion/components/player_locomotion_component.js\";\r\n\r\nexport * from \"./gameplay/experimental/locomotion/legacy/locomotion/teleport/player_locomotion_teleport_parable.js\";\r\nexport * from \"./gameplay/experimental/locomotion/legacy/locomotion/teleport/player_locomotion_teleport_state.js\";\r\nexport * from \"./gameplay/experimental/locomotion/legacy/locomotion/teleport/player_locomotion_teleport_detection_visualizer.js\";\r\nexport * from \"./gameplay/experimental/locomotion/legacy/locomotion/teleport/player_locomotion_teleport_detection_state.js\";\r\nexport * from \"./gameplay/experimental/locomotion/legacy/locomotion/teleport/player_locomotion_teleport_teleport_state.js\";\r\nexport * from \"./gameplay/experimental/locomotion/legacy/locomotion/teleport/player_locomotion_teleport_teleport_blink_state.js\";\r\nexport * from \"./gameplay/experimental/locomotion/legacy/locomotion/teleport/player_locomotion_teleport_teleport_shift_state.js\";\r\nexport * from \"./gameplay/experimental/locomotion/legacy/locomotion/teleport/player_locomotion_teleport.js\";\r\n\r\n//\tINPUT\r\nexport * from \"./input/cauldron/input_types.js\";\r\nexport { InputUtils } from \"./input/cauldron/input_utils.js\";\r\nexport * from \"./input/cauldron/keyboard.js\";\r\nexport * from \"./input/cauldron/mouse.js\";\r\nexport * from \"./input/cauldron/input_manager.js\";\r\n\r\nexport * from \"./input/cauldron/components/overlap_cursor_component.js\";\r\nexport * from \"./input/cauldron/components/finger_cursor_component.js\";\r\nexport * from \"./input/cauldron/components/input_manager_component.js\";\r\nexport * from \"./input/cauldron/components/switch_hand_object_component.js\";\r\nexport * from \"./input/cauldron/components/tracked_hand_draw_joint_component.js\";\r\nexport * from \"./input/cauldron/components/tracked_hand_draw_all_joints_component.js\";\r\nexport * from \"./input/cauldron/components/tracked_hand_draw_skin_component.js\";\r\n\r\nexport * from \"./input/gamepad/gamepad_buttons.js\";\r\nexport { Gamepad } from \"./input/gamepad/gamepad.js\";\r\nexport * from \"./input/gamepad/universal_gamepad.js\";\r\nexport * from \"./input/gamepad/cauldron/gamepad_mesh_animator_component.js\";\r\nexport * from \"./input/gamepad/cauldron/gamepads_manager.js\";\r\nexport { GamepadUtils } from \"./input/gamepad/cauldron/gamepad_utils.js\";\r\nexport * from \"./input/gamepad/cauldron/gamepad_control_scheme_component.js\";\r\nexport * from \"./input/gamepad/gamepad_cores/gamepad_core.js\";\r\nexport * from \"./input/gamepad/gamepad_cores/xr_gamepad_core.js\";\r\nexport * from \"./input/gamepad/gamepad_cores/keyboard_gamepad_core.js\";\r\nexport * from \"./input/gamepad/gamepad_cores/virtual_gamepad_gamepad_core.js\";\r\nexport * from \"./input/gamepad/gamepad_cores/classic_gamepad_core.js\";\r\n\r\nexport * from \"./input/gamepad/virtual_gamepad/virtual_gamepad.js\";\r\nexport * from \"./input/gamepad/virtual_gamepad/virtual_gamepad_component.js\";\r\nexport * from \"./input/gamepad/virtual_gamepad/virtual_gamepad_params.js\";\r\nexport * from \"./input/gamepad/virtual_gamepad/virtual_gamepad_virtual_button.js\";\r\nexport * from \"./input/gamepad/virtual_gamepad/virtual_gamepad_virtual_thumbstick.js\";\r\nexport * from \"./input/gamepad/virtual_gamepad/virtual_gamepad_icon.js\";\r\n\r\nexport * from \"./input/pose/base_pose.js\";\r\nexport * from \"./input/pose/hand_pose.js\";\r\nexport * from \"./input/pose/hand_ray_pose.js\";\r\nexport * from \"./input/pose/head_pose.js\";\r\nexport * from \"./input/pose/tracked_hand_joint_pose.js\";\r\nexport * from \"./input/pose/tracked_hand_pose.js\";\r\n\r\nexport * from \"./input/pose/components/set_player_height_component.js\";\r\nexport * from \"./input/pose/components/set_hand_local_transform_component.js\";\r\nexport * from \"./input/pose/components/set_hand_ray_local_transform_component.js\";\r\nexport * from \"./input/pose/components/set_head_local_transform_component.js\";\r\nexport * from \"./input/pose/components/set_tracked_hand_joint_local_transform_component.js\";\r\nexport * from \"./input/pose/components/copy_hand_transform_component.js\";\r\nexport * from \"./input/pose/components/copy_head_transform_component.js\";\r\nexport * from \"./input/pose/components/copy_player_transform_component.js\";\r\nexport * from \"./input/pose/components/copy_reference_space_transform_component.js\";\r\n\r\n//\tTOOL\r\nexport * from \"./tool/cauldron/tool_types.js\";\r\nexport * from \"./tool/cauldron/components/tool_cursor_component.js\";\r\nexport * from \"./tool/cauldron/components/enable_tool_component.js\";\r\n\r\nexport * from \"./tool/console_vr/console_vr_widget_config.js\";\r\nexport * from \"./tool/console_vr/console_vr_widget_ui.js\";\r\nexport * from \"./tool/console_vr/console_vr_widget.js\";\r\nexport * from \"./tool/console_vr/console_vr.js\";\r\nexport * from \"./tool/console_vr/console_vr_types.js\";\r\nexport { ConsoleOriginalFunctions } from \"./tool/console_vr/console_original_functions.js\";\r\n\r\nexport * from \"./tool/console_vr/components/console_vr_tool_component.js\";\r\nexport * from \"./tool/console_vr/components/init_console_vr_component.js\";\r\n\r\nexport * from \"./tool/easy_tune/easy_tune_variables.js\";\r\nexport * from \"./tool/easy_tune/easy_tune_variable_types.js\";\r\nexport { EasyTuneUtils } from \"./tool/easy_tune/easy_tune_utils.js\";\r\n\r\nexport * from \"./tool/easy_tune/components/easy_tune_tool_component.js\";\r\nexport * from \"./tool/easy_tune/components/easy_tune_import_variables_component.js\";\r\nexport * from \"./tool/easy_tune/components/init_easy_tune_variables_component.js\";\r\n\r\nexport * from \"./tool/easy_tune/easy_object_tuners/easy_object_tuner.js\";\r\nexport * from \"./tool/easy_tune/easy_object_tuners/easy_light_attenuation.js\";\r\nexport * from \"./tool/easy_tune/easy_object_tuners/easy_light_color.js\";\r\nexport * from \"./tool/easy_tune/easy_object_tuners/easy_mesh_color.js\";\r\nexport * from \"./tool/easy_tune/easy_object_tuners/easy_scale.js\";\r\nexport * from \"./tool/easy_tune/easy_object_tuners/easy_transform.js\";\r\nexport * from \"./tool/easy_tune/easy_object_tuners/easy_active.js\";\r\nexport * from \"./tool/easy_tune/easy_object_tuners/easy_text_color.js\";\r\nexport * from \"./tool/easy_tune/easy_object_tuners/components/easy_light_attenuation_component.js\";\r\nexport * from \"./tool/easy_tune/easy_object_tuners/components/easy_light_color_component.js\";\r\nexport * from \"./tool/easy_tune/easy_object_tuners/components/easy_mesh_color_component.js\";\r\nexport * from \"./tool/easy_tune/easy_object_tuners/components/easy_scale_component.js\";\r\nexport * from \"./tool/easy_tune/easy_object_tuners/components/easy_set_tune_target_child_number_component.js\";\r\nexport * from \"./tool/easy_tune/easy_object_tuners/components/easy_set_tune_target_grab_component.js\";\r\nexport * from \"./tool/easy_tune/easy_object_tuners/components/easy_text_color_component.js\";\r\nexport * from \"./tool/easy_tune/easy_object_tuners/components/easy_transform_component.js\";\r\nexport * from \"./tool/easy_tune/easy_object_tuners/components/easy_active_component.js\";\r\n\r\nexport * from \"./tool/easy_tune/easy_tune_widgets/easy_tune_widget.js\";\r\nexport * from \"./tool/easy_tune/easy_tune_widgets/easy_tune_widget_config.js\";\r\nexport * from \"./tool/easy_tune/easy_tune_widgets/base/easy_tune_base_widget.js\";\r\nexport * from \"./tool/easy_tune/easy_tune_widgets/base/easy_tune_base_widget_ui.js\";\r\nexport * from \"./tool/easy_tune/easy_tune_widgets/base/easy_tune_base_widget_config.js\";\r\nexport * from \"./tool/easy_tune/easy_tune_widgets/base/easy_tune_base_array_widget_selector.js\";\r\nexport * from \"./tool/easy_tune/easy_tune_widgets/bool/easy_tune_bool_array_widget.js\";\r\nexport * from \"./tool/easy_tune/easy_tune_widgets/bool/easy_tune_bool_array_widget_ui.js\";\r\nexport * from \"./tool/easy_tune/easy_tune_widgets/bool/easy_tune_bool_array_widget_config.js\";\r\nexport * from \"./tool/easy_tune/easy_tune_widgets/bool/easy_tune_bool_array_widget_selector.js\";\r\nexport * from \"./tool/easy_tune/easy_tune_widgets/none/easy_tune_none_widget.js\";\r\nexport * from \"./tool/easy_tune/easy_tune_widgets/none/easy_tune_none_widget_ui.js\";\r\nexport * from \"./tool/easy_tune/easy_tune_widgets/none/easy_tune_none_widget_config.js\";\r\nexport * from \"./tool/easy_tune/easy_tune_widgets/number/easy_tune_number_array_widget.js\";\r\nexport * from \"./tool/easy_tune/easy_tune_widgets/number/easy_tune_number_array_widget_ui.js\";\r\nexport * from \"./tool/easy_tune/easy_tune_widgets/number/easy_tune_number_array_widget_config.js\";\r\nexport * from \"./tool/easy_tune/easy_tune_widgets/number/easy_tune_number_widget_selector.js\";\r\nexport * from \"./tool/easy_tune/easy_tune_widgets/transform/easy_tune_transform_widget.js\";\r\nexport * from \"./tool/easy_tune/easy_tune_widgets/transform/easy_tune_transform_widget_ui.js\";\r\nexport * from \"./tool/easy_tune/easy_tune_widgets/transform/easy_tune_transform_widget_config.js\";\r\n\r\nexport * from \"./tool/widget_frame/widget_frame_config.js\";\r\nexport * from \"./tool/widget_frame/widget_frame_ui.js\";\r\nexport * from \"./tool/widget_frame/widget_frame.js\";", "import { Component, Object3D, property } from \"@wonderlandengine/api\";\r\nimport { ComponentUtils } from \"../../../../cauldron/wl/utils/component_utils.js\";\r\nimport { Globals } from \"../../../../pp/globals.js\";\r\nimport { EasyActive } from \"../easy_active.js\";\r\n\r\nexport class EasyActiveComponent extends Component {\r\n public static override TypeName = \"pp-easy-active\";\r\n\r\n @property.string(\"\")\r\n private readonly _myVariableName!: string;\r\n\r\n @property.bool(false)\r\n private readonly _mySetAsWidgetCurrentVariable!: boolean;\r\n\r\n @property.bool(false)\r\n private readonly _myUseTuneTarget!: boolean;\r\n\r\n\r\n\r\n private _myEasyObjectTuner: EasyActive | null = null;\r\n\r\n public override update(dt: number): void {\r\n if (Globals.isToolEnabled(this.engine)) {\r\n if (this._myEasyObjectTuner != null) {\r\n this._myEasyObjectTuner.update(dt);\r\n } else {\r\n this._myEasyObjectTuner = new EasyActive([this], this.object, this._myVariableName, this._mySetAsWidgetCurrentVariable, this._myUseTuneTarget, this.engine);\r\n this._myEasyObjectTuner.start();\r\n }\r\n }\r\n }\r\n\r\n public override onActivate(): void {\r\n if (this._myEasyObjectTuner != null) {\r\n this._myEasyObjectTuner.setActive(true);\r\n }\r\n }\r\n\r\n public override onDeactivate(): void {\r\n if (this._myEasyObjectTuner != null) {\r\n this._myEasyObjectTuner.setActive(false);\r\n }\r\n }\r\n\r\n public getEasyObjectTuner(): EasyActive | null {\r\n return this._myEasyObjectTuner;\r\n }\r\n\r\n public pp_clone(targetObject: Object3D): EasyActiveComponent | null {\r\n const clonedComponent = ComponentUtils.cloneDefault(this, targetObject);\r\n return clonedComponent as any;\r\n }\r\n}", "import { AnimationComponent, CollisionComponent, InputComponent, LightComponent, MeshComponent, PhysXComponent, TextComponent, ViewComponent } from \"@wonderlandengine/api\";\r\nimport { ARCamera8thwall, Anchor, Cursor, CursorTarget, DebugObject, DeviceOrientationLook, FingerCursor, FixedFoveation, HandTracking, HitTestLocation, HowlerAudioListener, HowlerAudioSource, ImageTexture, MouseLookComponent, PlaneDetection, PlayerHeight, TargetFramerate, TeleportComponent, Trail, TwoJointIkSolver, VideoTexture, VrModeActiveSwitch, Vrm, WasdControlsComponent } from \"@wonderlandengine/components\";\r\nimport { Globals } from \"../../../pp/globals.js\";\r\nimport { ObjectUtils } from \"./object_utils.js\";\r\nimport { WLComponentDefaultCloneCallbacks } from \"./wl_component_default_clone_callbacks.js\";\r\n\r\nlet _myCloneCallbacks = new WeakMap(); // Signature: callback(componentToClone, targetObject, useDefaultCloneAsFallback, deeCloneParams, customCloneParams)\r\nlet _myClonePostProcessCallbacks = new WeakMap(); // Signature: callback(componentToClone, clonedComponent, deeCloneParams, customCloneParams)\r\n\r\nexport class ComponentDeepCloneParams {\r\n\r\n constructor() {\r\n this._myDeepCloneComponents = false;\r\n this._myDeepCloneOverrideComponentsMap = new Map();\r\n this._myDeepCloneOverrideComponentsVariablesMap = new Map();\r\n }\r\n\r\n // The implementation is component dependant, not every component implements the deep clone\r\n setDeepCloneComponents(deepClone) {\r\n this._myDeepCloneComponents = deepClone;\r\n }\r\n\r\n // This value override the deep clone components value\r\n // The implementation is component dependant, not every component implements the deep clone\r\n setDeepCloneComponent(componentName, deepClone) {\r\n this._myDeepCloneOverrideComponentsMap.set(componentName, deepClone);\r\n }\r\n\r\n // This value override both the deep clone components value and the deep clone component override one\r\n // The implementation is component dependant, not every component variable override is taken into consideration\r\n setDeepCloneComponentVariable(componentName, variableName, deepClone) {\r\n let componentsVariablesMap = null;\r\n\r\n if (!this._myDeepCloneOverrideComponentsVariablesMap.has(componentName)) {\r\n this._myDeepCloneOverrideComponentsVariablesMap.set(componentName, new Map());\r\n }\r\n\r\n componentsVariablesMap = this._myDeepCloneOverrideComponentsVariablesMap.get(componentName);\r\n\r\n componentsVariablesMap.set(variableName, deepClone);\r\n }\r\n\r\n isDeepCloneComponent(componentName) {\r\n let deepCloneOverride = this._myDeepCloneOverrideComponentsMap.get(componentName);\r\n\r\n if (deepCloneOverride != null) {\r\n return deepCloneOverride;\r\n }\r\n\r\n return this._myDeepCloneComponents;\r\n }\r\n\r\n isDeepCloneComponentVariable(componentName, variableName) {\r\n let componentsVariablesMap = this._myDeepCloneOverrideComponentsVariablesMap.get(componentName);\r\n if (componentsVariablesMap != null) {\r\n let deepCloneOverride = componentsVariablesMap.get(variableName);\r\n if (deepCloneOverride != null) {\r\n return deepCloneOverride;\r\n }\r\n }\r\n\r\n return this.isDeepCloneComponent(componentName);\r\n }\r\n}\r\n\r\nexport class ComponentCustomCloneParams {\r\n\r\n constructor() {\r\n this._myParams = new Map();\r\n }\r\n\r\n addParam(name, value) {\r\n this._myParams.set(name, value);\r\n }\r\n\r\n removeParam(name) {\r\n this._myParams.delete(name);\r\n }\r\n\r\n getParam(name) {\r\n this._myParams.get(name);\r\n }\r\n\r\n hasParam(name) {\r\n this._myParams.has(name);\r\n }\r\n}\r\n\r\nexport function isWLComponent(classOrType) {\r\n return ComponentUtils.isWLNativeComponent(classOrType) || ComponentUtils.isWLJavascriptComponent(classOrType);\r\n}\r\n\r\nexport function isWLNativeComponent(classOrType) {\r\n let wlNative = false;\r\n\r\n let type = ComponentUtils.getTypeFromClassOrType(classOrType);\r\n\r\n if (ComponentUtils.getWLNativeComponentTypes().includes(type)) {\r\n wlNative = true;\r\n }\r\n\r\n return wlNative;\r\n}\r\n\r\nexport function isWLJavascriptComponent(classOrType) {\r\n let wlJavascript = false;\r\n\r\n let type = ComponentUtils.getTypeFromClassOrType(classOrType);\r\n\r\n if (ComponentUtils.getWLJavascriptComponentTypes().includes(type)) {\r\n wlJavascript = true;\r\n }\r\n\r\n return wlJavascript;\r\n}\r\n\r\nexport function getWLNativeComponentTypes() {\r\n return _myWLNativeComponentTypes;\r\n}\r\n\r\nexport function getWLJavascriptComponentTypes() {\r\n return _myWLJavascriptComponentTypes;\r\n}\r\n\r\nexport function getTypeFromClassOrType(classOrType) {\r\n if (classOrType == null) return;\r\n\r\n let type = classOrType;\r\n if (classOrType.TypeName != null) {\r\n type = classOrType.TypeName;\r\n }\r\n\r\n return type;\r\n}\r\n\r\nexport function getClassFromType(type, engine = Globals.getMainEngine()) {\r\n let classToReturn = null;\r\n\r\n if (ComponentUtils.isWLNativeComponent(type)) {\r\n if (ComponentUtils.isWLNativeComponentRegistered(type, engine)) {\r\n switch (type) {\r\n case AnimationComponent.TypeName:\r\n classToReturn = AnimationComponent;\r\n break;\r\n case CollisionComponent.TypeName:\r\n classToReturn = CollisionComponent;\r\n break;\r\n case InputComponent.TypeName:\r\n classToReturn = InputComponent;\r\n break;\r\n case LightComponent.TypeName:\r\n classToReturn = LightComponent;\r\n break;\r\n case MeshComponent.TypeName:\r\n classToReturn = MeshComponent;\r\n break;\r\n case PhysXComponent.TypeName:\r\n classToReturn = PhysXComponent;\r\n break;\r\n case TextComponent.TypeName:\r\n classToReturn = TextComponent;\r\n break;\r\n case ViewComponent.TypeName:\r\n classToReturn = ViewComponent;\r\n break;\r\n default:\r\n classToReturn = null;\r\n }\r\n }\r\n } else {\r\n classToReturn = ComponentUtils.getJavascriptComponentClass(type, engine);\r\n }\r\n\r\n return classToReturn;\r\n}\r\n\r\nexport function isRegistered(classOrType, engine = Globals.getMainEngine()) {\r\n let type = ComponentUtils.getTypeFromClassOrType(classOrType);\r\n return ComponentUtils.getClassFromType(type, engine) != null;\r\n}\r\n\r\nexport function getJavascriptComponentInstances(currentSceneOnly = true, engine = Globals.getMainEngine()) {\r\n if (currentSceneOnly) {\r\n return Globals.getScene(engine)._jsComponents;\r\n }\r\n\r\n return Globals.getWASM(engine)._components;\r\n}\r\n\r\nexport function getJavascriptComponentClass(type, engine = Globals.getMainEngine()) {\r\n return ComponentUtils.getJavascriptComponentClassesByIndex(engine)[ComponentUtils.getJavascriptComponentTypeIndex(type, engine)];\r\n}\r\n\r\nexport function getJavascriptComponentClassesByIndex(engine = Globals.getMainEngine()) {\r\n return Globals.getWASM(engine)._componentTypes;\r\n}\r\n\r\nexport function getJavascriptComponentTypeIndex(classOrType, engine = Globals.getMainEngine()) {\r\n let type = ComponentUtils.getTypeFromClassOrType(classOrType);\r\n return ComponentUtils.getJavascriptComponentTypeIndexes(engine)[type];\r\n}\r\n\r\nexport function getJavascriptComponentTypeIndexes(engine = Globals.getMainEngine()) {\r\n return Globals.getWASM(engine)._componentTypeIndices;\r\n}\r\n\r\nexport function getJavascriptComponentTypeFromIndex(typeIndex, engine = Globals.getMainEngine()) {\r\n let type = null;\r\n\r\n let componentClass = ComponentUtils.getJavascriptComponentClassesByIndex(engine)[typeIndex];\r\n if (componentClass != null) {\r\n type = componentClass.TypeName;\r\n }\r\n\r\n return type;\r\n}\r\n\r\nexport function isWLNativeComponentRegistered(classOrType, engine = Globals.getMainEngine()) {\r\n let scene = Globals.getScene(engine);\r\n let type = ComponentUtils.getTypeFromClassOrType(classOrType);\r\n return scene._components.getNativeManager(type) != null;\r\n}\r\n\r\nexport function isCloneable(classOrType, defaultCloneValid = false, engine = Globals.getMainEngine()) {\r\n let type = ComponentUtils.getTypeFromClassOrType(classOrType);\r\n return defaultCloneValid || ComponentUtils.hasCloneCallback(type, engine) || ComponentUtils.getClassFromType(type, engine)?.prototype.pp_clone != null;\r\n}\r\n\r\nexport function hasClonePostProcess(classOrType, engine = Globals.getMainEngine()) {\r\n let type = ComponentUtils.getTypeFromClassOrType(classOrType);\r\n return ComponentUtils.hasClonePostProcessCallback(type, engine) || ComponentUtils.getClassFromType(type, engine)?.prototype.pp_clonePostProcess != null;\r\n}\r\n\r\nexport function clone(componentToClone, targetObject, deeCloneParams, customCloneParams, useDefaultCloneAsFallback = false, defaultCloneAutoStartIfNotActive = true) {\r\n let clonedComponent = null;\r\n\r\n let cloneCallback = ComponentUtils.getCloneCallback(componentToClone.type, ObjectUtils.getEngine(componentToClone.object));\r\n\r\n if (cloneCallback != null) {\r\n clonedComponent = cloneCallback(componentToClone, targetObject, deeCloneParams, customCloneParams);\r\n } else if (componentToClone.pp_clone != null) {\r\n clonedComponent = componentToClone.pp_clone(targetObject, deeCloneParams, customCloneParams);\r\n } else if (useDefaultCloneAsFallback) {\r\n clonedComponent = ComponentUtils.cloneDefault(componentToClone, targetObject, defaultCloneAutoStartIfNotActive);\r\n }\r\n\r\n return clonedComponent;\r\n}\r\n\r\nexport function clonePostProcess(componentToClone, clonedComponent, deeCloneParams, customCloneParams) {\r\n let clonePostProcessCallback = ComponentUtils.getClonePostProcessCallback(componentToClone.type, ObjectUtils.getEngine(componentToClone.object));\r\n\r\n if (clonePostProcessCallback != null) {\r\n clonePostProcessCallback(componentToClone, clonedComponent, deeCloneParams, customCloneParams);\r\n } else if (componentToClone.pp_clonePostProcess != null) {\r\n componentToClone.pp_clonePostProcess(clonedComponent, deeCloneParams, customCloneParams);\r\n }\r\n\r\n return clonedComponent;\r\n}\r\n\r\nexport function cloneDefault(componentToClone, targetObject, autoStartIfNotActive = true) {\r\n let clonedComponent = ObjectUtils.addComponent(targetObject, componentToClone.type, componentToClone);\r\n\r\n // Trigger start, which otherwise would be called later, on first activation\r\n if (autoStartIfNotActive && !clonedComponent.active) {\r\n clonedComponent.active = true;\r\n clonedComponent.active = false;\r\n }\r\n\r\n return clonedComponent;\r\n}\r\n\r\nexport function setCloneCallback(classOrType, callback, engine = Globals.getMainEngine()) {\r\n let type = ComponentUtils.getTypeFromClassOrType(classOrType);\r\n\r\n if (!_myCloneCallbacks.has(engine)) {\r\n _myCloneCallbacks.set(engine, new Map());\r\n }\r\n\r\n _myCloneCallbacks.get(engine).set(type, callback);\r\n}\r\n\r\nexport function removeCloneCallback(classOrType, engine = Globals.getMainEngine()) {\r\n let type = ComponentUtils.getTypeFromClassOrType(classOrType);\r\n\r\n if (_myCloneCallbacks.has(engine)) {\r\n _myCloneCallbacks.get(engine).delete(type);\r\n }\r\n}\r\n\r\nexport function getCloneCallback(classOrType, engine = Globals.getMainEngine()) {\r\n let callback = null;\r\n\r\n let type = ComponentUtils.getTypeFromClassOrType(classOrType);\r\n if (_myCloneCallbacks.has(engine)) {\r\n callback = _myCloneCallbacks.get(engine).get(type);\r\n }\r\n\r\n return callback;\r\n}\r\n\r\nexport function hasCloneCallback(classOrType, engine = Globals.getMainEngine()) {\r\n let hasCallback = false;\r\n\r\n let type = ComponentUtils.getTypeFromClassOrType(classOrType);\r\n if (_myCloneCallbacks.has(engine)) {\r\n hasCallback = _myCloneCallbacks.get(engine).has(type);\r\n }\r\n\r\n return hasCallback;\r\n}\r\n\r\nexport function setClonePostProcessCallback(classOrType, callback, engine = Globals.getMainEngine()) {\r\n let type = ComponentUtils.getTypeFromClassOrType(classOrType);\r\n\r\n if (!_myClonePostProcessCallbacks.has(engine)) {\r\n _myClonePostProcessCallbacks.set(engine, new Map());\r\n }\r\n\r\n _myClonePostProcessCallbacks.get(engine).set(type, callback);\r\n}\r\n\r\nexport function removeClonePostProcessCallback(classOrType, engine = Globals.getMainEngine()) {\r\n let type = ComponentUtils.getTypeFromClassOrType(classOrType);\r\n\r\n if (_myClonePostProcessCallbacks.has(engine)) {\r\n _myClonePostProcessCallbacks.get(engine).delete(type);\r\n }\r\n}\r\n\r\nexport function getClonePostProcessCallback(classOrType, engine = Globals.getMainEngine()) {\r\n let callback = null;\r\n\r\n let type = ComponentUtils.getTypeFromClassOrType(classOrType);\r\n if (_myClonePostProcessCallbacks.has(engine)) {\r\n callback = _myClonePostProcessCallbacks.get(engine).get(type);\r\n }\r\n\r\n return callback;\r\n}\r\n\r\nexport function hasClonePostProcessCallback(classOrType, engine = Globals.getMainEngine()) {\r\n let hasCallback = false;\r\n\r\n let type = ComponentUtils.getTypeFromClassOrType(classOrType);\r\n if (_myClonePostProcessCallbacks.has(engine)) {\r\n hasCallback = _myClonePostProcessCallbacks.get(engine).has(type);\r\n }\r\n\r\n return hasCallback;\r\n}\r\n\r\n\r\nexport function getDefaultWLComponentCloneCallback(classOrType) {\r\n let callback = null;\r\n\r\n let type = ComponentUtils.getTypeFromClassOrType(classOrType);\r\n\r\n switch (type) {\r\n case MeshComponent.TypeName:\r\n callback = WLComponentDefaultCloneCallbacks.cloneMesh;\r\n break;\r\n case CollisionComponent.TypeName:\r\n callback = WLComponentDefaultCloneCallbacks.cloneCollision;\r\n break;\r\n case TextComponent.TypeName:\r\n callback = WLComponentDefaultCloneCallbacks.cloneText;\r\n break;\r\n case PhysXComponent.TypeName:\r\n callback = WLComponentDefaultCloneCallbacks.clonePhysX;\r\n break;\r\n default:\r\n callback = null;\r\n }\r\n\r\n return callback;\r\n}\r\n\r\n\r\nexport function hasDefaultWLComponentCloneCallback(classOrType) {\r\n return ComponentUtils.getDefaultWLComponentCloneCallback(classOrType) != null;\r\n}\r\n\r\n\r\nexport function setWLComponentDefaultCloneCallbacks(engine = Globals.getMainEngine()) {\r\n for (let nativeType of ComponentUtils.getWLNativeComponentTypes()) {\r\n let cloneCallback = ComponentUtils.getDefaultWLComponentCloneCallback(nativeType);\r\n if (cloneCallback != null) {\r\n ComponentUtils.setCloneCallback(nativeType, cloneCallback, engine);\r\n }\r\n }\r\n\r\n for (let javascriptType of ComponentUtils.getWLJavascriptComponentTypes()) {\r\n let cloneCallback = ComponentUtils.getDefaultWLComponentCloneCallback(javascriptType);\r\n if (cloneCallback != null) {\r\n ComponentUtils.setCloneCallback(javascriptType, cloneCallback, engine);\r\n }\r\n }\r\n}\r\n\r\nexport function removeWLComponentDefaultCloneCallbacks(engine = Globals.getMainEngine()) {\r\n for (let nativeType of ComponentUtils.getWLNativeComponentTypes()) {\r\n let cloneCallback = ComponentUtils.getDefaultWLComponentCloneCallback(nativeType);\r\n if (cloneCallback != null) {\r\n if (ComponentUtils.getCloneCallback(nativeType, engine) == cloneCallback) {\r\n ComponentUtils.removeCloneCallback(nativeType, engine);\r\n }\r\n }\r\n }\r\n\r\n for (let javascriptType of ComponentUtils.getWLNativeComponentTypes()) {\r\n let cloneCallback = ComponentUtils.getDefaultWLComponentCloneCallback(javascriptType);\r\n if (cloneCallback != null) {\r\n if (ComponentUtils.getCloneCallback(javascriptType, engine) == cloneCallback) {\r\n ComponentUtils.removeCloneCallback(javascriptType, engine);\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport let ComponentUtils = {\r\n isWLComponent,\r\n isWLNativeComponent,\r\n isWLJavascriptComponent,\r\n getWLNativeComponentTypes,\r\n getWLJavascriptComponentTypes,\r\n getTypeFromClassOrType,\r\n getClassFromType,\r\n isRegistered,\r\n\r\n getJavascriptComponentInstances,\r\n getJavascriptComponentClass,\r\n getJavascriptComponentClassesByIndex,\r\n getJavascriptComponentTypeIndex,\r\n getJavascriptComponentTypeIndexes,\r\n getJavascriptComponentTypeFromIndex,\r\n isWLNativeComponentRegistered,\r\n\r\n isCloneable,\r\n hasClonePostProcess,\r\n clone,\r\n clonePostProcess,\r\n cloneDefault,\r\n\r\n setCloneCallback,\r\n removeCloneCallback,\r\n getCloneCallback,\r\n hasCloneCallback,\r\n setClonePostProcessCallback,\r\n removeClonePostProcessCallback,\r\n getClonePostProcessCallback,\r\n hasClonePostProcessCallback,\r\n\r\n setWLComponentDefaultCloneCallbacks,\r\n removeWLComponentDefaultCloneCallbacks,\r\n getDefaultWLComponentCloneCallback,\r\n hasDefaultWLComponentCloneCallback\r\n};\r\n\r\n\r\n\r\nlet _myWLNativeComponentTypes = [\r\n AnimationComponent.TypeName,\r\n CollisionComponent.TypeName,\r\n InputComponent.TypeName,\r\n LightComponent.TypeName,\r\n MeshComponent.TypeName,\r\n PhysXComponent.TypeName,\r\n TextComponent.TypeName,\r\n ViewComponent.TypeName\r\n];\r\n\r\nlet _myWLJavascriptComponentTypes = [\r\n ARCamera8thwall.TypeName,\r\n Anchor.TypeName,\r\n Cursor.TypeName,\r\n CursorTarget.TypeName,\r\n DebugObject.TypeName,\r\n DeviceOrientationLook.TypeName,\r\n FingerCursor.TypeName,\r\n FixedFoveation.TypeName,\r\n HandTracking.TypeName,\r\n HitTestLocation.TypeName,\r\n HowlerAudioListener.TypeName,\r\n HowlerAudioSource.TypeName,\r\n ImageTexture.TypeName,\r\n MouseLookComponent.TypeName,\r\n PlaneDetection.TypeName,\r\n PlayerHeight.TypeName,\r\n TargetFramerate.TypeName,\r\n TeleportComponent.TypeName,\r\n Trail.TypeName,\r\n TwoJointIkSolver.TypeName,\r\n VideoTexture.TypeName,\r\n VrModeActiveSwitch.TypeName,\r\n Vrm.TypeName,\r\n WasdControlsComponent.TypeName\r\n];", "import { WonderlandEngine } from \"@wonderlandengine/api\";\r\nimport { Globals } from \"../pp/globals.js\";\r\nimport { AudioManager } from \"./audio_manager.js\";\r\n\r\nconst _myAudioManagers: WeakMap, AudioManager> = new WeakMap();\r\n\r\nexport function getAudioManager(engine: Readonly | null = Globals.getMainEngine()): AudioManager | null {\r\n if (engine == null) return null;\r\n\r\n const audioManager = _myAudioManagers.get(engine);\r\n return audioManager != null ? audioManager : null;\r\n}\r\n\r\nexport function setAudioManager(audioManager: AudioManager, engine: Readonly | null = Globals.getMainEngine()): void {\r\n if (engine != null) {\r\n _myAudioManagers.set(engine, audioManager);\r\n }\r\n}\r\n\r\nexport function removeAudioManager(engine: Readonly | null = Globals.getMainEngine()): void {\r\n if (engine != null) {\r\n _myAudioManagers.delete(engine);\r\n }\r\n}\r\n\r\nexport function hasAudioManager(engine: Readonly | null = Globals.getMainEngine()): boolean {\r\n return engine != null ? _myAudioManagers.has(engine) : false;\r\n}", "import { WonderlandEngine } from \"@wonderlandengine/api\";\r\nimport { Globals } from \"../../pp/globals.js\";\r\nimport { AnalyticsManager } from \"./analytics_manager.js\";\r\n\r\nconst _myAnalyticsManagers: WeakMap, AnalyticsManager> = new WeakMap();\r\n\r\nexport function getAnalyticsManager(engine: Readonly | null = Globals.getMainEngine()): AnalyticsManager | null {\r\n if (engine == null) return null;\r\n\r\n const analyticsManager = _myAnalyticsManagers.get(engine);\r\n return analyticsManager != null ? analyticsManager : null;\r\n}\r\n\r\nexport function setAnalyticsManager(analyticsManager: AnalyticsManager, engine: Readonly | null = Globals.getMainEngine()): void {\r\n if (engine != null) {\r\n _myAnalyticsManagers.set(engine, analyticsManager);\r\n }\r\n}\r\n\r\nexport function removeAnalyticsManager(engine: Readonly | null = Globals.getMainEngine()): void {\r\n if (engine != null) {\r\n _myAnalyticsManagers.delete(engine);\r\n }\r\n}\r\n\r\nexport function hasAnalyticsManager(engine: Readonly | null = Globals.getMainEngine()): boolean {\r\n return engine != null ? _myAnalyticsManagers.has(engine) : false;\r\n}", "import { WonderlandEngine } from \"@wonderlandengine/api\";\r\nimport { Globals } from \"../../pp/globals.js\";\r\nimport { SaveManager } from \"./save_manager.js\";\r\n\r\nconst _mySaveManagers: WeakMap, SaveManager> = new WeakMap();\r\n\r\nexport function getSaveManager(engine: Readonly | null = Globals.getMainEngine()): SaveManager | null {\r\n if (engine == null) return null;\r\n\r\n const saveManager = _mySaveManagers.get(engine);\r\n return saveManager != null ? saveManager : null;\r\n}\r\n\r\nexport function setSaveManager(saveManager: SaveManager, engine: Readonly | null = Globals.getMainEngine()): void {\r\n if (engine != null) {\r\n _mySaveManagers.set(engine, saveManager);\r\n }\r\n}\r\n\r\nexport function removeSaveManager(engine: Readonly | null = Globals.getMainEngine()): void {\r\n if (engine != null) {\r\n _mySaveManagers.delete(engine);\r\n }\r\n}\r\n\r\nexport function hasSaveManager(engine: Readonly | null = Globals.getMainEngine()): boolean {\r\n return engine != null ? _mySaveManagers.has(engine) : false;\r\n}", "import { WonderlandEngine } from \"@wonderlandengine/api\";\r\nimport { Globals } from \"../../pp/globals.js\";\r\nimport { ObjectPoolManager } from \"./object_pool_manager.js\";\r\n\r\nconst _myObjectPoolManagers: WeakMap, ObjectPoolManager> = new WeakMap();\r\n\r\nexport function getObjectPoolManager(engine: Readonly | null = Globals.getMainEngine()): ObjectPoolManager | null {\r\n if (engine == null) return null;\r\n\r\n const objectPoolManager = _myObjectPoolManagers.get(engine);\r\n return objectPoolManager != null ? objectPoolManager : null;\r\n}\r\n\r\nexport function setObjectPoolManager(objectPoolManager: ObjectPoolManager, engine: Readonly | null = Globals.getMainEngine()): void {\r\n if (engine != null) {\r\n _myObjectPoolManagers.set(engine, objectPoolManager);\r\n }\r\n}\r\n\r\nexport function removeObjectPoolManager(engine: Readonly | null = Globals.getMainEngine()): void {\r\n if (engine != null) {\r\n _myObjectPoolManagers.delete(engine);\r\n }\r\n}\r\n\r\nexport function hasObjectPoolManager(engine: Readonly | null = Globals.getMainEngine()): boolean {\r\n return engine != null ? _myObjectPoolManagers.has(engine) : false;\r\n}", "import { WonderlandEngine } from \"@wonderlandengine/api\";\r\nimport { Globals } from \"../../pp/globals.js\";\r\nimport { VisualManager } from \"./visual_manager.js\";\r\nimport { VisualResources } from \"./visual_resources.js\";\r\n\r\nconst _myVisualManagers: WeakMap, VisualManager> = new WeakMap();\r\nconst _myVisualResourcesMap: WeakMap, VisualResources> = new WeakMap();\r\n\r\nexport function getVisualManager(engine: Readonly | null = Globals.getMainEngine()): VisualManager | null {\r\n if (engine == null) return null;\r\n\r\n const visualManager = _myVisualManagers.get(engine);\r\n return visualManager != null ? visualManager : null;\r\n}\r\n\r\nexport function setVisualManager(visualManager: VisualManager, engine: Readonly | null = Globals.getMainEngine()): void {\r\n if (engine != null) {\r\n _myVisualManagers.set(engine, visualManager);\r\n }\r\n}\r\n\r\nexport function removeVisualManager(engine: Readonly | null = Globals.getMainEngine()): void {\r\n if (engine != null) {\r\n _myVisualManagers.delete(engine);\r\n }\r\n}\r\n\r\nexport function hasVisualManager(engine: Readonly | null = Globals.getMainEngine()): boolean {\r\n return engine != null ? _myVisualManagers.has(engine) : false;\r\n}\r\n\r\nexport function getVisualResources(engine: Readonly | null = Globals.getMainEngine()): VisualResources | null {\r\n if (engine == null) return null;\r\n\r\n const visualResources = _myVisualResourcesMap.get(engine);\r\n return visualResources != null ? visualResources : null;\r\n}\r\n\r\nexport function setVisualResources(visualResources: VisualResources, engine: Readonly | null = Globals.getMainEngine()): void {\r\n if (engine != null) {\r\n _myVisualResourcesMap.set(engine, visualResources);\r\n }\r\n}\r\n\r\nexport function removeVisualResources(engine: Readonly | null = Globals.getMainEngine()): void {\r\n if (engine != null) {\r\n _myVisualResourcesMap.delete(engine);\r\n }\r\n}\r\n\r\nexport function hasVisualResources(engine: Readonly | null = Globals.getMainEngine()): boolean {\r\n return engine != null ? _myVisualResourcesMap.has(engine) : false;\r\n}", "import { Physics, Scene, WASM, WonderlandEngine, XR } from \"@wonderlandengine/api\";\r\nimport { Globals } from \"../../pp/globals.js\";\r\n\r\nlet _myMainEngine: WonderlandEngine | null = null;\r\nconst _myEngines: WonderlandEngine[] = [];\r\n\r\nexport function getMainEngine(): WonderlandEngine | null {\r\n return _myMainEngine;\r\n}\r\n\r\nexport function setMainEngine(engine: WonderlandEngine): void {\r\n if (!hasEngine(engine)) {\r\n addEngine(engine);\r\n }\r\n\r\n _myMainEngine = engine;\r\n}\r\n\r\nexport function removeMainEngine(): void {\r\n _myMainEngine = null;\r\n}\r\n\r\nexport function getEngines(): WonderlandEngine[] {\r\n return _myEngines;\r\n}\r\n\r\nexport function addEngine(engine: WonderlandEngine): void {\r\n removeEngine(engine);\r\n _myEngines.push(engine);\r\n}\r\n\r\nexport function removeEngine(engine: Readonly): void {\r\n const index = _myEngines.indexOf(engine as WonderlandEngine);\r\n\r\n if (index >= 0) {\r\n _myEngines.splice(index, 1);\r\n\r\n if (getMainEngine() == engine) {\r\n removeMainEngine();\r\n }\r\n }\r\n}\r\n\r\nexport function hasEngine(engine: Readonly): boolean {\r\n return _myEngines.indexOf(engine as WonderlandEngine) >= 0;\r\n}\r\n\r\nexport function getScene(): Scene | null;\r\nexport function getScene(engine: Readonly): Scene;\r\nexport function getScene(engine: Readonly | null = Globals.getMainEngine()): Scene | null {\r\n let scene = null;\r\n\r\n if (engine != null) {\r\n scene = engine.scene;\r\n }\r\n\r\n return scene;\r\n}\r\n\r\nexport function getPhysics(): Physics | null;\r\nexport function getPhysics(engine: Readonly): Physics;\r\nexport function getPhysics(engine: Readonly | null = Globals.getMainEngine()): Physics | null {\r\n let physics = null;\r\n\r\n if (engine != null) {\r\n physics = engine.physics;\r\n }\r\n\r\n return physics;\r\n}\r\n\r\nexport function getCanvas(): HTMLCanvasElement | null;\r\nexport function getCanvas(engine: Readonly): HTMLCanvasElement;\r\nexport function getCanvas(engine: Readonly | null = Globals.getMainEngine()): HTMLCanvasElement | null {\r\n let canvas = null;\r\n\r\n if (engine != null) {\r\n canvas = engine.canvas;\r\n }\r\n\r\n return canvas;\r\n}\r\n\r\nexport function getWASM(): WASM | null;\r\nexport function getWASM(engine: Readonly): WASM;\r\nexport function getWASM(engine: Readonly | null = Globals.getMainEngine()): WASM | null {\r\n let wasm = null;\r\n\r\n if (engine != null) {\r\n wasm = engine.wasm;\r\n }\r\n\r\n return wasm;\r\n}\r\n\r\nexport function getXR(): XR | null;\r\nexport function getXR(engine: Readonly): XR;\r\nexport function getXR(engine: Readonly | null = Globals.getMainEngine()): XR | null {\r\n let xr = null;\r\n\r\n if (engine != null) {\r\n xr = engine.xr;\r\n }\r\n\r\n return xr;\r\n}", "import { WonderlandEngine } from \"@wonderlandengine/api\";\r\nimport { Globals } from \"../../../pp/globals.js\";\r\nimport { DefaultResources, DefaultResourcesMaterials, DefaultResourcesMeshes } from \"./default_resources.js\";\r\n\r\nconst _myDefaultResourcesContainer: WeakMap, DefaultResources> = new WeakMap();\r\n\r\nexport function getDefaultResources(engine: Readonly | null = Globals.getMainEngine()): DefaultResources | null {\r\n if (engine == null) return null;\r\n\r\n const defaultResources = _myDefaultResourcesContainer.get(engine);\r\n return defaultResources != null ? defaultResources : null;\r\n}\r\n\r\nexport function setDefaultResources(defaultResources: DefaultResources, engine: Readonly | null = Globals.getMainEngine()): void {\r\n if (engine != null) {\r\n _myDefaultResourcesContainer.set(engine, defaultResources);\r\n }\r\n}\r\n\r\nexport function removeDefaultResources(engine: Readonly | null = Globals.getMainEngine()): void {\r\n if (engine != null) {\r\n _myDefaultResourcesContainer.delete(engine);\r\n }\r\n}\r\n\r\nexport function hasDefaultResources(engine: Readonly | null = Globals.getMainEngine()): boolean {\r\n return engine != null ? _myDefaultResourcesContainer.has(engine) : false;\r\n}\r\n\r\nexport function getDefaultMeshes(engine: Readonly | null = Globals.getMainEngine()): DefaultResourcesMeshes | null {\r\n const defaultResources = getDefaultResources(engine);\r\n\r\n if (defaultResources != null) {\r\n return defaultResources.myMeshes;\r\n }\r\n\r\n return null;\r\n}\r\n\r\nexport function getDefaultMaterials(engine: Readonly | null = Globals.getMainEngine()): DefaultResourcesMaterials | null {\r\n const defaultResources = getDefaultResources(engine);\r\n\r\n if (defaultResources != null) {\r\n return defaultResources.myMaterials;\r\n }\r\n\r\n return null;\r\n}", "import { Object3D, WonderlandEngine } from \"@wonderlandengine/api\";\r\nimport { Globals } from \"../../../pp/globals.js\";\r\nimport { PlayerObjects, SceneObjects } from \"./scene_objects.js\";\r\n\r\nconst _mySceneObjectsContainer: WeakMap, SceneObjects> = new WeakMap();\r\n\r\nexport function getSceneObjects(engine: Readonly | null = Globals.getMainEngine()): SceneObjects | null {\r\n if (engine == null) return null;\r\n\r\n const sceneObjects = _mySceneObjectsContainer.get(engine);\r\n return sceneObjects != null ? sceneObjects : null;\r\n}\r\n\r\nexport function setSceneObjects(sceneObjects: SceneObjects, engine: Readonly | null = Globals.getMainEngine()): void {\r\n if (engine != null) {\r\n _mySceneObjectsContainer.set(engine, sceneObjects);\r\n }\r\n}\r\n\r\nexport function removeSceneObjects(engine: Readonly | null = Globals.getMainEngine()): void {\r\n if (engine != null) {\r\n _mySceneObjectsContainer.delete(engine);\r\n }\r\n}\r\n\r\nexport function hasSceneObjects(engine: Readonly | null = Globals.getMainEngine()): boolean {\r\n return engine != null ? _mySceneObjectsContainer.has(engine) : false;\r\n}\r\n\r\nexport function getRootObject(engine: Readonly | null = Globals.getMainEngine()): Object3D | null {\r\n const sceneObjects = getSceneObjects(engine);\r\n\r\n if (sceneObjects != null) {\r\n return sceneObjects.myRoot;\r\n }\r\n\r\n return null;\r\n}\r\n\r\nexport function getSceneObject(engine: Readonly | null = Globals.getMainEngine()): Object3D | null {\r\n const sceneObjects = getSceneObjects(engine);\r\n\r\n if (sceneObjects != null) {\r\n return sceneObjects.myScene;\r\n }\r\n\r\n return null;\r\n}\r\n\r\nexport function getPlayerObjects(engine: Readonly | null = Globals.getMainEngine()): PlayerObjects | null {\r\n const sceneObjects = getSceneObjects(engine);\r\n\r\n if (sceneObjects != null) {\r\n return sceneObjects.myPlayerObjects;\r\n }\r\n\r\n return null;\r\n}\r\n\r\nexport function getPlayerObject(engine: Readonly | null = Globals.getMainEngine()): Object3D | null {\r\n const sceneObjects = getSceneObjects(engine);\r\n\r\n if (sceneObjects != null) {\r\n return sceneObjects.myPlayerObjects.myPlayer;\r\n }\r\n\r\n return null;\r\n}\r\n\r\nexport function getPlayerReferenceSpaceObject(engine: Readonly | null = Globals.getMainEngine()): Object3D | null {\r\n const sceneObjects = getSceneObjects(engine);\r\n\r\n if (sceneObjects != null) {\r\n return sceneObjects.myPlayerObjects.myReferenceSpace;\r\n }\r\n\r\n return null;\r\n}\r\n\r\nexport function getPlayerHeadObject(engine: Readonly | null = Globals.getMainEngine()): Object3D | null {\r\n const sceneObjects = getSceneObjects(engine);\r\n\r\n if (sceneObjects != null) {\r\n return sceneObjects.myPlayerObjects.myHead;\r\n }\r\n\r\n return null;\r\n}", "import { WonderlandEngine } from \"@wonderlandengine/api\";\r\nimport { Globals } from \"../pp/globals.js\";\r\nimport { DebugManager } from \"./debug_manager.js\";\r\nimport { DebugVisualManager } from \"./debug_visual_manager.js\";\r\n\r\nconst _myDebugManagers: WeakMap, DebugManager> = new WeakMap();\r\nconst _myDebugEnableds: WeakMap, boolean> = new WeakMap();\r\n\r\nexport function getDebugManager(engine: Readonly | null = Globals.getMainEngine()): DebugManager | null {\r\n if (engine == null) return null;\r\n\r\n const debugManager = _myDebugManagers.get(engine);\r\n return debugManager != null ? debugManager : null;\r\n}\r\n\r\nexport function setDebugManager(debugManager: DebugManager, engine: Readonly | null = Globals.getMainEngine()): void {\r\n if (engine != null) {\r\n _myDebugManagers.set(engine, debugManager);\r\n }\r\n}\r\n\r\nexport function removeDebugManager(engine: Readonly | null = Globals.getMainEngine()): void {\r\n if (engine != null) {\r\n _myDebugManagers.delete(engine);\r\n }\r\n}\r\n\r\nexport function hasDebugManager(engine: Readonly | null = Globals.getMainEngine()): boolean {\r\n return engine != null ? _myDebugManagers.has(engine) : false;\r\n}\r\n\r\nexport function getDebugVisualManager(engine: Readonly | null = Globals.getMainEngine()): DebugVisualManager | null {\r\n const debugManager = getDebugManager(engine);\r\n\r\n if (debugManager != null) {\r\n return debugManager.getDebugVisualManager();\r\n }\r\n\r\n return null;\r\n}\r\n\r\nexport function isDebugEnabled(engine: Readonly | null = Globals.getMainEngine()): boolean {\r\n return engine != null ? !!_myDebugEnableds.get(engine) : false;\r\n}\r\n\r\nexport function setDebugEnabled(debugEnabled: boolean, engine: Readonly | null = Globals.getMainEngine()): void {\r\n if (engine != null) {\r\n _myDebugEnableds.set(engine, debugEnabled);\r\n }\r\n}\r\n\r\nexport function removeDebugEnabled(engine: Readonly | null = Globals.getMainEngine()): void {\r\n if (engine != null) {\r\n _myDebugEnableds.delete(engine);\r\n }\r\n}\r\n\r\nexport function hasDebugEnabled(engine: Readonly | null = Globals.getMainEngine()): boolean {\r\n return engine != null ? _myDebugEnableds.has(engine) : false;\r\n}", "import { WonderlandEngine } from \"@wonderlandengine/api\";\r\nimport { Globals } from \"../../../../pp/globals.js\";\r\nimport { CharacterCollisionSystem } from \"./character_collision_system.js\";\r\n\r\nconst _myCharacterCollisionSystems: WeakMap, CharacterCollisionSystem> = new WeakMap();\r\n\r\nexport function getCharacterCollisionSystem(engine: Readonly | null = Globals.getMainEngine()): CharacterCollisionSystem | null {\r\n if (engine == null) return null;\r\n\r\n const characterCollisionSystem = _myCharacterCollisionSystems.get(engine);\r\n return characterCollisionSystem != null ? characterCollisionSystem : null;\r\n}\r\n\r\nexport function setCharacterCollisionSystem(characterCollisionSystem: CharacterCollisionSystem, engine: Readonly | null = Globals.getMainEngine()): void {\r\n if (engine != null) {\r\n _myCharacterCollisionSystems.set(engine, characterCollisionSystem);\r\n }\r\n}\r\n\r\nexport function removeCharacterCollisionSystem(engine: Readonly | null = Globals.getMainEngine()): void {\r\n if (engine != null) {\r\n _myCharacterCollisionSystems.delete(engine);\r\n }\r\n}\r\n\r\nexport function hasCharacterCollisionSystem(engine: Readonly | null = Globals.getMainEngine()): boolean {\r\n return engine != null ? _myCharacterCollisionSystems.has(engine) : false;\r\n}", "import { WonderlandEngine } from \"@wonderlandengine/api\";\r\nimport { Globals } from \"../../../pp/globals.js\";\r\nimport { PlayerHeadManager } from \"./legacy/locomotion/player_head_manager.js\";\r\nimport { PlayerLocomotion } from \"./legacy/locomotion/player_locomotion.js\";\r\nimport { PlayerLocomotionRotate } from \"./legacy/locomotion/player_locomotion_rotate.js\";\r\nimport { PlayerLocomotionSmooth } from \"./legacy/locomotion/player_locomotion_smooth.js\";\r\nimport { PlayerObscureManager } from \"./legacy/locomotion/player_obscure_manager.js\";\r\nimport { PlayerTransformManager } from \"./legacy/locomotion/player_transform_manager.js\";\r\nimport { PlayerLocomotionTeleport } from \"./legacy/locomotion/teleport/player_locomotion_teleport.js\";\r\n\r\nconst _myPlayerLocomotions: WeakMap, PlayerLocomotion> = new WeakMap();\r\n\r\nexport function getPlayerLocomotion(engine: Readonly | null = Globals.getMainEngine()): PlayerLocomotion | null {\r\n if (engine == null) return null;\r\n\r\n return _myPlayerLocomotions.get(engine) ?? null;\r\n}\r\n\r\nexport function setPlayerLocomotion(playerLocomotionComponent: PlayerLocomotion, engine: Readonly | null = Globals.getMainEngine()): void {\r\n if (engine != null) {\r\n _myPlayerLocomotions.set(engine, playerLocomotionComponent);\r\n }\r\n}\r\n\r\nexport function removePlayerLocomotion(engine: Readonly | null = Globals.getMainEngine()): void {\r\n if (engine != null) {\r\n _myPlayerLocomotions.delete(engine);\r\n }\r\n}\r\n\r\nexport function hasPlayerLocomotion(engine: Readonly | null = Globals.getMainEngine()): boolean {\r\n return engine != null ? _myPlayerLocomotions.has(engine) : false;\r\n}\r\n\r\nexport function getPlayerHeadManager(engine: Readonly | null = Globals.getMainEngine()): PlayerHeadManager | null {\r\n const playerLocomotion = getPlayerLocomotion(engine);\r\n\r\n if (playerLocomotion != null) {\r\n return playerLocomotion.getPlayerHeadManager();\r\n }\r\n\r\n return null;\r\n}\r\n\r\nexport function getPlayerTransformManager(engine: Readonly | null = Globals.getMainEngine()): PlayerTransformManager | null {\r\n const playerLocomotion = getPlayerLocomotion(engine);\r\n\r\n if (playerLocomotion != null) {\r\n return playerLocomotion.getPlayerTransformManager();\r\n }\r\n\r\n return null;\r\n}\r\n\r\nexport function getPlayerLocomotionSmooth(engine: Readonly | null = Globals.getMainEngine()): PlayerLocomotionSmooth | null {\r\n const playerLocomotion = getPlayerLocomotion(engine);\r\n\r\n if (playerLocomotion != null) {\r\n return playerLocomotion.getPlayerLocomotionSmooth();\r\n }\r\n\r\n return null;\r\n}\r\n\r\nexport function getPlayerLocomotionTeleport(engine: Readonly | null = Globals.getMainEngine()): PlayerLocomotionTeleport | null {\r\n const playerLocomotion = getPlayerLocomotion(engine);\r\n\r\n if (playerLocomotion != null) {\r\n return playerLocomotion.getPlayerLocomotionTeleport();\r\n }\r\n\r\n return null;\r\n}\r\n\r\nexport function getPlayerLocomotionRotate(engine: Readonly | null = Globals.getMainEngine()): PlayerLocomotionRotate | null {\r\n const playerLocomotion = getPlayerLocomotion(engine);\r\n\r\n if (playerLocomotion != null) {\r\n return playerLocomotion.getPlayerLocomotionRotate();\r\n }\r\n\r\n return null;\r\n}\r\n\r\nexport function getPlayerObscureManager(engine: Readonly | null = Globals.getMainEngine()): PlayerObscureManager | null {\r\n const playerLocomotion = getPlayerLocomotion(engine);\r\n\r\n if (playerLocomotion != null) {\r\n return playerLocomotion.getPlayerObscureManager();\r\n }\r\n\r\n return null;\r\n}", "import { WonderlandEngine } from \"@wonderlandengine/api\";\r\nimport { GamepadsManager } from \"../../input/gamepad/cauldron/gamepads_manager.js\";\r\nimport { HandPose } from \"../../input/pose/hand_pose.js\";\r\nimport { HeadPose } from \"../../input/pose/head_pose.js\";\r\nimport { TrackedHandPose } from \"../../input/pose/tracked_hand_pose.js\";\r\nimport { Globals } from \"../../pp/globals.js\";\r\nimport { Gamepad } from \"../gamepad/gamepad.js\";\r\nimport { HandRayPose } from \"../pose/hand_ray_pose.js\";\r\nimport { InputManager } from \"./input_manager.js\";\r\nimport { Handedness } from \"./input_types.js\";\r\nimport { Keyboard } from \"./keyboard.js\";\r\nimport { Mouse } from \"./mouse.js\";\r\n\r\nconst _myInputManagers: WeakMap, InputManager> = new WeakMap();\r\nconst _myPoseForwardFixeds: WeakMap, boolean> = new WeakMap();\r\n\r\nexport function getInputManager(engine: Readonly | null = Globals.getMainEngine()): InputManager | null {\r\n if (engine == null) return null;\r\n\r\n const inputManager = _myInputManagers.get(engine);\r\n return inputManager != null ? inputManager : null;\r\n}\r\n\r\nexport function setInputManager(inputManager: InputManager, engine: Readonly | null = Globals.getMainEngine()): void {\r\n if (engine != null) {\r\n _myInputManagers.set(engine, inputManager);\r\n }\r\n}\r\n\r\nexport function removeInputManager(engine: Readonly | null = Globals.getMainEngine()): void {\r\n if (engine != null) {\r\n _myInputManagers.delete(engine);\r\n }\r\n}\r\n\r\nexport function hasInputManager(engine: Readonly | null = Globals.getMainEngine()): boolean {\r\n return engine != null ? _myInputManagers.has(engine) : false;\r\n}\r\n\r\nexport function getMouse(engine: Readonly | null = Globals.getMainEngine()): Mouse | null {\r\n const inputManager = getInputManager(engine);\r\n\r\n if (inputManager != null) {\r\n return inputManager.getMouse();\r\n }\r\n\r\n return null;\r\n}\r\n\r\nexport function getKeyboard(engine: Readonly | null = Globals.getMainEngine()): Keyboard | null {\r\n const inputManager = getInputManager(engine);\r\n\r\n if (inputManager != null) {\r\n return inputManager.getKeyboard();\r\n }\r\n\r\n return null;\r\n}\r\n\r\n// Gamepad\r\n\r\nexport function getGamepadsManager(engine: Readonly | null = Globals.getMainEngine()): GamepadsManager | null {\r\n const inputManager = getInputManager(engine);\r\n\r\n if (inputManager != null) {\r\n return inputManager.getGamepadsManager();\r\n }\r\n\r\n return null;\r\n}\r\n\r\nexport function getGamepad(handedness: Handedness, engine: Readonly | null = Globals.getMainEngine()): Gamepad | null {\r\n const inputManager = getInputManager(engine);\r\n\r\n if (inputManager != null) {\r\n return inputManager.getGamepadsManager().getGamepad(handedness);\r\n }\r\n\r\n return null;\r\n}\r\n\r\nexport function getGamepads(engine: Readonly | null = Globals.getMainEngine()): Record | null {\r\n const inputManager = getInputManager(engine);\r\n\r\n if (inputManager != null) {\r\n return inputManager.getGamepadsManager().getGamepads();\r\n }\r\n\r\n return null;\r\n}\r\n\r\nexport function getLeftGamepad(engine: Readonly | null = Globals.getMainEngine()): Gamepad | null {\r\n const inputManager = getInputManager(engine);\r\n\r\n if (inputManager != null) {\r\n return inputManager.getGamepadsManager().getLeftGamepad();\r\n }\r\n\r\n return null;\r\n}\r\n\r\nexport function getRightGamepad(engine: Readonly | null = Globals.getMainEngine()): Gamepad | null {\r\n const inputManager = getInputManager(engine);\r\n\r\n if (inputManager != null) {\r\n return inputManager.getGamepadsManager().getRightGamepad();\r\n }\r\n\r\n return null;\r\n}\r\n\r\n// Pose\r\n\r\nexport function getHeadPose(engine: Readonly | null = Globals.getMainEngine()): HeadPose | null {\r\n const inputManager = getInputManager(engine);\r\n\r\n if (inputManager != null) {\r\n return inputManager.getHeadPose();\r\n }\r\n\r\n return null;\r\n}\r\n\r\nexport function getHandPose(handedness: Handedness, engine: Readonly | null = Globals.getMainEngine()): HandPose | null {\r\n const inputManager = getInputManager(engine);\r\n\r\n if (inputManager != null) {\r\n return inputManager.getHandPose(handedness);\r\n }\r\n\r\n return null;\r\n}\r\n\r\nexport function getHandPoses(engine: Readonly | null = Globals.getMainEngine()): Record | null {\r\n const inputManager = getInputManager(engine);\r\n\r\n if (inputManager != null) {\r\n return inputManager.getHandPoses();\r\n }\r\n\r\n return null;\r\n}\r\n\r\nexport function getLeftHandPose(engine: Readonly | null = Globals.getMainEngine()): HandPose | null {\r\n const inputManager = getInputManager(engine);\r\n\r\n if (inputManager != null) {\r\n return inputManager.getLeftHandPose();\r\n }\r\n\r\n return null;\r\n}\r\n\r\nexport function getRightHandPose(engine: Readonly | null = Globals.getMainEngine()): HandPose | null {\r\n const inputManager = getInputManager(engine);\r\n\r\n if (inputManager != null) {\r\n return inputManager.getRightHandPose();\r\n }\r\n\r\n return null;\r\n}\r\n\r\nexport function getHandRayPose(handedness: Handedness, engine: Readonly | null = Globals.getMainEngine()): HandRayPose | null {\r\n const inputManager = getInputManager(engine);\r\n\r\n if (inputManager != null) {\r\n return inputManager.getHandRayPose(handedness);\r\n }\r\n\r\n return null;\r\n}\r\n\r\nexport function getHandRayPoses(engine: Readonly | null = Globals.getMainEngine()): Record | null {\r\n const inputManager = getInputManager(engine);\r\n\r\n if (inputManager != null) {\r\n return inputManager.getHandRayPoses();\r\n }\r\n\r\n return null;\r\n}\r\n\r\nexport function getLeftHandRayPose(engine: Readonly | null = Globals.getMainEngine()): HandRayPose | null {\r\n const inputManager = getInputManager(engine);\r\n\r\n if (inputManager != null) {\r\n return inputManager.getLeftHandRayPose();\r\n }\r\n\r\n return null;\r\n}\r\n\r\nexport function getRightHandRayPose(engine: Readonly | null = Globals.getMainEngine()): HandRayPose | null {\r\n const inputManager = getInputManager(engine);\r\n\r\n if (inputManager != null) {\r\n return inputManager.getRightHandRayPose();\r\n }\r\n\r\n return null;\r\n}\r\n\r\nexport function getTrackedHandPose(handedness: Handedness, engine: Readonly | null = Globals.getMainEngine()): TrackedHandPose | null {\r\n const inputManager = getInputManager(engine);\r\n\r\n if (inputManager != null) {\r\n return inputManager.getTrackedHandPose(handedness);\r\n }\r\n\r\n return null;\r\n}\r\n\r\nexport function getTrackedHandPoses(engine: Readonly | null = Globals.getMainEngine()): Record | null {\r\n const inputManager = getInputManager(engine);\r\n\r\n if (inputManager != null) {\r\n return inputManager.getTrackedHandPoses();\r\n }\r\n\r\n return null;\r\n}\r\n\r\nexport function getLeftTrackedHandPose(engine: Readonly | null = Globals.getMainEngine()): TrackedHandPose | null {\r\n const inputManager = getInputManager(engine);\r\n\r\n if (inputManager != null) {\r\n return inputManager.getLeftTrackedHandPose();\r\n }\r\n\r\n return null;\r\n}\r\n\r\nexport function getRightTrackedHandPose(engine: Readonly | null = Globals.getMainEngine()): TrackedHandPose | null {\r\n const inputManager = getInputManager(engine);\r\n\r\n if (inputManager != null) {\r\n return inputManager.getRightTrackedHandPose();\r\n }\r\n\r\n return null;\r\n}\r\n\r\n// Pose Forward Fixed\r\n\r\nexport function isPoseForwardFixed(engine: Readonly | null = Globals.getMainEngine()): boolean {\r\n return engine != null ? !!_myPoseForwardFixeds.get(engine) : false;\r\n}\r\n\r\nexport function setPoseForwardFixed(toolEnabled: boolean, engine: Readonly | null = Globals.getMainEngine()): void {\r\n if (engine != null) {\r\n _myPoseForwardFixeds.set(engine, toolEnabled);\r\n }\r\n}\r\n\r\nexport function removePoseForwardFixed(engine: Readonly | null = Globals.getMainEngine()): void {\r\n if (engine != null) {\r\n _myPoseForwardFixeds.delete(engine);\r\n }\r\n}\r\n\r\nexport function hasPoseForwardFixed(engine: Readonly | null = Globals.getMainEngine()): boolean {\r\n return engine != null ? _myPoseForwardFixeds.has(engine) : false;\r\n}", "import { WonderlandEngine } from \"@wonderlandengine/api\";\r\nimport { Globals } from \"../../pp/globals.js\";\r\n\r\nconst _myToolEnableds: WeakMap, boolean> = new WeakMap();\r\n\r\nexport function isToolEnabled(engine: Readonly | null = Globals.getMainEngine()): boolean | null {\r\n if (engine == null) return null;\r\n\r\n const toolEnabled = _myToolEnableds.get(engine);\r\n return toolEnabled != null ? toolEnabled : null;\r\n}\r\n\r\nexport function setToolEnabled(toolEnabled: boolean, engine: Readonly | null = Globals.getMainEngine()): void {\r\n if (engine != null) {\r\n _myToolEnableds.set(engine, toolEnabled);\r\n }\r\n}\r\n\r\nexport function removeToolEnabled(engine: Readonly | null = Globals.getMainEngine()): void {\r\n if (engine != null) {\r\n _myToolEnableds.delete(engine);\r\n }\r\n}\r\n\r\nexport function hasToolEnabled(engine: Readonly | null = Globals.getMainEngine()): boolean {\r\n return engine != null ? _myToolEnableds.has(engine) : false;\r\n}", "import { WonderlandEngine } from \"@wonderlandengine/api\";\r\nimport { Globals } from \"../../pp/globals.js\";\r\nimport { ConsoleVR } from \"./console_vr.js\";\r\nimport { ConsoleVRWidget } from \"./console_vr_widget.js\";\r\n\r\nconst _myConsoleVRs: WeakMap, ConsoleVR> = new WeakMap();\r\nconst _myConsoleVRWidgets: WeakMap, ConsoleVRWidget> = new WeakMap();\r\n\r\nexport function getConsoleVR(engine: Readonly | null = Globals.getMainEngine()): ConsoleVR | null {\r\n if (engine == null) return null;\r\n\r\n const consoleVR = _myConsoleVRs.get(engine);\r\n return consoleVR != null ? consoleVR : null;\r\n}\r\n\r\nexport function setConsoleVR(consoleVR: ConsoleVR, engine: Readonly | null = Globals.getMainEngine()): void {\r\n if (engine != null) {\r\n _myConsoleVRs.set(engine, consoleVR);\r\n }\r\n}\r\n\r\nexport function removeConsoleVR(engine: Readonly | null = Globals.getMainEngine()): void {\r\n if (engine != null) {\r\n _myConsoleVRs.delete(engine);\r\n }\r\n}\r\n\r\nexport function hasConsoleVR(engine: Readonly | null = Globals.getMainEngine()): boolean {\r\n return engine != null ? _myConsoleVRs.has(engine) : false;\r\n}\r\n\r\nexport function getConsoleVRWidget(engine: Readonly | null = Globals.getMainEngine()): ConsoleVRWidget | null {\r\n if (engine == null) return null;\r\n\r\n const consoleVRWidget = _myConsoleVRWidgets.get(engine);\r\n return consoleVRWidget != null ? consoleVRWidget : null;\r\n}\r\n\r\nexport function setConsoleVRWidget(consoleVRWidget: ConsoleVRWidget, engine: Readonly | null = Globals.getMainEngine()): void {\r\n if (engine != null) {\r\n _myConsoleVRWidgets.set(engine, consoleVRWidget);\r\n }\r\n}\r\n\r\nexport function removeConsoleVRWidget(engine: Readonly | null = Globals.getMainEngine()): void {\r\n if (engine != null) {\r\n _myConsoleVRWidgets.delete(engine);\r\n }\r\n}\r\n\r\nexport function hasConsoleVRWidget(engine: Readonly | null = Globals.getMainEngine()): boolean {\r\n return engine != null ? _myConsoleVRWidgets.has(engine) : false;\r\n}", "import { Object3D, WonderlandEngine } from \"@wonderlandengine/api\";\r\nimport { Globals } from \"../../pp/globals.js\";\r\nimport { EasyTuneVariables } from \"./easy_tune_variables.js\";\r\nimport { EasyTuneWidget } from \"./easy_tune_widgets/easy_tune_widget.js\";\r\n\r\nconst _myEasyTuneVariablesList: WeakMap, EasyTuneVariables> = new WeakMap();\r\nconst _myEasyTuneTargets: WeakMap, Object3D> = new WeakMap();\r\nconst _myEasyTuneWidgets: WeakMap, EasyTuneWidget> = new WeakMap();\r\n\r\nexport function getEasyTuneVariables(engine: Readonly | null = Globals.getMainEngine()): EasyTuneVariables | null {\r\n if (engine == null) return null;\r\n\r\n const easyTuneVariables = _myEasyTuneVariablesList.get(engine);\r\n return easyTuneVariables != null ? easyTuneVariables : null;\r\n}\r\n\r\nexport function setEasyTuneVariables(easyTuneVariables: EasyTuneVariables, engine: Readonly | null = Globals.getMainEngine()): void {\r\n if (engine != null) {\r\n _myEasyTuneVariablesList.set(engine, easyTuneVariables);\r\n }\r\n}\r\n\r\nexport function removeEasyTuneVariables(engine: Readonly | null = Globals.getMainEngine()): void {\r\n if (engine != null) {\r\n _myEasyTuneVariablesList.delete(engine);\r\n }\r\n}\r\n\r\nexport function hasEasyTuneVariables(engine: Readonly | null = Globals.getMainEngine()): boolean {\r\n return engine != null ? _myEasyTuneVariablesList.has(engine) : false;\r\n}\r\n\r\nexport function getEasyTuneTarget(engine: Readonly | null = Globals.getMainEngine()): Object3D | null {\r\n if (engine == null) return null;\r\n\r\n const easyTuneTarget = _myEasyTuneTargets.get(engine);\r\n return easyTuneTarget != null ? easyTuneTarget : null;\r\n}\r\n\r\nexport function setEasyTuneTarget(easyTuneTarget: Object3D, engine: Readonly | null = Globals.getMainEngine()): void {\r\n if (engine != null) {\r\n _myEasyTuneTargets.set(engine, easyTuneTarget);\r\n }\r\n}\r\n\r\nexport function removeEasyTuneTarget(engine: Readonly | null = Globals.getMainEngine()): void {\r\n if (engine != null) {\r\n _myEasyTuneTargets.delete(engine);\r\n }\r\n}\r\n\r\nexport function hasEasyTuneTarget(engine: Readonly | null = Globals.getMainEngine()): boolean {\r\n return engine != null ? _myEasyTuneTargets.has(engine) : false;\r\n}\r\n\r\nexport function getEasyTuneWidget(engine: Readonly | null = Globals.getMainEngine()): EasyTuneWidget | null {\r\n if (engine == null) return null;\r\n\r\n const easyTuneWidget = _myEasyTuneWidgets.get(engine);\r\n return easyTuneWidget != null ? easyTuneWidget : null;\r\n}\r\n\r\nexport function setEasyTuneWidget(easyTuneWidget: EasyTuneWidget, engine: Readonly | null = Globals.getMainEngine()): void {\r\n if (engine != null) {\r\n _myEasyTuneWidgets.set(engine, easyTuneWidget);\r\n }\r\n}\r\n\r\nexport function removeEasyTuneWidget(engine: Readonly | null = Globals.getMainEngine()): void {\r\n if (engine != null) {\r\n _myEasyTuneWidgets.delete(engine);\r\n }\r\n}\r\n\r\nexport function hasEasyTuneWidget(engine: Readonly | null = Globals.getMainEngine()): boolean {\r\n return engine != null ? _myEasyTuneWidgets.has(engine) : false;\r\n}", "import * as AudioGlobals from \"../audio/audio_globals.js\";\r\nimport * as AnalyticsGlobals from \"../cauldron/cauldron/analytics_globals.js\";\r\nimport * as SaveGlobals from \"../cauldron/cauldron/save_globals.js\";\r\nimport * as ObjectPoolManagerGlobals from \"../cauldron/object_pool/object_pool_globals.js\";\r\nimport * as VisualGlobals from \"../cauldron/visual/visual_globals.js\";\r\nimport * as EngineGlobals from \"../cauldron/wl/engine_globals.js\";\r\nimport * as DefaultResourcesGlobals from \"../cauldron/wl/getters/default_resources_globals.js\";\r\nimport * as SceneObjectsGlobals from \"../cauldron/wl/getters/scene_objects_globals.js\";\r\nimport * as DebugGlobals from \"../debug/debug_globals.js\";\r\nimport * as CharacterCollisionSystemGlobals from \"../gameplay/experimental/character_controller/collision/character_collision_system_globals.js\";\r\nimport * as PlayerLocomotionGlobals from \"../gameplay/experimental/locomotion/player_locomotion_globals.js\";\r\nimport * as InputGlobals from \"../input/cauldron/input_globals.js\";\r\nimport * as ToolGlobals from \"../tool/cauldron/tool_globals.js\";\r\nimport * as ConsoleVRGlobals from \"../tool/console_vr/console_vr_globals.js\";\r\nimport * as EasyTuneGlobals from \"../tool/easy_tune/easy_tune_globals.js\";\r\n\r\nexport const Globals = {\r\n ...EngineGlobals,\r\n ...SceneObjectsGlobals,\r\n ...DefaultResourcesGlobals,\r\n ...AudioGlobals,\r\n ...VisualGlobals,\r\n ...DebugGlobals,\r\n ...ObjectPoolManagerGlobals,\r\n ...CharacterCollisionSystemGlobals,\r\n ...PlayerLocomotionGlobals,\r\n ...InputGlobals,\r\n ...SaveGlobals,\r\n ...AnalyticsGlobals,\r\n ...ToolGlobals,\r\n ...ConsoleVRGlobals,\r\n ...EasyTuneGlobals\r\n} as const;", "import { mat3 as gl_mat3, quat as gl_quat, type mat3 as gl_mat3_type, type quat as gl_quat_type } from \"gl-matrix\";\r\nimport { Matrix3, Quaternion, Vector3 } from \"../../type_definitions/array_type_definitions.js\";\r\nimport { QuatUtils, create as quat_utils_create } from \"./quat_utils.js\";\r\nimport { Vec3Utils } from \"./vec3_utils.js\";\r\nimport { getMatrix3AllocationFunction, setMatrix3AllocationFunction } from \"./vec_allocation_utils.js\";\r\n\r\nexport function create(): Matrix3;\r\nexport function create(m00: number, m01: number, m02: number, m10: number, m11: number, m12: number, m20: number, m21: number, m22: number): Matrix3;\r\nexport function create(uniformValue: number): Matrix3;\r\nexport function create(\r\n m00?: number, m01?: number, m02?: number,\r\n m10?: number, m11?: number, m12?: number,\r\n m20?: number, m21?: number, m22?: number): Matrix3 {\r\n\r\n const out = getAllocationFunction()();\r\n\r\n if (m00 != null) {\r\n Mat3Utils.set(out,\r\n m00, m01!, m02!,\r\n m10!, m11!, m12!,\r\n m20!, m21!, m22!);\r\n }\r\n\r\n return out;\r\n}\r\n\r\nexport function getAllocationFunction(): () => Matrix3 {\r\n return getMatrix3AllocationFunction();\r\n}\r\n\r\n/** Specify the function that will be used to allocate the matrix when calling the {@link create} function */\r\nexport function setAllocationFunction(allocationFunction: () => Matrix3): void {\r\n setMatrix3AllocationFunction(allocationFunction);\r\n}\r\n\r\nexport function set(matrix: T, m00: number, m01: number, m02: number, m10: number, m11: number, m12: number, m20: number, m21: number, m22: number): T;\r\nexport function set(matrix: T, uniformValue: number): T;\r\nexport function set(matrix: T,\r\n m00: number, m01?: number, m02?: number,\r\n m10?: number, m11?: number, m12?: number,\r\n m20?: number, m21?: number, m22?: number): T {\r\n\r\n if (m01 == null) {\r\n gl_mat3.set(matrix as unknown as gl_mat3_type,\r\n m00!, m00, m00,\r\n m00, m00, m00,\r\n m00, m00, m00);\r\n } else {\r\n gl_mat3.set(matrix as unknown as gl_mat3_type,\r\n m00, m01, m02!,\r\n m10!, m11!, m12!,\r\n m20!, m21!, m22!);\r\n }\r\n\r\n return matrix;\r\n}\r\n\r\nexport function copy(from: Readonly, to: T): T {\r\n gl_mat3.copy(to as unknown as gl_mat3_type, from as unknown as gl_mat3_type);\r\n return to;\r\n}\r\n\r\n/** The overload where `T extends Vector2` does also get `array` as `Readonly`, but is not marked as such due to \r\n Typescript having issues with inferring the proper type of `T` when `Readonly` is used */\r\nexport function clone(matrix: Readonly): T;\r\nexport function clone(matrix: Readonly): number[];\r\nexport function clone(matrix: T): T;\r\nexport function clone(matrix: Readonly): T {\r\n return matrix.slice(0) as T;\r\n}\r\n\r\nexport function equals(first: Readonly, second: Readonly, epsilon: number = 0): boolean {\r\n let equals = first.length == second.length;\r\n\r\n if (equals) {\r\n equals &&= (Math.abs(first[0] - second[0]) <= epsilon);\r\n equals &&= (Math.abs(first[1] - second[1]) <= epsilon);\r\n equals &&= (Math.abs(first[2] - second[2]) <= epsilon);\r\n equals &&= (Math.abs(first[3] - second[3]) <= epsilon);\r\n equals &&= (Math.abs(first[4] - second[4]) <= epsilon);\r\n equals &&= (Math.abs(first[5] - second[5]) <= epsilon);\r\n equals &&= (Math.abs(first[6] - second[6]) <= epsilon);\r\n equals &&= (Math.abs(first[7] - second[7]) <= epsilon);\r\n equals &&= (Math.abs(first[8] - second[8]) <= epsilon);\r\n }\r\n\r\n return equals;\r\n}\r\n\r\n\r\nexport const toDegrees = function () {\r\n const quat = quat_utils_create();\r\n\r\n function toDegrees(matrix: Readonly): Vector3;\r\n function toDegrees(matrix: Readonly, out: T): T;\r\n function toDegrees(matrix: Readonly, out: Vector3 | T = Vec3Utils.create()): Vector3 | T {\r\n Mat3Utils.toQuat(matrix, quat);\r\n QuatUtils.toDegrees(quat, out);\r\n return out;\r\n }\r\n\r\n return toDegrees;\r\n}();\r\n\r\nexport const toRadians = function () {\r\n const quat = quat_utils_create();\r\n\r\n function toRadians(matrix: Readonly): Vector3;\r\n function toRadians(matrix: Readonly, out: T): T;\r\n function toRadians(matrix: Readonly, out: Vector3 | T = Vec3Utils.create()): Vector3 | T {\r\n Mat3Utils.toQuat(matrix, quat);\r\n QuatUtils.toRadians(quat, out);\r\n return out;\r\n }\r\n\r\n return toRadians;\r\n}();\r\n\r\nexport function toQuat(matrix: Readonly): Quaternion;\r\nexport function toQuat(matrix: Readonly, out: T): T;\r\nexport function toQuat(matrix: Readonly, out: Quaternion | T = QuatUtils.create()): Quaternion | T {\r\n gl_quat.fromMat3(out as unknown as gl_quat_type, matrix as unknown as gl_mat3_type);\r\n return out;\r\n}\r\n\r\nexport function fromAxes(left: Readonly, up: Readonly, forward: Readonly): Matrix3;\r\nexport function fromAxes(left: Readonly, up: Readonly, forward: Readonly, out: T): T;\r\nexport function fromAxes(left: Readonly, up: Readonly, forward: Readonly, out: Matrix3 | T = Mat3Utils.create()): Matrix3 | T {\r\n Mat3Utils.set(out,\r\n left[0], left[1], left[2],\r\n up[0], up[1], up[2],\r\n forward[0], forward[1], forward[2]);\r\n return out;\r\n}\r\n\r\nexport const Mat3Utils = {\r\n create,\r\n getAllocationFunction,\r\n setAllocationFunction,\r\n set,\r\n copy,\r\n clone,\r\n equals,\r\n toDegrees,\r\n toRadians,\r\n toQuat,\r\n fromAxes\r\n} as const;", "import { mat3 as gl_mat3, quat as gl_quat, type mat3 as gl_mat3_type, type quat as gl_quat_type, type vec3 as gl_vec3_type } from \"gl-matrix\";\r\nimport { Matrix3, Quaternion, Vector3 } from \"../../../cauldron/type_definitions/array_type_definitions.js\";\r\nimport { EasingFunction, MathUtils } from \"../math_utils.js\";\r\nimport { ArrayUtils } from \"./array_utils.js\";\r\nimport { Mat3Utils, create as mat3_utils_create } from \"./mat3_utils.js\";\r\nimport { Vec3Utils, create as vec3_utils_create } from \"./vec3_utils.js\";\r\nimport { getQuaternionAllocationFunction, setQuaternionAllocationFunction } from \"./vec_allocation_utils.js\";\r\n\r\nexport function create(): Quaternion;\r\nexport function create(x: number, y: number, z: number, w: number): Quaternion;\r\nexport function create(uniformValue: number): Quaternion;\r\nexport function create(x?: number, y?: number, z?: number, w?: number): Quaternion {\r\n const out = getAllocationFunction()();\r\n\r\n if (x != null) {\r\n QuatUtils.set(out, x, y!, z!, w!);\r\n }\r\n\r\n return out;\r\n}\r\n\r\nexport function getAllocationFunction(): () => Quaternion {\r\n return getQuaternionAllocationFunction();\r\n}\r\n\r\n/** Specify the function that will be used to allocate the quaternion when calling the {@link create} function */\r\nexport function setAllocationFunction(allocationFunction: () => Quaternion): void {\r\n setQuaternionAllocationFunction(allocationFunction);\r\n}\r\n\r\nexport function set(quat: T, x: number, y: number, z: number, w: number): T;\r\nexport function set(quat: T, uniformValue: number): T;\r\nexport function set(quat: T, x: number, y?: number, z?: number, w?: number): T {\r\n if (y == null) {\r\n gl_quat.set(quat as unknown as gl_quat_type, x, x, x, x);\r\n } else {\r\n gl_quat.set(quat as unknown as gl_quat_type, x, y, z!, w!);\r\n }\r\n\r\n return quat;\r\n}\r\n\r\nexport function copy(from: Readonly, to: T): T {\r\n gl_quat.copy(to as unknown as gl_quat_type, from as unknown as gl_quat_type);\r\n return to;\r\n}\r\n\r\n/** The overload where `T extends Quaternion` does also get `array` as `Readonly`, but is not marked as such due to \r\n Typescript having issues with inferring the proper type of `T` when `Readonly` is used */\r\nexport function clone(quat: Readonly): T;\r\nexport function clone(quat: Readonly): number[];\r\nexport function clone(quat: T): T;\r\nexport function clone(quat: Readonly): T {\r\n return quat.slice(0) as T;\r\n}\r\n\r\nexport function equals(first: Readonly, second: Readonly, epsilon: number = 0): boolean {\r\n let equals = first.length == second.length;\r\n\r\n if (equals) {\r\n equals &&= (Math.abs(first[0] - second[0]) <= epsilon);\r\n equals &&= (Math.abs(first[1] - second[1]) <= epsilon);\r\n equals &&= (Math.abs(first[2] - second[2]) <= epsilon);\r\n equals &&= (Math.abs(first[3] - second[3]) <= epsilon);\r\n }\r\n\r\n return equals;\r\n}\r\n\r\nexport function isNormalized(quat: Readonly, epsilon: number = MathUtils.EPSILON): boolean {\r\n return Math.abs(QuatUtils.lengthSquared(quat) - 1) < epsilon;\r\n}\r\n\r\nexport function normalize(quat: Readonly): T;\r\nexport function normalize(quat: Readonly, out: T): T;\r\nexport function normalize(quat: Readonly, out: T | U = QuatUtils.clone(quat)): T | U {\r\n gl_quat.normalize(out as unknown as gl_quat_type, quat as unknown as gl_quat_type);\r\n return out;\r\n}\r\n\r\nexport function length(quat: Readonly): number {\r\n return gl_quat.length(quat as unknown as gl_quat_type);\r\n}\r\n\r\nexport function lengthSquared(quat: Readonly): number {\r\n return gl_quat.squaredLength(quat as unknown as gl_quat_type);\r\n}\r\n\r\nexport function identity(quat: T): T {\r\n gl_quat.identity(quat as unknown as gl_quat_type);\r\n return quat;\r\n}\r\n\r\nexport function mul(first: Readonly, second: Readonly): T;\r\nexport function mul(first: Readonly, second: Readonly, out: T): T;\r\nexport function mul(first: Readonly, second: Readonly, out: T | U = QuatUtils.clone(first)): T | U {\r\n gl_quat.mul(out as unknown as gl_quat_type, first as unknown as gl_quat_type, second as unknown as gl_quat_type);\r\n return out;\r\n}\r\n\r\nexport function invert(quat: Readonly): T;\r\nexport function invert(quat: Readonly, out: T): T;\r\nexport function invert(quat: Readonly, out: T | U = QuatUtils.clone(quat)): T | U {\r\n gl_quat.invert(out as unknown as gl_quat_type, quat as unknown as gl_quat_type);\r\n return out;\r\n}\r\n\r\nexport function conjugate(quat: Readonly): T;\r\nexport function conjugate(quat: Readonly, out: T): T;\r\nexport function conjugate(quat: Readonly, out: T | U = QuatUtils.clone(quat)): T | U {\r\n gl_quat.conjugate(out as unknown as gl_quat_type, quat as unknown as gl_quat_type);\r\n return out;\r\n}\r\n\r\nexport function lerp(from: Readonly, to: Readonly, interpolationFactor: number): T;\r\nexport function lerp(from: Readonly, to: Readonly, interpolationFactor: number, out: T): T;\r\nexport function lerp(from: Readonly, to: Readonly, interpolationFactor: number, out: T | U = QuatUtils.clone(from)): T | U {\r\n if (interpolationFactor <= 0) {\r\n QuatUtils.copy(from, out);\r\n return out;\r\n } else if (interpolationFactor >= 1) {\r\n QuatUtils.copy(to, out);\r\n return out;\r\n }\r\n\r\n gl_quat.lerp(out as unknown as gl_quat_type, from as unknown as gl_quat_type, to as unknown as gl_quat_type, interpolationFactor);\r\n return out;\r\n}\r\n\r\nexport function interpolate(from: Readonly, to: Readonly, interpolationFactor: number, easingFunction?: EasingFunction): T;\r\nexport function interpolate(from: Readonly, to: Readonly, interpolationFactor: number, easingFunction: EasingFunction, out: T): T;\r\nexport function interpolate(from: Readonly, to: Readonly, interpolationFactor: number, easingFunction: EasingFunction = EasingFunction.linear, out: T | U = QuatUtils.clone(from)): T | U {\r\n const lerpFactor = easingFunction(interpolationFactor);\r\n return QuatUtils.lerp(from, to, lerpFactor, out);\r\n}\r\n\r\nexport function slerp(from: Readonly, to: Readonly, interpolationFactor: number): T;\r\nexport function slerp(from: Readonly, to: Readonly, interpolationFactor: number, out: T): T;\r\nexport function slerp(from: Readonly, to: Readonly, interpolationFactor: number, out: T | U = QuatUtils.clone(from)): T | U {\r\n if (interpolationFactor <= 0) {\r\n QuatUtils.copy(from, out);\r\n return out;\r\n } else if (interpolationFactor >= 1) {\r\n QuatUtils.copy(to, out);\r\n return out;\r\n }\r\n\r\n gl_quat.slerp(out as unknown as gl_quat_type, from as unknown as gl_quat_type, to as unknown as gl_quat_type, interpolationFactor);\r\n return out;\r\n}\r\n\r\nexport function interpolateSpherical(from: Readonly, to: Readonly, interpolationFactor: number, easingFunction?: EasingFunction): T;\r\nexport function interpolateSpherical(from: Readonly, to: Readonly, interpolationFactor: number, easingFunction: EasingFunction, out: T): T;\r\nexport function interpolateSpherical(from: Readonly, to: Readonly, interpolationFactor: number, easingFunction: EasingFunction = EasingFunction.linear, out: T | U = QuatUtils.clone(from)): T | U {\r\n const lerpFactor = easingFunction(interpolationFactor);\r\n return QuatUtils.slerp(from, to, lerpFactor, out);\r\n}\r\n\r\nexport function getAngle(quat: Readonly): number {\r\n return QuatUtils.getAngleDegrees(quat);\r\n}\r\n\r\nexport function getAngleDegrees(quat: Readonly): number {\r\n const angle = QuatUtils.getAngleRadians(quat);\r\n return MathUtils.toDegrees(angle);\r\n}\r\n\r\nexport const getAngleRadians = function () {\r\n const vector = vec3_utils_create();\r\n return function getAngleRadians(quat: Readonly): number {\r\n const angle = gl_quat.getAxisAngle(vector as unknown as gl_vec3_type, quat as unknown as gl_quat_type);\r\n return angle;\r\n };\r\n}();\r\n\r\nexport const getAxis = function () {\r\n const zero = vec3_utils_create(0, 0, 0);\r\n\r\n function getAxis(quat: Readonly): Vector3;\r\n function getAxis(quat: Readonly, out: T): T;\r\n function getAxis(quat: Readonly, out: Vector3 | T = Vec3Utils.create()): Vector3 | T {\r\n const angle = gl_quat.getAxisAngle(out as unknown as gl_vec3_type, quat as unknown as gl_quat_type);\r\n if (angle <= MathUtils.EPSILON) {\r\n Vec3Utils.copy(zero, out);\r\n }\r\n return out;\r\n }\r\n\r\n return getAxis;\r\n}();\r\n\r\n\r\nexport function getAxisScaled(quat: Readonly): Vector3;\r\nexport function getAxisScaled(quat: Readonly, out: T): T;\r\nexport function getAxisScaled(quat: Readonly, out: Vector3 | T = Vec3Utils.create()): Vector3 | T {\r\n return QuatUtils.getAxisScaledDegrees(quat, out);\r\n}\r\n\r\nexport function getAxisScaledDegrees(quat: Readonly): Vector3;\r\nexport function getAxisScaledDegrees(quat: Readonly, out: T): T;\r\nexport function getAxisScaledDegrees(quat: Readonly, out: Vector3 | T = Vec3Utils.create()): Vector3 | T {\r\n QuatUtils.getAxis(quat, out);\r\n const angle = QuatUtils.getAngleDegrees(quat);\r\n Vec3Utils.scale(out, angle, out);\r\n return out;\r\n}\r\n\r\nexport const getAxisScaledRadians = function () {\r\n const zero = vec3_utils_create(0, 0, 0);\r\n\r\n function getAxisScaledRadians(quat: Readonly): Vector3;\r\n function getAxisScaledRadians(quat: Readonly, out: T): T;\r\n function getAxisScaledRadians(quat: Readonly, out: Vector3 | T = Vec3Utils.create()): Vector3 | T {\r\n QuatUtils.getAxis(quat, out);\r\n const angle = QuatUtils.getAngleRadians(quat);\r\n if (angle <= MathUtils.EPSILON) {\r\n Vec3Utils.copy(zero, out);\r\n } else {\r\n Vec3Utils.scale(out, angle, out);\r\n }\r\n return out;\r\n }\r\n\r\n return getAxisScaledRadians;\r\n}();\r\n\r\nexport function getAxes(quat: Readonly): [Vector3, Vector3, Vector3];\r\nexport function getAxes(quat: Readonly, out: [T, U, V]): [T, U, V];\r\nexport function getAxes(quat: Readonly, out: [Vector3, Vector3, Vector3] | [T, U, V] = [Vec3Utils.create(), Vec3Utils.create(), Vec3Utils.create()]): [Vector3, Vector3, Vector3] | [T, U, V] {\r\n QuatUtils.getLeft(quat, out[0]);\r\n QuatUtils.getUp(quat, out[1]);\r\n QuatUtils.getForward(quat, out[2]);\r\n return out;\r\n}\r\n\r\nexport const getForward = function () {\r\n const rotationMatrix = mat3_utils_create();\r\n\r\n function getForward(quat: Readonly): Vector3;\r\n function getForward(quat: Readonly, out: T): T;\r\n function getForward(quat: Readonly, out: Vector3 | T = Vec3Utils.create()): Vector3 | T {\r\n QuatUtils.toMatrix(quat, rotationMatrix);\r\n\r\n Vec3Utils.set(out, rotationMatrix[6], rotationMatrix[7], rotationMatrix[8]);\r\n\r\n return out;\r\n }\r\n\r\n return getForward;\r\n}();\r\n\r\nexport function getBackward(quat: Readonly): Vector3;\r\nexport function getBackward(quat: Readonly, out: T): T;\r\nexport function getBackward(quat: Readonly, out?: Vector3 | T): Vector3 | T {\r\n out = QuatUtils.getForward(quat, out!);\r\n Vec3Utils.negate(out, out);\r\n return out!;\r\n}\r\n\r\nexport const getLeft = function () {\r\n const rotationMatrix = mat3_utils_create();\r\n\r\n function getLeft(quat: Readonly): Vector3;\r\n function getLeft(quat: Readonly, out: T): T;\r\n function getLeft(quat: Readonly, out: Vector3 | T = Vec3Utils.create()): Vector3 | T {\r\n QuatUtils.toMatrix(quat, rotationMatrix);\r\n\r\n Vec3Utils.set(out, rotationMatrix[0], rotationMatrix[1], rotationMatrix[2]);\r\n\r\n return out;\r\n }\r\n\r\n return getLeft;\r\n}();\r\n\r\nexport function getRight(quat: Readonly): Vector3;\r\nexport function getRight(quat: Readonly, out: T): T;\r\nexport function getRight(quat: Readonly, out?: Vector3 | T): Vector3 | T {\r\n out = QuatUtils.getLeft(quat, out!);\r\n Vec3Utils.negate(out, out);\r\n return out!;\r\n}\r\n\r\nexport const getUp = function () {\r\n const rotationMatrix = mat3_utils_create();\r\n\r\n function getUp(quat: Readonly): Vector3;\r\n function getUp(quat: Readonly, out: T): T;\r\n function getUp(quat: Readonly, out: Vector3 | T = Vec3Utils.create()): Vector3 | T {\r\n QuatUtils.toMatrix(quat, rotationMatrix);\r\n\r\n Vec3Utils.set(out, rotationMatrix[3], rotationMatrix[4], rotationMatrix[5]);\r\n\r\n return out;\r\n }\r\n\r\n return getUp;\r\n}();\r\n\r\nexport function getDown(quat: Readonly): Vector3;\r\nexport function getDown(quat: Readonly, out: T): T;\r\nexport function getDown(quat: Readonly, out?: Vector3 | T): Vector3 | T {\r\n out = QuatUtils.getUp(quat, out!);\r\n Vec3Utils.negate(out, out);\r\n return out!;\r\n}\r\n\r\nexport function setAxes(quat: T, left: Readonly, up: Readonly, forward: Readonly): T {\r\n if (forward != null) {\r\n return QuatUtils.setForward(quat, forward, up, left);\r\n } else if (up != null) {\r\n return QuatUtils.setUp(quat, up, forward, left);\r\n } else {\r\n return QuatUtils.setLeft(quat, left, up, forward);\r\n }\r\n}\r\n\r\nexport const setForward = function () {\r\n const axes: [Readonly | null, Readonly | null, Readonly | null] = [null, null, null];\r\n const priority = [2, 1, 0];\r\n return function setForward(quat: T, forward: Readonly, up?: Readonly, left?: Readonly): T {\r\n axes[0] = left!;\r\n axes[1] = up!;\r\n axes[2] = forward;\r\n\r\n _setAxes(quat, axes, priority);\r\n\r\n axes[0] = null;\r\n axes[1] = null;\r\n axes[2] = null;\r\n\r\n return quat;\r\n };\r\n}();\r\n\r\nexport const setBackward = function () {\r\n const forward = vec3_utils_create();\r\n\r\n const axes: [Readonly | null, Readonly | null, Readonly | null] = [null, null, null];\r\n const priority = [2, 1, 0];\r\n return function setBackward(quat: T, backward: Readonly, up?: Readonly, left?: Readonly): T {\r\n Vec3Utils.negate(backward, forward);\r\n\r\n axes[0] = left || null;\r\n axes[1] = up || null;\r\n axes[2] = forward;\r\n\r\n _setAxes(quat, axes, priority);\r\n\r\n axes[0] = null;\r\n axes[1] = null;\r\n axes[2] = null;\r\n\r\n return quat;\r\n };\r\n}();\r\n\r\nexport const setUp = function () {\r\n const axes: [Readonly | null, Readonly | null, Readonly | null] = [null, null, null];\r\n const priority = [1, 2, 0];\r\n return function setUp(quat: T, up: Readonly, forward?: Readonly, left?: Readonly): T {\r\n axes[0] = left || null;\r\n axes[1] = up;\r\n axes[2] = forward || null;\r\n\r\n _setAxes(quat, axes, priority);\r\n\r\n axes[0] = null;\r\n axes[1] = null;\r\n axes[2] = null;\r\n\r\n return quat;\r\n };\r\n}();\r\n\r\nexport const setDown = function () {\r\n const up = vec3_utils_create();\r\n\r\n const axes: [Readonly | null, Readonly | null, Readonly | null] = [null, null, null];\r\n const priority = [1, 2, 0];\r\n return function setDown(quat: T, down: Readonly, forward?: Readonly, left?: Readonly): T {\r\n Vec3Utils.negate(down, up);\r\n\r\n axes[0] = left || null;\r\n axes[1] = up;\r\n axes[2] = forward || null;\r\n\r\n _setAxes(quat, axes, priority);\r\n\r\n axes[0] = null;\r\n axes[1] = null;\r\n axes[2] = null;\r\n\r\n return quat;\r\n };\r\n}();\r\n\r\nexport const setLeft = function () {\r\n const axes: [Readonly | null, Readonly | null, Readonly | null] = [null, null, null];\r\n const priority = [0, 1, 2];\r\n return function setLeft(quat: T, left: Readonly, up?: Readonly, forward?: Readonly): T {\r\n axes[0] = left;\r\n axes[1] = up || null;\r\n axes[2] = forward || null;\r\n\r\n _setAxes(quat, axes, priority);\r\n\r\n axes[0] = null;\r\n axes[1] = null;\r\n axes[2] = null;\r\n\r\n return quat;\r\n };\r\n}();\r\n\r\nexport const setRight = function () {\r\n const left = vec3_utils_create();\r\n\r\n const axes: [Readonly | null, Readonly | null, Readonly | null] = [null, null, null];\r\n const priority = [0, 1, 2];\r\n return function setRight(quat: T, right: Readonly, up?: Readonly, forward?: Readonly): T {\r\n Vec3Utils.negate(right, left);\r\n\r\n axes[0] = left;\r\n axes[1] = up || null;\r\n axes[2] = forward || null;\r\n\r\n _setAxes(quat, axes, priority);\r\n\r\n axes[0] = null;\r\n axes[1] = null;\r\n axes[2] = null;\r\n\r\n return quat;\r\n };\r\n}();\r\n\r\nexport function toWorld(quat: Readonly, parentRotationQuat: Readonly): T;\r\nexport function toWorld(quat: Readonly, parentRotationQuat: Readonly, out: T): T;\r\nexport function toWorld(quat: Readonly, parentRotationQuat: Readonly, out: T | U = QuatUtils.clone(quat)): T | U {\r\n QuatUtils.mul(parentRotationQuat, quat, out);\r\n return out;\r\n}\r\n\r\nexport const toLocal = function () {\r\n const invertQuat = create();\r\n\r\n function toLocal(quat: Readonly, parentRotationQuat: Readonly): T;\r\n function toLocal(quat: Readonly, parentRotationQuat: Readonly, out: T): T;\r\n function toLocal(quat: Readonly, parentRotationQuat: Readonly, out: T | U = QuatUtils.clone(quat)): T | U {\r\n QuatUtils.conjugate(parentRotationQuat, invertQuat);\r\n QuatUtils.mul(invertQuat, quat, out);\r\n return out;\r\n }\r\n\r\n return toLocal;\r\n}();\r\n\r\nexport function fromDegrees(rotation: Readonly): Quaternion;\r\nexport function fromDegrees(rotation: Readonly, out: T): T;\r\nexport function fromDegrees(rotation: Readonly, out: Quaternion | T = QuatUtils.create()): Quaternion | T {\r\n gl_quat.fromEuler(out as unknown as gl_quat_type, rotation[0], rotation[1], rotation[2]);\r\n return out;\r\n}\r\n\r\nexport const fromRadians = function () {\r\n const vector = vec3_utils_create();\r\n\r\n function fromRadians(rotation: Readonly): Quaternion;\r\n function fromRadians(rotation: Readonly, out: T): T;\r\n function fromRadians(rotation: Readonly, out: Quaternion | T = QuatUtils.create()): Quaternion | T {\r\n Vec3Utils.toDegrees(rotation, vector);\r\n return QuatUtils.fromDegrees(vector, out);\r\n }\r\n\r\n return fromRadians;\r\n}();\r\n\r\nexport function fromAxis(angle: number, axis: Readonly): Quaternion;\r\nexport function fromAxis(angle: number, axis: Readonly, out: T): T;\r\nexport function fromAxis(angle: number, axis: Readonly, out: Quaternion | T = QuatUtils.create()): Quaternion | T {\r\n return QuatUtils.fromAxisDegrees(angle, axis, out);\r\n}\r\n\r\nexport function fromAxisDegrees(angle: number, axis: Readonly): Quaternion;\r\nexport function fromAxisDegrees(angle: number, axis: Readonly, out: T): T;\r\nexport function fromAxisDegrees(angle: number, axis: Readonly, out: Quaternion | T = QuatUtils.create()): Quaternion | T {\r\n QuatUtils.fromAxisRadians(MathUtils.toRadians(angle), axis, out);\r\n return out;\r\n}\r\n\r\nexport function fromAxisRadians(angle: number, axis: Readonly): Quaternion;\r\nexport function fromAxisRadians(angle: number, axis: Readonly, out: T): T;\r\nexport function fromAxisRadians(angle: number, axis: Readonly, out: Quaternion | T = QuatUtils.create()): Quaternion | T {\r\n gl_quat.setAxisAngle(out as unknown as gl_quat_type, axis as unknown as gl_vec3_type, angle);\r\n return out;\r\n}\r\n\r\nexport const fromAxes = function () {\r\n const matrix = mat3_utils_create();\r\n\r\n function fromAxes(left: Readonly, up: Readonly, forward: Readonly): Quaternion;\r\n function fromAxes(left: Readonly, up: Readonly, forward: Readonly, out: T): T;\r\n function fromAxes(left: Readonly, up: Readonly, forward: Readonly, out: Quaternion | T = QuatUtils.create()): Quaternion | T {\r\n Mat3Utils.fromAxes(left, up, forward, matrix);\r\n return Mat3Utils.toQuat(matrix, out);\r\n }\r\n\r\n return fromAxes;\r\n}();\r\n\r\nexport function toDegrees(quat: Readonly): Vector3;\r\nexport function toDegrees(quat: Readonly, out: T): T;\r\nexport function toDegrees(quat: Readonly, out: Vector3 | T = Vec3Utils.create()): Vector3 | T {\r\n QuatUtils.toRadians(quat, out);\r\n Vec3Utils.toDegrees(out, out);\r\n return out;\r\n}\r\n\r\nexport const toRadians = function () {\r\n const matrix = mat3_utils_create();\r\n\r\n function toRadians(quat: Readonly): Vector3;\r\n function toRadians(quat: Readonly, out: T): T;\r\n function toRadians(quat: Readonly, out: Vector3 | T = Vec3Utils.create()): Vector3 | T {\r\n QuatUtils.toMatrix(quat, matrix);\r\n\r\n // Rotation order is ZYX \r\n out[1] = Math.asin(-MathUtils.clamp(matrix[2], -1, 1));\r\n\r\n if (Math.abs(matrix[2]) < (1 - MathUtils.EPSILON)) {\r\n out[0] = Math.atan2(matrix[5], matrix[8]);\r\n out[2] = Math.atan2(matrix[1], matrix[0]);\r\n } else {\r\n out[0] = 0;\r\n out[2] = Math.atan2(-matrix[3], matrix[4]);\r\n }\r\n\r\n return out;\r\n }\r\n\r\n return toRadians;\r\n}();\r\n\r\nexport function toMatrix(quat: Readonly): Matrix3;\r\nexport function toMatrix(quat: Readonly, out: T): T;\r\nexport function toMatrix(quat: Readonly, out: Matrix3 | T = Mat3Utils.create()): Matrix3 | T {\r\n gl_mat3.fromQuat(out as unknown as gl_mat3_type, quat as unknown as gl_quat_type);\r\n return out;\r\n}\r\n\r\nexport function addRotation(first: Readonly, second: Readonly): T;\r\nexport function addRotation(first: Readonly, second: Readonly, out: T): T;\r\nexport function addRotation(first: Readonly, second: Readonly, out?: T | U): T | U {\r\n return QuatUtils.addRotationDegrees(first, second, out!);\r\n}\r\n\r\nexport const addRotationDegrees = function () {\r\n const secondQuat = create();\r\n\r\n function addRotationDegrees(first: Readonly, second: Readonly): T;\r\n function addRotationDegrees(first: Readonly, second: Readonly, out: T): T;\r\n function addRotationDegrees(first: Readonly, second: Readonly, out?: T | U): T | U {\r\n Vec3Utils.degreesToQuat(second, secondQuat);\r\n return QuatUtils.addRotationQuat(first, secondQuat, out!);\r\n }\r\n\r\n return addRotationDegrees;\r\n}();\r\n\r\nexport const addRotationRadians = function () {\r\n const secondQuat = create();\r\n\r\n function addRotationRadians(first: Readonly, second: Readonly): T;\r\n function addRotationRadians(first: Readonly, second: Readonly, out: T): T;\r\n function addRotationRadians(first: Readonly, second: Readonly, out?: T | U): T | U {\r\n Vec3Utils.radiansToQuat(second, secondQuat);\r\n return QuatUtils.addRotationQuat(first, secondQuat, out!);\r\n }\r\n\r\n return addRotationRadians;\r\n}();\r\n\r\nexport function addRotationQuat(first: Readonly, second: Readonly): T;\r\nexport function addRotationQuat(first: Readonly, second: Readonly, out: T): T;\r\nexport function addRotationQuat(first: Readonly, second: Readonly, out: T | U = QuatUtils.clone(first)): T | U {\r\n QuatUtils.mul(second, first, out);\r\n return out;\r\n}\r\n\r\nexport function subRotation(first: Readonly, second: Readonly): T;\r\nexport function subRotation(first: Readonly, second: Readonly, out: T): T;\r\nexport function subRotation(first: Readonly, second: Readonly, out?: T | U): T | U {\r\n return QuatUtils.subRotationDegrees(first, second, out!);\r\n}\r\n\r\nexport const subRotationDegrees = function () {\r\n const secondQuat = create();\r\n\r\n function subRotationDegrees(first: Readonly, second: Readonly): T;\r\n function subRotationDegrees(first: Readonly, second: Readonly, out: T): T;\r\n function subRotationDegrees(first: Readonly, second: Readonly, out?: T | U): T | U {\r\n Vec3Utils.degreesToQuat(second, secondQuat);\r\n return QuatUtils.subRotationQuat(first, secondQuat, out!);\r\n }\r\n\r\n return subRotationDegrees;\r\n}();\r\n\r\nexport const subRotationRadians = function () {\r\n const secondQuat = create();\r\n\r\n function subRotationRadians(first: Readonly, second: Readonly): T;\r\n function subRotationRadians(first: Readonly, second: Readonly, out: T): T;\r\n function subRotationRadians(first: Readonly, second: Readonly, out?: T | U): T | U {\r\n Vec3Utils.radiansToQuat(second, secondQuat);\r\n return QuatUtils.subRotationQuat(first, secondQuat, out!);\r\n }\r\n\r\n return subRotationRadians;\r\n}();\r\n\r\nexport const subRotationQuat = function () {\r\n const inverse = create();\r\n\r\n function subRotationQuat(first: Readonly, second: Readonly): T;\r\n function subRotationQuat(first: Readonly, second: Readonly, out: T): T;\r\n function subRotationQuat(first: Readonly, second: Readonly, out: T | U = QuatUtils.clone(first)): T | U {\r\n QuatUtils.invert(second, inverse);\r\n QuatUtils.mul(first, inverse, out);\r\n return out;\r\n }\r\n\r\n return subRotationQuat;\r\n}();\r\n\r\nexport function rotationTo(from: Readonly, to: Readonly): T;\r\nexport function rotationTo(from: Readonly, to: Readonly, out: T): T;\r\nexport function rotationTo(from: Readonly, to: Readonly, out?: T | U): T | U {\r\n return QuatUtils.rotationToDegrees(from, to, out!);\r\n}\r\n\r\nexport const rotationToDegrees = function () {\r\n const toQuat = create();\r\n\r\n function rotationToDegrees(from: Readonly, to: Readonly): T;\r\n function rotationToDegrees(from: Readonly, to: Readonly, out: T): T;\r\n function rotationToDegrees(from: Readonly, to: Readonly, out?: T | U): T | U {\r\n Vec3Utils.degreesToQuat(to, toQuat);\r\n return QuatUtils.rotationToQuat(from, toQuat, out!);\r\n }\r\n\r\n return rotationToDegrees;\r\n}();\r\n\r\nexport const rotationToRadians = function () {\r\n const toQuat = create();\r\n\r\n function rotationToRadians(from: Readonly, to: Readonly): T;\r\n function rotationToRadians(from: Readonly, to: Readonly, out: T): T;\r\n function rotationToRadians(from: Readonly, to: Readonly, out?: T | U): T | U {\r\n Vec3Utils.radiansToQuat(to, toQuat);\r\n return QuatUtils.rotationToQuat(from, toQuat, out!);\r\n }\r\n\r\n return rotationToRadians;\r\n}();\r\n\r\nexport function rotationToQuat(from: Readonly, to: Readonly): T;\r\nexport function rotationToQuat(from: Readonly, to: Readonly, out: T): T;\r\nexport function rotationToQuat(from: Readonly, to: Readonly, out?: T | U): T | U {\r\n return QuatUtils.normalize(QuatUtils.subRotationQuat(to, from, out!), out!);\r\n}\r\n\r\n\r\nexport function rotationAroundAxis(quat: Readonly, axis: Readonly): T;\r\nexport function rotationAroundAxis(quat: Readonly, axis: Readonly, out: T): T;\r\nexport function rotationAroundAxis(quat: Readonly, axis: Readonly, out?: T | U): T | U {\r\n return QuatUtils.rotationAroundAxisDegrees(quat, axis, out!);\r\n}\r\n\r\nexport const rotationAroundAxisDegrees = function () {\r\n const rotationAroundQuat = create();\r\n\r\n function rotationAroundAxisDegrees(quat: Readonly, axis: Readonly): T;\r\n function rotationAroundAxisDegrees(quat: Readonly, axis: Readonly, out: T): T;\r\n function rotationAroundAxisDegrees(quat: Readonly, axis: Readonly, out: T | U = Vec3Utils.clone(axis)): T | U {\r\n QuatUtils.rotationAroundAxisQuat(quat, axis, rotationAroundQuat);\r\n return QuatUtils.toDegrees(rotationAroundQuat, out);\r\n }\r\n\r\n return rotationAroundAxisDegrees;\r\n}();\r\n\r\nexport const rotationAroundAxisRadians = function () {\r\n const rotationAroundQuat = create();\r\n\r\n function rotationAroundAxisRadians(quat: Readonly, axis: Readonly): T;\r\n function rotationAroundAxisRadians(quat: Readonly, axis: Readonly, out: T): T;\r\n function rotationAroundAxisRadians(quat: Readonly, axis: Readonly, out: T | U = Vec3Utils.clone(axis)): T | U {\r\n QuatUtils.rotationAroundAxisQuat(quat, axis, rotationAroundQuat);\r\n return QuatUtils.toRadians(rotationAroundQuat, out);\r\n }\r\n\r\n return rotationAroundAxisRadians;\r\n}();\r\n\r\nexport function rotationAroundAxisQuat(quat: Readonly, axis: Readonly): T;\r\nexport function rotationAroundAxisQuat(quat: Readonly, axis: Readonly, out: T): T;\r\nexport function rotationAroundAxisQuat(quat: Readonly, axis: Readonly, out: T | U = QuatUtils.clone(quat)): T | U {\r\n return QuatUtils.getTwist(quat, axis, out);\r\n}\r\n\r\nexport const getTwist = function () {\r\n const rotationAxis = vec3_utils_create();\r\n const projection = vec3_utils_create();\r\n const rotationAlongAxis = create();\r\n\r\n function getTwist(quat: Readonly, axis: Readonly): T;\r\n function getTwist(quat: Readonly, axis: Readonly, out: T): T;\r\n function getTwist(quat: Readonly, axis: Readonly, out: T | U = QuatUtils.clone(quat)): T | U {\r\n rotationAxis[0] = quat[0];\r\n rotationAxis[1] = quat[1];\r\n rotationAxis[2] = quat[2];\r\n\r\n const dotProd = Vec3Utils.dot(axis, rotationAxis);\r\n Vec3Utils.scale(axis, dotProd, projection);\r\n rotationAlongAxis[0] = projection[0];\r\n rotationAlongAxis[1] = projection[1];\r\n rotationAlongAxis[2] = projection[2];\r\n rotationAlongAxis[3] = quat[3];\r\n QuatUtils.normalize(rotationAlongAxis, rotationAlongAxis);\r\n if (dotProd < 0) {\r\n rotationAlongAxis[0] = -rotationAlongAxis[0];\r\n rotationAlongAxis[1] = -rotationAlongAxis[1];\r\n rotationAlongAxis[2] = -rotationAlongAxis[2];\r\n rotationAlongAxis[3] = -rotationAlongAxis[3];\r\n }\r\n\r\n return QuatUtils.copy(rotationAlongAxis, out);\r\n }\r\n\r\n return getTwist;\r\n}();\r\n\r\nexport const getSwing = function () {\r\n const twist = create();\r\n\r\n function getSwing(quat: Readonly, axis: Readonly): T;\r\n function getSwing(quat: Readonly, axis: Readonly, out: T): T;\r\n function getSwing(quat: Readonly, axis: Readonly, out: T | U = QuatUtils.clone(quat)): T | U {\r\n QuatUtils.getTwist(quat, axis, twist);\r\n QuatUtils.getSwingFromTwist(quat, twist, out);\r\n return out;\r\n }\r\n\r\n return getSwing;\r\n}();\r\n\r\nexport function getSwingFromTwist(quat: Readonly, axis: Readonly): T;\r\nexport function getSwingFromTwist(quat: Readonly, axis: Readonly, out: T): T;\r\nexport function getSwingFromTwist(quat: Readonly, twist: Readonly, out: T | U = QuatUtils.clone(quat)): T | U {\r\n return QuatUtils.subRotationQuat(quat, twist, out);\r\n}\r\n\r\nexport const getTwistFromSwing = function () {\r\n const inverse = create();\r\n\r\n function getTwistFromSwing(quat: Readonly, swing: Readonly): T;\r\n function getTwistFromSwing(quat: Readonly, swing: Readonly, out: T): T;\r\n function getTwistFromSwing(quat: Readonly, swing: Readonly, out: T | U = QuatUtils.clone(quat)): T | U {\r\n QuatUtils.conjugate(swing, inverse);\r\n QuatUtils.addRotationQuat(quat, inverse, out);\r\n return out;\r\n }\r\n\r\n return getTwistFromSwing;\r\n}();\r\n\r\nexport function fromTwistSwing(twist: Readonly, swing: Readonly): T;\r\nexport function fromTwistSwing(twist: Readonly, swing: Readonly, out: T): T;\r\nexport function fromTwistSwing(twist: Readonly, swing: Readonly, out: T | U = QuatUtils.clone(twist)): T | U {\r\n return QuatUtils.addRotationQuat(twist, swing, out);\r\n}\r\n\r\nexport function rotate(first: Readonly, second: Readonly): T;\r\nexport function rotate(first: Readonly, second: Readonly, out: T): T;\r\nexport function rotate(first: Readonly, second: Readonly, out?: T | U): T | U {\r\n return QuatUtils.rotateDegrees(first, second, out!);\r\n}\r\n\r\nexport function rotateDegrees(first: Readonly, second: Readonly): T;\r\nexport function rotateDegrees(first: Readonly, second: Readonly, out: T): T;\r\nexport function rotateDegrees(first: Readonly, second: Readonly, out?: T | U): T | U {\r\n return QuatUtils.addRotationDegrees(first, second, out!);\r\n}\r\n\r\nexport function rotateRadians(first: Readonly, second: Readonly): T;\r\nexport function rotateRadians(first: Readonly, second: Readonly, out: T): T;\r\nexport function rotateRadians(first: Readonly, second: Readonly, out?: T | U): T | U {\r\n return QuatUtils.addRotationRadians(first, second, out!);\r\n}\r\n\r\nexport function rotateQuat(first: Readonly, second: Readonly): T;\r\nexport function rotateQuat(first: Readonly, second: Readonly, out: T): T;\r\nexport function rotateQuat(first: Readonly, second: Readonly, out?: T | U): T | U {\r\n return QuatUtils.addRotationQuat(first, second, out!);\r\n}\r\n\r\nexport function rotateAxis(quat: Readonly, angle: number, axis: Readonly): T;\r\nexport function rotateAxis(quat: Readonly, angle: number, axis: Readonly, out?: T): T;\r\nexport function rotateAxis(quat: Readonly, angle: number, axis: Readonly, out?: T | U): T | U {\r\n return QuatUtils.rotateAxisDegrees(quat, angle, axis, out);\r\n}\r\n\r\nexport const rotateAxisDegrees = function () {\r\n const secondQuat = create();\r\n\r\n function rotateAxisDegrees(quat: Readonly, angle: number, axis: Readonly): T;\r\n function rotateAxisDegrees(quat: Readonly, angle: number, axis: Readonly, out?: T): T;\r\n function rotateAxisDegrees(quat: Readonly, angle: number, axis: Readonly, out?: T | U): T | U {\r\n QuatUtils.fromAxisDegrees(angle, axis, secondQuat);\r\n return QuatUtils.rotateQuat(quat, secondQuat, out!);\r\n }\r\n\r\n return rotateAxisDegrees;\r\n}();\r\n\r\nexport const rotateAxisRadians = function () {\r\n const secondQuat = create();\r\n\r\n function rotateAxisRadians(quat: Readonly, angle: number, axis: Readonly): T;\r\n function rotateAxisRadians(quat: Readonly, angle: number, axis: Readonly, out?: T): T;\r\n function rotateAxisRadians(quat: Readonly, angle: number, axis: Readonly, out?: T | U): T | U {\r\n QuatUtils.fromAxisRadians(angle, axis, secondQuat);\r\n return QuatUtils.rotateQuat(quat, secondQuat, out!);\r\n }\r\n\r\n return rotateAxisRadians;\r\n}();\r\n\r\n/**\r\n * How to use\r\n * \r\n * By default rotations are in `Degrees` and transforms are `Matrix4` (and not `Quat2`) \r\n * For functions that work with rotations, `Matrix` means `Matrix3` and `Quat` means `Quat` \r\n * For functions that work with transforms, `Matrix` means `Matrix4` and `Quat` means `Quat2`\r\n * \r\n * For rotations u can add a suffix like `Degrees`/`Radians`/`Quat`/`Matrix` to use a specific version, example: \r\n * - `getAngleRadians` \r\n * - `addRotationQuat`\r\n * \r\n * The functions leave u the choice of forwarding an out parameter or just get the return value, example: \r\n * - `let forward = QuatUtils.getForward(quat)` \r\n * - `QuatUtils.getForward(quat, forward)` \r\n * - the out parameter is always the last one\r\n */\r\nexport const QuatUtils = {\r\n create,\r\n getAllocationFunction,\r\n setAllocationFunction,\r\n set,\r\n copy,\r\n clone,\r\n equals,\r\n isNormalized,\r\n normalize,\r\n length,\r\n lengthSquared,\r\n identity,\r\n mul,\r\n invert,\r\n conjugate,\r\n lerp,\r\n interpolate,\r\n slerp,\r\n interpolateSpherical,\r\n getAngle,\r\n getAngleDegrees,\r\n getAngleRadians,\r\n getAxis,\r\n getAxisScaled,\r\n getAxisScaledDegrees,\r\n getAxisScaledRadians,\r\n getAxes,\r\n getForward,\r\n getBackward,\r\n getLeft,\r\n getRight,\r\n getUp,\r\n getDown,\r\n setAxes,\r\n setForward,\r\n setBackward,\r\n setUp,\r\n setDown,\r\n setLeft,\r\n setRight,\r\n toWorld,\r\n toLocal,\r\n addRotation,\r\n addRotationDegrees,\r\n addRotationRadians,\r\n addRotationQuat,\r\n subRotation,\r\n subRotationDegrees,\r\n subRotationRadians,\r\n subRotationQuat,\r\n rotationTo,\r\n rotationToDegrees,\r\n rotationToRadians,\r\n rotationToQuat,\r\n rotationAroundAxis,\r\n rotationAroundAxisDegrees,\r\n rotationAroundAxisRadians,\r\n rotationAroundAxisQuat,\r\n getTwist,\r\n getSwing,\r\n getSwingFromTwist,\r\n getTwistFromSwing,\r\n fromTwistSwing,\r\n rotate,\r\n rotateDegrees,\r\n rotateRadians,\r\n rotateQuat,\r\n rotateAxis,\r\n rotateAxisDegrees,\r\n rotateAxisRadians,\r\n fromDegrees,\r\n fromRadians,\r\n fromAxis,\r\n fromAxisDegrees,\r\n fromAxisRadians,\r\n fromAxes,\r\n toDegrees,\r\n toRadians,\r\n toMatrix\r\n} as const;\r\n\r\n\r\n\r\nconst _setAxes = function () {\r\n const fixedAxes = [vec3_utils_create(), vec3_utils_create(), vec3_utils_create()];\r\n\r\n const fixedAxesFixSignMap = [\r\n [1, -1, 1],\r\n [1, 1, -1],\r\n [-1, 1, -1]\r\n ];\r\n\r\n const fixedLeft = vec3_utils_create();\r\n const fixedUp = vec3_utils_create();\r\n const fixedForward = vec3_utils_create();\r\n\r\n const currentAxis = vec3_utils_create();\r\n\r\n const rotationAxis = vec3_utils_create();\r\n const rotationMat = mat3_utils_create();\r\n const rotationQuat = create();\r\n return function _setAxes(quat: Quaternion, axes: Readonly<[Readonly | null, Readonly | null, Readonly | null]>, priority: Readonly): Quaternion {\r\n const firstAxis = axes[priority[0]];\r\n const secondAxis = axes[priority[1]];\r\n const thirdAxis = axes[priority[2]];\r\n\r\n if (firstAxis == null || Vec3Utils.isZero(firstAxis, MathUtils.EPSILON)) {\r\n return quat;\r\n }\r\n\r\n let secondAxisValid = false;\r\n if (secondAxis != null) {\r\n const angleBetween = Vec3Utils.angleRadians(firstAxis, secondAxis);\r\n if (angleBetween > MathUtils.EPSILON) {\r\n secondAxisValid = true;\r\n }\r\n }\r\n\r\n let thirdAxisValid = false;\r\n if (thirdAxis != null) {\r\n const angleBetween = Vec3Utils.angleRadians(firstAxis, thirdAxis);\r\n if (angleBetween > MathUtils.EPSILON) {\r\n thirdAxisValid = true;\r\n }\r\n }\r\n\r\n if (secondAxisValid || thirdAxisValid) {\r\n let crossAxis = null;\r\n let secondAxisIndex = null;\r\n let thirdAxisIndex = null;\r\n if (secondAxisValid) {\r\n crossAxis = secondAxis;\r\n secondAxisIndex = 1;\r\n thirdAxisIndex = 2;\r\n } else {\r\n crossAxis = thirdAxis;\r\n secondAxisIndex = 2;\r\n thirdAxisIndex = 1;\r\n }\r\n\r\n const fixSignMap = fixedAxesFixSignMap[priority[0]];\r\n\r\n Vec3Utils.cross(firstAxis, crossAxis!, fixedAxes[thirdAxisIndex]);\r\n Vec3Utils.scale(fixedAxes[thirdAxisIndex], fixSignMap[priority[thirdAxisIndex]], fixedAxes[thirdAxisIndex]);\r\n\r\n Vec3Utils.cross(firstAxis, fixedAxes[thirdAxisIndex], fixedAxes[secondAxisIndex]);\r\n Vec3Utils.scale(fixedAxes[secondAxisIndex], fixSignMap[priority[secondAxisIndex]], fixedAxes[secondAxisIndex]);\r\n\r\n Vec3Utils.cross(fixedAxes[1], fixedAxes[2], fixedAxes[0]);\r\n Vec3Utils.scale(fixedAxes[0], fixSignMap[priority[0]], fixedAxes[0]);\r\n\r\n Vec3Utils.normalize(fixedAxes[ArrayUtils.findIndexEqual(priority, 0)], fixedLeft);\r\n Vec3Utils.normalize(fixedAxes[ArrayUtils.findIndexEqual(priority, 1)], fixedUp);\r\n Vec3Utils.normalize(fixedAxes[ArrayUtils.findIndexEqual(priority, 2)], fixedForward);\r\n\r\n Mat3Utils.set(rotationMat,\r\n fixedLeft[0], fixedLeft[1], fixedLeft[2],\r\n fixedUp[0], fixedUp[1], fixedUp[2],\r\n fixedForward[0], fixedForward[1], fixedForward[2]\r\n );\r\n\r\n Mat3Utils.toQuat(rotationMat, rotationQuat);\r\n\r\n QuatUtils.copy(rotationQuat, quat);\r\n } else {\r\n if (priority[0] == 0) {\r\n QuatUtils.getLeft(quat, currentAxis);\r\n } else if (priority[0] == 1) {\r\n QuatUtils.getUp(quat, currentAxis);\r\n } else {\r\n QuatUtils.getForward(quat, currentAxis);\r\n }\r\n\r\n const angleBetween = Vec3Utils.angleRadians(firstAxis, currentAxis);\r\n if (angleBetween > MathUtils.EPSILON) {\r\n Vec3Utils.cross(currentAxis, firstAxis, rotationAxis);\r\n Vec3Utils.normalize(rotationAxis, rotationAxis);\r\n\r\n if (Vec3Utils.isZero(rotationAxis)) {\r\n Vec3Utils.perpendicularAny(currentAxis, rotationAxis);\r\n Vec3Utils.normalize(rotationAxis, rotationAxis);\r\n }\r\n\r\n QuatUtils.fromAxisRadians(angleBetween, rotationAxis, rotationQuat);\r\n QuatUtils.rotateQuat(quat, rotationQuat, quat);\r\n }\r\n }\r\n\r\n return quat;\r\n };\r\n}();", "export type EasingFunction = (valueToEase: number) => number;\r\n\r\n/** #CREDITS https://easings.net */\r\nexport const EasingFunction = {\r\n linear: (valueToEase: number): number => valueToEase,\r\n\r\n easeInVeryWeak: (valueToEase: number): number => 1 - Math.cos((valueToEase * Math.PI) / 2),\r\n easeInWeak: (valueToEase: number): number => Math.pow(valueToEase, 2),\r\n easeIn: (valueToEase: number): number => Math.pow(valueToEase, 3),\r\n easeInStrong: (valueToEase: number): number => Math.pow(valueToEase, 4),\r\n easeInVeryStrong: (valueToEase: number): number => Math.pow(valueToEase, 5),\r\n\r\n easeOutVeryWeak: (valueToEase: number): number => Math.sin((valueToEase * Math.PI) / 2),\r\n easeOutWeak: (valueToEase: number): number => 1 - Math.pow(1 - valueToEase, 2),\r\n easeOut: (valueToEase: number): number => 1 - Math.pow(1 - valueToEase, 3),\r\n easeOutStrong: (valueToEase: number): number => 1 - Math.pow(1 - valueToEase, 4),\r\n easeOutVeryStrong: (valueToEase: number): number => 1 - Math.pow(1 - valueToEase, 5),\r\n\r\n easeInOutVeryWeak: (valueToEase: number): number => -(Math.cos(valueToEase * Math.PI) - 1) / 2,\r\n easeInOutWeak: (valueToEase: number): number => valueToEase < 0.5 ? 2 * Math.pow(valueToEase, 2) : 1 - Math.pow(-2 * valueToEase + 2, 2) / 2,\r\n easeInOut: (valueToEase: number): number => valueToEase < 0.5 ? 4 * Math.pow(valueToEase, 3) : 1 - Math.pow(-2 * valueToEase + 2, 3) / 2,\r\n easeInOutStrong: (valueToEase: number): number => valueToEase < 0.5 ? 8 * Math.pow(valueToEase, 4) : 1 - Math.pow(-2 * valueToEase + 2, 4) / 2,\r\n easeInOutVeryStrong: (valueToEase: number): number => valueToEase < 0.5 ? 16 * Math.pow(valueToEase, 5) : 1 - Math.pow(-2 * valueToEase + 2, 5) / 2\r\n} as const;\r\n\r\nexport enum EasingFunctionName {\r\n LINEAR = \"Linear\",\r\n\r\n EASE_IN_VERY_WEAK = \"Ease In Very Weak\",\r\n EASE_IN_WEAK = \"Ease In Weak\",\r\n EASE_IN = \"Ease In\",\r\n EASE_IN_STRONG = \"Ease In Strong\",\r\n EASE_IN_VERY_STRONG = \"Ease In Very Strong\",\r\n\r\n EASE_OUT_VERY_WEAK = \"Ease Out Very Weak\",\r\n EASE_OUT_WEAK = \"Ease Out Weak\",\r\n EASE_OUT = \"Ease Out\",\r\n EASE_OUT_STRONG = \"Ease Out Strong\",\r\n EASE_OUT_VERY_STRONG = \"Ease Out Very Strong\",\r\n\r\n EASE_IN_OUT_VERY_WEAK = \"Ease In/Out Very Weak\",\r\n EASE_IN_OUT_WEAK = \"Ease In/Out Weak\",\r\n EASE_IN_OUT = \"Ease In/Out\",\r\n EASE_IN_OUT_STRONG = \"Ease In/Out Strong\",\r\n EASE_IN_OUT_VERY_STRONG = \"Ease In/Out Very Strong\",\r\n}\r\n\r\nexport type WaveFunction = (inputValue: number) => number;\r\nexport const WaveFunction = {\r\n triangleWave: (inputValue: number): number => (2 / Math.PI) * Math.asin(Math.sin((Math.PI / 2) * inputValue)),\r\n positiveTriangleWave: (inputValue: number): number => 1 - Math.abs((Math.abs(inputValue) % 2) - 1)\r\n} as const;\r\n\r\nexport const EPSILON: number = 0.000001;\r\nexport const EPSILON_SQUARED: number = EPSILON * EPSILON;\r\nexport const EPSILON_DEGREES: number = 0.00001;\r\n\r\nexport function clamp(value: number, start: number = -Number.MAX_VALUE, end: number = Number.MAX_VALUE): number {\r\n const min = Math.min(start, end);\r\n const max = Math.max(start, end);\r\n return Math.min(Math.max(value, min), max);\r\n}\r\n\r\nexport function sign(value: number, zeroSign: number = 1): number {\r\n let sign = Math.sign(value);\r\n if (sign == 0) {\r\n sign = Math.sign(zeroSign);\r\n }\r\n return sign;\r\n}\r\n\r\nexport function toDegrees(angle: number): number {\r\n return angle * (180 / Math.PI);\r\n}\r\n\r\nexport function toRadians(angle: number): number {\r\n return angle * (Math.PI / 180);\r\n}\r\n\r\nexport function roundDecimal(number: number, decimalPlaces: number): number {\r\n const factor = Math.pow(10, decimalPlaces);\r\n number = Math.round(number * factor) / factor;\r\n\r\n return number;\r\n}\r\n\r\n/** Start range value doesn't need to be lower than the end one, so you can map from `[0, 1]` to `[3, 2]`, where `3` is greater than `2` */\r\nexport function mapToRange(value: number, originRangeStart: number, originRangeEnd: number, newRangeStart: number, newRangeEnd: number): number {\r\n if (originRangeStart == originRangeEnd) {\r\n return newRangeStart;\r\n }\r\n\r\n const clampedValue = MathUtils.clamp(value, originRangeStart, originRangeEnd);\r\n\r\n if (clampedValue == originRangeStart) {\r\n return newRangeStart;\r\n } else if (clampedValue == originRangeEnd) {\r\n return newRangeEnd;\r\n }\r\n\r\n const newValue = newRangeStart + ((newRangeEnd - newRangeStart) / (originRangeEnd - originRangeStart)) * (clampedValue - originRangeStart);\r\n const clampedNewValue = MathUtils.clamp(newValue, newRangeStart, newRangeEnd);\r\n return clampedNewValue;\r\n}\r\n\r\n/** Range is `[0, 1)` */\r\nexport function random(): number;\r\n/** Range is `[start, end)` */\r\nexport function random(start: number, end: number): number;\r\nexport function random(start: number = 0, end: number = 1): number {\r\n return Math.random() * (end - start) + start;\r\n}\r\n\r\n/** Range is `[start, end]` */\r\nexport function randomInt(start: number, end: number): number {\r\n const min = Math.min(start, end);\r\n const max = Math.max(start, end);\r\n return Math.floor(Math.random() * (max - min + 1) + min);\r\n}\r\n\r\nexport function randomBool(): boolean {\r\n return MathUtils.randomInt(0, 1) == 0;\r\n}\r\n\r\n/** Return `1` or `-1` */\r\nexport function randomSign(): number {\r\n return (Math.random() < 0.5) ? 1 : -1;\r\n}\r\n\r\n/** You give it a list of parameters and returns a random one */\r\nexport function randomPick(array: T[]): T | null;\r\nexport function randomPick(...args: T[]): T | null;\r\nexport function randomPick(...args: T[]): T | null {\r\n let random: T | null = null;\r\n\r\n if (args.length > 0) {\r\n if (args.length == 1 && (args[0] as T[]).length != null) {\r\n const arrayArg0 = args[0] as T[];\r\n if (arrayArg0.length > 0) {\r\n const randomIndex = MathUtils.randomInt(0, arrayArg0.length - 1);\r\n random = arrayArg0[randomIndex];\r\n }\r\n } else {\r\n const randomIndex = MathUtils.randomInt(0, args.length - 1);\r\n random = args[randomIndex];\r\n }\r\n }\r\n\r\n return random;\r\n}\r\n\r\nexport const randomUUID = function () {\r\n const uuidRandomValues = new Uint8Array(1);\r\n const uuidSkeleton = (1e7 + \"-\" + 1e3 + \"-\" + 4e3 + \"-\" + 8e3 + \"-\" + 1e11);\r\n const replaceUUIDSkeletonRegex = new RegExp(\"[018]\", \"g\");\r\n const replaceUUIDSkeletonCallback = function (charString: string): string {\r\n const digit = parseInt(charString.charAt(0));\r\n return (digit ^ ((crypto.getRandomValues(uuidRandomValues)[0] & 15)) >> (digit / 4)).toString(16);\r\n };\r\n return function randomUUID(): string {\r\n let uuid = \"\";\r\n\r\n if (crypto.randomUUID != null) {\r\n uuid = crypto.randomUUID();\r\n } else {\r\n uuid = uuidSkeleton.replace(replaceUUIDSkeletonRegex, replaceUUIDSkeletonCallback);\r\n }\r\n\r\n return uuid;\r\n };\r\n}();\r\n\r\n/** `[from, to]` range is mapped to an `interpolationFactor` in the range `[0, 1]` */\r\nexport function lerp(from: number, to: number, interpolationFactor: number): number {\r\n if (interpolationFactor <= 0) {\r\n return from;\r\n } else if (interpolationFactor >= 1) {\r\n return to;\r\n }\r\n\r\n return interpolationFactor * (to - from) + from;\r\n}\r\n\r\n/** `[from, to]` range is mapped to an `interpolationFactor` in the range `[0, 1]` */\r\nexport function interpolate(from: number, to: number, interpolationFactor: number, easingFunction: EasingFunction = EasingFunction.linear): number {\r\n const lerpFactor = easingFunction(interpolationFactor);\r\n return MathUtils.lerp(from, to, lerpFactor);\r\n}\r\n\r\n/** `[from, to]` range is mapped to an `interpolationFactor` in the range `[0, 1]` \r\n `interpolationFactor` can go outside the `[0, 1]` range, periodically repeating the interpolation in the given range */\r\nexport function interpolatePeriodic(from: number, to: number, interpolationFactor: number, easingFunction: EasingFunction = EasingFunction.linear): number {\r\n const adjustedInterpolationFactor = WaveFunction.positiveTriangleWave(interpolationFactor);\r\n return MathUtils.interpolate(from, to, adjustedInterpolationFactor, easingFunction);\r\n}\r\n\r\nexport function getEasingFunctionByName(easingFunctionName: EasingFunctionName): EasingFunction {\r\n let easingFunction = EasingFunction.linear;\r\n\r\n switch (easingFunctionName) {\r\n case EasingFunctionName.LINEAR:\r\n easingFunction = EasingFunction.linear;\r\n break;\r\n\r\n case EasingFunctionName.EASE_IN_VERY_WEAK:\r\n easingFunction = EasingFunction.easeInVeryWeak;\r\n break;\r\n case EasingFunctionName.EASE_IN_WEAK:\r\n easingFunction = EasingFunction.easeInWeak;\r\n break;\r\n case EasingFunctionName.EASE_IN:\r\n easingFunction = EasingFunction.easeIn;\r\n break;\r\n case EasingFunctionName.EASE_IN_STRONG:\r\n easingFunction = EasingFunction.easeInStrong;\r\n break;\r\n case EasingFunctionName.EASE_IN_VERY_STRONG:\r\n easingFunction = EasingFunction.easeInVeryStrong;\r\n break;\r\n\r\n case EasingFunctionName.EASE_OUT_VERY_WEAK:\r\n easingFunction = EasingFunction.easeOutVeryWeak;\r\n break;\r\n case EasingFunctionName.EASE_OUT_WEAK:\r\n easingFunction = EasingFunction.easeOutWeak;\r\n break;\r\n case EasingFunctionName.EASE_OUT:\r\n easingFunction = EasingFunction.easeOut;\r\n break;\r\n case EasingFunctionName.EASE_OUT_STRONG:\r\n easingFunction = EasingFunction.easeOutStrong;\r\n break;\r\n case EasingFunctionName.EASE_OUT_VERY_STRONG:\r\n easingFunction = EasingFunction.easeOutVeryStrong;\r\n break;\r\n\r\n case EasingFunctionName.EASE_IN_OUT_VERY_WEAK:\r\n easingFunction = EasingFunction.easeInOutVeryWeak;\r\n break;\r\n case EasingFunctionName.EASE_IN_OUT_WEAK:\r\n easingFunction = EasingFunction.easeInOutWeak;\r\n break;\r\n case EasingFunctionName.EASE_IN_OUT:\r\n easingFunction = EasingFunction.easeInOut;\r\n break;\r\n case EasingFunctionName.EASE_IN_OUT_STRONG:\r\n easingFunction = EasingFunction.easeInOutStrong;\r\n break;\r\n case EasingFunctionName.EASE_IN_OUT_VERY_STRONG:\r\n easingFunction = EasingFunction.easeInOutVeryStrong;\r\n break;\r\n }\r\n\r\n return easingFunction;\r\n}\r\n\r\nexport function getEasingFunctionNameByIndex(index: number): EasingFunctionName | null {\r\n let easingFunctionName: EasingFunctionName | null = null;\r\n\r\n switch (index) {\r\n case 0:\r\n easingFunctionName = EasingFunctionName.LINEAR;\r\n break;\r\n\r\n case 1:\r\n easingFunctionName = EasingFunctionName.EASE_IN_VERY_WEAK;\r\n break;\r\n case 2:\r\n easingFunctionName = EasingFunctionName.EASE_IN_WEAK;\r\n break;\r\n case 3:\r\n easingFunctionName = EasingFunctionName.EASE_IN;\r\n break;\r\n case 4:\r\n easingFunctionName = EasingFunctionName.EASE_IN_STRONG;\r\n break;\r\n case 5:\r\n easingFunctionName = EasingFunctionName.EASE_IN_VERY_STRONG;\r\n break;\r\n\r\n case 6:\r\n easingFunctionName = EasingFunctionName.EASE_OUT_VERY_WEAK;\r\n break;\r\n case 7:\r\n easingFunctionName = EasingFunctionName.EASE_OUT_WEAK;\r\n break;\r\n case 8:\r\n easingFunctionName = EasingFunctionName.EASE_OUT;\r\n break;\r\n case 9:\r\n easingFunctionName = EasingFunctionName.EASE_OUT_STRONG;\r\n break;\r\n case 10:\r\n easingFunctionName = EasingFunctionName.EASE_OUT_VERY_STRONG;\r\n break;\r\n\r\n case 11:\r\n easingFunctionName = EasingFunctionName.EASE_IN_OUT_VERY_WEAK;\r\n break;\r\n case 12:\r\n easingFunctionName = EasingFunctionName.EASE_IN_OUT_WEAK;\r\n break;\r\n case 13:\r\n easingFunctionName = EasingFunctionName.EASE_IN_OUT;\r\n break;\r\n case 14:\r\n easingFunctionName = EasingFunctionName.EASE_IN_OUT_STRONG;\r\n break;\r\n case 15:\r\n easingFunctionName = EasingFunctionName.EASE_IN_OUT_VERY_STRONG;\r\n break;\r\n }\r\n\r\n return easingFunctionName;\r\n}\r\n\r\nexport function angleDistance(from: number, to: number): number {\r\n return MathUtils.angleDistanceDegrees(from, to);\r\n}\r\n\r\nexport function angleDistanceDegrees(from: number, to: number): number {\r\n return Math.abs(MathUtils.angleDistanceSignedDegrees(from, to));\r\n}\r\n\r\nexport function angleDistanceRadians(from: number, to: number): number {\r\n return Math.abs(MathUtils.angleDistanceSignedRadians(from, to));\r\n}\r\n\r\nexport function angleDistanceSigned(from: number, to: number): number {\r\n return MathUtils.angleDistanceSignedDegrees(from, to);\r\n}\r\n\r\nexport function angleDistanceSignedDegrees(from: number, to: number): number {\r\n const clampedFrom = MathUtils.angleClampDegrees(from, true);\r\n const clampedTo = MathUtils.angleClampDegrees(to, true);\r\n\r\n let distance = clampedTo - clampedFrom;\r\n if (clampedTo - clampedFrom > 180) {\r\n distance = (clampedTo - clampedFrom) - 360;\r\n } else if (clampedTo - clampedFrom < -180) {\r\n distance = (clampedTo - clampedFrom) + 360;\r\n }\r\n\r\n return distance;\r\n}\r\n\r\nexport function angleDistanceSignedRadians(from: number, to: number): number {\r\n return MathUtils.toRadians(MathUtils.angleDistanceSignedDegrees(MathUtils.toDegrees(from), MathUtils.toDegrees(to)));\r\n}\r\n\r\n/** Clamp the angle to `-180 / +180`, so that, for example, `270` will be `-90` \r\n If `usePositiveRange` is `true`, the angle will be clamped to `0 / 360` */\r\nexport function angleClamp(angle: number, usePositiveRange: boolean = false): number {\r\n return MathUtils.angleClampDegrees(angle, usePositiveRange);\r\n}\r\n\r\n/** Clamp the angle to `-180 / +180`, so that, for example, `270` will be `-90` \r\n If `usePositiveRange` is `true`, the angle will be clamped to `0 / 360` */\r\nexport function angleClampDegrees(angle: number, usePositiveRange: boolean = false): number {\r\n let clampedAngle = angle % 360;\r\n\r\n if (clampedAngle < 0) {\r\n clampedAngle += 360;\r\n }\r\n\r\n if (!usePositiveRange) {\r\n if (clampedAngle > 180) {\r\n clampedAngle -= 360;\r\n }\r\n }\r\n\r\n return clampedAngle;\r\n}\r\n\r\n\r\n/** Clamp the angle to `-PI / +PI`, so that, for example, `1.5PI` will be `-0.5PI` \r\n If `usePositiveRange` is `true`, the angle will be clamped to `0 / 2PI` */\r\nexport function angleClampRadians(angle: number, usePositiveRange: boolean = false): number {\r\n return MathUtils.toRadians(MathUtils.angleClampDegrees(MathUtils.toDegrees(angle), usePositiveRange));\r\n}\r\n\r\n/** The range goes from `start` to `end` by going toward the positive direction (if `useShortestAngle` is `false`) \r\n `[20, 300]` is a `280` degrees range, `[300, 20]` is an `80` degrees range, \r\n `[-150, -170]` = `[210, 190]` is a `240` degrees range, \r\n `[0, -10]` = `[0, 350]` is a `350` degrees range */\r\nexport function isInsideAngleRange(angle: number, start: number, end: number, useShortestAngle: boolean = false): boolean {\r\n return MathUtils.isInsideAngleRangeDegrees(angle, start, end, useShortestAngle);\r\n}\r\n\r\nexport function isInsideAngleRangeDegrees(angle: number, start: number, end: number, useShortestAngle: boolean = false): boolean {\r\n let insideAngleRange = false;\r\n\r\n const anglePositive = MathUtils.angleClampDegrees(angle, true);\r\n let startPositive = MathUtils.angleClampDegrees(start, true);\r\n let endPositive = MathUtils.angleClampDegrees(end, true);\r\n\r\n if (useShortestAngle) {\r\n if (MathUtils.angleDistanceSignedDegrees(startPositive, endPositive) < 0) {\r\n const temp = startPositive;\r\n startPositive = endPositive;\r\n endPositive = temp;\r\n }\r\n }\r\n\r\n if (startPositive < endPositive) {\r\n insideAngleRange = anglePositive >= startPositive && anglePositive <= endPositive;\r\n } else {\r\n insideAngleRange = anglePositive >= startPositive || anglePositive <= endPositive;\r\n }\r\n\r\n return insideAngleRange;\r\n}\r\n\r\nexport function isInsideAngleRangeRadians(angle: number, start: number, end: number, useShortestAngle: boolean = false): boolean {\r\n return MathUtils.isInsideAngleRangeDegrees(MathUtils.toDegrees(angle), MathUtils.toDegrees(start), MathUtils.toDegrees(end), useShortestAngle);\r\n}\r\n\r\n/**\r\n * How to use\r\n * \r\n * By default the rotations are in `Degrees`\r\n * \r\n * For rotations u can add a suffix like `Degrees`/`Radians` to use a specific version, example: \r\n * - `angleDistanceSignedDegrees` \r\n * - `isInsideAngleRangeRadians`\r\n */\r\nexport const MathUtils = {\r\n EPSILON,\r\n EPSILON_SQUARED,\r\n EPSILON_DEGREES,\r\n clamp,\r\n sign,\r\n toDegrees,\r\n toRadians,\r\n roundDecimal,\r\n mapToRange,\r\n random,\r\n randomInt,\r\n randomBool,\r\n randomSign,\r\n randomPick,\r\n randomUUID,\r\n lerp,\r\n interpolate,\r\n interpolatePeriodic,\r\n getEasingFunctionByName,\r\n getEasingFunctionNameByIndex,\r\n angleDistance,\r\n angleDistanceDegrees,\r\n angleDistanceRadians,\r\n angleDistanceSigned,\r\n angleDistanceSignedDegrees,\r\n angleDistanceSignedRadians,\r\n angleClamp,\r\n angleClampDegrees,\r\n angleClampRadians,\r\n isInsideAngleRange,\r\n isInsideAngleRangeDegrees,\r\n isInsideAngleRangeRadians,\r\n} as const;", "import { ArrayLike, DynamicArrayLike } from \"../../type_definitions/array_type_definitions.js\";\r\n\r\nexport function copy, T>(from: Readonly>, to: ArrayType, copyCallback?: (fromElement: T, toElement: T) => T): ArrayType {\r\n const _to = to as (ArrayType & { pop: () => T | undefined });\r\n if (_to.pop != null) {\r\n while (to.length > from.length) {\r\n _to.pop();\r\n }\r\n }\r\n\r\n for (let i = 0; i < from.length; i++) {\r\n if (copyCallback == null) {\r\n to[i] = from[i];\r\n } else {\r\n to[i] = copyCallback(from[i], to[i]);\r\n }\r\n }\r\n\r\n return to;\r\n}\r\n\r\n/** The overload where `ArrayType extends ArrayLike` does also get `array` as `Readonly`, but is not marked as such due to \r\n Typescript having issues with inferring the proper type of `ArrayType` when `Readonly` */\r\nexport function clone, T>(array: Readonly, cloneCallback?: (elementToClone: T) => T): ArrayType;\r\nexport function clone(array: Readonly, cloneCallback?: (elementToClone: T) => T): T[];\r\nexport function clone>(array: ArrayType, cloneCallback?: (elementToClone: number) => number): ArrayType;\r\nexport function clone, T>(array: Readonly, cloneCallback?: (elementToClone: T) => T): ArrayType {\r\n const clonedArray = array.slice(0) as ArrayType;\r\n\r\n if (cloneCallback != null) {\r\n for (let i = 0; i < array.length; i++) {\r\n clonedArray[i] = cloneCallback(array[i]);\r\n }\r\n }\r\n\r\n return clonedArray;\r\n}\r\n\r\nexport function equals(array: Readonly>, other: Readonly>, elementsEqualCallback?: (arrayElement: T, otherElement: T) => boolean): boolean {\r\n let equals = true;\r\n\r\n if (other != null && array.length == other.length) {\r\n for (let i = 0; i < array.length; i++) {\r\n if ((elementsEqualCallback != null && !elementsEqualCallback(array[i], other[i])) ||\r\n (elementsEqualCallback == null && array[i] != other[i])) {\r\n equals = false;\r\n break;\r\n }\r\n }\r\n } else {\r\n equals = false;\r\n }\r\n\r\n return equals;\r\n}\r\n\r\nexport function first(array: Readonly>): T | undefined {\r\n return array.length > 0 ? array[0] : undefined;\r\n}\r\n\r\nexport function last(array: Readonly>): T | undefined {\r\n return array.length > 0 ? array[array.length - 1] : undefined;\r\n}\r\n\r\nexport function has(array: Readonly>, callback: (elementToCheck: T, elementIndex: number) => boolean): boolean {\r\n return ArrayUtils.find(array, callback) != undefined;\r\n}\r\n\r\nexport function hasEqual(array: Readonly>, elementToFind: T, elementsEqualCallback?: (elementToCheck: T, elementToFind: T) => boolean): boolean {\r\n return ArrayUtils.findEqual(array, elementToFind, elementsEqualCallback) != undefined;\r\n}\r\n\r\nexport function find(array: Readonly>, callback: (elementToCheck: T, elementIndex: number) => boolean): T | undefined {\r\n let elementFound = undefined;\r\n\r\n const index = ArrayUtils.findIndex(array, callback);\r\n if (index >= 0) {\r\n elementFound = array[index];\r\n }\r\n\r\n return elementFound;\r\n}\r\n\r\nexport function findIndex(array: Readonly>, callback: (elementToCheck: T, elementIndex: number) => boolean): number {\r\n return array.findIndex(callback);\r\n}\r\n\r\nexport function findAll(array: Readonly>, callback: (elementToCheck: T, elementIndex: number) => boolean): T[] {\r\n const elementsFound = [];\r\n\r\n for (let i = 0; i < array.length; i++) {\r\n const element = array[i];\r\n if (callback(element, i)) {\r\n elementsFound.push(element);\r\n }\r\n }\r\n\r\n return elementsFound;\r\n}\r\n\r\nexport function findAllIndexes(array: Readonly>, callback: (elementToCheck: T, elementIndex: number) => boolean): number[] {\r\n const indexes = [];\r\n\r\n for (let i = 0; i < array.length; i++) {\r\n const element = array[i];\r\n if (callback(element, i)) {\r\n indexes.push(i);\r\n }\r\n }\r\n\r\n return indexes;\r\n}\r\n\r\nexport function findEqual(array: Readonly>, elementToFind: T, elementsEqualCallback?: (elementToCheck: T, elementToFind: T) => boolean): T | undefined {\r\n if (elementsEqualCallback == null) {\r\n const index = ArrayUtils.findIndexEqual(array, elementToFind);\r\n return index < 0 ? undefined : array[index];\r\n }\r\n\r\n let elementFound = undefined;\r\n for (let i = 0; i < array.length; i++) {\r\n const currentElement = array[i];\r\n if (elementsEqualCallback(currentElement, elementToFind)) {\r\n elementFound = currentElement;\r\n break;\r\n }\r\n }\r\n\r\n return elementFound;\r\n}\r\n\r\nexport function findAllEqual(array: Readonly>, elementToFind: T, elementsEqualCallback?: (elementToCheck: T, elementToFind: T) => boolean): T[] {\r\n if (elementsEqualCallback == null) {\r\n return _findAllEqualOptimized(array, elementToFind);\r\n }\r\n\r\n const elementsFound = [];\r\n\r\n for (let i = 0; i < array.length; i++) {\r\n const currentElement = array[i];\r\n if (elementsEqualCallback(currentElement, elementToFind)) {\r\n elementsFound.push(currentElement);\r\n }\r\n }\r\n\r\n return elementsFound;\r\n}\r\n\r\nexport function findIndexEqual(array: Readonly>, elementToFind: T, elementsEqualCallback?: (elementToCheck: T, elementToFind: T) => boolean): number {\r\n if (elementsEqualCallback == null) {\r\n return array.indexOf(elementToFind);\r\n }\r\n\r\n let indexFound = -1;\r\n for (let i = 0; i < array.length; i++) {\r\n const currentElement = array[i];\r\n if (elementsEqualCallback(currentElement, elementToFind)) {\r\n indexFound = i;\r\n break;\r\n }\r\n }\r\n\r\n return indexFound;\r\n}\r\n\r\nexport function findAllIndexesEqual(array: Readonly>, elementToFind: T, elementsEqualCallback?: (elementToCheck: T, elementToFind: T) => boolean): number[] {\r\n if (elementsEqualCallback == null) {\r\n return _findAllIndexesEqualOptimized(array, elementToFind);\r\n }\r\n\r\n const indexesFound = [];\r\n for (let i = 0; i < array.length; i++) {\r\n const currentElement = array[i];\r\n if (elementsEqualCallback(currentElement, elementToFind)) {\r\n indexesFound.push(i);\r\n }\r\n }\r\n return indexesFound;\r\n}\r\n\r\nexport function remove(array: DynamicArrayLike, callback: (elementToCheck: T, elementIndex: number) => boolean): T | undefined {\r\n let elementRemoved = undefined;\r\n\r\n const index = array.findIndex(callback);\r\n if (index >= 0) {\r\n elementRemoved = ArrayUtils.removeIndex(array, index);\r\n }\r\n\r\n return elementRemoved;\r\n}\r\n\r\nexport function removeIndex(array: DynamicArrayLike, index: number): T | undefined {\r\n let elementRemoved = undefined;\r\n\r\n if (index >= 0 && index < array.length) {\r\n const arrayRemoved = array.splice(index, 1);\r\n if (arrayRemoved.length == 1) {\r\n elementRemoved = arrayRemoved[0];\r\n }\r\n }\r\n\r\n return elementRemoved;\r\n}\r\n\r\nexport function removeAll(array: DynamicArrayLike, callback: (elementToCheck: T, elementIndex: number) => boolean): T[] {\r\n const elementsRemoved = [];\r\n\r\n let currentElement = undefined;\r\n do {\r\n currentElement = ArrayUtils.remove(array, callback);\r\n if (currentElement !== undefined) {\r\n elementsRemoved.push(currentElement);\r\n }\r\n } while (currentElement !== undefined);\r\n\r\n return elementsRemoved;\r\n}\r\n\r\nexport function removeAllIndexes(array: DynamicArrayLike, indexes: ArrayLike): T[] {\r\n const elementsRemoved = [];\r\n\r\n for (const index of indexes) {\r\n const elementRemoved = ArrayUtils.removeIndex(array, index);\r\n if (elementRemoved !== undefined) {\r\n elementsRemoved.push(elementRemoved);\r\n }\r\n }\r\n\r\n return elementsRemoved;\r\n}\r\n\r\nexport function removeEqual(array: DynamicArrayLike, elementToRemove: T, elementsEqualCallback?: (elementToCheck: T, elementToRemove: T) => boolean): T | undefined {\r\n return ArrayUtils.removeIndex(array, ArrayUtils.findIndexEqual(array, elementToRemove, elementsEqualCallback));\r\n}\r\n\r\nexport function removeAllEqual(array: DynamicArrayLike, elementToRemove: T, elementsEqualCallback?: (elementToCheck: T, elementToRemove: T) => boolean): T[] {\r\n return ArrayUtils.removeAllIndexes(array, ArrayUtils.findAllIndexesEqual(array, elementToRemove, elementsEqualCallback));\r\n}\r\n\r\nexport function clear, T>(array: ArrayType): ArrayType {\r\n array.length = 0;\r\n\r\n return array;\r\n}\r\n\r\nexport function pushUnique(array: DynamicArrayLike, elementToAdd: T, elementsEqualCallback?: (elementToCheck: T, elementToAdd: T) => boolean): number {\r\n let length = array.length;\r\n\r\n const hasElement = ArrayUtils.hasEqual(array, elementToAdd, elementsEqualCallback);\r\n\r\n if (!hasElement) {\r\n length = array.push(elementToAdd);\r\n }\r\n\r\n return length;\r\n}\r\n\r\nexport function unshiftUnique(array: DynamicArrayLike, elementToAdd: T, elementsEqualCallback?: (elementToCheck: T, elementToAdd: T) => boolean): number {\r\n let length = array.length;\r\n\r\n const hasElement = ArrayUtils.hasEqual(array, elementToAdd, elementsEqualCallback);\r\n\r\n if (!hasElement) {\r\n length = array.unshift(elementToAdd);\r\n }\r\n\r\n return length;\r\n}\r\n\r\nexport const ArrayUtils = {\r\n copy,\r\n clone,\r\n equals,\r\n first,\r\n last,\r\n has,\r\n hasEqual,\r\n find,\r\n findIndex,\r\n findAll,\r\n findAllIndexes,\r\n findEqual,\r\n findAllEqual,\r\n findIndexEqual,\r\n findAllIndexesEqual,\r\n remove,\r\n removeIndex,\r\n removeAll,\r\n removeAllIndexes,\r\n removeEqual,\r\n removeAllEqual,\r\n clear,\r\n pushUnique,\r\n unshiftUnique\r\n} as const;\r\n\r\n\r\n\r\nfunction _findAllEqualOptimized(array: Readonly>, elementToFind: T): T[] {\r\n // Adapted from: https:// stackoverflow.com/a/20798567\r\n\r\n const elementsFound = [];\r\n\r\n let index = -1;\r\n while ((index = array.indexOf(elementToFind, index + 1)) >= 0) {\r\n elementsFound.push(array[index]);\r\n }\r\n\r\n return elementsFound;\r\n}\r\n\r\nfunction _findAllIndexesEqualOptimized(array: Readonly>, elementToFind: T): number[] {\r\n // Adapted from: https:// stackoverflow.com/a/20798567\r\n\r\n const elementsFound = [];\r\n\r\n let index = -1;\r\n while ((index = array.indexOf(elementToFind, index + 1)) >= 0) {\r\n elementsFound.push(index);\r\n }\r\n\r\n return elementsFound;\r\n}", "import { vec3 as gl_vec3, type mat3 as gl_mat3_type, type mat4 as gl_mat4_type, type quat as gl_quat_type, type vec3 as gl_vec3_type } from \"gl-matrix\";\r\nimport { Matrix3, Matrix4, Quaternion, Vector3 } from \"../../../cauldron/type_definitions/array_type_definitions.js\";\r\nimport { EasingFunction, MathUtils } from \"../math_utils.js\";\r\nimport { Mat3Utils } from \"./mat3_utils.js\";\r\nimport { Mat4Utils, create as mat4_utils_create } from \"./mat4_utils.js\";\r\nimport { Quat2Utils } from \"./quat2_utils.js\";\r\nimport { QuatUtils, create as quat_utils_create } from \"./quat_utils.js\";\r\nimport { getVector3AllocationFunction, setVector3AllocationFunction } from \"./vec_allocation_utils.js\";\r\n\r\nexport function create(): Vector3;\r\nexport function create(x: number, y: number, z: number): Vector3;\r\nexport function create(uniformValue: number): Vector3;\r\nexport function create(x?: number, y?: number, z?: number): Vector3 {\r\n const out = getAllocationFunction()();\r\n\r\n if (x != null) {\r\n Vec3Utils.set(out, x, y!, z!);\r\n }\r\n\r\n return out;\r\n}\r\n\r\nexport function getAllocationFunction(): () => Vector3 {\r\n return getVector3AllocationFunction();\r\n}\r\n\r\n/** Specify the function that will be used to allocate the vector when calling the {@link create} function */\r\nexport function setAllocationFunction(allocationFunction: () => Vector3): void {\r\n setVector3AllocationFunction(allocationFunction);\r\n}\r\n\r\nexport function set(vector: T, x: number, y: number, z: number): T;\r\nexport function set(vector: T, uniformValue: number): T;\r\nexport function set(vector: T, x: number, y?: number, z?: number): T {\r\n if (y == null) {\r\n gl_vec3.set(vector as unknown as gl_vec3_type, x, x, x);\r\n } else {\r\n gl_vec3.set(vector as unknown as gl_vec3_type, x, y, z!);\r\n }\r\n\r\n return vector;\r\n}\r\n\r\nexport function copy(from: Readonly, to: T): T {\r\n gl_vec3.copy(to as unknown as gl_vec3_type, from as unknown as gl_vec3_type);\r\n return to;\r\n}\r\n\r\n/** The overload where `T extends Vector3` does also get `array` as `Readonly`, but is not marked as such due to \r\n Typescript having issues with inferring the proper type of `T` when `Readonly` is used */\r\nexport function clone(vector: Readonly): T;\r\nexport function clone(vector: Readonly): number[];\r\nexport function clone(vector: T): T;\r\nexport function clone(vector: Readonly): T {\r\n return vector.slice(0) as T;\r\n}\r\n\r\nexport function equals(first: Readonly, second: Readonly, epsilon: number = 0): boolean {\r\n let equals = first.length == second.length;\r\n\r\n if (equals) {\r\n equals &&= (Math.abs(first[0] - second[0]) <= epsilon);\r\n equals &&= (Math.abs(first[1] - second[1]) <= epsilon);\r\n equals &&= (Math.abs(first[2] - second[2]) <= epsilon);\r\n }\r\n\r\n return equals;\r\n}\r\n\r\nexport function isNormalized(vector: Readonly, epsilon: number = MathUtils.EPSILON): boolean {\r\n return Math.abs(Vec3Utils.lengthSquared(vector) - 1) < epsilon;\r\n}\r\n\r\nexport function normalize(vector: Readonly): T;\r\nexport function normalize(vector: Readonly, out: T): T;\r\nexport function normalize(vector: Readonly, out: T | U = Vec3Utils.clone(vector)): T | U {\r\n gl_vec3.normalize(out as unknown as gl_vec3_type, vector as unknown as gl_vec3_type);\r\n return out;\r\n}\r\n\r\nexport function isZero(vector: Readonly, epsilon: number = 0): boolean {\r\n return Vec3Utils.lengthSquared(vector) <= (epsilon * epsilon);\r\n}\r\n\r\nexport function zero(vector: T): T {\r\n gl_vec3.zero(vector as unknown as gl_vec3_type);\r\n return vector;\r\n}\r\n\r\nexport function length(vector: Readonly): number {\r\n return gl_vec3.length(vector as unknown as gl_vec3_type);\r\n}\r\n\r\nexport function lengthSquared(vector: Readonly): number {\r\n return gl_vec3.squaredLength(vector as unknown as gl_vec3_type);\r\n}\r\n\r\nexport function lengthSigned(vector: Readonly, positiveDirection: Readonly): number {\r\n let signedLength = Vec3Utils.length(vector);\r\n if (!Vec3Utils.isConcordant(vector, positiveDirection)) {\r\n signedLength *= -1;\r\n }\r\n\r\n return signedLength;\r\n}\r\n\r\nexport function distance(first: Readonly, second: Readonly): number {\r\n return gl_vec3.dist(first as unknown as gl_vec3_type, second as unknown as gl_vec3_type);\r\n}\r\n\r\nexport function distanceSquared(first: Readonly, second: Readonly): number {\r\n return gl_vec3.squaredDistance(first as unknown as gl_vec3_type, second as unknown as gl_vec3_type);\r\n}\r\n\r\nexport function add(first: Readonly, second: Readonly): T;\r\nexport function add(first: Readonly, second: Readonly, out: T): T;\r\nexport function add(first: Readonly, second: Readonly, out: T | U = Vec3Utils.clone(first)): T | U {\r\n gl_vec3.add(out as unknown as gl_vec3_type, first as unknown as gl_vec3_type, second as unknown as gl_vec3_type);\r\n return out;\r\n}\r\n\r\nexport function sub(first: Readonly, second: Readonly): T;\r\nexport function sub(first: Readonly, second: Readonly, out: T): T;\r\nexport function sub(first: Readonly, second: Readonly, out: T | U = Vec3Utils.clone(first)): T | U {\r\n gl_vec3.sub(out as unknown as gl_vec3_type, first as unknown as gl_vec3_type, second as unknown as gl_vec3_type);\r\n return out;\r\n}\r\n\r\nexport function mul(first: Readonly, second: Readonly): T;\r\nexport function mul(first: Readonly, second: Readonly, out: T): T;\r\nexport function mul(first: Readonly, second: Readonly, out: T | U = Vec3Utils.clone(first)): T | U {\r\n gl_vec3.mul(out as unknown as gl_vec3_type, first as unknown as gl_vec3_type, second as unknown as gl_vec3_type);\r\n return out;\r\n}\r\n\r\n\r\nexport function div(first: Readonly, second: Readonly): T;\r\nexport function div(first: Readonly, second: Readonly, out: T): T;\r\nexport function div(first: Readonly, second: Readonly, out: T | U = Vec3Utils.clone(first)): T | U {\r\n gl_vec3.div(out as unknown as gl_vec3_type, first as unknown as gl_vec3_type, second as unknown as gl_vec3_type);\r\n return out;\r\n}\r\n\r\nexport function scale(vector: Readonly, value: number): T;\r\nexport function scale(vector: Readonly, value: number, out: T): T;\r\nexport function scale(vector: Readonly, value: number, out: T | U = Vec3Utils.clone(vector)): T | U {\r\n gl_vec3.scale(out as unknown as gl_vec3_type, vector as unknown as gl_vec3_type, value);\r\n return out;\r\n}\r\n\r\nexport function negate(vector: Readonly): T;\r\nexport function negate(vector: Readonly, out: T): T;\r\nexport function negate(vector: Readonly, out: T | U = Vec3Utils.clone(vector)): T | U {\r\n gl_vec3.negate(out as unknown as gl_vec3_type, vector as unknown as gl_vec3_type);\r\n return out;\r\n}\r\n\r\nexport function dot(first: Readonly, second: Readonly): number {\r\n return gl_vec3.dot(first as unknown as gl_vec3_type, second as unknown as gl_vec3_type);\r\n}\r\n\r\nexport function cross(first: Readonly, second: Readonly): T;\r\nexport function cross(first: Readonly, second: Readonly, out: T): T;\r\nexport function cross(first: Readonly, second: Readonly, out: T | U = Vec3Utils.clone(first)): T | U {\r\n gl_vec3.cross(out as unknown as gl_vec3_type, first as unknown as gl_vec3_type, second as unknown as gl_vec3_type);\r\n return out;\r\n}\r\n\r\nexport function transformQuat(vector: Readonly, quat: Readonly): T;\r\nexport function transformQuat(vector: Readonly, quat: Readonly, out: T): T;\r\nexport function transformQuat(vector: Readonly, quat: Readonly, out: T | U = Vec3Utils.clone(vector)): T | U {\r\n gl_vec3.transformQuat(out as unknown as gl_vec3_type, vector as unknown as gl_vec3_type, quat as unknown as gl_quat_type);\r\n return out;\r\n}\r\n\r\nexport function transformMat3(vector: Readonly, matrix: Readonly): T;\r\nexport function transformMat3(vector: Readonly, matrix: Readonly, out: T): T;\r\nexport function transformMat3(vector: Readonly, matrix: Readonly, out: T | U = Vec3Utils.clone(vector)): T | U {\r\n gl_vec3.transformMat3(out as unknown as gl_vec3_type, vector as unknown as gl_vec3_type, matrix as unknown as gl_mat3_type);\r\n return out;\r\n}\r\n\r\nexport function transformMat4(vector: Readonly, matrix: Readonly): T;\r\nexport function transformMat4(vector: Readonly, matrix: Readonly, out: T): T;\r\nexport function transformMat4(vector: Readonly, matrix: Readonly, out: T | U = Vec3Utils.clone(vector)): T | U {\r\n gl_vec3.transformMat4(out as unknown as gl_vec3_type, vector as unknown as gl_vec3_type, matrix as unknown as gl_mat4_type);\r\n return out;\r\n}\r\n\r\nexport function lerp(from: Readonly, to: Readonly, interpolationFactor: number): T;\r\nexport function lerp(from: Readonly, to: Readonly, interpolationFactor: number, out: T): T;\r\nexport function lerp(from: Readonly, to: Readonly, interpolationFactor: number, out: T | U = Vec3Utils.clone(from)): T | U {\r\n if (interpolationFactor <= 0) {\r\n Vec3Utils.copy(from, out);\r\n return out;\r\n } else if (interpolationFactor >= 1) {\r\n Vec3Utils.copy(to, out);\r\n return out;\r\n }\r\n\r\n gl_vec3.lerp(out as unknown as gl_vec3_type, from as unknown as gl_vec3_type, to as unknown as gl_vec3_type, interpolationFactor);\r\n return out;\r\n}\r\n\r\nexport function interpolate(from: Readonly, to: Readonly, interpolationFactor: number, easingFunction?: EasingFunction): T;\r\nexport function interpolate(from: Readonly, to: Readonly, interpolationFactor: number, easingFunction: EasingFunction, out: T): T;\r\nexport function interpolate(from: Readonly, to: Readonly, interpolationFactor: number, easingFunction: EasingFunction = EasingFunction.linear, out: T | U = Vec3Utils.clone(from)): T | U {\r\n const lerpFactor = easingFunction(interpolationFactor);\r\n return Vec3Utils.lerp(from, to, lerpFactor, out);\r\n}\r\n\r\nexport function angle(first: Readonly, second: Readonly): number {\r\n return Vec3Utils.angleDegrees(first, second);\r\n}\r\n\r\nexport function angleDegrees(first: Readonly, second: Readonly): number {\r\n return MathUtils.toDegrees(Vec3Utils.angleRadians(first, second));\r\n}\r\n\r\nexport function angleRadians(first: Readonly, second: Readonly): number {\r\n const firstX = first[0];\r\n const firstY = first[1];\r\n const firstZ = first[2];\r\n\r\n const secondX = second[0];\r\n const secondY = second[1];\r\n const secondZ = second[2];\r\n\r\n const firstLengthSquared = (firstX * firstX + firstY * firstY + firstZ * firstZ);\r\n const secondLengthSquared = (secondX * secondX + secondY * secondY + secondZ * secondZ);\r\n\r\n const lengthSquared = firstLengthSquared * secondLengthSquared;\r\n\r\n let angle = 0;\r\n if (lengthSquared > MathUtils.EPSILON_SQUARED) {\r\n const length = Math.sqrt(lengthSquared);\r\n\r\n const cos = Vec3Utils.dot(first, second) / length;\r\n angle = Math.acos(MathUtils.clamp(cos, -1, 1));\r\n }\r\n\r\n return angle;\r\n}\r\n\r\nexport function angleSigned(first: Readonly, second: Readonly, referenceAxis: Readonly): number {\r\n return Vec3Utils.angleSignedDegrees(first, second, referenceAxis);\r\n}\r\n\r\nexport function angleSignedDegrees(first: Readonly, second: Readonly, referenceAxis: Readonly): number {\r\n return MathUtils.toDegrees(Vec3Utils.angleSignedRadians(first, second, referenceAxis));\r\n}\r\n\r\nexport const angleSignedRadians = function () {\r\n const crossAxis = create();\r\n return function angleSignedRadians(first: Readonly, second: Readonly, referenceAxis: Readonly): number {\r\n Vec3Utils.cross(first, second, crossAxis);\r\n let angle = Vec3Utils.angleRadians(first, second);\r\n if (!Vec3Utils.isConcordant(crossAxis, referenceAxis)) {\r\n angle = -angle;\r\n }\r\n\r\n return angle;\r\n };\r\n}();\r\n\r\nexport function anglePivoted(first: Readonly, second: Readonly, referenceAxis: Readonly): number {\r\n return Vec3Utils.anglePivotedDegrees(first, second, referenceAxis);\r\n}\r\n\r\nexport function anglePivotedDegrees(first: Readonly, second: Readonly, referenceAxis: Readonly): number {\r\n return MathUtils.toDegrees(Vec3Utils.anglePivotedRadians(first, second, referenceAxis));\r\n}\r\n\r\nexport const anglePivotedRadians = function () {\r\n const flatFirst = create();\r\n const flatSecond = create();\r\n return function anglePivotedRadians(first: Readonly, second: Readonly, referenceAxis: Readonly): number {\r\n Vec3Utils.removeComponentAlongAxis(first, referenceAxis, flatFirst);\r\n Vec3Utils.removeComponentAlongAxis(second, referenceAxis, flatSecond);\r\n\r\n return Vec3Utils.angleRadians(flatFirst, flatSecond);\r\n };\r\n}();\r\n\r\nexport function anglePivotedSigned(first: Readonly, second: Readonly, referenceAxis: Readonly): number {\r\n return Vec3Utils.anglePivotedSignedDegrees(first, second, referenceAxis);\r\n}\r\n\r\nexport function anglePivotedSignedDegrees(first: Readonly, second: Readonly, referenceAxis: Readonly): number {\r\n return MathUtils.toDegrees(Vec3Utils.anglePivotedSignedRadians(first, second, referenceAxis));\r\n}\r\n\r\nexport const anglePivotedSignedRadians = function () {\r\n const flatFirst = create();\r\n const flatSecond = create();\r\n return function anglePivotedSignedRadians(first: Readonly, second: Readonly, referenceAxis: Readonly): number {\r\n Vec3Utils.removeComponentAlongAxis(first, referenceAxis, flatFirst);\r\n Vec3Utils.removeComponentAlongAxis(second, referenceAxis, flatSecond);\r\n\r\n return Vec3Utils.angleSignedRadians(flatFirst, flatSecond, referenceAxis);\r\n };\r\n}();\r\n\r\nexport function valueAlongAxis(vector: Readonly, axis: Readonly): number {\r\n const valueAlongAxis = Vec3Utils.dot(vector, axis);\r\n return valueAlongAxis;\r\n}\r\n\r\nexport const valueAlongPlane = function () {\r\n const componentAlong = create();\r\n return function valueAlongPlane(vector: Readonly, planeNormal: Readonly): number {\r\n Vec3Utils.removeComponentAlongAxis(vector, planeNormal, componentAlong);\r\n return Vec3Utils.length(componentAlong);\r\n };\r\n}();\r\n\r\nexport function componentAlongAxis(vector: Readonly, axis: Readonly): T;\r\nexport function componentAlongAxis(vector: Readonly, axis: Readonly, out: T): T;\r\nexport function componentAlongAxis(vector: Readonly, axis: Readonly, out: T | U = Vec3Utils.clone(vector)): T | U {\r\n const valueAlongAxis = Vec3Utils.valueAlongAxis(vector, axis);\r\n\r\n Vec3Utils.copy(axis, out);\r\n Vec3Utils.scale(out, valueAlongAxis, out);\r\n return out;\r\n}\r\n\r\nexport const removeComponentAlongAxis = function () {\r\n const componentAlong = create();\r\n\r\n function removeComponentAlongAxis(vector: Readonly, axis: Readonly): T;\r\n function removeComponentAlongAxis(vector: Readonly, axis: Readonly, out: T): T;\r\n function removeComponentAlongAxis(vector: Readonly, axis: Readonly, out: T | U = Vec3Utils.clone(vector)): T | U {\r\n Vec3Utils.componentAlongAxis(vector, axis, componentAlong);\r\n Vec3Utils.sub(vector, componentAlong, out);\r\n return out;\r\n }\r\n\r\n return removeComponentAlongAxis;\r\n}();\r\n\r\nexport const copyComponentAlongAxis = function () {\r\n const componentAlong = create();\r\n\r\n function copyComponentAlongAxis(from: Readonly, to: Readonly, axis: Readonly): T;\r\n function copyComponentAlongAxis(from: Readonly, to: Readonly, axis: Readonly, out: T): T;\r\n function copyComponentAlongAxis(from: Readonly, to: Readonly, axis: Readonly, out: T | U = Vec3Utils.clone(from)): T | U {\r\n Vec3Utils.removeComponentAlongAxis(to, axis, out);\r\n Vec3Utils.componentAlongAxis(from, axis, componentAlong);\r\n Vec3Utils.add(out, componentAlong, out);\r\n\r\n return out;\r\n }\r\n\r\n return copyComponentAlongAxis;\r\n}();\r\n\r\nexport function isConcordant(first: Readonly, second: Readonly): boolean {\r\n return Vec3Utils.dot(first, second) >= 0;\r\n}\r\n\r\nexport function isFartherAlongAxis(first: Readonly, second: Readonly, axis: Readonly): boolean {\r\n return Vec3Utils.valueAlongAxis(first, axis) > Vec3Utils.valueAlongAxis(second, axis);\r\n}\r\n\r\nexport function isToTheRight(first: Readonly, second: Readonly, referenceAxis: Readonly): boolean {\r\n return Vec3Utils.signTo(first, second, referenceAxis) >= 0;\r\n}\r\n\r\nexport const signTo = function () {\r\n const componentAlongThis = create();\r\n const componentAlongVector = create();\r\n return function signTo(first: Readonly, second: Readonly, referenceAxis: Readonly, zeroSign: number = 1): number {\r\n Vec3Utils.removeComponentAlongAxis(first, referenceAxis, componentAlongThis);\r\n Vec3Utils.removeComponentAlongAxis(second, referenceAxis, componentAlongVector);\r\n\r\n const angleSignedResult = Vec3Utils.angleSigned(first, second, referenceAxis);\r\n return angleSignedResult > 0 ? 1 : (angleSignedResult == 0 ? zeroSign : -1);\r\n };\r\n}();\r\n\r\nexport function projectOnAxis(vector: Readonly, axis: Readonly): T;\r\nexport function projectOnAxis(vector: Readonly, axis: Readonly, out: T): T;\r\nexport function projectOnAxis(vector: Readonly, axis: Readonly, out: T | U = Vec3Utils.clone(vector)): T | U {\r\n Vec3Utils.componentAlongAxis(vector, axis, out);\r\n return out;\r\n}\r\n\r\n// The result can easily be not 100% exact due to precision errors\r\nexport const projectOnAxisAlongAxis = function () {\r\n const up = create();\r\n const vectorProjectedToAxis = create();\r\n const fixedProjectAlongAxis = create();\r\n\r\n function projectOnAxisAlongAxis(vector: Readonly, axis: Readonly, projectAlongAxis: Readonly): T;\r\n function projectOnAxisAlongAxis(vector: Readonly, axis: Readonly, projectAlongAxis: Readonly, out: T): T;\r\n function projectOnAxisAlongAxis(vector: Readonly, axis: Readonly, projectAlongAxis: Readonly, out: T | U = Vec3Utils.clone(vector)): T | U {\r\n if (Vec3Utils.isOnAxis(vector, axis) || Vec3Utils.isOnAxis(projectAlongAxis, axis)) {\r\n Vec3Utils.copy(vector, out);\r\n } else {\r\n Vec3Utils.cross(projectAlongAxis, axis, up);\r\n Vec3Utils.normalize(up, up);\r\n\r\n if (Vec3Utils.isZero(up)) {\r\n Vec3Utils.perpendicularAny(projectAlongAxis, up);\r\n Vec3Utils.normalize(up, up);\r\n }\r\n\r\n Vec3Utils.removeComponentAlongAxis(vector, up, out);\r\n if (!Vec3Utils.isOnAxis(out, axis)) {\r\n Vec3Utils.projectOnAxis(out, axis, vectorProjectedToAxis);\r\n Vec3Utils.sub(vectorProjectedToAxis, out, vectorProjectedToAxis);\r\n\r\n if (Vec3Utils.isConcordant(vectorProjectedToAxis, projectAlongAxis)) {\r\n Vec3Utils.copy(projectAlongAxis, fixedProjectAlongAxis);\r\n } else {\r\n Vec3Utils.negate(projectAlongAxis, fixedProjectAlongAxis);\r\n }\r\n\r\n const angleWithAlongAxis = Vec3Utils.angleRadians(fixedProjectAlongAxis, vectorProjectedToAxis);\r\n const lengthToRemove = Vec3Utils.length(vectorProjectedToAxis) / Math.cos(angleWithAlongAxis);\r\n\r\n Vec3Utils.scale(fixedProjectAlongAxis, lengthToRemove, fixedProjectAlongAxis);\r\n Vec3Utils.add(out, fixedProjectAlongAxis, out);\r\n\r\n Vec3Utils.projectOnAxis(out, axis, out); // Snap on the axis, due to float precision error\r\n }\r\n }\r\n\r\n return out;\r\n }\r\n\r\n return projectOnAxisAlongAxis;\r\n}();\r\n\r\nexport function projectOnPlane(vector: Readonly, planeNormal: Readonly): T;\r\nexport function projectOnPlane(vector: Readonly, planeNormal: Readonly, out: T): T;\r\nexport function projectOnPlane(vector: Readonly, planeNormal: Readonly, out: T | U = Vec3Utils.clone(vector)): T | U {\r\n Vec3Utils.removeComponentAlongAxis(vector, planeNormal, out);\r\n return out;\r\n}\r\n\r\n// The result can easily be not 100% exact due to precision errors\r\nexport const projectOnPlaneAlongAxis = function () {\r\n const vectorProjectedToPlane = create();\r\n const fixedProjectAlongAxis = create();\r\n\r\n function projectOnPlaneAlongAxis(vector: Readonly, planeNormal: Readonly, projectAlongAxis: Readonly): T;\r\n function projectOnPlaneAlongAxis(vector: Readonly, planeNormal: Readonly, projectAlongAxis: Readonly, out: T): T;\r\n function projectOnPlaneAlongAxis(vector: Readonly, planeNormal: Readonly, projectAlongAxis: Readonly, out: T | U = Vec3Utils.clone(vector)): T | U {\r\n if (Vec3Utils.isOnPlane(vector, planeNormal) || Vec3Utils.isOnPlane(projectAlongAxis, planeNormal)) {\r\n Vec3Utils.copy(vector, out);\r\n } else {\r\n Vec3Utils.copy(vector, out);\r\n\r\n Vec3Utils.projectOnPlane(out, planeNormal, vectorProjectedToPlane);\r\n Vec3Utils.sub(vectorProjectedToPlane, out, vectorProjectedToPlane);\r\n\r\n if (Vec3Utils.isConcordant(vectorProjectedToPlane, projectAlongAxis)) {\r\n Vec3Utils.copy(projectAlongAxis, fixedProjectAlongAxis);\r\n } else {\r\n Vec3Utils.negate(projectAlongAxis, fixedProjectAlongAxis);\r\n }\r\n\r\n const angleWithAlongAxis = Vec3Utils.angleRadians(fixedProjectAlongAxis, vectorProjectedToPlane);\r\n const lengthToRemove = Vec3Utils.length(vectorProjectedToPlane) / Math.cos(angleWithAlongAxis);\r\n\r\n Vec3Utils.scale(fixedProjectAlongAxis, lengthToRemove, fixedProjectAlongAxis);\r\n Vec3Utils.add(out, fixedProjectAlongAxis, out);\r\n\r\n Vec3Utils.projectOnPlane(out, planeNormal, out); // Snap on the axis, due to float precision error\r\n }\r\n\r\n return out;\r\n }\r\n\r\n return projectOnPlaneAlongAxis;\r\n}();\r\n\r\nexport function isOnAxis(vector: Readonly, axis: Readonly): boolean {\r\n const angleResult = Vec3Utils.angle(vector, axis);\r\n return Math.abs(angleResult) < MathUtils.EPSILON_DEGREES || Math.abs(angleResult - 180) < MathUtils.EPSILON_DEGREES;\r\n}\r\n\r\nexport function isOnPlane(vector: Readonly, planeNormal: Readonly): boolean {\r\n const angleResult = Vec3Utils.angle(vector, planeNormal);\r\n return Math.abs(angleResult - 90) < MathUtils.EPSILON_DEGREES;\r\n}\r\n\r\nexport const perpendicularAny = function () {\r\n const notVector = create();\r\n\r\n function perpendicularAny(vector: Readonly): T;\r\n function perpendicularAny(vector: Readonly, out: T): T;\r\n function perpendicularAny(vector: Readonly, out: T | U = Vec3Utils.clone(vector)): T | U {\r\n if (Vec3Utils.isZero(vector)) {\r\n return Vec3Utils.zero(out);\r\n }\r\n\r\n Vec3Utils.copy(vector, notVector);\r\n\r\n let zeroAmount = 0;\r\n for (let i = 0; i < 3; i++) {\r\n if (vector[i] == 0) {\r\n zeroAmount++;\r\n }\r\n }\r\n\r\n if (zeroAmount == 2) {\r\n if (notVector[0] == 0) {\r\n notVector[0] = 1;\r\n } else if (notVector[1] == 0) {\r\n notVector[1] = 1;\r\n } else if (notVector[2] == 0) {\r\n notVector[2] = 1;\r\n }\r\n } else {\r\n if (notVector[0] != 0) {\r\n notVector[0] = -notVector[0];\r\n } else if (notVector[1] != 0) {\r\n notVector[1] = -notVector[1];\r\n } else if (notVector[2] != 0) {\r\n notVector[2] = -notVector[2];\r\n }\r\n }\r\n\r\n Vec3Utils.cross(notVector, vector, out);\r\n\r\n return out;\r\n }\r\n\r\n return perpendicularAny;\r\n}();\r\n\r\nexport function rotate(vector: Readonly, rotation: Readonly): T;\r\nexport function rotate(vector: Readonly, rotation: Readonly, out: T): T;\r\nexport function rotate(vector: Readonly, rotation: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.rotateDegrees(vector, rotation, out!);\r\n}\r\n\r\nexport const rotateDegrees = function () {\r\n const zero = create();\r\n\r\n function rotateDegrees(vector: Readonly, rotation: Readonly): T;\r\n function rotateDegrees(vector: Readonly, rotation: Readonly, out: T): T;\r\n function rotateDegrees(vector: Readonly, rotation: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.rotateAroundDegrees(vector, rotation, zero, out!);\r\n }\r\n\r\n return rotateDegrees;\r\n}();\r\n\r\nexport const rotateRadians = function () {\r\n const zero = create();\r\n\r\n function rotateRadians(vector: Readonly, rotation: Readonly): T;\r\n function rotateRadians(vector: Readonly, rotation: Readonly, out: T): T;\r\n function rotateRadians(vector: Readonly, rotation: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.rotateAroundRadians(vector, rotation, zero, out!);\r\n }\r\n\r\n return rotateRadians;\r\n}();\r\n\r\nexport const rotateQuat = function () {\r\n const zero = create();\r\n\r\n function rotateQuat(vector: Readonly, rotation: Readonly): T;\r\n function rotateQuat(vector: Readonly, rotation: Readonly, out: T): T;\r\n function rotateQuat(vector: Readonly, rotation: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.rotateAroundQuat(vector, rotation, zero, out!);\r\n }\r\n\r\n return rotateQuat;\r\n}();\r\n\r\nexport function rotateAxis(vector: Readonly, angle: number, axis: Readonly): T;\r\nexport function rotateAxis(vector: Readonly, angle: number, axis: Readonly, out: T): T;\r\nexport function rotateAxis(vector: Readonly, angle: number, axis: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.rotateAxisDegrees(vector, angle, axis, out!);\r\n}\r\n\r\nexport const rotateAxisDegrees = function () {\r\n const zero = create();\r\n\r\n function rotateAxisDegrees(vector: Readonly, angle: number, axis: Readonly): T;\r\n function rotateAxisDegrees(vector: Readonly, angle: number, axis: Readonly, out: T): T;\r\n function rotateAxisDegrees(vector: Readonly, angle: number, axis: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.rotateAroundAxisDegrees(vector, angle, axis, zero, out!);\r\n }\r\n\r\n return rotateAxisDegrees;\r\n}();\r\n\r\nexport const rotateAxisRadians = function () {\r\n const zero = create();\r\n\r\n function rotateAxisRadians(vector: Readonly, angle: number, axis: Readonly): T;\r\n function rotateAxisRadians(vector: Readonly, angle: number, axis: Readonly, out: T): T;\r\n function rotateAxisRadians(vector: Readonly, angle: number, axis: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.rotateAroundAxisRadians(vector, angle, axis, zero, out!);\r\n }\r\n\r\n return rotateAxisRadians;\r\n}();\r\n\r\nexport function rotateAround(vector: Readonly, rotation: Readonly, origin: Readonly): T;\r\nexport function rotateAround(vector: Readonly, rotation: Readonly, origin: Readonly, out: T): T;\r\nexport function rotateAround(vector: Readonly, rotation: Readonly, origin: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.rotateAroundDegrees(vector, rotation, origin, out!);\r\n}\r\n\r\nexport const rotateAroundDegrees = function () {\r\n const quat = quat_utils_create();\r\n\r\n function rotateAroundDegrees(vector: Readonly, rotation: Readonly, origin: Readonly): T;\r\n function rotateAroundDegrees(vector: Readonly, rotation: Readonly, origin: Readonly, out: T): T;\r\n function rotateAroundDegrees(vector: Readonly, rotation: Readonly, origin: Readonly, out: T | U = Vec3Utils.clone(vector)): T | U {\r\n Vec3Utils.degreesToQuat(rotation, quat);\r\n return Vec3Utils.rotateAroundQuat(vector, quat, origin, out);\r\n }\r\n\r\n return rotateAroundDegrees;\r\n}();\r\n\r\nexport const rotateAroundRadians = function () {\r\n const quat = quat_utils_create();\r\n\r\n function rotateAroundRadians(vector: Readonly, rotation: Readonly, origin: Readonly): T;\r\n function rotateAroundRadians(vector: Readonly, rotation: Readonly, origin: Readonly, out: T): T;\r\n function rotateAroundRadians(vector: Readonly, rotation: Readonly, origin: Readonly, out: T | U = Vec3Utils.clone(vector)): T | U {\r\n Vec3Utils.radiansToQuat(rotation, quat);\r\n return Vec3Utils.rotateAroundQuat(vector, quat, origin, out);\r\n }\r\n\r\n return rotateAroundRadians;\r\n}();\r\n\r\nexport function rotateAroundQuat(vector: Readonly, rotation: Readonly, origin: Readonly): T;\r\nexport function rotateAroundQuat(vector: Readonly, rotation: Readonly, origin: Readonly, out: T): T;\r\nexport function rotateAroundQuat(vector: Readonly, rotation: Readonly, origin: Readonly, out: T | U = Vec3Utils.clone(vector)): T | U {\r\n Vec3Utils.sub(vector, origin, out);\r\n Vec3Utils.transformQuat(out, rotation, out);\r\n Vec3Utils.add(out, origin, out);\r\n return out;\r\n}\r\n\r\nexport function rotateAroundAxis(vector: Readonly, angle: number, axis: Readonly, origin: Readonly): T;\r\nexport function rotateAroundAxis(vector: Readonly, angle: number, axis: Readonly, origin: Readonly, out: T): T;\r\nexport function rotateAroundAxis(vector: Readonly, angle: number, axis: Readonly, origin: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.rotateAroundAxisDegrees(vector, angle, axis, origin, out!);\r\n}\r\n\r\nexport function rotateAroundAxisDegrees(vector: Readonly, angle: number, axis: Readonly, origin: Readonly): T;\r\nexport function rotateAroundAxisDegrees(vector: Readonly, angle: number, axis: Readonly, origin: Readonly, out: T): T;\r\nexport function rotateAroundAxisDegrees(vector: Readonly, angle: number, axis: Readonly, origin: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.rotateAroundAxisRadians(vector, MathUtils.toRadians(angle), axis, origin, out!);\r\n}\r\nexport const rotateAroundAxisRadians = function () {\r\n const quat = quat_utils_create();\r\n\r\n function rotateAroundAxisRadians(vector: Readonly, angle: number, axis: Readonly, origin: Readonly): T;\r\n function rotateAroundAxisRadians(vector: Readonly, angle: number, axis: Readonly, origin: Readonly, out: T): T;\r\n function rotateAroundAxisRadians(vector: Readonly, angle: number, axis: Readonly, origin: Readonly, out: T | U = Vec3Utils.clone(vector)): T | U {\r\n QuatUtils.fromAxisRadians(angle, axis, quat);\r\n return Vec3Utils.rotateAroundQuat(vector, quat, origin, out);\r\n }\r\n\r\n return rotateAroundAxisRadians;\r\n}();\r\n\r\nexport function addRotation(vector: Readonly, rotation: Readonly): T;\r\nexport function addRotation(vector: Readonly, rotation: Readonly, out: T): T;\r\nexport function addRotation(vector: Readonly, rotation: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.degreesAddRotation(vector, rotation, out!);\r\n}\r\n\r\nexport function addRotationDegrees(vector: Readonly, rotation: Readonly): T;\r\nexport function addRotationDegrees(vector: Readonly, rotation: Readonly, out: T): T;\r\nexport function addRotationDegrees(vector: Readonly, rotation: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.degreesAddRotationDegrees(vector, rotation, out!);\r\n}\r\n\r\nexport function addRotationRadians(vector: Readonly, rotation: Readonly): T;\r\nexport function addRotationRadians(vector: Readonly, rotation: Readonly, out: T): T;\r\nexport function addRotationRadians(vector: Readonly, rotation: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.degreesAddRotationRadians(vector, rotation, out!);\r\n}\r\n\r\nexport function addRotationQuat(vector: Readonly, rotation: Readonly): T;\r\nexport function addRotationQuat(vector: Readonly, rotation: Readonly, out: T): T;\r\nexport function addRotationQuat(vector: Readonly, rotation: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.degreesAddRotationQuat(vector, rotation, out!);\r\n}\r\n\r\nexport function degreesAddRotation(vector: Readonly, rotation: Readonly): T;\r\nexport function degreesAddRotation(vector: Readonly, rotation: Readonly, out: T): T;\r\nexport function degreesAddRotation(vector: Readonly, rotation: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.degreesAddRotationDegrees(vector, rotation, out!);\r\n}\r\n\r\nexport const degreesAddRotationDegrees = function () {\r\n const quat = quat_utils_create();\r\n\r\n function degreesAddRotationDegrees(vector: Readonly, rotation: Readonly, out: T): T;\r\n function degreesAddRotationDegrees(vector: Readonly, rotation: Readonly, out: T): T;\r\n function degreesAddRotationDegrees(vector: Readonly, rotation: Readonly, out: T | U = Vec3Utils.clone(vector)): T | U {\r\n Vec3Utils.degreesToQuat(vector, quat);\r\n return QuatUtils.toDegrees(QuatUtils.addRotationDegrees(quat, rotation, quat), out);\r\n }\r\n\r\n return degreesAddRotationDegrees;\r\n}();\r\n\r\nexport const degreesAddRotationRadians = function () {\r\n const quat = quat_utils_create();\r\n\r\n function degreesAddRotationRadians(vector: Readonly, rotation: Readonly, out: T): T;\r\n function degreesAddRotationRadians(vector: Readonly, rotation: Readonly, out: T): T;\r\n function degreesAddRotationRadians(vector: Readonly, rotation: Readonly, out: T | U = Vec3Utils.clone(vector)): T | U {\r\n Vec3Utils.degreesToQuat(vector, quat);\r\n return QuatUtils.toDegrees(QuatUtils.addRotationRadians(quat, rotation, quat), out);\r\n }\r\n\r\n return degreesAddRotationRadians;\r\n}();\r\n\r\nexport const degreesAddRotationQuat = function () {\r\n const quat = quat_utils_create();\r\n\r\n function degreesAddRotationQuat(vector: Readonly, rotation: Readonly, out: T): T;\r\n function degreesAddRotationQuat(vector: Readonly, rotation: Readonly, out: T): T;\r\n function degreesAddRotationQuat(vector: Readonly, rotation: Readonly, out: T | U = Vec3Utils.clone(vector)): T | U {\r\n Vec3Utils.degreesToQuat(vector, quat);\r\n return QuatUtils.toDegrees(QuatUtils.addRotationQuat(quat, rotation, quat), out);\r\n }\r\n\r\n return degreesAddRotationQuat;\r\n}();\r\n\r\nexport function radiansAddRotation(vector: Readonly, rotation: Readonly): T;\r\nexport function radiansAddRotation(vector: Readonly, rotation: Readonly, out: T): T;\r\nexport function radiansAddRotation(vector: Readonly, rotation: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.radiansAddRotationDegrees(vector, rotation, out!);\r\n}\r\n\r\nexport const radiansAddRotationDegrees = function () {\r\n const quat = quat_utils_create();\r\n\r\n function radiansAddRotationDegrees(vector: Readonly, rotation: Readonly, out: T): T;\r\n function radiansAddRotationDegrees(vector: Readonly, rotation: Readonly, out: T): T;\r\n function radiansAddRotationDegrees(vector: Readonly, rotation: Readonly, out: T | U = Vec3Utils.clone(vector)): T | U {\r\n Vec3Utils.radiansToQuat(vector, quat);\r\n return QuatUtils.toRadians(QuatUtils.addRotationDegrees(quat, rotation, quat), out);\r\n }\r\n\r\n return radiansAddRotationDegrees;\r\n}();\r\n\r\nexport const radiansAddRotationRadians = function () {\r\n const quat = quat_utils_create();\r\n\r\n function radiansAddRotationRadians(vector: Readonly, rotation: Readonly, out: T): T;\r\n function radiansAddRotationRadians(vector: Readonly, rotation: Readonly, out: T): T;\r\n function radiansAddRotationRadians(vector: Readonly, rotation: Readonly, out: T | U = Vec3Utils.clone(vector)): T | U {\r\n Vec3Utils.radiansToQuat(vector, quat);\r\n return QuatUtils.toRadians(QuatUtils.addRotationRadians(quat, rotation, quat), out);\r\n }\r\n\r\n return radiansAddRotationRadians;\r\n}();\r\n\r\nexport const radiansAddRotationQuat = function () {\r\n const quat = quat_utils_create();\r\n\r\n function radiansAddRotationQuat(vector: Readonly, rotation: Readonly, out: T): T;\r\n function radiansAddRotationQuat(vector: Readonly, rotation: Readonly, out: T): T;\r\n function radiansAddRotationQuat(vector: Readonly, rotation: Readonly, out: T | U = Vec3Utils.clone(vector)): T | U {\r\n Vec3Utils.radiansToQuat(vector, quat);\r\n return QuatUtils.toRadians(QuatUtils.addRotationQuat(quat, rotation, quat), out);\r\n }\r\n\r\n return radiansAddRotationQuat;\r\n}();\r\n\r\nexport function rotationTo(from: Readonly, to: Readonly): T;\r\nexport function rotationTo(from: Readonly, to: Readonly, out: T): T;\r\nexport function rotationTo(from: Readonly, to: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.rotationToDegrees(from, to, out!);\r\n}\r\n\r\nexport const rotationToDegrees = function () {\r\n const rotationQuat = quat_utils_create();\r\n\r\n function rotationToDegrees(from: Readonly, to: Readonly): T;\r\n function rotationToDegrees(from: Readonly, to: Readonly, out: T): T;\r\n function rotationToDegrees(from: Readonly, to: Readonly, out: T | U = Vec3Utils.clone(from)): T | U {\r\n Vec3Utils.rotationToQuat(from, to, rotationQuat);\r\n QuatUtils.toDegrees(rotationQuat, out);\r\n return out;\r\n }\r\n\r\n return rotationToDegrees;\r\n}();\r\n\r\nexport const rotationToRadians = function () {\r\n const rotationQuat = quat_utils_create();\r\n\r\n function rotationToRadians(from: Readonly, to: Readonly): T;\r\n function rotationToRadians(from: Readonly, to: Readonly, out: T): T;\r\n function rotationToRadians(from: Readonly, to: Readonly, out: T | U = Vec3Utils.clone(from)): T | U {\r\n Vec3Utils.rotationToQuat(from, to, rotationQuat);\r\n QuatUtils.toRadians(rotationQuat, out);\r\n return out;\r\n }\r\n\r\n return rotationToRadians;\r\n}();\r\n\r\nexport const rotationToQuat = function () {\r\n const rotationAxis = create();\r\n\r\n function rotationToQuat(from: Readonly, to: Readonly): Quaternion;\r\n function rotationToQuat(from: Readonly, to: Readonly, out: T): T;\r\n function rotationToQuat(from: Readonly, to: Readonly, out: Quaternion | T = QuatUtils.create()): Quaternion | T {\r\n Vec3Utils.cross(from, to, rotationAxis);\r\n Vec3Utils.normalize(rotationAxis, rotationAxis);\r\n\r\n if (Vec3Utils.isZero(rotationAxis)) {\r\n Vec3Utils.perpendicularAny(from, rotationAxis);\r\n Vec3Utils.normalize(rotationAxis, rotationAxis);\r\n }\r\n\r\n const signedAngle = Vec3Utils.angleSigned(from, to, rotationAxis);\r\n QuatUtils.fromAxisRadians(signedAngle, rotationAxis, out);\r\n return out;\r\n }\r\n\r\n return rotationToQuat;\r\n}();\r\n\r\nexport function rotationToPivoted(from: Readonly, to: Readonly, pivotAxis: Readonly): T;\r\nexport function rotationToPivoted(from: Readonly, to: Readonly, pivotAxis: Readonly, out: T): T;\r\nexport function rotationToPivoted(from: Readonly, to: Readonly, pivotAxis: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.rotationToPivotedDegrees(from, to, pivotAxis, out!);\r\n}\r\n\r\nexport const rotationToPivotedDegrees = function () {\r\n const rotationQuat = quat_utils_create();\r\n\r\n function rotationToPivotedDegrees(from: Readonly, to: Readonly, pivotAxis: Readonly): T;\r\n function rotationToPivotedDegrees(from: Readonly, to: Readonly, pivotAxis: Readonly, out: T): T;\r\n function rotationToPivotedDegrees(from: Readonly, to: Readonly, pivotAxis: Readonly, out: T | U = Vec3Utils.clone(from)): T | U {\r\n Vec3Utils.rotationToPivotedQuat(from, to, pivotAxis, rotationQuat);\r\n QuatUtils.toDegrees(rotationQuat, out);\r\n return out;\r\n }\r\n\r\n return rotationToPivotedDegrees;\r\n}();\r\n\r\nexport const rotationToPivotedRadians = function () {\r\n const rotationQuat = quat_utils_create();\r\n\r\n function rotationToPivotedRadians(from: Readonly, to: Readonly, pivotAxis: Readonly): T;\r\n function rotationToPivotedRadians(from: Readonly, to: Readonly, pivotAxis: Readonly, out: T): T;\r\n function rotationToPivotedRadians(from: Readonly, to: Readonly, pivotAxis: Readonly, out: T | U = Vec3Utils.clone(from)): T | U {\r\n Vec3Utils.rotationToPivotedQuat(from, to, pivotAxis, rotationQuat);\r\n QuatUtils.toRadians(rotationQuat, out);\r\n return out;\r\n }\r\n\r\n return rotationToPivotedRadians;\r\n}();\r\n\r\nexport const rotationToPivotedQuat = function () {\r\n const fromFlat = create();\r\n const toFlat = create();\r\n const rotationAxis = create();\r\n\r\n function rotationToPivotedQuat(from: Readonly, to: Readonly, pivotAxis: Readonly): Quaternion;\r\n function rotationToPivotedQuat(from: Readonly, to: Readonly, pivotAxis: Readonly, out: T): T;\r\n function rotationToPivotedQuat(from: Readonly, to: Readonly, pivotAxis: Readonly, out: Quaternion | T = QuatUtils.create()): Quaternion | T {\r\n Vec3Utils.removeComponentAlongAxis(from, pivotAxis, fromFlat);\r\n Vec3Utils.removeComponentAlongAxis(to, pivotAxis, toFlat);\r\n\r\n Vec3Utils.cross(fromFlat, toFlat, rotationAxis);\r\n Vec3Utils.normalize(rotationAxis, rotationAxis);\r\n\r\n if (Vec3Utils.isZero(rotationAxis)) {\r\n Vec3Utils.perpendicularAny(fromFlat, rotationAxis);\r\n Vec3Utils.normalize(rotationAxis, rotationAxis);\r\n }\r\n\r\n const signedAngle = Vec3Utils.angleSignedRadians(fromFlat, toFlat, rotationAxis);\r\n QuatUtils.fromAxisRadians(signedAngle, rotationAxis, out);\r\n return out;\r\n }\r\n\r\n return rotationToPivotedQuat;\r\n}();\r\n\r\nexport function convertPositionToWorld(vector: Readonly, parentTransform: Readonly): T;\r\nexport function convertPositionToWorld(vector: Readonly, parentTransform: Readonly, out: T): T;\r\nexport function convertPositionToWorld(vector: Readonly, parentTransform: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.convertPositionToWorldMatrix(vector, parentTransform, out!);\r\n}\r\n\r\nexport function convertPositionToLocal(vector: Readonly, parentTransform: Readonly): T;\r\nexport function convertPositionToLocal(vector: Readonly, parentTransform: Readonly, out: T): T;\r\nexport function convertPositionToLocal(vector: Readonly, parentTransform: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.convertPositionToLocalMatrix(vector, parentTransform, out!);\r\n}\r\n\r\nexport function convertPositionToWorldMatrix(vector: Readonly, parentTransform: Readonly): T;\r\nexport function convertPositionToWorldMatrix(vector: Readonly, parentTransform: Readonly, out: T): T;\r\nexport function convertPositionToWorldMatrix(vector: Readonly, parentTransform: Readonly, out: T | U = Vec3Utils.clone(vector)): T | U {\r\n Vec3Utils.transformMat4(vector, parentTransform, out);\r\n return out;\r\n}\r\n\r\nexport const convertPositionToLocalMatrix = function () {\r\n const inverse = mat4_utils_create();\r\n\r\n function convertPositionToLocalMatrix(vector: Readonly, parentTransform: Readonly): T;\r\n function convertPositionToLocalMatrix(vector: Readonly, parentTransform: Readonly, out: T): T;\r\n function convertPositionToLocalMatrix(vector: Readonly, parentTransform: Readonly, out: T | U = Vec3Utils.clone(vector)): T | U {\r\n Mat4Utils.invert(parentTransform, inverse);\r\n Vec3Utils.transformMat4(vector, inverse, out);\r\n return out;\r\n }\r\n\r\n return convertPositionToLocalMatrix;\r\n}();\r\n\r\nexport const convertPositionToWorldQuat = function () {\r\n const parentTransformMatrix = mat4_utils_create();\r\n const position = create();\r\n const rotation = quat_utils_create();\r\n const one = create();\r\n set(one, 1, 1, 1);\r\n\r\n function convertPositionToWorldQuat(vector: Readonly, parentTransform: Readonly): T;\r\n function convertPositionToWorldQuat(vector: Readonly, parentTransform: Readonly, out: T): T;\r\n function convertPositionToWorldQuat(vector: Readonly, parentTransform: Readonly, out: T | U = Vec3Utils.clone(vector)): T | U {\r\n Quat2Utils.getPosition(parentTransform, position);\r\n Quat2Utils.getRotationQuat(parentTransform, rotation);\r\n Mat4Utils.setPositionRotationQuatScale(parentTransformMatrix, position, rotation, one);\r\n return Vec3Utils.convertPositionToWorldMatrix(vector, parentTransformMatrix, out);\r\n }\r\n\r\n return convertPositionToWorldQuat;\r\n}();\r\n\r\nexport const convertPositionToLocalQuat = function () {\r\n const parentTransformMatrix = mat4_utils_create();\r\n const position = create();\r\n const rotation = quat_utils_create();\r\n const one = create();\r\n set(one, 1, 1, 1);\r\n\r\n function convertPositionToLocalQuat(vector: Readonly, parentTransform: Readonly): T;\r\n function convertPositionToLocalQuat(vector: Readonly, parentTransform: Readonly, out: T): T;\r\n function convertPositionToLocalQuat(vector: Readonly, parentTransform: Readonly, out: T | U = Vec3Utils.clone(vector)): T | U {\r\n Quat2Utils.getPosition(parentTransform, position);\r\n Quat2Utils.getRotationQuat(parentTransform, rotation);\r\n Mat4Utils.setPositionRotationQuatScale(parentTransformMatrix, position, rotation, one);\r\n return Vec3Utils.convertPositionToLocalMatrix(vector, parentTransformMatrix, out);\r\n }\r\n\r\n return convertPositionToLocalQuat;\r\n}();\r\n\r\nexport function convertDirectionToWorld(vector: Readonly, parentTransform: Readonly): T;\r\nexport function convertDirectionToWorld(vector: Readonly, parentTransform: Readonly, out: T): T;\r\nexport function convertDirectionToWorld(vector: Readonly, parentTransform: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.convertDirectionToWorldMatrix(vector, parentTransform, out!);\r\n}\r\n\r\nexport function convertDirectionToLocal(vector: Readonly, parentTransform: Readonly): T;\r\nexport function convertDirectionToLocal(vector: Readonly, parentTransform: Readonly, out: T): T;\r\nexport function convertDirectionToLocal(vector: Readonly, parentTransform: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.convertDirectionToLocalMatrix(vector, parentTransform, out!);\r\n}\r\n\r\nexport const convertDirectionToWorldMatrix = function () {\r\n const rotation = quat_utils_create();\r\n\r\n function convertDirectionToWorldMatrix(vector: Readonly, parentTransform: Readonly): T;\r\n function convertDirectionToWorldMatrix(vector: Readonly, parentTransform: Readonly, out: T): T;\r\n function convertDirectionToWorldMatrix(vector: Readonly, parentTransform: Readonly, out: T | U = Vec3Utils.clone(vector)): T | U {\r\n Mat4Utils.getRotationQuat(parentTransform, rotation);\r\n Vec3Utils.transformQuat(vector, rotation, out);\r\n return out;\r\n }\r\n\r\n return convertDirectionToWorldMatrix;\r\n}();\r\n\r\nexport const convertDirectionToLocalMatrix = function () {\r\n const rotation = quat_utils_create();\r\n\r\n function convertDirectionToLocalMatrix(vector: Readonly, parentTransform: Readonly): T;\r\n function convertDirectionToLocalMatrix(vector: Readonly, parentTransform: Readonly, out: T): T;\r\n function convertDirectionToLocalMatrix(vector: Readonly, parentTransform: Readonly, out: T | U = Vec3Utils.clone(vector)): T | U {\r\n Mat4Utils.getRotationQuat(parentTransform, rotation);\r\n QuatUtils.conjugate(rotation, rotation);\r\n Vec3Utils.transformQuat(vector, rotation, out);\r\n return out;\r\n }\r\n\r\n return convertDirectionToLocalMatrix;\r\n}();\r\n\r\n\r\nexport const convertDirectionToWorldQuat = function () {\r\n const rotation = quat_utils_create();\r\n\r\n function convertDirectionToWorldQuat(vector: Readonly, parentTransform: Readonly): T;\r\n function convertDirectionToWorldQuat(vector: Readonly, parentTransform: Readonly, out: T): T;\r\n function convertDirectionToWorldQuat(vector: Readonly, parentTransform: Readonly, out: T | U = Vec3Utils.clone(vector)): T | U {\r\n Quat2Utils.getRotationQuat(parentTransform, rotation);\r\n Vec3Utils.transformQuat(vector, rotation, out);\r\n return out;\r\n }\r\n\r\n return convertDirectionToWorldQuat;\r\n}();\r\n\r\nexport const convertDirectionToLocalQuat = function () {\r\n const rotation = quat_utils_create();\r\n\r\n function convertDirectionToLocalQuat(vector: Readonly, parentTransform: Readonly): T;\r\n function convertDirectionToLocalQuat(vector: Readonly, parentTransform: Readonly, out: T): T;\r\n function convertDirectionToLocalQuat(vector: Readonly, parentTransform: Readonly, out: T | U = Vec3Utils.clone(vector)): T | U {\r\n Quat2Utils.getRotationQuat(parentTransform, rotation);\r\n QuatUtils.conjugate(rotation, rotation);\r\n Vec3Utils.transformQuat(vector, rotation, out);\r\n return out;\r\n }\r\n\r\n return convertDirectionToLocalQuat;\r\n}();\r\n\r\nexport function toRadians(vector: Readonly): T;\r\nexport function toRadians(vector: Readonly, out: T): T;\r\nexport function toRadians(vector: Readonly, out: T | U = Vec3Utils.clone(vector)): T | U {\r\n Vec3Utils.set(out, MathUtils.toRadians(vector[0]), MathUtils.toRadians(vector[1]), MathUtils.toRadians(vector[2]));\r\n return out;\r\n}\r\n\r\nexport function toDegrees(vector: Readonly): T;\r\nexport function toDegrees(vector: Readonly, out: T): T;\r\nexport function toDegrees(vector: Readonly, out: T | U = Vec3Utils.clone(vector)): T | U {\r\n Vec3Utils.set(out, MathUtils.toDegrees(vector[0]), MathUtils.toDegrees(vector[1]), MathUtils.toDegrees(vector[2]));\r\n return out;\r\n}\r\n\r\nexport function toQuat(vector: Readonly): Quaternion;\r\nexport function toQuat(vector: Readonly, out: T): T;\r\nexport function toQuat(vector: Readonly, out: Quaternion | T = QuatUtils.create()): Quaternion | T {\r\n return Vec3Utils.degreesToQuat(vector, out);\r\n}\r\n\r\nexport function radiansToQuat(vector: Readonly): Quaternion;\r\nexport function radiansToQuat(vector: Readonly, out: T): T;\r\nexport function radiansToQuat(vector: Readonly, out: Quaternion | T = QuatUtils.create()): Quaternion | T {\r\n QuatUtils.fromRadians(vector, out);\r\n return out;\r\n}\r\n\r\nexport function degreesToQuat(vector: Readonly): Quaternion;\r\nexport function degreesToQuat(vector: Readonly, out: T): T;\r\nexport function degreesToQuat(vector: Readonly, out: Quaternion | T = QuatUtils.create()): Quaternion | T {\r\n QuatUtils.fromDegrees(vector, out);\r\n return out;\r\n}\r\n\r\nexport function toMatrix(vector: Readonly): Matrix3;\r\nexport function toMatrix(vector: Readonly, out: T): T;\r\nexport function toMatrix(vector: Readonly, out: Matrix3 | T = Mat3Utils.create()): Matrix3 | T {\r\n return Vec3Utils.degreesToMatrix(vector, out);\r\n}\r\n\r\nexport const degreesToMatrix = function () {\r\n const quat = quat_utils_create();\r\n\r\n function degreesToMatrix(vector: Readonly): Matrix3;\r\n function degreesToMatrix(vector: Readonly, out: T): T;\r\n function degreesToMatrix(vector: Readonly, out: Matrix3 | T = Mat3Utils.create()): Matrix3 | T {\r\n Vec3Utils.degreesToQuat(vector, quat);\r\n return QuatUtils.toMatrix(quat, out);\r\n }\r\n\r\n return degreesToMatrix;\r\n}();\r\n\r\nexport const radiansToMatrix = function () {\r\n const quat = quat_utils_create();\r\n\r\n function radiansToMatrix(vector: Readonly): Matrix3;\r\n function radiansToMatrix(vector: Readonly, out: T): T;\r\n function radiansToMatrix(vector: Readonly, out: Matrix3 | T = Mat3Utils.create()): Matrix3 | T {\r\n Vec3Utils.radiansToQuat(vector, quat);\r\n return QuatUtils.toMatrix(quat, out);\r\n }\r\n\r\n return radiansToMatrix;\r\n}();\r\n\r\n/**\r\n * How to use\r\n * \r\n * By default rotations are in `Degrees` and transforms are `Matrix4` (and not `Quat2`) \r\n * For functions that work with rotations, `Matrix` means `Matrix3` and `Quat` means `Quat` \r\n * For functions that work with transforms, `Matrix` means `Matrix4` and `Quat` means `Quat2`\r\n * \r\n * For rotations u can add a suffix like `Degrees`/`Radians`/`Quat`/`Matrix` to use a specific version, example: \r\n * - `angleDegrees` \r\n * - `rotateQuat`\r\n * \r\n * For transform u can add a suffix like `Quat`/`Matrix` to use a specific version, example: \r\n * - convertPositionToWorldMatrix \r\n * - convertDirectionToWorldQuat\r\n * \r\n * Some functions let u add a prefix to specify if the vector represent a rotation in `Degrees` or `Radians`, where `Degrees` is the default: \r\n * - toQuat \r\n * - degreesToQuat \r\n * - radiansToQuat \r\n * - degreesAddRotation\r\n * \r\n * Rotation operations return a rotation of the same kind of the starting variable: \r\n * - degreesAddRotationQuat -> returns a rotation in `Degrees` \r\n * - radiansAddRotationDegrees -> returns a rotation in `Radians`\r\n * \r\n * The functions leave u the choice of forwarding an out parameter or just get the return value, example: \r\n * - `let negate = Vec3Utils.negate(vector)` \r\n * - `Vec3Utils.negate(vector, negate)` \r\n * - the out parameter is always the last one\r\n */\r\nexport const Vec3Utils = {\r\n create,\r\n getAllocationFunction,\r\n setAllocationFunction,\r\n set,\r\n copy,\r\n clone,\r\n equals,\r\n isNormalized,\r\n normalize,\r\n isZero,\r\n zero,\r\n length,\r\n lengthSquared,\r\n lengthSigned,\r\n distance,\r\n distanceSquared,\r\n add,\r\n sub,\r\n mul,\r\n div,\r\n scale,\r\n negate,\r\n dot,\r\n cross,\r\n transformQuat,\r\n transformMat3,\r\n transformMat4,\r\n lerp,\r\n interpolate,\r\n angle,\r\n angleDegrees,\r\n angleRadians,\r\n angleSigned,\r\n angleSignedDegrees,\r\n angleSignedRadians,\r\n anglePivoted,\r\n anglePivotedDegrees,\r\n anglePivotedRadians,\r\n anglePivotedSigned,\r\n anglePivotedSignedDegrees,\r\n anglePivotedSignedRadians,\r\n valueAlongAxis,\r\n valueAlongPlane,\r\n componentAlongAxis,\r\n removeComponentAlongAxis,\r\n copyComponentAlongAxis,\r\n isConcordant,\r\n isFartherAlongAxis,\r\n isToTheRight,\r\n signTo,\r\n projectOnAxis,\r\n projectOnAxisAlongAxis,\r\n projectOnPlane,\r\n projectOnPlaneAlongAxis,\r\n isOnAxis,\r\n isOnPlane,\r\n perpendicularAny,\r\n rotate,\r\n rotateDegrees,\r\n rotateRadians,\r\n rotateQuat,\r\n rotateAxis,\r\n rotateAxisDegrees,\r\n rotateAxisRadians,\r\n rotateAround,\r\n rotateAroundDegrees,\r\n rotateAroundRadians,\r\n rotateAroundQuat,\r\n rotateAroundAxis,\r\n rotateAroundAxisDegrees,\r\n rotateAroundAxisRadians,\r\n addRotation,\r\n addRotationDegrees,\r\n addRotationRadians,\r\n addRotationQuat,\r\n degreesAddRotation,\r\n degreesAddRotationDegrees,\r\n degreesAddRotationRadians,\r\n degreesAddRotationQuat,\r\n radiansAddRotation,\r\n radiansAddRotationDegrees,\r\n radiansAddRotationRadians,\r\n radiansAddRotationQuat,\r\n rotationTo,\r\n rotationToDegrees,\r\n rotationToRadians,\r\n rotationToQuat,\r\n rotationToPivoted,\r\n rotationToPivotedDegrees,\r\n rotationToPivotedRadians,\r\n rotationToPivotedQuat,\r\n convertPositionToWorld,\r\n convertPositionToLocal,\r\n convertPositionToWorldMatrix,\r\n convertPositionToLocalMatrix,\r\n convertPositionToWorldQuat,\r\n convertPositionToLocalQuat,\r\n convertDirectionToWorld,\r\n convertDirectionToLocal,\r\n convertDirectionToWorldMatrix,\r\n convertDirectionToLocalMatrix,\r\n convertDirectionToWorldQuat,\r\n convertDirectionToLocalQuat,\r\n toRadians,\r\n toDegrees,\r\n toQuat,\r\n radiansToQuat,\r\n degreesToQuat,\r\n toMatrix,\r\n degreesToMatrix,\r\n radiansToMatrix\r\n} as const;", "\r\nimport { mat4 as gl_mat4, type mat4 as gl_mat4_type, type vec3 as gl_vec3_type } from \"gl-matrix\";\r\nimport { Matrix4, Quaternion, Quaternion2, Vector3 } from \"../../type_definitions/array_type_definitions.js\";\r\nimport { MathUtils } from \"../math_utils.js\";\r\nimport { Quat2Utils } from \"./quat2_utils.js\";\r\nimport { QuatUtils, create as quat_utils_create } from \"./quat_utils.js\";\r\nimport { Vec3Utils, create as vec3_utils_create, set as vec3_utils_set } from \"./vec3_utils.js\";\r\nimport { getMatrix4AllocationFunction, setMatrix4AllocationFunction } from \"./vec_allocation_utils.js\";\r\n\r\nexport function create(): Matrix4;\r\nexport function create(\r\n m00: number, m01: number, m02: number, m03: number,\r\n m10: number, m11: number, m12: number, m13: number,\r\n m20: number, m21: number, m22: number, m23: number,\r\n m30: number, m31: number, m32: number, m33: number): Matrix4;\r\nexport function create(uniformValue: number): Matrix4;\r\nexport function create(\r\n m00?: number, m01?: number, m02?: number, m03?: number,\r\n m10?: number, m11?: number, m12?: number, m13?: number,\r\n m20?: number, m21?: number, m22?: number, m23?: number,\r\n m30?: number, m31?: number, m32?: number, m33?: number): Matrix4 {\r\n const out = getAllocationFunction()();\r\n\r\n if (m00 != null) {\r\n Mat4Utils.set(\r\n out,\r\n m00, m01!, m02!, m03!,\r\n m10!, m11!, m12!, m13!,\r\n m20!, m21!, m22!, m23!,\r\n m30!, m31!, m32!, m33!);\r\n }\r\n\r\n return out;\r\n}\r\n\r\nexport function getAllocationFunction(): () => Matrix4 {\r\n return getMatrix4AllocationFunction();\r\n}\r\n\r\n/** Specify the function that will be used to allocate the matrix when calling the {@link create} function */\r\nexport function setAllocationFunction(allocationFunction: () => Matrix4): void {\r\n setMatrix4AllocationFunction(allocationFunction);\r\n}\r\n\r\nexport function set(matrix: T,\r\n m00: number, m01: number, m02: number, m03: number,\r\n m10: number, m11: number, m12: number, m13: number,\r\n m20: number, m21: number, m22: number, m23: number,\r\n m30: number, m31: number, m32: number, m33: number): T;\r\nexport function set(matrix: T, uniformValue: number): T;\r\nexport function set(matrix: T,\r\n m00: number, m01?: number, m02?: number, m03?: number,\r\n m10?: number, m11?: number, m12?: number, m13?: number,\r\n m20?: number, m21?: number, m22?: number, m23?: number,\r\n m30?: number, m31?: number, m32?: number, m33?: number): T {\r\n if (m01 == null) {\r\n gl_mat4.set(matrix as unknown as gl_mat4_type,\r\n m00, m00, m00, m00,\r\n m00, m00, m00, m00,\r\n m00, m00, m00, m00,\r\n m00, m00, m00, m00);\r\n } else {\r\n gl_mat4.set(matrix as unknown as gl_mat4_type,\r\n m00, m01, m02!, m03!,\r\n m10!, m11!, m12!, m13!,\r\n m20!, m21!, m22!, m23!,\r\n m30!, m31!, m32!, m33!);\r\n }\r\n\r\n return matrix;\r\n}\r\n\r\nexport function copy(from: Readonly, to: T): T {\r\n gl_mat4.copy(to as unknown as gl_mat4_type, from as unknown as gl_mat4_type);\r\n return to;\r\n}\r\n\r\n/** The overload where `T extends Matrix4` does also get `array` as `Readonly`, but is not marked as such due to \r\n Typescript having issues with inferring the proper type of `T` when `Readonly` is used */\r\nexport function clone(matrix: Readonly): T;\r\nexport function clone(matrix: Readonly): number[];\r\nexport function clone(matrix: T): T;\r\nexport function clone(matrix: Readonly): T {\r\n return matrix.slice(0) as T;\r\n}\r\n\r\nexport function equals(first: Readonly, second: Readonly, epsilon: number = 0): boolean {\r\n let equals = first.length == second.length;\r\n\r\n if (equals) {\r\n equals &&= (Math.abs(first[0] - second[0]) <= epsilon);\r\n equals &&= (Math.abs(first[1] - second[1]) <= epsilon);\r\n equals &&= (Math.abs(first[2] - second[2]) <= epsilon);\r\n equals &&= (Math.abs(first[3] - second[3]) <= epsilon);\r\n equals &&= (Math.abs(first[4] - second[4]) <= epsilon);\r\n equals &&= (Math.abs(first[5] - second[5]) <= epsilon);\r\n equals &&= (Math.abs(first[6] - second[6]) <= epsilon);\r\n equals &&= (Math.abs(first[7] - second[7]) <= epsilon);\r\n equals &&= (Math.abs(first[8] - second[8]) <= epsilon);\r\n equals &&= (Math.abs(first[9] - second[9]) <= epsilon);\r\n equals &&= (Math.abs(first[10] - second[10]) <= epsilon);\r\n equals &&= (Math.abs(first[11] - second[11]) <= epsilon);\r\n equals &&= (Math.abs(first[12] - second[12]) <= epsilon);\r\n equals &&= (Math.abs(first[13] - second[13]) <= epsilon);\r\n equals &&= (Math.abs(first[14] - second[14]) <= epsilon);\r\n equals &&= (Math.abs(first[15] - second[15]) <= epsilon);\r\n }\r\n\r\n return equals;\r\n}\r\n\r\nexport function identity(matrix: T): T {\r\n gl_mat4.identity(matrix as unknown as gl_mat4_type);\r\n return matrix;\r\n}\r\n\r\nexport function invert(matrix: Readonly): T;\r\nexport function invert(matrix: Readonly, out: T): T;\r\nexport function invert(matrix: Readonly, out: T | U = Mat4Utils.clone(matrix)): T | U {\r\n gl_mat4.invert(out as unknown as gl_mat4_type, matrix as unknown as gl_mat4_type);\r\n return out;\r\n}\r\n\r\nexport function mul(first: Readonly, second: Readonly): T;\r\nexport function mul(first: Readonly, second: Readonly, out: T): T;\r\nexport function mul(first: Readonly, second: Readonly, out: T | U = Mat4Utils.clone(first)): T | U {\r\n gl_mat4.mul(out as unknown as gl_mat4_type, first as unknown as gl_mat4_type, second as unknown as gl_mat4_type);\r\n return out;\r\n}\r\n\r\nexport function scale(matrix: Readonly, vector: Readonly): T;\r\nexport function scale(matrix: Readonly, vector: Readonly, out: T): T;\r\nexport function scale(matrix: Readonly, vector: Readonly, out: T | U = Mat4Utils.clone(matrix)): T | U {\r\n gl_mat4.scale(out as unknown as gl_mat4_type, matrix as unknown as gl_mat4_type, vector as unknown as gl_vec3_type);\r\n return out;\r\n}\r\n\r\nexport function getPosition(matrix: Readonly): Vector3;\r\nexport function getPosition(matrix: Readonly, out: T): T;\r\nexport function getPosition(matrix: Readonly, out: Vector3 | T = Vec3Utils.create()): Vector3 | T {\r\n gl_mat4.getTranslation(out as unknown as gl_vec3_type, matrix as unknown as gl_mat4_type);\r\n return out;\r\n}\r\n\r\nexport function getRotation(matrix: Readonly): Vector3;\r\nexport function getRotation(matrix: Readonly, out: T): T;\r\nexport function getRotation(matrix: Readonly, out?: Vector3 | T): Vector3 | T {\r\n return Mat4Utils.getRotationDegrees(matrix, out!);\r\n}\r\n\r\nexport const getRotationDegrees = function () {\r\n const quat = quat_utils_create();\r\n\r\n function getRotationDegrees(matrix: Readonly): Vector3;\r\n function getRotationDegrees(matrix: Readonly, out: T): T;\r\n function getRotationDegrees(matrix: Readonly, out: Vector3 | T = Vec3Utils.create()): Vector3 | T {\r\n Mat4Utils.getRotationQuat(matrix, quat);\r\n QuatUtils.toDegrees(quat, out);\r\n return out;\r\n }\r\n\r\n return getRotationDegrees;\r\n}();\r\n\r\nexport const getRotationRadians = function () {\r\n const quat = quat_utils_create();\r\n\r\n function getRotationRadians(matrix: Readonly): Vector3;\r\n function getRotationRadians(matrix: Readonly, out: T): T;\r\n function getRotationRadians(matrix: Readonly, out: Vector3 | T = Vec3Utils.create()): Vector3 | T {\r\n Mat4Utils.getRotationQuat(matrix, quat);\r\n QuatUtils.toRadians(quat, out);\r\n return out;\r\n }\r\n\r\n return getRotationRadians;\r\n}();\r\n\r\nexport const getRotationQuat = function () {\r\n const tempScale = vec3_utils_create();\r\n const transformMatrixNoScale = create();\r\n const inverseScale = vec3_utils_create();\r\n const one = vec3_utils_create();\r\n vec3_utils_set(one, 1, 1, 1);\r\n\r\n function getRotationQuat(matrix: Readonly): Quaternion;\r\n function getRotationQuat(matrix: Readonly, out: T): T;\r\n function getRotationQuat(matrix: Readonly, out: Quaternion | T = QuatUtils.create()): Quaternion | T {\r\n Mat4Utils.getScale(matrix, tempScale);\r\n Vec3Utils.div(one, tempScale, inverseScale);\r\n Mat4Utils.scale(matrix, inverseScale, transformMatrixNoScale);\r\n _customGLMatrixGetRotation(out, transformMatrixNoScale);\r\n return out;\r\n }\r\n\r\n return getRotationQuat;\r\n}();\r\n\r\nexport function getScale(matrix: Readonly): Vector3;\r\nexport function getScale(matrix: Readonly, out: T): T;\r\nexport function getScale(matrix: Readonly, out: Vector3 | T = Vec3Utils.create()): Vector3 | T {\r\n gl_mat4.getScaling(out as unknown as gl_vec3_type, matrix as unknown as gl_mat4_type);\r\n return out;\r\n}\r\n\r\nexport function setPosition(matrix: T, position: Readonly): T {\r\n matrix[12] = position[0];\r\n matrix[13] = position[1];\r\n matrix[14] = position[2];\r\n return matrix;\r\n}\r\n\r\nexport function setRotation(matrix: T, rotation: Readonly): T {\r\n Mat4Utils.setRotationDegrees(matrix, rotation);\r\n return matrix;\r\n}\r\n\r\nexport const setRotationDegrees = function () {\r\n const quat = quat_utils_create();\r\n return function setRotationDegrees(matrix: T, rotation: Readonly): T {\r\n Mat4Utils.setRotationQuat(matrix, Vec3Utils.degreesToQuat(rotation, quat));\r\n return matrix;\r\n };\r\n}();\r\n\r\nexport const setRotationRadians = function () {\r\n const vector = vec3_utils_create();\r\n return function setRotationRadians(matrix: T, rotation: Readonly): T {\r\n Mat4Utils.setRotationDegrees(matrix, Vec3Utils.toDegrees(rotation, vector));\r\n return matrix;\r\n };\r\n}();\r\n\r\nexport const setRotationQuat = function () {\r\n const position = vec3_utils_create();\r\n const scale = vec3_utils_create();\r\n return function setRotationQuat(matrix: T, rotation: Readonly): T {\r\n Mat4Utils.getPosition(matrix, position);\r\n Mat4Utils.getScale(matrix, scale);\r\n Mat4Utils.setPositionRotationQuatScale(matrix, position, rotation, scale);\r\n return matrix;\r\n };\r\n}();\r\n\r\nexport const setScale = function () {\r\n const tempScale = vec3_utils_create();\r\n return function setScale(matrix: T, scale: Readonly): T {\r\n Mat4Utils.getScale(matrix, tempScale);\r\n Vec3Utils.div(scale, tempScale, tempScale);\r\n Mat4Utils.scale(matrix, tempScale, matrix);\r\n return matrix;\r\n };\r\n}();\r\n\r\nexport function setPositionRotationScale(matrix: T, position: Readonly, rotation: Readonly, scale: Readonly): T {\r\n Mat4Utils.setPositionRotationDegreesScale(matrix, position, rotation, scale);\r\n return matrix;\r\n}\r\n\r\nexport const setPositionRotationDegreesScale = function () {\r\n const quat = quat_utils_create();\r\n return function setPositionRotationDegreesScale(matrix: T, position: Readonly, rotation: Readonly, scale: Readonly): T {\r\n Mat4Utils.setPositionRotationQuatScale(matrix, position, Vec3Utils.degreesToQuat(rotation, quat), scale);\r\n return matrix;\r\n };\r\n}();\r\n\r\nexport const setPositionRotationRadiansScale = function () {\r\n const vector = vec3_utils_create();\r\n return function setPositionRotationRadiansScale(matrix: T, position: Readonly, rotation: Readonly, scale: Readonly): T {\r\n Mat4Utils.setPositionRotationDegreesScale(matrix, position, Vec3Utils.toDegrees(rotation, vector), scale);\r\n return matrix;\r\n };\r\n}();\r\n\r\nexport function setPositionRotationQuatScale(matrix: T, position: Readonly, rotation: Readonly, scale: Readonly): T {\r\n gl_mat4.fromRotationTranslationScale(matrix as unknown as gl_mat4_type, rotation as unknown as gl_vec3_type, position as unknown as gl_vec3_type, scale as unknown as gl_vec3_type);\r\n return matrix;\r\n}\r\n\r\nexport function setPositionRotation(matrix: T, position: Readonly, rotation: Readonly): T {\r\n Mat4Utils.setPositionRotationDegrees(matrix, position, rotation);\r\n return matrix;\r\n}\r\n\r\nexport const setPositionRotationDegrees = function () {\r\n const quat = quat_utils_create();\r\n return function setPositionRotationDegrees(matrix: T, position: Readonly, rotation: Readonly): T {\r\n Mat4Utils.setPositionRotationQuat(matrix, position, Vec3Utils.degreesToQuat(rotation, quat));\r\n return matrix;\r\n };\r\n}();\r\n\r\nexport const setPositionRotationRadians = function () {\r\n const vector = vec3_utils_create();\r\n return function setPositionRotationRadians(matrix: T, position: Readonly, rotation: Readonly): T {\r\n Mat4Utils.setPositionRotationDegrees(matrix, position, Vec3Utils.toDegrees(rotation, vector));\r\n return matrix;\r\n };\r\n}();\r\n\r\nexport function setPositionRotationQuat(matrix: T, position: Readonly, rotation: Readonly): T {\r\n gl_mat4.fromRotationTranslation(matrix as unknown as gl_mat4_type, rotation as unknown as gl_vec3_type, position as unknown as gl_vec3_type);\r\n return matrix;\r\n}\r\n\r\nexport function getAxes(matrix: Readonly): [Vector3, Vector3, Vector3];\r\nexport function getAxes(matrix: Readonly, out: [T, U, V]): [T, U, V];\r\nexport function getAxes(matrix: Readonly, out: [Vector3, Vector3, Vector3] | [T, U, V] = [Vec3Utils.create(), Vec3Utils.create(), Vec3Utils.create()]): [Vector3, Vector3, Vector3] | [T, U, V] {\r\n Mat4Utils.getLeft(matrix, out[0]);\r\n Mat4Utils.getUp(matrix, out[1]);\r\n Mat4Utils.getForward(matrix, out[2]);\r\n\r\n return out;\r\n}\r\n\r\nexport function getForward(matrix: Readonly): Vector3;\r\nexport function getForward(matrix: Readonly, out: T): T;\r\nexport function getForward(matrix: Readonly, out: Vector3 | T = Vec3Utils.create()): Vector3 | T {\r\n Vec3Utils.set(out, matrix[8], matrix[9], matrix[10]);\r\n Vec3Utils.normalize(out, out);\r\n return out;\r\n}\r\n\r\nexport function getBackward(matrix: Readonly): Vector3;\r\nexport function getBackward(matrix: Readonly, out: T): T;\r\nexport function getBackward(matrix: Readonly, out?: Vector3 | T): Vector3 | T {\r\n out = Mat4Utils.getForward(matrix, out!);\r\n Vec3Utils.negate(out, out);\r\n return out;\r\n}\r\n\r\nexport function getLeft(matrix: Readonly): Vector3;\r\nexport function getLeft(matrix: Readonly, out: T): T;\r\nexport function getLeft(matrix: Readonly, out: Vector3 | T = Vec3Utils.create()): Vector3 | T {\r\n Vec3Utils.set(out, matrix[0], matrix[1], matrix[2]);\r\n Vec3Utils.normalize(out, out);\r\n return out;\r\n}\r\n\r\nexport function getRight(matrix: Readonly): Vector3;\r\nexport function getRight(matrix: Readonly, out: T): T;\r\nexport function getRight(matrix: Readonly, out?: Vector3 | T): Vector3 | T {\r\n out = Mat4Utils.getLeft(matrix, out!);\r\n Vec3Utils.negate(out, out);\r\n return out;\r\n}\r\n\r\nexport function getUp(matrix: Readonly): Vector3;\r\nexport function getUp(matrix: Readonly, out: T): T;\r\nexport function getUp(matrix: Readonly, out: Vector3 | T = Vec3Utils.create()): Vector3 | T {\r\n Vec3Utils.set(out, matrix[4], matrix[5], matrix[6]);\r\n Vec3Utils.normalize(out, out);\r\n return out;\r\n}\r\n\r\nexport function getDown(matrix: Readonly): Vector3;\r\nexport function getDown(matrix: Readonly, out: T): T;\r\nexport function getDown(matrix: Readonly, out?: Vector3 | T): Vector3 | T {\r\n out = Mat4Utils.getUp(matrix, out!);\r\n Vec3Utils.negate(out, out);\r\n return out;\r\n}\r\n\r\nexport const hasUniformScale = function () {\r\n const scale = vec3_utils_create();\r\n return function hasUniformScale(matrix: Readonly): boolean {\r\n Mat4Utils.getScale(matrix, scale);\r\n return Math.abs(scale[0] - scale[1]) < MathUtils.EPSILON && Math.abs(scale[1] - scale[2]) < MathUtils.EPSILON && Math.abs(scale[0] - scale[2]) < MathUtils.EPSILON;\r\n };\r\n}();\r\n\r\nexport const toWorld = function () {\r\n const convertTransform = create();\r\n const position = vec3_utils_create();\r\n const tempScale = vec3_utils_create();\r\n const inverseScale = vec3_utils_create();\r\n const one = vec3_utils_create();\r\n vec3_utils_set(one, 1, 1, 1);\r\n\r\n function toWorld(matrix: Readonly, parentTransformMatrix: Readonly): T;\r\n function toWorld(matrix: Readonly, parentTransformMatrix: Readonly, out: T): T;\r\n function toWorld(matrix: Readonly, parentTransformMatrix: Readonly, out: T | U = Mat4Utils.clone(matrix)): T | U {\r\n if (Mat4Utils.hasUniformScale(parentTransformMatrix)) {\r\n Mat4Utils.mul(parentTransformMatrix, matrix, out);\r\n } else {\r\n Vec3Utils.set(position, matrix[12], matrix[13], matrix[14]);\r\n Vec3Utils.convertPositionToWorldMatrix(position, parentTransformMatrix, position);\r\n\r\n Mat4Utils.getScale(parentTransformMatrix, tempScale);\r\n Vec3Utils.div(one, tempScale, inverseScale);\r\n Mat4Utils.scale(parentTransformMatrix, inverseScale, convertTransform);\r\n\r\n Mat4Utils.mul(convertTransform, matrix, out);\r\n Mat4Utils.scale(out, tempScale, out);\r\n\r\n out[12] = position[0];\r\n out[13] = position[1];\r\n out[14] = position[2];\r\n out[15] = 1;\r\n }\r\n return out;\r\n }\r\n\r\n return toWorld;\r\n}();\r\n\r\nexport const toLocal = function () {\r\n const convertTransform = create();\r\n const position = vec3_utils_create();\r\n const tempScale = vec3_utils_create();\r\n const inverseScale = vec3_utils_create();\r\n const one = vec3_utils_create();\r\n vec3_utils_set(one, 1, 1, 1);\r\n\r\n function toLocal(matrix: Readonly, parentTransformMatrix: Readonly): T;\r\n function toLocal(matrix: Readonly, parentTransformMatrix: Readonly, out: T): T;\r\n function toLocal(matrix: Readonly, parentTransformMatrix: Readonly, out: T | U = Mat4Utils.clone(matrix)): T | U {\r\n if (Mat4Utils.hasUniformScale(parentTransformMatrix)) {\r\n Mat4Utils.invert(parentTransformMatrix, convertTransform);\r\n Mat4Utils.mul(convertTransform, matrix, out);\r\n } else {\r\n Vec3Utils.set(position, matrix[12], matrix[13], matrix[14]);\r\n Vec3Utils.convertPositionToLocalMatrix(position, parentTransformMatrix, position);\r\n\r\n Mat4Utils.getScale(parentTransformMatrix, tempScale);\r\n Vec3Utils.div(one, tempScale, inverseScale);\r\n Mat4Utils.scale(parentTransformMatrix, inverseScale, convertTransform);\r\n\r\n Mat4Utils.invert(convertTransform, convertTransform);\r\n Mat4Utils.mul(convertTransform, matrix, out);\r\n Mat4Utils.scale(out, inverseScale, out);\r\n\r\n out[12] = position[0];\r\n out[13] = position[1];\r\n out[14] = position[2];\r\n out[15] = 1;\r\n }\r\n return out;\r\n }\r\n\r\n return toLocal;\r\n}();\r\n\r\nexport const toQuat = function () {\r\n const position = vec3_utils_create();\r\n const rotation = quat_utils_create();\r\n\r\n function toQuat(matrix: Readonly): Quaternion2;\r\n function toQuat(matrix: Readonly, out: T): T;\r\n function toQuat(matrix: Readonly, out: Quaternion2 | T = Quat2Utils.create()): Quaternion2 | T {\r\n Mat4Utils.getPosition(matrix, position);\r\n Mat4Utils.getRotationQuat(matrix, rotation);\r\n Quat2Utils.setPositionRotationQuat(out, position, rotation);\r\n return out;\r\n }\r\n\r\n return toQuat;\r\n}();\r\n\r\nexport function fromQuat(quat: Readonly): Matrix4;\r\nexport function fromQuat(quat: Readonly, out: T): T;\r\nexport function fromQuat(quat: Readonly, out: Matrix4 | T = Mat4Utils.create()): Matrix4 | T {\r\n Quat2Utils.toMatrix(quat, out);\r\n return out;\r\n}\r\n\r\n/**\r\n * How to use\r\n * \r\n * By default rotations are in `Degrees` and transforms are `Matrix4` (and not `Quat2`) \r\n * For functions that work with rotations, `Matrix` means `Matrix3` and `Quat` means `Quat` \r\n * For functions that work with transforms, `Matrix` means `Matrix4` and `Quat` means `Quat2`\r\n * \r\n * For rotations u can add a suffix like `Degrees`/`Radians`/`Quat`/`Matrix` to use a specific version, example: \r\n * - `getRotationRadians` \r\n * - `setRotationQuat`\r\n * \r\n * The functions leave u the choice of forwarding an out parameter or just get the return value, example: \r\n * - `let position = Mat4Utils.getPosition(matrix)` \r\n * - `Mat4Utils.getPosition(matrix, position)` \r\n * - the out parameter is always the last one\r\n */\r\nexport const Mat4Utils = {\r\n create,\r\n getAllocationFunction,\r\n setAllocationFunction,\r\n set,\r\n copy,\r\n clone,\r\n equals,\r\n identity,\r\n invert,\r\n mul,\r\n scale,\r\n getPosition,\r\n getRotation,\r\n getRotationDegrees,\r\n getRotationRadians,\r\n getRotationQuat,\r\n getScale,\r\n setPosition,\r\n setRotation,\r\n setRotationDegrees,\r\n setRotationRadians,\r\n setRotationQuat,\r\n setScale,\r\n setPositionRotationScale,\r\n setPositionRotationDegreesScale,\r\n setPositionRotationRadiansScale,\r\n setPositionRotationQuatScale,\r\n setPositionRotation,\r\n setPositionRotationDegrees,\r\n setPositionRotationRadians,\r\n setPositionRotationQuat,\r\n getAxes,\r\n getForward,\r\n getBackward,\r\n getLeft,\r\n getRight,\r\n getUp,\r\n getDown,\r\n hasUniformScale,\r\n toWorld,\r\n toLocal,\r\n toQuat,\r\n fromQuat\r\n} as const;\r\n\r\n\r\n\r\n/** This is used in place of the glMatrix one to avoid the array allocation */\r\nconst _customGLMatrixGetRotation = function () {\r\n const scaling = vec3_utils_create();\r\n return function _customGLMatrixGetRotation(out: Quaternion, mat: Matrix4): Quaternion {\r\n gl_mat4.getScaling(scaling as unknown as gl_vec3_type, mat as unknown as gl_mat4_type);\r\n\r\n const is1 = 1 / scaling[0];\r\n const is2 = 1 / scaling[1];\r\n const is3 = 1 / scaling[2];\r\n\r\n const sm11 = mat[0] * is1;\r\n const sm12 = mat[1] * is2;\r\n const sm13 = mat[2] * is3;\r\n const sm21 = mat[4] * is1;\r\n const sm22 = mat[5] * is2;\r\n const sm23 = mat[6] * is3;\r\n const sm31 = mat[8] * is1;\r\n const sm32 = mat[9] * is2;\r\n const sm33 = mat[10] * is3;\r\n\r\n const trace = sm11 + sm22 + sm33;\r\n\r\n if (trace > 0) {\r\n const s = Math.sqrt(trace + 1.0) * 2;\r\n out[3] = 0.25 * s;\r\n out[0] = (sm23 - sm32) / s;\r\n out[1] = (sm31 - sm13) / s;\r\n out[2] = (sm12 - sm21) / s;\r\n } else if (sm11 > sm22 && sm11 > sm33) {\r\n const s = Math.sqrt(1.0 + sm11 - sm22 - sm33) * 2;\r\n out[3] = (sm23 - sm32) / s;\r\n out[0] = 0.25 * s;\r\n out[1] = (sm12 + sm21) / s;\r\n out[2] = (sm31 + sm13) / s;\r\n } else if (sm22 > sm33) {\r\n const s = Math.sqrt(1.0 + sm22 - sm11 - sm33) * 2;\r\n out[3] = (sm31 - sm13) / s;\r\n out[0] = (sm12 + sm21) / s;\r\n out[1] = 0.25 * s;\r\n out[2] = (sm23 + sm32) / s;\r\n } else {\r\n const s = Math.sqrt(1.0 + sm33 - sm11 - sm22) * 2;\r\n out[3] = (sm12 - sm21) / s;\r\n out[0] = (sm31 + sm13) / s;\r\n out[1] = (sm23 + sm32) / s;\r\n out[2] = 0.25 * s;\r\n }\r\n\r\n return out;\r\n };\r\n}();", "import { mat4 as gl_mat4, quat2 as gl_quat2, type mat4 as gl_mat4_type, type quat2 as gl_quat2_type, type quat as gl_quat_type, type vec3 as gl_vec3_type, type vec4 as gl_vec4_type } from \"gl-matrix\";\r\nimport { Matrix4, Quaternion, Quaternion2, Vector3 } from \"../../../cauldron/type_definitions/array_type_definitions.js\";\r\nimport { EasingFunction, MathUtils } from \"../math_utils.js\";\r\nimport { create as mat3_utils_create } from \"./mat3_utils.js\";\r\nimport { Mat4Utils } from \"./mat4_utils.js\";\r\nimport { QuatUtils, create as quat_utils_create } from \"./quat_utils.js\";\r\nimport { Vec3Utils, create as vec3_utils_create } from \"./vec3_utils.js\";\r\nimport { getQuaternion2AllocationFunction, setQuaternion2AllocationFunction } from \"./vec_allocation_utils.js\";\r\n\r\nexport function create(): Quaternion2;\r\nexport function create(x1: number, y1: number, z1: number, w1: number, x2: number, y2: number, z2: number, w2: number): Quaternion2;\r\nexport function create(x1?: number, y1?: number, z1?: number, w1?: number, x2?: number, y2?: number, z2?: number, w2?: number): Quaternion2 {\r\n const out = getAllocationFunction()();\r\n\r\n if (x1 != null) {\r\n Quat2Utils.set(out, x1, y1!, z1!, w1!, x2!, y2!, z2!, w2!);\r\n }\r\n\r\n return out;\r\n}\r\n\r\nexport function getAllocationFunction(): () => Quaternion2 {\r\n return getQuaternion2AllocationFunction();\r\n}\r\n\r\n/** Specify the function that will be used to allocate the quaternion when calling the {@link create} function */\r\nexport function setAllocationFunction(allocationFunction: () => Quaternion2): void {\r\n setQuaternion2AllocationFunction(allocationFunction);\r\n}\r\n\r\nexport function set(quat: T, x1: number, y1: number, z1: number, w1: number, x2: number, y2: number, z2: number, w2: number): T;\r\nexport function set(quat: T, uniformValue: number): T;\r\nexport function set(quat: T, x1: number, y1?: number, z1?: number, w1?: number, x2?: number, y2?: number, z2?: number, w2?: number): T {\r\n if (y1 == null) {\r\n gl_quat2.set(quat as unknown as gl_quat2_type, x1, x1, x1, x1, x1, x1, x1, x1);\r\n } else {\r\n gl_quat2.set(quat as unknown as gl_quat2_type, x1, y1, z1!, w1!, x2!, y2!, z2!, w2!);\r\n }\r\n\r\n return quat;\r\n}\r\n\r\nexport function copy(from: Readonly, to: T): T {\r\n gl_quat2.copy(to as unknown as gl_quat2_type, from as unknown as gl_quat2_type);\r\n return to;\r\n}\r\n\r\n/** The overload where `T extends Quaternion2` does also get `array` as `Readonly`, but is not marked as such due to \r\n Typescript having issues with inferring the proper type of `T` when `Readonly` is used */\r\nexport function clone(quat: Readonly): T;\r\nexport function clone(quat: Readonly): number[];\r\nexport function clone(quat: T): T;\r\nexport function clone(quat: Readonly): T {\r\n return quat.slice(0) as T;\r\n}\r\n\r\nexport function equals(first: Readonly, second: Readonly, epsilon: number = 0): boolean {\r\n let equals = first.length == second.length;\r\n\r\n if (equals) {\r\n equals &&= (Math.abs(first[0] - second[0]) <= epsilon);\r\n equals &&= (Math.abs(first[1] - second[1]) <= epsilon);\r\n equals &&= (Math.abs(first[2] - second[2]) <= epsilon);\r\n equals &&= (Math.abs(first[3] - second[3]) <= epsilon);\r\n equals &&= (Math.abs(first[4] - second[4]) <= epsilon);\r\n equals &&= (Math.abs(first[5] - second[5]) <= epsilon);\r\n equals &&= (Math.abs(first[6] - second[6]) <= epsilon);\r\n equals &&= (Math.abs(first[7] - second[7]) <= epsilon);\r\n }\r\n\r\n return equals;\r\n}\r\n\r\nexport function isNormalized(quat: Readonly, epsilon: number = MathUtils.EPSILON): boolean {\r\n return Math.abs(Quat2Utils.lengthSquared(quat) - 1) < epsilon;\r\n}\r\n\r\nexport function normalize(quat: Readonly): T;\r\nexport function normalize(quat: Readonly, out: T): T;\r\nexport function normalize(quat: Readonly, out: T | U = Quat2Utils.clone(quat)): T | U {\r\n gl_quat2.normalize(out as unknown as gl_quat2_type, quat as unknown as gl_quat2_type);\r\n return out;\r\n}\r\n\r\nexport function length(quat: Readonly): number {\r\n return gl_quat2.length(quat as unknown as gl_vec4_type);\r\n}\r\n\r\nexport function lengthSquared(quat: Readonly): number {\r\n return gl_quat2.squaredLength(quat as unknown as gl_vec4_type);\r\n}\r\n\r\nexport function identity(quat: T): T {\r\n gl_quat2.identity(quat as unknown as gl_quat2_type);\r\n return quat;\r\n}\r\n\r\nexport function mul(first: Readonly, second: Readonly): T;\r\nexport function mul(first: Readonly, second: Readonly, out: T): T;\r\nexport function mul(first: Readonly, second: Readonly, out: T | U = Quat2Utils.clone(first)): T | U {\r\n gl_quat2.mul(out as unknown as gl_quat2_type, first as unknown as gl_quat2_type, second as unknown as gl_quat2_type);\r\n return out;\r\n}\r\n\r\nexport function invert(quat: Readonly): T;\r\nexport function invert(quat: Readonly, out: T): T;\r\nexport function invert(quat: Readonly, out: T | U = Quat2Utils.clone(quat)): T | U {\r\n gl_quat2.invert(out as unknown as gl_quat2_type, quat as unknown as gl_quat2_type);\r\n return out;\r\n}\r\n\r\nexport function conjugate(quat: Readonly): T;\r\nexport function conjugate(quat: Readonly, out: T): T;\r\nexport function conjugate(quat: Readonly, out: T | U = Quat2Utils.clone(quat)): T | U {\r\n gl_quat2.conjugate(out as unknown as gl_quat2_type, quat as unknown as gl_quat2_type);\r\n return out;\r\n}\r\n\r\nexport function lerp(from: Readonly, to: Readonly, interpolationFactor: number): T;\r\nexport function lerp(from: Readonly, to: Readonly, interpolationFactor: number, out: T): T;\r\nexport function lerp(from: Readonly, to: Readonly, interpolationFactor: number, out: T | U = Quat2Utils.clone(from)): T | U {\r\n if (interpolationFactor <= 0) {\r\n Quat2Utils.copy(from, out);\r\n return out;\r\n } else if (interpolationFactor >= 1) {\r\n Quat2Utils.copy(to, out);\r\n return out;\r\n }\r\n\r\n gl_quat2.lerp(out as unknown as gl_quat2_type, from as unknown as gl_quat2_type, to as unknown as gl_quat2_type, interpolationFactor);\r\n return out;\r\n}\r\n\r\nexport function interpolate(from: Readonly, to: Readonly, interpolationFactor: number, easingFunction?: EasingFunction): T;\r\nexport function interpolate(from: Readonly, to: Readonly, interpolationFactor: number, easingFunction: EasingFunction, out: T): T;\r\nexport function interpolate(from: Readonly, to: Readonly, interpolationFactor: number, easingFunction: EasingFunction = EasingFunction.linear, out: T | U = Quat2Utils.clone(from)): T | U {\r\n const lerpFactor = easingFunction(interpolationFactor);\r\n return Quat2Utils.lerp(from, to, lerpFactor, out);\r\n}\r\n\r\nexport const slerp = function () {\r\n const fromPosition = vec3_utils_create();\r\n const toPosition = vec3_utils_create();\r\n const interpolatedPosition = vec3_utils_create();\r\n const fromRotationQuat = quat_utils_create();\r\n const toRotationQuat = quat_utils_create();\r\n const interpolatedRotationQuat = quat_utils_create();\r\n\r\n function slerp(from: Readonly, to: Readonly, interpolationFactor: number): T;\r\n function slerp(from: Readonly, to: Readonly, interpolationFactor: number, out: T): T;\r\n function slerp(from: Readonly, to: Readonly, interpolationFactor: number, out: T | U = Quat2Utils.clone(from)): T | U {\r\n if (interpolationFactor <= 0) {\r\n Quat2Utils.copy(from, out);\r\n return out;\r\n } else if (interpolationFactor >= 1) {\r\n Quat2Utils.copy(to, out);\r\n return out;\r\n }\r\n\r\n Quat2Utils.getPosition(from, fromPosition);\r\n Quat2Utils.getPosition(to, toPosition);\r\n\r\n Quat2Utils.getRotationQuat(from, fromRotationQuat);\r\n Quat2Utils.getRotationQuat(to, toRotationQuat);\r\n\r\n Vec3Utils.lerp(fromPosition, toPosition, interpolationFactor, interpolatedPosition);\r\n QuatUtils.slerp(fromRotationQuat, toRotationQuat, interpolationFactor, interpolatedRotationQuat);\r\n\r\n Quat2Utils.setPositionRotationQuat(out, interpolatedPosition, interpolatedRotationQuat);\r\n return out;\r\n }\r\n\r\n return slerp;\r\n}();\r\n\r\nexport function interpolateSpherical(from: Readonly, to: Readonly, interpolationFactor: number, easingFunction?: EasingFunction): T;\r\nexport function interpolateSpherical(from: Readonly, to: Readonly, interpolationFactor: number, easingFunction: EasingFunction, out: T): T;\r\nexport function interpolateSpherical(from: Readonly, to: Readonly, interpolationFactor: number, easingFunction: EasingFunction = EasingFunction.linear, out: T | U = Quat2Utils.clone(from)): T | U {\r\n const lerpFactor = easingFunction(interpolationFactor);\r\n return Quat2Utils.slerp(from, to, lerpFactor, out);\r\n}\r\n\r\nexport function getPosition(quat: Readonly): Vector3;\r\nexport function getPosition(quat: Readonly, out: T): T;\r\nexport function getPosition(quat: Readonly, out: Vector3 | T = Vec3Utils.create()): Vector3 | T {\r\n gl_quat2.getTranslation(out as unknown as gl_vec3_type, quat as unknown as gl_quat2_type);\r\n return out;\r\n}\r\n\r\nexport function getRotation(quat: Readonly): Vector3;\r\nexport function getRotation(quat: Readonly, out: T): T;\r\nexport function getRotation(quat: Readonly, out?: Vector3 | T): Vector3 | T {\r\n return Quat2Utils.getRotationDegrees(quat, out!);\r\n}\r\n\r\nexport const getRotationDegrees = function () {\r\n const rotationQuat = quat_utils_create();\r\n\r\n function getRotationDegrees(quat: Readonly): Vector3;\r\n function getRotationDegrees(quat: Readonly, out: T): T;\r\n function getRotationDegrees(quat: Readonly, out: Vector3 | T = Vec3Utils.create()): Vector3 | T {\r\n QuatUtils.toDegrees(Quat2Utils.getRotationQuat(quat, rotationQuat), out);\r\n return out;\r\n }\r\n\r\n return getRotationDegrees;\r\n}();\r\n\r\nexport const getRotationRadians = function () {\r\n const rotationQuat = quat_utils_create();\r\n\r\n function getRotationRadians(quat: Readonly): Vector3;\r\n function getRotationRadians(quat: Readonly, out: T): T;\r\n function getRotationRadians(quat: Readonly, out: Vector3 | T = Vec3Utils.create()): Vector3 | T {\r\n QuatUtils.toRadians(Quat2Utils.getRotationQuat(quat, rotationQuat), out);\r\n return out;\r\n }\r\n\r\n return getRotationRadians;\r\n}();\r\n\r\nexport function getRotationQuat(quat: Readonly): Quaternion;\r\nexport function getRotationQuat(quat: Readonly, out: T): T;\r\nexport function getRotationQuat(quat: Readonly, out: Quaternion | T = QuatUtils.create()): Quaternion | T {\r\n QuatUtils.copy(quat, out);\r\n return out;\r\n}\r\n\r\nexport const setPosition = function () {\r\n const rotationQuat = quat_utils_create();\r\n return function setPosition(quat: T, position: Readonly): T {\r\n Quat2Utils.getRotationQuat(quat, rotationQuat);\r\n Quat2Utils.setPositionRotationQuat(quat, position, rotationQuat);\r\n return quat;\r\n };\r\n}();\r\n\r\nexport function setRotation(quat: T, rotation: Readonly): T {\r\n return Quat2Utils.setRotationDegrees(quat, rotation);\r\n}\r\n\r\nexport const setRotationDegrees = function () {\r\n const position = vec3_utils_create();\r\n return function setRotationDegrees(quat: T, rotation: Readonly): T {\r\n Quat2Utils.getPosition(quat, position);\r\n Quat2Utils.setPositionRotationDegrees(quat, position, rotation);\r\n return quat;\r\n };\r\n}();\r\n\r\nexport const setRotationRadians = function () {\r\n const position = vec3_utils_create();\r\n return function setRotationRadians(quat: T, rotation: Readonly): T {\r\n Quat2Utils.getPosition(quat, position);\r\n Quat2Utils.setPositionRotationRadians(quat, position, rotation);\r\n return quat;\r\n };\r\n}();\r\n\r\nexport const setRotationQuat = function () {\r\n const position = vec3_utils_create();\r\n return function setRotationQuat(quat: T, rotation: Readonly): T {\r\n Quat2Utils.getPosition(quat, position);\r\n Quat2Utils.setPositionRotationQuat(quat, position, rotation);\r\n return quat;\r\n };\r\n}();\r\n\r\n\r\nexport function setPositionRotation(quat: T, position: Readonly, rotation: Readonly): T {\r\n return Quat2Utils.setPositionRotationDegrees(quat, position, rotation);\r\n}\r\n\r\nexport const setPositionRotationDegrees = function () {\r\n const rotationQuat = quat_utils_create();\r\n return function setPositionRotationDegrees(quat: T, position: Readonly, rotation: Readonly): T {\r\n Vec3Utils.degreesToQuat(rotation, rotationQuat);\r\n Quat2Utils.setPositionRotationQuat(quat, position, rotationQuat);\r\n\r\n return quat;\r\n };\r\n}();\r\n\r\nexport const setPositionRotationRadians = function () {\r\n const rotationQuat = quat_utils_create();\r\n return function setPositionRotationRadians(quat: T, position: Readonly, rotation: Readonly): T {\r\n Vec3Utils.radiansToQuat(rotation, rotationQuat);\r\n Quat2Utils.setPositionRotationQuat(quat, position, rotationQuat);\r\n return quat;\r\n };\r\n}();\r\n\r\nexport function setPositionRotationQuat(quat: T, position: Readonly, rotation: Readonly): T {\r\n gl_quat2.fromRotationTranslation(quat, rotation as unknown as gl_quat_type, position as unknown as gl_vec3_type);\r\n return quat;\r\n}\r\n\r\nexport function getAxes(quat: Readonly): [Vector3, Vector3, Vector3];\r\nexport function getAxes(quat: Readonly, out: [T, U, V]): [T, U, V];\r\nexport function getAxes(quat: Readonly, out: [Vector3, Vector3, Vector3] | [T, U, V] = [Vec3Utils.create(), Vec3Utils.create(), Vec3Utils.create()]): [Vector3, Vector3, Vector3] | [T, U, V] {\r\n Quat2Utils.getLeft(quat, out[0]);\r\n Quat2Utils.getUp(quat, out[1]);\r\n Quat2Utils.getForward(quat, out[2]);\r\n return out;\r\n}\r\n\r\nexport const getForward = function () {\r\n const rotationMatrix = mat3_utils_create();\r\n\r\n function getForward(quat: Readonly): Vector3;\r\n function getForward(quat: Readonly, out: T): T;\r\n function getForward(quat: Readonly, out: Vector3 | T = Vec3Utils.create()): Vector3 | T {\r\n QuatUtils.toMatrix(quat, rotationMatrix);\r\n\r\n Vec3Utils.set(out, rotationMatrix[6], rotationMatrix[7], rotationMatrix[8]);\r\n\r\n return out;\r\n }\r\n\r\n return getForward;\r\n}();\r\n\r\nexport function getBackward(quat: Readonly): Vector3;\r\nexport function getBackward(quat: Readonly, out: T): T;\r\nexport function getBackward(quat: Readonly, out?: Vector3 | T): Vector3 | T {\r\n out = Quat2Utils.getForward(quat, out!);\r\n Vec3Utils.negate(out, out);\r\n return out;\r\n}\r\n\r\nexport const getLeft = function () {\r\n const rotationMatrix = mat3_utils_create();\r\n\r\n function getLeft(quat: Readonly): Vector3;\r\n function getLeft(quat: Readonly, out: T): T;\r\n function getLeft(quat: Readonly, out: Vector3 | T = Vec3Utils.create()): Vector3 | T {\r\n QuatUtils.toMatrix(quat, rotationMatrix);\r\n\r\n Vec3Utils.set(out, rotationMatrix[0], rotationMatrix[1], rotationMatrix[2]);\r\n\r\n return out;\r\n }\r\n\r\n return getLeft;\r\n}();\r\n\r\nexport function getRight(quat: Readonly): Vector3;\r\nexport function getRight(quat: Readonly, out: T): T;\r\nexport function getRight(quat: Readonly, out?: Vector3 | T): Vector3 | T {\r\n out = Quat2Utils.getLeft(quat, out!);\r\n Vec3Utils.negate(out, out);\r\n return out;\r\n}\r\n\r\nexport const getUp = function () {\r\n const rotationMatrix = mat3_utils_create();\r\n\r\n function getUp(quat: Readonly): Vector3;\r\n function getUp(quat: Readonly, out: T): T;\r\n function getUp(quat: Readonly, out: Vector3 | T = Vec3Utils.create()): Vector3 | T {\r\n QuatUtils.toMatrix(quat, rotationMatrix);\r\n\r\n Vec3Utils.set(out, rotationMatrix[3], rotationMatrix[4], rotationMatrix[5]);\r\n\r\n return out;\r\n }\r\n\r\n return getUp;\r\n}();\r\n\r\nexport function getDown(quat: Readonly): Vector3;\r\nexport function getDown(quat: Readonly, out: T): T;\r\nexport function getDown(quat: Readonly, out?: Vector3 | T): Vector3 | T {\r\n out = Quat2Utils.getUp(quat, out!);\r\n Vec3Utils.negate(out, out);\r\n return out;\r\n}\r\n\r\nexport function rotateAxis(quat: Readonly, angle: number, axis: Readonly): T;\r\nexport function rotateAxis(quat: Readonly, angle: number, axis: Readonly, out: T): T;\r\nexport function rotateAxis(quat: Readonly, angle: number, axis: Readonly, out?: T | U): T | U {\r\n return Quat2Utils.rotateAxisDegrees(quat, angle, axis, out!);\r\n}\r\n\r\nexport function rotateAxisDegrees(quat: Readonly, angle: number, axis: Readonly): T;\r\nexport function rotateAxisDegrees(quat: Readonly, angle: number, axis: Readonly, out: T): T;\r\nexport function rotateAxisDegrees(quat: Readonly, angle: number, axis: Readonly, out: T | U = Quat2Utils.clone(quat)): T | U {\r\n return Quat2Utils.rotateAxisRadians(quat, MathUtils.toRadians(angle), axis, out);\r\n}\r\n\r\nexport const rotateAxisRadians = function () {\r\n const rotationQuat = quat_utils_create();\r\n\r\n function rotateAxisRadians(quat: Readonly, angle: number, axis: Readonly): T;\r\n function rotateAxisRadians(quat: Readonly, angle: number, axis: Readonly, out: T): T;\r\n function rotateAxisRadians(quat: Readonly, angle: number, axis: Readonly, out: T | U = Quat2Utils.clone(quat)): T | U {\r\n Quat2Utils.getRotationQuat(quat, rotationQuat);\r\n QuatUtils.rotateAxisRadians(rotationQuat, angle, axis, rotationQuat);\r\n Quat2Utils.copy(quat, out);\r\n Quat2Utils.setRotationQuat(out, rotationQuat);\r\n return out;\r\n }\r\n\r\n return rotateAxisRadians;\r\n}();\r\n\r\n\r\nexport function toWorld(quat: Readonly, parentTransformQuat: Readonly): T;\r\nexport function toWorld(quat: Readonly, parentTransformQuat: Readonly, out: T): T;\r\nexport function toWorld(quat: Readonly, parentTransformQuat: Readonly, out: T | U = Quat2Utils.clone(quat)): T | U {\r\n Quat2Utils.mul(parentTransformQuat, quat, out);\r\n return out;\r\n}\r\n\r\nexport const toLocal = function () {\r\n const invertQuat = create();\r\n\r\n function toLocal(quat: Readonly, parentTransformQuat: Readonly): T;\r\n function toLocal(quat: Readonly, parentTransformQuat: Readonly, out: T): T;\r\n function toLocal(quat: Readonly, parentTransformQuat: Readonly, out: T | U = Quat2Utils.clone(quat)): T | U {\r\n Quat2Utils.conjugate(parentTransformQuat, invertQuat);\r\n Quat2Utils.mul(invertQuat, quat, out);\r\n return out;\r\n }\r\n\r\n return toLocal;\r\n}();\r\n\r\nexport function toMatrix(quat: Readonly): Matrix4;\r\nexport function toMatrix(quat: Readonly, out: T): T;\r\nexport function toMatrix(quat: Readonly, out: Matrix4 | T = Mat4Utils.create()): Matrix4 | T {\r\n _customGLMatrixFromQuat2(out, quat);\r\n return out;\r\n}\r\n\r\nexport function fromMatrix(matrix: Readonly): Quaternion2;\r\nexport function fromMatrix(matrix: Readonly, out: T): T;\r\nexport function fromMatrix(matrix: Readonly, out: Quaternion2 | T = Quat2Utils.create()): Quaternion2 | T {\r\n Mat4Utils.toQuat(matrix, out);\r\n return out;\r\n}\r\n\r\n/**\r\n * How to use\r\n * \r\n * By default rotations are in `Degrees` and transforms are `Matrix4` (and not `Quat2`) \r\n * For functions that work with rotations, `Matrix` means `Matrix3` and `Quat` means `Quat` \r\n * For functions that work with transforms, `Matrix` means `Matrix4` and `Quat` means `Quat2`\r\n * \r\n * For rotations u can add a suffix like `Degrees`/`Radians`/`Quat`/`Matrix` to use a specific version, example: \r\n * - `getRotationRadians` \r\n * - `setRotationQuat`\r\n * \r\n * The functions leave u the choice of forwarding an out parameter or just get the return value, example: \r\n * - `let position = Quat2Utils.getPosition(quat)` \r\n * - `Quat2Utils.getPosition(quat, position)` \r\n * - the out parameter is always the last one\r\n */\r\nexport const Quat2Utils = {\r\n create,\r\n getAllocationFunction,\r\n setAllocationFunction,\r\n set,\r\n copy,\r\n clone,\r\n equals,\r\n isNormalized,\r\n normalize,\r\n length,\r\n lengthSquared,\r\n identity,\r\n mul,\r\n invert,\r\n conjugate,\r\n lerp,\r\n interpolate,\r\n slerp,\r\n interpolateSpherical,\r\n getPosition,\r\n getRotation,\r\n getRotationDegrees,\r\n getRotationRadians,\r\n getRotationQuat,\r\n setPosition,\r\n setRotation,\r\n setRotationDegrees,\r\n setRotationRadians,\r\n setRotationQuat,\r\n setPositionRotation,\r\n setPositionRotationDegrees,\r\n setPositionRotationRadians,\r\n setPositionRotationQuat,\r\n getAxes,\r\n getForward,\r\n getBackward,\r\n getLeft,\r\n getRight,\r\n getUp,\r\n getDown,\r\n rotateAxis,\r\n rotateAxisDegrees,\r\n rotateAxisRadians,\r\n toWorld,\r\n toLocal,\r\n toMatrix,\r\n fromMatrix\r\n} as const;\r\n\r\n\r\n/** This is used in place of the glMatrix one to avoid the array allocation */\r\nconst _customGLMatrixFromQuat2 = function () {\r\n const translation = vec3_utils_create();\r\n return function _customGLMatrixFromQuat2(out: Matrix4, quat: Readonly): Matrix4 {\r\n const bx = -quat[0],\r\n by = -quat[1],\r\n bz = -quat[2],\r\n bw = quat[3],\r\n ax = quat[4],\r\n ay = quat[5],\r\n az = quat[6],\r\n aw = quat[7];\r\n\r\n const magnitude = bx * bx + by * by + bz * bz + bw * bw;\r\n\r\n //Only scale if it makes sense\r\n if (magnitude > 0) {\r\n translation[0] = ((ax * bw + aw * bx + ay * bz - az * by) * 2) / magnitude;\r\n translation[1] = ((ay * bw + aw * by + az * bx - ax * bz) * 2) / magnitude;\r\n translation[2] = ((az * bw + aw * bz + ax * by - ay * bx) * 2) / magnitude;\r\n } else {\r\n translation[0] = (ax * bw + aw * bx + ay * bz - az * by) * 2;\r\n translation[1] = (ay * bw + aw * by + az * bx - ax * bz) * 2;\r\n translation[2] = (az * bw + aw * bz + ax * by - ay * bx) * 2;\r\n }\r\n\r\n gl_mat4.fromRotationTranslation(out as unknown as gl_mat4_type, quat, translation as unknown as gl_vec3_type);\r\n\r\n return out;\r\n };\r\n}();", "import { mat3 as gl_mat3, mat4 as gl_mat4, quat as gl_quat, quat2 as gl_quat2, vec2 as gl_vec2, vec3 as gl_vec3, vec4 as gl_vec4, glMatrix } from \"gl-matrix\";\r\nimport { Matrix3, Matrix4, Quaternion, Quaternion2, Vector, Vector2, Vector3, Vector4 } from \"../../type_definitions/array_type_definitions.js\";\r\n\r\nexport let _myVectorAllocationFunction: (length: number) => Vector = () => { return new glMatrix.ARRAY_TYPE(length); };\r\n\r\nexport function setVectorAllocationFunction(allocationFunction: (length: number) => Vector): void {\r\n _myVectorAllocationFunction = allocationFunction;\r\n}\r\n\r\nexport function getVectorAllocationFunction(): (length: number) => Vector {\r\n return _myVectorAllocationFunction;\r\n}\r\n\r\n\r\n\r\nexport let _myVector2AllocationFunction: () => Vector2 = gl_vec2.create;\r\n\r\nexport function setVector2AllocationFunction(allocationFunction: () => Vector2): void {\r\n _myVector2AllocationFunction = allocationFunction;\r\n}\r\n\r\nexport function getVector2AllocationFunction(): () => Vector2 {\r\n return _myVector2AllocationFunction;\r\n}\r\n\r\n\r\n\r\nexport let _myVector3AllocationFunction: () => Vector3 = gl_vec3.create;\r\n\r\nexport function setVector3AllocationFunction(allocationFunction: () => Vector3): void {\r\n _myVector3AllocationFunction = allocationFunction;\r\n}\r\n\r\nexport function getVector3AllocationFunction(): () => Vector3 {\r\n return _myVector3AllocationFunction;\r\n}\r\n\r\n\r\n\r\nexport let _myVector4AllocationFunction: () => Vector4 = gl_vec4.create;\r\n\r\nexport function setVector4AllocationFunction(allocationFunction: () => Vector4): void {\r\n _myVector4AllocationFunction = allocationFunction;\r\n}\r\n\r\nexport function getVector4AllocationFunction(): () => Vector4 {\r\n return _myVector4AllocationFunction;\r\n}\r\n\r\n\r\n\r\nexport let _myQuaternionAllocationFunction: () => Quaternion = gl_quat.create;\r\n\r\nexport function setQuaternionAllocationFunction(allocationFunction: () => Quaternion): void {\r\n _myQuaternionAllocationFunction = allocationFunction;\r\n}\r\n\r\nexport function getQuaternionAllocationFunction(): () => Quaternion {\r\n return _myQuaternionAllocationFunction;\r\n}\r\n\r\n\r\n\r\nexport let _myQuaternion2AllocationFunction: () => Quaternion2 = gl_quat2.create;\r\n\r\nexport function setQuaternion2AllocationFunction(allocationFunction: () => Quaternion2): void {\r\n _myQuaternion2AllocationFunction = allocationFunction;\r\n}\r\n\r\nexport function getQuaternion2AllocationFunction(): () => Quaternion2 {\r\n return _myQuaternion2AllocationFunction;\r\n}\r\n\r\n\r\n\r\nexport let _myMatrix3AllocationFunction: () => Matrix3 = gl_mat3.create;\r\n\r\nexport function setMatrix3AllocationFunction(allocationFunction: () => Matrix3): void {\r\n _myMatrix3AllocationFunction = allocationFunction;\r\n}\r\n\r\nexport function getMatrix3AllocationFunction(): () => Matrix3 {\r\n return _myMatrix3AllocationFunction;\r\n}\r\n\r\n\r\n\r\nexport let _myMatrix4AllocationFunction: () => Matrix4 = gl_mat4.create;\r\n\r\nexport function setMatrix4AllocationFunction(allocationFunction: () => Matrix4): void {\r\n _myMatrix4AllocationFunction = allocationFunction;\r\n}\r\n\r\nexport function getMatrix4AllocationFunction(): () => Matrix4 {\r\n return _myMatrix4AllocationFunction;\r\n}\r\n\r\n\r\n\r\nexport const VecAllocationUtils = {\r\n setVectorAllocationFunction,\r\n getVectorAllocationFunction,\r\n setVector2AllocationFunction,\r\n getVector2AllocationFunction,\r\n setVector3AllocationFunction,\r\n getVector3AllocationFunction,\r\n setVector4AllocationFunction,\r\n getVector4AllocationFunction,\r\n setQuaternionAllocationFunction,\r\n getQuaternionAllocationFunction,\r\n setQuaternion2AllocationFunction,\r\n getQuaternion2AllocationFunction,\r\n setMatrix3AllocationFunction,\r\n getMatrix3AllocationFunction,\r\n setMatrix4AllocationFunction,\r\n getMatrix4AllocationFunction\r\n} as const;", "import { Component, Object3D, Scene, WonderlandEngine, type ComponentConstructor } from \"@wonderlandengine/api\";\r\nimport { Globals } from \"../../../pp/globals.js\";\r\nimport { Matrix3, Matrix4, Quaternion, Quaternion2, Vector3 } from \"../../type_definitions/array_type_definitions.js\";\r\nimport { Mat3Utils } from \"../../utils/array/mat3_utils.js\";\r\nimport { Mat4Utils } from \"../../utils/array/mat4_utils.js\";\r\nimport { Quat2Utils } from \"../../utils/array/quat2_utils.js\";\r\nimport { QuatUtils } from \"../../utils/array/quat_utils.js\";\r\nimport { Vec3Utils } from \"../../utils/array/vec3_utils.js\";\r\nimport { MathUtils } from \"../../utils/math_utils.js\";\r\nimport { ComponentCustomCloneParams, ComponentDeepCloneParams, ComponentUtils } from \"./component_utils.js\";\r\n\r\nexport class ObjectCloneParams {\r\n\r\n /** Defaults to the object to clone parent, null can be used to specify u want the scene root as the parent */\r\n public myCloneParent: Object3D | null | undefined = undefined;\r\n\r\n\r\n /** Ignores components that are not clonable */\r\n public myIgnoreNonCloneable: boolean = false;\r\n /** All components are ignored, cloning only the object hierarchy */\r\n public myIgnoreComponents: boolean = false;\r\n /** Clones only the given object without the descendants */\r\n public myIgnoreDescendants: boolean = false;\r\n\r\n\r\n /** Ignores all component types in this list (example: `[\"mesh\"]`), has lower priority over `myComponentsToInclude` */\r\n public myComponentsToIgnore: string[] = [];\r\n /** Clones only the component types in this list (example: `[\"mesh\"]`), has higher priority over `myComponentsToIgnore`, if empty it's ignored */\r\n public myComponentsToInclude: string[] = [];\r\n /** Returns true if the component must be ignored. It's called after the previous filters */\r\n public myIgnoreComponentCallback: ((component: Component) => boolean) | null = null;\r\n\r\n\r\n /** Ignores all the objects in this list, has lower priority over `myDescendantsToInclude` */\r\n public myDescendantsToIgnore: Object3D[] = [];\r\n /** Clones only the objects in this list, has higher priority over `myDescendantsToIgnore`, if empty it's ignored */\r\n public myDescendantsToInclude: Object3D[] = [];\r\n /** Returns true if the object must be ignored. It's called after the previous filters */\r\n public myIgnoreDescendantCallback: ((component: Object3D) => boolean) | null = null;\r\n\r\n\r\n /** Uses the default component clone function */\r\n public myUseDefaultComponentClone: boolean = false;\r\n /** Uses the default component clone function only as fallback, that is if there is no custom component clone */\r\n public myUseDefaultComponentCloneAsFallback: boolean = false;\r\n /** Automatically starts the component even if it's cloned not activated, keeping it not active. This also triggers `onActivate` and `onDeactivate` once */\r\n public myDefaultComponentCloneAutoStartIfNotActive: boolean = true;\r\n\r\n\r\n /** Uses the default object clone function, ignoring all the other clone settings but `myCloneParent` and `myDefaultComponentCloneAutoStartIfNotActive` */\r\n public myUseDefaultObjectClone: boolean = false;\r\n /** Uses the default object clone function only as fallback, that is if the object is not PP cloneable */\r\n public myUseDefaultObjectCloneAsFallback: boolean = false;\r\n\r\n\r\n /** Used to specify if the object components must be deep cloned or not, you can also override the behavior for specific components and variables */\r\n public myComponentDeepCloneParams: ComponentDeepCloneParams = new ComponentDeepCloneParams();\r\n\r\n\r\n /** This class can be filled with whatever custom paramater the component clone functions could need */\r\n public myComponentCustomCloneParams: ComponentCustomCloneParams = new ComponentCustomCloneParams();\r\n}\r\n\r\n// GETTER\r\n\r\n// Position\r\n\r\nexport function getPosition(object: Readonly): Vector3;\r\nexport function getPosition(object: Readonly, outPosition: T): T;\r\nexport function getPosition(object: Readonly, outPosition?: T): T {\r\n return ObjectUtils.getPositionWorld(object, outPosition!);\r\n}\r\n\r\nexport function getPositionWorld(object: Readonly): Vector3;\r\nexport function getPositionWorld(object: Readonly, outPosition: T): T;\r\nexport function getPositionWorld(object: Readonly, outPosition: Vector3 | T = Vec3Utils.create()): Vector3 | T {\r\n object.getPositionWorld(outPosition);\r\n return outPosition;\r\n}\r\n\r\nexport function getPositionLocal(object: Readonly): Matrix3;\r\nexport function getPositionLocal(object: Readonly, outPosition: T): T;\r\nexport function getPositionLocal(object: Readonly, outPosition: Vector3 | T = Vec3Utils.create()): Vector3 | T {\r\n object.getPositionLocal(outPosition);\r\n return outPosition;\r\n}\r\n\r\n// Rotation\r\n\r\nexport function getRotation(object: Readonly): Vector3;\r\nexport function getRotation(object: Readonly, outRotation: T): T;\r\nexport function getRotation(object: Readonly, outRotation?: T): T {\r\n return ObjectUtils.getRotationWorld(object, outRotation!);\r\n}\r\n\r\nexport function getRotationDegrees(object: Readonly): Vector3;\r\nexport function getRotationDegrees(object: Readonly, outRotation: T): T;\r\nexport function getRotationDegrees(object: Readonly, outRotation?: T): T {\r\n return ObjectUtils.getRotationWorldDegrees(object, outRotation!);\r\n}\r\n\r\nexport function getRotationRadians(object: Readonly): Vector3;\r\nexport function getRotationRadians(object: Readonly, outRotation: T): T;\r\nexport function getRotationRadians(object: Readonly, outRotation?: T): T {\r\n return ObjectUtils.getRotationWorldRadians(object, outRotation!);\r\n}\r\n\r\nexport function getRotationMatrix(object: Readonly): Matrix3;\r\nexport function getRotationMatrix(object: Readonly, outRotation: T): T;\r\nexport function getRotationMatrix(object: Readonly, outRotation?: Matrix3 | T): Matrix3 | T {\r\n return ObjectUtils.getRotationWorldMatrix(object, outRotation!);\r\n}\r\n\r\nexport function getRotationQuat(object: Readonly): Quaternion;\r\nexport function getRotationQuat(object: Readonly, outRotation: T): T;\r\nexport function getRotationQuat(object: Readonly, outRotation?: Quaternion | T): Quaternion | T {\r\n return ObjectUtils.getRotationWorldQuat(object, outRotation!);\r\n}\r\n\r\n// Rotation World\r\n\r\nexport function getRotationWorld(object: Readonly): Vector3;\r\nexport function getRotationWorld(object: Readonly, outRotation: T): T;\r\nexport function getRotationWorld(object: Readonly, outRotation?: T): T {\r\n return ObjectUtils.getRotationWorldDegrees(object, outRotation!);\r\n}\r\n\r\nexport function getRotationWorldDegrees(object: Readonly): Vector3;\r\nexport function getRotationWorldDegrees(object: Readonly, outRotation: T): T;\r\nexport function getRotationWorldDegrees(object: Readonly, outRotation?: T): T {\r\n outRotation = ObjectUtils.getRotationWorldRadians(object, outRotation!);\r\n Vec3Utils.toDegrees(outRotation, outRotation);\r\n return outRotation!;\r\n}\r\n\r\nexport const getRotationWorldRadians = function () {\r\n const quat = QuatUtils.create();\r\n\r\n function getRotationWorldRadians(object: Readonly): Vector3;\r\n function getRotationWorldRadians(object: Readonly, outRotation: T): T;\r\n function getRotationWorldRadians(object: Readonly, outRotation: Vector3 | T = Vec3Utils.create()): Vector3 | T {\r\n ObjectUtils.getRotationWorldQuat(object, quat);\r\n QuatUtils.toRadians(quat, outRotation);\r\n return outRotation;\r\n }\r\n\r\n return getRotationWorldRadians;\r\n}();\r\n\r\nexport const getRotationWorldMatrix = function () {\r\n const quat = QuatUtils.create();\r\n\r\n function getRotationWorldMatrix(object: Readonly): Matrix3;\r\n function getRotationWorldMatrix(object: Readonly, outRotation: T): T;\r\n function getRotationWorldMatrix(object: Readonly, outRotation: Matrix3 | T = Mat3Utils.create()): Matrix3 | T {\r\n ObjectUtils.getRotationWorldQuat(object, quat);\r\n QuatUtils.toMatrix(quat, outRotation);\r\n return outRotation;\r\n }\r\n\r\n return getRotationWorldMatrix;\r\n}();\r\n\r\nexport function getRotationWorldQuat(object: Readonly): Quaternion;\r\nexport function getRotationWorldQuat(object: Readonly, outRotation: T): T;\r\nexport function getRotationWorldQuat(object: Readonly, outRotation: Quaternion | T = QuatUtils.create()): Quaternion | T {\r\n object.getRotationWorld(outRotation);\r\n return outRotation;\r\n}\r\n\r\n// Rotation Local\r\n\r\nexport function getRotationLocal(object: Readonly): Vector3;\r\nexport function getRotationLocal(object: Readonly, outRotation: T): T;\r\nexport function getRotationLocal(object: Readonly, outRotation?: T): T {\r\n return ObjectUtils.getRotationLocalDegrees(object, outRotation!);\r\n}\r\n\r\nexport function getRotationLocalDegrees(object: Readonly): Vector3;\r\nexport function getRotationLocalDegrees(object: Readonly, outRotation: T): T;\r\nexport function getRotationLocalDegrees(object: Readonly, outRotation?: T): T {\r\n outRotation = ObjectUtils.getRotationLocalRadians(object, outRotation!);\r\n Vec3Utils.toDegrees(outRotation, outRotation);\r\n return outRotation!;\r\n}\r\n\r\nexport const getRotationLocalRadians = function () {\r\n const quat = QuatUtils.create();\r\n\r\n function getRotationLocalRadians(object: Readonly): Vector3;\r\n function getRotationLocalRadians(object: Readonly, outRotation: T): T;\r\n function getRotationLocalRadians(object: Readonly, outRotation: Vector3 | T = Vec3Utils.create()): Vector3 | T {\r\n ObjectUtils.getRotationLocalQuat(object, quat);\r\n QuatUtils.toRadians(quat, outRotation);\r\n return outRotation;\r\n }\r\n\r\n return getRotationLocalRadians;\r\n}();\r\n\r\nexport const getRotationLocalMatrix = function () {\r\n const quat = QuatUtils.create();\r\n\r\n function getRotationLocalMatrix(object: Readonly): Matrix3;\r\n function getRotationLocalMatrix(object: Readonly, outRotation: T): T;\r\n function getRotationLocalMatrix(object: Readonly, outRotation: Matrix3 | T = Mat3Utils.create()): Matrix3 | T {\r\n ObjectUtils.getRotationLocalQuat(object, quat);\r\n QuatUtils.toMatrix(quat, outRotation);\r\n return outRotation;\r\n }\r\n\r\n return getRotationLocalMatrix;\r\n}();\r\n\r\nexport function getRotationLocalQuat(object: Readonly): Quaternion;\r\nexport function getRotationLocalQuat(object: Readonly, outRotation: T): T;\r\nexport function getRotationLocalQuat(object: Readonly, outRotation: Quaternion | T = QuatUtils.create()): Quaternion | T {\r\n object.getRotationLocal(outRotation);\r\n return outRotation;\r\n}\r\n\r\n// Scale\r\n\r\nexport function getScale(object: Readonly): Vector3;\r\nexport function getScale(object: Readonly, outScale: T): T;\r\nexport function getScale(object: Readonly, outScale?: T): T {\r\n return ObjectUtils.getScaleWorld(object, outScale!);\r\n}\r\n\r\nexport function getScaleWorld(object: Readonly): Vector3;\r\nexport function getScaleWorld(object: Readonly, outScale: T): T;\r\nexport function getScaleWorld(object: Readonly, outScale: Vector3 | T = Vec3Utils.create()): Vector3 | T {\r\n object.getScalingWorld(outScale);\r\n return outScale;\r\n}\r\n\r\nexport function getScaleLocal(object: Readonly): Vector3;\r\nexport function getScaleLocal(object: Readonly, outScale: T): T;\r\nexport function getScaleLocal(object: Readonly, outScale: Vector3 | T = Vec3Utils.create()): Vector3 | T {\r\n object.getScalingLocal(outScale);\r\n return outScale;\r\n}\r\n\r\n// Transform\r\n\r\nexport function getTransform(object: Readonly): Matrix4;\r\nexport function getTransform(object: Readonly, outTransform: T): T;\r\nexport function getTransform(object: Readonly, outTransform?: Matrix4 | T): Matrix4 | T {\r\n return ObjectUtils.getTransformWorld(object, outTransform!);\r\n}\r\n\r\nexport function getTransformMatrix(object: Readonly): Matrix4;\r\nexport function getTransformMatrix(object: Readonly, outTransform: T): T;\r\nexport function getTransformMatrix(object: Readonly, outTransform?: Matrix4 | T): Matrix4 | T {\r\n return ObjectUtils.getTransformWorldMatrix(object, outTransform!);\r\n}\r\n\r\nexport function getTransformQuat(object: Readonly): Quaternion2;\r\nexport function getTransformQuat(object: Readonly, outTransform: T): T;\r\nexport function getTransformQuat(object: Readonly, outTransform?: Quaternion2 | T): Quaternion2 | T {\r\n return ObjectUtils.getTransformWorldQuat(object, outTransform!);\r\n}\r\n\r\n// Transform World\r\n\r\nexport function getTransformWorld(object: Readonly): Matrix4;\r\nexport function getTransformWorld(object: Readonly, outTransform: T): T;\r\nexport function getTransformWorld(object: Readonly, outTransform?: Matrix4 | T): Matrix4 | T {\r\n return ObjectUtils.getTransformWorldMatrix(object, outTransform!);\r\n}\r\n\r\nexport const getTransformWorldMatrix = function () {\r\n const transformQuat = Quat2Utils.create();\r\n const scale = Vec3Utils.create();\r\n\r\n function getTransformWorldMatrix(object: Readonly): Matrix4;\r\n function getTransformWorldMatrix(object: Readonly, outTransform: T): T;\r\n function getTransformWorldMatrix(object: Readonly, outTransform: Matrix4 | T = Mat4Utils.create()): Matrix4 | T {\r\n ObjectUtils.getTransformWorldQuat(object, transformQuat);\r\n ObjectUtils.getScaleWorld(object, scale);\r\n Mat4Utils.fromQuat(transformQuat, outTransform);\r\n Mat4Utils.scale(outTransform, scale, outTransform);\r\n return outTransform;\r\n }\r\n\r\n return getTransformWorldMatrix;\r\n}();\r\n\r\nexport function getTransformWorldQuat(object: Readonly): Quaternion2;\r\nexport function getTransformWorldQuat(object: Readonly, outTransform: T): T;\r\nexport function getTransformWorldQuat(object: Readonly, outTransform: Quaternion2 | T = Quat2Utils.create()): Quaternion2 | T {\r\n object.getTransformWorld(outTransform);\r\n return outTransform;\r\n}\r\n\r\n// Transform Local\r\n\r\nexport function getTransformLocal(object: Readonly): Matrix4;\r\nexport function getTransformLocal(object: Readonly, outTransform: T): T;\r\nexport function getTransformLocal(object: Readonly, outTransform?: Matrix4 | T): Matrix4 | T {\r\n return ObjectUtils.getTransformLocalMatrix(object, outTransform!);\r\n}\r\n\r\nexport const getTransformLocalMatrix = function () {\r\n const transformQuat = Quat2Utils.create();\r\n const scale = Vec3Utils.create();\r\n\r\n function getTransformLocalMatrix(object: Readonly): Matrix4;\r\n function getTransformLocalMatrix(object: Readonly, outTransform: T): T;\r\n function getTransformLocalMatrix(object: Readonly, outTransform: Matrix4 | T = Mat4Utils.create()): Matrix4 | T {\r\n ObjectUtils.getTransformLocalQuat(object, transformQuat);\r\n ObjectUtils.getScaleLocal(object, scale);\r\n Mat4Utils.fromQuat(transformQuat, outTransform);\r\n Mat4Utils.scale(outTransform, scale, outTransform);\r\n return outTransform;\r\n }\r\n\r\n return getTransformLocalMatrix;\r\n}();\r\n\r\nexport function getTransformLocalQuat(object: Readonly): Quaternion2;\r\nexport function getTransformLocalQuat(object: Readonly, outTransform: T): T;\r\nexport function getTransformLocalQuat(object: Readonly, outTransform: Quaternion2 | T = Quat2Utils.create()): Quaternion2 | T {\r\n object.getTransformLocal(outTransform);\r\n return outTransform;\r\n}\r\n\r\n// Axes\r\n\r\nexport function getAxes(object: Readonly): [Vector3, Vector3, Vector3];\r\nexport function getAxes(object: Readonly, outAxes: [T, U, V]): [T, U, V];\r\nexport function getAxes(object: Readonly, outAxes: [Vector3, Vector3, Vector3] | [T, U, V] = [Vec3Utils.create(), Vec3Utils.create(), Vec3Utils.create()]): [Vector3, Vector3, Vector3] | [T, U, V] {\r\n return ObjectUtils.getAxesWorld(object, outAxes);\r\n}\r\n\r\nexport function getAxesWorld(object: Readonly): [Vector3, Vector3, Vector3];\r\nexport function getAxesWorld(object: Readonly, outAxes: [T, U, V]): [T, U, V];\r\nexport function getAxesWorld(object: Readonly, outAxes: [Vector3, Vector3, Vector3] | [T, U, V] = [Vec3Utils.create(), Vec3Utils.create(), Vec3Utils.create()]): [Vector3, Vector3, Vector3] | [T, U, V] {\r\n ObjectUtils.getLeftWorld(object, outAxes[0]);\r\n ObjectUtils.getUpWorld(object, outAxes[1]);\r\n ObjectUtils.getForwardWorld(object, outAxes[2]);\r\n return outAxes;\r\n}\r\n\r\nexport function getAxesLocal(object: Readonly): [Vector3, Vector3, Vector3];\r\nexport function getAxesLocal(object: Readonly, outAxes: [T, U, V]): [T, U, V];\r\nexport function getAxesLocal(object: Readonly, outAxes: [Vector3, Vector3, Vector3] | [T, U, V] = [Vec3Utils.create(), Vec3Utils.create(), Vec3Utils.create()]): [Vector3, Vector3, Vector3] | [T, U, V] {\r\n ObjectUtils.getLeftLocal(object, outAxes[0]);\r\n ObjectUtils.getUpLocal(object, outAxes[1]);\r\n ObjectUtils.getForwardLocal(object, outAxes[2]);\r\n return outAxes;\r\n}\r\n\r\n// Forward\r\n\r\nexport function getForward(object: Readonly): Vector3;\r\nexport function getForward(object: Readonly, outForward: T): T;\r\nexport function getForward(object: Readonly, outForward?: T): T {\r\n return ObjectUtils.getForwardWorld(object, outForward!);\r\n}\r\n\r\nexport const getForwardWorld = function () {\r\n const rotation = Mat3Utils.create();\r\n\r\n function getForwardWorld(object: Readonly): Vector3;\r\n function getForwardWorld(object: Readonly, outForward: T): T;\r\n function getForwardWorld(object: Readonly, outForward: Vector3 | T = Vec3Utils.create()): Vector3 | T {\r\n ObjectUtils.getRotationWorldMatrix(object, rotation);\r\n outForward[0] = rotation[6];\r\n outForward[1] = rotation[7];\r\n outForward[2] = rotation[8];\r\n return outForward;\r\n }\r\n\r\n return getForwardWorld;\r\n}();\r\n\r\nexport const getForwardLocal = function () {\r\n const rotation = Mat3Utils.create();\r\n\r\n function getForwardLocal(object: Readonly): Vector3;\r\n function getForwardLocal(object: Readonly, outForward: T): T;\r\n function getForwardLocal(object: Readonly, outForward: Vector3 | T = Vec3Utils.create()): Vector3 | T {\r\n ObjectUtils.getRotationLocalMatrix(object, rotation);\r\n outForward[0] = rotation[6];\r\n outForward[1] = rotation[7];\r\n outForward[2] = rotation[8];\r\n return outForward;\r\n }\r\n\r\n return getForwardLocal;\r\n}();\r\n\r\n// Backward\r\n\r\nexport function getBackward(object: Readonly): Vector3;\r\nexport function getBackward(object: Readonly, outBackward: T): T;\r\nexport function getBackward(object: Readonly, outBackward?: T): T {\r\n return ObjectUtils.getBackwardWorld(object, outBackward!);\r\n}\r\n\r\nexport const getBackwardWorld = function () {\r\n const rotation = Mat3Utils.create();\r\n\r\n function getBackwardWorld(object: Readonly): Vector3;\r\n function getBackwardWorld(object: Readonly, outBackward: T): T;\r\n function getBackwardWorld(object: Readonly, outBackward: Vector3 | T = Vec3Utils.create()): Vector3 | T {\r\n ObjectUtils.getRotationWorldMatrix(object, rotation);\r\n outBackward[0] = -rotation[6];\r\n outBackward[1] = -rotation[7];\r\n outBackward[2] = -rotation[8];\r\n return outBackward;\r\n }\r\n\r\n return getBackwardWorld;\r\n}();\r\n\r\nexport const getBackwardLocal = function () {\r\n const rotation = Mat3Utils.create();\r\n\r\n function getBackwardLocal(object: Readonly): Vector3;\r\n function getBackwardLocal(object: Readonly, outBackward: T): T;\r\n function getBackwardLocal(object: Readonly, outBackward: Vector3 | T = Vec3Utils.create()): Vector3 | T {\r\n ObjectUtils.getRotationLocalMatrix(object, rotation);\r\n outBackward[0] = -rotation[6];\r\n outBackward[1] = -rotation[7];\r\n outBackward[2] = -rotation[8];\r\n return outBackward;\r\n }\r\n\r\n return getBackwardLocal;\r\n}();\r\n\r\n// Up\r\n\r\nexport function getUp(object: Readonly): Vector3;\r\nexport function getUp(object: Readonly, outUp: T): T;\r\nexport function getUp(object: Readonly, outUp?: T): T {\r\n return ObjectUtils.getUpWorld(object, outUp!);\r\n}\r\n\r\nexport const getUpWorld = function () {\r\n const rotation = Mat3Utils.create();\r\n\r\n function getUpWorld(object: Readonly): Vector3;\r\n function getUpWorld(object: Readonly, outUp: T): T;\r\n function getUpWorld(object: Readonly, outUp: Vector3 | T = Vec3Utils.create()): Vector3 | T {\r\n ObjectUtils.getRotationWorldMatrix(object, rotation);\r\n outUp[0] = rotation[3];\r\n outUp[1] = rotation[4];\r\n outUp[2] = rotation[5];\r\n return outUp;\r\n }\r\n\r\n return getUpWorld;\r\n}();\r\n\r\nexport const getUpLocal = function () {\r\n const rotation = Mat3Utils.create();\r\n\r\n function getUpLocal(object: Readonly): Vector3;\r\n function getUpLocal(object: Readonly, outUp: T): T;\r\n function getUpLocal(object: Readonly, outUp: Vector3 | T = Vec3Utils.create()): Vector3 | T {\r\n ObjectUtils.getRotationLocalMatrix(object, rotation);\r\n outUp[0] = rotation[3];\r\n outUp[1] = rotation[4];\r\n outUp[2] = rotation[5];\r\n return outUp;\r\n }\r\n\r\n return getUpLocal;\r\n}();\r\n\r\n// Down\r\n\r\nexport function getDown(object: Readonly): Vector3;\r\nexport function getDown(object: Readonly, outDown: T): T;\r\nexport function getDown(object: Readonly, outDown?: T): T {\r\n return ObjectUtils.getDownWorld(object, outDown!);\r\n}\r\n\r\nexport const getDownWorld = function () {\r\n const rotation = Mat3Utils.create();\r\n\r\n function getDownWorld(object: Readonly): Vector3;\r\n function getDownWorld(object: Readonly, outDown: T): T;\r\n function getDownWorld(object: Readonly, outDown: Vector3 | T = Vec3Utils.create()): Vector3 | T {\r\n ObjectUtils.getRotationWorldMatrix(object, rotation);\r\n outDown[0] = -rotation[3];\r\n outDown[1] = -rotation[4];\r\n outDown[2] = -rotation[5];\r\n return outDown;\r\n }\r\n\r\n return getDownWorld;\r\n}();\r\n\r\nexport const getDownLocal = function () {\r\n const rotation = Mat3Utils.create();\r\n\r\n function getDownLocal(object: Readonly): Vector3;\r\n function getDownLocal(object: Readonly, outDown: T): T;\r\n function getDownLocal(object: Readonly, outDown: Vector3 | T = Vec3Utils.create()): Vector3 | T {\r\n ObjectUtils.getRotationLocalMatrix(object, rotation);\r\n outDown[0] = -rotation[3];\r\n outDown[1] = -rotation[4];\r\n outDown[2] = -rotation[5];\r\n return outDown;\r\n }\r\n\r\n return getDownLocal;\r\n}();\r\n\r\n// Left\r\n\r\nexport function getLeft(object: Readonly): Vector3;\r\nexport function getLeft(object: Readonly, outLeft: T): T;\r\nexport function getLeft(object: Readonly, outLeft?: T): T {\r\n return ObjectUtils.getLeftWorld(object, outLeft!);\r\n}\r\n\r\nexport const getLeftWorld = function () {\r\n const rotation = Mat3Utils.create();\r\n\r\n function getLeftWorld(object: Readonly): Vector3;\r\n function getLeftWorld(object: Readonly, outLeft: T): T;\r\n function getLeftWorld(object: Readonly, outLeft: Vector3 | T = Vec3Utils.create()): Vector3 | T {\r\n ObjectUtils.getRotationWorldMatrix(object, rotation);\r\n outLeft[0] = rotation[0];\r\n outLeft[1] = rotation[1];\r\n outLeft[2] = rotation[2];\r\n return outLeft;\r\n }\r\n\r\n return getLeftWorld;\r\n}();\r\n\r\nexport const getLeftLocal = function () {\r\n const rotation = Mat3Utils.create();\r\n\r\n function getLeftLocal(object: Readonly): Vector3;\r\n function getLeftLocal(object: Readonly, outLeft: T): T;\r\n function getLeftLocal(object: Readonly, outLeft: Vector3 | T = Vec3Utils.create()): Vector3 | T {\r\n ObjectUtils.getRotationLocalMatrix(object, rotation);\r\n outLeft[0] = rotation[0];\r\n outLeft[1] = rotation[1];\r\n outLeft[2] = rotation[2];\r\n return outLeft;\r\n }\r\n\r\n return getLeftLocal;\r\n}();\r\n\r\n// Right\r\n\r\nexport function getRight(object: Readonly): Vector3;\r\nexport function getRight(object: Readonly, outRight: T): T;\r\nexport function getRight(object: Readonly, outRight?: T): T {\r\n return ObjectUtils.getRightWorld(object, outRight!);\r\n}\r\n\r\nexport const getRightWorld = function () {\r\n const rotation = Mat3Utils.create();\r\n\r\n function getRightWorld(object: Readonly): Vector3;\r\n function getRightWorld(object: Readonly, outRight: T): T;\r\n function getRightWorld(object: Readonly, outRight: Vector3 | T = Vec3Utils.create()): Vector3 | T {\r\n ObjectUtils.getRotationWorldMatrix(object, rotation);\r\n outRight[0] = -rotation[0];\r\n outRight[1] = -rotation[1];\r\n outRight[2] = -rotation[2];\r\n return outRight;\r\n }\r\n\r\n return getRightWorld;\r\n}();\r\n\r\nexport const getRightLocal = function () {\r\n const rotation = Mat3Utils.create();\r\n\r\n function getRightLocal(object: Readonly): Vector3;\r\n function getRightLocal(object: Readonly, outRight: T): T;\r\n function getRightLocal(object: Readonly, outRight: Vector3 | T = Vec3Utils.create()): Vector3 | T {\r\n ObjectUtils.getRotationLocalMatrix(object, rotation);\r\n outRight[0] = -rotation[0];\r\n outRight[1] = -rotation[1];\r\n outRight[2] = -rotation[2];\r\n return outRight;\r\n }\r\n\r\n return getRightLocal;\r\n}();\r\n\r\n// SETTER\r\n\r\n// Position\r\n\r\nexport function setPosition(object: Object3D, position: Readonly): Object3D {\r\n return ObjectUtils.setPositionWorld(object, position);\r\n}\r\n\r\nexport function setPositionWorld(object: Object3D, position: Readonly): Object3D {\r\n return object.setPositionWorld(position);\r\n}\r\n\r\nexport function setPositionLocal(object: Object3D, position: Readonly): Object3D {\r\n return object.setPositionLocal(position);\r\n}\r\n\r\n// Rotation\r\n\r\nexport function setRotation(object: Object3D, rotation: Readonly): Object3D {\r\n return ObjectUtils.setRotationWorld(object, rotation);\r\n}\r\n\r\nexport function setRotationDegrees(object: Object3D, rotation: Readonly): Object3D {\r\n return ObjectUtils.setRotationWorldDegrees(object, rotation);\r\n}\r\n\r\nexport function setRotationRadians(object: Object3D, rotation: Readonly): Object3D {\r\n return ObjectUtils.setRotationWorldRadians(object, rotation);\r\n}\r\n\r\nexport function setRotationMatrix(object: Object3D, rotation: Readonly): Object3D {\r\n return ObjectUtils.setRotationWorldMatrix(object, rotation);\r\n}\r\n\r\nexport function setRotationQuat(object: Object3D, rotation: Readonly): Object3D {\r\n return ObjectUtils.setRotationWorldQuat(object, rotation);\r\n}\r\n\r\n// Rotation World\r\n\r\nexport function setRotationWorld(object: Object3D, rotation: Readonly): Object3D {\r\n return ObjectUtils.setRotationWorldDegrees(object, rotation);\r\n}\r\n\r\nexport const setRotationWorldDegrees = function () {\r\n const quat = QuatUtils.create();\r\n return function setRotationWorldDegrees(object: Object3D, rotation: Readonly): Object3D {\r\n Vec3Utils.degreesToQuat(rotation, quat);\r\n return ObjectUtils.setRotationWorldQuat(object, quat);\r\n };\r\n}();\r\n\r\nexport const setRotationWorldRadians = function () {\r\n const degreesRotation = Vec3Utils.create();\r\n return function setRotationWorldRadians(object: Object3D, rotation: Readonly): Object3D {\r\n Vec3Utils.toDegrees(rotation, degreesRotation);\r\n return ObjectUtils.setRotationWorldDegrees(object, degreesRotation);\r\n };\r\n}();\r\n\r\nexport const setRotationWorldMatrix = function () {\r\n const quat = QuatUtils.create();\r\n return function setRotationWorldMatrix(object: Object3D, rotation: Readonly): Object3D {\r\n Mat3Utils.toQuat(rotation, quat);\r\n return ObjectUtils.setRotationWorldQuat(object, quat);\r\n };\r\n}();\r\n\r\nexport function setRotationWorldQuat(object: Object3D, rotation: Readonly): Object3D {\r\n return object.setRotationWorld(rotation);\r\n}\r\n\r\n// Rotation Local\r\n\r\nexport function setRotationLocal(object: Object3D, rotation: Readonly): Object3D {\r\n return ObjectUtils.setRotationLocalDegrees(object, rotation);\r\n}\r\n\r\nexport const setRotationLocalDegrees = function () {\r\n const quat = QuatUtils.create();\r\n return function setRotationLocalDegrees(object: Object3D, rotation: Readonly): Object3D {\r\n Vec3Utils.degreesToQuat(rotation, quat);\r\n return ObjectUtils.setRotationLocalQuat(object, quat);\r\n };\r\n}();\r\n\r\nexport const setRotationLocalRadians = function () {\r\n const degreesRotation = Vec3Utils.create();\r\n return function setRotationLocalRadians(object: Object3D, rotation: Readonly): Object3D {\r\n Vec3Utils.toDegrees(rotation, degreesRotation);\r\n return ObjectUtils.setRotationLocalDegrees(object, degreesRotation);\r\n };\r\n}();\r\n\r\nexport const setRotationLocalMatrix = function () {\r\n const quat = QuatUtils.create();\r\n return function setRotationLocalMatrix(object: Object3D, rotation: Readonly): Object3D {\r\n Mat3Utils.toQuat(rotation, quat);\r\n return ObjectUtils.setRotationLocalQuat(object, quat);\r\n };\r\n}();\r\n\r\nexport function setRotationLocalQuat(object: Object3D, rotation: Readonly): Object3D {\r\n return object.setRotationLocal(rotation);\r\n}\r\n\r\n// Scale\r\n\r\nexport function setScale(object: Object3D, scale: Readonly): Object3D;\r\nexport function setScale(object: Object3D, uniformScale: number): Object3D;\r\nexport function setScale(object: Object3D, scale: Readonly | number): Object3D {\r\n return ObjectUtils.setScaleWorld(object, scale as Vector3);\r\n}\r\n\r\nexport const setScaleWorld = function () {\r\n const vector = Vec3Utils.create();\r\n\r\n function setScaleWorld(object: Object3D, scale: Readonly): Object3D;\r\n function setScaleWorld(object: Object3D, uniformScale: number): Object3D;\r\n function setScaleWorld(object: Object3D, scale: Readonly | number): Object3D {\r\n if (isNaN(scale as number)) {\r\n return object.setScalingWorld(scale as Vector3);\r\n } else {\r\n Vec3Utils.set(vector, scale as number);\r\n return object.setScalingWorld(vector);\r\n }\r\n }\r\n\r\n return setScaleWorld;\r\n}();\r\n\r\nexport const setScaleLocal = function () {\r\n const vector = Vec3Utils.create();\r\n\r\n function setScaleLocal(object: Object3D, scale: Readonly): Object3D;\r\n function setScaleLocal(object: Object3D, uniformScale: number): Object3D;\r\n function setScaleLocal(object: Object3D, scale: Readonly | number): Object3D {\r\n if (isNaN(scale as number)) {\r\n return object.setScalingLocal(scale as Vector3);\r\n } else {\r\n Vec3Utils.set(vector, scale as number);\r\n return object.setScalingLocal(vector);\r\n }\r\n }\r\n\r\n return setScaleLocal;\r\n}();\r\n\r\n// Axes \r\n\r\nexport function setAxes(object: Object3D, left?: Readonly, up?: Readonly, forward?: Readonly): Object3D {\r\n return ObjectUtils.setAxesWorld(object, left, up, forward);\r\n}\r\n\r\nexport function setAxesWorld(object: Object3D, left?: Readonly, up?: Readonly, forward?: Readonly): Object3D {\r\n if (forward != null) {\r\n return ObjectUtils.setForwardWorld(object, forward, up, left);\r\n } else if (up != null) {\r\n return ObjectUtils.setUpWorld(object, up, forward, left);\r\n } else if (left != null) {\r\n return ObjectUtils.setLeftWorld(object, left, up, forward);\r\n }\r\n\r\n return object;\r\n}\r\n\r\nexport function setAxesLocal(object: Object3D, left?: Readonly, up?: Readonly, forward?: Readonly): Object3D {\r\n if (forward != null) {\r\n return ObjectUtils.setForwardLocal(object, forward, up, left);\r\n } else if (up != null) {\r\n return ObjectUtils.setUpLocal(object, up, forward, left);\r\n } else if (left != null) {\r\n return ObjectUtils.setLeftLocal(object, left, up, forward);\r\n }\r\n\r\n return object;\r\n}\r\n\r\n// Forward\r\n\r\nexport function setForward(object: Object3D, forward: Readonly, up?: Readonly, left?: Readonly): Object3D {\r\n return ObjectUtils.setForwardWorld(object, forward, up, left);\r\n}\r\n\r\nexport const setForwardWorld = function () {\r\n const quat = QuatUtils.create();\r\n return function setForwardWorld(object: Object3D, forward: Readonly, up?: Readonly, left?: Readonly): Object3D {\r\n ObjectUtils.getRotationWorldQuat(object, quat);\r\n QuatUtils.setForward(quat, forward, up, left);\r\n return ObjectUtils.setRotationWorldQuat(object, quat);\r\n };\r\n}();\r\n\r\nexport const setForwardLocal = function () {\r\n const quat = QuatUtils.create();\r\n return function setForwardLocal(object: Object3D, forward: Readonly, up?: Readonly, left?: Readonly): Object3D {\r\n ObjectUtils.getRotationLocalQuat(object, quat);\r\n QuatUtils.setForward(quat, forward, up, left);\r\n return ObjectUtils.setRotationLocalQuat(object, quat);\r\n };\r\n}();\r\n\r\n// Backward\r\n\r\nexport function setBackward(object: Object3D, backward: Readonly, up?: Readonly, left?: Readonly): Object3D {\r\n return ObjectUtils.setBackwardWorld(object, backward, up, left);\r\n}\r\n\r\nexport const setBackwardWorld = function () {\r\n const quat = QuatUtils.create();\r\n return function setBackwardWorld(object: Object3D, backward: Readonly, up?: Readonly, left?: Readonly): Object3D {\r\n ObjectUtils.getRotationWorldQuat(object, quat);\r\n QuatUtils.setBackward(quat, backward, up, left);\r\n return ObjectUtils.setRotationWorldQuat(object, quat);\r\n };\r\n}();\r\n\r\nexport const setBackwardLocal = function () {\r\n const quat = QuatUtils.create();\r\n return function setBackwardLocal(object: Object3D, backward: Readonly, up?: Readonly, left?: Readonly): Object3D {\r\n ObjectUtils.getRotationLocalQuat(object, quat);\r\n QuatUtils.setBackward(quat, backward, up, left);\r\n return ObjectUtils.setRotationLocalQuat(object, quat);\r\n };\r\n}();\r\n\r\n// Up\r\n\r\nexport function setUp(object: Object3D, up: Readonly, forward?: Readonly, left?: Readonly): Object3D {\r\n return ObjectUtils.setUpWorld(object, up, forward, left);\r\n}\r\n\r\nexport const setUpWorld = function () {\r\n const quat = QuatUtils.create();\r\n return function setUpWorld(object: Object3D, up: Readonly, forward?: Readonly, left?: Readonly): Object3D {\r\n ObjectUtils.getRotationWorldQuat(object, quat);\r\n QuatUtils.setUp(quat, up, forward, left);\r\n return ObjectUtils.setRotationWorldQuat(object, quat);\r\n };\r\n}();\r\n\r\nexport const setUpLocal = function () {\r\n const quat = QuatUtils.create();\r\n return function setUpLocal(object: Object3D, up: Readonly, forward?: Readonly, left?: Readonly): Object3D {\r\n ObjectUtils.getRotationLocalQuat(object, quat);\r\n QuatUtils.setUp(quat, up, forward, left);\r\n return ObjectUtils.setRotationLocalQuat(object, quat);\r\n };\r\n}();\r\n\r\n// Down\r\n\r\nexport function setDown(object: Object3D, down: Readonly, forward?: Readonly, left?: Readonly): Object3D {\r\n return ObjectUtils.setDownWorld(object, down, forward, left);\r\n}\r\n\r\nexport const setDownWorld = function () {\r\n const quat = QuatUtils.create();\r\n return function setDownWorld(object: Object3D, down: Readonly, forward?: Readonly, left?: Readonly): Object3D {\r\n ObjectUtils.getRotationWorldQuat(object, quat);\r\n QuatUtils.setDown(quat, down, forward, left);\r\n return ObjectUtils.setRotationWorldQuat(object, quat);\r\n };\r\n}();\r\n\r\nexport const setDownLocal = function () {\r\n const quat = QuatUtils.create();\r\n return function setDownLocal(object: Object3D, down: Readonly, forward?: Readonly, left?: Readonly): Object3D {\r\n ObjectUtils.getRotationLocalQuat(object, quat);\r\n QuatUtils.setDown(quat, down, forward, left);\r\n return ObjectUtils.setRotationLocalQuat(object, quat);\r\n };\r\n}();\r\n\r\n// Left\r\n\r\nexport function setLeft(object: Object3D, left: Readonly, up?: Readonly, forward?: Readonly): Object3D {\r\n return ObjectUtils.setLeftWorld(object, left, up, forward);\r\n}\r\n\r\nexport const setLeftWorld = function () {\r\n const quat = QuatUtils.create();\r\n return function setLeftWorld(object: Object3D, left: Readonly, up?: Readonly, forward?: Readonly): Object3D {\r\n ObjectUtils.getRotationWorldQuat(object, quat);\r\n QuatUtils.setLeft(quat, left, up, forward);\r\n return ObjectUtils.setRotationWorldQuat(object, quat);\r\n };\r\n}();\r\n\r\nexport const setLeftLocal = function () {\r\n const quat = QuatUtils.create();\r\n return function setLeftLocal(object: Object3D, left: Readonly, up?: Readonly, forward?: Readonly): Object3D {\r\n ObjectUtils.getRotationLocalQuat(object, quat);\r\n QuatUtils.setLeft(quat, left, up, forward);\r\n return ObjectUtils.setRotationLocalQuat(object, quat);\r\n };\r\n}();\r\n\r\n// Right\r\n\r\nexport function setRight(object: Object3D, right: Readonly, up?: Readonly, forward?: Readonly): Object3D {\r\n return ObjectUtils.setRightWorld(object, right, up, forward);\r\n}\r\n\r\nexport const setRightWorld = function () {\r\n const quat = QuatUtils.create();\r\n return function setRightWorld(object: Object3D, right: Readonly, up?: Readonly, forward?: Readonly): Object3D {\r\n ObjectUtils.getRotationWorldQuat(object, quat);\r\n QuatUtils.setRight(quat, right, up, forward);\r\n return ObjectUtils.setRotationWorldQuat(object, quat);\r\n };\r\n}();\r\n\r\nexport const setRightLocal = function () {\r\n const quat = QuatUtils.create();\r\n return function setRightLocal(object: Object3D, right: Readonly, up?: Readonly, forward?: Readonly): Object3D {\r\n ObjectUtils.getRotationLocalQuat(object, quat);\r\n QuatUtils.setRight(quat, right, up, forward);\r\n return ObjectUtils.setRotationLocalQuat(object, quat);\r\n };\r\n}();\r\n\r\n// Transform\r\n\r\nexport function setTransform(object: Object3D, transform: Readonly): Object3D {\r\n return ObjectUtils.setTransformWorld(object, transform);\r\n}\r\n\r\nexport function setTransformMatrix(object: Object3D, transform: Readonly): Object3D {\r\n return ObjectUtils.setTransformWorldMatrix(object, transform);\r\n}\r\n\r\nexport function setTransformQuat(object: Object3D, transform: Readonly): Object3D {\r\n return ObjectUtils.setTransformWorldQuat(object, transform);\r\n}\r\n\r\n// Transform World\r\n\r\nexport function setTransformWorld(object: Object3D, transform: Readonly): Object3D {\r\n return ObjectUtils.setTransformWorldMatrix(object, transform);\r\n}\r\n\r\nexport const setTransformWorldMatrix = function () {\r\n const position = Vec3Utils.create();\r\n const rotation = QuatUtils.create();\r\n const scale = Vec3Utils.create();\r\n const transformMatrixNoScale = Mat4Utils.create();\r\n const inverseScale = Vec3Utils.create();\r\n const one = Vec3Utils.create(1);\r\n return function setTransformWorldMatrix(object: Object3D, transform: Readonly): Object3D {\r\n Mat4Utils.getPosition(transform, position);\r\n Mat4Utils.getScale(transform, scale);\r\n Vec3Utils.div(one, scale, inverseScale);\r\n Mat4Utils.scale(transform, inverseScale, transformMatrixNoScale);\r\n Mat4Utils.getRotationQuat(transformMatrixNoScale, rotation);\r\n QuatUtils.normalize(rotation, rotation);\r\n ObjectUtils.setScaleWorld(object, scale);\r\n ObjectUtils.setRotationWorldQuat(object, rotation);\r\n ObjectUtils.setPositionWorld(object, position);\r\n\r\n return object;\r\n };\r\n}();\r\n\r\nexport function setTransformWorldQuat(object: Object3D, transform: Readonly): Object3D {\r\n return object.setTransformWorld(transform);\r\n}\r\n\r\n// Transform Local\r\n\r\nexport function setTransformLocal(object: Object3D, transform: Readonly): Object3D {\r\n return ObjectUtils.setTransformLocalMatrix(object, transform);\r\n}\r\n\r\nexport const setTransformLocalMatrix = function () {\r\n const position = Vec3Utils.create();\r\n const rotation = QuatUtils.create();\r\n const scale = Vec3Utils.create();\r\n const transformMatrixNoScale = Mat4Utils.create();\r\n const inverseScale = Vec3Utils.create();\r\n const one = Vec3Utils.create(1);\r\n return function setTransformLocalMatrix(object: Object3D, transform: Readonly): Object3D {\r\n Mat4Utils.getPosition(transform, position);\r\n Mat4Utils.getScale(transform, scale);\r\n Vec3Utils.div(one, scale, inverseScale);\r\n Mat4Utils.scale(transform, inverseScale, transformMatrixNoScale);\r\n Mat4Utils.getRotationQuat(transformMatrixNoScale, rotation);\r\n QuatUtils.normalize(rotation, rotation);\r\n ObjectUtils.setScaleLocal(object, scale);\r\n ObjectUtils.setRotationLocalQuat(object, rotation);\r\n ObjectUtils.setPositionLocal(object, position);\r\n\r\n return object;\r\n };\r\n}();\r\n\r\nexport function setTransformLocalQuat(object: Object3D, transform: Readonly): Object3D {\r\n return object.setTransformLocal(transform);\r\n}\r\n\r\n// RESET\r\n\r\n// Position\r\n\r\nexport function resetPosition(object: Object3D): Object3D {\r\n return ObjectUtils.resetPositionWorld(object);\r\n}\r\n\r\nexport const resetPositionWorld = function () {\r\n const zero = Vec3Utils.create();\r\n return function resetPositionWorld(object: Object3D): Object3D {\r\n return ObjectUtils.setPositionWorld(object, zero);\r\n };\r\n}();\r\n\r\nexport const resetPositionLocal = function () {\r\n const zero = Vec3Utils.create();\r\n return function resetPositionLocal(object: Object3D): Object3D {\r\n return ObjectUtils.setPositionLocal(object, zero);\r\n };\r\n}();\r\n\r\n// Rotation\r\n\r\nexport function resetRotation(object: Object3D): Object3D {\r\n return ObjectUtils.resetRotationWorld(object);\r\n}\r\n\r\nexport const resetRotationWorld = function () {\r\n const identity = QuatUtils.create();\r\n return function resetRotationWorld(object: Object3D): Object3D {\r\n return ObjectUtils.setRotationWorldQuat(object, identity);\r\n };\r\n}();\r\n\r\nexport const resetRotationLocal = function () {\r\n const identity = QuatUtils.create();\r\n return function resetRotationLocal(object: Object3D): Object3D {\r\n return ObjectUtils.setRotationLocalQuat(object, identity);\r\n };\r\n}();\r\n\r\n// Scale\r\n\r\nexport function resetScale(object: Object3D): Object3D {\r\n return ObjectUtils.resetScaleWorld(object);\r\n}\r\n\r\nexport const resetScaleWorld = function () {\r\n const one = Vec3Utils.create(1);\r\n return function resetScaleWorld(object: Object3D): Object3D {\r\n return ObjectUtils.setScaleWorld(object, one);\r\n };\r\n}();\r\n\r\nexport const resetScaleLocal = function () {\r\n const one = Vec3Utils.create(1);\r\n return function resetScaleLocal(object: Object3D): Object3D {\r\n return ObjectUtils.setScaleLocal(object, one);\r\n };\r\n}();\r\n\r\n// Transform\r\n\r\nexport function resetTransform(object: Object3D): Object3D {\r\n return ObjectUtils.resetTransformWorld(object);\r\n}\r\n\r\nexport function resetTransformWorld(object: Object3D): Object3D {\r\n ObjectUtils.resetScaleWorld(object);\r\n ObjectUtils.resetRotationWorld(object);\r\n ObjectUtils.resetPositionWorld(object);\r\n\r\n return object;\r\n}\r\n\r\nexport function resetTransformLocal(object: Object3D): Object3D {\r\n ObjectUtils.resetScaleLocal(object);\r\n ObjectUtils.resetRotationLocal(object);\r\n ObjectUtils.resetPositionLocal(object);\r\n\r\n return object;\r\n}\r\n\r\n// TRANSFORMATIONS\r\n\r\n// Translate\r\n\r\nexport function translate(object: Object3D, translation: Readonly): Object3D {\r\n return ObjectUtils.translateWorld(object, translation);\r\n}\r\n\r\nexport function translateWorld(object: Object3D, translation: Readonly): Object3D {\r\n return object.translateWorld(translation);\r\n}\r\n\r\nexport function translateLocal(object: Object3D, translation: Readonly): Object3D {\r\n return object.translateLocal(translation);\r\n}\r\n\r\nexport function translateObject(object: Object3D, translation: Readonly): Object3D {\r\n return object.translateObject(translation);\r\n}\r\n\r\n// Translate Axis\r\n\r\nexport function translateAxis(object: Object3D, amount: number, direction: Readonly): Object3D {\r\n return ObjectUtils.translateAxisWorld(object, amount, direction);\r\n}\r\n\r\nexport const translateAxisWorld = function () {\r\n const translation = Vec3Utils.create();\r\n return function translateAxisWorld(object: Object3D, amount: number, direction: Readonly): Object3D {\r\n Vec3Utils.scale(direction, amount, translation);\r\n return ObjectUtils.translateWorld(object, translation);\r\n };\r\n}();\r\n\r\nexport const translateAxisLocal = function () {\r\n const translation = Vec3Utils.create();\r\n return function translateAxisLocal(object: Object3D, amount: number, direction: Readonly): Object3D {\r\n Vec3Utils.scale(direction, amount, translation);\r\n return ObjectUtils.translateLocal(object, translation);\r\n };\r\n}();\r\n\r\nexport const translateAxisObject = function () {\r\n const translation = Vec3Utils.create();\r\n return function translateAxisObject(object: Object3D, amount: number, direction: Readonly): Object3D {\r\n Vec3Utils.scale(direction, amount, translation);\r\n return ObjectUtils.translateObject(object, translation);\r\n };\r\n}();\r\n\r\n// Rotate\r\n\r\nexport function rotate(object: Object3D, rotation: Readonly): Object3D {\r\n return ObjectUtils.rotateWorld(object, rotation);\r\n}\r\n\r\nexport function rotateDegrees(object: Object3D, rotation: Readonly): Object3D {\r\n return ObjectUtils.rotateWorldDegrees(object, rotation);\r\n}\r\n\r\nexport function rotateRadians(object: Object3D, rotation: Readonly): Object3D {\r\n return ObjectUtils.rotateWorldRadians(object, rotation);\r\n}\r\n\r\nexport function rotateMatrix(object: Object3D, rotation: Readonly): Object3D {\r\n return ObjectUtils.rotateWorldMatrix(object, rotation);\r\n}\r\n\r\nexport function rotateQuat(object: Object3D, rotation: Readonly): Object3D {\r\n return ObjectUtils.rotateWorldQuat(object, rotation);\r\n}\r\n\r\n// Rotate World\r\n\r\nexport function rotateWorld(object: Object3D, rotation: Readonly): Object3D {\r\n return ObjectUtils.rotateWorldDegrees(object, rotation);\r\n}\r\n\r\nexport const rotateWorldDegrees = function () {\r\n const rotationQuat = QuatUtils.create();\r\n return function rotateWorldDegrees(object: Object3D, rotation: Readonly): Object3D {\r\n Vec3Utils.degreesToQuat(rotation, rotationQuat);\r\n return ObjectUtils.rotateWorldQuat(object, rotationQuat);\r\n };\r\n}();\r\n\r\nexport const rotateWorldRadians = function () {\r\n const degreesRotation = Vec3Utils.create();\r\n return function rotateWorldRadians(object: Object3D, rotation: Readonly): Object3D {\r\n Vec3Utils.toDegrees(rotation, degreesRotation);\r\n return ObjectUtils.rotateWorldDegrees(object, degreesRotation);\r\n };\r\n}();\r\n\r\nexport const rotateWorldMatrix = function () {\r\n const rotationQuat = QuatUtils.create();\r\n return function rotateWorldMatrix(object: Object3D, rotation: Readonly): Object3D {\r\n Mat3Utils.toQuat(rotation, rotationQuat);\r\n QuatUtils.normalize(rotationQuat, rotationQuat);\r\n return ObjectUtils.rotateWorldQuat(object, rotationQuat);\r\n };\r\n}();\r\n\r\nexport const rotateWorldQuat = function () {\r\n const currentRotationQuat = QuatUtils.create();\r\n return function rotateWorldQuat(object: Object3D, rotation: Readonly): Object3D {\r\n ObjectUtils.getRotationWorldQuat(object, currentRotationQuat);\r\n QuatUtils.mul(rotation, currentRotationQuat, currentRotationQuat);\r\n QuatUtils.normalize(currentRotationQuat, currentRotationQuat);\r\n return ObjectUtils.setRotationWorldQuat(object, currentRotationQuat);\r\n };\r\n}();\r\n\r\n// Rotate Local\r\n\r\nexport function rotateLocal(object: Object3D, rotation: Readonly): Object3D {\r\n return ObjectUtils.rotateLocalDegrees(object, rotation);\r\n}\r\n\r\nexport const rotateLocalDegrees = function () {\r\n const rotationQuat = QuatUtils.create();\r\n return function rotateLocalDegrees(object: Object3D, rotation: Readonly): Object3D {\r\n Vec3Utils.degreesToQuat(rotation, rotationQuat);\r\n return ObjectUtils.rotateLocalQuat(object, rotationQuat);\r\n };\r\n}();\r\n\r\nexport const rotateLocalRadians = function () {\r\n const degreesRotation = Vec3Utils.create();\r\n return function rotateLocalRadians(object: Object3D, rotation: Readonly): Object3D {\r\n Vec3Utils.toDegrees(rotation, degreesRotation);\r\n return ObjectUtils.rotateLocalDegrees(object, degreesRotation);\r\n };\r\n}();\r\n\r\nexport const rotateLocalMatrix = function () {\r\n const rotationQuat = QuatUtils.create();\r\n return function rotateLocalMatrix(object: Object3D, rotation: Readonly): Object3D {\r\n Mat3Utils.toQuat(rotation, rotationQuat);\r\n QuatUtils.normalize(rotationQuat, rotationQuat);\r\n return ObjectUtils.rotateLocalQuat(object, rotationQuat);\r\n };\r\n}();\r\n\r\nexport const rotateLocalQuat = function () {\r\n const currentRotationQuat = QuatUtils.create();\r\n return function rotateLocalQuat(object: Object3D, rotation: Readonly): Object3D {\r\n ObjectUtils.getRotationLocalQuat(object, currentRotationQuat);\r\n QuatUtils.mul(rotation, currentRotationQuat, currentRotationQuat);\r\n QuatUtils.normalize(currentRotationQuat, currentRotationQuat);\r\n return ObjectUtils.setRotationLocalQuat(object, currentRotationQuat);\r\n };\r\n}();\r\n\r\n// Rotate Object\r\n\r\nexport function rotateObject(object: Object3D, rotation: Readonly): Object3D {\r\n return ObjectUtils.rotateObjectDegrees(object, rotation);\r\n}\r\n\r\nexport const rotateObjectDegrees = function () {\r\n const rotationQuat = QuatUtils.create();\r\n return function rotateObjectDegrees(object: Object3D, rotation: Readonly): Object3D {\r\n Vec3Utils.degreesToQuat(rotation, rotationQuat);\r\n return ObjectUtils.rotateObjectQuat(object, rotationQuat);\r\n };\r\n}();\r\n\r\nexport const rotateObjectRadians = function () {\r\n const degreesRotation = Vec3Utils.create();\r\n return function rotateObjectRadians(object: Object3D, rotation: Readonly): Object3D {\r\n Vec3Utils.toDegrees(rotation, degreesRotation);\r\n return ObjectUtils.rotateObjectDegrees(object, degreesRotation);\r\n };\r\n}();\r\n\r\nexport const rotateObjectMatrix = function () {\r\n const rotationQuat = QuatUtils.create();\r\n return function rotateObjectMatrix(object: Object3D, rotation: Readonly): Object3D {\r\n Mat3Utils.toQuat(rotation, rotationQuat);\r\n QuatUtils.normalize(rotationQuat, rotationQuat);\r\n return ObjectUtils.rotateObjectQuat(object, rotationQuat);\r\n };\r\n}();\r\n\r\nexport function rotateObjectQuat(object: Object3D, rotation: Readonly): Object3D {\r\n return object.rotateObject(rotation);\r\n}\r\n\r\n// Rotate Axis\r\n\r\nexport function rotateAxis(object: Object3D, angle: number, axis: Readonly): Object3D {\r\n return ObjectUtils.rotateAxisWorld(object, angle, axis);\r\n}\r\n\r\nexport function rotateAxisDegrees(object: Object3D, angle: number, axis: Readonly): Object3D {\r\n return ObjectUtils.rotateAxisWorldDegrees(object, angle, axis);\r\n}\r\n\r\nexport function rotateAxisRadians(object: Object3D, angle: number, axis: Readonly): Object3D {\r\n return ObjectUtils.rotateAxisWorldRadians(object, angle, axis);\r\n}\r\n\r\n// Rotate Axis World\r\n\r\nexport function rotateAxisWorld(object: Object3D, angle: number, axis: Readonly): Object3D {\r\n return ObjectUtils.rotateAxisWorldDegrees(object, angle, axis);\r\n}\r\n\r\nexport function rotateAxisWorldDegrees(object: Object3D, angle: number, axis: Readonly): Object3D {\r\n return ObjectUtils.rotateAxisWorldRadians(object, MathUtils.toRadians(angle), axis);\r\n}\r\n\r\nexport const rotateAxisWorldRadians = function () {\r\n const rotation = QuatUtils.create();\r\n return function rotateAxisWorldRadians(object: Object3D, angle: number, axis: Readonly): Object3D {\r\n QuatUtils.fromAxisRadians(angle, axis, rotation);\r\n return ObjectUtils.rotateWorldQuat(object, rotation);\r\n };\r\n}();\r\n\r\n// Rotate Axis Local\r\n\r\nexport function rotateAxisLocal(object: Object3D, angle: number, axis: Readonly): Object3D {\r\n return ObjectUtils.rotateAxisLocalDegrees(object, angle, axis);\r\n}\r\n\r\nexport function rotateAxisLocalDegrees(object: Object3D, angle: number, axis: Readonly): Object3D {\r\n return ObjectUtils.rotateAxisLocalRadians(object, MathUtils.toRadians(angle), axis);\r\n}\r\n\r\nexport const rotateAxisLocalRadians = function () {\r\n const rotation = QuatUtils.create();\r\n return function rotateAxisLocalRadians(object: Object3D, angle: number, axis: Readonly): Object3D {\r\n QuatUtils.fromAxisRadians(angle, axis, rotation);\r\n return ObjectUtils.rotateLocalQuat(object, rotation);\r\n };\r\n}();\r\n\r\n// Rotate Axis Object\r\n\r\nexport function rotateAxisObject(object: Object3D, angle: number, axis: Readonly): Object3D {\r\n return ObjectUtils.rotateAxisObjectDegrees(object, angle, axis);\r\n}\r\n\r\nexport function rotateAxisObjectDegrees(object: Object3D, angle: number, axis: Readonly): Object3D {\r\n return ObjectUtils.rotateAxisObjectRadians(object, MathUtils.toRadians(angle), axis);\r\n}\r\n\r\nexport const rotateAxisObjectRadians = function () {\r\n const rotation = QuatUtils.create();\r\n return function rotateAxisObjectRadians(object: Object3D, angle: number, axis: Readonly): Object3D {\r\n QuatUtils.fromAxisRadians(angle, axis, rotation);\r\n return ObjectUtils.rotateObjectQuat(object, rotation);\r\n };\r\n}();\r\n\r\n// Rotate Around\r\n\r\nexport function rotateAround(object: Object3D, rotation: Readonly, origin: Readonly): Object3D {\r\n return ObjectUtils.rotateAroundWorld(object, rotation, origin);\r\n}\r\n\r\nexport function rotateAroundDegrees(object: Object3D, rotation: Readonly, origin: Readonly): Object3D {\r\n return ObjectUtils.rotateAroundWorldDegrees(object, rotation, origin);\r\n}\r\n\r\nexport function rotateAroundRadians(object: Object3D, rotation: Readonly, origin: Readonly): Object3D {\r\n return ObjectUtils.rotateAroundWorldRadians(object, rotation, origin);\r\n}\r\n\r\nexport function rotateAroundMatrix(object: Object3D, rotation: Readonly, origin: Readonly): Object3D {\r\n return ObjectUtils.rotateAroundWorldMatrix(object, rotation, origin);\r\n}\r\n\r\nexport function rotateAroundQuat(object: Object3D, rotation: Readonly, origin: Readonly): Object3D {\r\n return ObjectUtils.rotateAroundWorldQuat(object, rotation, origin);\r\n}\r\n\r\n// Rotate Around World\r\n\r\nexport function rotateAroundWorld(object: Object3D, rotation: Readonly, origin: Readonly): Object3D {\r\n return ObjectUtils.rotateAroundWorldDegrees(object, rotation, origin);\r\n}\r\n\r\nexport const rotateAroundWorldDegrees = function () {\r\n const rotationQuat = QuatUtils.create();\r\n return function rotateAroundWorldDegrees(object: Object3D, rotation: Readonly, origin: Readonly): Object3D {\r\n Vec3Utils.degreesToQuat(rotation, rotationQuat);\r\n return ObjectUtils.rotateAroundWorldQuat(object, rotationQuat, origin);\r\n };\r\n}();\r\n\r\nexport const rotateAroundWorldRadians = function () {\r\n const degreesRotation = Vec3Utils.create();\r\n return function rotateAroundWorldRadians(object: Object3D, rotation: Readonly, origin: Readonly): Object3D {\r\n Vec3Utils.toDegrees(rotation, degreesRotation);\r\n return ObjectUtils.rotateAroundWorldDegrees(object, degreesRotation, origin);\r\n };\r\n}();\r\n\r\nexport const rotateAroundWorldMatrix = function () {\r\n const rotationQuat = QuatUtils.create();\r\n return function rotateAroundWorldMatrix(object: Object3D, rotation: Readonly, origin: Readonly): Object3D {\r\n Mat3Utils.toQuat(rotation, rotationQuat);\r\n QuatUtils.normalize(rotationQuat, rotationQuat);\r\n return ObjectUtils.rotateAroundWorldQuat(object, rotationQuat, origin);\r\n };\r\n}();\r\n\r\nexport const rotateAroundWorldQuat = function () {\r\n const axis = Vec3Utils.create();\r\n return function rotateAroundWorldQuat(object: Object3D, rotation: Readonly, origin: Readonly): Object3D {\r\n QuatUtils.getAxis(rotation, axis);\r\n const angle = QuatUtils.getAngleRadians(rotation,);\r\n return ObjectUtils.rotateAroundAxisWorldRadians(object, angle, axis, origin);\r\n };\r\n}();\r\n\r\n// Rotate Around Local\r\n\r\nexport function rotateAroundLocal(object: Object3D, rotation: Readonly, origin: Readonly): Object3D {\r\n return ObjectUtils.rotateAroundLocalDegrees(object, rotation, origin);\r\n}\r\n\r\nexport const rotateAroundLocalDegrees = function () {\r\n const rotationQuat = QuatUtils.create();\r\n return function rotateAroundLocalDegrees(object: Object3D, rotation: Readonly, origin: Readonly): Object3D {\r\n Vec3Utils.degreesToQuat(rotation, rotationQuat);\r\n return ObjectUtils.rotateAroundLocalQuat(object, rotationQuat, origin);\r\n };\r\n}();\r\n\r\nexport const rotateAroundLocalRadians = function () {\r\n const degreesRotation = Vec3Utils.create();\r\n return function rotateAroundLocalRadians(object: Object3D, rotation: Readonly, origin: Readonly): Object3D {\r\n Vec3Utils.toDegrees(rotation, degreesRotation);\r\n return ObjectUtils.rotateAroundLocalDegrees(object, degreesRotation, origin);\r\n };\r\n}();\r\n\r\nexport const rotateAroundLocalMatrix = function () {\r\n const rotationQuat = QuatUtils.create();\r\n return function rotateAroundLocalMatrix(object: Object3D, rotation: Readonly, origin: Readonly): Object3D {\r\n Mat3Utils.toQuat(rotation, rotationQuat);\r\n QuatUtils.normalize(rotationQuat, rotationQuat);\r\n return ObjectUtils.rotateAroundLocalQuat(object, rotationQuat, origin);\r\n };\r\n}();\r\n\r\nexport const rotateAroundLocalQuat = function () {\r\n const axis = Vec3Utils.create();\r\n return function rotateAroundLocalQuat(object: Object3D, rotation: Readonly, origin: Readonly): Object3D {\r\n QuatUtils.getAxis(rotation, axis);\r\n const angle = QuatUtils.getAngleRadians(rotation,);\r\n return ObjectUtils.rotateAroundAxisLocalRadians(object, angle, axis, origin);\r\n };\r\n}();\r\n\r\n// Rotate Around Object\r\n\r\nexport function rotateAroundObject(object: Object3D, rotation: Readonly, origin: Readonly): Object3D {\r\n return ObjectUtils.rotateAroundObjectDegrees(object, rotation, origin);\r\n}\r\n\r\nexport const rotateAroundObjectDegrees = function () {\r\n const rotationQuat = QuatUtils.create();\r\n return function rotateAroundObjectDegrees(object: Object3D, rotation: Readonly, origin: Readonly): Object3D {\r\n Vec3Utils.degreesToQuat(rotation, rotationQuat);\r\n return ObjectUtils.rotateAroundObjectQuat(object, rotationQuat, origin);\r\n };\r\n}();\r\n\r\nexport const rotateAroundObjectRadians = function () {\r\n const degreesRotation = Vec3Utils.create();\r\n return function rotateAroundObjectRadians(object: Object3D, rotation: Readonly, origin: Readonly): Object3D {\r\n Vec3Utils.toDegrees(rotation, degreesRotation);\r\n return ObjectUtils.rotateAroundObjectDegrees(object, degreesRotation, origin);\r\n };\r\n}();\r\n\r\nexport const rotateAroundObjectMatrix = function () {\r\n const rotationQuat = QuatUtils.create();\r\n return function rotateAroundObjectMatrix(object: Object3D, rotation: Readonly, origin: Readonly): Object3D {\r\n Mat3Utils.toQuat(rotation, rotationQuat);\r\n QuatUtils.normalize(rotationQuat, rotationQuat);\r\n return ObjectUtils.rotateAroundObjectQuat(object, rotationQuat, origin);\r\n };\r\n}();\r\n\r\nexport const rotateAroundObjectQuat = function () {\r\n const axis = Vec3Utils.create();\r\n return function rotateAroundObjectQuat(object: Object3D, rotation: Readonly, origin: Readonly): Object3D {\r\n QuatUtils.getAxis(rotation, axis);\r\n const angle = QuatUtils.getAngleRadians(rotation,);\r\n return ObjectUtils.rotateAroundAxisObjectRadians(object, angle, axis, origin);\r\n };\r\n}();\r\n\r\n// Rotate Around Axis\r\n\r\nexport function rotateAroundAxis(object: Object3D, angle: number, axis: Readonly, origin: Readonly): Object3D {\r\n return ObjectUtils.rotateAroundAxisWorld(object, angle, axis, origin);\r\n}\r\n\r\nexport function rotateAroundAxisDegrees(object: Object3D, angle: number, axis: Readonly, origin: Readonly): Object3D {\r\n return ObjectUtils.rotateAroundAxisWorldDegrees(object, angle, axis, origin);\r\n}\r\n\r\nexport function rotateAroundAxisRadians(object: Object3D, angle: number, axis: Readonly, origin: Readonly): Object3D {\r\n return ObjectUtils.rotateAroundAxisWorldRadians(object, angle, axis, origin);\r\n}\r\n\r\n// Rotate Around Axis World\r\n\r\nexport function rotateAroundAxisWorld(object: Object3D, angle: number, axis: Readonly, origin: Readonly): Object3D {\r\n return ObjectUtils.rotateAroundAxisWorldDegrees(object, angle, axis, origin);\r\n}\r\n\r\nexport function rotateAroundAxisWorldDegrees(object: Object3D, angle: number, axis: Readonly, origin: Readonly): Object3D {\r\n return ObjectUtils.rotateAroundAxisWorldRadians(object, MathUtils.toRadians(angle), axis, origin);\r\n}\r\n\r\nexport const rotateAroundAxisWorldRadians = function () {\r\n const transformToRotate = Quat2Utils.create();\r\n const transformToRotateConjugate = Quat2Utils.create();\r\n const transformQuat = Quat2Utils.create();\r\n const defaultQuat = QuatUtils.create();\r\n return function rotateAroundAxisWorldRadians(object: Object3D, angle: number, axis: Readonly, origin: Readonly): Object3D {\r\n Quat2Utils.setPositionRotationQuat(transformToRotate, origin, defaultQuat);\r\n ObjectUtils.getTransformWorldQuat(object, transformQuat);\r\n Quat2Utils.conjugate(transformToRotate, transformToRotateConjugate);\r\n Quat2Utils.mul(transformToRotateConjugate, transformQuat, transformQuat);\r\n Quat2Utils.rotateAxisRadians(transformToRotate, angle, axis, transformToRotate);\r\n Quat2Utils.mul(transformToRotate, transformQuat, transformQuat);\r\n return ObjectUtils.setTransformWorldQuat(object, transformQuat);\r\n };\r\n}();\r\n\r\n// Rotate Around Axis Local\r\n\r\nexport function rotateAroundAxisLocal(object: Object3D, angle: number, axis: Readonly, origin: Readonly): Object3D {\r\n return ObjectUtils.rotateAroundAxisLocalDegrees(object, angle, axis, origin);\r\n}\r\n\r\nexport function rotateAroundAxisLocalDegrees(object: Object3D, angle: number, axis: Readonly, origin: Readonly): Object3D {\r\n return ObjectUtils.rotateAroundAxisLocalRadians(object, MathUtils.toRadians(angle), axis, origin);\r\n}\r\n\r\nexport const rotateAroundAxisLocalRadians = function () {\r\n const convertedPosition = Vec3Utils.create();\r\n const convertedAxis = Vec3Utils.create();\r\n return function rotateAroundAxisLocalRadians(object: Object3D, angle: number, axis: Readonly, origin: Readonly): Object3D {\r\n ObjectUtils.convertPositionLocalToWorld(object, origin, convertedPosition);\r\n ObjectUtils.convertDirectionLocalToWorld(object, axis, convertedAxis);\r\n return ObjectUtils.rotateAroundAxisWorldRadians(object, angle, convertedAxis, convertedPosition);\r\n };\r\n}();\r\n\r\n// Rotate Around Axis Object\r\n\r\nexport function rotateAroundAxisObject(object: Object3D, angle: number, axis: Readonly, origin: Readonly): Object3D {\r\n return ObjectUtils.rotateAroundAxisObjectDegrees(object, angle, axis, origin);\r\n}\r\n\r\nexport function rotateAroundAxisObjectDegrees(object: Object3D, angle: number, axis: Readonly, origin: Readonly): Object3D {\r\n return ObjectUtils.rotateAroundAxisObjectRadians(object, MathUtils.toRadians(angle), axis, origin);\r\n}\r\n\r\nexport const rotateAroundAxisObjectRadians = function () {\r\n const convertedPosition = Vec3Utils.create();\r\n const convertedAxis = Vec3Utils.create();\r\n return function rotateAroundAxisObjectRadians(object: Object3D, angle: number, axis: Readonly, origin: Readonly): Object3D {\r\n ObjectUtils.convertPositionObjectToWorld(object, origin, convertedPosition);\r\n ObjectUtils.convertDirectionObjectToWorld(object, axis, convertedAxis);\r\n return ObjectUtils.rotateAroundAxisWorldRadians(object, angle, convertedAxis, convertedPosition);\r\n };\r\n}();\r\n\r\n// Scale\r\n\r\n// #TODO For now it does not really make sense in WL to scale in world space or parent space\r\n// so there is no scale default function\r\n\r\nexport const scaleObject = function () {\r\n const vector = Vec3Utils.create();\r\n\r\n function scaleObject(object: Object3D, scale: Readonly): Object3D;\r\n function scaleObject(object: Object3D, uniformScale: number): Object3D;\r\n function scaleObject(object: Object3D, scale: Readonly | number): Object3D {\r\n if (isNaN(scale as number)) {\r\n return object.scaleLocal(scale as Vector3);\r\n } else {\r\n Vec3Utils.set(vector, scale as number);\r\n return object.scaleLocal(vector);\r\n }\r\n }\r\n\r\n return scaleObject;\r\n}();\r\n\r\n// Look At\r\n\r\nexport function lookAt(object: Object3D, position: Readonly, up?: Readonly): Object3D {\r\n return ObjectUtils.lookAtWorld(object, position, up);\r\n}\r\n\r\nexport const lookAtWorld = function () {\r\n const direction = Vec3Utils.create();\r\n return function lookAtWorld(object: Object3D, position: Readonly, up?: Readonly): Object3D {\r\n ObjectUtils.getPositionWorld(object, direction);\r\n Vec3Utils.sub(position, direction, direction);\r\n return ObjectUtils.lookToWorld(object, direction, up);\r\n };\r\n}();\r\n\r\nexport const lookAtLocal = function () {\r\n const direction = Vec3Utils.create();\r\n return function lookAtLocal(object: Object3D, position: Readonly, up?: Readonly): Object3D {\r\n ObjectUtils.getPositionLocal(object, direction);\r\n Vec3Utils.sub(position, direction, direction);\r\n return ObjectUtils.lookToLocal(object, direction, up);\r\n };\r\n}();\r\n\r\nexport function lookTo(object: Object3D, direction: Readonly, up?: Readonly): Object3D {\r\n return ObjectUtils.lookToWorld(object, direction, up);\r\n}\r\n\r\nexport const lookToWorld: (object: Object3D, direction: Readonly, up?: Readonly) => Object3D = function () {\r\n const internalUp = Vec3Utils.create();\r\n return function lookToWorld(object: Object3D, direction: Readonly, up: Readonly = ObjectUtils.getUpWorld(object, internalUp)): Object3D {\r\n return ObjectUtils.setForwardWorld(object, direction, up);\r\n };\r\n}();\r\n\r\nexport const lookToLocal: (object: Object3D, direction: Readonly, up?: Readonly) => Object3D = function () {\r\n const internalUp = Vec3Utils.create();\r\n return function lookToLocal(object: Object3D, direction: Readonly, up: Readonly = ObjectUtils.getUpLocal(object, internalUp)): Object3D {\r\n return ObjectUtils.setForwardLocal(object, direction, up);\r\n };\r\n}();\r\n\r\n// EXTRA\r\n\r\n// Convert Vector Object World\r\n\r\nexport const convertPositionObjectToWorld = function () {\r\n const matrix = Mat4Utils.create();\r\n\r\n function convertPositionObjectToWorld(object: Readonly, position: Readonly): Vector3;\r\n function convertPositionObjectToWorld(object: Readonly, position: Readonly, outPosition: T): T;\r\n function convertPositionObjectToWorld(object: Readonly, position: Readonly, outPosition: Vector3 | T = Vec3Utils.create()): Vector3 | T {\r\n ObjectUtils.getTransformWorldMatrix(object, matrix);\r\n Vec3Utils.transformMat4(position, matrix, outPosition);\r\n return outPosition;\r\n }\r\n\r\n return convertPositionObjectToWorld;\r\n}();\r\n\r\nexport const convertDirectionObjectToWorld = function () {\r\n const rotation = QuatUtils.create();\r\n\r\n function convertDirectionObjectToWorld(object: Readonly, direction: Readonly): Vector3;\r\n function convertDirectionObjectToWorld(object: Readonly, direction: Readonly, outDirection: T): T;\r\n function convertDirectionObjectToWorld(object: Readonly, direction: Readonly, outDirection: Vector3 | T = Vec3Utils.create()): Vector3 | T {\r\n ObjectUtils.getRotationWorldQuat(object, rotation);\r\n Vec3Utils.transformQuat(direction, rotation, outDirection);\r\n return outDirection;\r\n }\r\n\r\n return convertDirectionObjectToWorld;\r\n}();\r\n\r\nexport const convertPositionWorldToObject = function () {\r\n const matrix = Mat4Utils.create();\r\n\r\n function convertPositionWorldToObject(object: Readonly, position: Readonly): Vector3;\r\n function convertPositionWorldToObject(object: Readonly, position: Readonly, outPosition: T): T;\r\n function convertPositionWorldToObject(object: Readonly, position: Readonly, outPosition: Vector3 | T = Vec3Utils.create()): Vector3 | T {\r\n ObjectUtils.getTransformWorldMatrix(object, matrix);\r\n Mat4Utils.invert(matrix, matrix);\r\n Vec3Utils.transformMat4(position, matrix, outPosition);\r\n return outPosition;\r\n }\r\n\r\n return convertPositionWorldToObject;\r\n}();\r\n\r\nexport const convertDirectionWorldToObject = function () {\r\n const rotation = QuatUtils.create();\r\n\r\n function convertDirectionWorldToObject(object: Readonly, direction: Readonly): Vector3;\r\n function convertDirectionWorldToObject(object: Readonly, direction: Readonly, outDirection: T): T;\r\n function convertDirectionWorldToObject(object: Readonly, direction: Readonly, outDirection: Vector3 | T = Vec3Utils.create()): Vector3 | T {\r\n ObjectUtils.getRotationWorldQuat(object, rotation);\r\n QuatUtils.conjugate(rotation, rotation);\r\n Vec3Utils.transformQuat(direction, rotation, outDirection);\r\n return outDirection;\r\n }\r\n\r\n return convertDirectionWorldToObject;\r\n}();\r\n\r\n// Convert Vector Local World\r\n\r\nexport function convertPositionLocalToWorld(object: Readonly, position: Readonly): Vector3;\r\nexport function convertPositionLocalToWorld(object: Readonly, position: Readonly, outPosition: T): T;\r\nexport function convertPositionLocalToWorld(object: Readonly, position: Readonly, outPosition: Vector3 | T = Vec3Utils.create()): Vector3 | T {\r\n if (ObjectUtils.getParent(object) != null) {\r\n ObjectUtils.convertPositionObjectToWorld(ObjectUtils.getParent(object)!, position, outPosition);\r\n } else {\r\n Vec3Utils.copy(position, outPosition);\r\n }\r\n return outPosition;\r\n}\r\n\r\nexport function convertDirectionLocalToWorld(object: Readonly, direction: Readonly): Vector3;\r\nexport function convertDirectionLocalToWorld(object: Readonly, direction: Readonly, outDirection: T): T;\r\nexport function convertDirectionLocalToWorld(object: Readonly, direction: Readonly, outDirection: Vector3 | T = Vec3Utils.create()): Vector3 | T {\r\n if (ObjectUtils.getParent(object) != null) {\r\n ObjectUtils.convertDirectionObjectToWorld(ObjectUtils.getParent(object)!, direction, outDirection);\r\n } else {\r\n Vec3Utils.copy(direction, outDirection);\r\n }\r\n return outDirection;\r\n}\r\n\r\nexport function convertPositionWorldToLocal(object: Readonly, position: Readonly): Vector3;\r\nexport function convertPositionWorldToLocal(object: Readonly, position: Readonly, outPosition: T): T;\r\nexport function convertPositionWorldToLocal(object: Readonly, position: Readonly, outPosition: Vector3 | T = Vec3Utils.create()): Vector3 | T {\r\n if (ObjectUtils.getParent(object) != null) {\r\n ObjectUtils.convertPositionWorldToObject(ObjectUtils.getParent(object)!, position, outPosition);\r\n } else {\r\n Vec3Utils.copy(position, outPosition);\r\n }\r\n return outPosition;\r\n}\r\n\r\nexport function convertDirectionWorldToLocal(object: Readonly, direction: Readonly): Vector3;\r\nexport function convertDirectionWorldToLocal(object: Readonly, direction: Readonly, outDirection: T): T;\r\nexport function convertDirectionWorldToLocal(object: Readonly, direction: Readonly, outDirection: Vector3 | T = Vec3Utils.create()): Vector3 | T {\r\n if (ObjectUtils.getParent(object) != null) {\r\n ObjectUtils.convertDirectionWorldToObject(ObjectUtils.getParent(object)!, direction, outDirection);\r\n } else {\r\n Vec3Utils.copy(direction, outDirection);\r\n }\r\n return outDirection;\r\n}\r\n\r\n// Convert Vector Local Object\r\n\r\n// I need to use the converson to world and then local also use the parent scale that changes the position in local space\r\n\r\nexport function convertPositionObjectToLocal(object: Readonly, position: Readonly): Vector3;\r\nexport function convertPositionObjectToLocal(object: Readonly, position: Readonly, outPosition: T): T;\r\nexport function convertPositionObjectToLocal(object: Readonly, position: Readonly, outPosition: Vector3 | T = Vec3Utils.create()): Vector3 | T {\r\n ObjectUtils.convertPositionObjectToWorld(object, position, outPosition);\r\n ObjectUtils.convertPositionWorldToLocal(object, outPosition, outPosition);\r\n return outPosition;\r\n}\r\n\r\nexport function convertDirectionObjectToLocal(object: Readonly, direction: Readonly): Vector3;\r\nexport function convertDirectionObjectToLocal(object: Readonly, direction: Readonly, outDirection: T): T;\r\nexport function convertDirectionObjectToLocal(object: Readonly, direction: Readonly, outDirection: Vector3 | T = Vec3Utils.create()): Vector3 | T {\r\n ObjectUtils.convertDirectionObjectToWorld(object, direction, outDirection);\r\n ObjectUtils.convertDirectionWorldToLocal(object, outDirection, outDirection);\r\n return outDirection;\r\n}\r\n\r\nexport function convertPositionLocalToObject(object: Readonly, position: Readonly): Vector3;\r\nexport function convertPositionLocalToObject(object: Readonly, position: Readonly, outPosition: T): T;\r\nexport function convertPositionLocalToObject(object: Readonly, position: Readonly, outPosition: Vector3 | T = Vec3Utils.create()): Vector3 | T {\r\n ObjectUtils.convertPositionLocalToWorld(object, position, outPosition);\r\n ObjectUtils.convertPositionWorldToObject(object, outPosition, outPosition);\r\n return outPosition;\r\n}\r\n\r\nexport function convertDirectionLocalToObject(object: Readonly, direction: Readonly): Vector3;\r\nexport function convertDirectionLocalToObject(object: Readonly, direction: Readonly, outDirection: T): T;\r\nexport function convertDirectionLocalToObject(object: Readonly, direction: Readonly, outDirection: Vector3 | T = Vec3Utils.create()): Vector3 | T {\r\n ObjectUtils.convertDirectionLocalToWorld(object, direction, outDirection);\r\n ObjectUtils.convertDirectionWorldToObject(object, outDirection, outDirection);\r\n return outDirection;\r\n}\r\n\r\n// Convert Transform Object World\r\n\r\nexport function convertTransformObjectToWorld(object: Readonly, transform: Readonly): T;\r\nexport function convertTransformObjectToWorld(object: Readonly, transform: Readonly, outTransform: T): T;\r\nexport function convertTransformObjectToWorld(object: Readonly, transform: Readonly, outTransform?: T | U): T | U {\r\n return ObjectUtils.convertTransformObjectToWorldMatrix(object, transform, outTransform!);\r\n}\r\n\r\nexport const convertTransformObjectToWorldMatrix = function () {\r\n const convertTransform = Mat4Utils.create();\r\n const position = Vec3Utils.create();\r\n const scale = Vec3Utils.create();\r\n const inverseScale = Vec3Utils.create();\r\n const one = Vec3Utils.create(1);\r\n\r\n function convertTransformObjectToWorldMatrix(object: Readonly, transform: Readonly): T;\r\n function convertTransformObjectToWorldMatrix(object: Readonly, transform: Readonly, outTransform: T): T;\r\n function convertTransformObjectToWorldMatrix(object: Readonly, transform: Readonly, outTransform: T | U = Mat4Utils.clone(transform)): T | U {\r\n ObjectUtils.getTransformWorldMatrix(object, convertTransform);\r\n if (ObjectUtils.hasUniformScaleWorld(object)) {\r\n Mat4Utils.mul(convertTransform, transform, outTransform);\r\n } else {\r\n Vec3Utils.set(position, transform[12], transform[13], transform[14]);\r\n ObjectUtils.convertPositionObjectToWorld(object, position, position);\r\n\r\n Mat4Utils.getScale(convertTransform, scale);\r\n Vec3Utils.div(one, scale, inverseScale);\r\n Mat4Utils.scale(convertTransform, inverseScale, convertTransform);\r\n\r\n Mat4Utils.mul(convertTransform, transform, outTransform);\r\n Mat4Utils.scale(outTransform, scale, outTransform);\r\n\r\n outTransform[12] = position[0];\r\n outTransform[13] = position[1];\r\n outTransform[14] = position[2];\r\n outTransform[15] = 1;\r\n }\r\n return outTransform;\r\n }\r\n\r\n return convertTransformObjectToWorldMatrix;\r\n}();\r\n\r\nexport const convertTransformObjectToWorldQuat = function () {\r\n const position = Vec3Utils.create();\r\n const rotation = QuatUtils.create();\r\n\r\n function convertTransformObjectToWorldQuat(object: Readonly, transform: Readonly): T;\r\n function convertTransformObjectToWorldQuat(object: Readonly, transform: Readonly, outTransform: T): T;\r\n function convertTransformObjectToWorldQuat(object: Readonly, transform: Readonly, outTransform: T | U = Quat2Utils.clone(transform)): T | U {\r\n ObjectUtils.getRotationWorldQuat(object, rotation);\r\n QuatUtils.mul(rotation, transform, rotation);\r\n Quat2Utils.getPosition(transform, position);\r\n ObjectUtils.convertPositionObjectToWorld(object, position, position);\r\n Quat2Utils.setPositionRotationQuat(outTransform, position, rotation);\r\n return outTransform;\r\n }\r\n\r\n return convertTransformObjectToWorldQuat;\r\n}();\r\n\r\n\r\nexport function convertTransformWorldToObject(object: Readonly, transform: Readonly): T;\r\nexport function convertTransformWorldToObject(object: Readonly, transform: Readonly, outTransform: T): T;\r\nexport function convertTransformWorldToObject(object: Readonly, transform: Readonly, outTransform?: T | U): T | U {\r\n return ObjectUtils.convertTransformWorldToObjectMatrix(object, transform, outTransform!);\r\n}\r\n\r\nexport const convertTransformWorldToObjectMatrix = function () {\r\n const convertTransform = Mat4Utils.create();\r\n const position = Vec3Utils.create();\r\n const scale = Vec3Utils.create();\r\n const inverseScale = Vec3Utils.create();\r\n const one = Vec3Utils.create(1);\r\n\r\n function convertTransformWorldToObjectMatrix(object: Readonly, transform: Readonly): T;\r\n function convertTransformWorldToObjectMatrix(object: Readonly, transform: Readonly, outTransform: T): T;\r\n function convertTransformWorldToObjectMatrix(object: Readonly, transform: Readonly, outTransform: T | U = Mat4Utils.clone(transform)): T | U {\r\n ObjectUtils.getTransformWorldMatrix(object, convertTransform);\r\n if (ObjectUtils.hasUniformScaleWorld(object)) {\r\n Mat4Utils.invert(convertTransform, convertTransform);\r\n Mat4Utils.mul(convertTransform, transform, outTransform);\r\n } else {\r\n Vec3Utils.set(position, transform[12], transform[13], transform[14]);\r\n ObjectUtils.convertPositionWorldToObject(object, position, position);\r\n\r\n Mat4Utils.getScale(convertTransform, scale);\r\n Vec3Utils.div(one, scale, inverseScale);\r\n Mat4Utils.scale(convertTransform, inverseScale, convertTransform);\r\n\r\n Mat4Utils.invert(convertTransform, convertTransform);\r\n Mat4Utils.mul(convertTransform, transform, outTransform);\r\n Mat4Utils.scale(outTransform, inverseScale, outTransform);\r\n\r\n outTransform[12] = position[0];\r\n outTransform[13] = position[1];\r\n outTransform[14] = position[2];\r\n outTransform[15] = 1;\r\n }\r\n return outTransform;\r\n }\r\n\r\n return convertTransformWorldToObjectMatrix;\r\n}();\r\n\r\nexport const convertTransformWorldToObjectQuat = function () {\r\n const position = Vec3Utils.create();\r\n const rotation = QuatUtils.create();\r\n\r\n function convertTransformWorldToObjectQuat(object: Readonly, transform: Readonly): T;\r\n function convertTransformWorldToObjectQuat(object: Readonly, transform: Readonly, outTransform: T): T;\r\n function convertTransformWorldToObjectQuat(object: Readonly, transform: Readonly, outTransform: T | U = Quat2Utils.clone(transform)): T | U {\r\n ObjectUtils.getRotationWorldQuat(object, rotation);\r\n QuatUtils.conjugate(rotation, rotation);\r\n QuatUtils.mul(rotation, transform, rotation);\r\n Quat2Utils.getPosition(transform, position);\r\n ObjectUtils.convertPositionWorldToObject(object, position, position);\r\n Quat2Utils.setPositionRotationQuat(outTransform, position, rotation);\r\n return outTransform;\r\n }\r\n\r\n return convertTransformWorldToObjectQuat;\r\n}();\r\n\r\n// Convert Transform Local World\r\n\r\n\r\nexport function convertTransformLocalToWorld(object: Readonly, transform: Readonly): T;\r\nexport function convertTransformLocalToWorld(object: Readonly, transform: Readonly, outTransform: T): T;\r\nexport function convertTransformLocalToWorld(object: Readonly, transform: Readonly, outTransform?: T | U): T | U {\r\n return ObjectUtils.convertTransformLocalToWorldMatrix(object, transform, outTransform!);\r\n}\r\n\r\n\r\nexport function convertTransformLocalToWorldMatrix(object: Readonly, transform: Readonly): T;\r\nexport function convertTransformLocalToWorldMatrix(object: Readonly, transform: Readonly, outTransform: T): T;\r\nexport function convertTransformLocalToWorldMatrix(object: Readonly, transform: Readonly, outTransform: T | U = Mat4Utils.clone(transform)): T | U {\r\n if (ObjectUtils.getParent(object) != null) {\r\n ObjectUtils.convertTransformObjectToWorldMatrix(ObjectUtils.getParent(object)!, transform, outTransform!);\r\n } else {\r\n Mat4Utils.copy(transform, outTransform);\r\n }\r\n return outTransform!;\r\n}\r\n\r\nexport function convertTransformLocalToWorldQuat(object: Readonly, transform: Readonly): T;\r\nexport function convertTransformLocalToWorldQuat(object: Readonly, transform: Readonly, outTransform: T): T;\r\nexport function convertTransformLocalToWorldQuat(object: Readonly, transform: Readonly, outTransform: T | U = Quat2Utils.clone(transform)): T | U {\r\n if (ObjectUtils.getParent(object) != null) {\r\n ObjectUtils.convertTransformObjectToWorldQuat(ObjectUtils.getParent(object)!, transform, outTransform);\r\n } else {\r\n Quat2Utils.copy(transform, outTransform);\r\n }\r\n return outTransform;\r\n}\r\n\r\nexport function convertTransformWorldToLocal(object: Readonly, transform: Readonly): T;\r\nexport function convertTransformWorldToLocal(object: Readonly, transform: Readonly, outTransform: T): T;\r\nexport function convertTransformWorldToLocal(object: Readonly, transform: Readonly, outTransform?: T | U): T | U {\r\n return ObjectUtils.convertTransformWorldToLocalMatrix(object, transform, outTransform!);\r\n}\r\n\r\nexport function convertTransformWorldToLocalMatrix(object: Readonly, transform: Readonly): T;\r\nexport function convertTransformWorldToLocalMatrix(object: Readonly, transform: Readonly, outTransform: T): T;\r\nexport function convertTransformWorldToLocalMatrix(object: Readonly, transform: Readonly, outTransform: T | U = Mat4Utils.clone(transform)): T | U {\r\n if (ObjectUtils.getParent(object) != null) {\r\n ObjectUtils.convertTransformWorldToObjectMatrix(ObjectUtils.getParent(object)!, transform, outTransform!);\r\n } else {\r\n Mat4Utils.copy(transform, outTransform);\r\n }\r\n return outTransform!;\r\n}\r\n\r\nexport function convertTransformWorldToLocalQuat(object: Readonly, transform: Readonly): T;\r\nexport function convertTransformWorldToLocalQuat(object: Readonly, transform: Readonly, outTransform: T): T;\r\nexport function convertTransformWorldToLocalQuat(object: Readonly, transform: Readonly, outTransform: T | U = Quat2Utils.clone(transform)): T | U {\r\n if (ObjectUtils.getParent(object) != null) {\r\n ObjectUtils.convertTransformWorldToObjectQuat(ObjectUtils.getParent(object)!, transform, outTransform);\r\n } else {\r\n Quat2Utils.copy(transform, outTransform);\r\n }\r\n return outTransform;\r\n}\r\n\r\n// Convert Transform Object Local\r\n\r\n// I need to use the conversion to world and then local to also use the parent scale that changes the position in local space\r\n\r\n\r\nexport function convertTransformObjectToLocal(object: Readonly, transform: Readonly): T;\r\nexport function convertTransformObjectToLocal(object: Readonly, transform: Readonly, outTransform: T): T;\r\nexport function convertTransformObjectToLocal(object: Readonly, transform: Readonly, outTransform?: T | U): T | U {\r\n return ObjectUtils.convertTransformObjectToLocalMatrix(object, transform, outTransform!);\r\n}\r\n\r\nexport function convertTransformObjectToLocalMatrix(object: Readonly, transform: Readonly): T;\r\nexport function convertTransformObjectToLocalMatrix(object: Readonly, transform: Readonly, outTransform: T): T;\r\nexport function convertTransformObjectToLocalMatrix(object: Readonly, transform: Readonly, outTransform?: T | U): T | U {\r\n outTransform = ObjectUtils.convertTransformObjectToWorldMatrix(object, transform, outTransform!);\r\n ObjectUtils.convertTransformWorldToLocalMatrix(object, outTransform, outTransform);\r\n return outTransform!;\r\n}\r\n\r\nexport function convertTransformObjectToLocalQuat(object: Readonly, transform: Readonly): T;\r\nexport function convertTransformObjectToLocalQuat(object: Readonly, transform: Readonly, outTransform: T): T;\r\nexport function convertTransformObjectToLocalQuat(object: Readonly, transform: Readonly, outTransform?: T | U): T | U {\r\n outTransform = ObjectUtils.convertTransformObjectToWorldQuat(object, transform, outTransform!);\r\n ObjectUtils.convertTransformWorldToLocalQuat(object, outTransform, outTransform);\r\n return outTransform;\r\n}\r\n\r\nexport function convertTransformLocalToObject(object: Readonly, transform: Readonly): T;\r\nexport function convertTransformLocalToObject(object: Readonly, transform: Readonly, outTransform: T): T;\r\nexport function convertTransformLocalToObject(object: Readonly, transform: Readonly, outTransform?: T | U): T | U {\r\n return ObjectUtils.convertTransformLocalToObjectMatrix(object, transform, outTransform!);\r\n}\r\n\r\nexport function convertTransformLocalToObjectMatrix(object: Readonly, transform: Readonly): T;\r\nexport function convertTransformLocalToObjectMatrix(object: Readonly, transform: Readonly, outTransform: T): T;\r\nexport function convertTransformLocalToObjectMatrix(object: Readonly, transform: Readonly, outTransform?: T | U): T | U {\r\n outTransform = ObjectUtils.convertTransformLocalToWorldMatrix(object, transform, outTransform!);\r\n ObjectUtils.convertTransformWorldToObjectMatrix(object, outTransform, outTransform);\r\n return outTransform!;\r\n}\r\n\r\nexport function convertTransformLocalToObjectQuat(object: Readonly, transform: Readonly): T;\r\nexport function convertTransformLocalToObjectQuat(object: Readonly, transform: Readonly, outTransform: T): T;\r\nexport function convertTransformLocalToObjectQuat(object: Readonly, transform: Readonly, outTransform?: T | U): T | U {\r\n outTransform = ObjectUtils.convertTransformLocalToWorldQuat(object, transform, outTransform!);\r\n ObjectUtils.convertTransformWorldToObjectQuat(object, outTransform, outTransform);\r\n return outTransform;\r\n}\r\n\r\n// Parent\r\n\r\nexport const setParent = function () {\r\n const position = Vec3Utils.create();\r\n const rotation = QuatUtils.create();\r\n const scale = Vec3Utils.create();\r\n return function setParent(object: Object3D, newParent: Object3D, keepTransformWorld: boolean = true): Object3D {\r\n if (!keepTransformWorld) {\r\n object.parent = newParent;\r\n } else {\r\n ObjectUtils.getPositionWorld(object, position);\r\n ObjectUtils.getRotationWorldQuat(object, rotation);\r\n ObjectUtils.getScaleWorld(object, scale);\r\n object.parent = newParent;\r\n ObjectUtils.setScaleWorld(object, scale);\r\n ObjectUtils.setRotationWorldQuat(object, rotation);\r\n ObjectUtils.setPositionWorld(object, position);\r\n }\r\n\r\n return object;\r\n };\r\n}();\r\n\r\nexport function getParent(object: Readonly): Object3D | null {\r\n return object.parent;\r\n}\r\n\r\n// Component\r\n\r\nexport function addComponent(object: Object3D, classOrType: ComponentConstructor | string, paramsOrActive?: Record | boolean, active?: boolean): T | null {\r\n let params: Record | undefined = undefined;\r\n\r\n if (typeof paramsOrActive == \"boolean\") {\r\n params = {};\r\n params[\"active\"] = paramsOrActive;\r\n } else {\r\n if (paramsOrActive != null) {\r\n params = paramsOrActive;\r\n }\r\n\r\n if (active != null) {\r\n if (params == null) {\r\n params = {};\r\n }\r\n\r\n params[\"active\"] = active;\r\n }\r\n }\r\n\r\n return object.addComponent(classOrType as ComponentConstructor, params);\r\n}\r\n\r\nexport function getComponent(object: Readonly, classOrType: ComponentConstructor | string, index: number = 0): T | null {\r\n return ObjectUtils.getComponentHierarchy(object, classOrType, index);\r\n}\r\n\r\nexport function getComponentSelf(object: Readonly, classOrType: ComponentConstructor | string, index: number = 0): T | null {\r\n return object.getComponent(classOrType as ComponentConstructor, index);\r\n}\r\n\r\nexport function getComponentHierarchy(object: Readonly, classOrType: ComponentConstructor | string, index: number = 0): T | null {\r\n return ObjectUtils.getComponentHierarchyBreadth(object, classOrType, index);\r\n}\r\n\r\nexport function getComponentHierarchyBreadth(object: Readonly, classOrType: ComponentConstructor | string, index: number = 0): T | null {\r\n const objects = ObjectUtils.getHierarchyBreadth(object);\r\n return ObjectUtils.getComponentObjects(objects, classOrType, index);\r\n}\r\n\r\nexport function getComponentHierarchyDepth(object: Readonly, classOrType: ComponentConstructor | string, index: number = 0): T | null {\r\n const objects = ObjectUtils.getHierarchyDepth(object);\r\n return ObjectUtils.getComponentObjects(objects, classOrType, index);\r\n}\r\n\r\nexport function getComponentDescendants(object: Readonly, classOrType: ComponentConstructor | string, index: number = 0): T | null {\r\n return ObjectUtils.getComponentDescendantsBreadth(object, classOrType, index);\r\n}\r\n\r\nexport function getComponentDescendantsBreadth(object: Readonly, classOrType: ComponentConstructor | string, index: number = 0): T | null {\r\n const objects = ObjectUtils.getDescendantsBreadth(object);\r\n return ObjectUtils.getComponentObjects(objects, classOrType, index);\r\n}\r\n\r\nexport function getComponentDescendantsDepth(object: Readonly, classOrType: ComponentConstructor | string, index: number = 0): T | null {\r\n const objects = ObjectUtils.getDescendantsDepth(object);\r\n return ObjectUtils.getComponentObjects(objects, classOrType, index);\r\n}\r\n\r\nexport function getComponentChildren(object: Readonly, classOrType: ComponentConstructor | string, index: number = 0): T | null {\r\n const objects = ObjectUtils.getChildren(object);\r\n return ObjectUtils.getComponentObjects(objects, classOrType, index);\r\n}\r\n\r\nexport function getComponents(object: Readonly, classOrType?: ComponentConstructor | string): T[] {\r\n return ObjectUtils.getComponentsHierarchy(object, classOrType);\r\n}\r\n\r\nexport function getComponentsSelf(object: Readonly, classOrType?: ComponentConstructor | string): T[] {\r\n return object.getComponents(classOrType as ComponentConstructor);\r\n}\r\n\r\nexport function getComponentsHierarchy(object: Readonly, classOrType?: ComponentConstructor | string): T[] {\r\n return ObjectUtils.getComponentsHierarchyBreadth(object, classOrType);\r\n}\r\n\r\nexport function getComponentsHierarchyBreadth(object: Readonly, classOrType?: ComponentConstructor | string): T[] {\r\n const objects = ObjectUtils.getHierarchyBreadth(object);\r\n return ObjectUtils.getComponentsObjects(objects, classOrType);\r\n}\r\n\r\nexport function getComponentsHierarchyDepth(object: Readonly, classOrType?: ComponentConstructor | string): T[] {\r\n const objects = ObjectUtils.getHierarchyDepth(object);\r\n return ObjectUtils.getComponentsObjects(objects, classOrType);\r\n}\r\n\r\nexport function getComponentsDescendants(object: Readonly, classOrType?: ComponentConstructor | string): T[] {\r\n return ObjectUtils.getComponentsDescendantsBreadth(object, classOrType);\r\n}\r\n\r\nexport function getComponentsDescendantsBreadth(object: Readonly, classOrType?: ComponentConstructor | string): T[] {\r\n const objects = ObjectUtils.getDescendantsBreadth(object);\r\n return ObjectUtils.getComponentsObjects(objects, classOrType);\r\n}\r\n\r\nexport function getComponentsDescendantsDepth(object: Readonly, classOrType?: ComponentConstructor | string): T[] {\r\n const objects = ObjectUtils.getDescendantsDepth(object);\r\n return ObjectUtils.getComponentsObjects(objects, classOrType);\r\n}\r\n\r\nexport function getComponentsChildren(object: Readonly, classOrType?: ComponentConstructor | string): T[] {\r\n const objects = ObjectUtils.getChildren(object);\r\n return ObjectUtils.getComponentsObjects(objects, classOrType);\r\n}\r\n\r\n// Active\r\n\r\nexport function setActive(object: Object3D, active: boolean): Object3D {\r\n return ObjectUtils.setActiveHierarchy(object, active);\r\n}\r\n\r\nexport function setActiveSelf(object: Object3D, active: boolean): Object3D {\r\n object.active = active;\r\n return object;\r\n}\r\n\r\nexport function setActiveHierarchy(object: Object3D, active: boolean): Object3D {\r\n return ObjectUtils.setActiveHierarchyBreadth(object, active);\r\n}\r\n\r\nexport function setActiveHierarchyBreadth(object: Object3D, active: boolean): Object3D {\r\n const objects = ObjectUtils.getHierarchyBreadth(object);\r\n ObjectUtils.setActiveObjects(objects, active);\r\n\r\n return object;\r\n}\r\n\r\nexport function setActiveHierarchyDepth(object: Object3D, active: boolean): Object3D {\r\n const objects = ObjectUtils.getHierarchyDepth(object);\r\n ObjectUtils.setActiveObjects(objects, active);\r\n\r\n return object;\r\n}\r\n\r\nexport function setActiveDescendants(object: Object3D, active: boolean): Object3D {\r\n return ObjectUtils.setActiveDescendantsBreadth(object, active);\r\n}\r\n\r\nexport function setActiveDescendantsBreadth(object: Object3D, active: boolean): Object3D {\r\n const objects = ObjectUtils.getDescendantsBreadth(object);\r\n ObjectUtils.setActiveObjects(objects, active);\r\n\r\n return object;\r\n}\r\n\r\nexport function setActiveDescendantsDepth(object: Object3D, active: boolean): Object3D {\r\n const objects = ObjectUtils.getDescendantsDepth(object);\r\n ObjectUtils.setActiveObjects(objects, active);\r\n\r\n return object;\r\n}\r\n\r\nexport function setActiveChildren(object: Object3D, active: boolean): Object3D {\r\n const objects = ObjectUtils.getChildren(object);\r\n ObjectUtils.setActiveObjects(objects, active);\r\n\r\n return object;\r\n}\r\n\r\n// Uniform Scale\r\n\r\nexport function hasUniformScale(object: Readonly): boolean {\r\n return ObjectUtils.hasUniformScaleWorld(object);\r\n}\r\n\r\nexport const hasUniformScaleWorld = function () {\r\n const scale = Vec3Utils.create();\r\n return function hasUniformScaleWorld(object: Readonly): boolean {\r\n ObjectUtils.getScaleWorld(object, scale);\r\n return Math.abs(scale[0] - scale[1]) < MathUtils.EPSILON && Math.abs(scale[1] - scale[2]) < MathUtils.EPSILON && Math.abs(scale[0] - scale[2]) < MathUtils.EPSILON;\r\n };\r\n}();\r\n\r\nexport const hasUniformScaleLocal = function () {\r\n const scale = Vec3Utils.create();\r\n return function hasUniformScaleLocal(object: Readonly): boolean {\r\n ObjectUtils.getScaleLocal(object, scale);\r\n return Math.abs(scale[0] - scale[1]) < MathUtils.EPSILON && Math.abs(scale[1] - scale[2]) < MathUtils.EPSILON && Math.abs(scale[0] - scale[2]) < MathUtils.EPSILON;\r\n };\r\n}();\r\n\r\n// Clone\r\n\r\nexport const clone = function () {\r\n const scale = Vec3Utils.create();\r\n const transformQuat = Quat2Utils.create();\r\n return function clone(object: Readonly, cloneParams: Readonly = new ObjectCloneParams()): Object3D | null {\r\n let clonedObject = null;\r\n\r\n const cloneParent = cloneParams.myCloneParent === undefined ? ObjectUtils.getParent(object) : cloneParams.myCloneParent;\r\n\r\n if (cloneParams.myUseDefaultObjectClone) {\r\n clonedObject = object.clone(cloneParent);\r\n\r\n if (cloneParams.myDefaultComponentCloneAutoStartIfNotActive) {\r\n const clonedComponents = ObjectUtils.getComponents(clonedObject);\r\n for (const clonedComponent of clonedComponents) {\r\n\r\n // Trigger start, which otherwise would be called later, on first activation\r\n if (cloneParams.myDefaultComponentCloneAutoStartIfNotActive && !clonedComponent.active) {\r\n clonedComponent.active = true;\r\n clonedComponent.active = false;\r\n }\r\n }\r\n }\r\n } else if (ObjectUtils.isCloneable(object, cloneParams)) {\r\n const objectsToCloneData: [Object3D | null, Readonly][] = [];\r\n objectsToCloneData.push([cloneParent, object]);\r\n\r\n // Create the object hierarchy\r\n const objectsToCloneComponentsData: [Readonly, Object3D][] = [];\r\n while (objectsToCloneData.length > 0) {\r\n const cloneData = objectsToCloneData.shift();\r\n const parent = cloneData![0];\r\n const objectToClone = cloneData![1];\r\n\r\n const currentClonedObject = (parent != null) ? ObjectUtils.addChild(parent) : ObjectUtils.addChild(Globals.getRootObject(ObjectUtils.getEngine(object))!);\r\n ObjectUtils.setName(currentClonedObject, ObjectUtils.getName(objectToClone));\r\n\r\n ObjectUtils.setScaleLocal(currentClonedObject, ObjectUtils.getScaleLocal(objectToClone, scale));\r\n ObjectUtils.setTransformLocalQuat(currentClonedObject, ObjectUtils.getTransformLocalQuat(objectToClone, transformQuat));\r\n\r\n if (!cloneParams.myIgnoreComponents) {\r\n objectsToCloneComponentsData.push([objectToClone, currentClonedObject]);\r\n }\r\n\r\n if (!cloneParams.myIgnoreDescendants) {\r\n for (const child of ObjectUtils.getChildren(objectToClone)) {\r\n let cloneDescendant = false;\r\n if (cloneParams.myDescendantsToInclude.length > 0) {\r\n cloneDescendant = cloneParams.myDescendantsToInclude.find(descendantToInclude => descendantToInclude == child) != null;\r\n } else {\r\n cloneDescendant = cloneParams.myDescendantsToIgnore.find(descendantToIgnore => descendantToIgnore == child) == null;\r\n }\r\n\r\n if (cloneDescendant && cloneParams.myIgnoreDescendantCallback != null) {\r\n cloneDescendant = !cloneParams.myIgnoreDescendantCallback(child);\r\n }\r\n\r\n if (cloneDescendant) {\r\n objectsToCloneData.push([currentClonedObject, child]);\r\n }\r\n }\r\n }\r\n\r\n if (clonedObject == null) {\r\n clonedObject = currentClonedObject;\r\n }\r\n }\r\n\r\n // Get the components to clone\r\n const componentsToCloneData: [Component, Object3D][] = [];\r\n while (objectsToCloneComponentsData.length > 0) {\r\n const cloneData = objectsToCloneComponentsData.shift();\r\n const objectToClone = cloneData![0];\r\n const currentClonedObject = cloneData![1];\r\n\r\n const components = ObjectUtils.getComponentsSelf(objectToClone);\r\n for (const component of components) {\r\n if (ComponentUtils.isCloneable(component.type, cloneParams.myUseDefaultComponentClone || cloneParams.myUseDefaultComponentCloneAsFallback, ObjectUtils.getEngine(object))) {\r\n let cloneComponent = false;\r\n if (cloneParams.myComponentsToInclude.length > 0) {\r\n cloneComponent = cloneParams.myComponentsToInclude.indexOf(component.type) != -1;\r\n } else {\r\n cloneComponent = cloneParams.myComponentsToIgnore.indexOf(component.type) == -1;\r\n }\r\n\r\n if (cloneComponent && cloneParams.myIgnoreComponentCallback != null) {\r\n cloneComponent = !cloneParams.myIgnoreComponentCallback(component);\r\n }\r\n\r\n if (cloneComponent) {\r\n componentsToCloneData.push([component, currentClonedObject]);\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Clone the components\r\n const componentsToPostProcessData: [Component, Component][] = [];\r\n while (componentsToCloneData.length > 0) {\r\n const cloneData = componentsToCloneData.shift();\r\n const componentToClone = cloneData![0];\r\n const currentClonedObject = cloneData![1];\r\n let clonedComponent = null;\r\n\r\n if (!cloneParams.myUseDefaultComponentClone) {\r\n clonedComponent = ComponentUtils.clone(componentToClone, currentClonedObject, cloneParams.myComponentDeepCloneParams, cloneParams.myComponentCustomCloneParams, cloneParams.myUseDefaultComponentCloneAsFallback, cloneParams.myDefaultComponentCloneAutoStartIfNotActive);\r\n } else {\r\n clonedComponent = ComponentUtils.cloneDefault(componentToClone, currentClonedObject, cloneParams.myDefaultComponentCloneAutoStartIfNotActive);\r\n }\r\n\r\n if (clonedComponent != null) {\r\n if (ComponentUtils.hasClonePostProcess(componentToClone.type, ObjectUtils.getEngine(object))) {\r\n componentsToPostProcessData.push([componentToClone, clonedComponent]);\r\n }\r\n }\r\n }\r\n\r\n // Clone post process\r\n // Can be useful if you have to get some data from other components in the hierarchy which have now been created\r\n while (componentsToPostProcessData.length > 0) {\r\n const cloneData = componentsToPostProcessData.shift();\r\n const componentToClone = cloneData![0];\r\n const currentClonedComponent = cloneData![1];\r\n\r\n ComponentUtils.clonePostProcess(componentToClone, currentClonedComponent, cloneParams.myComponentDeepCloneParams, cloneParams.myComponentCustomCloneParams);\r\n }\r\n } else if (cloneParams.myUseDefaultObjectCloneAsFallback) {\r\n clonedObject = object.clone(cloneParent);\r\n\r\n if (cloneParams.myDefaultComponentCloneAutoStartIfNotActive) {\r\n const clonedComponents = ObjectUtils.getComponents(clonedObject);\r\n for (const clonedComponent of clonedComponents) {\r\n // Trigger start, which otherwise would be called later, on first activation\r\n if (cloneParams.myDefaultComponentCloneAutoStartIfNotActive && !clonedComponent.active) {\r\n clonedComponent.active = true;\r\n clonedComponent.active = false;\r\n }\r\n }\r\n }\r\n }\r\n\r\n return clonedObject;\r\n };\r\n}();\r\n\r\nexport function isCloneable(object: Readonly, cloneParams: Readonly = new ObjectCloneParams()): boolean {\r\n if (cloneParams.myIgnoreNonCloneable || cloneParams.myIgnoreComponents || cloneParams.myUseDefaultComponentClone || cloneParams.myUseDefaultComponentCloneAsFallback) {\r\n return true;\r\n }\r\n\r\n let cloneable = true;\r\n\r\n const objectsToClone: Readonly[] = [];\r\n objectsToClone.push(object);\r\n\r\n while (cloneable && objectsToClone.length > 0) {\r\n const objectToClone = objectsToClone.shift()!;\r\n\r\n const components = ObjectUtils.getComponentsSelf(objectToClone);\r\n for (const component of components) {\r\n let cloneComponent = false;\r\n if (cloneParams.myComponentsToInclude.length > 0) {\r\n cloneComponent = cloneParams.myComponentsToInclude.indexOf(component.type) != -1;\r\n } else {\r\n cloneComponent = cloneParams.myComponentsToIgnore.indexOf(component.type) == -1;\r\n }\r\n\r\n if (cloneComponent && cloneParams.myIgnoreComponentCallback != null) {\r\n cloneComponent = !cloneParams.myIgnoreComponentCallback(component);\r\n }\r\n\r\n if (cloneComponent && !ComponentUtils.isCloneable(component.type, false, ObjectUtils.getEngine(object))) {\r\n cloneable = false;\r\n break;\r\n }\r\n }\r\n\r\n if (cloneable && !cloneParams.myIgnoreDescendants) {\r\n for (const child of ObjectUtils.getChildren(objectToClone)) {\r\n let cloneDescendant = false;\r\n if (cloneParams.myDescendantsToInclude.length > 0) {\r\n cloneDescendant = cloneParams.myDescendantsToInclude.find(descendantToInclude => descendantToInclude == child) != null;\r\n } else {\r\n cloneDescendant = cloneParams.myDescendantsToIgnore.find(descendantToIgnore => descendantToIgnore == child) == null;\r\n }\r\n\r\n if (cloneDescendant && cloneParams.myIgnoreDescendantCallback != null) {\r\n cloneDescendant = !cloneParams.myIgnoreDescendantCallback(child);\r\n }\r\n\r\n if (cloneDescendant) {\r\n objectsToClone.push(child);\r\n }\r\n }\r\n }\r\n }\r\n\r\n return cloneable;\r\n}\r\n\r\n// To String\r\n\r\nexport function toString(object: Readonly): string {\r\n return ObjectUtils.toStringCompact(object);\r\n}\r\n\r\nexport const toStringExtended = function () {\r\n const tab = \" \";\r\n const newLine = \"\\n\";\r\n const startObject = \"{\";\r\n const endObject = \"}\";\r\n const nameLabel = \"name: \";\r\n const idLabel = \"id: \";\r\n const componentsLabel = \"components: \";\r\n const typeLabel = \"type: \";\r\n const childrenLabel = \"children: \";\r\n const startComponents = \"[\";\r\n const endComponents = \"]\";\r\n const startChildren = startComponents;\r\n const endChildren = endComponents;\r\n const separator = \",\";\r\n const newLineTab = newLine.concat(tab, tab);\r\n return function toStringExtended(object: Readonly): string {\r\n let objectString = \"\";\r\n objectString = objectString.concat(startObject, newLine);\r\n\r\n const components = ObjectUtils.getComponentsSelf(object);\r\n const children = ObjectUtils.getChildren(object);\r\n const name = ObjectUtils.getName(object);\r\n\r\n if (components.length > 0 || children.length > 0 || name.length > 0) {\r\n objectString = objectString.concat(tab, idLabel, ObjectUtils.getID(object).toString(), separator, newLine);\r\n } else {\r\n objectString = objectString.concat(tab, idLabel, ObjectUtils.getID(object).toString(), newLine);\r\n }\r\n\r\n if (name.length > 0) {\r\n if (components.length > 0 || children.length > 0) {\r\n objectString = objectString.concat(tab, nameLabel, ObjectUtils.getName(object), separator, newLine);\r\n } else {\r\n objectString = objectString.concat(tab, nameLabel, ObjectUtils.getName(object), newLine);\r\n }\r\n }\r\n\r\n if (components.length > 0) {\r\n objectString = objectString.concat(tab, componentsLabel, newLine, tab, startComponents, newLine);\r\n for (let i = 0; i < components.length; i++) {\r\n const component = components[i];\r\n\r\n objectString = objectString.concat(tab, tab, startObject, newLine);\r\n objectString = objectString.concat(tab, tab, tab, typeLabel, component.type, separator, newLine);\r\n objectString = objectString.concat(tab, tab, tab, idLabel, component._id.toString(), separator, newLine);\r\n objectString = objectString.concat(tab, tab, endObject);\r\n\r\n if (i != components.length - 1) {\r\n objectString = objectString.concat(separator, newLine);\r\n } else {\r\n objectString = objectString.concat(newLine);\r\n }\r\n }\r\n\r\n if (children.length > 0) {\r\n objectString = objectString.concat(tab, endComponents, separator, newLine);\r\n } else {\r\n objectString = objectString.concat(tab, endComponents, newLine);\r\n }\r\n }\r\n\r\n if (children.length > 0) {\r\n objectString = objectString.concat(tab, childrenLabel, newLine, tab, startChildren, newLine);\r\n for (let i = 0; i < children.length; i++) {\r\n const child = children[i];\r\n\r\n let childString = ObjectUtils.toStringExtended(child);\r\n childString = childString.replaceAll(newLine, newLineTab);\r\n childString = tab.concat(tab, childString);\r\n objectString = objectString.concat(childString);\r\n\r\n if (i != children.length - 1) {\r\n objectString = objectString.concat(separator, newLine);\r\n } else {\r\n objectString = objectString.concat(newLine);\r\n }\r\n }\r\n objectString = objectString.concat(tab, endChildren, newLine);\r\n }\r\n\r\n objectString = objectString.concat(endObject);\r\n\r\n return objectString;\r\n };\r\n}();\r\n\r\nexport const toStringCompact = function () {\r\n const tab = \" \";\r\n const newLine = \"\\n\";\r\n const emptyName = \"\";\r\n const nameLabel = \"name: \";\r\n const componentsLabel = \"components: \";\r\n const separator = \", \";\r\n const newLineTab = newLine.concat(tab);\r\n return function toStringCompact(object: Readonly): string {\r\n let objectString = \"\";\r\n\r\n const name = ObjectUtils.getName(object);\r\n if (name.length > 0) {\r\n objectString = objectString.concat(nameLabel, name);\r\n } else {\r\n objectString = objectString.concat(nameLabel, emptyName);\r\n }\r\n\r\n const components = ObjectUtils.getComponentsSelf(object);\r\n if (components.length > 0) {\r\n objectString = objectString.concat(separator, componentsLabel);\r\n for (let i = 0; i < components.length; i++) {\r\n const component = components[i];\r\n\r\n objectString = objectString.concat(component.type);\r\n\r\n if (i != components.length - 1) {\r\n objectString = objectString.concat(separator);\r\n }\r\n }\r\n }\r\n\r\n const children = ObjectUtils.getChildren(object);\r\n if (children.length > 0) {\r\n objectString = objectString.concat(newLine);\r\n for (let i = 0; i < children.length; i++) {\r\n const child = children[i];\r\n\r\n let childString = ObjectUtils.toStringCompact(child);\r\n childString = childString.replaceAll(newLine, newLineTab);\r\n childString = tab.concat(childString);\r\n objectString = objectString.concat(childString);\r\n\r\n if (i != children.length - 1) {\r\n objectString = objectString.concat(newLine);\r\n }\r\n }\r\n }\r\n\r\n return objectString;\r\n };\r\n}();\r\n\r\nexport function log(object: Readonly): Object3D {\r\n return ObjectUtils.logCompact(object);\r\n}\r\n\r\nexport function logExtended(object: Readonly): Object3D {\r\n console.log(ObjectUtils.toStringExtended(object));\r\n return object as Object3D;\r\n}\r\n\r\nexport function logCompact(object: Readonly): Object3D {\r\n console.log(ObjectUtils.toStringCompact(object));\r\n return object as Object3D;\r\n}\r\n\r\nexport function warn(object: Readonly): Object3D {\r\n return ObjectUtils.warnCompact(object);\r\n}\r\n\r\nexport function warnExtended(object: Readonly): Object3D {\r\n console.warn(ObjectUtils.toStringExtended(object));\r\n return object as Object3D;\r\n}\r\n\r\nexport function warnCompact(object: Readonly): Object3D {\r\n console.warn(ObjectUtils.toStringCompact(object));\r\n return object as Object3D;\r\n}\r\n\r\nexport function error(object: Readonly): Object3D {\r\n return ObjectUtils.errorCompact(object);\r\n}\r\n\r\nexport function errorExtended(object: Readonly): Object3D {\r\n console.error(ObjectUtils.toStringExtended(object));\r\n return object as Object3D;\r\n}\r\n\r\nexport function errorCompact(object: Readonly): Object3D {\r\n console.error(ObjectUtils.toStringCompact(object));\r\n return object as Object3D;\r\n}\r\n\r\n// Get Object By Name\r\n\r\nexport function getObjectByName(object: Readonly, name: string, isRegex: boolean = false, index: number = 0): Object3D | null {\r\n return ObjectUtils.getObjectByNameHierarchy(object, name, isRegex, index);\r\n}\r\n\r\nexport function getObjectByNameHierarchy(object: Readonly, name: string, isRegex: boolean = false, index: number = 0): Object3D | null {\r\n return ObjectUtils.getObjectByNameHierarchyBreadth(object, name, isRegex, index);\r\n}\r\n\r\nexport function getObjectByNameHierarchyBreadth(object: Readonly, name: string, isRegex: boolean = false, index: number = 0): Object3D | null {\r\n const objects = ObjectUtils.getHierarchyBreadth(object);\r\n return ObjectUtils.getObjectByNameObjects(objects, name, isRegex, index);\r\n}\r\n\r\nexport function getObjectByNameHierarchyDepth(object: Readonly, name: string, isRegex: boolean = false, index: number = 0): Object3D | null {\r\n const objects = ObjectUtils.getHierarchyDepth(object);\r\n return ObjectUtils.getObjectByNameObjects(objects, name, isRegex, index);\r\n}\r\n\r\nexport function getObjectByNameDescendants(object: Readonly, name: string, isRegex: boolean = false, index: number = 0): Object3D | null {\r\n return ObjectUtils.getObjectByNameDescendantsBreadth(object, name, isRegex, index);\r\n}\r\n\r\nexport function getObjectByNameDescendantsBreadth(object: Readonly, name: string, isRegex: boolean = false, index: number = 0): Object3D | null {\r\n const objects = ObjectUtils.getDescendantsBreadth(object);\r\n return ObjectUtils.getObjectByNameObjects(objects, name, isRegex, index);\r\n}\r\n\r\nexport function getObjectByNameDescendantsDepth(object: Readonly, name: string, isRegex: boolean = false, index: number = 0): Object3D | null {\r\n const objects = ObjectUtils.getDescendantsDepth(object);\r\n return ObjectUtils.getObjectByNameObjects(objects, name, isRegex, index);\r\n}\r\n\r\nexport function getObjectByNameChildren(object: Readonly, name: string, isRegex: boolean = false, index: number = 0): Object3D | null {\r\n const objects = ObjectUtils.getChildren(object);\r\n return ObjectUtils.getObjectByNameObjects(objects, name, isRegex, index);\r\n}\r\n\r\nexport function getObjectsByName(object: Readonly, name: string, isRegex: boolean = false): Object3D[] {\r\n return ObjectUtils.getObjectsByNameHierarchy(object, name, isRegex);\r\n}\r\n\r\nexport function getObjectsByNameHierarchy(object: Readonly, name: string, isRegex: boolean = false): Object3D[] {\r\n return ObjectUtils.getObjectsByNameHierarchyBreadth(object, name, isRegex);\r\n}\r\n\r\nexport function getObjectsByNameHierarchyBreadth(object: Readonly, name: string, isRegex: boolean = false): Object3D[] {\r\n const objects = ObjectUtils.getHierarchyBreadth(object);\r\n return ObjectUtils.getObjectsByNameObjects(objects, name, isRegex);\r\n}\r\n\r\nexport function getObjectsByNameHierarchyDepth(object: Readonly, name: string, isRegex: boolean = false): Object3D[] {\r\n const objects = ObjectUtils.getHierarchyDepth(object);\r\n return ObjectUtils.getObjectsByNameObjects(objects, name, isRegex);\r\n}\r\n\r\nexport function getObjectsByNameDescendants(object: Readonly, name: string, isRegex: boolean = false): Object3D[] {\r\n return ObjectUtils.getObjectsByNameDescendantsBreadth(object, name, isRegex);\r\n}\r\n\r\nexport function getObjectsByNameDescendantsBreadth(object: Readonly, name: string, isRegex: boolean = false): Object3D[] {\r\n const objects = ObjectUtils.getDescendantsBreadth(object);\r\n return ObjectUtils.getObjectsByNameObjects(objects, name, isRegex);\r\n}\r\n\r\nexport function getObjectsByNameDescendantsDepth(object: Readonly, name: string, isRegex: boolean = false): Object3D[] {\r\n const objects = ObjectUtils.getDescendantsDepth(object);\r\n return ObjectUtils.getObjectsByNameObjects(objects, name, isRegex);\r\n}\r\n\r\nexport function getObjectsByNameChildren(object: Readonly, name: string, isRegex: boolean = false): Object3D[] {\r\n const objects = ObjectUtils.getChildren(object);\r\n return ObjectUtils.getObjectsByNameObjects(objects, name, isRegex);\r\n}\r\n\r\n// Get Object By ID\r\n\r\nexport function getObjectByID(object: Readonly, id: number): Object3D | null {\r\n return ObjectUtils.getObjectByIDHierarchy(object, id);\r\n}\r\n\r\nexport function getObjectByIDHierarchy(object: Readonly, id: number): Object3D | null {\r\n return ObjectUtils.getObjectByIDHierarchyBreadth(object, id);\r\n}\r\n\r\nexport function getObjectByIDHierarchyBreadth(object: Readonly, id: number): Object3D | null {\r\n const objects = ObjectUtils.getHierarchyBreadth(object);\r\n return ObjectUtils.getObjectByIDObjects(objects, id);\r\n}\r\n\r\nexport function getObjectByIDHierarchyDepth(object: Readonly, id: number): Object3D | null {\r\n const objects = ObjectUtils.getHierarchyDepth(object);\r\n return ObjectUtils.getObjectByIDObjects(objects, id);\r\n}\r\n\r\nexport function getObjectByIDDescendants(object: Readonly, id: number): Object3D | null {\r\n return ObjectUtils.getObjectByIDDescendantsBreadth(object, id);\r\n}\r\n\r\nexport function getObjectByIDDescendantsBreadth(object: Readonly, id: number): Object3D | null {\r\n const objects = ObjectUtils.getDescendantsBreadth(object);\r\n return ObjectUtils.getObjectByIDObjects(objects, id);\r\n}\r\n\r\nexport function getObjectByIDDescendantsDepth(object: Readonly, id: number): Object3D | null {\r\n const objects = ObjectUtils.getDescendantsDepth(object);\r\n return ObjectUtils.getObjectByIDObjects(objects, id);\r\n}\r\n\r\nexport function getObjectByIDChildren(object: Readonly, id: number): Object3D | null {\r\n const objects = ObjectUtils.getChildren(object);\r\n return ObjectUtils.getObjectByIDObjects(objects, id);\r\n}\r\n\r\n// Get Hierarchy\r\n\r\nexport function getHierarchy(object: Readonly): Object3D[] {\r\n return ObjectUtils.getHierarchyBreadth(object);\r\n}\r\n\r\nexport function getHierarchyBreadth(object: Readonly): Object3D[] {\r\n const hierarchy = ObjectUtils.getDescendantsBreadth(object);\r\n\r\n hierarchy.unshift(object as Object3D);\r\n\r\n return hierarchy;\r\n}\r\n\r\nexport function getHierarchyDepth(object: Readonly): Object3D[] {\r\n const hierarchy = ObjectUtils.getDescendantsDepth(object);\r\n\r\n hierarchy.unshift(object as Object3D);\r\n\r\n return hierarchy;\r\n}\r\n\r\nexport function getDescendants(object: Readonly): Object3D[] {\r\n return ObjectUtils.getDescendantsBreadth(object);\r\n}\r\n\r\nexport function getDescendantsBreadth(object: Readonly): Object3D[] {\r\n const descendants: Object3D[] = [];\r\n\r\n const descendantsQueue = ObjectUtils.getChildren(object);\r\n\r\n while (descendantsQueue.length > 0) {\r\n const descendant = descendantsQueue.shift()!;\r\n descendants.push(descendant);\r\n for (const child of ObjectUtils.getChildren(descendant)) {\r\n descendantsQueue.push(child);\r\n }\r\n }\r\n\r\n return descendants;\r\n}\r\n\r\nexport function getDescendantsDepth(object: Readonly): Object3D[] {\r\n const descendants: Object3D[] = [];\r\n\r\n const children = ObjectUtils.getChildren(object);\r\n\r\n for (const child of children) {\r\n descendants.push(child);\r\n\r\n const childDescendants = ObjectUtils.getDescendantsDepth(child);\r\n for (let i = 0; i < childDescendants.length; i++) {\r\n descendants.push(childDescendants[i]);\r\n }\r\n }\r\n\r\n return descendants;\r\n}\r\n\r\nexport function getChildren(object: Readonly): Object3D[] {\r\n return object.children;\r\n}\r\n\r\nexport function getSelf(object: Readonly): Object3D {\r\n return object as Object3D;\r\n}\r\n\r\n// Cauldron\r\n\r\nexport function addChild(object: Object3D): Object3D {\r\n return object.addChild();\r\n}\r\n\r\nexport function getName(object: Readonly): string {\r\n return object.name;\r\n}\r\n\r\nexport function setName(object: Object3D, name: string): Object3D {\r\n object.name = name;\r\n return object;\r\n}\r\n\r\nexport function getEngine(object: Readonly): WonderlandEngine {\r\n return object.engine;\r\n}\r\n\r\nexport function getID(object: Readonly): number {\r\n return object.objectId;\r\n}\r\n\r\nexport function markDirty(object: Object3D): Object3D {\r\n object.setDirty();\r\n return object;\r\n}\r\n\r\nexport function isTransformChanged(object: Readonly): boolean {\r\n return object.changed;\r\n}\r\n\r\nexport function destroy(object: Object3D): void {\r\n object.destroy();\r\n}\r\n\r\nexport function reserveObjects(object: Readonly, count: number): Object3D {\r\n return ObjectUtils.reserveObjectsHierarchy(object, count);\r\n}\r\n\r\nexport function reserveObjectsSelf(object: Readonly, count: number): Object3D {\r\n const componentsAmountMap = ObjectUtils.getComponentsAmountMapSelf(object);\r\n _reserveObjects(count, componentsAmountMap, Globals.getScene(ObjectUtils.getEngine(object)));\r\n\r\n return object as Object3D;\r\n}\r\n\r\nexport function reserveObjectsHierarchy(object: Readonly, count: number): Object3D {\r\n const componentsAmountMap = ObjectUtils.getComponentsAmountMapHierarchy(object);\r\n _reserveObjects(count, componentsAmountMap, Globals.getScene(ObjectUtils.getEngine(object)));\r\n\r\n return object as Object3D;\r\n}\r\n\r\nexport function reserveObjectsDescendants(object: Readonly, count: number): Object3D {\r\n const componentsAmountMap = ObjectUtils.getComponentsAmountMapDescendants(object);\r\n _reserveObjects(count, componentsAmountMap, Globals.getScene(ObjectUtils.getEngine(object)));\r\n\r\n return object as Object3D;\r\n}\r\n\r\nexport function reserveObjectsChildren(object: Readonly, count: number): Object3D {\r\n const componentsAmountMap = ObjectUtils.getComponentsAmountMapChildren(object);\r\n _reserveObjects(count, componentsAmountMap, Globals.getScene(ObjectUtils.getEngine(object)));\r\n\r\n return object as Object3D;\r\n}\r\n\r\nexport function getComponentsAmountMap(object: Readonly): Map;\r\nexport function getComponentsAmountMap(object: Readonly, outComponentsAmountMap: Map): Map;\r\nexport function getComponentsAmountMap(object: Readonly, outComponentsAmountMap: Map = new Map()): Map {\r\n return ObjectUtils.getComponentsAmountMapHierarchy(object, outComponentsAmountMap);\r\n}\r\n\r\nexport function getComponentsAmountMapSelf(object: Readonly): Map;\r\nexport function getComponentsAmountMapSelf(object: Readonly, outComponentsAmountMap: Map): Map;\r\nexport function getComponentsAmountMapSelf(object: Readonly, outComponentsAmountMap: Map = new Map()): Map {\r\n let objectsAmount = outComponentsAmountMap.get(\"object\");\r\n if (objectsAmount == null) {\r\n objectsAmount = 0;\r\n }\r\n objectsAmount += 1;\r\n outComponentsAmountMap.set(\"object\", objectsAmount);\r\n\r\n const components = ObjectUtils.getComponentsSelf(object);\r\n for (const component of components) {\r\n const type = component.type;\r\n let typeAmount = outComponentsAmountMap.get(type);\r\n if (typeAmount == null) {\r\n typeAmount = 0;\r\n }\r\n typeAmount += 1;\r\n outComponentsAmountMap.set(type, typeAmount);\r\n }\r\n\r\n return outComponentsAmountMap;\r\n}\r\n\r\nexport function getComponentsAmountMapHierarchy(object: Readonly): Map;\r\nexport function getComponentsAmountMapHierarchy(object: Readonly, outComponentsAmountMap: Map): Map;\r\nexport function getComponentsAmountMapHierarchy(object: Readonly, outComponentsAmountMap: Map = new Map()): Map {\r\n const hierarchy = ObjectUtils.getHierarchy(object);\r\n\r\n for (const hierarchyObject of hierarchy) {\r\n ObjectUtils.getComponentsAmountMapSelf(hierarchyObject, outComponentsAmountMap);\r\n }\r\n\r\n return outComponentsAmountMap;\r\n}\r\n\r\nexport function getComponentsAmountMapDescendants(object: Readonly): Map;\r\nexport function getComponentsAmountMapDescendants(object: Readonly, outComponentsAmountMap: Map): Map;\r\nexport function getComponentsAmountMapDescendants(object: Readonly, outComponentsAmountMap: Map = new Map()): Map {\r\n const descendants = ObjectUtils.getDescendants(object);\r\n\r\n for (const descendant of descendants) {\r\n ObjectUtils.getComponentsAmountMapSelf(descendant, outComponentsAmountMap);\r\n }\r\n\r\n return outComponentsAmountMap;\r\n}\r\n\r\nexport function getComponentsAmountMapChildren(object: Readonly): Map;\r\nexport function getComponentsAmountMapChildren(object: Readonly, outComponentsAmountMap: Map): Map;\r\nexport function getComponentsAmountMapChildren(object: Readonly, outComponentsAmountMap: Map = new Map()): Map {\r\n const children = ObjectUtils.getChildren(object);\r\n\r\n for (const child of children) {\r\n ObjectUtils.getComponentsAmountMapSelf(child, outComponentsAmountMap);\r\n }\r\n\r\n return outComponentsAmountMap;\r\n}\r\n\r\n// GLOBALS\r\n\r\nexport function getComponentObjects(objects: Object3D[], classOrType: ComponentConstructor | string, index: number = 0): T | null {\r\n let component = null;\r\n\r\n for (const object of objects) {\r\n component = object.getComponent(classOrType as ComponentConstructor, index);\r\n\r\n if (component != null) {\r\n break;\r\n }\r\n }\r\n\r\n return component;\r\n}\r\n\r\nexport function getComponentsObjects(objects: Object3D[], classOrType?: ComponentConstructor | string): T[] {\r\n const components: T[] = [];\r\n\r\n for (const currentObject of objects) {\r\n const currentObjectComponents = currentObject.getComponents(classOrType as ComponentConstructor);\r\n\r\n for (let i = 0; i < currentObjectComponents.length; i++) {\r\n components.push(currentObjectComponents[i]);\r\n }\r\n }\r\n\r\n return components;\r\n}\r\n\r\nexport function setActiveObjects(objects: Object3D[], active: boolean): void {\r\n for (const currentObject of objects) {\r\n currentObject.active = active;\r\n }\r\n}\r\n\r\nexport function getObjectByNameObjects(objects: Object3D[], name: string, isRegex: boolean = false, index: number = 0): Object3D | null {\r\n let objectFound = null;\r\n\r\n let currentIndex = index;\r\n for (const currentObject of objects) {\r\n const objectName = ObjectUtils.getName(currentObject);\r\n if ((!isRegex && objectName == name) || (isRegex && objectName.match(name) != null)) {\r\n if (currentIndex == 0) {\r\n objectFound = currentObject;\r\n break;\r\n }\r\n\r\n currentIndex--;\r\n }\r\n }\r\n\r\n return objectFound;\r\n}\r\n\r\nexport function getObjectsByNameObjects(objects: Object3D[], name: string, isRegex: boolean = false): Object3D[] {\r\n const objectsFound: Object3D[] = [];\r\n\r\n for (const currentObject of objects) {\r\n const objectName = ObjectUtils.getName(currentObject);\r\n if ((!isRegex && objectName == name) || (isRegex && objectName.match(name) != null)) {\r\n objectsFound.push(currentObject);\r\n }\r\n }\r\n\r\n return objectsFound;\r\n}\r\n\r\nexport function getObjectByIDObjects(objects: Object3D[], id: number, index: number = 0): Object3D | null {\r\n let objectFound = null;\r\n\r\n let currentIndex = index;\r\n for (const currentObject of objects) {\r\n if (ObjectUtils.getID(currentObject) == id) {\r\n if (currentIndex == 0) {\r\n objectFound = currentObject;\r\n break;\r\n }\r\n\r\n currentIndex--;\r\n }\r\n }\r\n\r\n return objectFound;\r\n}\r\n\r\nexport function getObjectsByIDObjects(objects: Object3D[], id: number): Object3D[] {\r\n const objectsFound: Object3D[] = [];\r\n\r\n for (const currentObject of objects) {\r\n if (ObjectUtils.getID(currentObject) == id) {\r\n objectsFound.push(currentObject);\r\n }\r\n }\r\n\r\n return objectsFound;\r\n}\r\n\r\nexport function wrapObject(id: number, engine: Readonly | null = Globals.getMainEngine()): Object3D | null {\r\n return engine != null ? Globals.getScene(engine).wrap(id) : null;\r\n}\r\n\r\n/**\r\n * How to use\r\n * \r\n * By default the functions work on `World` space, rotations are in `Degrees` and transforms are `Matrix4` (and not `Quat2`) \r\n * For functions that work with rotations, `Matrix` means `Matrix3` and `Quat` means `Quat` \r\n * For functions that work with transforms, `Matrix` means `Matrix4` and `Quat` means `Quat2`\r\n * \r\n * \r\n * You can add a suffix like `World`/`Local`/`Object` at the end of some functions to specify the space, example: \r\n * - `getPositionLocal` to get the position in local space (parent space) \r\n * - `translateObject` to translate in object space\r\n * \r\n * \r\n * For rotations u can add a suffix like `Degrees`/`Radians`/`Quat`/`Matrix` to use a specific version, example: \r\n * - `getRotationDegrees` \r\n * - `setRotationLocalMatrix` \r\n * - `rotateWorldQuat`\r\n * \r\n * \r\n * For transform u can add a suffix like `Quat`/`Matrix` to use a specific version, example: \r\n * - `getTransformQuat` \r\n * - `setTransformWorldMatrix`\r\n * \r\n * \r\n * Some functions let you specify if u want them to work on the `Hierarchy`/`Descendants`/`Children`/`Self` where: \r\n * - `Self`: the current object only \r\n * - `Children`: direct children of the object \r\n * - `Descendants`: all the children of the object, including child of child and so on \r\n * - `Hierarchy`: `Descendants` plus the current object\r\n * \r\n * Examples: \r\n * - `getComponent` \r\n * - `getComponentHierarchy` \r\n * - `getComponentsAmountMapDescendants` \r\n * - `setActiveChildren` \r\n * - `setActiveSelf`\r\n * \r\n * By default the functions work on the `Hierarchy`\r\n * \r\n * On some of the functions where u can specify `Hierarchy`/`Descendants` u can also specify if the algorithm should explore by `Breadth`/`Depth`, example: \r\n * - `getComponentHierarchyBreadth` \r\n * - `setActiveDescendantsDepth`\r\n * \r\n * By default the functions explore by `Breadth`\r\n * \r\n * The functions leave u the choice of forwarding an out parameter or just get the return value, example: \r\n * - `let position = ObjectUtils.getPosition(object)` \r\n * - `ObjectUtils.getPosition(object, position)` \r\n * - the out parameter is always the last one\r\n * \r\n * \r\n * If a method require an engine parameter, u can always avoid specifying it and it will by default use the current main engine \r\n * If a method require a scene parameter, u can always avoid specifying it and it will by default use the scene from the current main engine\r\n */\r\nexport const ObjectUtils = {\r\n getPosition,\r\n getPositionWorld,\r\n getPositionLocal,\r\n getRotation,\r\n getRotationDegrees,\r\n getRotationRadians,\r\n getRotationMatrix,\r\n getRotationQuat,\r\n getRotationWorld,\r\n getRotationWorldDegrees,\r\n getRotationWorldRadians,\r\n getRotationWorldMatrix,\r\n getRotationWorldQuat,\r\n getRotationLocal,\r\n getRotationLocalDegrees,\r\n getRotationLocalRadians,\r\n getRotationLocalMatrix,\r\n getRotationLocalQuat,\r\n getScale,\r\n getScaleWorld,\r\n getScaleLocal,\r\n getTransform,\r\n getTransformMatrix,\r\n getTransformQuat,\r\n getTransformWorld,\r\n getTransformWorldMatrix,\r\n getTransformWorldQuat,\r\n getTransformLocal,\r\n getTransformLocalMatrix,\r\n getTransformLocalQuat,\r\n getAxes,\r\n getAxesWorld,\r\n getAxesLocal,\r\n getForward,\r\n getForwardWorld,\r\n getForwardLocal,\r\n getBackward,\r\n getBackwardWorld,\r\n getBackwardLocal,\r\n getUp,\r\n getUpWorld,\r\n getUpLocal,\r\n getDown,\r\n getDownWorld,\r\n getDownLocal,\r\n getLeft,\r\n getLeftWorld,\r\n getLeftLocal,\r\n getRight,\r\n getRightWorld,\r\n getRightLocal,\r\n setPosition,\r\n setPositionWorld,\r\n setPositionLocal,\r\n setRotation,\r\n setRotationDegrees,\r\n setRotationRadians,\r\n setRotationMatrix,\r\n setRotationQuat,\r\n setRotationWorld,\r\n setRotationWorldDegrees,\r\n setRotationWorldRadians,\r\n setRotationWorldMatrix,\r\n setRotationWorldQuat,\r\n setRotationLocal,\r\n setRotationLocalDegrees,\r\n setRotationLocalRadians,\r\n setRotationLocalMatrix,\r\n setRotationLocalQuat,\r\n setScale,\r\n setScaleWorld,\r\n setScaleLocal,\r\n setAxes,\r\n setAxesWorld,\r\n setAxesLocal,\r\n setForward,\r\n setForwardWorld,\r\n setForwardLocal,\r\n setBackward,\r\n setBackwardWorld,\r\n setBackwardLocal,\r\n setUp,\r\n setUpWorld,\r\n setUpLocal,\r\n setDown,\r\n setDownWorld,\r\n setDownLocal,\r\n setLeft,\r\n setLeftWorld,\r\n setLeftLocal,\r\n setRight,\r\n setRightWorld,\r\n setRightLocal,\r\n setTransform,\r\n setTransformMatrix,\r\n setTransformQuat,\r\n setTransformWorld,\r\n setTransformWorldMatrix,\r\n setTransformWorldQuat,\r\n setTransformLocal,\r\n setTransformLocalMatrix,\r\n setTransformLocalQuat,\r\n resetPosition,\r\n resetPositionWorld,\r\n resetPositionLocal,\r\n resetRotation,\r\n resetRotationWorld,\r\n resetRotationLocal,\r\n resetScale,\r\n resetScaleWorld,\r\n resetScaleLocal,\r\n resetTransform,\r\n resetTransformWorld,\r\n resetTransformLocal,\r\n translate,\r\n translateWorld,\r\n translateLocal,\r\n translateObject,\r\n translateAxis,\r\n translateAxisWorld,\r\n translateAxisLocal,\r\n translateAxisObject,\r\n rotate,\r\n rotateDegrees,\r\n rotateRadians,\r\n rotateMatrix,\r\n rotateQuat,\r\n rotateWorld,\r\n rotateWorldDegrees,\r\n rotateWorldRadians,\r\n rotateWorldMatrix,\r\n rotateWorldQuat,\r\n rotateLocal,\r\n rotateLocalDegrees,\r\n rotateLocalRadians,\r\n rotateLocalMatrix,\r\n rotateLocalQuat,\r\n rotateObject,\r\n rotateObjectDegrees,\r\n rotateObjectRadians,\r\n rotateObjectMatrix,\r\n rotateObjectQuat,\r\n rotateAxis,\r\n rotateAxisDegrees,\r\n rotateAxisRadians,\r\n rotateAxisWorld,\r\n rotateAxisWorldDegrees,\r\n rotateAxisWorldRadians,\r\n rotateAxisLocal,\r\n rotateAxisLocalDegrees,\r\n rotateAxisLocalRadians,\r\n rotateAxisObject,\r\n rotateAxisObjectDegrees,\r\n rotateAxisObjectRadians,\r\n rotateAround,\r\n rotateAroundDegrees,\r\n rotateAroundRadians,\r\n rotateAroundMatrix,\r\n rotateAroundQuat,\r\n rotateAroundWorld,\r\n rotateAroundWorldDegrees,\r\n rotateAroundWorldRadians,\r\n rotateAroundWorldMatrix,\r\n rotateAroundWorldQuat,\r\n rotateAroundLocal,\r\n rotateAroundLocalDegrees,\r\n rotateAroundLocalRadians,\r\n rotateAroundLocalMatrix,\r\n rotateAroundLocalQuat,\r\n rotateAroundObject,\r\n rotateAroundObjectDegrees,\r\n rotateAroundObjectRadians,\r\n rotateAroundObjectMatrix,\r\n rotateAroundObjectQuat,\r\n rotateAroundAxis,\r\n rotateAroundAxisDegrees,\r\n rotateAroundAxisRadians,\r\n rotateAroundAxisWorld,\r\n rotateAroundAxisWorldDegrees,\r\n rotateAroundAxisWorldRadians,\r\n rotateAroundAxisLocal,\r\n rotateAroundAxisLocalDegrees,\r\n rotateAroundAxisLocalRadians,\r\n rotateAroundAxisObject,\r\n rotateAroundAxisObjectDegrees,\r\n rotateAroundAxisObjectRadians,\r\n scaleObject,\r\n lookAt,\r\n lookAtWorld,\r\n lookAtLocal,\r\n lookTo,\r\n lookToWorld,\r\n lookToLocal,\r\n convertPositionObjectToWorld,\r\n convertDirectionObjectToWorld,\r\n convertPositionWorldToObject,\r\n convertDirectionWorldToObject,\r\n convertPositionLocalToWorld,\r\n convertDirectionLocalToWorld,\r\n convertPositionWorldToLocal,\r\n convertDirectionWorldToLocal,\r\n convertPositionObjectToLocal,\r\n convertDirectionObjectToLocal,\r\n convertPositionLocalToObject,\r\n convertDirectionLocalToObject,\r\n convertTransformObjectToWorld,\r\n convertTransformObjectToWorldMatrix,\r\n convertTransformObjectToWorldQuat,\r\n convertTransformWorldToObject,\r\n convertTransformWorldToObjectMatrix,\r\n convertTransformWorldToObjectQuat,\r\n convertTransformLocalToWorld,\r\n convertTransformLocalToWorldMatrix,\r\n convertTransformLocalToWorldQuat,\r\n convertTransformWorldToLocal,\r\n convertTransformWorldToLocalMatrix,\r\n convertTransformWorldToLocalQuat,\r\n convertTransformObjectToLocal,\r\n convertTransformObjectToLocalMatrix,\r\n convertTransformObjectToLocalQuat,\r\n convertTransformLocalToObject,\r\n convertTransformLocalToObjectMatrix,\r\n convertTransformLocalToObjectQuat,\r\n setParent,\r\n getParent,\r\n addComponent,\r\n getComponent,\r\n getComponentSelf,\r\n getComponentHierarchy,\r\n getComponentHierarchyBreadth,\r\n getComponentHierarchyDepth,\r\n getComponentDescendants,\r\n getComponentDescendantsBreadth,\r\n getComponentDescendantsDepth,\r\n getComponentChildren,\r\n getComponents,\r\n getComponentsSelf,\r\n getComponentsHierarchy,\r\n getComponentsHierarchyBreadth,\r\n getComponentsHierarchyDepth,\r\n getComponentsDescendants,\r\n getComponentsDescendantsBreadth,\r\n getComponentsDescendantsDepth,\r\n getComponentsChildren,\r\n setActive,\r\n setActiveSelf,\r\n setActiveHierarchy,\r\n setActiveHierarchyBreadth,\r\n setActiveHierarchyDepth,\r\n setActiveDescendants,\r\n setActiveDescendantsBreadth,\r\n setActiveDescendantsDepth,\r\n setActiveChildren,\r\n hasUniformScale,\r\n hasUniformScaleWorld,\r\n hasUniformScaleLocal,\r\n clone,\r\n isCloneable,\r\n toString,\r\n toStringExtended,\r\n toStringCompact,\r\n log,\r\n logExtended,\r\n logCompact,\r\n warn,\r\n warnExtended,\r\n warnCompact,\r\n error,\r\n errorExtended,\r\n errorCompact,\r\n getObjectByName,\r\n getObjectByNameHierarchy,\r\n getObjectByNameHierarchyBreadth,\r\n getObjectByNameHierarchyDepth,\r\n getObjectByNameDescendants,\r\n getObjectByNameDescendantsBreadth,\r\n getObjectByNameDescendantsDepth,\r\n getObjectByNameChildren,\r\n getObjectsByName,\r\n getObjectsByNameHierarchy,\r\n getObjectsByNameHierarchyBreadth,\r\n getObjectsByNameHierarchyDepth,\r\n getObjectsByNameDescendants,\r\n getObjectsByNameDescendantsBreadth,\r\n getObjectsByNameDescendantsDepth,\r\n getObjectsByNameChildren,\r\n getObjectByID,\r\n getObjectByIDHierarchy,\r\n getObjectByIDHierarchyBreadth,\r\n getObjectByIDHierarchyDepth,\r\n getObjectByIDDescendants,\r\n getObjectByIDDescendantsBreadth,\r\n getObjectByIDDescendantsDepth,\r\n getObjectByIDChildren,\r\n getHierarchy,\r\n getHierarchyBreadth,\r\n getHierarchyDepth,\r\n getDescendants,\r\n getDescendantsBreadth,\r\n getDescendantsDepth,\r\n getChildren,\r\n getSelf,\r\n addChild,\r\n getName,\r\n setName,\r\n getEngine,\r\n getID,\r\n markDirty,\r\n isTransformChanged,\r\n destroy,\r\n reserveObjects,\r\n reserveObjectsSelf,\r\n reserveObjectsHierarchy,\r\n reserveObjectsDescendants,\r\n reserveObjectsChildren,\r\n getComponentsAmountMap,\r\n getComponentsAmountMapSelf,\r\n getComponentsAmountMapHierarchy,\r\n getComponentsAmountMapDescendants,\r\n getComponentsAmountMapChildren,\r\n getComponentObjects,\r\n getComponentsObjects,\r\n setActiveObjects,\r\n getObjectByNameObjects,\r\n getObjectsByNameObjects,\r\n getObjectByIDObjects,\r\n getObjectsByIDObjects,\r\n wrapObject\r\n} as const;\r\n\r\n\r\n\r\nfunction _reserveObjects(count: number, componentsAmountMap: Readonly>, scene: Scene): void {\r\n if (componentsAmountMap.has(\"object\")) {\r\n const objectsToReserve = componentsAmountMap.get(\"object\")! * count;\r\n\r\n const componentsToReserve: Record = {};\r\n for (const [componentName, componentCount] of componentsAmountMap.entries()) {\r\n if (componentName != \"object\") {\r\n componentsToReserve[componentName] = componentCount * count;\r\n }\r\n }\r\n\r\n scene.reserveObjects(objectsToReserve, componentsToReserve);\r\n }\r\n}", "import { MeshComponent, TextComponent } from \"@wonderlandengine/api\";\r\nimport { ComponentDeepCloneParams, ComponentUtils } from \"./component_utils.js\";\r\nimport { MeshUtils } from \"./mesh_utils.js\";\r\n\r\nexport function cloneMesh(componentToClone, targetObject, deepCloneParams = new ComponentDeepCloneParams(), customCloneParams = null) {\r\n let clonedComponent = ComponentUtils.cloneDefault(componentToClone, targetObject, true);\r\n\r\n if (deepCloneParams.isDeepCloneComponentVariable(MeshComponent.TypeName, \"material\")) {\r\n if (componentToClone.material != null) {\r\n clonedComponent.material = componentToClone.material.clone();\r\n }\r\n }\r\n\r\n if (deepCloneParams.isDeepCloneComponentVariable(MeshComponent.TypeName, \"mesh\")) {\r\n clonedComponent.mesh = MeshUtils.clone(componentToClone.mesh);\r\n }\r\n\r\n return clonedComponent;\r\n}\r\n\r\nexport function cloneCollision(componentToClone, targetObject, deepCloneParams = new ComponentDeepCloneParams(), customCloneParams = null) {\r\n let clonedComponent = ComponentUtils.cloneDefault(componentToClone, targetObject);\r\n\r\n return clonedComponent;\r\n}\r\n\r\nexport function cloneText(componentToClone, targetObject, deepCloneParams = new ComponentDeepCloneParams(), customCloneParams = null) {\r\n let clonedComponent = ComponentUtils.cloneDefault(componentToClone, targetObject);\r\n\r\n if (deepCloneParams.isDeepCloneComponentVariable(TextComponent.TypeName, \"material\")) {\r\n if (componentToClone.material != null) {\r\n clonedComponent.material = componentToClone.material.clone();\r\n }\r\n }\r\n\r\n return clonedComponent;\r\n}\r\n\r\nexport function clonePhysX(componentToClone, targetObject, deepCloneParams = new ComponentDeepCloneParams(), customCloneParams = null) {\r\n let clonedComponent = ComponentUtils.cloneDefault(componentToClone, targetObject);\r\n\r\n return clonedComponent;\r\n}\r\n\r\nexport let WLComponentDefaultCloneCallbacks = {\r\n cloneMesh,\r\n cloneCollision,\r\n cloneText,\r\n clonePhysX\r\n};", "import { MeshAttribute, MeshIndexType } from \"@wonderlandengine/api\";\r\nimport { vec2_create, vec3_create, vec4_create } from \"../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Globals } from \"../../../pp/globals.js\";\r\n\r\nexport class MeshCreationVertexParams {\r\n\r\n constructor() {\r\n this.myPosition = null; // @Vec3\r\n this.myTextureCoordinates = null; // @Vec2\r\n this.myNormal = null; // @Vec3\r\n this.myColor = null; // @Vec4\r\n }\r\n}\r\n\r\nexport class MeshCreationTriangleParams {\r\n\r\n constructor() {\r\n this.myIndexes = new Uint32Array(3);\r\n }\r\n}\r\n\r\nexport class MeshCreationParams {\r\n\r\n constructor(engine = Globals.getMainEngine()) {\r\n this.myVertexes = [];\r\n this.myTriangles = [];\r\n\r\n this.myEngine = engine;\r\n }\r\n}\r\n\r\nexport function create(meshCreationParams) {\r\n let indexData = [];\r\n for (let triangle of meshCreationParams.myTriangles) {\r\n indexData.push(triangle.myIndexes[0]);\r\n indexData.push(triangle.myIndexes[1]);\r\n indexData.push(triangle.myIndexes[2]);\r\n }\r\n\r\n let indexDataUnsignedInt = new Uint32Array(indexData.length);\r\n indexDataUnsignedInt.pp_copy(indexData);\r\n\r\n let vertexCount = meshCreationParams.myVertexes.length;\r\n let mesh = meshCreationParams.myEngine.meshes.create({\r\n vertexCount: vertexCount,\r\n indexData: indexDataUnsignedInt,\r\n indexType: MeshIndexType.UnsignedInt\r\n });\r\n\r\n let positionAttribute = null;\r\n let textureCoordinatesAttribute = null;\r\n let normalAttribute = null;\r\n let colorAttribute = null;\r\n\r\n try {\r\n positionAttribute = mesh.attribute(MeshAttribute.Position);\r\n } catch (error) {\r\n positionAttribute = null;\r\n }\r\n\r\n try {\r\n textureCoordinatesAttribute = mesh.attribute(MeshAttribute.TextureCoordinate);\r\n } catch (error) {\r\n textureCoordinatesAttribute = null;\r\n }\r\n\r\n try {\r\n normalAttribute = mesh.attribute(MeshAttribute.Normal);\r\n } catch (error) {\r\n normalAttribute = null;\r\n }\r\n\r\n try {\r\n colorAttribute = mesh.attribute(MeshAttribute.Color);\r\n } catch (error) {\r\n colorAttribute = null;\r\n }\r\n\r\n for (let i = 0; i < meshCreationParams.myVertexes.length; i++) {\r\n let vertex = meshCreationParams.myVertexes[i];\r\n if (positionAttribute != null && vertex.myPosition) {\r\n positionAttribute.set(i, vertex.myPosition);\r\n }\r\n if (textureCoordinatesAttribute != null && vertex.myTextureCoordinates) {\r\n textureCoordinatesAttribute.set(i, vertex.myTextureCoordinates);\r\n }\r\n if (normalAttribute != null && vertex.myNormal) {\r\n normalAttribute.set(i, vertex.myNormal);\r\n }\r\n if (colorAttribute != null && vertex.myColor) {\r\n colorAttribute.set(i, vertex.myColor);\r\n }\r\n }\r\n\r\n return mesh;\r\n}\r\n\r\nexport let clone = function () {\r\n let position = vec3_create();\r\n let textureCoordinates = vec2_create();\r\n let normal = vec3_create();\r\n let color = vec4_create();\r\n\r\n return function clone(mesh) {\r\n if (mesh == null) {\r\n return null;\r\n }\r\n\r\n let clonedIndexData = mesh.indexData.pp_clone();\r\n\r\n let clonedMesh = mesh.engine.meshes.create({\r\n vertexCount: mesh.vertexCount,\r\n indexData: clonedIndexData,\r\n indexType: MeshIndexType.UnsignedInt\r\n });\r\n\r\n let positionAttribute = null;\r\n let textureCoordinatesAttribute = null;\r\n let normalAttribute = null;\r\n let colorAttribute = null;\r\n\r\n let clonedPositionAttribute = null;\r\n let clonedTextureCoordinatesAttribute = null;\r\n let clonedNormalAttribute = null;\r\n let clonedColorAttribute = null;\r\n\r\n\r\n try {\r\n positionAttribute = mesh.attribute(MeshAttribute.Position);\r\n clonedPositionAttribute = clonedMesh.attribute(MeshAttribute.Position);\r\n } catch (error) {\r\n positionAttribute = null;\r\n clonedPositionAttribute = null;\r\n }\r\n\r\n try {\r\n textureCoordinatesAttribute = mesh.attribute(MeshAttribute.TextureCoordinate);\r\n clonedTextureCoordinatesAttribute = clonedMesh.attribute(MeshAttribute.TextureCoordinate);\r\n } catch (error) {\r\n textureCoordinatesAttribute = null;\r\n clonedTextureCoordinatesAttribute = null;\r\n }\r\n\r\n try {\r\n normalAttribute = mesh.attribute(MeshAttribute.Normal);\r\n clonedNormalAttribute = clonedMesh.attribute(MeshAttribute.Normal);\r\n } catch (error) {\r\n normalAttribute = null;\r\n clonedNormalAttribute = null;\r\n }\r\n\r\n try {\r\n colorAttribute = mesh.attribute(MeshAttribute.Color);\r\n clonedColorAttribute = clonedMesh.attribute(MeshAttribute.Color);\r\n } catch (error) {\r\n colorAttribute = null;\r\n clonedColorAttribute = null;\r\n }\r\n\r\n for (let i = 0; i < mesh.vertexCount; i++) {\r\n if (positionAttribute != null && clonedPositionAttribute != null) {\r\n clonedPositionAttribute.set(i, positionAttribute.get(i, position));\r\n }\r\n if (textureCoordinatesAttribute != null && clonedTextureCoordinatesAttribute != null) {\r\n clonedTextureCoordinatesAttribute.set(i, textureCoordinatesAttribute.get(i, textureCoordinates));\r\n }\r\n if (normalAttribute != null && clonedNormalAttribute != null) {\r\n clonedNormalAttribute.set(i, normalAttribute.get(i, normal));\r\n }\r\n if (colorAttribute != null && clonedColorAttribute != null) {\r\n clonedColorAttribute.set(i, colorAttribute.get(i, color));\r\n }\r\n }\r\n\r\n return clonedMesh;\r\n };\r\n}();\r\n\r\nexport let invert = function () {\r\n let position = vec3_create();\r\n let textureCoordinates = vec2_create();\r\n let normal = vec3_create();\r\n let color = vec4_create();\r\n\r\n return function invert(mesh) {\r\n if (mesh == null) {\r\n return null;\r\n }\r\n\r\n let invertedIndexData = new Uint32Array(mesh.indexData.length);\r\n for (let i = 0; i < mesh.indexData.length / 3; i++) {\r\n invertedIndexData[i * 3 + 0] = mesh.indexData[i * 3 + 2];\r\n invertedIndexData[i * 3 + 1] = mesh.indexData[i * 3 + 1];\r\n invertedIndexData[i * 3 + 2] = mesh.indexData[i * 3 + 0];\r\n }\r\n\r\n let invertedMesh = mesh.engine.meshes.create({\r\n vertexCount: mesh.vertexCount,\r\n indexData: invertedIndexData,\r\n indexType: MeshIndexType.UnsignedInt\r\n });\r\n\r\n let positionAttribute = null;\r\n let textureCoordinatesAttribute = null;\r\n let normalAttribute = null;\r\n let colorAttribute = null;\r\n\r\n let invertedPositionAttribute = null;\r\n let invertedTextureCoordinatesAttribute = null;\r\n let invertedNormalAttribute = null;\r\n let invertedColorAttribute = null;\r\n\r\n try {\r\n positionAttribute = mesh.attribute(MeshAttribute.Position);\r\n invertedPositionAttribute = invertedMesh.attribute(MeshAttribute.Position);\r\n } catch (error) {\r\n positionAttribute = null;\r\n invertedPositionAttribute = null;\r\n }\r\n\r\n try {\r\n textureCoordinatesAttribute = mesh.attribute(MeshAttribute.TextureCoordinate);\r\n invertedTextureCoordinatesAttribute = invertedMesh.attribute(MeshAttribute.TextureCoordinate);\r\n } catch (error) {\r\n textureCoordinatesAttribute = null;\r\n invertedTextureCoordinatesAttribute = null;\r\n }\r\n\r\n try {\r\n normalAttribute = mesh.attribute(MeshAttribute.Normal);\r\n invertedNormalAttribute = invertedMesh.attribute(MeshAttribute.Normal);\r\n } catch (error) {\r\n normalAttribute = null;\r\n invertedNormalAttribute = null;\r\n }\r\n\r\n try {\r\n colorAttribute = mesh.attribute(MeshAttribute.Color);\r\n invertedColorAttribute = invertedMesh.attribute(MeshAttribute.Color);\r\n } catch (error) {\r\n colorAttribute = null;\r\n invertedColorAttribute = null;\r\n }\r\n\r\n for (let i = 0; i < mesh.vertexCount; i++) {\r\n if (positionAttribute != null && invertedPositionAttribute != null) {\r\n invertedPositionAttribute.set(i, positionAttribute.get(i, position));\r\n }\r\n\r\n if (textureCoordinatesAttribute != null && invertedTextureCoordinatesAttribute != null) {\r\n invertedTextureCoordinatesAttribute.set(i, textureCoordinatesAttribute.get(i, textureCoordinates));\r\n }\r\n\r\n if (normalAttribute != null && invertedNormalAttribute != null) {\r\n normalAttribute.get(i, normal);\r\n normal.vec3_negate(normal);\r\n invertedNormalAttribute.set(i, normal);\r\n }\r\n\r\n if (colorAttribute != null && invertedColorAttribute != null) {\r\n invertedColorAttribute.set(i, colorAttribute.get(i, color));\r\n }\r\n }\r\n\r\n return invertedMesh;\r\n };\r\n}();\r\n\r\nexport let makeDoubleSided = function () {\r\n let position = vec3_create();\r\n let textureCoordinates = vec2_create();\r\n let normal = vec3_create();\r\n let color = vec4_create();\r\n\r\n return function makeDoubleSided(mesh) {\r\n if (mesh == null) {\r\n return null;\r\n }\r\n\r\n let doubleSidedIndexData = new Uint32Array(mesh.indexData.length * 2);\r\n for (let i = 0; i < doubleSidedIndexData.length / 3; i++) {\r\n doubleSidedIndexData[i * 3 * 2 + 0] = mesh.indexData[i * 3 + 0] * 2;\r\n doubleSidedIndexData[i * 3 * 2 + 1] = mesh.indexData[i * 3 + 1] * 2;\r\n doubleSidedIndexData[i * 3 * 2 + 2] = mesh.indexData[i * 3 + 2] * 2;\r\n\r\n doubleSidedIndexData[i * 3 * 2 + 3] = mesh.indexData[i * 3 + 2] * 2 + 1;\r\n doubleSidedIndexData[i * 3 * 2 + 4] = mesh.indexData[i * 3 + 1] * 2 + 1;\r\n doubleSidedIndexData[i * 3 * 2 + 5] = mesh.indexData[i * 3 + 0] * 2 + 1;\r\n }\r\n\r\n let doubleSidedMesh = mesh.engine.meshes.create({\r\n vertexCount: mesh.vertexCount * 2,\r\n indexData: doubleSidedIndexData,\r\n indexType: MeshIndexType.UnsignedInt\r\n });\r\n\r\n let positionAttribute = null;\r\n let textureCoordinatesAttribute = null;\r\n let normalAttribute = null;\r\n let colorAttribute = null;\r\n\r\n let doubleSidedPositionAttribute = null;\r\n let doubleSidedTextureCoordinatesAttribute = null;\r\n let doubleSidedNormalAttribute = null;\r\n let doubleSidedColorAttribute = null;\r\n\r\n try {\r\n positionAttribute = mesh.attribute(MeshAttribute.Position);\r\n doubleSidedPositionAttribute = doubleSidedMesh.attribute(MeshAttribute.Position);\r\n } catch (error) {\r\n positionAttribute = null;\r\n doubleSidedPositionAttribute = null;\r\n }\r\n\r\n try {\r\n textureCoordinatesAttribute = mesh.attribute(MeshAttribute.TextureCoordinate);\r\n doubleSidedTextureCoordinatesAttribute = doubleSidedMesh.attribute(MeshAttribute.TextureCoordinate);\r\n } catch (error) {\r\n textureCoordinatesAttribute = null;\r\n doubleSidedTextureCoordinatesAttribute = null;\r\n }\r\n\r\n try {\r\n normalAttribute = mesh.attribute(MeshAttribute.Normal);\r\n doubleSidedNormalAttribute = doubleSidedMesh.attribute(MeshAttribute.Normal);\r\n } catch (error) {\r\n normalAttribute = null;\r\n doubleSidedNormalAttribute = null;\r\n }\r\n\r\n try {\r\n colorAttribute = mesh.attribute(MeshAttribute.Color);\r\n doubleSidedColorAttribute = doubleSidedMesh.attribute(MeshAttribute.Color);\r\n } catch (error) {\r\n colorAttribute = null;\r\n doubleSidedColorAttribute = null;\r\n }\r\n\r\n for (let i = 0; i < mesh.vertexCount; i++) {\r\n if (positionAttribute != null && doubleSidedPositionAttribute != null) {\r\n doubleSidedPositionAttribute.set(i * 2, positionAttribute.get(i, position));\r\n doubleSidedPositionAttribute.set(i * 2 + 1, positionAttribute.get(i, position));\r\n }\r\n\r\n if (textureCoordinatesAttribute != null && doubleSidedTextureCoordinatesAttribute != null) {\r\n doubleSidedTextureCoordinatesAttribute.set(i * 2, textureCoordinatesAttribute.get(i, textureCoordinates));\r\n doubleSidedTextureCoordinatesAttribute.set(i * 2 + 1, textureCoordinatesAttribute.get(i, textureCoordinates));\r\n }\r\n\r\n if (normalAttribute != null && doubleSidedNormalAttribute != null) {\r\n normalAttribute.get(i, normal);\r\n doubleSidedNormalAttribute.set(i * 2, normal);\r\n\r\n let invertedNormal = normal.vec3_negate();\r\n doubleSidedNormalAttribute.set(i * 2 + 1, invertedNormal);\r\n }\r\n\r\n if (colorAttribute != null && doubleSidedColorAttribute != null) {\r\n doubleSidedColorAttribute.set(i * 2, colorAttribute.get(i, color));\r\n doubleSidedColorAttribute.set(i * 2 + 1, colorAttribute.get(i, color));\r\n }\r\n }\r\n\r\n return doubleSidedMesh;\r\n };\r\n}();\r\n\r\nexport function createPlane(engine = Globals.getMainEngine()) {\r\n let vertexCount = 4;\r\n\r\n let meshCreationParams = new MeshCreationParams(engine);\r\n\r\n for (let i = 0; i < vertexCount; ++i) {\r\n let vertexCreationParams = new MeshCreationVertexParams();\r\n\r\n vertexCreationParams.myPosition = new vec3_create();\r\n vertexCreationParams.myPosition[0] = -1 + (i & 1) * 2;\r\n vertexCreationParams.myPosition[1] = -1 + ((i & 2) >> 1) * 2; // This is a quick way to have positions (-1,-1) (1,-1) (1,-1) (1,1)\r\n vertexCreationParams.myPosition[2] = 0;\r\n\r\n vertexCreationParams.myTextureCoordinates = new vec2_create();\r\n vertexCreationParams.myTextureCoordinates[0] = (i & 1);\r\n vertexCreationParams.myTextureCoordinates[1] = ((i & 2) >> 1);\r\n\r\n vertexCreationParams.myNormal = new vec3_create();\r\n vertexCreationParams.myNormal[0] = 0;\r\n vertexCreationParams.myNormal[1] = 0;\r\n vertexCreationParams.myNormal[2] = 1;\r\n\r\n meshCreationParams.myVertexes.push(vertexCreationParams);\r\n }\r\n\r\n let firstTriangle = new MeshCreationTriangleParams();\r\n firstTriangle.myIndexes[0] = 0;\r\n firstTriangle.myIndexes[1] = 1;\r\n firstTriangle.myIndexes[2] = 2;\r\n\r\n let secondTriangle = new MeshCreationTriangleParams();\r\n secondTriangle.myIndexes[0] = 2;\r\n secondTriangle.myIndexes[1] = 1;\r\n secondTriangle.myIndexes[2] = 3;\r\n\r\n meshCreationParams.myTriangles.push(firstTriangle);\r\n meshCreationParams.myTriangles.push(secondTriangle);\r\n\r\n let mesh = MeshUtils.create(meshCreationParams);\r\n\r\n return mesh;\r\n}\r\n\r\nexport let MeshUtils = {\r\n create,\r\n clone,\r\n invert,\r\n makeDoubleSided,\r\n createPlane\r\n};", "import { vec2 as gl_vec2, type vec2 as gl_vec2_type } from \"gl-matrix\";\r\nimport { Vector2 } from \"../../type_definitions/array_type_definitions.js\";\r\nimport { EasingFunction } from \"../math_utils.js\";\r\nimport { getVector2AllocationFunction, setVector2AllocationFunction } from \"./vec_allocation_utils.js\";\r\n\r\nexport function create(): Vector2;\r\nexport function create(x: number, y: number): Vector2;\r\nexport function create(uniformValue: number): Vector2;\r\nexport function create(x?: number, y?: number): Vector2 {\r\n const out = getAllocationFunction()();\r\n\r\n if (x != null) {\r\n Vec2Utils.set(out, x, y!);\r\n }\r\n\r\n return out;\r\n}\r\n\r\nexport function getAllocationFunction(): () => Vector2 {\r\n return getVector2AllocationFunction();\r\n}\r\n\r\n/** Specify the function that will be used to allocate the vector when calling the {@link create} function */\r\nexport function setAllocationFunction(allocationFunction: () => Vector2): void {\r\n setVector2AllocationFunction(allocationFunction);\r\n}\r\n\r\nexport function set(vector: T, x: number, y: number): T;\r\nexport function set(vector: T, uniformValue: number): T;\r\nexport function set(vector: T, x: number, y?: number): T {\r\n if (y == null) {\r\n gl_vec2.set(vector as unknown as gl_vec2_type, x, x);\r\n } else {\r\n gl_vec2.set(vector as unknown as gl_vec2_type, x, y);\r\n }\r\n\r\n return vector;\r\n}\r\n\r\nexport function copy(from: Readonly, to: T): T {\r\n gl_vec2.copy(to as unknown as gl_vec2_type, from as unknown as gl_vec2_type);\r\n return to;\r\n}\r\n\r\n/** The overload where `T extends Vector2` does also get `array` as `Readonly`, but is not marked as such due to \r\n Typescript having issues with inferring the proper type of `T` when `Readonly` is used */\r\nexport function clone(vector: Readonly): T;\r\nexport function clone(vector: Readonly): number[];\r\nexport function clone(vector: T): T;\r\nexport function clone(vector: Readonly): T {\r\n return vector.slice(0) as T;\r\n}\r\n\r\nexport function equals(first: Readonly, second: Readonly, epsilon: number = 0): boolean {\r\n let equals = first.length == second.length;\r\n\r\n if (equals) {\r\n equals &&= (Math.abs(first[0] - second[0]) <= epsilon);\r\n equals &&= (Math.abs(first[1] - second[1]) <= epsilon);\r\n }\r\n\r\n return equals;\r\n}\r\n\r\nexport function length(vector: Readonly): number {\r\n return gl_vec2.length(vector as unknown as gl_vec2_type);\r\n}\r\n\r\nexport function normalize(vector: Readonly): T;\r\nexport function normalize(vector: Readonly, out: T): T;\r\nexport function normalize(vector: Readonly, out: T | U = Vec2Utils.clone(vector)): T | U {\r\n gl_vec2.normalize(out as unknown as gl_vec2_type, vector as unknown as gl_vec2_type);\r\n return out;\r\n}\r\n\r\nexport function zero(vector: T): T {\r\n gl_vec2.zero(vector as unknown as gl_vec2_type);\r\n return vector;\r\n}\r\n\r\nexport function isZero(vector: Readonly, epsilon: number = 0): boolean {\r\n return Vec2Utils.length(vector) <= epsilon;\r\n}\r\n\r\nexport function lerp(from: Readonly, to: Readonly, interpolationFactor: number): T;\r\nexport function lerp(from: Readonly, to: Readonly, interpolationFactor: number, out: T): T;\r\nexport function lerp(from: Readonly, to: Readonly, interpolationFactor: number, out: T | U = Vec2Utils.clone(from)): T | U {\r\n if (interpolationFactor <= 0) {\r\n Vec2Utils.copy(from, out);\r\n return out;\r\n } else if (interpolationFactor >= 1) {\r\n Vec2Utils.copy(to, out);\r\n return out;\r\n }\r\n\r\n gl_vec2.lerp(out as unknown as gl_vec2_type, from as unknown as gl_vec2_type, to as unknown as gl_vec2_type, interpolationFactor);\r\n return out;\r\n}\r\n\r\nexport function interpolate(from: Readonly, to: Readonly, interpolationFactor: number, easingFunction?: EasingFunction): T;\r\nexport function interpolate(from: Readonly, to: Readonly, interpolationFactor: number, easingFunction: EasingFunction, out: T): T;\r\nexport function interpolate(from: Readonly, to: Readonly, interpolationFactor: number, easingFunction: EasingFunction = EasingFunction.linear, out: T | U = Vec2Utils.clone(from)): T | U {\r\n const lerpFactor = easingFunction(interpolationFactor);\r\n return Vec2Utils.lerp(from, to, lerpFactor, out);\r\n}\r\n\r\nexport const Vec2Utils = {\r\n create,\r\n getAllocationFunction,\r\n setAllocationFunction,\r\n set,\r\n copy,\r\n clone,\r\n equals,\r\n length,\r\n normalize,\r\n zero,\r\n isZero,\r\n lerp,\r\n interpolate\r\n} as const;", "import { vec4 as gl_vec4, type vec4 as gl_vec4_type } from \"gl-matrix\";\r\nimport { Vector4 } from \"../../type_definitions/array_type_definitions.js\";\r\nimport { EasingFunction } from \"../math_utils.js\";\r\nimport { getVector4AllocationFunction, setVector4AllocationFunction } from \"./vec_allocation_utils.js\";\r\n\r\nexport function create(): Vector4;\r\nexport function create(x: number, y: number, z: number, w: number): Vector4;\r\nexport function create(uniformValue: number): Vector4;\r\nexport function create(x?: number, y?: number, z?: number, w?: number): Vector4 {\r\n const out = getAllocationFunction()();\r\n\r\n if (x != null) {\r\n Vec4Utils.set(out, x, y!, z!, w!);\r\n }\r\n\r\n return out;\r\n}\r\n\r\nexport function getAllocationFunction(): () => Vector4 {\r\n return getVector4AllocationFunction();\r\n}\r\n\r\n/** Specify the function that will be used to allocate the vector when calling the {@link create} function */\r\nexport function setAllocationFunction(allocationFunction: () => Vector4): void {\r\n setVector4AllocationFunction(allocationFunction);\r\n}\r\n\r\nexport function set(vector: T, x: number, y: number, z: number, w: number): T;\r\nexport function set(vector: T, uniformValue: number): T;\r\nexport function set(vector: T, x: number, y?: number, z?: number, w?: number): T {\r\n if (y == null) {\r\n gl_vec4.set(vector as unknown as gl_vec4_type, x, x, x, x);\r\n } else {\r\n gl_vec4.set(vector as unknown as gl_vec4_type, x, y, z!, w!);\r\n }\r\n\r\n return vector;\r\n}\r\n\r\nexport function copy(from: Readonly, to: T): T {\r\n gl_vec4.copy(to as unknown as gl_vec4_type, from as unknown as gl_vec4_type);\r\n return to;\r\n}\r\n\r\n/** The overload where `T extends Vector4` does also get `array` as `Readonly`, but is not marked as such due to \r\n Typescript having issues with inferring the proper type of `T` when `Readonly` is used */\r\nexport function clone(vector: Readonly): T;\r\nexport function clone(vector: Readonly): number[];\r\nexport function clone(vector: T): T;\r\nexport function clone(vector: Readonly): T {\r\n return vector.slice(0) as T;\r\n}\r\n\r\nexport function equals(first: Readonly, second: Readonly, epsilon: number = 0): boolean {\r\n let equals = first.length == second.length;\r\n\r\n if (equals) {\r\n equals &&= (Math.abs(first[0] - second[0]) <= epsilon);\r\n equals &&= (Math.abs(first[1] - second[1]) <= epsilon);\r\n equals &&= (Math.abs(first[2] - second[2]) <= epsilon);\r\n equals &&= (Math.abs(first[3] - second[3]) <= epsilon);\r\n }\r\n\r\n return equals;\r\n}\r\n\r\nexport function lerp(from: Readonly, to: Readonly, interpolationFactor: number): T;\r\nexport function lerp(from: Readonly, to: Readonly, interpolationFactor: number, out: T): T;\r\nexport function lerp(from: Readonly, to: Readonly, interpolationFactor: number, out: T | U = Vec4Utils.clone(from)): T | U {\r\n if (interpolationFactor <= 0) {\r\n Vec4Utils.copy(from, out);\r\n return out;\r\n } else if (interpolationFactor >= 1) {\r\n Vec4Utils.copy(to, out);\r\n return out;\r\n }\r\n\r\n gl_vec4.lerp(out as unknown as gl_vec4_type, from as unknown as gl_vec4_type, to as unknown as gl_vec4_type, interpolationFactor);\r\n return out;\r\n}\r\n\r\nexport function interpolate(from: Readonly, to: Readonly, interpolationFactor: number, easingFunction?: EasingFunction): T;\r\nexport function interpolate(from: Readonly, to: Readonly, interpolationFactor: number, easingFunction: EasingFunction, out: T): T;\r\nexport function interpolate(from: Readonly, to: Readonly, interpolationFactor: number, easingFunction: EasingFunction = EasingFunction.linear, out: T | U = Vec4Utils.clone(from)): T | U {\r\n const lerpFactor = easingFunction(interpolationFactor);\r\n return Vec4Utils.lerp(from, to, lerpFactor, out);\r\n}\r\n\r\nexport const Vec4Utils = {\r\n create,\r\n getAllocationFunction,\r\n setAllocationFunction,\r\n set,\r\n copy,\r\n clone,\r\n equals,\r\n lerp,\r\n interpolate\r\n} as const;", "import { Vector } from \"../../type_definitions/array_type_definitions.js\";\r\nimport { EasingFunction, MathUtils } from \"../math_utils.js\";\r\nimport { getVectorAllocationFunction, setVectorAllocationFunction } from \"./vec_allocation_utils.js\";\r\n\r\nexport function create(length: number): Vector;\r\nexport function create(firstValue: number, ...remainingValues: number[]): Vector;\r\nexport function create(firstValue: number, ...remainingValues: number[]): Vector {\r\n let out: Vector | null = null;\r\n\r\n if (remainingValues.length == 0) {\r\n const length = firstValue;\r\n out = getAllocationFunction()(length);\r\n for (let i = 0; i < length; i++) {\r\n out[i] = 0;\r\n }\r\n } else {\r\n out = getAllocationFunction()(remainingValues.length + 1);\r\n out[0] = firstValue;\r\n for (let i = 0; i < remainingValues.length; i++) {\r\n out[i + 1] = remainingValues[i];\r\n }\r\n }\r\n\r\n return out;\r\n}\r\n\r\nexport function getAllocationFunction(): (length: number) => Vector {\r\n return getVectorAllocationFunction();\r\n}\r\n\r\n/** Specify the function that will be used to allocate the vector when calling the {@link create} function */\r\nexport function setAllocationFunction(allocationFunction: (length: number) => Vector): void {\r\n setVectorAllocationFunction(allocationFunction);\r\n}\r\n\r\nexport function set(vector: T, uniformValue: number): T;\r\nexport function set(vector: T, firstValue: number, ...remainingValues: number[]): T;\r\nexport function set(vector: T, firstValue: number, ...remainingValues: number[]): T {\r\n if (remainingValues.length == 0) {\r\n for (let i = 0; i < vector.length; i++) {\r\n vector[i] = firstValue;\r\n }\r\n } else {\r\n vector[0] = firstValue;\r\n for (let i = 0; i < remainingValues.length && i < vector.length - 1; i++) {\r\n vector[i + 1] = remainingValues[i];\r\n }\r\n }\r\n\r\n return vector;\r\n}\r\n\r\nexport function copy(from: Readonly, to: T): T {\r\n const minLength = Math.min(from.length, to.length);\r\n for (let i = 0; i < minLength; i++) {\r\n to[i] = from[i];\r\n }\r\n return to;\r\n}\r\n\r\n/** The overload where `T extends Vector` does also get `array` as `Readonly`, but is not marked as such due to \r\n Typescript having issues with inferring the proper type of `T` when `Readonly` is used */\r\nexport function clone(vector: Readonly): T;\r\nexport function clone(vector: Readonly): number[];\r\nexport function clone(vector: T): T;\r\nexport function clone(vector: Readonly): T {\r\n return vector.slice(0) as T;\r\n}\r\n\r\nexport function equals(vector: Readonly, other: Readonly, epsilon: number = 0): boolean {\r\n let equals = vector.length == other.length;\r\n\r\n for (let i = 0; i < vector.length && equals; i++) {\r\n equals = equals && (Math.abs(vector[i] - other[i]) <= epsilon);\r\n }\r\n\r\n return equals;\r\n}\r\n\r\nexport function zero(vector: T): T {\r\n for (let i = 0; i < vector.length; i++) {\r\n vector[i] = 0;\r\n }\r\n\r\n return vector;\r\n}\r\n\r\nexport function isZero(vector: Readonly, epsilon: number = 0): boolean {\r\n let zero = true;\r\n\r\n for (let i = 0; i < vector.length && zero; i++) {\r\n zero = zero && (Math.abs(vector[i]) <= epsilon);\r\n }\r\n\r\n return zero;\r\n}\r\n\r\nexport function scale(vector: Readonly, value: number): T;\r\nexport function scale(vector: Readonly, value: number, out: T): T;\r\nexport function scale(vector: Readonly, value: number, out: T | U = VecUtils.clone(vector)): T | U {\r\n for (let i = 0; i < vector.length; i++) {\r\n out[i] = vector[i] * value;\r\n }\r\n\r\n return out;\r\n}\r\n\r\nexport function round(vector: Readonly): T;\r\nexport function round(vector: Readonly, out: T): T;\r\nexport function round(vector: Readonly, out: T | U = VecUtils.clone(vector)): T | U {\r\n for (let i = 0; i < vector.length; i++) {\r\n out[i] = Math.round(vector[i]);\r\n }\r\n\r\n return out;\r\n}\r\n\r\nexport function floor(vector: Readonly): T;\r\nexport function floor(vector: Readonly, out: T): T;\r\nexport function floor(vector: Readonly, out: T | U = VecUtils.clone(vector)): T | U {\r\n for (let i = 0; i < vector.length; i++) {\r\n out[i] = Math.floor(vector[i]);\r\n }\r\n\r\n return out;\r\n}\r\n\r\nexport function ceil(vector: Readonly): T;\r\nexport function ceil(vector: Readonly, out: T): T;\r\nexport function ceil(vector: Readonly, out: T | U = VecUtils.clone(vector)): T | U {\r\n for (let i = 0; i < vector.length; i++) {\r\n out[i] = Math.ceil(vector[i]);\r\n }\r\n\r\n return out;\r\n}\r\n\r\nexport function clamp(vector: Readonly, start?: number, end?: number): T;\r\nexport function clamp(vector: Readonly, start: number, end: number, out: T): T;\r\nexport function clamp(vector: Readonly, start: number = -Number.MAX_VALUE, end: number = Number.MAX_VALUE, out: T | U = VecUtils.clone(vector)): T | U {\r\n const min = Math.min(start, end);\r\n const max = Math.max(start, end);\r\n\r\n for (let i = 0; i < vector.length; i++) {\r\n out[i] = MathUtils.clamp(vector[i], min, max);\r\n }\r\n\r\n return out;\r\n}\r\n\r\nexport function lerp(from: Readonly, to: Readonly, interpolationFactor: number): T;\r\nexport function lerp(from: Readonly, to: Readonly, interpolationFactor: number, out: T): T;\r\nexport function lerp(from: Readonly, to: Readonly, interpolationFactor: number, out: T | U = VecUtils.clone(from)): T | U {\r\n if (interpolationFactor <= 0) {\r\n VecUtils.copy(from, out);\r\n return out;\r\n } else if (interpolationFactor >= 1) {\r\n VecUtils.copy(to, out);\r\n return out;\r\n }\r\n\r\n const minLength = Math.min(from.length, to.length, out.length);\r\n for (let i = 0; i < minLength; i++) {\r\n const fromCurrentValue = from[i];\r\n const toCurrentValue = to[i];\r\n\r\n out[i] = fromCurrentValue + interpolationFactor * (toCurrentValue - fromCurrentValue);\r\n }\r\n\r\n return out;\r\n}\r\n\r\nexport function interpolate(from: Readonly, to: Readonly, interpolationFactor: number, easingFunction?: EasingFunction): T;\r\nexport function interpolate(from: Readonly, to: Readonly, interpolationFactor: number, easingFunction: EasingFunction, out: T): T;\r\nexport function interpolate(from: Readonly, to: Readonly, interpolationFactor: number, easingFunction: EasingFunction = EasingFunction.linear, out: T | U = VecUtils.clone(from)): T | U {\r\n const lerpFactor = easingFunction(interpolationFactor);\r\n return VecUtils.lerp(from, to, lerpFactor, out);\r\n}\r\n\r\nexport function toString(vector: Readonly, decimalPlaces: number = 4): string {\r\n const message = _buildConsoleMessage(vector, decimalPlaces);\r\n return message;\r\n}\r\n\r\nexport function log(vector: Readonly, decimalPlaces: number = 4): Vector {\r\n const message = _buildConsoleMessage(vector, decimalPlaces);\r\n console.log(message);\r\n\r\n return vector;\r\n}\r\n\r\nexport function error(vector: Readonly, decimalPlaces: number = 4): Vector {\r\n const message = _buildConsoleMessage(vector, decimalPlaces);\r\n console.error(message);\r\n\r\n return vector;\r\n}\r\n\r\nexport function warn(vector: Readonly, decimalPlaces: number = 4): Vector {\r\n const message = _buildConsoleMessage(vector, decimalPlaces);\r\n console.warn(message);\r\n\r\n return vector;\r\n}\r\n\r\nexport const VecUtils = {\r\n create,\r\n getAllocationFunction,\r\n setAllocationFunction,\r\n set,\r\n copy,\r\n clone,\r\n equals,\r\n zero,\r\n isZero,\r\n scale,\r\n round,\r\n floor,\r\n ceil,\r\n clamp,\r\n lerp,\r\n interpolate,\r\n toString,\r\n log,\r\n error,\r\n warn\r\n} as const;\r\n\r\n\r\n\r\nfunction _buildConsoleMessage(vector: Readonly, decimalPlaces?: number): string {\r\n let message = \"[\";\r\n\r\n for (let i = 0; i < vector.length; i++) {\r\n if (i != 0) {\r\n message = message.concat(\", \");\r\n }\r\n\r\n if (decimalPlaces != null) {\r\n message = message.concat(vector[i].toFixed(decimalPlaces));\r\n } else {\r\n message = message.concat(vector[i].toString());\r\n }\r\n }\r\n\r\n message = message.concat(\"]\");\r\n return message;\r\n}", "import { Matrix3, Matrix4, Quaternion, Quaternion2, Vector, Vector2, Vector3, Vector4 } from \"../../../../cauldron/type_definitions/array_type_definitions.js\";\r\nimport { Mat3Utils } from \"../../../../cauldron/utils/array/mat3_utils.js\";\r\nimport { Mat4Utils } from \"../../../../cauldron/utils/array/mat4_utils.js\";\r\nimport { Quat2Utils } from \"../../../../cauldron/utils/array/quat2_utils.js\";\r\nimport { QuatUtils } from \"../../../../cauldron/utils/array/quat_utils.js\";\r\nimport { Vec2Utils } from \"../../../../cauldron/utils/array/vec2_utils.js\";\r\nimport { Vec3Utils } from \"../../../../cauldron/utils/array/vec3_utils.js\";\r\nimport { Vec4Utils } from \"../../../../cauldron/utils/array/vec4_utils.js\";\r\nimport { VecUtils } from \"../../../../cauldron/utils/array/vec_utils.js\";\r\n\r\nexport function vec_create(length: number): Vector;\r\nexport function vec_create(firstValue: number, ...remainingValues: number[]): Vector;\r\nexport function vec_create(firstValue: number, ...remainingValues: number[]): Vector {\r\n return VecUtils.create(firstValue, ...remainingValues);\r\n}\r\n\r\nexport function vec_getAllocationFunction(): (length: number) => Vector {\r\n return VecUtils.getAllocationFunction();\r\n}\r\n\r\nexport function vec_setAllocationFunction(allocationFunction: (length: number) => Vector): void {\r\n VecUtils.setAllocationFunction(allocationFunction);\r\n}\r\n\r\n\r\n\r\nexport function vec2_create(): Vector2;\r\nexport function vec2_create(x: number, y: number): Vector2;\r\nexport function vec2_create(uniformValue: number): Vector2;\r\nexport function vec2_create(x?: number, y?: number): Vector2 {\r\n return Vec2Utils.create(x!, y!);\r\n}\r\n\r\nexport function vec2_getAllocationFunction(): () => Vector2 {\r\n return Vec2Utils.getAllocationFunction();\r\n}\r\n\r\nexport function vec2_setAllocationFunction(allocationFunction: () => Vector2): void {\r\n Vec2Utils.setAllocationFunction(allocationFunction);\r\n}\r\n\r\n\r\n\r\nexport function vec3_create(): Vector3;\r\nexport function vec3_create(x: number, y: number, z: number): Vector3;\r\nexport function vec3_create(uniformValue: number): Vector3;\r\nexport function vec3_create(x?: number, y?: number, z?: number): Vector3 {\r\n return Vec3Utils.create(x!, y!, z!);\r\n}\r\n\r\nexport function vec3_getAllocationFunction(): () => Vector3 {\r\n return Vec3Utils.getAllocationFunction();\r\n}\r\n\r\nexport function vec3_setAllocationFunction(allocationFunction: () => Vector3): void {\r\n Vec3Utils.setAllocationFunction(allocationFunction);\r\n}\r\n\r\n\r\n\r\nexport function vec4_create(): Vector4;\r\nexport function vec4_create(x: number, y: number, z: number, w: number): Vector4;\r\nexport function vec4_create(uniformValue: number): Vector4;\r\nexport function vec4_create(x?: number, y?: number, z?: number, w?: number): Vector4 {\r\n return Vec4Utils.create(x!, y!, z!, w!);\r\n}\r\n\r\nexport function vec4_getAllocationFunction(): () => Vector4 {\r\n return Vec4Utils.getAllocationFunction();\r\n}\r\n\r\nexport function vec4_setAllocationFunction(allocationFunction: () => Vector4): void {\r\n Vec4Utils.setAllocationFunction(allocationFunction);\r\n}\r\n\r\n\r\n\r\nexport function quat_create(): Quaternion;\r\nexport function quat_create(x: number, y: number, z: number, w: number): Quaternion;\r\nexport function quat_create(uniformValue: number): Quaternion;\r\nexport function quat_create(x?: number, y?: number, z?: number, w?: number): Quaternion {\r\n return QuatUtils.create(x!, y!, z!, w!);\r\n}\r\n\r\nexport function quat_getAllocationFunction(): () => Quaternion {\r\n return QuatUtils.getAllocationFunction();\r\n}\r\n\r\nexport function quat_setAllocationFunction(allocationFunction: () => Quaternion): void {\r\n QuatUtils.setAllocationFunction(allocationFunction);\r\n}\r\n\r\n\r\n\r\nexport function quat2_create(): Quaternion2;\r\nexport function quat2_create(x1: number, y1: number, z1: number, w1: number, x2: number, y2: number, z2: number, w2: number): Quaternion2;\r\nexport function quat2_create(uniformValue: number): Quaternion2;\r\nexport function quat2_create(x1?: number, y1?: number, z1?: number, w1?: number, x2?: number, y2?: number, z2?: number, w2?: number): Quaternion2 {\r\n return Quat2Utils.create(x1!, y1!, z1!, w1!, x2!, y2!, z2!, w2!);\r\n}\r\n\r\nexport function quat2_getAllocationFunction(): () => Quaternion2 {\r\n return Quat2Utils.getAllocationFunction();\r\n}\r\n\r\nexport function quat2_setAllocationFunction(allocationFunction: () => Quaternion2): void {\r\n Quat2Utils.setAllocationFunction(allocationFunction);\r\n}\r\n\r\n\r\n\r\nexport function mat3_create(): Matrix3;\r\nexport function mat3_create(\r\n m00: number, m01: number, m02: number,\r\n m10: number, m11: number, m12: number,\r\n m20: number, m21: number, m22: number): Matrix3;\r\nexport function mat3_create(uniformValue: number): Matrix3;\r\nexport function mat3_create(\r\n m00?: number, m01?: number, m02?: number,\r\n m10?: number, m11?: number, m12?: number,\r\n m20?: number, m21?: number, m22?: number): Matrix3 {\r\n return Mat3Utils.create(\r\n m00!, m01!, m02!,\r\n m10!, m11!, m12!,\r\n m20!, m21!, m22!\r\n );\r\n}\r\n\r\nexport function mat3_getAllocationFunction(): () => Matrix3 {\r\n return Mat3Utils.getAllocationFunction();\r\n}\r\n\r\nexport function mat3_setAllocationFunction(allocationFunction: () => Matrix3): void {\r\n Mat3Utils.setAllocationFunction(allocationFunction);\r\n}\r\n\r\n\r\n\r\nexport function mat4_create(): Matrix4;\r\nexport function mat4_create(\r\n m00: number, m01: number, m02: number, m03: number,\r\n m10: number, m11: number, m12: number, m13: number,\r\n m20: number, m21: number, m22: number, m23: number,\r\n m30: number, m31: number, m32: number, m33: number): Matrix4;\r\nexport function mat4_create(uniformValue: number): Matrix4;\r\nexport function mat4_create(\r\n m00?: number, m01?: number, m02?: number, m03?: number,\r\n m10?: number, m11?: number, m12?: number, m13?: number,\r\n m20?: number, m21?: number, m22?: number, m23?: number,\r\n m30?: number, m31?: number, m32?: number, m33?: number): Matrix4 {\r\n return Mat4Utils.create(\r\n m00!, m01!, m02!, m03!,\r\n m10!, m11!, m12!, m13!,\r\n m20!, m21!, m22!, m23!,\r\n m30!, m31!, m32!, m33!\r\n );\r\n}\r\n\r\nexport function mat4_getAllocationFunction(): () => Matrix4 {\r\n return Mat4Utils.getAllocationFunction();\r\n}\r\n\r\nexport function mat4_setAllocationFunction(allocationFunction: () => Matrix4): void {\r\n Mat4Utils.setAllocationFunction(allocationFunction);\r\n}", "/**\r\n * Easy Tune Variables Examples\r\n * \r\n * Number: Globals.getEasyTuneVariables().add(new EasyTuneNumber(\"Float\", 1.00, (newValue) => this.myFloat = newValue, true, 2, 0.1)); \r\n * Number Array: Globals.getEasyTuneVariables().add(new EasyTuneNumberArray(\"Float Array\", [1.00, 2.00, 3.00], (newValue) => this.myFloatArray.pp_copy(newValue), true, 2, 0.1)); \r\n * Int: Globals.getEasyTuneVariables().add(new EasyTuneInt(\"Int\", this.myInt, (newValue) => this.myInt = newValue, true, 1)); \r\n * Int Array: Globals.getEasyTuneVariables().add(new EasyTuneIntArray(\"Int Array\", [1, 2, 3], (newValue) => this.myIntArray.pp_copy(newValue), true, 1)); \r\n * Bool: Globals.getEasyTuneVariables().add(new EasyTuneBool(\"Bool\", this.myBool, (newValue) => this.myBool = newValue, true)); \r\n * Bool Array: Globals.getEasyTuneVariables().add(new EasyTuneBoolArray(\"Bool Array\", [false, true, false], (newValue) => this.myBoolArray.pp_copy(newValue), true)); \r\n * Transform: Globals.getEasyTuneVariables().add(new EasyTuneTransform(\"Transform\", mat4_create(), (newValue) => this.myTransform.mat4_copy(newValue), true, true, 3));\r\n */\r\n\r\n// #WARN some private variables are unused because they are used by the js widget! Maybe when that will be converted to ts I will fix that to a getter\r\n// but for now do not delete them\r\n\r\nimport { Emitter, WonderlandEngine } from \"@wonderlandengine/api\";\r\nimport { ArrayLike, Matrix4, Vector3 } from \"../../cauldron/type_definitions/array_type_definitions.js\";\r\nimport { MathUtils } from \"../../cauldron/utils/math_utils.js\";\r\nimport { mat4_create, vec3_create } from \"../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Globals } from \"../../pp/globals.js\";\r\nimport { EasyTuneUtils } from \"./easy_tune_utils.js\";\r\n\r\nexport enum EasyTuneVariableType {\r\n NONE = 0,\r\n NUMBER = 1,\r\n BOOL = 2,\r\n TRANSFORM = 3\r\n}\r\n\r\nexport class EasyTuneVariableExtraParams {\r\n public myAutoImportEnabled: boolean | null = null;\r\n public myManualImportEnabled: boolean | null = null;\r\n public myExportEnabled: boolean | null = null;\r\n\r\n constructor(autoimportEnabled: boolean | null = null, manualImportEnabled: boolean | null = null, exportEnabled: boolean | null = null) {\r\n this.myAutoImportEnabled = autoimportEnabled;\r\n this.myManualImportEnabled = manualImportEnabled;\r\n this.myExportEnabled = exportEnabled;\r\n }\r\n}\r\n\r\nexport abstract class EasyTuneVariable {\r\n private readonly _myType: EasyTuneVariableType;\r\n\r\n private _myName: string;\r\n\r\n protected abstract _myValue: unknown;\r\n protected abstract _myDefaultValue: unknown;\r\n\r\n private _myShowOnWidget: boolean;\r\n private _myAutoImportEnabled: boolean;\r\n private _myManualImportEnabled: boolean;\r\n private _myExportEnabled: boolean;\r\n\r\n private _myWidgetCurrentVariable: boolean = false;\r\n\r\n private readonly _myValueChangedEmitter: Emitter<[unknown, EasyTuneVariable]> = new Emitter();\r\n\r\n protected readonly _myEngine: Readonly;\r\n\r\n constructor(type: EasyTuneVariableType, name: string, valueChangedEventListener: ((value: unknown, easyTuneVariable: EasyTuneVariable) => void) | null = null, showOnWidget: boolean = true, extraParams: Readonly = new EasyTuneVariableExtraParams(), engine: Readonly = Globals.getMainEngine()!) {\r\n this._myType = type;\r\n\r\n this._myName = name;\r\n\r\n this._myShowOnWidget = showOnWidget;\r\n this._myAutoImportEnabled = extraParams.myAutoImportEnabled ?? EasyTuneUtils.getAutoImportEnabledDefaultValue(engine);\r\n this._myManualImportEnabled = extraParams.myManualImportEnabled ?? EasyTuneUtils.getManualImportEnabledDefaultValue(engine);\r\n this._myExportEnabled = extraParams.myExportEnabled ?? EasyTuneUtils.getExportEnabledDefaultValue(engine);\r\n\r\n this._myWidgetCurrentVariable = false;\r\n\r\n this._myValueChangedEmitter = new Emitter(); // Signature: listener(value, easyTuneVariables)\r\n\r\n this._myEngine = engine;\r\n\r\n if (valueChangedEventListener != null) {\r\n this.registerValueChangedEventListener(this, valueChangedEventListener);\r\n }\r\n }\r\n\r\n public getName(): string {\r\n return this._myName;\r\n }\r\n\r\n public setName(name: string): this {\r\n if (this._myName != name) {\r\n this._myName = name;\r\n EasyTuneUtils.refreshWidget(this._myEngine);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n public getType(): EasyTuneVariableType {\r\n return this._myType;\r\n }\r\n\r\n public isWidgetCurrentVariable(): boolean {\r\n return this._myWidgetCurrentVariable;\r\n }\r\n\r\n public setWidgetCurrentVariable(widgetCurrentVariable: boolean): this {\r\n this._myWidgetCurrentVariable = widgetCurrentVariable;\r\n return this;\r\n }\r\n\r\n public getValue(): unknown {\r\n return this._myValue;\r\n }\r\n\r\n public setValue(value: unknown, resetDefaultValue: boolean = false, skipValueChangedNotify: boolean = false): this {\r\n const valueChanged = this._myValue != null && this._myValue != value;\r\n\r\n this._myValue = value;\r\n\r\n if (resetDefaultValue) {\r\n this.setDefaultValue(value);\r\n }\r\n\r\n EasyTuneUtils.refreshWidget(this._myEngine);\r\n\r\n if (valueChanged && !skipValueChangedNotify) {\r\n this._notifyValueChanged();\r\n }\r\n\r\n return this;\r\n }\r\n\r\n public getDefaultValue(): unknown {\r\n return this._myDefaultValue;\r\n }\r\n\r\n public isValueEqual(otherValue: unknown): boolean {\r\n return this._myValue == otherValue;\r\n }\r\n\r\n public setDefaultValue(value: unknown): this {\r\n this._myDefaultValue = value;\r\n return this;\r\n }\r\n\r\n public isShownOnWidget(): boolean {\r\n return this._myShowOnWidget;\r\n }\r\n\r\n public setShowOnWidget(showOnWidget: boolean): this {\r\n this._myShowOnWidget = showOnWidget;\r\n return this;\r\n }\r\n\r\n public isManualImportEnabled(): boolean {\r\n return this._myManualImportEnabled;\r\n }\r\n\r\n public isAutoImportEnabled(): boolean {\r\n return this._myAutoImportEnabled;\r\n }\r\n\r\n public isExportEnabled(): boolean {\r\n return this._myExportEnabled;\r\n }\r\n\r\n public setManualImportEnabled(enabled: boolean): this {\r\n this._myManualImportEnabled = enabled;\r\n return this;\r\n }\r\n\r\n public setAutoImportEnabled(enabled: boolean): this {\r\n this._myAutoImportEnabled = enabled;\r\n return this;\r\n }\r\n\r\n public setExportEnabled(enabled: boolean): this {\r\n this._myExportEnabled = enabled;\r\n return this;\r\n }\r\n\r\n public setEasyTuneVariableExtraParams(extraParams: Readonly): this {\r\n this.setAutoImportEnabled(extraParams.myAutoImportEnabled ?? EasyTuneUtils.getAutoImportEnabledDefaultValue(this._myEngine));\r\n this.setManualImportEnabled(extraParams.myManualImportEnabled ?? EasyTuneUtils.getManualImportEnabledDefaultValue(this._myEngine));\r\n this.setExportEnabled(extraParams.myExportEnabled ?? EasyTuneUtils.getExportEnabledDefaultValue(this._myEngine));\r\n\r\n return this;\r\n }\r\n\r\n public fromJSON(valueJSON: string, resetDefaultValue: boolean = false, skipValueChangedNotify: boolean = false): this {\r\n this.setValue(JSON.parse(valueJSON), resetDefaultValue, skipValueChangedNotify);\r\n return this;\r\n }\r\n\r\n public toJSON(): string {\r\n return JSON.stringify(this.getValue());\r\n }\r\n\r\n /**\r\n * @param id if `undefined` is used as id, it will overwrite the default variable listener\r\n */\r\n public registerValueChangedEventListener(id: unknown, listener: (value: unknown, easyTuneVariable: EasyTuneVariable) => void): this {\r\n if (id !== undefined) {\r\n this._myValueChangedEmitter.add(listener, { id: id });\r\n } else {\r\n this._myValueChangedEmitter.add(listener, { id: this });\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * @param id if `undefined` is used as id, it will unregister the default variable listener\r\n */\r\n public unregisterValueChangedEventListener(id?: unknown): this {\r\n if (id !== undefined) {\r\n this._myValueChangedEmitter.remove(id);\r\n } else {\r\n this._myValueChangedEmitter.remove(this);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n protected _notifyValueChanged(): void {\r\n this._myValueChangedEmitter.notify(this.getValue(), this);\r\n }\r\n}\r\n\r\nexport abstract class EasyTuneVariableTyped extends EasyTuneVariable {\r\n protected abstract override _myValue: T;\r\n protected abstract override _myDefaultValue: T;\r\n\r\n constructor(type: EasyTuneVariableType, name: string, valueChangedEventListener?: ((value: Readonly, easyTuneVariable: EasyTuneVariable) => void) | null, showOnWidget?: boolean, extraParams?: Readonly, engine?: Readonly) {\r\n super(type, name, valueChangedEventListener as (value: unknown, easyTuneVariable: EasyTuneVariable) => void, showOnWidget, extraParams, engine);\r\n }\r\n\r\n public override getValue(): Readonly {\r\n return super.getValue() as T;\r\n }\r\n\r\n public override setValue(value: Readonly, resetDefaultValue?: boolean, skipValueChangedNotify?: boolean): this {\r\n return super.setValue(value, resetDefaultValue, skipValueChangedNotify);\r\n }\r\n\r\n public override isValueEqual(otherValue: Readonly): boolean {\r\n return this._myValue == otherValue;\r\n }\r\n\r\n public override getDefaultValue(): Readonly {\r\n return super.getDefaultValue() as T;\r\n }\r\n\r\n public override setDefaultValue(value: Readonly): this {\r\n return super.setDefaultValue(value);\r\n }\r\n\r\n public override registerValueChangedEventListener(id: unknown, listener: (value: Readonly, easyTuneVariable: EasyTuneVariable) => void): this {\r\n return super.registerValueChangedEventListener(id, listener as (value: unknown, easyTuneVariable: EasyTuneVariable) => void);\r\n }\r\n\r\n public override unregisterValueChangedEventListener(id?: unknown): this {\r\n return super.unregisterValueChangedEventListener(id);\r\n }\r\n}\r\n\r\nexport abstract class EasyTuneVariableArray, ArrayElementType> extends EasyTuneVariableTyped {\r\n protected override _myValue!: ArrayType;\r\n protected override _myDefaultValue!: ArrayType;\r\n\r\n constructor(type: EasyTuneVariableType, name: string, value: ArrayType, valueChangedEventListener?: ((value: Readonly, easyTuneVariable: EasyTuneVariable) => void) | null, showOnWidget?: boolean, extraParams?: Readonly, engine?: Readonly) {\r\n super(type, name, valueChangedEventListener, showOnWidget, extraParams, engine);\r\n\r\n this.setValue(value, true, true);\r\n }\r\n\r\n public override setValue(value: Readonly, resetDefaultValue: boolean = false, skipValueChangedNotify: boolean = false): this {\r\n const valueChanged = this._myValue != null && !this._myValue.pp_equals(value);\r\n\r\n if (this._myValue == null) {\r\n this._myValue = value.pp_clone();\r\n } else {\r\n this._myValue.pp_copy(value);\r\n }\r\n\r\n if (resetDefaultValue) {\r\n this.setDefaultValue(value);\r\n }\r\n\r\n EasyTuneUtils.refreshWidget(this._myEngine);\r\n\r\n if (valueChanged && !skipValueChangedNotify) {\r\n this._notifyValueChanged();\r\n }\r\n\r\n return this;\r\n }\r\n\r\n public override setDefaultValue(value: Readonly): this {\r\n if (this._myDefaultValue == null) {\r\n this._myDefaultValue = value.pp_clone();\r\n } else {\r\n this._myDefaultValue.pp_copy(value);\r\n }\r\n\r\n return this;\r\n }\r\n}\r\n\r\n\r\n// NUMBER\r\n\r\nexport class EasyTuneNumberArray extends EasyTuneVariableArray, number> {\r\n\r\n private _myDecimalPlaces: number;\r\n private _myStepPerSecond: number;\r\n\r\n private _myDefaultStepPerSecond: number;\r\n\r\n private _myMin: number;\r\n private _myMax: number;\r\n\r\n private _myEditAllValuesTogether: boolean;\r\n\r\n constructor(name: string, value: Readonly>, valueChangedEventListener?: ((value: Readonly>, easyTuneVariable: EasyTuneVariable) => void) | null, showOnWidget?: boolean, decimalPlaces: number = 3, stepPerSecond: number = 1, min: number = -Number.MAX_VALUE, max: number = Number.MAX_VALUE, editAllValuesTogether: boolean = false, extraParams?: Readonly, engine?: Readonly) {\r\n super(EasyTuneVariableType.NUMBER, name, value, valueChangedEventListener, showOnWidget, extraParams, engine);\r\n\r\n this._myDecimalPlaces = decimalPlaces;\r\n this._myStepPerSecond = stepPerSecond;\r\n\r\n this._myDefaultStepPerSecond = this._myStepPerSecond;\r\n\r\n this._myMin = min;\r\n this._myMax = max;\r\n\r\n this._myEditAllValuesTogether = editAllValuesTogether;\r\n\r\n this._clampValue(true, true);\r\n }\r\n\r\n public override isValueEqual(otherValue: Readonly>, epsilon: number = MathUtils.EPSILON): boolean {\r\n return this._myValue.vec_equals(otherValue, epsilon);\r\n }\r\n\r\n public setMax(max: number): this {\r\n this._myMax = max;\r\n this._clampValue(false);\r\n return this;\r\n }\r\n\r\n public setMin(min: number): this {\r\n this._myMin = min;\r\n this._clampValue(false);\r\n return this;\r\n }\r\n\r\n public override toJSON(): string {\r\n return this.getValue().vec_toString();\r\n }\r\n\r\n private _clampValue(resetDefaultValue: boolean, skipValueChangedNotify: boolean = false): void {\r\n const clampedValue = this._myValue.vec_clamp(this._myMin, this._myMax);\r\n\r\n if (!resetDefaultValue) {\r\n const clampedDefaultValue = this.getDefaultValue().vec_clamp(this._myMin, this._myMax);\r\n this.setDefaultValue(clampedDefaultValue);\r\n }\r\n\r\n this.setValue(clampedValue, resetDefaultValue, skipValueChangedNotify);\r\n }\r\n}\r\n\r\nexport class EasyTuneIntArray extends EasyTuneNumberArray {\r\n\r\n constructor(name: string, value: Readonly>, valueChangedEventListener?: ((value: Readonly>, easyTuneVariable: EasyTuneVariable) => void) | null, showOnWidget?: boolean, stepPerSecond?: number, min: number = -Number.MAX_VALUE, max: number = Number.MAX_VALUE, editAllValuesTogether?: boolean, extraParams?: Readonly, engine?: Readonly) {\r\n const roundedValue = value.pp_clone();\r\n\r\n for (let i = 0; i < value.length; i++) {\r\n roundedValue[i] = Math.round(roundedValue[i]);\r\n }\r\n\r\n super(name, roundedValue, valueChangedEventListener, showOnWidget, 0, stepPerSecond, Math.round(min), Math.round(max), editAllValuesTogether, extraParams, engine);\r\n }\r\n}\r\n\r\nexport class EasyTuneNumber extends EasyTuneVariableTyped {\r\n\r\n protected override _myValue!: number;\r\n protected override _myDefaultValue!: number;\r\n\r\n private _myDecimalPlaces: number;\r\n private _myStepPerSecond: number;\r\n\r\n private _myDefaultStepPerSecond: number;\r\n\r\n private _myMin: number;\r\n private _myMax: number;\r\n\r\n constructor(name: string, value: number, valueChangedEventListener?: ((value: number, easyTuneVariable: EasyTuneVariable) => void) | null, showOnWidget?: boolean, decimalPlaces: number = 3, stepPerSecond: number = 1, min: number = -Number.MAX_VALUE, max: number = Number.MAX_VALUE, extraParams?: Readonly, engine?: Readonly) {\r\n super(EasyTuneVariableType.NUMBER, name, valueChangedEventListener, showOnWidget, extraParams, engine);\r\n\r\n this.setValue(value, true, true);\r\n\r\n this._myDecimalPlaces = decimalPlaces;\r\n this._myStepPerSecond = stepPerSecond;\r\n\r\n this._myDefaultStepPerSecond = this._myStepPerSecond;\r\n\r\n this._myMin = min;\r\n this._myMax = max;\r\n\r\n this._clampValue(true, true);\r\n }\r\n\r\n public override isValueEqual(otherValue: Readonly, epsilon: number = MathUtils.EPSILON): boolean {\r\n return Math.abs(this._myValue - otherValue) < epsilon;\r\n }\r\n\r\n public setMax(max: number): this {\r\n this._myMax = max;\r\n this._clampValue(false);\r\n return this;\r\n }\r\n\r\n public setMin(min: number): this {\r\n this._myMin = min;\r\n this._clampValue(false);\r\n return this;\r\n }\r\n\r\n public override toJSON(): string {\r\n return JSON.stringify(this.getValue());\r\n }\r\n\r\n private _clampValue(resetDefaultValue: boolean, skipValueChangedNotify: boolean = false): void {\r\n const clampedValue = MathUtils.clamp(this._myValue, this._myMin, this._myMax);\r\n\r\n if (!resetDefaultValue) {\r\n const clampedDefaultValue = MathUtils.clamp(this.getDefaultValue(), this._myMin, this._myMax);\r\n this.setDefaultValue(clampedDefaultValue);\r\n }\r\n\r\n this.setValue(clampedValue, resetDefaultValue, skipValueChangedNotify);\r\n }\r\n}\r\n\r\nexport class EasyTuneInt extends EasyTuneNumber {\r\n\r\n constructor(name: string, value: number, valueChangedEventListener?: ((value: number, easyTuneVariable: EasyTuneVariable) => void) | null, showOnWidget?: boolean, stepPerSecond?: number, min?: number, max?: number, extraParams?: Readonly, engine?: Readonly) {\r\n super(name, value, valueChangedEventListener, showOnWidget, 0, stepPerSecond, min, max, extraParams, engine);\r\n }\r\n}\r\n\r\n// BOOL\r\n\r\nexport class EasyTuneBoolArray extends EasyTuneVariableArray, boolean> {\r\n\r\n constructor(name: string, value: Readonly>, valueChangedEventListener?: ((value: Readonly>, easyTuneVariable: EasyTuneVariable) => void) | null, showOnWidget?: boolean, extraParams?: Readonly, engine?: Readonly) {\r\n super(EasyTuneVariableType.BOOL, name, value, valueChangedEventListener, showOnWidget, extraParams, engine);\r\n }\r\n}\r\n\r\nexport class EasyTuneBool extends EasyTuneVariableTyped {\r\n\r\n protected override _myValue!: boolean;\r\n protected override _myDefaultValue!: boolean;\r\n\r\n constructor(name: string, value: boolean, valueChangedEventListener?: ((value: boolean, easyTuneVariable: EasyTuneVariable) => void) | null, showOnWidget?: boolean, extraParams?: Readonly, engine?: Readonly) {\r\n super(EasyTuneVariableType.BOOL, name, valueChangedEventListener, showOnWidget, extraParams, engine);\r\n\r\n this.setValue(value, true, true);\r\n }\r\n}\r\n\r\n// EASY TUNE EASY TRANSFORM\r\n\r\nexport class EasyTuneTransform extends EasyTuneVariableTyped {\r\n protected override _myValue: Matrix4 = mat4_create();\r\n protected override _myDefaultValue: Matrix4 = mat4_create();\r\n\r\n private _myDecimalPlaces: number;\r\n\r\n private readonly _myPosition: Vector3 = vec3_create();\r\n private readonly _myRotation: Vector3 = vec3_create();\r\n private readonly _myScale: Vector3 = vec3_create();\r\n\r\n private _myScaleAsOne: boolean;\r\n\r\n private _myPositionStepPerSecond: number;\r\n private _myRotationStepPerSecond: number;\r\n private _myScaleStepPerSecond: number;\r\n\r\n private readonly _myDefaultPosition: Vector3 = vec3_create();\r\n private readonly _myDefaultRotation: Vector3 = vec3_create();\r\n private readonly _myDefaultScale: Vector3 = vec3_create();\r\n\r\n private _myDefaultPositionStepPerSecond: number;\r\n private _myDefaultRotationStepPerSecond: number;\r\n private _myDefaultScaleStepPerSecond: number;\r\n\r\n constructor(name: string, value: Readonly, valueChangedEventListener?: ((value: Readonly, easyTuneVariable: EasyTuneVariable) => void) | null, showOnWidget?: boolean, scaleAsOne: boolean = true, decimalPlaces: number = 3, positionStepPerSecond: number = 1, rotationStepPerSecond: number = 50, scaleStepPerSecond: number = 1, extraParams?: Readonly, engine?: Readonly) {\r\n super(EasyTuneVariableType.TRANSFORM, name, valueChangedEventListener, showOnWidget, extraParams, engine);\r\n\r\n this._myDecimalPlaces = decimalPlaces;\r\n\r\n this.setValue(value, true, true);\r\n\r\n // To avoid having a 0 scale that can mess up the transform\r\n const decimalPlacesMultiplier = Math.pow(10, this._myDecimalPlaces);\r\n for (let i = 0; i < 3; i++) {\r\n this._myScale[i] = Math.max(this._myScale[i], 1 / decimalPlacesMultiplier);\r\n }\r\n\r\n this._myValue.mat4_setPosition(this._myPosition);\r\n this._myValue.mat4_setRotationDegrees(this._myRotation);\r\n this._myValue.mat4_setScale(this._myScale);\r\n\r\n this.setValue(this._myValue, true, true);\r\n\r\n this._myScaleAsOne = scaleAsOne;\r\n\r\n this._myPositionStepPerSecond = positionStepPerSecond;\r\n this._myRotationStepPerSecond = rotationStepPerSecond;\r\n this._myScaleStepPerSecond = scaleStepPerSecond;\r\n\r\n this._myDefaultPositionStepPerSecond = this._myPositionStepPerSecond;\r\n this._myDefaultRotationStepPerSecond = this._myRotationStepPerSecond;\r\n this._myDefaultScaleStepPerSecond = this._myScaleStepPerSecond;\r\n }\r\n\r\n private static readonly _setValueSV =\r\n {\r\n oldValue: mat4_create()\r\n };\r\n public override setValue(value: Readonly, resetDefaultValue = false, skipValueChangedNotify: boolean = false): this {\r\n const oldValue = EasyTuneTransform._setValueSV.oldValue;\r\n oldValue.mat4_copy(this._myValue);\r\n\r\n this._myValue.mat4_copy(value);\r\n\r\n this._myValue.mat4_getPosition(this._myPosition);\r\n this._myValue.mat4_getRotationDegrees(this._myRotation);\r\n this._myValue.mat4_getScale(this._myScale);\r\n\r\n const valueChanged = !oldValue.pp_equals(this._myValue);\r\n\r\n if (resetDefaultValue) {\r\n this.setDefaultValue(value);\r\n }\r\n\r\n EasyTuneUtils.refreshWidget(this._myEngine);\r\n\r\n if (valueChanged && !skipValueChangedNotify) {\r\n this._notifyValueChanged();\r\n }\r\n\r\n return this;\r\n }\r\n\r\n public override isValueEqual(otherValue: Readonly, epsilon: number = MathUtils.EPSILON): boolean {\r\n return this._myValue.vec_equals(otherValue, epsilon);\r\n }\r\n\r\n public override setDefaultValue(value: Readonly): this {\r\n this._myDefaultValue.mat4_copy(value);\r\n\r\n this._myDefaultValue.mat4_getPosition(this._myDefaultPosition);\r\n this._myDefaultValue.mat4_getRotationDegrees(this._myDefaultRotation);\r\n this._myDefaultValue.mat4_getScale(this._myDefaultScale);\r\n\r\n return this;\r\n }\r\n\r\n public override toJSON(): string {\r\n return this.getValue().vec_toString();\r\n }\r\n}", "import { WonderlandEngine } from \"@wonderlandengine/api\";\r\nimport { Globals } from \"../../pp/globals.js\";\r\n\r\nconst _mySetWidgetCurrentVariableCallbacks: WeakMap, Map void>> = new WeakMap();\r\nconst _myRefreshWidgetCallbacks: WeakMap, Map void>> = new WeakMap();\r\n\r\nconst _myAutoImportEnabledDefaultValues: WeakMap, boolean> = new WeakMap();\r\nconst _myManualImportEnabledDefaultValues: WeakMap, boolean> = new WeakMap();\r\nconst _myExportEnabledDefaultValues: WeakMap, boolean> = new WeakMap();\r\n\r\nexport function setWidgetCurrentVariable(variableName: string, engine: Readonly = Globals.getMainEngine()!): void {\r\n if (_mySetWidgetCurrentVariableCallbacks.has(engine)) {\r\n for (const callback of _mySetWidgetCurrentVariableCallbacks.get(engine)!.values()) {\r\n callback(variableName);\r\n }\r\n }\r\n}\r\n\r\nexport function refreshWidget(engine: Readonly = Globals.getMainEngine()!): void {\r\n if (_myRefreshWidgetCallbacks.has(engine)) {\r\n for (const callback of _myRefreshWidgetCallbacks.get(engine)!.values()) {\r\n callback();\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * @param fileURL Can contain parameters inside brackets, like `my-url.com/{param}`, which will be replaced with the same one on the current page url, like `www.currentpage.com/?param=2` \r\n * If `null` or empty, it will import from the clipboard\r\n */\r\nexport function importVariables(fileURL: string | null = null, resetVariablesDefaultValueOnImport: boolean = false, skipValueChangedNotifyOnImport: boolean = false, manualImport: boolean = false, onSuccessCallback?: () => void, onFailureCallback?: () => void, engine: Readonly = Globals.getMainEngine()!): void {\r\n if (fileURL == null || fileURL.length == 0) {\r\n if (navigator.clipboard) {\r\n navigator.clipboard.readText().then(\r\n function (clipboard) {\r\n Globals.getEasyTuneVariables(engine)!.fromJSON(clipboard, resetVariablesDefaultValueOnImport, skipValueChangedNotifyOnImport, manualImport);\r\n\r\n EasyTuneUtils.refreshWidget(engine);\r\n\r\n if (onSuccessCallback != null) {\r\n onSuccessCallback();\r\n }\r\n\r\n console.log(\"Easy Tune Variables Imported from: clipboard\");\r\n console.log(clipboard);\r\n }\r\n ).catch(function (reason) {\r\n if (onFailureCallback != null) {\r\n onFailureCallback();\r\n }\r\n\r\n console.error(\"An error occurred while importing the easy tune variables from: clipboard\");\r\n console.error(reason);\r\n });\r\n }\r\n } else {\r\n const replacedFileURL = _importExportVariablesReplaceFileURLParams(fileURL);\r\n\r\n fetch(replacedFileURL).then(\r\n function (response) {\r\n if (response.ok) {\r\n response.text().then(\r\n function (text) {\r\n Globals.getEasyTuneVariables(engine)!.fromJSON(text, resetVariablesDefaultValueOnImport, skipValueChangedNotifyOnImport, manualImport);\r\n\r\n EasyTuneUtils.refreshWidget(engine);\r\n\r\n if (onSuccessCallback != null) {\r\n onSuccessCallback();\r\n }\r\n\r\n console.log(\"Easy Tune Variables Imported from:\", replacedFileURL);\r\n console.log(text);\r\n }\r\n ).catch(function (reason) {\r\n if (onFailureCallback != null) {\r\n onFailureCallback();\r\n }\r\n\r\n console.error(\"An error occurred while importing the easy tune variables from:\", replacedFileURL);\r\n console.error(reason);\r\n });\r\n } else {\r\n if (onFailureCallback != null) {\r\n onFailureCallback();\r\n }\r\n\r\n console.error(\"An error occurred while importing the easy tune variables from:\", replacedFileURL);\r\n console.error(response);\r\n }\r\n }\r\n ).catch(function (reason) {\r\n if (onFailureCallback != null) {\r\n onFailureCallback();\r\n }\r\n\r\n console.error(\"An error occurred while importing the easy tune variables from:\", replacedFileURL);\r\n console.error(reason);\r\n });\r\n }\r\n\r\n EasyTuneUtils.refreshWidget(engine);\r\n}\r\n\r\n\r\n/**\r\n * @param fileURL Can contain parameters inside brackets, like `my-url.com/{param}`, which will be replaced with the same one on the current page url, like `www.currentpage.com/?param=2` \r\n * If `null` or empty, it will import from the clipboard\r\n */\r\nexport function getImportVariablesJSON(fileURL: string | null = null, onSuccessCallback?: (variablesJSON: string) => void, onFailureCallback?: () => void, engine: Readonly = Globals.getMainEngine()!): void {\r\n if (fileURL == null || fileURL.length == 0) {\r\n if (navigator.clipboard) {\r\n navigator.clipboard.readText().then(\r\n function (clipboard) {\r\n if (onSuccessCallback != null) {\r\n onSuccessCallback(clipboard);\r\n }\r\n }\r\n ).catch(function (reason) {\r\n if (onFailureCallback != null) {\r\n onFailureCallback();\r\n }\r\n });\r\n }\r\n } else {\r\n const replacedFileURL = _importExportVariablesReplaceFileURLParams(fileURL);\r\n\r\n fetch(replacedFileURL).then(\r\n function (response) {\r\n if (response.ok) {\r\n response.text().then(\r\n function (text) {\r\n if (onSuccessCallback != null) {\r\n onSuccessCallback(text);\r\n }\r\n }\r\n ).catch(function (reason) {\r\n if (onFailureCallback != null) {\r\n onFailureCallback();\r\n }\r\n });\r\n } else {\r\n if (onFailureCallback != null) {\r\n onFailureCallback();\r\n }\r\n }\r\n }\r\n ).catch(function (reason) {\r\n if (onFailureCallback != null) {\r\n onFailureCallback();\r\n }\r\n });\r\n }\r\n}\r\n\r\n\r\n/**\r\n * @param fileURL Can contain parameters inside brackets, like `my-url.com/{param}`, which will be replaced with the same one on the current page url, like `www.currentpage.com/?param=2` \r\n * If `null` or empty, it will import from the clipboard\r\n */\r\nexport function exportVariables(fileURL: string | null = null, excludeVariablesWithValueAsDefault: boolean, variablesToKeep?: Record, onSuccessCallback?: () => void, onFailureCallback?: () => void, engine: Readonly = Globals.getMainEngine()!): void {\r\n const variablesJSONToExport = Globals.getEasyTuneVariables(engine)!.toJSON(excludeVariablesWithValueAsDefault);\r\n EasyTuneUtils.exportVariablesJSON(variablesJSONToExport, fileURL, variablesToKeep, onSuccessCallback, onFailureCallback, engine);\r\n}\r\n\r\n\r\n/**\r\n * @param fileURL Can contain parameters inside brackets, like `my-url.com/{param}`, which will be replaced with the same one on the current page url, like `www.currentpage.com/?param=2` \r\n * If `null` or empty, it will import from the clipboard\r\n */\r\nexport function exportVariablesByName(variableNamesToExport: string[], fileURL: string | null = null, excludeVariablesWithValueAsDefault: boolean, variablesToKeep?: Record, onSuccessCallback?: () => void, onFailureCallback?: () => void, engine: Readonly = Globals.getMainEngine()!): void {\r\n const objectJSON: Record = {};\r\n\r\n const easyTuneVariables = Globals.getEasyTuneVariables(engine)!;\r\n for (const variableName of variableNamesToExport) {\r\n const variable = easyTuneVariables.getEasyTuneVariable(variableName);\r\n if (variable != null && variable.isExportEnabled()) {\r\n if (!excludeVariablesWithValueAsDefault || !variable.isValueEqual(variable.getDefaultValue())) {\r\n objectJSON[variable.getName()] = variable.toJSON();\r\n }\r\n }\r\n }\r\n\r\n const variablesJSONToExport = JSON.stringify(objectJSON);\r\n EasyTuneUtils.exportVariablesJSON(variablesJSONToExport, fileURL, variablesToKeep, onSuccessCallback, onFailureCallback, engine);\r\n}\r\n\r\n\r\n/**\r\n * @param fileURL Can contain parameters inside brackets, like `my-url.com/{param}`, which will be replaced with the same one on the current page url, like `www.currentpage.com/?param=2` \r\n * If `null` or empty, it will import from the clipboard\r\n */\r\nexport function exportVariablesJSON(variablesJSONToExport: string, fileURL: string | null = null, variablesToKeep?: Record, onSuccessCallback?: () => void, onFailureCallback?: () => void, engine: Readonly = Globals.getMainEngine()!): void {\r\n // Useful if some variables are not in the json export and therefore would not be there anymore\r\n if (variablesToKeep != null) {\r\n try {\r\n const variablesToExport = JSON.parse(variablesJSONToExport);\r\n for (const variableName in variablesToKeep) {\r\n if (!(variableName in variablesToExport)) {\r\n variablesToExport[variableName] = variablesToKeep[variableName];\r\n }\r\n }\r\n\r\n variablesJSONToExport = JSON.stringify(variablesToExport);\r\n } catch (error) {\r\n // Do nothing\r\n }\r\n }\r\n\r\n if (fileURL == null || fileURL.length == 0) {\r\n if (navigator.clipboard) {\r\n navigator.clipboard.writeText(variablesJSONToExport).then(\r\n function () {\r\n if (onSuccessCallback != null) {\r\n onSuccessCallback();\r\n }\r\n\r\n console.log(\"Easy Tune Variables Exported to: clipboard\");\r\n console.log(variablesJSONToExport);\r\n },\r\n function () {\r\n if (onFailureCallback != null) {\r\n onFailureCallback();\r\n }\r\n\r\n console.error(\"An error occurred while exporting the easy tune variables to: clipboard\");\r\n }\r\n ).catch(function (reason) {\r\n if (onFailureCallback != null) {\r\n onFailureCallback();\r\n }\r\n\r\n console.error(\"An error occurred while exporting the easy tune variables to: clipboard\");\r\n console.error(reason);\r\n });\r\n }\r\n } else {\r\n const replacedFileURL = _importExportVariablesReplaceFileURLParams(fileURL);\r\n\r\n fetch(replacedFileURL, {\r\n headers: {\r\n \"Accept\": \"application/json\",\r\n \"Content-Type\": \"application/json\"\r\n },\r\n method: \"POST\",\r\n body: variablesJSONToExport\r\n }).then(\r\n function (response) {\r\n if (response.ok) {\r\n if (onSuccessCallback != null) {\r\n onSuccessCallback();\r\n }\r\n\r\n console.log(\"Easy Tune Variables Exported to:\", replacedFileURL);\r\n console.log(variablesJSONToExport);\r\n } else {\r\n if (onFailureCallback != null) {\r\n onFailureCallback();\r\n }\r\n\r\n console.error(\"An error occurred while exporting the easy tune variables to:\", replacedFileURL);\r\n console.error(response);\r\n }\r\n },\r\n function (response) {\r\n if (onFailureCallback != null) {\r\n onFailureCallback();\r\n }\r\n\r\n console.error(\"An error occurred while exporting the easy tune variables to:\", replacedFileURL);\r\n console.error(response);\r\n }\r\n ).catch(function (reason) {\r\n if (onFailureCallback != null) {\r\n onFailureCallback();\r\n }\r\n\r\n console.error(\"An error occurred while exporting the easy tune variables to:\", replacedFileURL);\r\n console.error(reason);\r\n });\r\n }\r\n}\r\n\r\n\r\n/**\r\n * @param fileURL Can contain parameters inside brackets, like `my-url.com/{param}`, which will be replaced with the same one on the current page url, like `www.currentpage.com/?param=2` \r\n * If `null` or empty, it will import from the clipboard\r\n */\r\nexport function clearExportedVariables(fileURL: string | null = null, onSuccessCallback?: () => void, onFailureCallback?: () => void, engine: Readonly = Globals.getMainEngine()!): void {\r\n EasyTuneUtils.exportVariablesJSON(\"\", fileURL, undefined, onSuccessCallback, onFailureCallback, engine);\r\n}\r\n\r\nexport function setAutoImportEnabledDefaultValue(defaultValue: boolean, engine: Readonly = Globals.getMainEngine()!): void {\r\n _myAutoImportEnabledDefaultValues.set(engine, defaultValue);\r\n}\r\n\r\nexport function setManualImportEnabledDefaultValue(defaultValue: boolean, engine: Readonly = Globals.getMainEngine()!): void {\r\n _myManualImportEnabledDefaultValues.set(engine, defaultValue);\r\n}\r\n\r\nexport function setExportEnabledDefaultValue(defaultValue: boolean, engine: Readonly = Globals.getMainEngine()!): void {\r\n _myExportEnabledDefaultValues.set(engine, defaultValue);\r\n}\r\n\r\nexport function getAutoImportEnabledDefaultValue(engine: Readonly = Globals.getMainEngine()!): boolean {\r\n let defaultValue = true;\r\n\r\n if (_myAutoImportEnabledDefaultValues.has(engine)) {\r\n defaultValue = _myAutoImportEnabledDefaultValues.get(engine) ?? false;\r\n }\r\n\r\n return defaultValue;\r\n}\r\n\r\nexport function getManualImportEnabledDefaultValue(engine: Readonly = Globals.getMainEngine()!): boolean {\r\n let defaultValue = true;\r\n\r\n if (_myManualImportEnabledDefaultValues.has(engine)) {\r\n defaultValue = _myManualImportEnabledDefaultValues.get(engine) ?? false;\r\n }\r\n\r\n return defaultValue;\r\n}\r\n\r\nexport function getExportEnabledDefaultValue(engine: Readonly = Globals.getMainEngine()!): boolean {\r\n let defaultValue = true;\r\n\r\n if (_myExportEnabledDefaultValues.has(engine)) {\r\n defaultValue = _myExportEnabledDefaultValues.get(engine) ?? false;\r\n }\r\n\r\n return defaultValue;\r\n}\r\n\r\nexport function addSetWidgetCurrentVariableCallback(id: unknown, callback: (variableName: string) => void, engine: Readonly = Globals.getMainEngine()!): void {\r\n if (!_mySetWidgetCurrentVariableCallbacks.has(engine)) {\r\n _mySetWidgetCurrentVariableCallbacks.set(engine, new Map());\r\n }\r\n\r\n _mySetWidgetCurrentVariableCallbacks.get(engine)!.set(id, callback);\r\n}\r\n\r\nexport function removeSetWidgetCurrentVariableCallback(id: unknown, engine: Readonly = Globals.getMainEngine()!): void {\r\n if (_mySetWidgetCurrentVariableCallbacks.has(engine)) {\r\n _mySetWidgetCurrentVariableCallbacks.get(engine)!.delete(id);\r\n }\r\n}\r\n\r\nexport function addRefreshWidgetCallback(id: unknown, callback: () => void, engine: Readonly = Globals.getMainEngine()!): void {\r\n if (!_myRefreshWidgetCallbacks.has(engine)) {\r\n _myRefreshWidgetCallbacks.set(engine, new Map());\r\n }\r\n\r\n _myRefreshWidgetCallbacks.get(engine)!.set(id, callback);\r\n}\r\n\r\nexport function removeRefreshWidgetCallback(id: unknown, engine: Readonly = Globals.getMainEngine()!): void {\r\n if (_myRefreshWidgetCallbacks.has(engine)) {\r\n _myRefreshWidgetCallbacks.get(engine)!.delete(id);\r\n }\r\n}\r\n\r\nexport const EasyTuneUtils = {\r\n setWidgetCurrentVariable,\r\n refreshWidget,\r\n importVariables,\r\n getImportVariablesJSON,\r\n exportVariables,\r\n exportVariablesByName,\r\n exportVariablesJSON,\r\n clearExportedVariables,\r\n setAutoImportEnabledDefaultValue,\r\n setManualImportEnabledDefaultValue,\r\n setExportEnabledDefaultValue,\r\n getAutoImportEnabledDefaultValue,\r\n getManualImportEnabledDefaultValue,\r\n getExportEnabledDefaultValue,\r\n addSetWidgetCurrentVariableCallback,\r\n removeSetWidgetCurrentVariableCallback,\r\n addRefreshWidgetCallback,\r\n removeRefreshWidgetCallback\r\n} as const;\r\n\r\n\r\n\r\nconst _importExportVariablesReplaceFileURLParams = function () {\r\n const matchEasyTuneURLParamsRegex = new RegExp(\"\\\\{.+?\\\\}\", \"g\");\r\n return function _importExportVariablesReplaceFileURLParams(fileURL: string) {\r\n const params = fileURL.match(matchEasyTuneURLParamsRegex);\r\n\r\n if (params == null || params.length == 0) {\r\n return fileURL;\r\n }\r\n\r\n for (let i = 0; i < params.length; i++) {\r\n params[i] = params[i].replace(\"{\", \"\");\r\n params[i] = params[i].replace(\"}\", \"\");\r\n }\r\n\r\n const urlQuery = window.location.search;\r\n const urlSearchParams = new URLSearchParams(urlQuery);\r\n\r\n let replacedFileURL = fileURL;\r\n\r\n for (const param of params) {\r\n const searchParamValue = urlSearchParams.get(param);\r\n if (searchParamValue != null) {\r\n replacedFileURL = replacedFileURL.replace(\"{\" + param + \"}\", searchParamValue);\r\n }\r\n }\r\n\r\n return replacedFileURL;\r\n };\r\n}();", "import { Object3D, WonderlandEngine } from \"@wonderlandengine/api\";\r\nimport { Globals } from \"../../../pp/globals.js\";\r\nimport { EasyTuneUtils } from \"../easy_tune_utils.js\";\r\nimport { EasyTuneVariable, EasyTuneVariableTyped } from \"../easy_tune_variable_types.js\";\r\n\r\nexport abstract class EasyObjectTuner> {\r\n private _myObject: Object3D;\r\n\r\n private _myEasyTuneVariable: EasyTuneVariableType | null = null;\r\n\r\n private _myUseTuneTarget: boolean;\r\n private _mySetAsWidgetCurrentVariable: boolean;\r\n\r\n private _myInitialEasyTuneVariableName: string;\r\n\r\n private _myPrevObject: Object3D | null = null;\r\n private _myManualVariableUpdate: boolean = false;\r\n\r\n private _myActive: boolean = true;\r\n private _mySetupDone: boolean = false;\r\n\r\n protected readonly _myEngine: Readonly;\r\n\r\n constructor(object: Object3D, variableName: string, setAsWidgetCurrentVariable: boolean, useTuneTarget: boolean, engine: Readonly = Globals.getMainEngine()!) {\r\n this._myObject = object;\r\n this._myUseTuneTarget = useTuneTarget;\r\n this._mySetAsWidgetCurrentVariable = setAsWidgetCurrentVariable;\r\n\r\n let easyObject: Object3D | null = this._myObject;\r\n if (this._myUseTuneTarget) {\r\n easyObject = Globals.getEasyTuneTarget(engine);\r\n }\r\n\r\n const variableNamePrefix = this._getVariableNamePrefix();\r\n\r\n if (variableName == \"\") {\r\n const objectName = easyObject != null ? easyObject.pp_getName() : \"\";\r\n if (objectName != \"\") {\r\n this._myInitialEasyTuneVariableName = variableNamePrefix.concat(objectName);\r\n } else {\r\n this._myInitialEasyTuneVariableName = variableNamePrefix.concat(easyObject != null ? easyObject.pp_getID().toFixed() : \"\");\r\n }\r\n } else {\r\n this._myInitialEasyTuneVariableName = variableName;\r\n }\r\n\r\n this._myEngine = engine;\r\n }\r\n\r\n public getEasyTuneVariable(): EasyTuneVariable | null {\r\n return this._myEasyTuneVariable;\r\n }\r\n\r\n public start(): void {\r\n this._myEasyTuneVariable = this._createEasyTuneVariable(this._myInitialEasyTuneVariableName);\r\n Globals.getEasyTuneVariables(this._myEngine)!.add(this._myEasyTuneVariable);\r\n\r\n let easyObject: Object3D | null = this._myObject;\r\n if (this._myUseTuneTarget) {\r\n easyObject = Globals.getEasyTuneTarget(this._myEngine);\r\n }\r\n this._myPrevObject = easyObject;\r\n\r\n if (easyObject != null) {\r\n const value = this._getObjectValue(easyObject);\r\n this._myEasyTuneVariable.setValue(value, true);\r\n }\r\n\r\n this._myActive = false;\r\n this.setActive(true);\r\n }\r\n\r\n public setActive(active: boolean): void {\r\n if (this._myActive != active) {\r\n this._myActive = active;\r\n\r\n if (this._myEasyTuneVariable != null) {\r\n if (this._myActive) {\r\n this._myEasyTuneVariable.registerValueChangedEventListener(this, function (this: EasyObjectTuner, newValue: Readonly) {\r\n if (this._myManualVariableUpdate) return;\r\n\r\n let easyObject: Object3D | null = this._myObject;\r\n if (this._myUseTuneTarget) {\r\n easyObject = Globals.getEasyTuneTarget(this._myEngine);\r\n }\r\n\r\n if (easyObject != null) {\r\n this._updateObjectValue(easyObject, newValue);\r\n }\r\n }.bind(this));\r\n } else {\r\n this._myEasyTuneVariable.unregisterValueChangedEventListener(this);\r\n }\r\n }\r\n }\r\n }\r\n\r\n public isActive(): boolean {\r\n return this._myActive;\r\n }\r\n\r\n public update(dt: number): void {\r\n if (!this._mySetupDone) {\r\n if (Globals.hasEasyTuneWidget()) {\r\n if (this._mySetAsWidgetCurrentVariable) {\r\n EasyTuneUtils.setWidgetCurrentVariable(this._myInitialEasyTuneVariableName, this._myEngine);\r\n }\r\n\r\n this._mySetupDone = true;\r\n }\r\n }\r\n\r\n if (this._myEasyTuneVariable == null || !this._myActive || !this.canUpdate()) return;\r\n\r\n let easyObject: Object3D | null = this._myObject;\r\n if (this._myUseTuneTarget) {\r\n easyObject = Globals.getEasyTuneTarget(this._myEngine);\r\n }\r\n\r\n let value = null;\r\n if (easyObject != null) {\r\n value = this._getObjectValue(easyObject);\r\n } else {\r\n value = this._getDefaultValue();\r\n }\r\n\r\n if (value != null) {\r\n const currentValue = this._myEasyTuneVariable.getValue();\r\n if (!this._areValueEqual(currentValue, value)) {\r\n this._myManualVariableUpdate = true;\r\n this._myEasyTuneVariable.setValue(value, this._myPrevObject != easyObject);\r\n this._myPrevObject = easyObject;\r\n\r\n this._myManualVariableUpdate = false;\r\n }\r\n }\r\n }\r\n\r\n protected canUpdate(): boolean {\r\n return true;\r\n }\r\n\r\n protected abstract _getVariableNamePrefix(): string;\r\n\r\n protected abstract _createEasyTuneVariable(variableName: string): EasyTuneVariableType;\r\n\r\n protected abstract _getObjectValue(object: Readonly): Readonly;\r\n\r\n protected abstract _getDefaultValue(): Readonly;\r\n\r\n protected abstract _areValueEqual(first: Readonly, second: Readonly): boolean;\r\n\r\n protected abstract _updateObjectValue(object: Object3D, value: Readonly): void;\r\n}", "import { Component, Object3D, WonderlandEngine } from \"@wonderlandengine/api\";\r\nimport { EasyTuneBool } from \"../easy_tune_variable_types.js\";\r\nimport { EasyObjectTuner } from \"./easy_object_tuner.js\";\r\n\r\nexport class EasyActive extends EasyObjectTuner {\r\n\r\n private _myComponentsToIgnore: Component[];\r\n\r\n constructor(componentsToIgnore: Component[], object: Object3D, variableName: string, setAsWidgetCurrentVariable: boolean, useTuneTarget: boolean, engine?: Readonly) {\r\n super(object, variableName, setAsWidgetCurrentVariable, useTuneTarget, engine);\r\n\r\n this._myComponentsToIgnore = componentsToIgnore;\r\n }\r\n\r\n protected override _getVariableNamePrefix(): string {\r\n return \"Active \";\r\n }\r\n\r\n protected override _createEasyTuneVariable(variableName: string): EasyTuneBool {\r\n return new EasyTuneBool(variableName, this._getDefaultValue(), null, true, undefined, this._myEngine);\r\n }\r\n\r\n protected override _getObjectValue(object: Readonly): boolean {\r\n let active = false;\r\n\r\n const components = object.pp_getComponents();\r\n for (const component of components) {\r\n if (!this._myComponentsToIgnore.pp_hasEqual(component) && component.active) {\r\n active = true;\r\n break;\r\n }\r\n }\r\n\r\n return active;\r\n }\r\n\r\n protected override _getDefaultValue(): boolean {\r\n return true;\r\n }\r\n\r\n protected override _areValueEqual(first: boolean, second: boolean): boolean {\r\n return first == second;\r\n }\r\n\r\n protected override _updateObjectValue(object: Object3D, value: boolean): void {\r\n const componentToIgnoreState = new Map();\r\n\r\n for (const componentToIgnore of this._myComponentsToIgnore) {\r\n componentToIgnoreState.set(componentToIgnore, componentToIgnore.active);\r\n }\r\n\r\n object.pp_setActive(value);\r\n\r\n for (const [componentToIgnore, active] of componentToIgnoreState.entries()) {\r\n componentToIgnore.active = active;\r\n }\r\n }\r\n\r\n protected override canUpdate(): boolean {\r\n const easyTuneVariable = this.getEasyTuneVariable();\r\n return easyTuneVariable == null || easyTuneVariable.isWidgetCurrentVariable();\r\n }\r\n}", "import { EasyActiveComponent } from \"wle-pp/tool/easy_tune/easy_object_tuners/components/easy_active_component.js\";\r\nimport { AddPPToWindowComponent, AddWLToWindowComponent, AdjustHierarchyPhysXScaleComponent, AnalyticsManagerComponent, AudioManagerComponent, BenchmarkMaxPhysXComponent, BenchmarkMaxVisibleTrianglesComponent, CADisplayLeaderboardComponent, CharacterCollisionSystemComponent, ClearConsoleComponent, ConsoleVRToolComponent, CopyHandTransformComponent, CopyHeadTransformComponent, CopyPlayerTransformComponent, CopyReferenceSpaceTransformComponent, DebugArrayFunctionsPerformanceAnalyzerComponent, DebugFunctionsPerformanceAnalyzerComponent, DebugManagerComponent, DebugPPArrayCreationPerformanceAnalyzerComponent, DebugPPFunctionsPerformanceAnalyzerComponent, DebugTransformComponent, DebugWLComponentsFunctionsPerformanceAnalyzerComponent, DebugWLFunctionsPerformanceAnalyzerComponent, EasyLightAttenuationComponent, EasyLightColorComponent, EasyMeshColorComponent, EasyScaleComponent, EasySetTuneTargeetGrabComponent, EasySetTuneTargetChildNumberComponent, EasyTextColorComponent, EasyTransformComponent, EasyTuneImportVariablesComponent, EasyTuneToolComponent, EnableDebugComponent, EnableToolComponent, FingerCursorComponent, GamepadControlSchemeComponent, GamepadMeshAnimatorComponent, GetDefaultResourcesComponent, GetSceneObjectsComponent, GrabbableComponent, GrabberHandComponent, InitConsoleVRComponent, InitEasyTuneVariablesComponent, InputManagerComponent, MuteEverythingComponent, ObjectPoolManagerComponent, OverlapCursorComponent, PPGatewayComponent, PlayerLocomotionComponent, SaveManagerComponent, ScaleOnSpawnComponent, SetActiveComponent, SetEngineLogLevelComponent, SetHandLocalTransformComponent, SetHandRayLocalTransformComponent, SetHeadLocalTransformComponent, SetPlayerHeightComponent, SetTrackedHandJointLocalTransformComponent, ShowFPSComponent, ShowXRButtonsComponent, SpatialAudioListenerComponent, SwitchHandObjectComponent, ToggleActiveOnButtonPressComponent, ToolCursorComponent, TrackedHandDrawAllJointsComponent, TrackedHandDrawJointComponent, TrackedHandDrawSkinComponent, VirtualGamepadComponent, VisualManagerComponent } from \"../index.js\";\r\n\r\nexport function registerPPComponents(engine) {\r\n engine.registerComponent(\r\n AddPPToWindowComponent,\r\n AddWLToWindowComponent,\r\n AdjustHierarchyPhysXScaleComponent,\r\n AnalyticsManagerComponent,\r\n AudioManagerComponent,\r\n BenchmarkMaxPhysXComponent,\r\n BenchmarkMaxVisibleTrianglesComponent,\r\n CADisplayLeaderboardComponent,\r\n CharacterCollisionSystemComponent,\r\n ClearConsoleComponent,\r\n ConsoleVRToolComponent,\r\n CopyHandTransformComponent,\r\n CopyHeadTransformComponent,\r\n CopyReferenceSpaceTransformComponent,\r\n CopyPlayerTransformComponent,\r\n DebugPPArrayCreationPerformanceAnalyzerComponent,\r\n DebugArrayFunctionsPerformanceAnalyzerComponent,\r\n DebugFunctionsPerformanceAnalyzerComponent,\r\n DebugManagerComponent,\r\n DebugPPFunctionsPerformanceAnalyzerComponent,\r\n DebugTransformComponent,\r\n DebugWLComponentsFunctionsPerformanceAnalyzerComponent,\r\n DebugWLFunctionsPerformanceAnalyzerComponent,\r\n EasyLightAttenuationComponent,\r\n EasyLightColorComponent,\r\n EasyMeshColorComponent,\r\n EasyScaleComponent,\r\n EasySetTuneTargeetGrabComponent,\r\n EasySetTuneTargetChildNumberComponent,\r\n EasyTextColorComponent,\r\n EasyTransformComponent,\r\n EasyTuneImportVariablesComponent,\r\n EasyTuneToolComponent,\r\n EasyActiveComponent,\r\n EnableDebugComponent,\r\n EnableToolComponent,\r\n OverlapCursorComponent,\r\n FingerCursorComponent,\r\n GamepadControlSchemeComponent,\r\n GamepadMeshAnimatorComponent,\r\n GetDefaultResourcesComponent,\r\n GetSceneObjectsComponent,\r\n GrabbableComponent,\r\n GrabberHandComponent,\r\n InitConsoleVRComponent,\r\n InitEasyTuneVariablesComponent,\r\n InputManagerComponent,\r\n MuteEverythingComponent,\r\n ObjectPoolManagerComponent,\r\n PPGatewayComponent,\r\n PlayerLocomotionComponent,\r\n SaveManagerComponent,\r\n ScaleOnSpawnComponent,\r\n SetActiveComponent,\r\n SetEngineLogLevelComponent,\r\n SetHandLocalTransformComponent,\r\n SetHandRayLocalTransformComponent,\r\n SetHeadLocalTransformComponent,\r\n SetPlayerHeightComponent,\r\n SetTrackedHandJointLocalTransformComponent,\r\n ShowFPSComponent,\r\n ShowXRButtonsComponent,\r\n SpatialAudioListenerComponent,\r\n SwitchHandObjectComponent,\r\n ToggleActiveOnButtonPressComponent,\r\n ToolCursorComponent,\r\n TrackedHandDrawAllJointsComponent,\r\n TrackedHandDrawJointComponent,\r\n TrackedHandDrawSkinComponent,\r\n VirtualGamepadComponent,\r\n VisualManagerComponent\r\n );\r\n}", "import { Component, Property, WonderlandEngine, type ComponentProperty } from \"@wonderlandengine/api\";\r\nimport { AudioManagerComponent } from \"../../audio/components/audio_manager_component.js\";\r\nimport { AnalyticsManagerComponent } from \"../../cauldron/cauldron/components/analytics_manager_component.js\";\r\nimport { ClearConsoleComponent } from \"../../cauldron/cauldron/components/clear_console_component.js\";\r\nimport { SaveManagerComponent } from \"../../cauldron/cauldron/components/save_manager_component.js\";\r\nimport { ObjectPoolManagerComponent } from \"../../cauldron/object_pool/components/object_pool_manager_component.js\";\r\nimport { VisualManagerComponent } from \"../../cauldron/visual/components/visual_manager_component.js\";\r\nimport { AddWLToWindowComponent } from \"../../cauldron/wl/components/add_wl_to_window_component.js\";\r\nimport { GetDefaultResourcesComponent } from \"../../cauldron/wl/getters/components/get_default_resources_component.js\";\r\nimport { GetSceneObjectsComponent } from \"../../cauldron/wl/getters/components/get_scene_objects_component.js\";\r\nimport { DebugManagerComponent } from \"../../debug/components/debug_manager_component.js\";\r\nimport { EnableDebugComponent } from \"../../debug/components/enable_debug_component.js\";\r\nimport { CharacterCollisionSystemComponent } from \"../../gameplay/experimental/character_controller/collision/components/character_collision_system_component.js\";\r\nimport { InputManagerComponent } from \"../../input/cauldron/components/input_manager_component.js\";\r\nimport { EnableToolComponent } from \"../../tool/cauldron/components/enable_tool_component.js\";\r\nimport { InitConsoleVRComponent } from \"../../tool/console_vr/components/init_console_vr_component.js\";\r\nimport { InitEasyTuneVariablesComponent } from \"../../tool/easy_tune/components/init_easy_tune_variables_component.js\";\r\nimport { initPP } from \"../init_pp.js\";\r\nimport { AddPPToWindowComponent } from \"./add_pp_to_window_component.js\";\r\n\r\n// #TODO enable this again as soon as it is possible for the wonderland engine to find components not specified in the index.js,\r\n// since that would make the extension be included just by using the library, and not only when this component is used\r\n// import \"../../plugin/add_type_extensions_to_typescript.js\";\r\n\r\nconst _myRegisteredEngines: WeakMap, null> = new WeakMap();\r\n\r\nexport class PPGatewayComponent extends Component {\r\n public static override TypeName = \"pp-gateway\";\r\n\r\n public static override Properties = {\r\n _myEnableDebug: Property.bool(true),\r\n _myEnableTool: Property.bool(true),\r\n _myAddPPToWindow: Property.bool(true),\r\n _myAddWLToWindow: Property.bool(true),\r\n _myClearConsoleOnInit: Property.bool(false),\r\n ...InputManagerComponent.Properties,\r\n ...AudioManagerComponent.Properties,\r\n ...VisualManagerComponent.Properties,\r\n ...CharacterCollisionSystemComponent.Properties,\r\n ...ObjectPoolManagerComponent.Properties,\r\n ...SaveManagerComponent.Properties,\r\n ...AnalyticsManagerComponent.Properties,\r\n ...DebugManagerComponent.Properties,\r\n ...GetSceneObjectsComponent.Properties,\r\n ...GetDefaultResourcesComponent.Properties\r\n };\r\n\r\n private readonly _myEnableDebug!: boolean;\r\n private readonly _myEnableTool!: boolean;\r\n\r\n private readonly _myAddPPToWindow!: boolean;\r\n private readonly _myAddWLToWindow!: boolean;\r\n\r\n private readonly _myClearConsoleOnInit!: boolean;\r\n\r\n private readonly _myGetDefaultResourcesComponent!: GetDefaultResourcesComponent;\r\n private readonly _myGetSceneObjectsComponent!: GetSceneObjectsComponent;\r\n private readonly _myEnableDebugComponent!: EnableDebugComponent;\r\n private readonly _myEnableToolComponent!: EnableToolComponent;\r\n private readonly _myAddPPToWindowComponent!: AddPPToWindowComponent;\r\n private readonly _myAddWLToWindowComponent!: AddWLToWindowComponent;\r\n private readonly _myInitConsoleVRComponent!: InitConsoleVRComponent;\r\n private readonly _myInitEasyTuneVariablesComponent!: InitEasyTuneVariablesComponent;\r\n private readonly _myObjectPoolManagerComponent!: ObjectPoolManagerComponent;\r\n private readonly _myInputManagerComponent!: InputManagerComponent;\r\n private readonly _myAudioManagerComponent!: AudioManagerComponent;\r\n private readonly _myVisualManagerComponent!: VisualManagerComponent;\r\n private readonly _myCharacterCollisionSystemComponent!: CharacterCollisionSystemComponent;\r\n private readonly _mySaveManagerComponent!: SaveManagerComponent;\r\n private readonly _myAnalyticsManagerComponent!: AnalyticsManagerComponent;\r\n private readonly _myDebugManagerComponent!: DebugManagerComponent;\r\n\r\n private _myClearConsoleComponent: ClearConsoleComponent | null = null;\r\n\r\n public static override onRegister(engine: WonderlandEngine): void {\r\n if (!_myRegisteredEngines.has(engine)) {\r\n _myRegisteredEngines.set(engine, null);\r\n initPP(engine);\r\n }\r\n }\r\n\r\n public override init(): void {\r\n if (this._myClearConsoleOnInit) {\r\n this._myClearConsoleComponent = this.object.pp_addComponent(ClearConsoleComponent, false);\r\n }\r\n\r\n (this._myGetDefaultResourcesComponent as GetDefaultResourcesComponent) = this.object.pp_addComponent(GetDefaultResourcesComponent, this._getProperties(GetDefaultResourcesComponent.Properties), false)!;\r\n (this._myGetSceneObjectsComponent as GetSceneObjectsComponent) = this.object.pp_addComponent(GetSceneObjectsComponent, this._getProperties(GetSceneObjectsComponent.Properties), false)!;\r\n\r\n if (this._myEnableDebug) {\r\n (this._myEnableDebugComponent as EnableDebugComponent) = this.object.pp_addComponent(EnableDebugComponent, false)!;\r\n }\r\n\r\n if (this._myEnableTool) {\r\n (this._myEnableToolComponent as EnableToolComponent) = this.object.pp_addComponent(EnableToolComponent, false)!;\r\n }\r\n\r\n if (this._myAddPPToWindow) {\r\n (this._myAddPPToWindowComponent as AddPPToWindowComponent) = this.object.pp_addComponent(AddPPToWindowComponent, false)!;\r\n }\r\n\r\n if (this._myAddWLToWindow) {\r\n (this._myAddWLToWindowComponent as AddWLToWindowComponent) = this.object.pp_addComponent(AddWLToWindowComponent, false)!;\r\n }\r\n\r\n (this._myInitConsoleVRComponent as InitConsoleVRComponent) = this.object.pp_addComponent(InitConsoleVRComponent, false)!;\r\n (this._myInitEasyTuneVariablesComponent as InitEasyTuneVariablesComponent) = this.object.pp_addComponent(InitEasyTuneVariablesComponent, false)!;\r\n\r\n (this._myObjectPoolManagerComponent as ObjectPoolManagerComponent) = this.object.pp_addComponent(ObjectPoolManagerComponent, this._getProperties(ObjectPoolManagerComponent.Properties), false)!;\r\n (this._myInputManagerComponent as InputManagerComponent) = this.object.pp_addComponent(InputManagerComponent, this._getProperties(InputManagerComponent.Properties), false)!;\r\n (this._myAudioManagerComponent as AudioManagerComponent) = this.object.pp_addComponent(AudioManagerComponent, this._getProperties(AudioManagerComponent.Properties), false)!;\r\n (this._myVisualManagerComponent as VisualManagerComponent) = this.object.pp_addComponent(VisualManagerComponent, this._getProperties(VisualManagerComponent.Properties), false)!;\r\n (this._myCharacterCollisionSystemComponent as CharacterCollisionSystemComponent) = this.object.pp_addComponent(CharacterCollisionSystemComponent, this._getProperties(CharacterCollisionSystemComponent.Properties), false)!;\r\n (this._mySaveManagerComponent as SaveManagerComponent) = this.object.pp_addComponent(SaveManagerComponent, this._getProperties(SaveManagerComponent.Properties), false)!;\r\n (this._myAnalyticsManagerComponent as AnalyticsManagerComponent) = this.object.pp_addComponent(AnalyticsManagerComponent, this._getProperties(AnalyticsManagerComponent.Properties), false)!;\r\n\r\n (this._myDebugManagerComponent as DebugManagerComponent) = this.object.pp_addComponent(DebugManagerComponent, this._getProperties(DebugManagerComponent.Properties), false)!;\r\n }\r\n\r\n public override start(): void {\r\n if (this._myClearConsoleComponent != null) {\r\n this._myClearConsoleComponent.active = true;\r\n }\r\n\r\n this._myGetDefaultResourcesComponent.active = true;\r\n this._myGetSceneObjectsComponent.active = true;\r\n\r\n if (this._myEnableDebugComponent != null) {\r\n this._myEnableDebugComponent.active = true;\r\n }\r\n\r\n if (this._myEnableToolComponent != null) {\r\n this._myEnableToolComponent.active = true;\r\n }\r\n\r\n if (this._myAddPPToWindowComponent != null) {\r\n this._myAddPPToWindowComponent.active = true;\r\n }\r\n\r\n if (this._myAddWLToWindowComponent != null) {\r\n this._myAddWLToWindowComponent.active = true;\r\n }\r\n\r\n this._myInitConsoleVRComponent.active = true;\r\n this._myInitEasyTuneVariablesComponent.active = true;\r\n\r\n this._myObjectPoolManagerComponent.active = true;\r\n this._myInputManagerComponent.active = true;\r\n this._myAudioManagerComponent.active = true;\r\n this._myVisualManagerComponent.active = true;\r\n this._myCharacterCollisionSystemComponent.active = true;\r\n this._mySaveManagerComponent.active = true;\r\n this._myAnalyticsManagerComponent.active = true;\r\n\r\n this._myDebugManagerComponent.active = true;\r\n }\r\n\r\n private _getProperties(propertiesToGet: Readonly>): Record {\r\n const properties: Record = {};\r\n\r\n if (propertiesToGet != null) {\r\n const propertyNames = Object.getOwnPropertyNames(propertiesToGet);\r\n\r\n for (const propertyName of propertyNames) {\r\n const _this = (this as Record);\r\n if (_this[propertyName] != undefined) {\r\n properties[propertyName] = _this[propertyName];\r\n }\r\n }\r\n }\r\n\r\n return properties;\r\n }\r\n}", "import { Component, Property } from \"@wonderlandengine/api\";\r\nimport { Globals } from \"../../pp/globals.js\";\r\nimport { AudioManager } from \"../audio_manager.js\";\r\n\r\nexport class AudioManagerComponent extends Component {\r\n static TypeName = \"pp-audio-manager\";\r\n static Properties = {\r\n _myPreloadAudio: Property.bool(false),\r\n _myCleanUpAudioSourcesOnActivate: Property.bool(false)\r\n };\r\n\r\n init() {\r\n this._myAudioManager = new AudioManager(this._myPreloadAudio, this.engine);\r\n }\r\n\r\n onActivate() {\r\n if (!Globals.hasAudioManager(this.engine)) {\r\n if (this._myCleanUpAudioSourcesOnActivate) {\r\n this._myAudioManager.unloadAllAudioSources();\r\n }\r\n\r\n Globals.setAudioManager(this._myAudioManager, this.engine);\r\n }\r\n }\r\n\r\n onDeactivate() {\r\n if (Globals.getAudioManager(this.engine) == this._myAudioManager) {\r\n Globals.removeAudioManager(this.engine);\r\n }\r\n }\r\n}", "import { Howler } from \"howler\";\r\nimport { Globals } from \"../pp/globals.js\";\r\nimport { AudioPlayer } from \"./audio_player.js\";\r\n\r\nexport class AudioManager {\r\n\r\n constructor(preloadAudio = true, engine = Globals.getMainEngine()) {\r\n this._myEngine = engine;\r\n\r\n this._myPreloadAudio = preloadAudio;\r\n this._myAudioSetups = new Map();\r\n\r\n this._myAudioPlayersCreatedForPreload = [];\r\n }\r\n\r\n createAudioPlayer(audioSetupID) {\r\n let audioSetup = this.getAudioSetup(audioSetupID);\r\n if (audioSetup != null) {\r\n return new AudioPlayer(this.getAudioSetup(audioSetupID));\r\n }\r\n\r\n return null;\r\n }\r\n\r\n getAudioSetup(id) {\r\n return this._myAudioSetups.get(id);\r\n }\r\n\r\n addAudioSetup(id, audioSetup, preloadAudioOverride = null) {\r\n this._myAudioSetups.set(id, audioSetup);\r\n if ((this._myPreloadAudio && preloadAudioOverride == null) || (preloadAudioOverride != null && preloadAudioOverride)) {\r\n this._myAudioPlayersCreatedForPreload.push(this.createAudioPlayer(id));\r\n }\r\n }\r\n\r\n removeAudioSetup(id) {\r\n this._myAudioSetups.delete(id);\r\n }\r\n\r\n setVolume(volume) {\r\n Howler.volume(volume);\r\n }\r\n\r\n setMute(mute) {\r\n Howler.mute(mute);\r\n }\r\n\r\n stop() {\r\n Howler.stop();\r\n }\r\n\r\n unloadAllAudioSources() {\r\n Howler.unload();\r\n }\r\n}", "import { RetainEmitter } from \"@wonderlandengine/api\";\r\nimport { Howl, Howler } from \"howler\";\r\nimport { AudioSetup } from \"./audio_setup.js\";\r\n\r\nexport let AudioEvent = {\r\n END: \"end\",\r\n STOP: \"stop\",\r\n LOAD: \"load\",\r\n LOAD_ERROR: \"loaderror\",\r\n PLAY: \"play\",\r\n PLAY_ERROR: \"playerror\",\r\n PAUSE: \"pause\",\r\n MUTE: \"mute\",\r\n VOLUME: \"volume\",\r\n RATE: \"rate\",\r\n SEEK: \"seek\",\r\n FADE: \"fade\",\r\n UNLOCK: \"unlock\"\r\n};\r\n\r\nexport class AudioPlayer {\r\n\r\n /**\r\n * TS type inference helper\r\n * \r\n * @param {any} audioInstance\r\n */\r\n constructor(audioSetupOrAudioFilePath, audioInstance = null) {\r\n if (audioSetupOrAudioFilePath == null) {\r\n this._myAudioSetup = new AudioSetup();\r\n } else if (typeof audioSetupOrAudioFilePath == \"string\") {\r\n this._myAudioSetup = new AudioSetup(audioSetupOrAudioFilePath);\r\n } else {\r\n this._myAudioSetup = audioSetupOrAudioFilePath.clone();\r\n }\r\n\r\n this._myAudio = null;\r\n\r\n if (audioInstance == null) {\r\n this._myAudio = new Howl({\r\n src: [this._myAudioSetup.myAudioFilePath],\r\n loop: this._myAudioSetup.myLoop,\r\n volume: this._myAudioSetup.myVolume,\r\n autoplay: false,\r\n rate: this._myAudioSetup.myRate,\r\n pool: this._myAudioSetup.myPool,\r\n pos: (this._myAudioSetup.mySpatial) ? this._myAudioSetup.myPosition : null,\r\n refDistance: this._myAudioSetup.myReferenceDistance,\r\n preload: this._myAudioSetup.myPreload\r\n });\r\n\r\n this._myAudio._pannerAttr.refDistance = this._myAudioSetup.myReferenceDistance;\r\n } else {\r\n this._myAudio = audioInstance;\r\n }\r\n\r\n this._myLastAudioID = null;\r\n\r\n this._myAudioEventEmitters = new Map();\r\n for (let eventKey in AudioEvent) {\r\n this._myAudioEventEmitters.set(AudioEvent[eventKey], new RetainEmitter()); // Signature: listener(audioID)\r\n }\r\n\r\n this._addListeners();\r\n\r\n if (this._myAudioSetup.myAutoPlay) {\r\n this.play();\r\n }\r\n\r\n this._myDestroyed = false;\r\n }\r\n\r\n isValid() {\r\n return this._myAudio != null;\r\n }\r\n\r\n play() {\r\n if (Howler.state != \"running\" && this._myAudioSetup.myPreventPlayWhenAudioContextNotRunning) {\r\n return false;\r\n }\r\n\r\n let audioID = this._myAudio.play();\r\n if (audioID != null) {\r\n this._myLastAudioID = audioID;\r\n\r\n this.updatePosition(this._myAudioSetup.myPosition, true);\r\n this.updatePitch(this._myAudioSetup.myPitch, true);\r\n this.updateVolume(this._myAudioSetup.myVolume, true);\r\n }\r\n\r\n return audioID != null;\r\n }\r\n\r\n stop() {\r\n this._myAudio.stop();\r\n }\r\n\r\n pause() {\r\n this._myAudio.pause();\r\n }\r\n\r\n resume() {\r\n this._myAudio.play();\r\n }\r\n\r\n isPlaying(checkOnlyLast = false) {\r\n let playing = false;\r\n\r\n if (checkOnlyLast) {\r\n playing = this._myAudio.playing(this._myLastAudioID);\r\n }\r\n else {\r\n playing = this._myAudio.playing();\r\n }\r\n\r\n return playing;\r\n }\r\n\r\n isLoaded() {\r\n return this._myAudio.state() == \"loaded\";\r\n }\r\n\r\n fade(fromVolume, toVolume, duration, updateOnlyLast = true, setValueOnPlayer = true) {\r\n if (setValueOnPlayer) {\r\n this.setVolume(toVolume);\r\n }\r\n\r\n if (updateOnlyLast) {\r\n this._myAudio.fade(fromVolume, toVolume, duration * 1000, this._myLastAudioID);\r\n } else {\r\n this._myAudio.fade(fromVolume, toVolume, duration * 1000);\r\n }\r\n }\r\n\r\n isFading(checkOnlyLast = true) {\r\n let fading = false;\r\n\r\n if (checkOnlyLast) {\r\n let lastSound = this._myAudio._soundById(this._myLastAudioID);\r\n if (lastSound != null) {\r\n fading = lastSound._fadeTo != null;\r\n }\r\n } else {\r\n for (let sound of this._myAudio._sounds) {\r\n if (sound._fadeTo != null) {\r\n fading = true;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return fading;\r\n }\r\n\r\n updatePosition(position, updateOnlyLast = true, setValueOnPlayer = true) {\r\n if (setValueOnPlayer) {\r\n this.setPosition(position);\r\n }\r\n\r\n if (this._myAudioSetup.mySpatial && position) {\r\n if (updateOnlyLast) {\r\n this._myAudio.pos(position[0], position[1], position[2], this._myLastAudioID);\r\n } else {\r\n this._myAudio.pos(position[0], position[1], position[2]);\r\n }\r\n }\r\n }\r\n\r\n updatePitch(pitch, updateOnlyLast = true, setValueOnPlayer = true) {\r\n this.updateRate(pitch, updateOnlyLast, setValueOnPlayer);\r\n }\r\n\r\n updateRate(rate, updateOnlyLast = true, setValueOnPlayer = true) {\r\n if (setValueOnPlayer) {\r\n this.setRate(rate);\r\n }\r\n\r\n if (rate != null) {\r\n if (updateOnlyLast) {\r\n this._myAudio.rate(rate, this._myLastAudioID);\r\n } else {\r\n this._myAudio.rate(rate);\r\n }\r\n }\r\n }\r\n\r\n updateVolume(volume, updateOnlyLast = true, setValueOnPlayer = true) {\r\n if (setValueOnPlayer) {\r\n this.setVolume(volume);\r\n }\r\n\r\n if (volume != null) {\r\n if (updateOnlyLast) {\r\n this._myAudio.volume(volume, this._myLastAudioID);\r\n } else {\r\n this._myAudio.volume(volume);\r\n }\r\n }\r\n }\r\n\r\n setSpatial(spatial) {\r\n this._myAudioSetup.mySpatial = spatial;\r\n }\r\n\r\n setPosition(position) {\r\n this._myAudioSetup.myPosition = position;\r\n }\r\n\r\n setPitch(pitch) {\r\n this._myAudioSetup.myPitch = pitch;\r\n }\r\n\r\n setRate(rate) {\r\n this._myAudioSetup.myRate = rate;\r\n }\r\n\r\n setVolume(volume) {\r\n this._myAudioSetup.myVolume = volume;\r\n }\r\n\r\n getDuration() {\r\n return this._myAudio.duration();\r\n }\r\n\r\n getVolume() {\r\n return this._myAudioSetup.myVolume;\r\n }\r\n\r\n getPitch() {\r\n return this._myAudioSetup.myPitch;\r\n }\r\n\r\n getRate() {\r\n return this._myAudioSetup.myRate;\r\n }\r\n\r\n registerAudioEventListener(audioEvent, id, listener, notifyOnce = false, notifyIfAlreadyHappened = false) {\r\n this._myAudioEventEmitters.get(audioEvent).add(listener, { id: id, once: notifyOnce, immediate: notifyIfAlreadyHappened });\r\n }\r\n\r\n unregisterAudioEventListener(audioEvent, id) {\r\n this._myAudioEventEmitters.get(audioEvent).remove(id);\r\n }\r\n\r\n _addListeners() {\r\n if (this._myAudio != null) {\r\n for (let eventKey in AudioEvent) {\r\n let event = AudioEvent[eventKey];\r\n this._myAudio.on(event, function (audioID) {\r\n let emitter = this._myAudioEventEmitters.get(event);\r\n emitter.notify(audioID);\r\n }.bind(this));\r\n }\r\n }\r\n }\r\n\r\n destroy() {\r\n this._myDestroyed = true;\r\n\r\n this._myAudio.unload();\r\n }\r\n\r\n isDestroyed() {\r\n return this._myDestroyed;\r\n }\r\n}", "import { Vector3 } from \"../cauldron/type_definitions/array_type_definitions.js\";\r\n\r\nexport class AudioSetup {\r\n\r\n public myAudioFilePath: string | null = null;\r\n\r\n public myLoop: boolean = false;\r\n public myAutoPlay: boolean = false;\r\n\r\n public myVolume: number = 1.0;\r\n\r\n /** From `0.5` to `4.0` */\r\n public _myRate: number = 1.0;\r\n\r\n public myPool: number = 5;\r\n public myPreload: boolean = true;\r\n\r\n public myPreventPlayWhenAudioContextNotRunning: boolean = false;\r\n\r\n // Spatial Params\r\n\r\n public myPosition: Vector3 | null = null;\r\n public mySpatial: boolean = true;\r\n\r\n /** At this distance (and closer) the volume is not reduced */\r\n public myReferenceDistance: number = 1;\r\n\r\n // End Spatial Params\r\n\r\n constructor(audioFilePath?: string) {\r\n if (audioFilePath != null) {\r\n this.myAudioFilePath = audioFilePath;\r\n }\r\n }\r\n\r\n public clone(): AudioSetup {\r\n const audioSetup = new AudioSetup();\r\n\r\n audioSetup.myAudioFilePath = this.myAudioFilePath;\r\n\r\n audioSetup.myLoop = this.myLoop;\r\n audioSetup.myAutoPlay = this.myAutoPlay;\r\n\r\n audioSetup.myVolume = this.myVolume;\r\n audioSetup.myPitch = this.myPitch;\r\n audioSetup.myRate = this.myRate;\r\n\r\n audioSetup.myPool = this.myPool;\r\n audioSetup.myPreload = this.myPreload;\r\n\r\n audioSetup.myPreventPlayWhenAudioContextNotRunning = this.myPreventPlayWhenAudioContextNotRunning;\r\n\r\n // Spatial\r\n\r\n if (this.myPosition != null) {\r\n audioSetup.myPosition = this.myPosition.vec3_clone();\r\n } else {\r\n audioSetup.myPosition = null;\r\n }\r\n\r\n audioSetup.mySpatial = this.mySpatial;\r\n audioSetup.myReferenceDistance = this.myReferenceDistance;\r\n\r\n return audioSetup;\r\n }\r\n\r\n get myPitch(): number {\r\n return this._myRate;\r\n }\r\n\r\n get myRate(): number {\r\n return this._myRate;\r\n }\r\n\r\n set myPitch(pitch) {\r\n this._myRate = pitch;\r\n }\r\n\r\n set myRate(rate) {\r\n this._myRate = rate;\r\n }\r\n}", "import { Component, Property } from \"@wonderlandengine/api\";\r\nimport { Globals } from \"../../../pp/globals.js\";\r\nimport { BrowserUtils } from \"../../utils/browser_utils.js\";\r\nimport { AnalyticsManager } from \"../analytics_manager.js\";\r\n\r\nexport class AnalyticsManagerComponent extends Component {\r\n static TypeName = \"pp-analytics-manager\";\r\n static Properties = {\r\n _myDisableAnalyticsOnLocalhost: Property.bool(true)\r\n };\r\n\r\n init() {\r\n this._myAnalyticsManager = new AnalyticsManager();\r\n }\r\n\r\n update(dt) {\r\n if (Globals.getAnalyticsManager(this.engine) == this._myAnalyticsManager) {\r\n this._myAnalyticsManager.update(dt);\r\n }\r\n }\r\n\r\n onActivate() {\r\n if (!Globals.hasAnalyticsManager(this.engine)) {\r\n if (BrowserUtils.isLocalhost() && this._myDisableAnalyticsOnLocalhost) {\r\n this._myAnalyticsManager.setAnalyticsEnabled(false);\r\n }\r\n\r\n Globals.setAnalyticsManager(this._myAnalyticsManager, this.engine);\r\n }\r\n }\r\n\r\n onDeactivate() {\r\n if (Globals.getAnalyticsManager(this.engine) == this._myAnalyticsManager) {\r\n Globals.removeAnalyticsManager(this.engine);\r\n }\r\n }\r\n}", "import { WonderlandEngine, type RetainListenerOptions } from \"@wonderlandengine/api\";\r\nimport { Globals } from \"../../pp/globals.js\";\r\nimport { BrowserUtils } from \"./browser_utils.js\";\r\n\r\nexport function getSession(engine: Readonly = Globals.getMainEngine()!): XRSession | null {\r\n const xr = Globals.getXR(engine);\r\n return xr != null ? xr.session : null;\r\n}\r\n\r\nexport function getSessionMode(engine: Readonly = Globals.getMainEngine()!): XRSessionMode | null {\r\n const xr = Globals.getXR(engine);\r\n return xr != null ? xr.sessionMode : null;\r\n}\r\n\r\nexport function getReferenceSpace(engine: Readonly = Globals.getMainEngine()!): XRReferenceSpace | null {\r\n const xr = Globals.getXR(engine);\r\n return xr != null ? xr.currentReferenceSpace : null;\r\n}\r\n\r\nexport function getReferenceSpaceType(engine: Readonly = Globals.getMainEngine()!): XRReferenceSpaceType | null {\r\n let type: XRReferenceSpaceType | null = \"local\";\r\n\r\n try {\r\n const xr = Globals.getXR(engine);\r\n type = xr != null ? xr.currentReferenceSpaceType : null;\r\n } catch (error) {\r\n // Do nothing\r\n }\r\n\r\n return type;\r\n}\r\n\r\nexport function getFrame(engine: Readonly = Globals.getMainEngine()!): XRFrame | null {\r\n const xr = Globals.getXR(engine);\r\n return xr != null ? xr.frame : null;\r\n}\r\n\r\nexport function isSessionActive(engine: Readonly = Globals.getMainEngine()!): boolean {\r\n return XRUtils.getSession(engine) != null;\r\n}\r\n\r\nexport function isReferenceSpaceFloorBased(engine: Readonly = Globals.getMainEngine()!): boolean {\r\n const referenceSpaceType = XRUtils.getReferenceSpaceType(engine);\r\n return referenceSpaceType != null ? referenceSpaceType.includes(\"floor\") : false;\r\n}\r\n\r\nexport function exitSession(engine: Readonly = Globals.getMainEngine()!): void {\r\n const xrSession = XRUtils.getSession(engine);\r\n\r\n if (xrSession != null) {\r\n xrSession.end();\r\n }\r\n}\r\n\r\nexport function registerSessionStartEventListener(id: unknown, listener: ((xrSession: XRSession, xrSessionMode: XRSessionMode) => void) | ((manualCall: boolean, xrSession: XRSession, xrSessionMode: XRSessionMode) => void), manuallyCallSessionStartIfSessionAlreadyActive = true, addManualCallFlagToStartListener = false, engine: Readonly = Globals.getMainEngine()!): void {\r\n if (listener != null) {\r\n if (addManualCallFlagToStartListener) {\r\n const manualStartListener = listener as (manualCall: boolean, xrSession: XRSession, xrSessionMode: XRSessionMode) => void;\r\n engine.onXRSessionStart.add(manualStartListener.bind(undefined, false), { id: id, immediate: false } as RetainListenerOptions);\r\n } else {\r\n const standardListener = listener as (xrSession: XRSession, xrSessionMode: XRSessionMode) => void;\r\n engine.onXRSessionStart.add(standardListener, { id: id, immediate: false } as RetainListenerOptions);\r\n }\r\n\r\n if (manuallyCallSessionStartIfSessionAlreadyActive && XRUtils.isSessionActive(engine)) {\r\n if (addManualCallFlagToStartListener) {\r\n const manualStartListener = listener as (manualCall: boolean, xrSession: XRSession, xrSessionMode: XRSessionMode) => void;\r\n manualStartListener(true, XRUtils.getSession(engine)!, XRUtils.getSessionMode(engine)!);\r\n } else {\r\n const standardListener = listener as (xrSession: XRSession, xrSessionMode: XRSessionMode) => void;\r\n standardListener(XRUtils.getSession(engine)!, XRUtils.getSessionMode(engine)!);\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport function unregisterSessionStartEventListener(id: unknown, engine: Readonly = Globals.getMainEngine()!): void {\r\n engine.onXRSessionStart.remove(id);\r\n}\r\n\r\nexport function registerSessionEndEventListener(id: unknown, listener: () => void, engine: Readonly = Globals.getMainEngine()!): void {\r\n if (listener != null) {\r\n engine.onXRSessionEnd.add(listener, { id: id });\r\n }\r\n}\r\n\r\nexport function unregisterSessionEndEventListener(id: unknown, engine: Readonly = Globals.getMainEngine()!): void {\r\n engine.onXRSessionEnd.remove(id);\r\n}\r\n\r\nexport function registerSessionStartEndEventListeners(id: unknown, startListener: ((xrSession: XRSession, xrSessionMode: XRSessionMode) => void) | ((manualCall: boolean, xrSession: XRSession, xrSessionMode: XRSessionMode) => void), endListener: () => void, manuallyCallSessionStartIfSessionAlreadyActive = true, addManualCallFlagToStartListener = false, engine: Readonly = Globals.getMainEngine()!): void {\r\n XRUtils.registerSessionEndEventListener(id, endListener, engine);\r\n XRUtils.registerSessionStartEventListener(id, startListener, manuallyCallSessionStartIfSessionAlreadyActive, addManualCallFlagToStartListener, engine);\r\n}\r\n\r\nexport function unregisterSessionStartEndEventListeners(id: unknown, engine: Readonly = Globals.getMainEngine()!): void {\r\n XRUtils.unregisterSessionEndEventListener(id, engine);\r\n XRUtils.unregisterSessionStartEventListener(id, engine);\r\n}\r\n\r\nexport function isXRSupported(engine: Readonly = Globals.getMainEngine()!): boolean {\r\n return XRUtils.isVRSupported(engine) || XRUtils.isARSupported(engine);\r\n}\r\n\r\nexport function isVRSupported(engine: Readonly = Globals.getMainEngine()!): boolean {\r\n return engine.vrSupported;\r\n}\r\n\r\nexport function isARSupported(engine: Readonly = Globals.getMainEngine()!): boolean {\r\n return engine.arSupported;\r\n}\r\n\r\nexport function isDeviceEmulated(onlyOnLocalhost: boolean = true): boolean {\r\n const emulated = (window as unknown as { CustomWebXRPolyfill: unknown }).CustomWebXRPolyfill != null && (!onlyOnLocalhost || BrowserUtils.isLocalhost());\r\n return emulated;\r\n}\r\n\r\nexport const XRUtils = {\r\n getSession,\r\n getSessionMode,\r\n getReferenceSpace,\r\n getReferenceSpaceType,\r\n getFrame,\r\n isSessionActive,\r\n exitSession,\r\n registerSessionStartEventListener,\r\n unregisterSessionStartEventListener,\r\n registerSessionEndEventListener,\r\n unregisterSessionEndEventListener,\r\n registerSessionStartEndEventListeners,\r\n unregisterSessionStartEndEventListeners,\r\n isReferenceSpaceFloorBased,\r\n isXRSupported,\r\n isVRSupported,\r\n isARSupported,\r\n isDeviceEmulated\r\n} as const;", "import { Globals } from \"../../pp/globals.js\";\r\nimport { XRUtils } from \"./xr_utils.js\";\r\n\r\nexport let isMobile = function () {\r\n let checkMobileRegex = new RegExp(\"Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini\", \"i\");\r\n return function isMobile() {\r\n let userAgent = navigator.userAgent;\r\n return userAgent != null && userAgent.match(checkMobileRegex) != null;\r\n };\r\n}();\r\n\r\nexport function isDesktop() {\r\n return !BrowserUtils.isMobile();\r\n}\r\n\r\nexport let isLocalhost = function () {\r\n let localhostRegex = new RegExp(\"(localhost|127\\\\.0\\\\.0\\\\.1)(:(\\\\d{4}))?\");\r\n return function isLocalhost(port = null, isRegex = false) {\r\n let isLocalhost = false;\r\n\r\n let localhostMatch = window.location.origin.match(localhostRegex);\r\n\r\n if (localhostMatch != null) {\r\n if (port == null) {\r\n isLocalhost = true;\r\n } else if (localhostMatch.length >= 4 && localhostMatch[3] != null) {\r\n let portMatch = localhostMatch[3];\r\n if (isRegex) {\r\n isLocalhost = portMatch.match(port) != null;\r\n } else {\r\n isLocalhost = portMatch == port;\r\n }\r\n }\r\n }\r\n\r\n return isLocalhost;\r\n };\r\n}();\r\n\r\nexport function openLink(url, newTab = true, exitXRSessionBeforeOpen = true, exitXRSessionOnSuccess = true, tryOpenLinkOnClickOnFailure = false, onSuccessCallback = null, onFailureCallback = null, engine = Globals.getMainEngine()) {\r\n let element = document.createElement(\"a\");\r\n\r\n element.style.display = \"none\";\r\n\r\n document.body.appendChild(element);\r\n\r\n element.addEventListener(\"click\", function () {\r\n let targetPage = undefined;\r\n if (newTab) {\r\n targetPage = \"_blank\";\r\n } else {\r\n targetPage = \"_top\";\r\n }\r\n\r\n let result = window.open(url, targetPage);\r\n\r\n if (result != null) {\r\n if (!exitXRSessionBeforeOpen && exitXRSessionOnSuccess) {\r\n XRUtils.exitSession(engine);\r\n }\r\n\r\n if (onSuccessCallback != null) {\r\n onSuccessCallback();\r\n }\r\n } else {\r\n if (tryOpenLinkOnClickOnFailure) {\r\n setTimeout(function () {\r\n BrowserUtils.openLinkOnClick(url, newTab, exitXRSessionOnSuccess, onSuccessCallback, onFailureCallback);\r\n }, 100);\r\n } else if (onFailureCallback != null) {\r\n onFailureCallback();\r\n }\r\n }\r\n });\r\n\r\n if (exitXRSessionBeforeOpen) {\r\n XRUtils.exitSession(engine);\r\n }\r\n\r\n element.click();\r\n\r\n document.body.removeChild(element);\r\n}\r\n\r\nexport function openLinkOnClick(url, newTab = true, exitXRSessionOnSuccess = true, onSuccessCallback = null, onFailureCallback = null, engine = Globals.getMainEngine()) {\r\n document.addEventListener(\"click\", function () {\r\n let targetPage = undefined;\r\n if (newTab) {\r\n targetPage = \"_blank\";\r\n } else {\r\n targetPage = \"_top\";\r\n }\r\n\r\n let result = window.open(url, targetPage);\r\n\r\n if (result != null) {\r\n if (exitXRSessionOnSuccess) {\r\n XRUtils.exitSession(engine);\r\n }\r\n\r\n if (onSuccessCallback != null) {\r\n onSuccessCallback();\r\n }\r\n } else {\r\n if (onFailureCallback != null) {\r\n onFailureCallback();\r\n }\r\n }\r\n }, { once: true });\r\n}\r\n\r\nexport let BrowserUtils = {\r\n isMobile,\r\n isDesktop,\r\n isLocalhost,\r\n openLink,\r\n openLinkOnClick\r\n};", "\r\nexport class AnalyticsManager {\r\n\r\n private _myAnalyticsEnabled: boolean = true;\r\n\r\n private _mySendDataCallback: ((...args: unknown[]) => void) | null = null;\r\n\r\n private _myDefaultEventCooldown: number = 0;\r\n private _myEventCooldowns: Map = new Map();\r\n\r\n private _myEventsSentOnce: string[] = [];\r\n\r\n private _myDataLogEnabled: boolean = false;\r\n private _myEventsLogEnabled: boolean = false;\r\n\r\n private _myErrorsLogEnabled: boolean = false;\r\n\r\n public update(dt: number): void {\r\n if (this._myEventCooldowns.size > 0) {\r\n for (const [eventName, eventCooldown] of this._myEventCooldowns.entries()) {\r\n const newCooldown = eventCooldown - dt;\r\n if (newCooldown <= 0) {\r\n this._myEventCooldowns.delete(eventName);\r\n } else {\r\n this._myEventCooldowns.set(eventName, newCooldown);\r\n }\r\n }\r\n }\r\n }\r\n\r\n public setAnalyticsEnabled(enabled: boolean): void {\r\n this._myAnalyticsEnabled = enabled;\r\n }\r\n\r\n public isAnalyticsEnabled(): boolean {\r\n return this._myAnalyticsEnabled;\r\n }\r\n\r\n public setSendDataCallback(callback: ((...args: unknown[]) => void) | null): void {\r\n this._mySendDataCallback = callback;\r\n }\r\n\r\n public sendData(...args: unknown[]): boolean {\r\n let dataSent = false;\r\n\r\n try {\r\n if (this._myAnalyticsEnabled) {\r\n if (this._myDataLogEnabled) {\r\n console.log(\"Analytics Data: \" + args);\r\n }\r\n\r\n if (this._mySendDataCallback != null) {\r\n this._mySendDataCallback(...args);\r\n\r\n dataSent = true;\r\n } else if (this._myErrorsLogEnabled) {\r\n console.error(\"Analytics Error: You need to set the send data callback\");\r\n } else {\r\n console.warn(\"Analytics Error: You need to set the send data callback\");\r\n }\r\n }\r\n } catch (error) {\r\n if (this._myErrorsLogEnabled) {\r\n console.error(error);\r\n }\r\n\r\n dataSent = false;\r\n }\r\n\r\n return dataSent;\r\n }\r\n\r\n public sendEvent(eventName: string, params?: Record): boolean {\r\n let eventSent = false;\r\n\r\n try {\r\n if (this._myAnalyticsEnabled) {\r\n if (this._myEventsLogEnabled) {\r\n if (params != null) {\r\n console.log(\"Analytics Event: \" + eventName + \" - Params:\", params);\r\n } else {\r\n console.log(\"Analytics Event: \" + eventName);\r\n }\r\n }\r\n\r\n if (this._mySendDataCallback != null) {\r\n if (params != null) {\r\n this._mySendDataCallback(\"event\", eventName, params);\r\n } else {\r\n this._mySendDataCallback(\"event\", eventName);\r\n }\r\n\r\n eventSent = true;\r\n } else if (this._myErrorsLogEnabled) {\r\n console.error(\"Analytics Error: You need to set the send data callback\");\r\n } else {\r\n console.warn(\"Analytics Error: You need to set the send data callback\");\r\n }\r\n }\r\n } catch (error) {\r\n if (this._myErrorsLogEnabled) {\r\n console.error(error);\r\n }\r\n\r\n eventSent = false;\r\n }\r\n\r\n return eventSent;\r\n }\r\n\r\n public sendEventOnce(eventName: string, params?: Record): boolean {\r\n let eventSent = false;\r\n\r\n if (this._myAnalyticsEnabled) {\r\n if (!this.hasEventAlreadyBeenSent(eventName)) {\r\n eventSent = this.sendEvent(eventName, params);\r\n\r\n if (eventSent) {\r\n this._myEventsSentOnce.pp_pushUnique(eventName);\r\n }\r\n }\r\n }\r\n\r\n return eventSent;\r\n }\r\n\r\n public sendEventWithValue(eventName: string, value: number): boolean {\r\n return this.sendEvent(eventName, { \"value\": value });\r\n }\r\n\r\n public sendEventOnceWithValue(eventName: string, value: number): boolean {\r\n return this.sendEventOnce(eventName, { \"value\": value });\r\n }\r\n\r\n public clearEventSentOnceState(eventName: string): void {\r\n this._myEventsSentOnce.pp_removeEqual(eventName);\r\n }\r\n\r\n public clearAllEventsSentOnceState(): void {\r\n this._myEventsSentOnce.pp_clear();\r\n }\r\n\r\n public hasEventAlreadyBeenSent(eventName: string): boolean {\r\n return this._myEventsSentOnce.pp_hasEqual(eventName);\r\n }\r\n\r\n public getEventsAlreadyBeenSent(): string[] {\r\n return this._myEventsSentOnce;\r\n }\r\n\r\n public sendEventWithCooldown(eventName: string, cooldownSeconds: number = this._myDefaultEventCooldown, params?: Record): boolean {\r\n let eventSent = false;\r\n\r\n if (this._myAnalyticsEnabled) {\r\n if (this.getEventCooldown(eventName) <= 0) {\r\n eventSent = this.sendEvent(eventName, params);\r\n\r\n if (eventSent) {\r\n this._myEventCooldowns.set(eventName, cooldownSeconds);\r\n }\r\n }\r\n }\r\n\r\n return eventSent;\r\n }\r\n\r\n public getDefaultEventCooldown(): number {\r\n return this._myDefaultEventCooldown;\r\n }\r\n\r\n public setDefaultEventCooldown(cooldownSeconds: number): void {\r\n this._myDefaultEventCooldown = cooldownSeconds;\r\n }\r\n\r\n public clearEventCooldown(eventName: string): void {\r\n this._myEventCooldowns.delete(eventName);\r\n }\r\n\r\n public clearAllEventCooldowns(): void {\r\n this._myEventCooldowns.clear();\r\n }\r\n\r\n public getEventCooldown(eventName: string): number {\r\n const eventCooldown = this._myEventCooldowns.get(eventName);\r\n\r\n if (eventCooldown != null) {\r\n return eventCooldown;\r\n }\r\n\r\n return 0;\r\n }\r\n\r\n public getEventCooldowns(): Map {\r\n return this._myEventCooldowns;\r\n }\r\n\r\n public setDataLogEnabled(enabled: boolean): void {\r\n this._myDataLogEnabled = enabled;\r\n }\r\n\r\n public isDataLogEnabled(): boolean {\r\n return this._myDataLogEnabled;\r\n }\r\n\r\n public setEventsLogEnabled(enabled: boolean): void {\r\n this._myEventsLogEnabled = enabled;\r\n }\r\n\r\n public isEventsLogEnabled(): boolean {\r\n return this._myEventsLogEnabled;\r\n }\r\n\r\n public setErrorsLogEnabled(enabled: boolean): void {\r\n this._myErrorsLogEnabled = enabled;\r\n }\r\n\r\n public isErrorsLogEnabled(): boolean {\r\n return this._myErrorsLogEnabled;\r\n }\r\n}", "import { Component, property } from \"@wonderlandengine/api\";\r\nimport { XRUtils } from \"../../../cauldron/utils/xr_utils.js\";\r\n\r\nexport class ClearConsoleComponent extends Component {\r\n public static override TypeName = \"pp-clear-console\";\r\n\r\n @property.enum([\"Init\", \"Start\", \"Update\", \"Enter XR\", \"Exit XR\"], \"Init\")\r\n private _myWhen!: number;\r\n\r\n @property.bool(true)\r\n private _myFirstTimeOnly!: boolean;\r\n\r\n private _myFirstTimeDone: boolean = false;\r\n\r\n public override init(): void {\r\n if (this._myWhen == 0) {\r\n this._clearConsole();\r\n }\r\n }\r\n\r\n public override start(): void {\r\n if (this._myWhen == 1) {\r\n this._clearConsole();\r\n }\r\n }\r\n\r\n public override update(dt: number): void {\r\n if (this._myWhen == 2) {\r\n this._clearConsole();\r\n }\r\n }\r\n\r\n private _onXRSessionStart(): void {\r\n if (this._myWhen == 3) {\r\n this._clearConsole();\r\n }\r\n }\r\n\r\n private _onXRSessionEnd(): void {\r\n if (this._myWhen == 4) {\r\n this._clearConsole();\r\n }\r\n }\r\n\r\n private _clearConsole(): void {\r\n if (!this._myFirstTimeOnly || !this._myFirstTimeDone) {\r\n console.clear();\r\n\r\n this._myFirstTimeDone = true;\r\n }\r\n\r\n if (this._myFirstTimeOnly && this._myFirstTimeDone) {\r\n this.active = false;\r\n }\r\n }\r\n\r\n public override onActivate(): void {\r\n if (this._myWhen == 3) {\r\n XRUtils.registerSessionStartEventListener(this, this._onXRSessionStart.bind(this), true, true, this.engine);\r\n }\r\n\r\n if (this._myWhen == 4) {\r\n XRUtils.registerSessionEndEventListener(this, this._onXRSessionEnd.bind(this), this.engine);\r\n }\r\n }\r\n\r\n public override onDeactivate(): void {\r\n XRUtils.unregisterSessionStartEndEventListeners(this, this.engine);\r\n }\r\n}", "import { Component, Property } from \"@wonderlandengine/api\";\r\nimport { Globals } from \"../../../pp/globals.js\";\r\nimport { SaveManager } from \"../save_manager.js\";\r\n\r\nexport class SaveManagerComponent extends Component {\r\n static TypeName = \"pp-save-manager\";\r\n static Properties = {\r\n _mySaveID: Property.string(\"\"),\r\n _myAutoLoadSaves: Property.bool(true)\r\n };\r\n\r\n init() {\r\n this._mySaveManager = null;\r\n\r\n if (this._mySaveID.length > 0) {\r\n this._mySaveManager = new SaveManager(this._mySaveID, this._myAutoLoadSaves, this.engine);\r\n }\r\n }\r\n\r\n update(dt) {\r\n if (this._mySaveManager != null && Globals.getSaveManager(this.engine) == this._mySaveManager) {\r\n this._mySaveManager.update(dt);\r\n }\r\n }\r\n\r\n onActivate() {\r\n if (this._mySaveManager != null && !Globals.hasSaveManager(this.engine)) {\r\n this._mySaveManager.setActive(true);\r\n\r\n Globals.setSaveManager(this._mySaveManager, this.engine);\r\n }\r\n }\r\n\r\n onDeactivate() {\r\n if (this._mySaveManager != null) {\r\n this._mySaveManager.setActive(false);\r\n\r\n if (Globals.getSaveManager(this.engine) == this._mySaveManager) {\r\n Globals.removeSaveManager(this.engine);\r\n }\r\n }\r\n }\r\n\r\n onDestroy() {\r\n if (this._mySaveManager != null) {\r\n this._mySaveManager.destroy();\r\n }\r\n }\r\n}", "import { Emitter } from \"@wonderlandengine/api\";\r\nimport { Globals } from \"../../pp/globals.js\";\r\nimport { SaveUtils } from \"../utils/save_utils.js\";\r\nimport { XRUtils } from \"../utils/xr_utils.js\";\r\nimport { Timer } from \"./timer.js\";\r\n\r\nexport class SaveManager {\r\n\r\n constructor(saveID, autoLoadSaves = true, engine = Globals.getMainEngine()) {\r\n this._myEngine = engine;\r\n\r\n this._mySaveID = saveID;\r\n\r\n this._myCommitSavesDelayTimer = new Timer(0, false);\r\n this._myDelaySavesCommit = true;\r\n this._myCommitSavesDirty = false;\r\n this._myCommitSavesDirtyClearOnFail = true;\r\n this._myCommitSavesOnInterrupt = true;\r\n this._myCommitSavesWhenLoadSavesFailed = false;\r\n this._myResetSaveObjectOnLoadSavesFail = false;\r\n\r\n this._mySaveObject = {};\r\n this._myLoadSavesSucceded = false;\r\n\r\n this._mySaveObjectLoadedOnce = false;\r\n this._myAtLeastOneValueSavedOnce = false;\r\n\r\n this._myClearEmitter = new Emitter(); // Signature: listener()\r\n this._myDeleteEmitter = new Emitter(); // Signature: listener(id)\r\n this._myDeleteIDEmitters = new Map(); // Signature: listener(id)\r\n this._mySaveEmitter = new Emitter(); // Signature: listener(id, value)\r\n this._mySaveValueChangedEmitter = new Emitter(); // Signature: listener(id, value)\r\n this._mySaveIDEmitters = new Map(); // Signature: listener(id, value)\r\n this._mySaveValueChangedIDEmitters = new Map(); // Signature: listener(id, value)\r\n this._myCommitSavesEmitter = new Emitter(); // Signature: listener(succeeded)\r\n this._myLoadEmitter = new Emitter(); // Signature: listener(id, value)\r\n this._myLoadIDEmitters = new Map(); // Signature: listener(id, value)\r\n this._myLoadSavesEmitter = new Emitter(); // Signature: listener(loadSavesSucceded, saveObjectReset)\r\n\r\n if (autoLoadSaves) {\r\n this.loadSaves();\r\n }\r\n\r\n this._myXRVisibilityChangeEventListener = null;\r\n this._myWindowVisibilityChangeEventListener = function () {\r\n if (document.visibilityState != \"visible\") {\r\n this._onInterrupt();\r\n }\r\n }.bind(this);\r\n\r\n this._myActive = false;\r\n this.setActive(true);\r\n\r\n this._myDestroyed = false;\r\n }\r\n\r\n setCommitSavesDelay(delay) {\r\n this._myCommitSavesDelayTimer.start(delay);\r\n }\r\n\r\n setDelaySavesCommit(delayed) {\r\n this._myDelaySavesCommit = delayed;\r\n }\r\n\r\n setCommitSavesDirty(dirty, startDelayTimer = true) {\r\n this._myCommitSavesDirty = dirty;\r\n if (dirty && startDelayTimer) {\r\n if (!this.startDelayTimer.isRunning()) {\r\n this._myCommitSavesDelayTimer.start();\r\n }\r\n } else {\r\n this._myCommitSavesDelayTimer.reset();\r\n }\r\n }\r\n\r\n setCommitSavesDirtyClearOnFail(clearOnFail) {\r\n this._myCommitSavesDirtyClearOnFail = clearOnFail;\r\n }\r\n\r\n setCommitSavesOnInterrupt(commitSavesOnInterrupt) {\r\n this._myCommitSavesOnInterrupt = commitSavesOnInterrupt;\r\n }\r\n\r\n setCommitSavesWhenLoadSavesFailed(commitSavesWhenLoadSavesFailed) {\r\n this._myCommitSavesWhenLoadSavesFailed = commitSavesWhenLoadSavesFailed;\r\n }\r\n\r\n setResetSaveObjectOnLoadSavesFail(resetSaveObjectOnLoadSavesFail) {\r\n this._myResetSaveObjectOnLoadSavesFail = resetSaveObjectOnLoadSavesFail;\r\n }\r\n\r\n getCommitSavesDelay() {\r\n return this._myCommitSavesDelayTimer.getDuration();\r\n }\r\n\r\n isDelaySavesCommit() {\r\n return this._myDelaySavesCommit;\r\n }\r\n\r\n isCommitSavesDirty() {\r\n return this._myCommitSavesDirty;\r\n }\r\n\r\n isCommitSavesDirtyClearOnFail() {\r\n return this._myCommitSavesDirtyClearOnFail;\r\n }\r\n\r\n isCommitSavesOnInterrupt() {\r\n return this._myCommitSavesOnInterrupt;\r\n }\r\n\r\n isCommitSavesWhenLoadSavesFailed() {\r\n return this._myCommitSavesWhenLoadSavesFailed;\r\n }\r\n\r\n isResetSaveObjectOnLoadSavesFail() {\r\n return this._myResetSaveObjectOnLoadSavesFail;\r\n }\r\n\r\n hasLoadSavesSucceded() {\r\n return this._myLoadSavesSucceded;\r\n }\r\n\r\n update(dt) {\r\n if (this._myCommitSavesDelayTimer.isRunning()) {\r\n this._myCommitSavesDelayTimer.update(dt);\r\n if (this._myCommitSavesDelayTimer.isDone()) {\r\n if (this._myCommitSavesDirty) {\r\n this._commitSaves();\r\n }\r\n }\r\n } else {\r\n if (this._myCommitSavesDirty) {\r\n this._commitSaves();\r\n }\r\n }\r\n }\r\n\r\n has(id) {\r\n return id in this._mySaveObject;\r\n }\r\n\r\n save(id, value, delaySavesCommitOverride = null) {\r\n let sameValue = false;\r\n if (this.has(id)) {\r\n sameValue = this._mySaveObject[id] === value;\r\n }\r\n\r\n if (!sameValue) {\r\n this._mySaveObject[id] = value;\r\n\r\n if ((this._myDelaySavesCommit && delaySavesCommitOverride == null) || (delaySavesCommitOverride != null && delaySavesCommitOverride)) {\r\n this._myCommitSavesDirty = true;\r\n if (!this._myCommitSavesDelayTimer.isRunning()) {\r\n this._myCommitSavesDelayTimer.start();\r\n }\r\n } else {\r\n this._commitSaves();\r\n }\r\n }\r\n\r\n this._myAtLeastOneValueSavedOnce = true;\r\n\r\n this._mySaveEmitter.notify(id, value);\r\n\r\n if (this._mySaveIDEmitters.size > 0) {\r\n let emitter = this._mySaveIDEmitters.get(id);\r\n if (emitter != null) {\r\n emitter.notify(id, value);\r\n }\r\n }\r\n\r\n if (!sameValue) {\r\n this._mySaveValueChangedEmitter.notify(id, value);\r\n\r\n if (this._mySaveValueChangedIDEmitters.size > 0) {\r\n let emitter = this._mySaveValueChangedIDEmitters.get(id);\r\n if (emitter != null) {\r\n emitter.notify(id, value);\r\n }\r\n }\r\n }\r\n }\r\n\r\n delete(id, delaySavesCommitOverride = null) {\r\n if (this.has(id)) {\r\n delete this._mySaveObject[id];\r\n\r\n if ((this._myDelaySavesCommit && delaySavesCommitOverride == null) || (delaySavesCommitOverride != null && delaySavesCommitOverride)) {\r\n this._myCommitSavesDirty = true;\r\n if (!this._myCommitSavesDelayTimer.isRunning()) {\r\n this._myCommitSavesDelayTimer.start();\r\n }\r\n } else {\r\n this._commitSaves();\r\n }\r\n }\r\n\r\n this._myAtLeastOneValueSavedOnce = true;\r\n\r\n this._myDeleteEmitter.notify(id);\r\n\r\n if (this._myDeleteIDEmitters.size > 0) {\r\n let emitter = this._myDeleteIDEmitters.get(id);\r\n if (emitter != null) {\r\n emitter.notify(id);\r\n }\r\n }\r\n }\r\n\r\n clear(delaySavesCommitOverride = null) {\r\n if (Object.keys(this._mySaveObject).length > 0) {\r\n this._mySaveObject = {};\r\n\r\n if ((this._myDelaySavesCommit && delaySavesCommitOverride == null) || (delaySavesCommitOverride != null && delaySavesCommitOverride)) {\r\n this._myCommitSavesDirty = true;\r\n if (!this._myCommitSavesDelayTimer.isRunning()) {\r\n this._myCommitSavesDelayTimer.start();\r\n }\r\n } else {\r\n this._commitSaves();\r\n }\r\n }\r\n\r\n this._myAtLeastOneValueSavedOnce = true;\r\n\r\n this._myClearEmitter.notify();\r\n }\r\n\r\n load(id, defaultValue) {\r\n let value = this._mySaveObject[id];\r\n\r\n if (value == null && defaultValue != null) {\r\n value = defaultValue;\r\n }\r\n\r\n this._myLoadEmitter.notify(id, value);\r\n\r\n if (this._myLoadIDEmitters.size > 0) {\r\n let emitter = this._myLoadIDEmitters.get(id);\r\n if (emitter != null) {\r\n emitter.notify(id, value);\r\n }\r\n }\r\n\r\n return value;\r\n }\r\n\r\n commitSaves(commitSavesOnlyIfDirty = true) {\r\n if (this._myCommitSavesDirty || !commitSavesOnlyIfDirty) {\r\n this._commitSaves();\r\n }\r\n }\r\n\r\n _commitSaves() {\r\n let succeded = true;\r\n\r\n if (this._myLoadSavesSucceded || this._myCommitSavesWhenLoadSavesFailed) {\r\n try {\r\n let saveObjectStringified = JSON.stringify(this._mySaveObject);\r\n SaveUtils.save(this._mySaveID, saveObjectStringified);\r\n } catch (error) {\r\n succeded = false;\r\n }\r\n }\r\n\r\n if (succeded || this._myCommitSavesDirtyClearOnFail) {\r\n this._myCommitSavesDirty = false;\r\n this._myCommitSavesDelayTimer.reset();\r\n }\r\n\r\n this._myCommitSavesEmitter.notify(succeded);\r\n\r\n return succeded;\r\n }\r\n\r\n loadSaves() {\r\n let saveObject = {};\r\n let loadSavesSucceded = false;\r\n let saveObjectReset = false;\r\n\r\n let maxLoadObjectAttempts = 3;\r\n do {\r\n try {\r\n saveObject = SaveUtils.loadObject(this._mySaveID, {});\r\n loadSavesSucceded = true;\r\n } catch (error) {\r\n maxLoadObjectAttempts--;\r\n }\r\n } while (maxLoadObjectAttempts > 0 && !loadSavesSucceded);\r\n\r\n if (loadSavesSucceded) {\r\n this._mySaveObject = saveObject;\r\n this._myLoadSavesSucceded = true;\r\n } else if (this._myResetSaveObjectOnLoadSavesFail) {\r\n this._mySaveObject = {};\r\n this._myLoadSavesSucceded = false;\r\n\r\n saveObjectReset = true;\r\n }\r\n\r\n this._mySaveObjectLoadedOnce = true;\r\n\r\n this._myLoadSavesEmitter.notify(loadSavesSucceded, saveObjectReset);\r\n\r\n return loadSavesSucceded;\r\n }\r\n\r\n _onXRSessionStart(session) {\r\n this._myXRVisibilityChangeEventListener = function (event) {\r\n if (event.session.visibilityState != \"visible\") {\r\n this._onInterrupt();\r\n }\r\n }.bind(this);\r\n\r\n session.addEventListener(\"visibilitychange\", this._myXRVisibilityChangeEventListener);\r\n }\r\n\r\n _onXRSessionEnd() {\r\n this._myXRVisibilityChangeEventListener = null;\r\n\r\n this._onInterrupt();\r\n }\r\n\r\n _onInterrupt() {\r\n if (this._myCommitSavesOnInterrupt && this._myCommitSavesDirty && (this._mySaveObjectLoadedOnce || this._myAtLeastOneValueSavedOnce)) {\r\n this.commitSaves();\r\n }\r\n }\r\n\r\n registerClearEventListener(listenerID, listener) {\r\n this._myClearEmitter.add(listener, { id: listenerID });\r\n }\r\n\r\n unregisterClearEventListener(listenerID) {\r\n this._myClearEmitter.remove(listenerID);\r\n }\r\n\r\n registerDeleteEventListener(listenerID, listener) {\r\n this._myDeleteEmitter.add(listener, { id: listenerID });\r\n }\r\n\r\n unregisterDeleteEventListener(listenerID) {\r\n this._myDeleteEmitter.remove(listenerID);\r\n }\r\n\r\n registerDeleteIDEventListener(valueID, listenerID, listener) {\r\n let valueIDEmitter = this._myDeleteIDEmitters.get(valueID);\r\n if (valueIDEmitter == null) {\r\n this._myDeleteIDEmitters.set(valueID, new Map());\r\n valueIDEmitter = this._myDeleteIDEmitters.get(valueID);\r\n }\r\n\r\n valueIDEmitter.add(listener, { id: listenerID });\r\n }\r\n\r\n unregisterDeleteIDEventListener(valueID, listenerID) {\r\n let valueIDEmitter = this._myDeleteIDEmitters.get(valueID);\r\n if (valueIDEmitter != null) {\r\n valueIDEmitter.remove(listenerID);\r\n\r\n if (valueIDEmitter.size <= 0) {\r\n this._myDeleteIDEmitters.delete(valueID);\r\n }\r\n }\r\n }\r\n\r\n registerSaveEventListener(listenerID, listener) {\r\n this._mySaveEmitter.add(listener, { id: listenerID });\r\n }\r\n\r\n unregisterSaveEventListener(listenerID) {\r\n this._mySaveEmitter.remove(listenerID);\r\n }\r\n\r\n registerSaveIDEventListener(valueID, listenerID, listener) {\r\n let valueIDEmitter = this._mySaveIDEmitters.get(valueID);\r\n if (valueIDEmitter == null) {\r\n this._mySaveIDEmitters.set(valueID, new Map());\r\n valueIDEmitter = this._mySaveIDEmitters.get(valueID);\r\n }\r\n\r\n valueIDEmitter.add(listener, { id: listenerID });\r\n }\r\n\r\n unregisterSaveIDEventListener(valueID, listenerID) {\r\n let valueIDEmitter = this._mySaveIDEmitters.get(valueID);\r\n if (valueIDEmitter != null) {\r\n valueIDEmitter.remove(listenerID);\r\n\r\n if (valueIDEmitter.size <= 0) {\r\n this._mySaveIDEmitters.delete(valueID);\r\n }\r\n }\r\n }\r\n\r\n registerSaveValueChangedEventListener(listenerID, listener) {\r\n this._mySaveValueChangedEmitter.add(listener, { id: listenerID });\r\n }\r\n\r\n unregisterSaveValueChangedEventListener(listenerID) {\r\n this._mySaveValueChangedEmitter.remove(listenerID);\r\n }\r\n\r\n registerSaveValueChangedIDEventListener(valueID, listenerID, listener) {\r\n let valueIDEmitter = this._mySaveValueChangedIDEmitters.get(valueID);\r\n if (valueIDEmitter == null) {\r\n this._mySaveValueChangedIDEmitters.set(valueID, new Map());\r\n valueIDEmitter = this._mySaveValueChangedIDEmitters.get(valueID);\r\n }\r\n\r\n valueIDEmitter.add(listener, { id: listenerID });\r\n }\r\n\r\n unregisterSaveValueChangedIDEventListener(valueID, listenerID) {\r\n let valueIDEmitter = this._mySaveValueChangedIDEmitters.get(valueID);\r\n if (valueIDEmitter != null) {\r\n valueIDEmitter.remove(listenerID);\r\n\r\n if (valueIDEmitter.size <= 0) {\r\n this._mySaveValueChangedIDEmitters.delete(valueID);\r\n }\r\n }\r\n }\r\n\r\n registerCommitSavesEventListener(listenerID, listener) {\r\n this._myCommitSavesEmitter.add(listener, { id: listenerID });\r\n }\r\n\r\n unregisterCommitSavesEventListener(listenerID) {\r\n this._myCommitSavesEmitter.remove(listenerID);\r\n }\r\n\r\n registerLoadEventListener(listenerID, listener) {\r\n this._myLoadEmitter.add(listener, { id: listenerID });\r\n }\r\n\r\n unregisterLoadEventListener(listenerID) {\r\n this._myLoadEmitter.remove(listenerID);\r\n }\r\n\r\n registerLoadIDEventListener(valueID, listenerID, listener) {\r\n let valueIDEmitter = this._myLoadIDEmitters.get(valueID);\r\n if (valueIDEmitter == null) {\r\n this._myLoadIDEmitters.set(valueID, new Map());\r\n valueIDEmitter = this._myLoadIDEmitters.get(valueID);\r\n }\r\n\r\n valueIDEmitter.add(listener, { id: listenerID });\r\n }\r\n\r\n unregisterLoadIDEventListener(valueID, listenerID) {\r\n let valueIDEmitter = this._myLoadIDEmitters.get(valueID);\r\n if (valueIDEmitter != null) {\r\n valueIDEmitter.remove(listenerID);\r\n\r\n if (valueIDEmitter.size <= 0) {\r\n this._myLoadIDEmitters.delete(valueID);\r\n }\r\n }\r\n }\r\n\r\n registerLoadSavesEventListener(listenerID, listener) {\r\n this._myLoadSavesEmitter.add(listener, { id: listenerID });\r\n }\r\n\r\n unregisterLoadSavesEventListener(listenerID) {\r\n this._myLoadSavesEmitter.remove(listenerID);\r\n }\r\n\r\n setActive(active) {\r\n if (this._myActive != active) {\r\n this._myActive = active;\r\n\r\n if (active) {\r\n XRUtils.registerSessionStartEndEventListeners(this, this._onXRSessionStart.bind(this), this._onXRSessionEnd.bind(this), true, false, this._myEngine);\r\n window.addEventListener(\"visibilitychange\", this._myWindowVisibilityChangeEventListener);\r\n } else {\r\n XRUtils.getSession(this._myEngine)?.removeEventListener(\"visibilitychange\", this._myXRVisibilityChangeEventListener);\r\n XRUtils.unregisterSessionStartEndEventListeners(this, this._myEngine);\r\n\r\n window.removeEventListener(\"visibilitychange\", this._myWindowVisibilityChangeEventListener);\r\n }\r\n }\r\n }\r\n\r\n isActive() {\r\n return this._myActive;\r\n }\r\n\r\n destroy() {\r\n this._myDestroyed = true;\r\n\r\n this.setActive(false);\r\n }\r\n\r\n isDestroyed() {\r\n return this._myDestroyed;\r\n }\r\n}", "import { Vector } from \"../type_definitions/array_type_definitions.js\";\r\n\r\nexport function save(id: string, value: string): void {\r\n if (value != null) {\r\n localStorage.setItem(id, value);\r\n }\r\n}\r\n\r\nexport function has(id: string): boolean {\r\n return SaveUtils.loadString(id) != null;\r\n}\r\n\r\nexport function remove(id: string): void {\r\n return localStorage.removeItem(id);\r\n}\r\n\r\nexport function clear(): void {\r\n return localStorage.clear();\r\n}\r\n\r\nexport function load(id: string, defaultValue: string | null): string;\r\nexport function load(id: string): string | null;\r\nexport function load(id: string, defaultValue: string | null = null): string | null {\r\n return SaveUtils.loadString(id, defaultValue!);\r\n}\r\n\r\nexport function loadString(id: string, defaultValue: string): string;\r\nexport function loadString(id: string): string | null;\r\nexport function loadString(id: string, defaultValue: string | null = null): string | null {\r\n const item = localStorage.getItem(id);\r\n\r\n if (item != null) {\r\n return item;\r\n }\r\n\r\n return defaultValue;\r\n}\r\n\r\nexport function loadNumber(id: string, defaultValue: number): number;\r\nexport function loadNumber(id: string): number | null;\r\nexport function loadNumber(id: string, defaultValue: number | null = null): number | null {\r\n const item = SaveUtils.loadString(id);\r\n\r\n if (item != null && item.trim() != \"\" && (item == \"NaN\" || !isNaN(Number(item)))) {\r\n return Number(item);\r\n }\r\n\r\n return defaultValue;\r\n}\r\n\r\nexport function loadBool(id: string, defaultValue: boolean): boolean;\r\nexport function loadBool(id: string): boolean | null;\r\nexport function loadBool(id: string, defaultValue: boolean | null = null): boolean | null {\r\n const item = SaveUtils.loadString(id);\r\n\r\n if (item == \"true\") {\r\n return true;\r\n } else if (item == \"false\") {\r\n return false;\r\n }\r\n\r\n return defaultValue;\r\n}\r\n\r\nexport function loadObject(id: string, defaultValue: Readonly): object;\r\nexport function loadObject(id: string): object | null;\r\nexport function loadObject(id: string, defaultValue: Readonly | null = null): object | null {\r\n const item = SaveUtils.loadString(id);\r\n\r\n if (item != null) {\r\n try {\r\n const parsedObject = JSON.parse(item);\r\n if (parsedObject.constructor == Object) {\r\n return parsedObject;\r\n }\r\n } catch (error) {\r\n // Do nothing\r\n }\r\n }\r\n\r\n return defaultValue;\r\n}\r\n\r\nexport function loadArray(id: string, defaultValue: Readonly): T[];\r\nexport function loadArray(id: string): T[] | null;\r\nexport function loadArray(id: string, defaultValue: Readonly | null = null): T[] | null {\r\n const item = SaveUtils.loadString(id);\r\n\r\n if (item != null) {\r\n try {\r\n const parsedArray = JSON.parse(item);\r\n if (Array.isArray(parsedArray)) {\r\n return parsedArray;\r\n }\r\n } catch (error) {\r\n // Do nothing\r\n }\r\n }\r\n\r\n return defaultValue as T[] | null;\r\n}\r\n\r\nexport function loadVector(id: string, defaultValue: Readonly): Vector;\r\nexport function loadVector(id: string): Vector | null;\r\nexport function loadVector(id: string, defaultValue: Readonly | null = null): Vector | null {\r\n const item = SaveUtils.loadString(id);\r\n\r\n if (item != null) {\r\n try {\r\n const parsedVector = JSON.parse(item);\r\n if (Array.isArray(parsedVector)) {\r\n let areAllNumbers = true;\r\n for (const value of parsedVector) {\r\n if (typeof value != \"number\") {\r\n areAllNumbers = false;\r\n break;\r\n }\r\n }\r\n\r\n if (areAllNumbers) {\r\n return parsedVector;\r\n }\r\n }\r\n } catch (error) {\r\n // Do nothing\r\n }\r\n }\r\n\r\n return defaultValue as Vector | null;\r\n}\r\n\r\nexport const SaveUtils = {\r\n save,\r\n has,\r\n remove,\r\n clear,\r\n load,\r\n loadString,\r\n loadNumber,\r\n loadBool,\r\n loadObject,\r\n loadArray,\r\n loadVector\r\n} as const;", "import { Emitter } from \"@wonderlandengine/api\";\r\nimport { MathUtils } from \"../utils/math_utils.js\";\r\n\r\nexport class Timer {\r\n private _myDuration: number = 0;\r\n private _myTimeLeft: number = 0;\r\n\r\n private _myDone: boolean = false;\r\n private _myJustDone: boolean = false;\r\n private _myStarted: boolean = false;\r\n\r\n private readonly _myOnEndEmitter: Emitter = new Emitter();\r\n\r\n constructor(duration: number, autoStart: boolean = true) {\r\n this._myDuration = duration;\r\n\r\n if (autoStart) {\r\n this.start();\r\n } else {\r\n this.reset();\r\n }\r\n }\r\n\r\n public start(duration?: number): void {\r\n this.reset(duration);\r\n this._myStarted = true;\r\n }\r\n\r\n public end(): void {\r\n this._done();\r\n }\r\n\r\n public reset(duration?: number): void {\r\n if (duration != null) {\r\n this._myDuration = Math.max(0, duration);\r\n }\r\n\r\n this._myTimeLeft = this._myDuration;\r\n this._myDone = false;\r\n this._myJustDone = false;\r\n this._myStarted = false;\r\n }\r\n\r\n public update(dt: number): void {\r\n this._myJustDone = false;\r\n\r\n if (this.isRunning()) {\r\n this._myTimeLeft = Math.max(0, this._myTimeLeft - dt);\r\n if (this._myTimeLeft == 0) {\r\n this._done();\r\n }\r\n }\r\n }\r\n\r\n public isDone(): boolean {\r\n return this._myDone;\r\n }\r\n\r\n public isJustDone(): boolean {\r\n return this._myJustDone;\r\n }\r\n\r\n public isStarted(): boolean {\r\n return this._myStarted;\r\n }\r\n\r\n public isRunning(): boolean {\r\n return this.isStarted() && !this.isDone();\r\n }\r\n\r\n public getDuration(): number {\r\n return this._myDuration;\r\n }\r\n\r\n public setDuration(duration: number): void {\r\n const newDuration = Math.max(0, duration);\r\n\r\n if (this.isRunning()) {\r\n const timeElapsed = Math.max(0, this._myDuration - this._myTimeLeft);\r\n this._myTimeLeft = Math.max(0, newDuration - timeElapsed);\r\n }\r\n\r\n this._myDuration = newDuration;\r\n }\r\n\r\n public getTimeLeft(): number {\r\n return this._myTimeLeft;\r\n }\r\n\r\n public setTimeLeft(timeLeft: number, keepPercentage: boolean = false): void {\r\n if (this.isRunning()) {\r\n const currentPercentage = this.getPercentage();\r\n\r\n this._myTimeLeft = Math.max(0, timeLeft);\r\n\r\n if (this._myTimeLeft > this._myDuration) {\r\n this._myDuration = this._myTimeLeft;\r\n }\r\n\r\n if (keepPercentage && this._myTimeLeft > MathUtils.EPSILON) {\r\n this._myDuration = this._myTimeLeft / Math.max(MathUtils.EPSILON, (1 - currentPercentage));\r\n }\r\n }\r\n }\r\n\r\n public getTimeElapsed(): number {\r\n let timeElapsed = 0;\r\n if (this.isRunning()) {\r\n timeElapsed = this._myDuration - this._myTimeLeft;\r\n }\r\n return Math.max(0, timeElapsed);\r\n }\r\n\r\n public setTimeElapsed(timeElapsed: number): void {\r\n this.setTimeLeft(this._myDuration - Math.max(0, timeElapsed));\r\n }\r\n\r\n public getPercentage(): number {\r\n let percentage = 1;\r\n if (this._myTimeLeft > 0 && this._myDuration > 0) {\r\n percentage = (this._myDuration - this._myTimeLeft) / this._myDuration;\r\n }\r\n return Math.pp_clamp(percentage, 0, 1);\r\n }\r\n\r\n public setPercentage(percentage: number): void {\r\n if (this.isRunning()) {\r\n const durationPercentage = Math.pp_clamp(1 - percentage, 0, 1);\r\n this._myTimeLeft = this._myDuration * durationPercentage;\r\n }\r\n }\r\n\r\n public onEnd(listener: () => void, id?: unknown): void {\r\n this._myOnEndEmitter.add(listener, { id: id });\r\n }\r\n\r\n public unregisterOnEnd(id?: unknown): void {\r\n this._myOnEndEmitter.remove(id);\r\n }\r\n\r\n private _done(): void {\r\n this._myTimeLeft = 0;\r\n this._myDone = true;\r\n this._myJustDone = true;\r\n\r\n this._myOnEndEmitter.notify();\r\n }\r\n}", "import { Component } from \"@wonderlandengine/api\";\r\nimport { Globals } from \"../../../pp/globals.js\";\r\nimport { ObjectPoolManager } from \"../object_pool_manager.js\";\r\n\r\nexport class ObjectPoolManagerComponent extends Component {\r\n static TypeName = \"pp-object-pools-manager\";\r\n\r\n init() {\r\n this._myObjectPoolManager = new ObjectPoolManager();\r\n }\r\n\r\n onActivate() {\r\n if (!Globals.hasObjectPoolManager(this.engine)) {\r\n Globals.setObjectPoolManager(this._myObjectPoolManager, this.engine);\r\n }\r\n }\r\n\r\n onDeactivate() {\r\n if (Globals.getObjectPoolManager(this.engine) == this._myObjectPoolManager) {\r\n this._myObjectPoolManager.releaseAll();\r\n\r\n Globals.removeObjectPoolManager(this.engine);\r\n }\r\n }\r\n\r\n onDestroy() {\r\n this._myObjectPoolManager.destroy();\r\n }\r\n}", "import { BaseObjectPool } from \"./object_pool.js\";\r\n\r\nexport class ObjectPoolManager {\r\n\r\n private readonly _myPools: Map = new Map();\r\n\r\n private _myDestroyed: boolean = false;\r\n\r\n constructor() {\r\n this._myPools = new Map();\r\n\r\n this._myDestroyed = false;\r\n }\r\n\r\n public addPool(poolID: unknown, pool: BaseObjectPool): void {\r\n if (!this._myPools.has(poolID)) {\r\n this._myPools.set(poolID, pool);\r\n } else {\r\n console.warn(\"Trying to add a Pool with an ID that has been already used:\", poolID);\r\n }\r\n }\r\n\r\n public destroyPool(poolID: unknown): void {\r\n const poolToRemove = this._myPools.get(poolID);\r\n if (poolToRemove != null) {\r\n this._myPools.delete(poolID);\r\n poolToRemove.destroy();\r\n }\r\n }\r\n\r\n public getPool(poolID: unknown): ObjectPoolType | null {\r\n const objectPool = this._myPools.get(poolID);\r\n return objectPool != null ? objectPool as ObjectPoolType : null;\r\n }\r\n\r\n public hasPool(poolID: unknown): boolean {\r\n return this._myPools.has(poolID);\r\n }\r\n\r\n public get(poolID: unknown): PoolObjectType | null {\r\n if (this._myPools.has(poolID)) {\r\n return this._myPools.get(poolID)!.get() as PoolObjectType | null;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n public has(poolID: unknown, object: PoolObjectType): boolean;\r\n public has(object: PoolObjectType): boolean;\r\n public has(poolIDOrObject: unknown | PoolObjectType, object?: PoolObjectType): boolean {\r\n let hasObject = false;\r\n\r\n if (object == null) {\r\n for (const pool of this._myPools.values()) {\r\n if (pool.has(poolIDOrObject)) {\r\n hasObject = true;\r\n break;\r\n }\r\n }\r\n } else if (this._myPools.has(poolIDOrObject)) {\r\n hasObject = this._myPools.get(poolIDOrObject)!.has(object);\r\n }\r\n\r\n return hasObject;\r\n }\r\n\r\n public isBusy(poolID: unknown, object: PoolObjectType): boolean;\r\n public isBusy(object: PoolObjectType): boolean;\r\n public isBusy(poolIDOrObject: unknown | PoolObjectType, object?: PoolObjectType): boolean {\r\n let busy = false;\r\n\r\n if (object == null) {\r\n for (const pool of this._myPools.values()) {\r\n if (pool.isBusy(poolIDOrObject)) {\r\n busy = true;\r\n break;\r\n }\r\n }\r\n } else if (this._myPools.has(poolIDOrObject)) {\r\n busy = this._myPools.get(poolIDOrObject)!.isBusy(object);\r\n }\r\n\r\n return busy;\r\n }\r\n\r\n public isAvailable(poolID: unknown, object: PoolObjectType): boolean;\r\n public isAvailable(object: PoolObjectType): boolean;\r\n public isAvailable(poolIDOrObject: unknown | PoolObjectType, object?: PoolObjectType): boolean {\r\n let available = false;\r\n\r\n if (object == null) {\r\n for (const pool of this._myPools.values()) {\r\n if (pool.isAvailable(poolIDOrObject)) {\r\n available = true;\r\n break;\r\n }\r\n }\r\n } else if (this._myPools.has(poolIDOrObject)) {\r\n available = this._myPools.get(poolIDOrObject)!.isAvailable(object);\r\n }\r\n\r\n return available;\r\n }\r\n\r\n public release(poolID: unknown, object: PoolObjectType): void;\r\n public release(object: PoolObjectType): void;\r\n public release(poolIDOrObject: unknown | PoolObjectType, object?: PoolObjectType): void {\r\n if (object == null) {\r\n for (const pool of this._myPools.values()) {\r\n pool.release(poolIDOrObject);\r\n }\r\n } else if (this._myPools.has(poolIDOrObject)) {\r\n this._myPools.get(poolIDOrObject)!.release(object);\r\n }\r\n }\r\n\r\n public releaseAll(poolID?: unknown): void {\r\n if (poolID == null) {\r\n for (const pool of this._myPools.values()) {\r\n pool.releaseAll();\r\n }\r\n } else if (this._myPools.has(poolID)) {\r\n this._myPools.get(poolID)!.releaseAll();\r\n }\r\n }\r\n\r\n public increase(poolID: unknown, amount: number): void {\r\n const pool = this._myPools.get(poolID);\r\n if (pool) {\r\n pool.increase(amount);\r\n }\r\n }\r\n\r\n public increasePercentage(poolID: unknown, percentage: number): void {\r\n const pool = this._myPools.get(poolID);\r\n if (pool) {\r\n pool.increasePercentage(percentage);\r\n }\r\n }\r\n\r\n public getSize(poolID: unknown): number {\r\n if (this._myPools.has(poolID)) {\r\n return this._myPools.get(poolID)!.getSize();\r\n }\r\n\r\n return 0;\r\n }\r\n\r\n public getAvailableSize(poolID: unknown): number {\r\n if (this._myPools.has(poolID)) {\r\n return this._myPools.get(poolID)!.getAvailableSize();\r\n }\r\n\r\n return 0;\r\n }\r\n\r\n public getBusySize(poolID: unknown): number {\r\n if (this._myPools.has(poolID)) {\r\n return this._myPools.get(poolID)!.getBusySize();\r\n }\r\n\r\n return 0;\r\n }\r\n\r\n public destroy(): void {\r\n this._myDestroyed = true;\r\n\r\n for (const pool of this._myPools.values()) {\r\n pool.destroy();\r\n }\r\n }\r\n\r\n public isDestroyed(): boolean {\r\n return this._myDestroyed;\r\n }\r\n}", "import { Component } from \"@wonderlandengine/api\";\r\nimport { vec4_create } from \"../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Globals } from \"../../../pp/globals.js\";\r\nimport { VisualManager } from \"../visual_manager.js\";\r\nimport { VisualResources } from \"../visual_resources.js\";\r\n\r\nexport class VisualManagerComponent extends Component {\r\n static TypeName = \"pp-visual-manager\";\r\n\r\n init() {\r\n this._myVisualManager = new VisualManager(this.engine);\r\n\r\n this._myVisualResources = new VisualResources();\r\n }\r\n\r\n start() {\r\n this._myVisualResources.myDefaultMaterials.myMesh = Globals.getDefaultMaterials(this.engine).myFlatOpaque.clone();\r\n\r\n this._myVisualResources.myDefaultMaterials.myText = Globals.getDefaultMaterials(this.engine).myText.clone();\r\n\r\n this._myVisualResources.myDefaultMaterials.myRight = Globals.getDefaultMaterials(this.engine).myFlatOpaque.clone();\r\n this._myVisualResources.myDefaultMaterials.myRight.color = vec4_create(1, 0, 0, 1);\r\n this._myVisualResources.myDefaultMaterials.myUp = Globals.getDefaultMaterials(this.engine).myFlatOpaque.clone();\r\n this._myVisualResources.myDefaultMaterials.myUp.color = vec4_create(0, 1, 0, 1);\r\n this._myVisualResources.myDefaultMaterials.myForward = Globals.getDefaultMaterials(this.engine).myFlatOpaque.clone();\r\n this._myVisualResources.myDefaultMaterials.myForward.color = vec4_create(0, 0, 1, 1);\r\n\r\n this._myVisualResources.myDefaultMaterials.myRay = Globals.getDefaultMaterials(this.engine).myFlatOpaque.clone();\r\n this._myVisualResources.myDefaultMaterials.myRay.color = vec4_create(0, 1, 0, 1);\r\n this._myVisualResources.myDefaultMaterials.myHitNormal = Globals.getDefaultMaterials(this.engine).myFlatOpaque.clone();\r\n this._myVisualResources.myDefaultMaterials.myHitNormal.color = vec4_create(1, 0, 0, 1);\r\n\r\n this._myVisualManager.start();\r\n }\r\n\r\n update(dt) {\r\n if (Globals.getVisualManager(this.engine) == this._myVisualManager) {\r\n this._myVisualManager.update(dt);\r\n }\r\n }\r\n\r\n onActivate() {\r\n if (!Globals.hasVisualManager(this.engine)) {\r\n this._myVisualManager.setActive(true);\r\n\r\n Globals.setVisualManager(this._myVisualManager, this.engine);\r\n }\r\n\r\n if (!Globals.hasVisualResources(this.engine)) {\r\n Globals.setVisualResources(this._myVisualResources, this.engine);\r\n }\r\n }\r\n\r\n onDeactivate() {\r\n this._myVisualManager.setActive(false);\r\n\r\n if (Globals.getVisualManager(this.engine) == this._myVisualManager) {\r\n Globals.removeVisualManager(this.engine);\r\n }\r\n\r\n if (Globals.getVisualResources(this.engine) == this._myVisualResources) {\r\n Globals.removeVisualResources(this.engine);\r\n }\r\n }\r\n\r\n onDestroy() {\r\n if (this._myVisualManager != null) {\r\n this._myVisualManager.destroy();\r\n }\r\n }\r\n}", "import { Object3D } from \"@wonderlandengine/api\";\r\nimport { ObjectCloneParams, ObjectUtils } from \"../wl/utils/object_utils.js\";\r\n\r\n/** For the Wonderland Engine `Object3D` you can omit the callbacks (like `myCloneCallback`), since they are already handled directly as a speciale case */\r\nexport class ObjectPoolParams {\r\n\r\n public myInitialPoolSize: number = 0;\r\n\r\n /** If all the objects are busy, this amount will be added to the pool */\r\n public myAmountToAddWhenEmpty: number = 0;\r\n\r\n /** If all the objects are busy, this percentage of the current pool size will be added to the pool */\r\n public myPercentageToAddWhenEmpty: number = 0;\r\n\r\n\r\n public myCloneParams: Readonly | null = null;\r\n\r\n\r\n /** For the Wonderland Engine `Object3D` you can omit this, since it's already handled directly as a speciale case */\r\n public myCloneCallback: ((object: Readonly, cloneParams?: Readonly) => PoolObjectType) | null = null;\r\n\r\n /** For the Wonderland Engine `Object3D` you can omit this, since it's already handled directly as a speciale case */\r\n public mySetActiveCallback: ((object: PoolObjectType, active: boolean) => void) | null = null;\r\n\r\n /** For the Wonderland Engine `Object3D` you can omit this, since it's already handled directly as a speciale case */\r\n public myEqualCallback: ((first: Readonly, second: Readonly) => boolean) | null = null;\r\n\r\n /** For the Wonderland Engine `Object3D` you can omit this, since it's already handled directly as a speciale case */\r\n public myDestroyCallback: ((object: PoolObjectType) => void) | null = null;\r\n\r\n /** For the Wonderland Engine `Object3D` you can omit this, since it's already handled directly as a speciale case */\r\n public myOptimizeObjectsAllocationCallback: ((object: Readonly, numberOfObjectsToAllocate: number) => void) | null = null;\r\n\r\n\r\n public myLogEnabled: boolean = false;\r\n}\r\n\r\nexport interface BaseObjectPool {\r\n get(): unknown | null;\r\n\r\n has(object: unknown): boolean;\r\n\r\n isBusy(object: unknown): boolean;\r\n isAvailable(object: unknown): boolean;\r\n\r\n release(object: unknown): void;\r\n releaseAll(): void;\r\n\r\n increase(amount: number): void;\r\n increasePercentage(percentage: number): void;\r\n\r\n getObjects(): Readonly;\r\n getSize(): number;\r\n\r\n getAvailableObjects(): Readonly;\r\n getAvailableSize(): number;\r\n\r\n getBusyObjects(): Readonly;\r\n getBusySize(): number;\r\n\r\n destroy(): void;\r\n}\r\n\r\nexport class ObjectPool implements BaseObjectPool {\r\n\r\n private readonly _myObjectPrototype: Readonly;\r\n private readonly _myObjectPoolParams: Readonly>;\r\n\r\n private readonly _myAvailableObjects: PoolObjectType[] = [];\r\n private readonly _myBusyObjects: PoolObjectType[] = [];\r\n\r\n private _myDestroyed: boolean = false;\r\n\r\n private _myIsObject3D = false;\r\n private _myIsObject3DCloneParams = false;\r\n\r\n constructor(objectPrototype: Readonly, objectPoolParams: Readonly>) {\r\n this._myObjectPrototype = objectPrototype;\r\n this._myObjectPoolParams = objectPoolParams;\r\n\r\n if (objectPrototype instanceof Object3D) {\r\n this._myIsObject3D = true;\r\n\r\n if (this._myObjectPoolParams.myCloneParams == null || this._myObjectPoolParams.myCloneParams instanceof ObjectCloneParams) {\r\n this._myIsObject3DCloneParams = true;\r\n }\r\n }\r\n\r\n this._addToPool(objectPoolParams.myInitialPoolSize, false);\r\n }\r\n\r\n public get(): PoolObjectType | null {\r\n let object = this._myAvailableObjects.shift();\r\n\r\n if (object == null) {\r\n let amountToAdd = Math.ceil(this._myBusyObjects.length * this._myObjectPoolParams.myPercentageToAddWhenEmpty);\r\n amountToAdd += this._myObjectPoolParams.myAmountToAddWhenEmpty;\r\n this._addToPool(amountToAdd, this._myObjectPoolParams.myLogEnabled);\r\n object = this._myAvailableObjects.shift();\r\n }\r\n\r\n // Object could still be null if the amountToAdd is 0\r\n if (object != null) {\r\n this._myBusyObjects.push(object);\r\n }\r\n\r\n return object != null ? object : null;\r\n }\r\n\r\n public has(object: Readonly): boolean {\r\n let hasObject = false;\r\n\r\n if (this.isBusy(object) || this.isAvailable(object)) {\r\n hasObject = true;\r\n }\r\n\r\n return hasObject;\r\n }\r\n\r\n public isBusy(object: Readonly): boolean {\r\n return this._myBusyObjects.pp_has(this._equals.bind(this, object));\r\n }\r\n\r\n public isAvailable(object: Readonly): boolean {\r\n return this._myAvailableObjects.pp_has(this._equals.bind(this, object));\r\n }\r\n\r\n public release(object: Readonly): void {\r\n const released = this._myBusyObjects.pp_remove(this._equals.bind(this, object));\r\n if (released != null) {\r\n this._setActive(released, false);\r\n this._myAvailableObjects.push(released);\r\n }\r\n }\r\n\r\n public releaseAll(): void {\r\n for (const busyObject of this._myBusyObjects) {\r\n this._setActive(busyObject, false);\r\n this._myAvailableObjects.push(busyObject);\r\n }\r\n }\r\n\r\n public increase(amount: number): void {\r\n this._addToPool(amount, false);\r\n }\r\n\r\n public increasePercentage(percentage: number): void {\r\n const amount = Math.ceil((this.getSize()) * percentage);\r\n this._addToPool(amount, false);\r\n }\r\n\r\n public getObjects(): Readonly {\r\n const objects = [];\r\n objects.push(...this._myAvailableObjects);\r\n objects.push(...this._myBusyObjects);\r\n\r\n return objects;\r\n }\r\n\r\n public getSize(): number {\r\n return this._myBusyObjects.length + this._myAvailableObjects.length;\r\n }\r\n\r\n public getAvailableObjects(): Readonly {\r\n return this._myAvailableObjects;\r\n }\r\n\r\n public getAvailableSize(): number {\r\n return this._myAvailableObjects.length;\r\n }\r\n\r\n public getBusyObjects(): Readonly {\r\n return this._myBusyObjects;\r\n }\r\n\r\n public getBusySize(): number {\r\n return this._myBusyObjects.length;\r\n }\r\n\r\n private _addToPool(size: number, logEnabled: boolean): void {\r\n if (size <= 0) {\r\n return;\r\n }\r\n\r\n if (this._myObjectPoolParams.myOptimizeObjectsAllocationCallback != null) {\r\n this._myObjectPoolParams.myOptimizeObjectsAllocationCallback(this._myObjectPrototype, size);\r\n } else if (this._myIsObject3D) {\r\n const object3DPrototype = this._myObjectPrototype as unknown as Object3D;\r\n ObjectUtils.reserveObjects(object3DPrototype, size);\r\n }\r\n\r\n for (let i = 0; i < size; i++) {\r\n const clonedObject = this._clonePrototype();\r\n if (clonedObject != null) {\r\n this._myAvailableObjects.push(clonedObject);\r\n }\r\n }\r\n\r\n if (logEnabled) {\r\n console.warn(\"Added new elements to the pool:\", size);\r\n }\r\n }\r\n\r\n private _clonePrototype(): PoolObjectType | null {\r\n let clone: PoolObjectType | null = null;\r\n\r\n const cloneParams = this._myObjectPoolParams.myCloneParams != null ? this._myObjectPoolParams.myCloneParams! : undefined;\r\n if (this._myObjectPoolParams.myCloneCallback != null) {\r\n clone = this._myObjectPoolParams.myCloneCallback(this._myObjectPrototype, cloneParams);\r\n } else if (this._myIsObject3D && this._myIsObject3DCloneParams) {\r\n const object3DPrototype = this._myObjectPrototype as unknown as Object3D;\r\n clone = ObjectUtils.clone(object3DPrototype, cloneParams as unknown as ObjectCloneParams) as PoolObjectType;\r\n } else {\r\n console.error(\"No way have been provided to clone the object\");\r\n }\r\n\r\n if (clone != null) {\r\n this._setActive(clone, false);\r\n }\r\n\r\n return clone;\r\n }\r\n\r\n private _setActive(object: PoolObjectType, active: boolean): void {\r\n if (this._myObjectPoolParams.mySetActiveCallback != null) {\r\n this._myObjectPoolParams.mySetActiveCallback(object, active);\r\n } else if (this._myIsObject3D) {\r\n const object3D = object as unknown as Object3D;\r\n ObjectUtils.setActive(object3D, active);\r\n } else {\r\n console.error(\"No way have been provided to set the active state of the object\");\r\n }\r\n }\r\n\r\n private _equals(first: Readonly, second: Readonly): boolean {\r\n let equals = false;\r\n\r\n if (this._myObjectPoolParams.myEqualCallback != null) {\r\n equals = this._myObjectPoolParams.myEqualCallback(first, second);\r\n } else if (this._myIsObject3D) {\r\n const firstObject3D = first as unknown as Object3D;\r\n const secondObject3D = second as unknown as Object3D;\r\n equals = firstObject3D == secondObject3D;\r\n } else {\r\n equals = first == second;\r\n }\r\n\r\n return equals;\r\n }\r\n\r\n public destroy(): void {\r\n this._myDestroyed = true;\r\n\r\n for (const object of this._myAvailableObjects) {\r\n this._destroyObject(object);\r\n }\r\n\r\n for (const object of this._myBusyObjects) {\r\n this._destroyObject(object);\r\n }\r\n }\r\n\r\n public isDestroyed(): boolean {\r\n return this._myDestroyed;\r\n }\r\n\r\n private _destroyObject(object: PoolObjectType): void {\r\n if (this._myObjectPoolParams.myDestroyCallback != null) {\r\n this._myObjectPoolParams.myDestroyCallback(object);\r\n } else if (this._myIsObject3D) {\r\n const object3D = object as unknown as Object3D;\r\n ObjectUtils.destroy(object3D);\r\n } else {\r\n console.error(\"No way have been provided to destroy the object\");\r\n }\r\n }\r\n}", "import { MeshComponent } from \"@wonderlandengine/api\";\r\nimport { vec3_create } from \"../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Globals } from \"../../../pp/globals.js\";\r\nimport { AbstractVisualElement, AbstractVisualElementParams } from \"./visual_element.js\";\r\nimport { VisualElementDefaultType } from \"./visual_element_types.js\";\r\nimport { VisualLine, VisualLineParams } from \"./visual_line.js\";\r\n\r\nexport class VisualArrowParams extends AbstractVisualElementParams {\r\n\r\n /**\r\n * TS type inference helper\r\n * \r\n * @param {any} engine\r\n */\r\n constructor(engine = Globals.getMainEngine()) {\r\n super(engine);\r\n\r\n this.myStart = vec3_create();\r\n this.myDirection = vec3_create(0, 0, 1);\r\n this.myLength = 0;\r\n\r\n this.myThickness = 0.005;\r\n\r\n this.myArrowThickness = null; // null means this.myThickness * 1.5 will be used\r\n this.myArrowLength = null; // null means this.myThickness * 3.5 will be used\r\n\r\n this.myShareArrowLengthWithLineWhenArrowLongerThanLength = true;\r\n\r\n this.myLineMesh = null; // The mesh is scaled along up axis, null means it will default on myDefaultResources.myMeshes.myCylinder\r\n this.myArrowMesh = null; // The mesh is scaled along up axis, null means it will default on myDefaultResources.myMeshes.myCone\r\n\r\n this.myMaterial = null; // null means it will default on myDefaultResources.myMaterials.myFlatOpaque\r\n this.myColor = null; // If this is set and material is null, it will use the default flat opaque material with this color\r\n\r\n this.myLocal = false;\r\n\r\n this.myType = VisualElementDefaultType.ARROW;\r\n }\r\n\r\n setStartEnd(start, end) {\r\n end.vec3_sub(start, this.myDirection);\r\n this.myLength = this.myDirection.vec3_length();\r\n this.myDirection.vec3_normalize(this.myDirection);\r\n this.myStart.vec3_copy(start);\r\n\r\n return this;\r\n }\r\n\r\n _copyHook(other, deepCopy) {\r\n // Implemented outside class definition\r\n }\r\n\r\n _new() {\r\n return new VisualArrowParams(this.myParent.pp_getEngine());\r\n }\r\n\r\n _equalsHook(other) {\r\n return this.myThickness == other.myThickness &&\r\n this.myLength == other.myLength &&\r\n this.myLineMesh == other.myLineMesh &&\r\n this.myArrowMesh == other.myArrowMesh &&\r\n this.myMaterial == other.myMaterial &&\r\n this.myLocal == other.myLocal &&\r\n this.myArrowThickness == other.myArrowThickness &&\r\n this.myArrowLength == other.myArrowLength &&\r\n this.myShareArrowLengthWithLineWhenArrowLongerThanLength == other.myShareArrowLengthWithLineWhenArrowLongerThanLength &&\r\n (this.myColor == other.myColor || (this.myColor != null && other.myColor != null && this.myColor.vec_equals(other.myColor))) &&\r\n this.myStart.vec3_equals(other.myStart) &&\r\n this.myDirection.vec3_equals(other.myDirection);\r\n }\r\n}\r\n\r\n/**\r\n * Example:\r\n * \r\n * ```js \r\n * const visualParams = new VisualArrowParams();\r\n * visualParams.myStart.vec3_copy(start);\r\n * visualParams.myDirection.vec3_copy(direction);\r\n * visualParams.myLength = 0.2;\r\n * visualParams.myMaterial = Globals.getDefaultMaterials().myFlatOpaque.clone();\r\n * visualParams.myMaterial.color = vec4_create(1, 1, 1, 1);\r\n * const visualArrow = new VisualArrow(visualParams);\r\n * Globals.getVisualManager().draw(visualParams);\r\n * \r\n * // OR\r\n * \r\n * Globals.getVisualManager().draw(visualParams);\r\n * ```\r\n*/\r\nexport class VisualArrow extends AbstractVisualElement {\r\n\r\n constructor(params = new VisualArrowParams()) {\r\n super(params);\r\n\r\n this._myVisualLine = new VisualLine(new VisualLineParams(this._myParams.myParent.pp_getEngine()));\r\n this._myVisualLine.setAutoRefresh(false);\r\n\r\n this._myArrowParentObject = null;\r\n this._myArrowObject = null;\r\n this._myArrowMeshComponent = null;\r\n\r\n this._myFlatOpaqueMaterial = null;\r\n\r\n this._prepare();\r\n }\r\n\r\n _visibleChanged() {\r\n this._myVisualLine.setVisible(this._myVisible);\r\n this._myArrowParentObject.pp_setActive(this._myVisible);\r\n }\r\n\r\n _updateHook(dt) {\r\n this._myVisualLine.update(dt);\r\n }\r\n\r\n _build() {\r\n this._myArrowParentObject = Globals.getSceneObjects(this._myParams.myParent.pp_getEngine()).myVisualElements.pp_addChild();\r\n this._myArrowObject = this._myArrowParentObject.pp_addChild();\r\n\r\n this._myArrowMeshComponent = this._myArrowObject.pp_addComponent(MeshComponent);\r\n }\r\n\r\n _refreshHook() {\r\n // Implemented outside class definition\r\n }\r\n\r\n _new(params) {\r\n return new VisualArrow(params);\r\n }\r\n\r\n _destroyHook() {\r\n this._myVisualLine.destroy();\r\n this._myArrowParentObject.pp_destroy();\r\n }\r\n}\r\n\r\n\r\n\r\n// IMPLEMENTATION\r\n\r\nVisualArrow.prototype._refreshHook = function () {\r\n let arrowPosition = vec3_create();\r\n let parentTranslate = vec3_create();\r\n let arrowScale = vec3_create();\r\n\r\n let forward = vec3_create(0, 1, 0);\r\n return function _refreshHook() {\r\n this._myArrowParentObject.pp_setParent(this._myParams.myParent, false);\r\n\r\n let arrowThickness = (this._myParams.myArrowThickness != null) ? this._myParams.myArrowThickness : this._myParams.myThickness * 1.5;\r\n let arrowLength = (this._myParams.myArrowLength != null) ? this._myParams.myArrowLength : this._myParams.myThickness * 3.5;\r\n\r\n if (this._myParams.myShareArrowLengthWithLineWhenArrowLongerThanLength && arrowLength > this._myParams.myLength / 2) {\r\n arrowLength = this._myParams.myLength / 2;\r\n }\r\n\r\n arrowLength = Math.min(arrowLength, this._myParams.myLength);\r\n\r\n arrowScale.vec3_set(arrowThickness, arrowLength / 2, arrowThickness);\r\n\r\n let lineLength = this._myParams.myLength - arrowLength;\r\n\r\n this._myParams.myDirection.vec3_scale(lineLength, arrowPosition);\r\n arrowPosition.vec3_add(this._myParams.myStart, arrowPosition);\r\n\r\n if (this._myParams.myLocal) {\r\n this._myArrowParentObject.pp_setPositionLocal(arrowPosition);\r\n this._myArrowParentObject.pp_setUpLocal(this._myParams.myDirection, forward);\r\n } else {\r\n this._myArrowParentObject.pp_setPosition(arrowPosition);\r\n this._myArrowParentObject.pp_setUp(this._myParams.myDirection, forward);\r\n }\r\n\r\n parentTranslate.vec3_set(0, (arrowLength / 2) - 0.00001, 0);\r\n this._myArrowParentObject.pp_translateObject(parentTranslate);\r\n\r\n if (this._myParams.myLocal) {\r\n this._myArrowObject.pp_setScaleLocal(arrowScale);\r\n } else {\r\n this._myArrowObject.pp_setScale(arrowScale);\r\n }\r\n\r\n if (this._myParams.myArrowMesh != null) {\r\n this._myArrowMeshComponent.mesh = this._myParams.myArrowMesh;\r\n } else {\r\n this._myArrowMeshComponent.mesh = Globals.getDefaultMeshes(this._myParams.myParent.pp_getEngine()).myCone;\r\n }\r\n\r\n if (this._myParams.myMaterial == null) {\r\n if (this._myParams.myColor == null) {\r\n this._myArrowMeshComponent.material = Globals.getVisualResources(this._myParams.myParent.pp_getEngine()).myDefaultMaterials.myMesh;\r\n } else {\r\n if (this._myFlatOpaqueMaterial == null) {\r\n this._myFlatOpaqueMaterial = Globals.getDefaultMaterials(this._myParams.myParent.pp_getEngine()).myFlatOpaque.clone();\r\n }\r\n this._myArrowMeshComponent.material = this._myFlatOpaqueMaterial;\r\n this._myFlatOpaqueMaterial.color = this._myParams.myColor;\r\n }\r\n } else {\r\n this._myArrowMeshComponent.material = this._myParams.myMaterial;\r\n }\r\n\r\n let visualLineParams = this._myVisualLine.getParams();\r\n visualLineParams.myStart.vec3_copy(this._myParams.myStart);\r\n visualLineParams.myDirection.vec3_copy(this._myParams.myDirection);\r\n visualLineParams.myLength = lineLength;\r\n visualLineParams.myThickness = this._myParams.myThickness;\r\n visualLineParams.myMesh = this._myParams.myLineMesh;\r\n\r\n visualLineParams.myMaterial = this._myArrowMeshComponent.material;\r\n\r\n visualLineParams.myParent = this._myParams.myParent;\r\n visualLineParams.myLocal = this._myParams.myLocal;\r\n\r\n this._myVisualLine.paramsUpdated();\r\n };\r\n}();\r\n\r\nVisualArrowParams.prototype._copyHook = function _copyHook(other, deepCopy) {\r\n this.myStart.vec3_copy(other.myStart);\r\n this.myDirection.vec3_copy(other.myDirection);\r\n this.myLength = other.myLength;\r\n this.myThickness = other.myThickness;\r\n\r\n this.myArrowThickness = other.myArrowThickness;\r\n this.myArrowLength = other.myArrowLength;\r\n\r\n this.myShareArrowLengthWithLineWhenArrowLongerThanLength = other.myShareArrowLengthWithLineWhenArrowLongerThanLength;\r\n\r\n this.myArrowMesh = other.myArrowMesh;\r\n this.myLineMesh = other.myLineMesh;\r\n\r\n if (other.myMaterial != null && deepCopy) {\r\n this.myMaterial = other.myMaterial.clone();\r\n } else {\r\n this.myMaterial = other.myMaterial;\r\n }\r\n\r\n if (other.myColor != null) {\r\n if (this.myColor != null) {\r\n this.myColor.vec4_copy(other.myColor);\r\n } else {\r\n this.myColor = other.myColor.vec4_clone();\r\n }\r\n } else {\r\n this.myColor = null;\r\n }\r\n\r\n this.myLocal = other.myLocal;\r\n};", "import { Object3D, WonderlandEngine } from \"@wonderlandengine/api\";\r\nimport { Globals } from \"../../../pp/globals.js\";\r\nimport { VisualElementDefaultType } from \"./visual_element_types.js\";\r\n\r\nexport interface VisualElementParams {\r\n myType: unknown | VisualElementDefaultType;\r\n\r\n /** If not specified it will default to `Globals.getSceneObjects().myVisualElements` */\r\n myParent: Object3D;\r\n\r\n copyGeneric(other: Readonly, deepCopy: boolean): void;\r\n cloneGeneric(deepClone: boolean): VisualElementParams;\r\n\r\n equalsGeneric(other: Readonly): boolean;\r\n}\r\n\r\nexport abstract class AbstractVisualElementParams> implements VisualElementParams {\r\n public abstract myType: unknown | VisualElementDefaultType;\r\n\r\n public myParent: Object3D;\r\n\r\n constructor(engine: Readonly = Globals.getMainEngine()!) {\r\n this.myParent = Globals.getSceneObjects(engine)!.myVisualElements!;\r\n }\r\n\r\n public copy(other: Readonly, deepCopy: boolean = true): void {\r\n this.myParent = other.myParent;\r\n\r\n this._copyHook(other, deepCopy);\r\n }\r\n\r\n public clone(deepClone: boolean = true): T {\r\n const clonedParams = this._new();\r\n clonedParams.copyGeneric(this, deepClone);\r\n return clonedParams;\r\n }\r\n\r\n public equals(other: Readonly): boolean {\r\n if (this as unknown as T == other) return true;\r\n\r\n if (this.myParent != other.myParent) return false;\r\n\r\n return this._equalsHook(other);\r\n }\r\n\r\n public copyGeneric(other: Readonly, deepCopy: boolean = true): void {\r\n if (other.myType != this.myType) {\r\n throw new Error(\"Trying to copy from params with a different type - From Type: \" + other.myType + \" - To Type: \" + this.myType);\r\n }\r\n\r\n this.copy(other as Readonly, deepCopy);\r\n }\r\n\r\n public cloneGeneric(deepClone: boolean = true): VisualElementParams {\r\n return this.clone(deepClone);\r\n }\r\n\r\n public equalsGeneric(other: Readonly): boolean {\r\n return this.equals(other as Readonly);\r\n }\r\n\r\n protected abstract _copyHook(other: Readonly, deepCopy: boolean): void;\r\n protected abstract _new(): T;\r\n\r\n protected abstract _equalsHook(other: Readonly): boolean;\r\n}\r\n\r\nexport interface VisualElement {\r\n update(dt: number): void;\r\n\r\n setVisible(visible: boolean): void;\r\n\r\n refresh(): void;\r\n setAutoRefresh(autoRefresh: boolean): void;\r\n\r\n getParamsGeneric(): VisualElementParams;\r\n setParamsGeneric(params: VisualElementParams): void;\r\n copyParamsGeneric(params: VisualElementParams): void;\r\n\r\n paramsUpdated(): void;\r\n\r\n clone(): VisualElement;\r\n\r\n destroy(): void;\r\n}\r\n\r\nexport abstract class AbstractVisualElement, VisualElementParamsType extends AbstractVisualElementParams> implements VisualElement {\r\n\r\n protected _myParams: VisualElementParamsType;\r\n protected _myPrevParams: VisualElementParamsType;\r\n\r\n protected _myVisible: boolean = false;\r\n protected _myAutoRefresh: boolean = true;\r\n\r\n protected _myDirty: boolean = false;\r\n\r\n protected _myDestroyed: boolean = false;\r\n\r\n constructor(params: VisualElementParamsType) {\r\n this._myParams = params;\r\n this._myPrevParams = this._myParams.clone();\r\n }\r\n\r\n public update(dt: number): void {\r\n if (this._myDirty) {\r\n this._refresh();\r\n\r\n this._myDirty = false;\r\n }\r\n\r\n this._updateHook(dt);\r\n }\r\n\r\n public setVisible(visible: boolean): void {\r\n if (this._myVisible != visible) {\r\n this._myVisible = visible;\r\n\r\n this._visibleChanged();\r\n }\r\n }\r\n\r\n public refresh(): void {\r\n this.update(0);\r\n }\r\n\r\n public setAutoRefresh(autoRefresh: boolean): void {\r\n this._myAutoRefresh = autoRefresh;\r\n }\r\n\r\n public getParams(): VisualElementParamsType {\r\n return this._myParams;\r\n }\r\n\r\n public setParams(params: VisualElementParamsType): void {\r\n this._myParams = params;\r\n this.paramsUpdated();\r\n }\r\n\r\n public copyParams(params: VisualElementParamsType): void {\r\n this._myParams.copy(params);\r\n this.paramsUpdated();\r\n }\r\n\r\n public getParamsGeneric(): VisualElementParams {\r\n return this._myParams;\r\n }\r\n\r\n public setParamsGeneric(params: VisualElementParams): void {\r\n if (params.myType != this._myParams.myType) {\r\n throw new Error(\"Trying to set params with a different type - Current Type: \" + params.myType + \" - New Type: \" + this._myParams.myType);\r\n }\r\n\r\n this.setParams(params as VisualElementParamsType);\r\n }\r\n\r\n public copyParamsGeneric(params: VisualElementParams): void {\r\n if (params.myType != this._myParams.myType) {\r\n throw new Error(\"Trying to copy from params with a different type - From Type: \" + params.myType + \" - To Type: \" + this._myParams.myType);\r\n }\r\n\r\n this.copyParams(params as VisualElementParamsType);\r\n }\r\n\r\n public paramsUpdated(): void {\r\n if (!this._myParams.equals(this._myPrevParams)) {\r\n this._markDirty();\r\n }\r\n }\r\n\r\n private _markDirty(): void {\r\n this._myDirty = true;\r\n\r\n if (this._myAutoRefresh) {\r\n this.update(0);\r\n }\r\n }\r\n\r\n public clone(): VisualElementType {\r\n const clonedParams = this._myParams.clone();\r\n\r\n const clone = this._new(clonedParams);\r\n clone.setAutoRefresh(this._myAutoRefresh);\r\n clone.setVisible(this._myVisible);\r\n clone._myDirty = this._myDirty;\r\n\r\n return clone;\r\n }\r\n\r\n protected _prepare(): void {\r\n this._myPrevParams.copy(this._myParams, false);\r\n\r\n this._build();\r\n\r\n this._myDirty = true;\r\n this.refresh();\r\n\r\n this.setVisible(true);\r\n }\r\n\r\n private _refresh(): void {\r\n this._myPrevParams.copy(this._myParams, false);\r\n\r\n this._refreshHook();\r\n }\r\n\r\n protected _updateHook(dt: number): void { }\r\n\r\n protected _visibleChanged(): void { }\r\n\r\n protected abstract _build(): void;\r\n protected abstract _refreshHook(): void;\r\n\r\n protected abstract _new(params: VisualElementParamsType): VisualElementType;\r\n\r\n protected _destroyHook(): void { }\r\n\r\n public destroy(): void {\r\n this._myDestroyed = true;\r\n\r\n this._destroyHook();\r\n }\r\n\r\n public isDestroyed(): boolean {\r\n return this._myDestroyed;\r\n }\r\n}", "export enum VisualElementDefaultType {\r\n MESH = \"mesh\",\r\n LINE = \"line\",\r\n POINT = \"point\",\r\n TEXT = \"text\",\r\n ARROW = \"arrow\",\r\n TRANSFORM = \"transform\",\r\n RAYCAST = \"raycast\",\r\n TORUS = \"torus\"\r\n}", "import { MeshComponent } from \"@wonderlandengine/api\";\r\nimport { vec3_create } from \"../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Globals } from \"../../../pp/globals.js\";\r\nimport { AbstractVisualElement, AbstractVisualElementParams } from \"./visual_element.js\";\r\nimport { VisualElementDefaultType } from \"./visual_element_types.js\";\r\n\r\nexport class VisualLineParams extends AbstractVisualElementParams {\r\n\r\n /**\r\n * TS type inference helper\r\n * \r\n * @param {any} engine\r\n */\r\n constructor(engine = Globals.getMainEngine()) {\r\n super(engine);\r\n\r\n this.myStart = vec3_create();\r\n this.myDirection = vec3_create(0, 0, 1);\r\n this.myLength = 0;\r\n\r\n this.myThickness = 0.005;\r\n\r\n this.myMesh = null; // The mesh is scaled along up axis, null means it will default on myDefaultResources.myMeshes.myCylinder\r\n\r\n this.myMaterial = null; // null means it will default on myDefaultResources.myMaterials.myFlatOpaque\r\n this.myColor = null; // If this is set and material is null, it will use the default flat opaque material with this color\r\n\r\n this.myLocal = false;\r\n\r\n this.myType = VisualElementDefaultType.LINE;\r\n }\r\n\r\n setStartEnd(start, end) {\r\n end.vec3_sub(start, this.myDirection);\r\n this.myLength = this.myDirection.vec3_length();\r\n this.myDirection.vec3_normalize(this.myDirection);\r\n this.myStart.vec3_copy(start);\r\n\r\n return this;\r\n }\r\n\r\n _copyHook(other, deepCopy) {\r\n // Implemented outside class definition\r\n }\r\n\r\n _new() {\r\n return new VisualLineParams(this.myParent.pp_getEngine());\r\n }\r\n\r\n _equalsHook(other) {\r\n return this.myThickness == other.myThickness &&\r\n this.myLength == other.myLength &&\r\n this.myMesh == other.myMesh &&\r\n this.myMaterial == other.myMaterial &&\r\n this.myLocal == other.myLocal &&\r\n (this.myColor == other.myColor || (this.myColor != null && other.myColor != null && this.myColor.vec_equals(other.myColor))) &&\r\n this.myStart.vec3_equals(other.myStart) &&\r\n this.myDirection.vec3_equals(other.myDirection);\r\n }\r\n}\r\n\r\n/**\r\n * Example:\r\n * \r\n * ```js \r\n * const visualParams = new VisualLineParams();\r\n * visualParams.myStart.vec3_copy(start);\r\n * visualParams.myDirection.vec3_copy(direction);\r\n * visualParams.myLength = 0.2;\r\n * visualParams.myMaterial = Globals.getDefaultMaterials().myFlatOpaque.clone();\r\n * visualParams.myMaterial.color = vec4_create(1, 1, 1, 1);\r\n * const visualLine = new VisualLine(visualParams);\r\n * \r\n * // OR\r\n * \r\n * Globals.getVisualManager().draw(visualParams);\r\n * ```\r\n*/\r\nexport class VisualLine extends AbstractVisualElement {\r\n\r\n constructor(params = new VisualLineParams()) {\r\n super(params);\r\n\r\n this._myLineParentObject = null;\r\n this._myLineObject = null;\r\n this._myLineMeshComponent = null;\r\n\r\n this._myFlatOpaqueMaterial = null;\r\n\r\n this._prepare();\r\n }\r\n\r\n _visibleChanged() {\r\n this._myLineParentObject.pp_setActive(this._myVisible);\r\n }\r\n\r\n _build() {\r\n this._myLineParentObject = Globals.getSceneObjects(this._myParams.myParent.pp_getEngine()).myVisualElements.pp_addChild();\r\n this._myLineObject = this._myLineParentObject.pp_addChild();\r\n\r\n this._myLineMeshComponent = this._myLineObject.pp_addComponent(MeshComponent);\r\n }\r\n\r\n _refreshHook() {\r\n // Implemented outside class definition\r\n }\r\n\r\n _new(params) {\r\n return new VisualLine(params);\r\n }\r\n\r\n _destroyHook() {\r\n this._myLineParentObject.pp_destroy();\r\n }\r\n}\r\n\r\n\r\n\r\n// IMPLEMENTATION\r\n\r\nVisualLine.prototype._refreshHook = function () {\r\n let scaleLine = vec3_create();\r\n let translateLine = vec3_create();\r\n\r\n let forward = vec3_create(0, 1, 0);\r\n return function _refreshHook() {\r\n this._myLineParentObject.pp_setParent(this._myParams.myParent, false);\r\n\r\n if (this._myParams.myLocal) {\r\n this._myLineParentObject.pp_setPositionLocal(this._myParams.myStart);\r\n } else {\r\n this._myLineParentObject.pp_setPosition(this._myParams.myStart);\r\n }\r\n\r\n scaleLine.vec3_set(this._myParams.myThickness / 2, this._myParams.myLength / 2, this._myParams.myThickness / 2);\r\n if (this._myParams.myLocal) {\r\n this._myLineObject.pp_setScaleLocal(scaleLine);\r\n } else {\r\n this._myLineObject.pp_setScale(scaleLine);\r\n }\r\n\r\n if (this._myParams.myLocal) {\r\n this._myLineObject.pp_setUpLocal(this._myParams.myDirection, forward);\r\n } else {\r\n this._myLineObject.pp_setUp(this._myParams.myDirection, forward);\r\n }\r\n\r\n this._myLineObject.pp_resetPositionLocal();\r\n translateLine.vec3_set(0, this._myParams.myLength / 2, 0);\r\n this._myLineObject.pp_translateObject(translateLine);\r\n\r\n if (this._myParams.myMesh != null) {\r\n this._myLineMeshComponent.mesh = this._myParams.myMesh;\r\n } else {\r\n this._myLineMeshComponent.mesh = Globals.getDefaultMeshes(this._myParams.myParent.pp_getEngine()).myCylinder;\r\n }\r\n\r\n if (this._myParams.myMaterial == null) {\r\n if (this._myParams.myColor == null) {\r\n this._myLineMeshComponent.material = Globals.getVisualResources(this._myParams.myParent.pp_getEngine()).myDefaultMaterials.myMesh;\r\n } else {\r\n if (this._myFlatOpaqueMaterial == null) {\r\n this._myFlatOpaqueMaterial = Globals.getDefaultMaterials(this._myParams.myParent.pp_getEngine()).myFlatOpaque.clone();\r\n }\r\n this._myLineMeshComponent.material = this._myFlatOpaqueMaterial;\r\n this._myFlatOpaqueMaterial.color = this._myParams.myColor;\r\n }\r\n } else {\r\n this._myLineMeshComponent.material = this._myParams.myMaterial;\r\n }\r\n };\r\n}();\r\n\r\nVisualLineParams.prototype._copyHook = function _copyHook(other, deepCopy) {\r\n this.myStart.vec3_copy(other.myStart);\r\n this.myDirection.vec3_copy(other.myDirection);\r\n this.myLength = other.myLength;\r\n this.myThickness = other.myThickness;\r\n\r\n this.myMesh = other.myMesh;\r\n\r\n if (other.myMaterial != null && deepCopy) {\r\n this.myMaterial = other.myMaterial.clone();\r\n } else {\r\n this.myMaterial = other.myMaterial;\r\n }\r\n\r\n if (other.myColor != null) {\r\n if (this.myColor != null) {\r\n this.myColor.vec4_copy(other.myColor);\r\n } else {\r\n this.myColor = other.myColor.vec4_clone();\r\n }\r\n } else {\r\n this.myColor = null;\r\n }\r\n\r\n this.myLocal = other.myLocal;\r\n};", "import { Material, Mesh, MeshComponent, Object3D } from \"@wonderlandengine/api\";\r\nimport { Matrix4 } from \"../../../cauldron/type_definitions/array_type_definitions.js\";\r\nimport { mat4_create } from \"../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Globals } from \"../../../pp/globals.js\";\r\nimport { AbstractVisualElement, AbstractVisualElementParams } from \"./visual_element.js\";\r\nimport { VisualElementDefaultType } from \"./visual_element_types.js\";\r\n\r\nexport class VisualMeshParams extends AbstractVisualElementParams {\r\n\r\n public readonly myType: unknown | VisualElementDefaultType = VisualElementDefaultType.MESH;\r\n\r\n public myTransform: Matrix4 = mat4_create();\r\n public myLocal: boolean = false;\r\n\r\n\r\n /** `null` means it will default to `Globals.getDefaultMeshes().mySphere` */\r\n public myMesh: Mesh | null = null;\r\n\r\n /** `null` means it will default to `Globals.getVisualResources().myDefaultMaterials.myMesh` */\r\n public myMaterial: Material | null = null;\r\n\r\n\r\n protected _copyHook(other: Readonly, deepCopy: boolean): void {\r\n this.myTransform.pp_copy(other.myTransform);\r\n\r\n if (other.myMesh != null) {\r\n this.myMesh = other.myMesh;\r\n } else {\r\n this.myMesh = null;\r\n }\r\n\r\n if (other.myMaterial != null && deepCopy) {\r\n this.myMaterial = other.myMaterial.clone();\r\n } else {\r\n this.myMaterial = other.myMaterial;\r\n }\r\n\r\n this.myLocal = other.myLocal;\r\n }\r\n\r\n protected _new(): VisualMeshParams {\r\n return new VisualMeshParams(this.myParent.pp_getEngine());\r\n }\r\n\r\n protected _equalsHook(other: Readonly): boolean {\r\n return this.myMesh == other.myMesh &&\r\n this.myMaterial == other.myMaterial &&\r\n this.myLocal == other.myLocal &&\r\n this.myTransform.vec_equals(other.myTransform);\r\n }\r\n}\r\n\r\n/**\r\n * Example:\r\n * \r\n * ```js \r\n * const visualParams = new VisualMeshParams();\r\n * visualParams.myTransform = transform;\r\n * visualParams.myMesh = Globals.getDefaultMeshes().mySphere;\r\n * visualParams.myMaterial = Globals.getDefaultMaterials().myFlatOpaque.clone();\r\n * visualParams.myMaterial.color = vec4_create(1, 1, 1, 1);\r\n * \r\n * const visualMesh = new VisualMesh(visualParams);\r\n * \r\n * // OR\r\n * \r\n * Globals.getVisualManager().draw(visualParams);\r\n * ```\r\n */\r\nexport class VisualMesh extends AbstractVisualElement {\r\n\r\n private readonly _myMeshObject!: Object3D;\r\n private readonly _myMeshComponent!: MeshComponent;\r\n\r\n constructor(params: VisualMeshParams = new VisualMeshParams()) {\r\n super(params);\r\n this._prepare();\r\n }\r\n\r\n protected override _visibleChanged(): void {\r\n this._myMeshObject.pp_setActive(this._myVisible);\r\n }\r\n\r\n protected _build(): void {\r\n (this._myMeshObject as Object3D) = Globals.getSceneObjects(this._myParams.myParent.pp_getEngine())!.myVisualElements!.pp_addChild();\r\n\r\n (this._myMeshComponent as MeshComponent) = this._myMeshObject.pp_addComponent(MeshComponent)!;\r\n }\r\n\r\n protected _refreshHook(): void {\r\n this._myMeshObject.pp_setParent(this._myParams.myParent, false);\r\n\r\n if (this._myParams.myLocal) {\r\n this._myMeshObject.pp_setTransformLocal(this._myParams.myTransform);\r\n } else {\r\n this._myMeshObject.pp_setTransform(this._myParams.myTransform);\r\n }\r\n\r\n if (this._myParams.myMesh == null) {\r\n this._myMeshComponent.mesh = Globals.getDefaultMeshes(this._myParams.myParent.pp_getEngine())!.mySphere;\r\n } else {\r\n this._myMeshComponent.mesh = this._myParams.myMesh;\r\n }\r\n\r\n if (this._myParams.myMaterial == null) {\r\n this._myMeshComponent.material = Globals.getVisualResources(this._myParams.myParent.pp_getEngine())!.myDefaultMaterials.myMesh;\r\n } else {\r\n this._myMeshComponent.material = this._myParams.myMaterial;\r\n }\r\n }\r\n\r\n protected _new(params: VisualMeshParams): VisualMesh {\r\n return new VisualMesh(params);\r\n }\r\n\r\n protected override _destroyHook(): void {\r\n this._myMeshObject.pp_destroy();\r\n }\r\n}", "import { MeshComponent } from \"@wonderlandengine/api\";\r\nimport { vec3_create } from \"../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Globals } from \"../../../pp/globals.js\";\r\nimport { AbstractVisualElement, AbstractVisualElementParams } from \"./visual_element.js\";\r\nimport { VisualElementDefaultType } from \"./visual_element_types.js\";\r\n\r\nexport class VisualPointParams extends AbstractVisualElementParams {\r\n\r\n /**\r\n * TS type inference helper\r\n * \r\n * @param {any} engine\r\n */\r\n constructor(engine = Globals.getMainEngine()) {\r\n super(engine);\r\n\r\n this.myPosition = vec3_create();\r\n this.myRadius = 0.005;\r\n\r\n this.myMesh = null; // The mesh is scaled along up axis, null means it will default on myDefaultResources.myMeshes.mySphere\r\n\r\n this.myMaterial = null; // null means it will default on myDefaultResources.myMaterials.myFlatOpaque\r\n this.myColor = null; // If this is set and material is null, it will use the default flat opaque material with this color\r\n\r\n this.myLocal = false;\r\n\r\n this.myType = VisualElementDefaultType.POINT;\r\n }\r\n\r\n _copyHook(other, deepCopy) {\r\n // Implemented outside class definition\r\n }\r\n\r\n _new() {\r\n return new VisualPointParams(this.myParent.pp_getEngine());\r\n }\r\n\r\n _equalsHook(other) {\r\n return this.myRadius == other.myRadius &&\r\n this.myMesh == other.myMesh &&\r\n this.myMaterial == other.myMaterial &&\r\n this.myLocal == other.myLocal &&\r\n (this.myColor == other.myColor || (this.myColor != null && other.myColor != null && this.myColor.vec_equals(other.myColor))) &&\r\n this.myPosition.vec3_equals(other.myPosition);\r\n }\r\n}\r\n\r\n/**\r\n * Example:\r\n * \r\n * ```js \r\n * const visualParams = new VisualPointParams();\r\n * visualParams.myPosition.vec3_copy(position);\r\n * visualParams.myRadius = 0.005;\r\n * visualParams.myMaterial = Globals.getDefaultMaterials().myFlatOpaque.clone();\r\n * visualParams.myMaterial.color = vec4_create(1, 1, 1, 1);\r\n * const visualPoint = new VisualPoint(visualParams);\r\n * \r\n * // OR\r\n * \r\n * Globals.getVisualManager().draw(visualParams);\r\n * ```\r\n*/\r\nexport class VisualPoint extends AbstractVisualElement {\r\n\r\n constructor(params = new VisualPointParams()) {\r\n super(params);\r\n\r\n this._myPointObject = null;\r\n this._myPointMeshComponent = null;\r\n\r\n this._myFlatOpaqueMaterial = null;\r\n\r\n this._prepare();\r\n }\r\n\r\n _visibleChanged() {\r\n this._myPointObject.pp_setActive(this._myVisible);\r\n }\r\n\r\n _build() {\r\n this._myPointObject = Globals.getSceneObjects(this._myParams.myParent.pp_getEngine()).myVisualElements.pp_addChild();\r\n\r\n this._myPointMeshComponent = this._myPointObject.pp_addComponent(MeshComponent);\r\n }\r\n\r\n _refreshHook() {\r\n // Implemented outside class definition\r\n }\r\n\r\n _new(params) {\r\n return new VisualPoint(params);\r\n }\r\n\r\n _destroyHook() {\r\n this._myPointObject.pp_destroy();\r\n }\r\n}\r\n\r\n\r\n\r\n// IMPLEMENTATION\r\n\r\nVisualPoint.prototype._refreshHook = function () {\r\n let rotation = vec3_create(0, 0, 0);\r\n return function _refreshHook() {\r\n this._myPointObject.pp_setParent(this._myParams.myParent, false);\r\n\r\n if (this._myParams.myLocal) {\r\n this._myPointObject.pp_setPositionLocal(this._myParams.myPosition);\r\n this._myPointObject.pp_setRotationLocal(rotation);\r\n this._myPointObject.pp_setScaleLocal(this._myParams.myRadius);\r\n } else {\r\n this._myPointObject.pp_setPosition(this._myParams.myPosition);\r\n this._myPointObject.pp_setRotation(rotation);\r\n this._myPointObject.pp_setScale(this._myParams.myRadius);\r\n }\r\n\r\n if (this._myParams.myMesh != null) {\r\n this._myPointMeshComponent.mesh = this._myParams.myMesh;\r\n } else {\r\n this._myPointMeshComponent.mesh = Globals.getDefaultMeshes(this._myParams.myParent.pp_getEngine()).mySphere;\r\n }\r\n\r\n if (this._myParams.myMaterial == null) {\r\n if (this._myParams.myColor == null) {\r\n this._myPointMeshComponent.material = Globals.getVisualResources(this._myParams.myParent.pp_getEngine()).myDefaultMaterials.myMesh;\r\n } else {\r\n if (this._myFlatOpaqueMaterial == null) {\r\n this._myFlatOpaqueMaterial = Globals.getDefaultMaterials(this._myParams.myParent.pp_getEngine()).myFlatOpaque.clone();\r\n }\r\n this._myPointMeshComponent.material = this._myFlatOpaqueMaterial;\r\n this._myFlatOpaqueMaterial.color = this._myParams.myColor;\r\n }\r\n } else {\r\n this._myPointMeshComponent.material = this._myParams.myMaterial;\r\n }\r\n };\r\n}();\r\n\r\nVisualPointParams.prototype._copyHook = function _copyHook(other, deepCopy) {\r\n this.myPosition.vec3_copy(other.myPosition);\r\n this.myRadius = other.myRadius;\r\n\r\n this.myMesh = other.myMesh;\r\n\r\n if (other.myMaterial != null && deepCopy) {\r\n this.myMaterial = other.myMaterial.clone();\r\n } else {\r\n this.myMaterial = other.myMaterial;\r\n }\r\n\r\n if (other.myColor != null) {\r\n if (this.myColor != null) {\r\n this.myColor.vec4_copy(other.myColor);\r\n } else {\r\n this.myColor = other.myColor.vec4_clone();\r\n }\r\n } else {\r\n this.myColor = null;\r\n }\r\n\r\n this.myLocal = other.myLocal;\r\n};", "import { Object3D, PhysXComponent, Physics } from \"@wonderlandengine/api\";\r\nimport { vec3_create } from \"../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Globals } from \"../../pp/globals.js\";\r\nimport { RaycastBlockColliderType, RaycastHit, RaycastParams, RaycastResults } from \"./physics_raycast_params.js\";\r\n\r\nlet _myLayerFlagsNames = [\"0\", \"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\"];\r\n\r\nconst _myRaycastCount: WeakMap, number> = new WeakMap();\r\nconst _myRaycastVisualDebugEnabled: WeakMap, boolean> = new WeakMap();\r\n\r\nexport function setLayerFlagsNames(layerFlagsNames: string[]): void {\r\n _myLayerFlagsNames = layerFlagsNames;\r\n}\r\n\r\nexport function getLayerFlagsNames(): string[] {\r\n return _myLayerFlagsNames;\r\n}\r\n\r\nexport function getRaycastCount(physics: Readonly = Globals.getPhysics()!): number {\r\n const raycastCount = _myRaycastCount.get(physics);\r\n return raycastCount != null ? raycastCount : 0;\r\n}\r\n\r\nexport function resetRaycastCount(physics: Readonly = Globals.getPhysics()!): void {\r\n _myRaycastCount.set(physics, 0);\r\n}\r\n\r\nexport function isRaycastVisualDebugEnabled(physics: Readonly = Globals.getPhysics()!): boolean {\r\n return _myRaycastVisualDebugEnabled.get(physics) || false;\r\n}\r\n\r\nexport function setRaycastVisualDebugEnabled(visualDebugEnabled: boolean, physics: Readonly = Globals.getPhysics()!): void {\r\n _myRaycastVisualDebugEnabled.set(physics, visualDebugEnabled);\r\n}\r\n\r\nexport const raycast = function () {\r\n // These initializations assume that there can't be more than @maxHitCount hits within a single rayCast call\r\n // if the hitCount is greater, these arrays will be allocated again\r\n let maxHitCount: number = 20;\r\n let objects: Object3D[] = new Array(maxHitCount);\r\n let distances: Float32Array = new Float32Array(maxHitCount);\r\n let locations: Float32Array[] = Array.from({ length: maxHitCount }, () => new Float32Array(3));\r\n let normals: Float32Array[] = Array.from({ length: maxHitCount }, () => new Float32Array(3));\r\n\r\n const insideCheckSubVector = vec3_create();\r\n const invertedRaycastDirection = vec3_create();\r\n const objectsEqualCallback = (first: Readonly, second: Readonly): boolean => first == second;\r\n return function raycast(raycastParams: Readonly, raycastResults: RaycastResults = new RaycastResults()): RaycastResults {\r\n const internalRaycastResults = raycastParams.myPhysics.rayCast(raycastParams.myOrigin, raycastParams.myDirection, raycastParams.myBlockLayerFlags.getMask(), raycastParams.myDistance);\r\n\r\n if (raycastResults.myRaycastParams == null) {\r\n raycastResults.myRaycastParams = new RaycastParams(raycastParams.myPhysics);\r\n }\r\n\r\n raycastResults.myRaycastParams.copy(raycastParams);\r\n\r\n let currentValidHitIndex = 0;\r\n let validHitsCount = 0;\r\n\r\n const hitCount = internalRaycastResults.hitCount;\r\n if (hitCount != 0) {\r\n if (hitCount > maxHitCount) {\r\n console.warn(\"Raycast hitcount is more than the expected one: \" + hitCount + \" - Allocation of needed resources performed\");\r\n\r\n maxHitCount = Math.ceil(hitCount + hitCount * 0.5);\r\n objects = new Array(maxHitCount);\r\n distances = new Float32Array(maxHitCount);\r\n locations = Array.from({ length: maxHitCount }, () => new Float32Array(3));\r\n normals = Array.from({ length: maxHitCount }, () => new Float32Array(3));\r\n }\r\n\r\n let objectsAlreadyGet = false;\r\n let distancesAlreadyGet = false;\r\n let locationsAlreadyGet = false;\r\n let normalsAlreadyGet = false;\r\n\r\n raycastParams.myDirection.vec3_negate(invertedRaycastDirection);\r\n\r\n for (let i = 0; i < hitCount; i++) {\r\n if (raycastParams.myObjectsToIgnore.length != 0) {\r\n if (!objectsAlreadyGet) {\r\n objectsAlreadyGet = true;\r\n internalRaycastResults.getObjects(objects);\r\n }\r\n\r\n if (raycastParams.myObjectsToIgnore.pp_hasEqual(objects[i], objectsEqualCallback)) {\r\n continue;\r\n }\r\n }\r\n\r\n if (!distancesAlreadyGet) {\r\n distancesAlreadyGet = true;\r\n internalRaycastResults.getDistances(distances);\r\n }\r\n\r\n let colliderTypeValid = true;\r\n if (raycastParams.myBlockColliderType != RaycastBlockColliderType.BOTH) {\r\n colliderTypeValid = false;\r\n\r\n if (!objectsAlreadyGet) {\r\n objectsAlreadyGet = true;\r\n internalRaycastResults.getObjects(objects);\r\n }\r\n\r\n const physXComponent = objects[i].pp_getComponentSelf(PhysXComponent)!;\r\n colliderTypeValid = (physXComponent.trigger && raycastParams.myBlockColliderType == RaycastBlockColliderType.TRIGGER) || (!physXComponent.trigger && raycastParams.myBlockColliderType == RaycastBlockColliderType.NORMAL);\r\n }\r\n\r\n if (colliderTypeValid) {\r\n let hitInsideCollision = distances[i] == 0;\r\n if (hitInsideCollision) {\r\n if (!locationsAlreadyGet) {\r\n locationsAlreadyGet = true;\r\n internalRaycastResults.getLocations(locations);\r\n }\r\n\r\n hitInsideCollision &&= raycastParams.myOrigin.vec3_sub(locations[i], insideCheckSubVector).vec3_isZero(Math.PP_EPSILON);\r\n\r\n if (hitInsideCollision) {\r\n if (!normalsAlreadyGet) {\r\n normalsAlreadyGet = true;\r\n internalRaycastResults.getNormals(normals);\r\n }\r\n\r\n hitInsideCollision &&= invertedRaycastDirection.vec3_equals(normals[i], Math.PP_EPSILON_DEGREES);\r\n }\r\n }\r\n\r\n if ((!raycastParams.myIgnoreHitsInsideCollision || !hitInsideCollision)) {\r\n let hit: RaycastHit | null = null;\r\n\r\n const raycastResultsUnusedHits = (raycastResults as unknown as { _myUnusedHits: RaycastHit[] | null })._myUnusedHits;\r\n if (currentValidHitIndex < raycastResults.myHits.length) {\r\n hit = raycastResults.myHits[currentValidHitIndex];\r\n } else if (raycastResultsUnusedHits != null && raycastResultsUnusedHits.length > 0) {\r\n hit = raycastResultsUnusedHits.pop()!;\r\n raycastResults.myHits.push(hit!);\r\n } else {\r\n hit = new RaycastHit();\r\n raycastResults.myHits.push(hit);\r\n }\r\n\r\n if (!objectsAlreadyGet) {\r\n objectsAlreadyGet = true;\r\n internalRaycastResults.getObjects(objects);\r\n }\r\n\r\n if (!locationsAlreadyGet) {\r\n locationsAlreadyGet = true;\r\n internalRaycastResults.getLocations(locations);\r\n }\r\n\r\n if (!normalsAlreadyGet) {\r\n normalsAlreadyGet = true;\r\n internalRaycastResults.getNormals(normals);\r\n }\r\n\r\n hit!.myPosition.vec3_copy(locations[i]);\r\n hit!.myNormal.vec3_copy(normals[i]);\r\n hit!.myDistance = distances[i];\r\n hit!.myObject = objects[i];\r\n hit!.myInsideCollision = hitInsideCollision;\r\n\r\n validHitsCount++;\r\n currentValidHitIndex++;\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (raycastResults.myHits.length > validHitsCount) {\r\n let raycastResultsUnusedHits = (raycastResults as unknown as { _myUnusedHits: RaycastHit[] | null })._myUnusedHits;\r\n if (raycastResultsUnusedHits == null) {\r\n raycastResultsUnusedHits = [];\r\n (raycastResults as unknown as { _myUnusedHits: RaycastHit[] | null })._myUnusedHits = raycastResultsUnusedHits;\r\n\r\n }\r\n\r\n const hitsToRemove = raycastResults.myHits.length - validHitsCount;\r\n for (let i = 0; i < hitsToRemove; i++) {\r\n raycastResultsUnusedHits!.push(raycastResults.myHits.pop()!);\r\n }\r\n }\r\n\r\n if (Globals.isDebugEnabled(raycastParams.myPhysics.engine)) {\r\n if (PhysicsUtils.isRaycastVisualDebugEnabled(raycastParams.myPhysics)) {\r\n Globals.getDebugVisualManager(raycastParams.myPhysics.engine)!.drawRaycast(0, raycastResults);\r\n }\r\n\r\n _increaseRaycastCount(raycastParams.myPhysics);\r\n }\r\n\r\n return raycastResults;\r\n };\r\n}();\r\n\r\nexport const PhysicsUtils = {\r\n setLayerFlagsNames,\r\n getLayerFlagsNames,\r\n getRaycastCount,\r\n resetRaycastCount,\r\n isRaycastVisualDebugEnabled,\r\n setRaycastVisualDebugEnabled,\r\n raycast\r\n} as const;\r\n\r\n\r\n\r\nfunction _increaseRaycastCount(physics: Readonly = Globals.getPhysics()!): void {\r\n const raycastCount = _myRaycastCount.get(physics);\r\n\r\n if (raycastCount == null) {\r\n _myRaycastCount.set(physics, 1);\r\n } else {\r\n _myRaycastCount.set(physics, raycastCount + 1);\r\n }\r\n}", "import { PhysicsUtils } from \"./physics_utils.js\";\r\n\r\nexport class PhysicsLayerFlags {\r\n\r\n constructor() {\r\n this._myLayerMask = 0;\r\n }\r\n\r\n setFlagActive(indexOrName, active) {\r\n let index = indexOrName;\r\n if (isNaN(indexOrName)) {\r\n index = PhysicsUtils.getLayerFlagsNames().pp_findIndexEqual(indexOrName);\r\n }\r\n\r\n if (index >= 0 && index < PhysicsUtils.getLayerFlagsNames().length) {\r\n let mask = 1 << index;\r\n\r\n if (active) {\r\n this._myLayerMask = this._myLayerMask | mask;\r\n } else {\r\n this._myLayerMask = this._myLayerMask & ~mask;\r\n }\r\n }\r\n }\r\n\r\n isFlagActive(indexOrName) {\r\n let index = indexOrName;\r\n if (isNaN(indexOrName)) {\r\n index = PhysicsUtils.getLayerFlagsNames().pp_findIndexEqual(indexOrName);\r\n }\r\n\r\n let active = false;\r\n\r\n if (index >= 0 && index < PhysicsUtils.getLayerFlagsNames().length) {\r\n let mask = 1 << index;\r\n active = !!(this._myLayerMask & mask);\r\n }\r\n\r\n return active;\r\n }\r\n\r\n setAllFlagsActive(active) {\r\n if (!active) {\r\n this._myLayerMask = 0;\r\n } else {\r\n this._myLayerMask = Math.pow(2, PhysicsUtils.getLayerFlagsNames().length) - 1;\r\n }\r\n }\r\n\r\n add(layerFlags) {\r\n this._myLayerMask = this._myLayerMask | layerFlags.getMask();\r\n }\r\n\r\n remove(layerFlags) {\r\n this._myLayerMask = this._myLayerMask & ~(layerFlags.getMask());\r\n }\r\n\r\n intersect(layerFlags) {\r\n this._myLayerMask = this._myLayerMask & layerFlags.getMask();\r\n }\r\n\r\n copy(layerFlags) {\r\n this._myLayerMask = layerFlags._myLayerMask;\r\n }\r\n\r\n getMask() {\r\n return this._myLayerMask;\r\n }\r\n\r\n setMask(layerMask) {\r\n this._myLayerMask = layerMask;\r\n }\r\n\r\n equals(other) {\r\n return this._myLayerMask == other._myLayerMask;\r\n }\r\n}", "import { Object3D, Physics } from \"@wonderlandengine/api\";\r\nimport { vec3_create } from \"../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Globals } from \"../../pp/globals.js\";\r\nimport { Vector3 } from \"../type_definitions/array_type_definitions.js\";\r\nimport { PhysicsLayerFlags } from \"./physics_layer_flags.js\";\r\n\r\nexport enum RaycastBlockColliderType {\r\n NORMAL,\r\n TRIGGER,\r\n BOTH\r\n}\r\n\r\nexport class RaycastParams {\r\n\r\n public myOrigin: Vector3 = vec3_create();\r\n public myDirection: Vector3 = vec3_create();\r\n public myDistance: number = 0;\r\n\r\n public myBlockLayerFlags: Readonly = new PhysicsLayerFlags();\r\n public myBlockColliderType: RaycastBlockColliderType = RaycastBlockColliderType.NORMAL;\r\n\r\n public myObjectsToIgnore: Readonly[] = [];\r\n public myIgnoreHitsInsideCollision: boolean = false;\r\n\r\n public myPhysics: Readonly;\r\n\r\n constructor(physics: Readonly = Globals.getPhysics()!) {\r\n this.myPhysics = physics;\r\n }\r\n\r\n public copy(other: Readonly): void {\r\n this.myOrigin.vec3_copy(other.myOrigin);\r\n this.myDirection.vec3_copy(other.myDirection);\r\n this.myDistance = other.myDistance;\r\n\r\n this.myBlockLayerFlags.copy(other.myBlockLayerFlags);\r\n\r\n this.myObjectsToIgnore.pp_copy(other.myObjectsToIgnore);\r\n this.myIgnoreHitsInsideCollision = other.myIgnoreHitsInsideCollision;\r\n\r\n (this.myPhysics as Readonly) = other.myPhysics;\r\n }\r\n\r\n public reset(): void {\r\n this.myOrigin.vec3_zero();\r\n this.myDirection.vec3_zero();\r\n this.myDistance = 0;\r\n\r\n this.myBlockLayerFlags.setAllFlagsActive(false);\r\n\r\n this.myObjectsToIgnore.pp_clear();\r\n this.myIgnoreHitsInsideCollision = false;\r\n }\r\n\r\n public equals(other: Readonly): boolean {\r\n if (this == other) return true;\r\n\r\n return this.myOrigin.vec3_equals(other.myOrigin) &&\r\n this.myDirection.vec3_equals(other.myDirection) &&\r\n this.myDistance == other.myDistance &&\r\n this.myBlockLayerFlags.equals(other.myBlockLayerFlags) &&\r\n this.myBlockColliderType == other.myBlockColliderType &&\r\n this.myObjectsToIgnore.pp_equals(other.myObjectsToIgnore) &&\r\n this.myIgnoreHitsInsideCollision == other.myIgnoreHitsInsideCollision &&\r\n this.myPhysics == other.myPhysics;\r\n }\r\n}\r\n\r\nexport class RaycastResults {\r\n\r\n public myRaycastParams: Readonly | null = null;\r\n public myHits: Readonly[] = [];\r\n\r\n private _myUnusedHits: RaycastHit[] | null = null;\r\n\r\n public isColliding(ignoreHitsInsideCollision = false): boolean {\r\n return ignoreHitsInsideCollision ? this.getFirstHitOutsideCollision() != null : this.myHits.length > 0;\r\n }\r\n\r\n public getFirstHitInsideCollision(): Readonly | null {\r\n let firstHit = null;\r\n\r\n for (let i = 0; i < this.myHits.length; i++) {\r\n const hit = this.myHits[i];\r\n if (hit.myInsideCollision) {\r\n firstHit = hit;\r\n break;\r\n }\r\n }\r\n\r\n return firstHit;\r\n }\r\n\r\n public getFirstHitOutsideCollision(): Readonly | null {\r\n let firstHit = null;\r\n\r\n for (let i = 0; i < this.myHits.length; i++) {\r\n const hit = this.myHits[i];\r\n if (!hit.myInsideCollision) {\r\n firstHit = hit;\r\n break;\r\n }\r\n }\r\n\r\n return firstHit;\r\n }\r\n\r\n public getHitsInsideCollision(): Readonly[] {\r\n const hits = [];\r\n\r\n for (let i = 0; i < this.myHits.length; i++) {\r\n const hit = this.myHits[i];\r\n if (hit.myInsideCollision) {\r\n hits.push(hit);\r\n }\r\n }\r\n\r\n return hits;\r\n }\r\n\r\n public getHitsOutsideCollision(): Readonly[] {\r\n const hits = [];\r\n\r\n for (let i = 0; i < this.myHits.length; i++) {\r\n const hit = this.myHits[i];\r\n if (!hit.myInsideCollision) {\r\n hits.push(hit);\r\n }\r\n }\r\n\r\n return hits;\r\n }\r\n\r\n public removeHit(hitIndex: number): Readonly | null {\r\n const removedHit = this.myHits.pp_removeIndex(hitIndex);\r\n\r\n if (removedHit != null) {\r\n if (this._myUnusedHits == null) {\r\n this._myUnusedHits = [];\r\n }\r\n\r\n this._myUnusedHits.push(removedHit);\r\n }\r\n\r\n return removedHit ?? null;\r\n }\r\n\r\n public removeAllHits(): void {\r\n if (this._myUnusedHits == null) {\r\n this._myUnusedHits = [];\r\n }\r\n\r\n for (let i = 0; i < this.myHits.length; i++) {\r\n this._myUnusedHits.push(this.myHits[i]);\r\n }\r\n\r\n this.myHits.pp_clear();\r\n }\r\n\r\n\r\n private static readonly _copySV =\r\n {\r\n copyHitCallback(elementToCopy: Readonly, currentElement: RaycastHit | null): RaycastHit {\r\n if (currentElement == null) {\r\n currentElement = new RaycastHit();\r\n }\r\n\r\n currentElement.copy(elementToCopy);\r\n\r\n return currentElement;\r\n }\r\n };\r\n public copy(other: Readonly): void {\r\n if (other.myRaycastParams == null) {\r\n this.myRaycastParams = null;\r\n } else {\r\n if (this.myRaycastParams == null) {\r\n this.myRaycastParams = new RaycastParams(other.myRaycastParams.myPhysics);\r\n }\r\n\r\n this.myRaycastParams.copy(other.myRaycastParams);\r\n }\r\n\r\n if (this.myHits.length > other.myHits.length) {\r\n if (this._myUnusedHits == null) {\r\n this._myUnusedHits = [];\r\n }\r\n\r\n for (let i = 0; i < this.myHits.length - other.myHits.length; i++) {\r\n this._myUnusedHits.push(this.myHits.pop()!);\r\n }\r\n } else if (this.myHits.length < other.myHits.length) {\r\n if (this._myUnusedHits != null) {\r\n const length = Math.min(this._myUnusedHits.length, other.myHits.length - this.myHits.length);\r\n\r\n for (let i = 0; i < length; i++) {\r\n this.myHits.push(this._myUnusedHits.pop()!);\r\n }\r\n }\r\n }\r\n\r\n const copyHitCallback = RaycastResults._copySV.copyHitCallback;\r\n this.myHits.pp_copy(other.myHits, copyHitCallback);\r\n }\r\n\r\n public reset(): void {\r\n if (this.myRaycastParams != null) {\r\n this.myRaycastParams.reset();\r\n }\r\n\r\n this.removeAllHits();\r\n }\r\n\r\n private static readonly _equalsSV =\r\n {\r\n hitsEqualCallback: (first: Readonly, second: Readonly): boolean => first.equals(second)\r\n };\r\n public equals(other: Readonly): boolean {\r\n if (this == other) return true;\r\n\r\n const hitsEqualCallback = RaycastResults._equalsSV.hitsEqualCallback;\r\n return (this.myRaycastParams == other.myRaycastParams ||\r\n (this.myRaycastParams != null && other.myRaycastParams != null && this.myRaycastParams.equals(other.myRaycastParams))) &&\r\n this.myHits.pp_equals(other.myHits, hitsEqualCallback);\r\n }\r\n}\r\n\r\nexport class RaycastHit {\r\n\r\n public myPosition: Vector3 = vec3_create();\r\n public myNormal: Vector3 = vec3_create();\r\n public myDistance: number = 0;\r\n public myObject: Object3D | null = null;\r\n\r\n public myInsideCollision: boolean = false;\r\n\r\n public isValid(): boolean {\r\n return this.myObject != null;\r\n }\r\n\r\n public copy(other: Readonly): void {\r\n this.myPosition.vec3_copy(other.myPosition);\r\n this.myNormal.vec3_copy(other.myNormal);\r\n this.myDistance = other.myDistance;\r\n this.myObject = other.myObject;\r\n this.myInsideCollision = other.myInsideCollision;\r\n }\r\n\r\n public reset(): void {\r\n this.myPosition.vec3_zero();\r\n this.myNormal.vec3_zero();\r\n this.myDistance = 0;\r\n this.myObject = null;\r\n this.myInsideCollision = false;\r\n }\r\n\r\n public equals(other: Readonly): boolean {\r\n if (this == other) return true;\r\n\r\n return this.myPosition.vec3_equals(other.myPosition) &&\r\n this.myNormal.vec3_equals(other.myNormal) &&\r\n this.myDistance == other.myDistance &&\r\n this.myObject == other.myObject &&\r\n this.myInsideCollision == other.myInsideCollision;\r\n }\r\n}", "import { Globals } from \"../../../pp/globals.js\";\r\nimport { RaycastResults } from \"../../physics/physics_raycast_params.js\";\r\nimport { VisualArrow, VisualArrowParams } from \"./visual_arrow.js\";\r\nimport { AbstractVisualElement, AbstractVisualElementParams } from \"./visual_element.js\";\r\nimport { VisualElementDefaultType } from \"./visual_element_types.js\";\r\n\r\nexport class VisualRaycastParams extends AbstractVisualElementParams {\r\n\r\n /**\r\n * TS type inference helper\r\n * \r\n * @param {any} engine\r\n */\r\n constructor(engine = Globals.getMainEngine()) {\r\n super(engine);\r\n\r\n this._myRaycastResults = new RaycastResults();\r\n\r\n this.myHitNormalLength = 0.2;\r\n this.myThickness = 0.005;\r\n\r\n this.myShowOnlyFirstHit = true;\r\n\r\n this.myRayMaterial = null;\r\n this.myHitNormalMaterial = null;\r\n\r\n this.myLocal = false;\r\n\r\n this.myType = VisualElementDefaultType.RAYCAST;\r\n }\r\n\r\n get myRaycastResults() {\r\n return this._myRaycastResults;\r\n }\r\n\r\n set myRaycastResults(result) {\r\n this._myRaycastResults.copy(result);\r\n }\r\n\r\n _copyHook(other, deepCopy) {\r\n // Implemented outside class definition\r\n }\r\n\r\n _new() {\r\n return new VisualRaycastParams(this.myParent.pp_getEngine());\r\n }\r\n\r\n _equalsHook(other) {\r\n return this.myHitNormalLength == other.myHitNormalLength &&\r\n this.myThickness == other.myThickness &&\r\n this.myShowOnlyFirstHit == other.myShowOnlyFirstHit &&\r\n this.myRayMaterial == other.myRayMaterial &&\r\n this.myHitNormalMaterial == other.myHitNormalMaterial &&\r\n this.myLocal == other.myLocal &&\r\n this._myRaycastResults.equals(other._myRaycastResults);\r\n }\r\n}\r\n\r\n/**\r\n * Example:\r\n * \r\n * ```js \r\n * const visualParams = new VisualRaycastParams();\r\n * visualParams.myRaycastResults = raycastResults;\r\n * const visualRaycast = new VisualRaycast(visualParams);\r\n * \r\n * // OR\r\n * \r\n * Globals.getVisualManager().draw(visualParams);\r\n * ```\r\n*/\r\nexport class VisualRaycast extends AbstractVisualElement {\r\n\r\n constructor(params = new VisualRaycastParams()) {\r\n super(params);\r\n\r\n this._myVisualRaycast = new VisualArrow(new VisualArrowParams(this._myParams.myParent.pp_getEngine()));\r\n\r\n this._myVisualRaycast.setAutoRefresh(false);\r\n\r\n this._myVisualRaycastHitList = [];\r\n\r\n this._addVisualRaycastHit();\r\n\r\n this._prepare();\r\n }\r\n\r\n _updateHook(dt) {\r\n this._myVisualRaycast.update(dt);\r\n for (let visualRaycastHit of this._myVisualRaycastHitList) {\r\n visualRaycastHit.update(dt);\r\n }\r\n }\r\n\r\n _visibleChanged() {\r\n if (this._myVisible) {\r\n if (this._myParams.myRaycastResults.myRaycastParams != null) {\r\n this._myVisualRaycast.setVisible(true);\r\n }\r\n\r\n if (this._myParams.myRaycastResults.myHits.length > 0) {\r\n let hitsToShow = Math.min(this._myParams.myRaycastResults.myHits.length, this._myVisualRaycastHitList.length);\r\n\r\n for (let i = 0; i < hitsToShow; i++) {\r\n let visualRaycastHit = this._myVisualRaycastHitList[i];\r\n visualRaycastHit.setVisible(true);\r\n }\r\n }\r\n } else {\r\n this._myVisualRaycast.setVisible(false);\r\n\r\n for (let visualRaycastHit of this._myVisualRaycastHitList) {\r\n visualRaycastHit.setVisible(false);\r\n }\r\n }\r\n }\r\n\r\n _build() {\r\n\r\n }\r\n\r\n _refreshHook() {\r\n for (let visualRaycastHit of this._myVisualRaycastHitList) {\r\n visualRaycastHit.setVisible(false);\r\n }\r\n\r\n if (this._myParams.myRaycastResults.myHits.length > 0) {\r\n let raycastDistance = this._myParams.myShowOnlyFirstHit ?\r\n this._myParams.myRaycastResults.myHits.pp_first().myDistance :\r\n this._myParams.myRaycastResults.myHits.pp_last().myDistance;\r\n\r\n {\r\n let visualRaycastParams = this._myVisualRaycast.getParams();\r\n visualRaycastParams.myStart.vec3_copy(this._myParams.myRaycastResults.myRaycastParams.myOrigin);\r\n visualRaycastParams.myDirection.vec3_copy(this._myParams.myRaycastResults.myRaycastParams.myDirection);\r\n visualRaycastParams.myLength = raycastDistance;\r\n visualRaycastParams.myThickness = this._myParams.myThickness;\r\n\r\n if (this._myParams.myRayMaterial == null) {\r\n visualRaycastParams.myMaterial = Globals.getVisualResources(this._myParams.myParent.pp_getEngine()).myDefaultMaterials.myRay;\r\n } else {\r\n visualRaycastParams.myMaterial = this._myParams.myRayMaterial;\r\n }\r\n\r\n visualRaycastParams.myParent = this._myParams.myParent;\r\n visualRaycastParams.myLocal = this._myParams.myLocal;\r\n\r\n this._myVisualRaycast.paramsUpdated();\r\n\r\n this._myVisualRaycast.setVisible(this._myVisible);\r\n }\r\n\r\n let hitsToShow = this._myParams.myShowOnlyFirstHit ? 1 : this._myParams.myRaycastResults.myHits.length;\r\n while (hitsToShow > this._myVisualRaycastHitList.length) {\r\n this._addVisualRaycastHit();\r\n }\r\n\r\n for (let i = 0; i < hitsToShow; i++) {\r\n let visualRaycastHit = this._myVisualRaycastHitList[i];\r\n\r\n {\r\n let visualRaycastHitParams = visualRaycastHit.getParams();\r\n visualRaycastHitParams.myStart.vec3_copy(this._myParams.myRaycastResults.myHits[i].myPosition);\r\n visualRaycastHitParams.myDirection.vec3_copy(this._myParams.myRaycastResults.myHits[i].myNormal);\r\n visualRaycastHitParams.myLength = this._myParams.myHitNormalLength;\r\n visualRaycastHitParams.myThickness = this._myParams.myThickness;\r\n\r\n if (this._myParams.myHitNormalMaterial == null) {\r\n visualRaycastHitParams.myMaterial = Globals.getVisualResources(this._myParams.myParent.pp_getEngine()).myDefaultMaterials.myHitNormal;\r\n } else {\r\n visualRaycastHitParams.myMaterial = this._myParams.myHitNormalMaterial;\r\n }\r\n\r\n visualRaycastHitParams.myParent = this._myParams.myParent;\r\n visualRaycastHitParams.myLocal = this._myParams.myLocal;\r\n\r\n visualRaycastHit.paramsUpdated();\r\n\r\n visualRaycastHit.setVisible(this._myVisible);\r\n }\r\n }\r\n\r\n } else if (this._myParams.myRaycastResults.myRaycastParams != null) {\r\n {\r\n let visualRaycastParams = this._myVisualRaycast.getParams();\r\n visualRaycastParams.myStart.vec3_copy(this._myParams.myRaycastResults.myRaycastParams.myOrigin);\r\n visualRaycastParams.myDirection.vec3_copy(this._myParams.myRaycastResults.myRaycastParams.myDirection);\r\n visualRaycastParams.myLength = this._myParams.myRaycastResults.myRaycastParams.myDistance;\r\n visualRaycastParams.myThickness = this._myParams.myThickness;\r\n\r\n if (this._myParams.myRayMaterial == null) {\r\n visualRaycastParams.myMaterial = Globals.getVisualResources(this._myParams.myParent.pp_getEngine()).myDefaultMaterials.myRay;\r\n } else {\r\n visualRaycastParams.myMaterial = this._myParams.myRayMaterial;\r\n }\r\n\r\n visualRaycastParams.myParent = this._myParams.myParent;\r\n visualRaycastParams.myLocal = this._myParams.myLocal;\r\n\r\n this._myVisualRaycast.paramsUpdated();\r\n\r\n this._myVisualRaycast.setVisible(this._myVisible);\r\n }\r\n } else {\r\n this._myVisualRaycast.setVisible(false);\r\n }\r\n }\r\n\r\n _new(params) {\r\n return new VisualRaycast(params);\r\n }\r\n\r\n _addVisualRaycastHit() {\r\n let visualRaycastHit = new VisualArrow(new VisualArrowParams(this._myParams.myParent.pp_getEngine()));\r\n\r\n visualRaycastHit.setAutoRefresh(false);\r\n visualRaycastHit.setVisible(false);\r\n\r\n this._myVisualRaycastHitList.push(visualRaycastHit);\r\n }\r\n\r\n _destroyHook() {\r\n this._myVisualRaycast.destroy();\r\n for (let visualRaycastHit of this._myVisualRaycastHitList) {\r\n visualRaycastHit.destroy();\r\n }\r\n }\r\n}\r\n\r\n\r\n\r\n// IMPLEMENTATION\r\n\r\nVisualRaycastParams.prototype._copyHook = function _copyHook(other, deepCopy) {\r\n this.myRaycastResults = other.myRaycastResults;\r\n this.myHitNormalLength = other.myHitNormalLength;\r\n this.myThickness = other.myThickness;\r\n this.myShowOnlyFirstHit = other.myShowOnlyFirstHit;\r\n\r\n if (other.myRayMaterial != null && deepCopy) {\r\n this.myRayMaterial = other.myRayMaterial.clone();\r\n } else {\r\n this.myRayMaterial = other.myRayMaterial;\r\n }\r\n\r\n if (other.myHitNormalMaterial != null && deepCopy) {\r\n this.myHitNormalMaterial = other.myForwardMaterial.clone();\r\n } else {\r\n this.myHitNormalMaterial = other.myHitNormalMaterial;\r\n }\r\n\r\n this.myParent = other.myParent;\r\n this.myLocal = other.myLocal;\r\n\r\n this.myType = other.myType;\r\n};", "import { Alignment, TextComponent, VerticalAlignment } from \"@wonderlandengine/api\";\r\nimport { mat4_create, vec3_create } from \"../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Globals } from \"../../../pp/globals.js\";\r\nimport { AbstractVisualElement, AbstractVisualElementParams } from \"./visual_element.js\";\r\nimport { VisualElementDefaultType } from \"./visual_element_types.js\";\r\n\r\nexport class VisualTextParams extends AbstractVisualElementParams {\r\n\r\n /**\r\n * TS type inference helper\r\n * \r\n * @param {any} engine\r\n */\r\n constructor(engine = Globals.getMainEngine()) {\r\n super(engine);\r\n\r\n this.myText = \"\";\r\n this.myAlignment = Alignment.Center;\r\n this.myVerticalAlignment = VerticalAlignment.Middle;\r\n\r\n this.myTransform = mat4_create();\r\n\r\n this.myMaterial = null; // null means it will default on myDefaultResources.myMaterials.myDefaultTextMaterial\r\n\r\n this.myColor = null; // If this is set and material is null, it will use the default text material with this color\r\n\r\n this.myLocal = false;\r\n\r\n this.myLookAtObject = null;\r\n\r\n this.myType = VisualElementDefaultType.TEXT;\r\n }\r\n\r\n _copyHook(other, deepCopy) {\r\n // Implemented outside class definition\r\n }\r\n\r\n _new() {\r\n return new VisualTextParams(this.myParent.pp_getEngine());\r\n }\r\n\r\n _equalsHook(other) {\r\n return this.myText == other.myText &&\r\n this.myAlignment == other.myAlignment &&\r\n this.myVerticalAlignment == other.myVerticalAlignment &&\r\n this.myMaterial == other.myMaterial &&\r\n this.myLookAtObject == other.myLookAtObject &&\r\n this.myLocal == other.myLocal &&\r\n (this.myColor == other.myColor || (this.myColor != null && other.myColor != null && this.myColor.vec_equals(other.myColor))) &&\r\n this.myTransform.vec_equals(other.myTransform);\r\n }\r\n}\r\n\r\n/**\r\n * Example:\r\n * \r\n * ```js \r\n * const visualParams = new VisualTextParams();\r\n * visualParams.myText = text;\r\n * visualParams.myTransform.mat4_copy(transform);\r\n * visualParams.myMaterial = myDefaultResources.myMaterials.myText.clone();\r\n * visualParams.myMaterial.color = vec4_create(1, 1, 1, 1);\r\n * const visualText = new VisualText(visualParams);\r\n * \r\n * // OR\r\n * \r\n * Globals.getVisualManager().draw(visualParams);\r\n * ```\r\n*/\r\nexport class VisualText extends AbstractVisualElement {\r\n\r\n constructor(params = new VisualTextParams()) {\r\n super(params);\r\n\r\n this._myTextObject = null;\r\n this._myTextComponent = null;\r\n\r\n this._myTextMaterial = null;\r\n\r\n this._prepare();\r\n }\r\n\r\n _visibleChanged() {\r\n this._myTextObject.pp_setActive(this._myVisible);\r\n }\r\n\r\n _build() {\r\n this._myTextObject = Globals.getSceneObjects(this._myParams.myParent.pp_getEngine()).myVisualElements.pp_addChild();\r\n this._myTextComponent = this._myTextObject.pp_addComponent(TextComponent);\r\n }\r\n\r\n _refreshHook() {\r\n // Implemented outside class definition\r\n }\r\n\r\n _new(params) {\r\n return new VisualText(params);\r\n }\r\n\r\n _destroyHook() {\r\n this._myTextObject.pp_destroy();\r\n }\r\n}\r\n\r\n\r\n\r\n// IMPLEMENTATION\r\n\r\nVisualTextParams.prototype._copyHook = function _copyHook(other, deepCopy) {\r\n this.myText = other.myText;\r\n this.myAlignment = other.myAlignment;\r\n this.myVerticalAlignment = other.myVerticalAlignment;\r\n\r\n this.myTransform.mat4_copy(other.myTransform);\r\n\r\n if (other.myMaterial != null && deepCopy) {\r\n this.myMaterial = other.myMaterial.clone();\r\n } else {\r\n this.myMaterial = other.myMaterial;\r\n }\r\n\r\n if (other.myColor != null) {\r\n if (this.myColor != null) {\r\n this.myColor.vec4_copy(other.myColor);\r\n } else {\r\n this.myColor = other.myColor.vec4_clone();\r\n }\r\n } else {\r\n this.myColor = null;\r\n }\r\n\r\n this.myLocal = other.myLocal;\r\n\r\n this.myLookAtObject = other.myLookAtObject;\r\n};\r\n\r\nVisualText.prototype._refreshHook = function () {\r\n let lookAtPosition = vec3_create();\r\n return function _refreshHook() {\r\n this._myTextObject.pp_setParent(this._myParams.myParent, false);\r\n\r\n if (this._myParams.myLocal) {\r\n this._myTextObject.pp_setTransformLocal(this._myParams.myTransform);\r\n } else {\r\n this._myTextObject.pp_setTransform(this._myParams.myTransform);\r\n }\r\n\r\n if (this._myParams.myLookAtObject != null) {\r\n this._myParams.myLookAtObject.pp_getPosition(lookAtPosition);\r\n this._myTextObject.pp_lookAt(lookAtPosition);\r\n }\r\n\r\n if (this._myParams.myMaterial == null) {\r\n if (this._myParams.myColor == null) {\r\n this._myTextComponent.material = Globals.getVisualResources(this._myParams.myParent.pp_getEngine()).myDefaultMaterials.myText;\r\n } else {\r\n if (this._myTextMaterial == null) {\r\n this._myTextMaterial = Globals.getDefaultMaterials(this._myParams.myParent.pp_getEngine()).myText.clone();\r\n }\r\n this._myTextComponent.material = this._myTextMaterial;\r\n this._myTextMaterial.color = this._myParams.myColor;\r\n }\r\n } else {\r\n this._myTextComponent.material = this._myParams.myMaterial;\r\n }\r\n\r\n this._myTextComponent.text = this._myParams.myText;\r\n this._myTextComponent.alignment = this._myParams.myAlignment;\r\n this._myTextComponent.verticalAlignment = this._myParams.myVerticalAlignment;\r\n\r\n this._myDirty = false;\r\n };\r\n}();", "import { mat4_create, vec3_create } from \"../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Globals } from \"../../../pp/globals.js\";\r\nimport { AbstractVisualElement, AbstractVisualElementParams } from \"./visual_element.js\";\r\nimport { VisualElementDefaultType } from \"./visual_element_types.js\";\r\nimport { VisualLine, VisualLineParams } from \"./visual_line.js\";\r\n\r\nexport class VisualTorusParams extends AbstractVisualElementParams {\r\n\r\n /**\r\n * TS type inference helper\r\n * \r\n * @param {any} engine\r\n */\r\n constructor(engine = Globals.getMainEngine()) {\r\n super(engine);\r\n\r\n this.myTransform = mat4_create();\r\n this.myRadius = 0;\r\n\r\n this.mySegmentsAmount = 12;\r\n this.mySegmentThickness = 0.05;\r\n\r\n this.mySegmentMesh = null; // The mesh is scaled along up axis, null means it will default on myDefaultResources.myMeshes.myCylinder\r\n\r\n this.myMaterial = null; // null means it will default on myDefaultResources.myMaterials.myFlatOpaque\r\n this.myColor = null; // If this is set and material is null, it will use the default flat opaque material with this color\r\n\r\n this.myLocal = false;\r\n\r\n this.myType = VisualElementDefaultType.TORUS;\r\n }\r\n\r\n _copyHook(other, deepCopy) {\r\n // Implemented outside class definition\r\n }\r\n\r\n _new() {\r\n return new VisualTorusParams(this.myParent.pp_getEngine());\r\n }\r\n\r\n _equalsHook(other) {\r\n return this.myRadius == other.myRadius &&\r\n this.mySegmentsAmount == other.mySegmentsAmount &&\r\n this.mySegmentThickness == other.mySegmentThickness &&\r\n this.mySegmentMesh == other.mySegmentMesh &&\r\n this.myMaterial == other.myMaterial &&\r\n this.myLocal == other.myLocal &&\r\n (this.myColor == other.myColor || (this.myColor != null && other.myColor != null && this.myColor.vec_equals(other.myColor))) &&\r\n this.myTransform.vec_equals(other.myTransform);\r\n }\r\n}\r\n\r\n/**\r\n * Example:\r\n * \r\n * ```js \r\n * const visualParams = new VisualTorusParams();\r\n * visualParams.myRadius = 1;\r\n * visualParams.mySegmentsAmount = 12;\r\n * visualParams.mySegmentThickness = 0.05;\r\n * visualParams.myTransform.mat4_copy(transform);\r\n * visualParams.myMaterial = Globals.getDefaultMaterials().myFlatOpaque.clone();\r\n * visualParams.myMaterial.color = vec4_create(1, 1, 1, 1);\r\n * const visualTorus = new VisualTorus(visualParams);\r\n * \r\n * // OR\r\n * \r\n * Globals.getVisualManager().draw(visualParams);\r\n * ```\r\n*/\r\nexport class VisualTorus extends AbstractVisualElement {\r\n\r\n constructor(params = new VisualTorusParams()) {\r\n super(params);\r\n\r\n this._myTorusParentObject = null;\r\n\r\n this._myVisualSegmentList = [];\r\n\r\n this._myFlatOpaqueMaterial = null;\r\n\r\n this._prepare();\r\n }\r\n\r\n _visibleChanged() {\r\n if (this._myVisible) {\r\n let segmentToShow = Math.min(this._myParams.mySegmentsAmount, this._myVisualSegmentList.length);\r\n\r\n for (let i = 0; i < segmentToShow; i++) {\r\n let visualSegment = this._myVisualSegmentList[i];\r\n visualSegment.setVisible(true);\r\n }\r\n } else {\r\n for (let visualSegment of this._myVisualSegmentList) {\r\n visualSegment.setVisible(false);\r\n }\r\n }\r\n }\r\n\r\n _updateHook(dt) {\r\n for (let visualSegment of this._myVisualSegmentList) {\r\n visualSegment.update(dt);\r\n }\r\n }\r\n\r\n _build() {\r\n this._myTorusParentObject = Globals.getSceneObjects(this._myParams.myParent.pp_getEngine()).myVisualElements.pp_addChild();\r\n\r\n this._fillSegmentList();\r\n }\r\n\r\n _fillSegmentList() {\r\n while (this._myVisualSegmentList.length < this._myParams.mySegmentsAmount) {\r\n let visualSegment = new VisualLine(new VisualLineParams(this._myParams.myParent.pp_getEngine()));\r\n\r\n visualSegment.setAutoRefresh(false);\r\n visualSegment.setVisible(false);\r\n\r\n visualSegment.getParams().myParent = this._myTorusParentObject;\r\n visualSegment.getParams().myLocal = true;\r\n\r\n this._myVisualSegmentList.push(visualSegment);\r\n }\r\n }\r\n\r\n _refreshHook() {\r\n // Implemented outside class definition\r\n }\r\n\r\n _new(params) {\r\n return new VisualTorus(params);\r\n }\r\n\r\n _destroyHook() {\r\n for (let visualSegment of this._myVisualSegmentList) {\r\n visualSegment.destroy();\r\n }\r\n this._myTorusParentObject.pp_destroy();\r\n }\r\n}\r\n\r\n\r\n\r\n// IMPLEMENTATION\r\n\r\nVisualTorus.prototype._refreshHook = function () {\r\n let segmentStart = vec3_create();\r\n let segmentEnd = vec3_create();\r\n\r\n let segmentDirection = vec3_create();\r\n\r\n let fixedSegmentStart = vec3_create();\r\n let fixedSegmentEnd = vec3_create();\r\n\r\n let up = vec3_create(0, 1, 0);\r\n return function _refreshHook() {\r\n this._fillSegmentList();\r\n\r\n for (let i = this._myParams.mySegmentsAmount; i < this._myVisualSegmentList.length; i++) {\r\n let visualSegment = this._myVisualSegmentList[i];\r\n visualSegment.setVisible(false);\r\n }\r\n\r\n this._myTorusParentObject.pp_setParent(this._myParams.myParent, false);\r\n\r\n if (this._myParams.myLocal) {\r\n this._myTorusParentObject.pp_setTransformLocal(this._myParams.myTransform);\r\n } else {\r\n this._myTorusParentObject.pp_setTransform(this._myParams.myTransform);\r\n }\r\n\r\n let sliceAngle = 2 * Math.PI / this._myParams.mySegmentsAmount;\r\n segmentStart.vec3_set(this._myParams.myRadius, 0, 0);\r\n for (let i = 0; i < this._myParams.mySegmentsAmount; i++) {\r\n segmentEnd = segmentStart.vec3_rotateAxisRadians(sliceAngle, up, segmentEnd);\r\n\r\n segmentDirection = segmentEnd.vec3_sub(segmentStart, segmentDirection).vec3_normalize(segmentDirection);\r\n\r\n let extraLength = Math.tan(sliceAngle / 2) * this._myParams.mySegmentThickness / 2;\r\n\r\n fixedSegmentStart = segmentStart.vec3_sub(segmentDirection.vec3_scale(extraLength, fixedSegmentStart), fixedSegmentStart);\r\n fixedSegmentEnd = segmentEnd.vec3_add(segmentDirection.vec3_scale(extraLength, fixedSegmentEnd), fixedSegmentEnd);\r\n\r\n let visualSegment = this._myVisualSegmentList[i];\r\n\r\n let visualSegmentParams = visualSegment.getParams();\r\n visualSegmentParams.setStartEnd(fixedSegmentStart, fixedSegmentEnd);\r\n visualSegmentParams.myThickness = this._myParams.mySegmentThickness;\r\n\r\n visualSegmentParams.myMesh = this._myParams.mySegmentMesh;\r\n\r\n if (this._myParams.myMaterial == null) {\r\n if (this._myParams.myColor == null) {\r\n visualSegmentParams.myMaterial = Globals.getVisualResources(this._myParams.myParent.pp_getEngine()).myDefaultMaterials.myMesh;\r\n } else {\r\n if (this._myFlatOpaqueMaterial == null) {\r\n this._myFlatOpaqueMaterial = Globals.getDefaultMaterials(this._myParams.myParent.pp_getEngine()).myFlatOpaque.clone();\r\n }\r\n visualSegmentParams.myMaterial = this._myFlatOpaqueMaterial;\r\n this._myFlatOpaqueMaterial.color = this._myParams.myColor;\r\n }\r\n } else {\r\n visualSegmentParams.myMaterial = this._myParams.myMaterial;\r\n }\r\n\r\n visualSegment.paramsUpdated();\r\n\r\n visualSegment.setVisible(this._myVisible);\r\n\r\n segmentStart.vec3_copy(segmentEnd);\r\n }\r\n };\r\n}();\r\n\r\nVisualTorusParams.prototype._copyHook = function _copyHook(other, deepCopy) {\r\n this.myRadius = other.myRadius;\r\n this.mySegmentsAmount = other.mySegmentsAmount;\r\n this.mySegmentThickness = other.mySegmentThickness;\r\n\r\n this.myTransform.mat4_copy(other.myTransform);\r\n\r\n this.mySegmentMesh = other.mySegmentMesh;\r\n\r\n if (other.myMaterial != null && deepCopy) {\r\n this.myMaterial = other.myMaterial.clone();\r\n } else {\r\n this.myMaterial = other.myMaterial;\r\n }\r\n\r\n if (other.myColor != null) {\r\n if (this.myColor != null) {\r\n this.myColor.vec4_copy(other.myColor);\r\n } else {\r\n this.myColor = other.myColor.vec4_clone();\r\n }\r\n } else {\r\n this.myColor = null;\r\n }\r\n\r\n this.myLocal = other.myLocal;\r\n};", "import { mat4_create, vec3_create } from \"../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Globals } from \"../../../pp/globals.js\";\r\nimport { VisualArrow, VisualArrowParams } from \"./visual_arrow.js\";\r\nimport { AbstractVisualElement, AbstractVisualElementParams } from \"./visual_element.js\";\r\nimport { VisualElementDefaultType } from \"./visual_element_types.js\";\r\n\r\nexport class VisualTransformParams extends AbstractVisualElementParams {\r\n\r\n /**\r\n * TS type inference helper\r\n * \r\n * @param {any} engine\r\n */\r\n constructor(engine = Globals.getMainEngine()) {\r\n super(engine);\r\n\r\n this.myTransform = mat4_create();\r\n this.myLength = 0.2;\r\n this.myThickness = 0.005;\r\n\r\n this.myForwardMaterial = null;\r\n this.myUpMaterial = null;\r\n this.myRightMaterial = null;\r\n\r\n this.myLocal = false;\r\n\r\n this.myType = VisualElementDefaultType.TRANSFORM;\r\n }\r\n\r\n _copyHook(other, deepCopy) {\r\n // Implemented outside class definition\r\n }\r\n\r\n _new() {\r\n return new VisualTransformParams(this.myParent.pp_getEngine());\r\n }\r\n\r\n _equalsHook(other) {\r\n return this.myThickness == other.myThickness &&\r\n this.myLength == other.myLength &&\r\n this.myForwardMaterial == other.myForwardMaterial &&\r\n this.myUpMaterial == other.myUpMaterial &&\r\n this.myRightMaterial == other.myRightMaterial &&\r\n this.myLocal == other.myLocal &&\r\n this.myTransform.vec_equals(other.myTransform);\r\n }\r\n}\r\n\r\n/**\r\n * Example:\r\n * \r\n * ```js \r\n * const visualParams = new VisualTransformParams();\r\n * visualParams.myTransform.mat4_copy(transform);\r\n * visualParams.myLength = 0.2;\r\n * const visualTransform = new VisualTransform(visualParams);\r\n * \r\n * // OR\r\n * \r\n * Globals.getVisualManager().draw(visualParams);\r\n * ```\r\n*/\r\nexport class VisualTransform extends AbstractVisualElement {\r\n\r\n constructor(params = new VisualTransformParams()) {\r\n super(params);\r\n\r\n this._myVisualRight = new VisualArrow(new VisualArrowParams(this._myParams.myParent.pp_getEngine()));\r\n this._myVisualUp = new VisualArrow(new VisualArrowParams(this._myParams.myParent.pp_getEngine()));\r\n this._myVisualForward = new VisualArrow(new VisualArrowParams(this._myParams.myParent.pp_getEngine()));\r\n\r\n this._myVisualRight.setAutoRefresh(false);\r\n this._myVisualUp.setAutoRefresh(false);\r\n this._myVisualForward.setAutoRefresh(false);\r\n\r\n this._prepare();\r\n }\r\n\r\n _updateHook(dt) {\r\n this._myVisualRight.update(dt);\r\n this._myVisualUp.update(dt);\r\n this._myVisualForward.update(dt);\r\n }\r\n\r\n _visibleChanged() {\r\n this._myVisualRight.setVisible(this._myVisible);\r\n this._myVisualUp.setVisible(this._myVisible);\r\n this._myVisualForward.setVisible(this._myVisible);\r\n }\r\n\r\n _build() {\r\n\r\n }\r\n\r\n _refreshHook() {\r\n // Implemented outside class definition\r\n }\r\n\r\n _new(params) {\r\n return new VisualTransform(params);\r\n }\r\n\r\n _destroyHook() {\r\n this._myVisualRight.destroy();\r\n this._myVisualUp.destroy();\r\n this._myVisualForward.destroy();\r\n }\r\n}\r\n\r\n\r\n\r\n// IMPLEMENTATION\r\n\r\nVisualTransform.prototype._refreshHook = function () {\r\n let axes = [vec3_create(), vec3_create(), vec3_create()];\r\n let scale = vec3_create();\r\n let position = vec3_create();\r\n return function _refreshHook() {\r\n axes = this._myParams.myTransform.mat4_getAxes(axes);\r\n scale = this._myParams.myTransform.mat4_getScale(scale);\r\n let maxValue = 0;\r\n for (let value of scale) {\r\n maxValue = Math.max(value, maxValue);\r\n }\r\n\r\n if (maxValue == 0) {\r\n scale[0] = 1;\r\n scale[1] = 1;\r\n scale[2] = 1;\r\n } else {\r\n scale[0] = scale[0] / maxValue;\r\n scale[1] = scale[1] / maxValue;\r\n scale[2] = scale[2] / maxValue;\r\n }\r\n\r\n position = this._myParams.myTransform.mat4_getPosition(position);\r\n\r\n {\r\n let visualArrowParams = this._myVisualRight.getParams();\r\n visualArrowParams.myStart.vec3_copy(position);\r\n visualArrowParams.myDirection = axes[0].vec3_negate(visualArrowParams.myDirection).vec3_normalize(visualArrowParams.myDirection);\r\n visualArrowParams.myLength = Math.max(this._myParams.myLength * scale[0], 0.001);\r\n visualArrowParams.myThickness = this._myParams.myThickness;\r\n\r\n if (this._myParams.myRightMaterial == null) {\r\n visualArrowParams.myMaterial = Globals.getVisualResources(this._myParams.myParent.pp_getEngine()).myDefaultMaterials.myRight;\r\n } else {\r\n visualArrowParams.myMaterial = this._myParams.myRightMaterial;\r\n }\r\n\r\n visualArrowParams.myParent = this._myParams.myParent;\r\n visualArrowParams.myLocal = this._myParams.myLocal;\r\n\r\n this._myVisualRight.paramsUpdated();\r\n }\r\n\r\n {\r\n let visualArrowParams = this._myVisualUp.getParams();\r\n visualArrowParams.myStart.vec3_copy(position);\r\n visualArrowParams.myDirection = axes[1].vec3_normalize(visualArrowParams.myDirection);\r\n visualArrowParams.myLength = Math.max(this._myParams.myLength * scale[1], 0.001);\r\n visualArrowParams.myThickness = this._myParams.myThickness;\r\n\r\n if (this._myParams.myUpMaterial == null) {\r\n visualArrowParams.myMaterial = Globals.getVisualResources(this._myParams.myParent.pp_getEngine()).myDefaultMaterials.myUp;\r\n } else {\r\n visualArrowParams.myMaterial = this._myParams.myUpMaterial;\r\n }\r\n\r\n visualArrowParams.myParent = this._myParams.myParent;\r\n visualArrowParams.myLocal = this._myParams.myLocal;\r\n\r\n this._myVisualUp.paramsUpdated();\r\n }\r\n\r\n {\r\n let visualArrowParams = this._myVisualForward.getParams();\r\n visualArrowParams.myStart.vec3_copy(position);\r\n visualArrowParams.myDirection = axes[2].vec3_normalize(visualArrowParams.myDirection);\r\n visualArrowParams.myLength = Math.max(this._myParams.myLength * scale[2], 0.001);\r\n visualArrowParams.myThickness = this._myParams.myThickness;\r\n\r\n if (this._myParams.myForwardMaterial == null) {\r\n visualArrowParams.myMaterial = Globals.getVisualResources(this._myParams.myParent.pp_getEngine()).myDefaultMaterials.myForward;\r\n } else {\r\n visualArrowParams.myMaterial = this._myParams.myForwardMaterial;\r\n }\r\n\r\n visualArrowParams.myParent = this._myParams.myParent;\r\n visualArrowParams.myLocal = this._myParams.myLocal;\r\n\r\n this._myVisualForward.paramsUpdated();\r\n }\r\n };\r\n}();\r\n\r\nVisualTransformParams.prototype._copyHook = function _copyHook(other, deepCopy) {\r\n this.myTransform.mat4_copy(other.myTransform);\r\n this.myLength = other.myLength;\r\n this.myThickness = other.myThickness;\r\n\r\n if (other.myRightMaterial != null && deepCopy) {\r\n this.myRightMaterial = other.myRightMaterial.clone();\r\n } else {\r\n this.myRightMaterial = other.myRightMaterial;\r\n }\r\n\r\n if (other.myUpMaterial != null && deepCopy) {\r\n this.myUpMaterial = other.myUpMaterial.clone();\r\n } else {\r\n this.myUpMaterial = other.myUpMaterial;\r\n }\r\n\r\n if (other.myForwardMaterial != null && deepCopy) {\r\n this.myForwardMaterial = other.myForwardMaterial.clone();\r\n } else {\r\n this.myForwardMaterial = other.myForwardMaterial;\r\n }\r\n\r\n this.myLocal = other.myLocal;\r\n};", "import { Object3D, WonderlandEngine } from \"@wonderlandengine/api\";\r\nimport { Globals } from \"../../pp/globals.js\";\r\nimport { Timer } from \"../cauldron/timer.js\";\r\nimport { ObjectPool, ObjectPoolParams } from \"../object_pool/object_pool.js\";\r\nimport { VisualArrow, VisualArrowParams } from \"./elements/visual_arrow.js\";\r\nimport { VisualElement, VisualElementParams } from \"./elements/visual_element.js\";\r\nimport { VisualElementDefaultType } from \"./elements/visual_element_types.js\";\r\nimport { VisualLine, VisualLineParams } from \"./elements/visual_line.js\";\r\nimport { VisualMesh, VisualMeshParams } from \"./elements/visual_mesh.js\";\r\nimport { VisualPoint, VisualPointParams } from \"./elements/visual_point.js\";\r\nimport { VisualRaycast, VisualRaycastParams } from \"./elements/visual_raycast.js\";\r\nimport { VisualText, VisualTextParams } from \"./elements/visual_text.js\";\r\nimport { VisualTorus, VisualTorusParams } from \"./elements/visual_torus.js\";\r\nimport { VisualTransform, VisualTransformParams } from \"./elements/visual_transform.js\";\r\n\r\nexport class VisualManager {\r\n\r\n private readonly _myVisualElementPrototypeCreationCallbacks: Map VisualElement> = new Map();\r\n\r\n private readonly _myVisualElementsTypeMap: Map> = new Map();\r\n private _myVisualElementLastID: number = 0;\r\n private readonly _myVisualElementsToShow: VisualElement[] = [];\r\n\r\n private _myVisualElementsParent: Object3D | null = null;\r\n private _myActive: boolean = true;\r\n\r\n private readonly _myObjectPoolManagerPrefix: string;\r\n private readonly _myTypePoolIDs: Map = new Map();\r\n\r\n private readonly _myEngine: Readonly;\r\n\r\n private _myDestroyed: boolean = false;\r\n\r\n constructor(engine: Readonly = Globals.getMainEngine()!) {\r\n this._myEngine = engine;\r\n\r\n this._myObjectPoolManagerPrefix = this._getClassName() + \"_\" + Math.pp_randomUUID() + \"_visual_element_type_\";\r\n\r\n this._addDefaultVisualElementTypes();\r\n }\r\n\r\n public setActive(active: boolean): void {\r\n if (this._myActive != active) {\r\n if (!active) {\r\n this.clearAllVisualElements();\r\n } else {\r\n this._myVisualElementsParent = Globals.getSceneObjects(this._myEngine)?.myVisualElements ?? null;\r\n }\r\n\r\n this._myActive = active;\r\n }\r\n }\r\n\r\n public isActive(): boolean {\r\n return this._myActive && this._myVisualElementsParent != null;\r\n }\r\n\r\n public start(): void {\r\n if (this._myActive) {\r\n this._myVisualElementsParent = Globals.getSceneObjects(this._myEngine)?.myVisualElements ?? null;\r\n }\r\n }\r\n\r\n public update(dt: number): void {\r\n if (this._myActive) {\r\n this._myVisualElementsParent = Globals.getSceneObjects(this._myEngine)?.myVisualElements ?? null;\r\n\r\n this._updateDraw(dt);\r\n }\r\n }\r\n\r\n /** `lifetimeSeconds` can be `null`, in that case the element will be drawn until cleared */\r\n public draw(visualElementParams: VisualElementParams, lifetimeSeconds: number | null = 0, idToReuse?: unknown): unknown | null {\r\n if (!this.isActive()) {\r\n return null;\r\n }\r\n\r\n let visualElement = null;\r\n let idReused = false;\r\n if (idToReuse != null) {\r\n if (this._myVisualElementsTypeMap.has(visualElementParams.myType)) {\r\n const visualElements = this._myVisualElementsTypeMap.get(visualElementParams.myType)!;\r\n if (visualElements.has(idToReuse)) {\r\n visualElement = visualElements.get(idToReuse)![0];\r\n visualElement.copyParamsGeneric(visualElementParams);\r\n visualElement.setVisible(false);\r\n idReused = true;\r\n }\r\n }\r\n }\r\n\r\n if (visualElement == null) {\r\n visualElement = this._getVisualElementFromPool(visualElementParams);\r\n }\r\n\r\n if (visualElement == null) {\r\n console.error(\"Couldn't create the requested visual element\");\r\n return null;\r\n }\r\n\r\n if (!this._myVisualElementsTypeMap.has(visualElementParams.myType)) {\r\n this._myVisualElementsTypeMap.set(visualElementParams.myType, new Map());\r\n }\r\n const visualElements = this._myVisualElementsTypeMap.get(visualElementParams.myType)!;\r\n\r\n let elementID = null;\r\n if (!idReused) {\r\n elementID = this._myVisualElementLastID + 1;\r\n this._myVisualElementLastID = elementID;\r\n\r\n visualElements.set(elementID, [visualElement, new Timer(lifetimeSeconds != null ? lifetimeSeconds : 0, lifetimeSeconds != null)]);\r\n } else {\r\n elementID = idToReuse;\r\n const visualElementPair = visualElements.get(elementID)!;\r\n visualElementPair[0] = visualElement;\r\n if (lifetimeSeconds != null) {\r\n visualElementPair[1].reset(lifetimeSeconds);\r\n visualElementPair[1].start();\r\n } else {\r\n visualElementPair[1].reset();\r\n }\r\n }\r\n\r\n this._myVisualElementsToShow.push(visualElement);\r\n\r\n return elementID;\r\n }\r\n\r\n public getVisualElement(elementID: unknown): VisualElement | null {\r\n let visualElement = null;\r\n\r\n for (const visualElements of this._myVisualElementsTypeMap.values()) {\r\n if (visualElements.has(elementID)) {\r\n const visualElementPair = visualElements.get(elementID)!;\r\n visualElement = visualElementPair[0];\r\n break;\r\n }\r\n }\r\n\r\n return visualElement;\r\n }\r\n\r\n public getVisualElementParams(elementID: unknown): VisualElementParams | null {\r\n const visualElement = this.getVisualElement(elementID);\r\n return visualElement != null ? visualElement.getParamsGeneric() : null;\r\n }\r\n\r\n public getVisualElementID(visualElement: Readonly): unknown {\r\n let elementID = null;\r\n for (const currentVisualElements of this._myVisualElementsTypeMap.values()) {\r\n for (const [currentElementID, currentVisualElement] of currentVisualElements.entries()) {\r\n if (currentVisualElement[0] == visualElement) {\r\n elementID = currentElementID;\r\n break;\r\n }\r\n }\r\n\r\n if (elementID != null) {\r\n break;\r\n }\r\n }\r\n\r\n return elementID;\r\n }\r\n\r\n public clearAllVisualElements(): void {\r\n if (!this.isActive()) return;\r\n\r\n for (const visualElements of this._myVisualElementsTypeMap.values()) {\r\n for (const visualElement of visualElements.values()) {\r\n this._releaseElement(visualElement[0]);\r\n }\r\n }\r\n\r\n this._myVisualElementsToShow.pp_clear();\r\n this._myVisualElementsTypeMap.clear();\r\n this._myVisualElementLastID = 0;\r\n }\r\n\r\n public clearVisualElement(elementID: unknown): void {\r\n if (!this.isActive()) return;\r\n\r\n for (const visualElements of this._myVisualElementsTypeMap.values()) {\r\n if (visualElements.has(elementID)) {\r\n const visualElementPair = visualElements.get(elementID)!;\r\n this._releaseElement(visualElementPair[0]);\r\n visualElements.delete(elementID);\r\n\r\n this._myVisualElementsToShow.pp_removeEqual(visualElementPair[0]);\r\n break;\r\n }\r\n }\r\n }\r\n\r\n public allocateVisualElementType(visualElementType: unknown | VisualElementDefaultType, amount: number): void {\r\n if (!this.isActive()) return;\r\n\r\n if (!Globals.getObjectPoolManager(this._myEngine)!.hasPool(this._getTypePoolID(visualElementType))) {\r\n this._addVisualElementTypeToPool(visualElementType);\r\n }\r\n\r\n const pool = Globals.getObjectPoolManager(this._myEngine)!.getPool(this._getTypePoolID(visualElementType))!;\r\n\r\n const difference = pool.getAvailableSize() - amount;\r\n if (difference < 0) {\r\n pool.increase(-difference);\r\n }\r\n }\r\n\r\n public addVisualElementType(visualElementType: unknown | VisualElementDefaultType, visuaElementPrototypeCreationCallback: () => VisualElement): void {\r\n this._myVisualElementPrototypeCreationCallbacks.set(visualElementType, visuaElementPrototypeCreationCallback);\r\n }\r\n\r\n public removeVisualElementType(visualElementType: unknown | VisualElementDefaultType): void {\r\n this._myVisualElementPrototypeCreationCallbacks.delete(visualElementType);\r\n }\r\n\r\n private _updateDraw(dt: number): void {\r\n for (const visualElement of this._myVisualElementsToShow) {\r\n visualElement.setVisible(true);\r\n }\r\n this._myVisualElementsToShow.pp_clear();\r\n\r\n for (const visualElements of this._myVisualElementsTypeMap.values()) {\r\n const idsToRemove = [];\r\n for (const visualElementsEntry of visualElements.entries()) {\r\n const visualElement = visualElementsEntry[1];\r\n if (visualElement[1].isDone()) {\r\n this._releaseElement(visualElement[0]);\r\n idsToRemove.push(visualElementsEntry[0]);\r\n } else {\r\n visualElement[0].update(dt);\r\n visualElement[1].update(dt);\r\n }\r\n }\r\n\r\n for (const id of idsToRemove) {\r\n visualElements.delete(id);\r\n }\r\n }\r\n }\r\n\r\n private _getVisualElementFromPool(params: VisualElementParams): VisualElement | null {\r\n let element = null;\r\n\r\n if (!Globals.getObjectPoolManager(this._myEngine)!.hasPool(this._getTypePoolID(params.myType))) {\r\n this._addVisualElementTypeToPool(params.myType);\r\n }\r\n\r\n element = Globals.getObjectPoolManager(this._myEngine)!.get(this._getTypePoolID(params.myType));\r\n\r\n if (element != null) {\r\n element.copyParamsGeneric(params);\r\n }\r\n\r\n return element;\r\n }\r\n\r\n private _addVisualElementTypeToPool(visualElementType: unknown | VisualElementDefaultType): void {\r\n const objectPoolParams = new ObjectPoolParams();\r\n objectPoolParams.myInitialPoolSize = 10;\r\n objectPoolParams.myAmountToAddWhenEmpty = 0;\r\n objectPoolParams.myPercentageToAddWhenEmpty = 0.5;\r\n objectPoolParams.myCloneCallback = function (visualElement: VisualElement): VisualElement {\r\n return visualElement.clone();\r\n };\r\n objectPoolParams.mySetActiveCallback = function (visualElement: VisualElement, active: boolean): void {\r\n visualElement.setVisible(active);\r\n };\r\n objectPoolParams.myDestroyCallback = function (visualElement: VisualElement): void {\r\n visualElement.destroy();\r\n };\r\n\r\n let visualElementPrototype = null;\r\n if (this._myVisualElementPrototypeCreationCallbacks.has(visualElementType)) {\r\n visualElementPrototype = this._myVisualElementPrototypeCreationCallbacks.get(visualElementType)!();\r\n }\r\n\r\n if (visualElementPrototype != null) {\r\n visualElementPrototype.setVisible(false);\r\n visualElementPrototype.setAutoRefresh(true);\r\n\r\n Globals.getObjectPoolManager(this._myEngine)!.addPool(this._getTypePoolID(visualElementType), new ObjectPool(visualElementPrototype, objectPoolParams));\r\n } else {\r\n console.error(\"Visual element type not supported: \" + visualElementType);\r\n }\r\n }\r\n\r\n private _addDefaultVisualElementTypes(): void {\r\n this.addVisualElementType(VisualElementDefaultType.LINE, () => new VisualLine(new VisualLineParams(this._myEngine)));\r\n this.addVisualElementType(VisualElementDefaultType.MESH, () => new VisualMesh(new VisualMeshParams(this._myEngine)));\r\n this.addVisualElementType(VisualElementDefaultType.POINT, () => new VisualPoint(new VisualPointParams(this._myEngine)));\r\n this.addVisualElementType(VisualElementDefaultType.ARROW, () => new VisualArrow(new VisualArrowParams(this._myEngine)));\r\n this.addVisualElementType(VisualElementDefaultType.TEXT, () => new VisualText(new VisualTextParams(this._myEngine)));\r\n this.addVisualElementType(VisualElementDefaultType.TRANSFORM, () => new VisualTransform(new VisualTransformParams(this._myEngine)));\r\n this.addVisualElementType(VisualElementDefaultType.RAYCAST, () => new VisualRaycast(new VisualRaycastParams(this._myEngine)));\r\n this.addVisualElementType(VisualElementDefaultType.TORUS, () => new VisualTorus(new VisualTorusParams(this._myEngine)));\r\n }\r\n\r\n private _getTypePoolID(visualElementType: unknown | VisualElementDefaultType): string {\r\n let typePoolID = this._myTypePoolIDs.get(visualElementType);\r\n\r\n if (typePoolID == null) {\r\n typePoolID = this._myObjectPoolManagerPrefix + visualElementType;\r\n this._myTypePoolIDs.set(visualElementType, typePoolID);\r\n }\r\n\r\n return typePoolID;\r\n }\r\n\r\n private _releaseElement(visualElement: VisualElement): void {\r\n if (this._myVisualElementsParent != null) {\r\n if (visualElement.getParamsGeneric().myParent != this._myVisualElementsParent) {\r\n visualElement.getParamsGeneric().myParent = this._myVisualElementsParent;\r\n visualElement.paramsUpdated();\r\n visualElement.refresh(); // just used to trigger the parent change, I'm lazy\r\n }\r\n }\r\n\r\n Globals.getObjectPoolManager(this._myEngine)?.release(this._getTypePoolID(visualElement.getParamsGeneric().myType), visualElement);\r\n }\r\n\r\n private _getClassName(): string {\r\n return \"visual_manager\";\r\n }\r\n\r\n public destroy(): void {\r\n this._myDestroyed = true;\r\n\r\n this.setActive(false);\r\n\r\n for (const poolID of this._myTypePoolIDs.values()) {\r\n Globals.getObjectPoolManager(this._myEngine)?.destroyPool(poolID);\r\n }\r\n }\r\n\r\n public isDestroyed(): boolean {\r\n return this._myDestroyed;\r\n }\r\n}", "import { Material } from \"@wonderlandengine/api\";\r\n\r\nexport class VisualResources {\r\n\r\n public myDefaultMaterials: VisualResourcesMaterials = new VisualResourcesMaterials();\r\n}\r\n\r\nexport class VisualResourcesMaterials {\r\n\r\n public myMesh: Material | null = null;\r\n public myText: Material | null = null;\r\n public myRight: Material | null = null;\r\n public myUp: Material | null = null;\r\n public myForward: Material | null = null;\r\n public myRay: Material | null = null;\r\n public myHitNormal: Material | null = null;\r\n}", "import * as WLAPI from \"@wonderlandengine/api\";\r\nimport { Component, Property } from \"@wonderlandengine/api\";\r\nimport * as WLComponents from \"@wonderlandengine/components\";\r\n\r\nexport class AddWLToWindowComponent extends Component {\r\n static TypeName = \"pp-add-wl-to-window\";\r\n static Properties = {\r\n _myAdd: Property.bool(true)\r\n };\r\n\r\n init() {\r\n if (this._myAdd) {\r\n this._myWL = {};\r\n this._addProperties(WLAPI);\r\n this._addProperties(WLComponents);\r\n\r\n window.WL = this._myWL;\r\n }\r\n }\r\n\r\n _addProperties(object) {\r\n let propertyNames = Object.getOwnPropertyNames(object);\r\n for (let propertyName of propertyNames) {\r\n if (object[propertyName] != undefined) {\r\n this._myWL[propertyName] = object[propertyName];\r\n }\r\n }\r\n }\r\n\r\n onActivate() {\r\n if (this._myWL != null) {\r\n window.WL = this._myWL;\r\n }\r\n }\r\n\r\n onDeactivate() {\r\n if (this._myWL != null) {\r\n delete window.WL;\r\n }\r\n }\r\n}", "import { Component, Property } from \"@wonderlandengine/api\";\r\nimport { Globals } from \"../../../../pp/globals.js\";\r\nimport { MeshUtils } from \"../../utils/mesh_utils.js\";\r\nimport { DefaultResources } from \"../default_resources.js\";\r\n\r\nexport class GetDefaultResourcesComponent extends Component {\r\n static TypeName = \"pp-get-default-resources\";\r\n static Properties = {\r\n _myPlane: Property.mesh(),\r\n _myCube: Property.mesh(),\r\n _mySphere: Property.mesh(),\r\n _myCone: Property.mesh(),\r\n _myCylinder: Property.mesh(),\r\n _myCircle: Property.mesh(),\r\n\r\n _myFlatOpaque: Property.material(),\r\n _myFlatTransparentNoDepth: Property.material(),\r\n _myPhongOpaque: Property.material(),\r\n _myText: Property.material()\r\n };\r\n\r\n init() {\r\n this._myDefaultResources = new DefaultResources();\r\n this._myDefaultResources.myMeshes.myPlane = MeshUtils.clone(this._myPlane);\r\n this._myDefaultResources.myMeshes.myCube = MeshUtils.clone(this._myCube);\r\n this._myDefaultResources.myMeshes.mySphere = MeshUtils.clone(this._mySphere);\r\n this._myDefaultResources.myMeshes.myCone = MeshUtils.clone(this._myCone);\r\n this._myDefaultResources.myMeshes.myCylinder = MeshUtils.clone(this._myCylinder);\r\n this._myDefaultResources.myMeshes.myCircle = MeshUtils.clone(this._myCircle);\r\n\r\n this._myDefaultResources.myMeshes.myInvertedCube = MeshUtils.invert(this._myCube);\r\n this._myDefaultResources.myMeshes.myInvertedSphere = MeshUtils.invert(this._mySphere);\r\n this._myDefaultResources.myMeshes.myInvertedCone = MeshUtils.invert(this._myCone);\r\n this._myDefaultResources.myMeshes.myInvertedCylinder = MeshUtils.invert(this._myCylinder);\r\n\r\n this._myDefaultResources.myMeshes.myDoubleSidedPlane = MeshUtils.makeDoubleSided(this._myPlane);\r\n this._myDefaultResources.myMeshes.myDoubleSidedCube = MeshUtils.makeDoubleSided(this._myCube);\r\n this._myDefaultResources.myMeshes.myDoubleSidedSphere = MeshUtils.makeDoubleSided(this._mySphere);\r\n this._myDefaultResources.myMeshes.myDoubleSidedCone = MeshUtils.makeDoubleSided(this._myCone);\r\n this._myDefaultResources.myMeshes.myDoubleSidedCylinder = MeshUtils.makeDoubleSided(this._myCylinder);\r\n this._myDefaultResources.myMeshes.myDoubleSidedCircle = MeshUtils.makeDoubleSided(this._myCircle);\r\n\r\n if (this._myFlatOpaque != null) {\r\n this._myDefaultResources.myMaterials.myFlatOpaque = this._myFlatOpaque.clone();\r\n }\r\n\r\n if (this._myFlatTransparentNoDepth != null) {\r\n this._myDefaultResources.myMaterials.myFlatTransparentNoDepth = this._myFlatTransparentNoDepth.clone();\r\n }\r\n\r\n if (this._myPhongOpaque != null) {\r\n this._myDefaultResources.myMaterials.myPhongOpaque = this._myPhongOpaque.clone();\r\n }\r\n\r\n if (this._myText != null) {\r\n this._myDefaultResources.myMaterials.myText = this._myText.clone();\r\n }\r\n }\r\n\r\n onActivate() {\r\n if (!Globals.hasDefaultResources(this.engine)) {\r\n Globals.setDefaultResources(this._myDefaultResources, this.engine);\r\n }\r\n }\r\n\r\n onDeactivate() {\r\n if (Globals.getDefaultResources(this.engine) == this._myDefaultResources) {\r\n Globals.removeDefaultResources(this.engine);\r\n }\r\n }\r\n}", "import { Material, Mesh } from \"@wonderlandengine/api\";\r\n\r\nexport class DefaultResources {\r\n\r\n public myMeshes: DefaultResourcesMeshes = new DefaultResourcesMeshes();\r\n public myMaterials: DefaultResourcesMaterials = new DefaultResourcesMaterials();\r\n}\r\n\r\nexport class DefaultResourcesMeshes {\r\n\r\n public myPlane: Mesh | null = null;\r\n public myCube: Mesh | null = null;\r\n public mySphere: Mesh | null = null;\r\n public myCone: Mesh | null = null;\r\n public myCylinder: Mesh | null = null;\r\n public myCircle: Mesh | null = null;\r\n\r\n public myInvertedCube: Mesh | null = null;\r\n public myInvertedSphere: Mesh | null = null;\r\n public myInvertedCone: Mesh | null = null;\r\n public myInvertedCylinder: Mesh | null = null;\r\n\r\n public myDoubleSidedPlane: Mesh | null = null;\r\n public myDoubleSidedCube: Mesh | null = null;\r\n public myDoubleSidedSphere: Mesh | null = null;\r\n public myDoubleSidedCone: Mesh | null = null;\r\n public myDoubleSidedCylinder: Mesh | null = null;\r\n public myDoubleSidedCircle: Mesh | null = null;\r\n}\r\n\r\nexport class DefaultResourcesMaterials {\r\n\r\n public myFlatOpaque: Material | null = null;\r\n /** For now, the pipeline associated to this material needs to be the last one to make it work properly */\r\n public myFlatTransparentNoDepth: Material | null = null;\r\n public myPhongOpaque: Material | null = null;\r\n public myText: Material | null = null;\r\n}", "import { Component, Property } from \"@wonderlandengine/api\";\r\nimport { Handedness } from \"../../../../input/cauldron/input_types.js\";\r\nimport { Globals } from \"../../../../pp/globals.js\";\r\nimport { SceneObjects } from \"../scene_objects.js\";\r\n\r\nexport class GetSceneObjectsComponent extends Component {\r\n static TypeName = \"pp-get-scene-objects\";\r\n static Properties = {\r\n _myRoot: Property.object(),\r\n\r\n _myScene: Property.object(),\r\n\r\n _myPlayer: Property.object(),\r\n _myReferenceSpace: Property.object(), // If u don't have a pivot under the player you set this to null, by default will be the same as the player\r\n _myCameraNonXR: Property.object(),\r\n _myEyeLeft: Property.object(),\r\n _myEyeRight: Property.object(),\r\n _myHandLeft: Property.object(),\r\n _myHandRight: Property.object(),\r\n _myHead: Property.object()\r\n };\r\n\r\n init() {\r\n this._mySceneObjects = new SceneObjects();\r\n\r\n this._mySceneObjects.myRoot = this._myRoot;\r\n\r\n this._mySceneObjects.myScene = this._myScene;\r\n\r\n this._mySceneObjects.myPlayerObjects.myPlayer = this._myPlayer;\r\n this._mySceneObjects.myPlayerObjects.myReferenceSpace = this._myReferenceSpace;\r\n\r\n this._mySceneObjects.myPlayerObjects.myCameraNonXR = this._myCameraNonXR;\r\n\r\n this._mySceneObjects.myPlayerObjects.myEyeLeft = this._myEyeLeft;\r\n this._mySceneObjects.myPlayerObjects.myEyeRight = this._myEyeRight;\r\n\r\n this._mySceneObjects.myPlayerObjects.myHandLeft = this._myHandLeft;\r\n this._mySceneObjects.myPlayerObjects.myHandRight = this._myHandRight;\r\n\r\n this._mySceneObjects.myPlayerObjects.myEyes[Handedness.LEFT] = this._myEyeLeft;\r\n this._mySceneObjects.myPlayerObjects.myEyes[Handedness.RIGHT] = this._myEyeRight;\r\n\r\n this._mySceneObjects.myPlayerObjects.myHands[Handedness.LEFT] = this._myHandLeft;\r\n this._mySceneObjects.myPlayerObjects.myHands[Handedness.RIGHT] = this._myHandRight;\r\n\r\n this._mySceneObjects.myPlayerObjects.myHead = this._myHead;\r\n\r\n if (this._mySceneObjects.myPlayerObjects.myReferenceSpace == null) {\r\n this._mySceneObjects.myPlayerObjects.myReferenceSpace = this._mySceneObjects.myPlayerObjects.myPlayer;\r\n }\r\n\r\n this._mySceneObjects.myCauldron = this._mySceneObjects.myScene.pp_addChild();\r\n this._mySceneObjects.myCauldron.pp_setName(\"Cauldron\");\r\n this._mySceneObjects.myDynamics = this._mySceneObjects.myScene.pp_addChild();\r\n this._mySceneObjects.myDynamics.pp_setName(\"Dynamics\");\r\n this._mySceneObjects.myParticles = this._mySceneObjects.myScene.pp_addChild();\r\n this._mySceneObjects.myParticles.pp_setName(\"Particles\");\r\n this._mySceneObjects.myVisualElements = this._mySceneObjects.myScene.pp_addChild();\r\n this._mySceneObjects.myVisualElements.pp_setName(\"Visual Elements\");\r\n this._mySceneObjects.myTools = this._mySceneObjects.myScene.pp_addChild();\r\n this._mySceneObjects.myTools.pp_setName(\"Tools\");\r\n\r\n this._mySceneObjects.myPlayerObjects.myCauldron = this._mySceneObjects.myPlayerObjects.myPlayer.pp_addChild();\r\n this._mySceneObjects.myPlayerObjects.myCauldron.pp_setName(\"Cauldron\");\r\n this._mySceneObjects.myPlayerObjects.myHeadDebugs = this._mySceneObjects.myPlayerObjects.myHead.pp_addChild();\r\n this._mySceneObjects.myPlayerObjects.myHeadDebugs.pp_setName(\"Head Debugs\");\r\n }\r\n\r\n onActivate() {\r\n if (!Globals.hasSceneObjects(this.engine)) {\r\n Globals.setSceneObjects(this._mySceneObjects, this.engine);\r\n }\r\n }\r\n\r\n onDeactivate() {\r\n if (Globals.getSceneObjects(this.engine) == this._mySceneObjects) {\r\n Globals.removeSceneObjects(this.engine);\r\n }\r\n }\r\n}", "export enum Handedness {\r\n LEFT = \"left\",\r\n RIGHT = \"right\"\r\n}\r\n\r\nexport enum HandednessIndex {\r\n LEFT = 0,\r\n RIGHT = 1\r\n}\r\n\r\nexport enum InputSourceType {\r\n GAMEPAD = 0,\r\n TRACKED_HAND = 1\r\n}\r\n\r\nexport enum TrackedHandJointID {\r\n WRIST = \"wrist\",\r\n\r\n THUMB_METACARPAL = \"thumb-metacarpal\",\r\n THUMB_PHALANX_PROXIMAL = \"thumb-phalanx-proximal\",\r\n THUMB_PHALANX_DISTAL = \"thumb-phalanx-distal\",\r\n THUMB_TIP = \"thumb-tip\",\r\n\r\n INDEX_FINGER_METACARPAL = \"index-finger-metacarpal\",\r\n INDEX_FINGER_PHALANX_PROXIMAL = \"index-finger-phalanx-proximal\",\r\n INDEX_FINGER_PHALANX_INTERMEDIATE = \"index-finger-phalanx-intermediate\",\r\n INDEX_FINGER_PHALANX_DISTAL = \"index-finger-phalanx-distal\",\r\n INDEX_FINGER_TIP = \"index-finger-tip\",\r\n\r\n MIDDLE_FINGER_METACARPAL = \"middle-finger-metacarpal\",\r\n MIDDLE_FINGER_PHALANX_PROXIMAL = \"middle-finger-phalanx-proximal\",\r\n MIDDLE_FINGER_PHALANX_INTERMEDIATE = \"middle-finger-phalanx-intermediate\",\r\n MIDDLE_FINGER_PHALANX_DISTAL = \"middle-finger-phalanx-distal\",\r\n MIDDLE_FINGER_TIP = \"middle-finger-tip\",\r\n\r\n RING_FINGER_METACARPAL = \"ring-finger-metacarpal\",\r\n RING_FINGER_PHALANX_PROXIMAL = \"ring-finger-phalanx-proximal\",\r\n RING_FINGER_PHALANX_INTERMEDIATE = \"ring-finger-phalanx-intermediate\",\r\n RING_FINGER_PHALANX_DISTAL = \"ring-finger-phalanx-distal\",\r\n RING_FINGER_TIP = \"ring-finger-tip\",\r\n\r\n PINKY_FINGER_METACARPAL = \"pinky-finger-metacarpal\",\r\n PINKY_FINGER_PHALANX_PROXIMAL = \"pinky-finger-phalanx-proximal\",\r\n PINKY_FINGER_PHALANX_INTERMEDIATE = \"pinky-finger-phalanx-intermediate\",\r\n PINKY_FINGER_PHALANX_DISTAL = \"pinky-finger-phalanx-distal\",\r\n PINKY_FINGER_TIP = \"pinky-finger-tip\"\r\n}\r\n\r\nexport enum TrackedHandJointIDIndex {\r\n WRIST = 0,\r\n\r\n THUMB_METACARPAL = 1,\r\n THUMB_PHALANX_PROXIMAL = 2,\r\n THUMB_PHALANX_DISTAL = 3,\r\n THUMB_TIP = 4,\r\n\r\n INDEX_FINGER_METACARPAL = 5,\r\n INDEX_FINGER_PHALANX_PROXIMAL = 6,\r\n INDEX_FINGER_PHALANX_INTERMEDIATE = 7,\r\n INDEX_FINGER_PHALANX_DISTAL = 8,\r\n INDEX_FINGER_TIP = 9,\r\n\r\n MIDDLE_FINGER_METACARPAL = 10,\r\n MIDDLE_FINGER_PHALANX_PROXIMAL = 11,\r\n MIDDLE_FINGER_PHALANX_INTERMEDIATE = 12,\r\n MIDDLE_FINGER_PHALANX_DISTAL = 13,\r\n MIDDLE_FINGER_TIP = 14,\r\n\r\n RING_FINGER_METACARPAL = 15,\r\n RING_FINGER_PHALANX_PROXIMAL = 16,\r\n RING_FINGER_PHALANX_INTERMEDIATE = 17,\r\n RING_FINGER_PHALANX_DISTAL = 18,\r\n RING_FINGER_TIP = 19,\r\n\r\n PINKY_FINGER_METACARPAL = 20,\r\n PINKY_FINGER_PHALANX_PROXIMAL = 21,\r\n PINKY_FINGER_PHALANX_INTERMEDIATE = 22,\r\n PINKY_FINGER_PHALANX_DISTAL = 23,\r\n PINKY_FINGER_TIP = 24\r\n}", "import { Object3D } from \"@wonderlandengine/api\";\r\nimport { Handedness } from \"../../../input/cauldron/input_types.js\";\r\n\r\nexport class SceneObjects {\r\n\r\n public myRoot: Object3D | null = null;\r\n\r\n public myScene: Object3D | null = null;\r\n\r\n public myCauldron: Object3D | null = null;\r\n public myDynamics: Object3D | null = null;\r\n public myParticles: Object3D | null = null;\r\n public myVisualElements: Object3D | null = null;\r\n public myTools: Object3D | null = null;\r\n\r\n public myPlayerObjects: PlayerObjects = new PlayerObjects();\r\n}\r\n\r\nexport class PlayerObjects {\r\n\r\n public myPlayer: Object3D | null = null;\r\n\r\n public myCauldron: Object3D | null = null;\r\n public myReferenceSpace: Object3D | null = null;\r\n\r\n public myCameraNonXR: Object3D | null = null;\r\n\r\n public myEyes: Record = { [Handedness.LEFT]: null, [Handedness.RIGHT]: null };\r\n public myEyeLeft: Object3D | null = null;\r\n public myEyeRight: Object3D | null = null;\r\n\r\n public myHands: Record = { [Handedness.LEFT]: null, [Handedness.RIGHT]: null };\r\n public myHandLeft: Object3D | null = null;\r\n public myHandRight: Object3D | null = null;\r\n\r\n public myHead: Object3D | null = null;\r\n public myHeadDebugs: Object3D | null = null;\r\n}", "import { Component } from \"@wonderlandengine/api\";\r\nimport { Globals } from \"../../pp/globals.js\";\r\nimport { DebugManager } from \"../debug_manager.js\";\r\n\r\nexport class DebugManagerComponent extends Component {\r\n static TypeName = \"pp-debug-manager\";\r\n\r\n init() {\r\n this._myDebugManager = null;\r\n this._myCurrentActive = false;\r\n\r\n this._myInitDone = false;\r\n }\r\n\r\n _init() {\r\n this._myDebugManager = new DebugManager(this.engine);\r\n this._myDebugManager.setActive(this._myCurrentActive);\r\n\r\n this._myDebugManager.start();\r\n\r\n this._myInitDone = true;\r\n }\r\n\r\n update(dt) {\r\n if (!this._myInitDone && Globals.isDebugEnabled(this.engine)) {\r\n this._init();\r\n\r\n if (this._myDebugManager != null && !Globals.hasDebugManager(this.engine)) {\r\n Globals.setDebugManager(this._myDebugManager, this.engine);\r\n }\r\n } else if (this._myDebugManager != null && !Globals.hasDebugManager(this.engine) &&\r\n Globals.isDebugEnabled(this.engine) && this._myCurrentActive != Globals.isDebugEnabled(this.engine)) {\r\n Globals.setDebugManager(this._myDebugManager, this.engine);\r\n }\r\n\r\n if (this._myDebugManager != null && Globals.getDebugManager(this.engine) == this._myDebugManager) {\r\n if (this._myCurrentActive != Globals.isDebugEnabled(this.engine)) {\r\n this._myCurrentActive = Globals.isDebugEnabled(this.engine);\r\n\r\n this._myDebugManager.setActive(this._myCurrentActive);\r\n\r\n if (this._myCurrentActive) {\r\n if (!Globals.hasDebugManager(this.engine)) {\r\n Globals.setDebugManager(this._myDebugManager, this.engine);\r\n }\r\n } else {\r\n if (Globals.getDebugManager(this.engine) == this._myDebugManager) {\r\n Globals.removeDebugManager(this.engine);\r\n }\r\n }\r\n }\r\n\r\n this._myDebugManager.update(dt);\r\n }\r\n }\r\n\r\n onDeactivate() {\r\n if (this._myDebugManager != null) {\r\n this._myCurrentActive = false;\r\n this._myDebugManager.setActive(false);\r\n\r\n if (Globals.getDebugManager(this.engine) == this._myDebugManager) {\r\n Globals.removeDebugManager(this.engine);\r\n }\r\n }\r\n }\r\n\r\n onDestroy() {\r\n if (this._myDebugManager != null) {\r\n this._myDebugManager.destroy();\r\n }\r\n }\r\n}", "import { Alignment, VerticalAlignment } from \"@wonderlandengine/api\";\r\nimport { XRUtils } from \"../cauldron/utils/xr_utils.js\";\r\nimport { VisualArrowParams } from \"../cauldron/visual/elements/visual_arrow.js\";\r\nimport { VisualLineParams } from \"../cauldron/visual/elements/visual_line.js\";\r\nimport { VisualPointParams } from \"../cauldron/visual/elements/visual_point.js\";\r\nimport { VisualRaycastParams } from \"../cauldron/visual/elements/visual_raycast.js\";\r\nimport { VisualTextParams } from \"../cauldron/visual/elements/visual_text.js\";\r\nimport { VisualTransformParams } from \"../cauldron/visual/elements/visual_transform.js\";\r\nimport { VisualManager } from \"../cauldron/visual/visual_manager.js\";\r\nimport { quat_create, vec3_create, vec4_create } from \"../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Globals } from \"../pp/globals.js\";\r\n\r\nexport class DebugVisualManager extends VisualManager {\r\n\r\n constructor(engine) {\r\n super(engine);\r\n\r\n this._myDefaultColor = vec4_create(1, 0, 1, 1);\r\n this._myDefaultLineThickness = 0.005;\r\n this._myDefaultPointRadius = 0.01;\r\n this._myDefaultAxisLength = 0.2;\r\n\r\n this._myDefaultTextLookAtPlayer = true;\r\n this._myDefaultTextAlignment = Alignment.Center;\r\n this._myDefaultTextVerticalAlignment = VerticalAlignment.Middle;\r\n\r\n this._myDefaultUITextAlignment = Alignment.Center;\r\n this._myDefaultUITextVerticalAlignment = VerticalAlignment.Middle;\r\n this._myDefaultUITextScale = 1;\r\n\r\n this._myDefaultUITextScreenPosition = vec3_create(1, 1, 1);\r\n }\r\n\r\n setActive(active) {\r\n active = active && Globals.isDebugEnabled(this._myEngine);\r\n super.setActive(active);\r\n }\r\n\r\n drawLine(lifetimeSeconds, start, direction, length, color = this._myDefaultColor, thickness = this._myDefaultLineThickness) {\r\n let elementID = null;\r\n\r\n if (this.isActive()) {\r\n let visualParams = new VisualLineParams(this._myEngine);\r\n visualParams.myStart.vec3_copy(start);\r\n visualParams.myDirection.vec3_copy(direction);\r\n visualParams.myLength = length;\r\n visualParams.myThickness = thickness;\r\n visualParams.myColor = vec4_create();\r\n visualParams.myColor.vec4_copy(color);\r\n elementID = this.draw(visualParams, lifetimeSeconds);\r\n }\r\n\r\n return elementID;\r\n }\r\n\r\n drawLineEnd(lifetimeSeconds, start, end, color = this._myDefaultColor, thickness = this._myDefaultLineThickness) {\r\n // Implemented outside class definition\r\n }\r\n\r\n drawArrow(lifetimeSeconds, start, direction, length, color = this._myDefaultColor, thickness = this._myDefaultLineThickness) {\r\n let elementID = null;\r\n\r\n if (this.isActive()) {\r\n let visualParams = new VisualArrowParams(this._myEngine);\r\n visualParams.myStart.vec3_copy(start);\r\n visualParams.myDirection.vec3_copy(direction);\r\n visualParams.myLength = length;\r\n visualParams.myThickness = thickness;\r\n visualParams.myColor = vec4_create();\r\n visualParams.myColor.vec4_copy(color);\r\n elementID = this.draw(visualParams, lifetimeSeconds);\r\n }\r\n\r\n return elementID;\r\n }\r\n\r\n drawArrowEnd(lifetimeSeconds, start, end, color = this._myDefaultColor, thickness = this._myDefaultLineThickness) {\r\n // Implemented outside class definition\r\n }\r\n\r\n drawPoint(lifetimeSeconds, position, color = this._myDefaultColor, radius = this._myDefaultPointRadius) {\r\n let elementID = null;\r\n\r\n if (this.isActive()) {\r\n let visualParams = new VisualPointParams(this._myEngine);\r\n visualParams.myPosition.vec3_copy(position);\r\n visualParams.myRadius = radius;\r\n visualParams.myColor = vec4_create();\r\n visualParams.myColor.vec4_copy(color);\r\n elementID = this.draw(visualParams, lifetimeSeconds);\r\n }\r\n\r\n return elementID;\r\n }\r\n\r\n drawText(lifetimeSeconds, text, transform, color = this._myDefaultColor, lookAtPlayer = this._myDefaultTextLookAtPlayer, alignment = this._myDefaultTextAlignment, verticalAlignment = this._myDefaultTextVerticalAlignment) {\r\n let elementID = null;\r\n\r\n if (this.isActive()) {\r\n let visualParams = new VisualTextParams(this._myEngine);\r\n visualParams.myText = text;\r\n visualParams.myAlignment = alignment;\r\n visualParams.myVerticalAlignment = verticalAlignment;\r\n visualParams.myTransform.mat4_copy(transform);\r\n visualParams.myColor = vec4_create();\r\n visualParams.myColor.vec4_copy(color);\r\n\r\n if (lookAtPlayer) {\r\n visualParams.myLookAtObject = Globals.getPlayerObjects(this._myEngine).myHead;\r\n }\r\n\r\n elementID = this.draw(visualParams, lifetimeSeconds);\r\n }\r\n\r\n return elementID;\r\n }\r\n\r\n drawRaycast(lifetimeSeconds, raycastResult, showOnlyFirstHit = true, hitNormalLength = this._myDefaultAxisLength, thickness = this._myDefaultLineThickness) {\r\n let elementID = null;\r\n\r\n if (this.isActive()) {\r\n let visualParams = new VisualRaycastParams(this._myEngine);\r\n visualParams.myRaycastResults = raycastResult;\r\n visualParams.myShowOnlyFirstHit = showOnlyFirstHit;\r\n visualParams.myHitNormalLength = hitNormalLength;\r\n visualParams.myThickness = thickness;\r\n elementID = this.draw(visualParams, lifetimeSeconds);\r\n }\r\n\r\n return elementID;\r\n }\r\n\r\n drawTransform(lifetimeSeconds, transform, length = this._myDefaultAxisLength, thickness = this._myDefaultLineThickness) {\r\n let elementID = null;\r\n\r\n if (this.isActive()) {\r\n let visualParams = new VisualTransformParams(this._myEngine);\r\n visualParams.myTransform.mat4_copy(transform);\r\n visualParams.myLength = length;\r\n visualParams.myThickness = thickness;\r\n elementID = this.draw(visualParams, lifetimeSeconds);\r\n }\r\n\r\n return elementID;\r\n }\r\n\r\n drawUIText(lifetimeSeconds, text, screenPosition, scale = this._myDefaultUITextScale, color = this._myDefaultColor, alignment = this._myDefaultUITextAlignment, verticalAlignment = this._myDefaultUITextVerticalAlignment) {\r\n // Implemented outside class definition\r\n }\r\n\r\n _getClassName() {\r\n return \"debug_visual_manager\";\r\n }\r\n}\r\n\r\n\r\n\r\n// IMPLEMENTATION\r\n\r\nDebugVisualManager.prototype.drawLineEnd = function () {\r\n let direction = vec3_create();\r\n return function drawLineEnd(lifetimeSeconds, start, end, color = this._myDefaultColor, thickness = this._myDefaultLineThickness) {\r\n let elementID = null;\r\n\r\n if (this.isActive()) {\r\n direction = end.vec3_sub(start, direction);\r\n let length = direction.vec3_length();\r\n direction.vec3_normalize(direction);\r\n elementID = this.drawLine(lifetimeSeconds, start, direction, length, color, thickness);\r\n }\r\n\r\n return elementID;\r\n };\r\n}();\r\n\r\nDebugVisualManager.prototype.drawArrowEnd = function () {\r\n let direction = vec3_create();\r\n return function drawArrowEnd(lifetimeSeconds, start, end, color = this._myDefaultColor, thickness = this._myDefaultLineThickness) {\r\n let elementID = null;\r\n\r\n if (this.isActive()) {\r\n direction = end.vec3_sub(start, direction);\r\n let length = direction.vec3_length();\r\n direction.vec3_normalize(direction);\r\n elementID = this.drawArrow(lifetimeSeconds, start, direction, length, color, thickness);\r\n }\r\n\r\n return elementID;\r\n };\r\n}();\r\n\r\nDebugVisualManager.prototype.drawUIText = function () {\r\n let textRotationQuat = quat_create();\r\n let up = vec3_create(0, 1, 0);\r\n let lookToForward = vec3_create();\r\n\r\n let screenPositionNormalizedXR = vec3_create(-0.12 * 1, 0.12 * 1, 0.35);\r\n let screenPositionNormalizedNonXR = vec3_create(-0.27 * 1.15, 0.13 * 1.05, 0.35);\r\n\r\n let textPosition = vec3_create();\r\n let textRotation = vec3_create();\r\n let textScale = vec3_create();\r\n return function drawUIText(lifetimeSeconds, text, screenPosition = this._myDefaultUITextScreenPosition, scale = this._myDefaultUITextScale, color = this._myDefaultColor, alignment = this._myDefaultUITextAlignment, verticalAlignment = this._myDefaultUITextVerticalAlignment) {\r\n let elementID = null;\r\n\r\n if (this.isActive()) {\r\n let visualParams = new VisualTextParams(this._myEngine);\r\n visualParams.myText = text;\r\n visualParams.myAlignment = alignment;\r\n visualParams.myVerticalAlignment = verticalAlignment;\r\n visualParams.myColor = vec4_create();\r\n visualParams.myColor.vec4_copy(color);\r\n\r\n let scaleNormalized = 0.2;\r\n\r\n if (XRUtils.isSessionActive(this._myEngine)) {\r\n visualParams.myTransform.mat4_setPositionRotationScale(\r\n screenPositionNormalizedXR.vec3_mul(screenPosition, textPosition),\r\n textRotation.vec3_set(0, 180, 0),\r\n textScale.vec3_set(scaleNormalized * scale, scaleNormalized * scale, scaleNormalized * scale));\r\n\r\n lookToForward = visualParams.myTransform.mat4_getPosition(lookToForward).vec3_negate(lookToForward).vec3_normalize(lookToForward);\r\n textRotationQuat = visualParams.myTransform.mat4_getRotationQuat(textRotationQuat);\r\n textRotationQuat.quat_setForward(lookToForward, up, textRotationQuat);\r\n visualParams.myTransform.mat4_setRotationQuat(textRotationQuat);\r\n } else {\r\n visualParams.myTransform.mat4_setPositionRotationScale(\r\n screenPositionNormalizedNonXR.vec3_mul(screenPosition, textPosition),\r\n textRotation.vec3_set(0, 180, 0),\r\n textScale.vec3_set(scaleNormalized * scale, scaleNormalized * scale, scaleNormalized * scale));\r\n }\r\n\r\n visualParams.myParent = Globals.getPlayerObjects(this._myEngine).myHeadDebugs;\r\n visualParams.myLocal = true;\r\n\r\n elementID = this.draw(visualParams, lifetimeSeconds);\r\n }\r\n\r\n return elementID;\r\n };\r\n}();", "import { Globals } from \"../pp/globals.js\";\r\nimport { DebugVisualManager } from \"./debug_visual_manager.js\";\r\n\r\nexport class DebugManager {\r\n\r\n constructor(engine = Globals.getMainEngine()) {\r\n this._myEngine = engine;\r\n\r\n this._myDebugVisualManager = new DebugVisualManager(this._myEngine);\r\n\r\n this._myActive = true;\r\n this._myDestroyed = false;\r\n }\r\n\r\n getDebugVisualManager() {\r\n return this._myDebugVisualManager;\r\n }\r\n\r\n start() {\r\n this._myDebugVisualManager.start();\r\n }\r\n\r\n update(dt) {\r\n if (!this._myActive) return;\r\n\r\n this._myDebugVisualManager.update(dt);\r\n }\r\n\r\n setActive(active) {\r\n active = active && Globals.isDebugEnabled(this._myEngine);\r\n\r\n if (this._myActive != active) {\r\n this._myActive = active;\r\n }\r\n\r\n this._myDebugVisualManager.setActive(active);\r\n }\r\n\r\n isActive() {\r\n return this._myActive;\r\n }\r\n\r\n destroy() {\r\n this._myDestroyed = true;\r\n\r\n this.setActive(false);\r\n\r\n this._myDebugVisualManager.destroy();\r\n }\r\n\r\n isDestroyed() {\r\n return this._myDestroyed;\r\n }\r\n}", "import { Component, Property } from \"@wonderlandengine/api\";\r\nimport { Globals } from \"../../pp/globals.js\";\r\n\r\nexport class EnableDebugComponent extends Component {\r\n static TypeName = \"pp-enable-debug\";\r\n static Properties = {\r\n _myEnable: Property.bool(true)\r\n };\r\n\r\n start() {\r\n this._myHasDebugEnabled = this._myEnable;\r\n this._myDebugEnabled = this._myEnable;\r\n }\r\n\r\n onActivate() {\r\n if (this._myHasDebugEnabled) {\r\n Globals.setDebugEnabled(this._myDebugEnabled, this.engine);\r\n }\r\n }\r\n\r\n onDeactivate() {\r\n this._myHasDebugEnabled = Globals.hasDebugEnabled();\r\n this._myDebugEnabled = Globals.isDebugEnabled();\r\n Globals.removeDebugEnabled(this.engine);\r\n }\r\n}", "import { Component } from \"@wonderlandengine/api\";\r\nimport { Globals } from \"../../../../../pp/globals.js\";\r\nimport { CharacterCollisionSystem } from \"../character_collision_system.js\";\r\n\r\nexport class CharacterCollisionSystemComponent extends Component {\r\n static TypeName = \"pp-character-collision-system\";\r\n\r\n init() {\r\n this._myCharacterCollisionSystem = new CharacterCollisionSystem(this.engine);\r\n }\r\n\r\n update(dt) {\r\n if (Globals.getCharacterCollisionSystem(this.engine) == this._myCharacterCollisionSystem) {\r\n this._myCharacterCollisionSystem.update(dt);\r\n }\r\n }\r\n\r\n onActivate() {\r\n if (!Globals.hasCharacterCollisionSystem(this.engine)) {\r\n Globals.setCharacterCollisionSystem(this._myCharacterCollisionSystem, this.engine);\r\n }\r\n }\r\n\r\n onDeactivate() {\r\n if (Globals.getCharacterCollisionSystem(this.engine) == this._myCharacterCollisionSystem) {\r\n Globals.removeCharacterCollisionSystem(this.engine);\r\n }\r\n }\r\n}", "import { RaycastHit } from \"../../../../cauldron/physics/physics_raycast_params.js\";\r\nimport { quat2_create, vec3_create } from \"../../../../plugin/js/extensions/array/vec_create_extension.js\";\r\n\r\nexport class CharacterCollisionResults {\r\n\r\n constructor() {\r\n this.myCheckType = null;\r\n\r\n this.myTransformResults = new CharacterCollisionTransformResults();\r\n\r\n this.myMovementResults = new CharacterCollisionMovementResults();\r\n this.myHorizontalMovementResults = new CharacterCollisionMovementResults();\r\n this.myVerticalMovementResults = new CharacterCollisionMovementResults();\r\n\r\n this.myTeleportResults = new CharacterCollisionTeleportResults();\r\n\r\n this.myCheckTransformResults = new CharacterCollisionCheckTransformResults();\r\n\r\n this.myWallSlideResults = new CharacterCollisionWallSlideResults();\r\n\r\n this.myGroundInfo = new CharacterCollisionSurfaceInfo();\r\n this.myCeilingInfo = new CharacterCollisionSurfaceInfo();\r\n\r\n this.myGroundResults = new CharacterCollisionSurfaceResults();\r\n this.myCeilingResults = new CharacterCollisionSurfaceResults();\r\n\r\n this.mySplitMovementResults = new CharacterCollisionSplitMovementResults();\r\n\r\n this.myDebugResults = new CharacterCollisionDebugResults();\r\n\r\n this.myInternalResults = new CharacterCollisionInternalResults();\r\n }\r\n\r\n reset() {\r\n // Implemented outside class definition\r\n }\r\n\r\n copy(other) {\r\n // Implemented outside class definition\r\n }\r\n}\r\n\r\nexport let CharacterCollisionCheckType = {\r\n CHECK_MOVEMENT: 0,\r\n CHECK_TELEPORT: 1,\r\n CHECK_TRANSFORM: 2,\r\n UPDATE_SURFACE_INFO: 3,\r\n UPDATE_GROUND_INFO: 4,\r\n UPDATE_CEILING_INFO: 5\r\n};\r\n\r\nexport class CharacterCollisionSurfaceInfo {\r\n\r\n constructor() {\r\n this.myOnSurface = false;\r\n\r\n this.mySurfaceReferenceCollisionHit = new RaycastHit();\r\n\r\n this.mySurfaceAngle = 0;\r\n this.mySurfacePerceivedAngle = 0;\r\n this.mySurfaceNormal = vec3_create();\r\n\r\n this.mySurfaceHitMaxAngle = 0;\r\n this.mySurfaceHitMaxNormal = vec3_create();\r\n\r\n this.mySurfaceDistance = null;\r\n\r\n this.myBaseInsideCollision = false;\r\n this.myOnSurfaceDueToBasePartiallyInsideCollision = false;\r\n }\r\n\r\n reset() {\r\n // Implemented outside class definition\r\n }\r\n\r\n copy(other) {\r\n // Implemented outside class definition\r\n }\r\n}\r\n\r\nexport class CharacterCollisionWallSlideResults {\r\n\r\n constructor() {\r\n this.myHasSlid = false;\r\n this.mySlideMovementAngle = 0; // Signed angle between the start movement and the wall slide movement, basically telling you how much u had to change direction to slide\r\n this.mySlideMovementWallAngle = 0; // Signed angle between the inverted surface normal and the wall slide movement\r\n this.myWallNormal = vec3_create();\r\n }\r\n\r\n reset() {\r\n // Implemented outside class definition\r\n }\r\n\r\n copy(other) {\r\n // Implemented outside class definition\r\n }\r\n}\r\n\r\nexport class CharacterCollisionTransformResults {\r\n\r\n constructor() {\r\n this.myInitialTransformQuat = quat2_create();\r\n this.myFinalTransformQuat = quat2_create();\r\n }\r\n\r\n reset() {\r\n // Implemented outside class definition\r\n }\r\n\r\n copy(other) {\r\n // Implemented outside class definition\r\n }\r\n}\r\n\r\nexport class CharacterCollisionMovementResults {\r\n\r\n constructor() {\r\n this.myInitialMovement = vec3_create();\r\n this.myFinalMovement = vec3_create();\r\n this.myMovementFailed = false;\r\n this.myMovementCollided = false;\r\n this.myReferenceCollisionHit = new RaycastHit();\r\n }\r\n\r\n reset() {\r\n // Implemented outside class definition\r\n }\r\n\r\n copy(other) {\r\n // Implemented outside class definition\r\n }\r\n}\r\n\r\nexport class CharacterCollisionTeleportResults {\r\n\r\n constructor() {\r\n this.myInitialTeleportTransformQuat = quat2_create();\r\n this.myFinalTeleportTransformQuat = quat2_create();\r\n this.myTeleportFailed = false;\r\n }\r\n\r\n reset() {\r\n // Implemented outside class definition\r\n }\r\n\r\n copy(other) {\r\n // Implemented outside class definition\r\n }\r\n}\r\n\r\nexport class CharacterCollisionCheckTransformResults {\r\n\r\n constructor() {\r\n this.myInitialCheckTransformQuat = quat2_create();\r\n this.myFinalCheckTransformQuat = quat2_create();\r\n this.myCheckTransformFailed = false;\r\n }\r\n\r\n reset() {\r\n // Implemented outside class definition\r\n }\r\n\r\n copy(other) {\r\n // Implemented outside class definition\r\n }\r\n}\r\n\r\nexport class CharacterCollisionSurfaceResults {\r\n\r\n constructor() {\r\n this.myHasSnappedOnSurface = false;\r\n this.myHasPoppedOutSurface = false;\r\n this.myHasHorizontalMovementAdjustedVerticalMovementOverSurfacePerceivedAngleDownhill = false;\r\n this.myHasHorizontalMovementAdjustedVerticalMovementOverSurfacePerceivedAngleUphill = false;\r\n this.myHasVerticalMovementAdjustedHorizontalMovementOverSurfaceAngleDownhill = false;\r\n }\r\n\r\n reset() {\r\n // Implemented outside class definition\r\n }\r\n\r\n copy(other) {\r\n // Implemented outside class definition\r\n }\r\n}\r\n\r\nexport class CharacterCollisionSplitMovementResults {\r\n\r\n constructor() {\r\n this.myStepsToPerform = 0;\r\n this.myStepsPerformed = 0;\r\n this.myMovementInterrupted = false;\r\n this.myMovementReduced = false;\r\n this.myLastStepLongerThanMaxStepLength = false;\r\n this.myMovementChecked = vec3_create();\r\n }\r\n\r\n reset() {\r\n // Implemented outside class definition\r\n }\r\n\r\n copy(other) {\r\n // Implemented outside class definition\r\n }\r\n}\r\n\r\nexport class CharacterCollisionDebugResults {\r\n\r\n constructor() {\r\n this._myRaycastsPerformed = 0;\r\n }\r\n\r\n reset() {\r\n // Implemented outside class definition\r\n }\r\n\r\n copy(other) {\r\n // Implemented outside class definition\r\n }\r\n}\r\n\r\nexport class CharacterCollisionInternalResults {\r\n\r\n constructor() {\r\n this.myLastRelevantInitialHorizontalMovement = vec3_create();\r\n this.myLastRelevantAdjustedInitialHorizontalMovement = vec3_create();\r\n this.myLastRelevantFinalHorizontalMovement = vec3_create();\r\n\r\n this.myLastRelevantInitialVerticalMovement = vec3_create();\r\n this.myLastRelevantAdjustedInitialVerticalMovement = vec3_create();\r\n this.myLastRelevantFinalVerticalMovement = vec3_create();\r\n\r\n this.myLastRelevantHasWallSlid = false;\r\n this.myHasWallSlidTowardOppositeDirection = false;\r\n this.myLastRelevantWallSlideFlickerPrevented = false;\r\n this.myWallSlideFlickerPreventionForceCheckCounter = 0;\r\n this.myWallSlide90DegreesDirectionSign = 0;\r\n this.myWallSlide90DegreesRecomputeDirectionSign = true;\r\n }\r\n\r\n reset() {\r\n // Implemented outside class definition\r\n }\r\n\r\n copy(other) {\r\n // Implemented outside class definition\r\n }\r\n}\r\n\r\n\r\n\r\n// IMPLEMENTATION\r\n\r\nCharacterCollisionResults.prototype.reset = function reset() {\r\n this.myCheckType = null;\r\n\r\n this.myTransformResults.reset();\r\n\r\n this.myMovementResults.reset();\r\n this.myHorizontalMovementResults.reset();\r\n this.myVerticalMovementResults.reset();\r\n\r\n this.myTeleportResults.reset();\r\n\r\n this.myCheckTransformResults.reset();\r\n\r\n this.myWallSlideResults.reset();\r\n\r\n this.myGroundInfo.reset();\r\n this.myCeilingInfo.reset();\r\n\r\n this.myGroundResults.reset();\r\n this.myCeilingResults.reset();\r\n\r\n this.mySplitMovementResults.reset();\r\n\r\n this.myInternalResults.reset();\r\n};\r\n\r\nCharacterCollisionResults.prototype.copy = function copy(other) {\r\n this.myCheckType = other.myCheckType;\r\n\r\n this.myTransformResults.copy(other.myTransformResults);\r\n\r\n this.myMovementResults.copy(other.myMovementResults);\r\n this.myHorizontalMovementResults.copy(other.myHorizontalMovementResults);\r\n this.myVerticalMovementResults.copy(other.myVerticalMovementResults);\r\n\r\n this.myTeleportResults.copy(other.myTeleportResults);\r\n\r\n this.myCheckTransformResults.copy(other.myCheckTransformResults);\r\n\r\n this.myWallSlideResults.copy(other.myWallSlideResults);\r\n\r\n this.myGroundInfo.copy(other.myGroundInfo);\r\n this.myCeilingInfo.copy(other.myCeilingInfo);\r\n\r\n this.myGroundResults.copy(other.myGroundResults);\r\n this.myCeilingResults.copy(other.myCeilingResults);\r\n\r\n this.mySplitMovementResults.copy(other.mySplitMovementResults);\r\n\r\n this.myInternalResults.copy(other.myInternalResults);\r\n};\r\n\r\nCharacterCollisionSurfaceInfo.prototype.reset = function reset() {\r\n this.myOnSurface = false;\r\n\r\n this.mySurfaceAngle = 0;\r\n this.mySurfacePerceivedAngle = 0;\r\n this.mySurfaceNormal.vec3_zero();\r\n\r\n this.mySurfaceReferenceCollisionHit.reset();\r\n\r\n this.mySurfaceHitMaxAngle = 0;\r\n this.mySurfaceHitMaxNormal.vec3_zero();\r\n\r\n this.mySurfaceDistance = null;\r\n\r\n this.myBaseInsideCollision = false;\r\n this.myOnSurfaceDueToBasePartiallyInsideCollision = false;\r\n};\r\n\r\nCharacterCollisionSurfaceInfo.prototype.copy = function copy(other) {\r\n this.myOnSurface = other.myOnSurface;\r\n\r\n this.mySurfaceAngle = other.mySurfaceAngle;\r\n this.mySurfacePerceivedAngle = other.mySurfacePerceivedAngle;\r\n this.mySurfaceNormal.vec3_copy(other.mySurfaceNormal);\r\n\r\n this.mySurfaceReferenceCollisionHit.copy(other.mySurfaceReferenceCollisionHit);\r\n\r\n this.mySurfaceHitMaxAngle = other.mySurfaceHitMaxAngle;\r\n this.mySurfaceHitMaxNormal.vec3_copy(other.mySurfaceHitMaxNormal);\r\n\r\n this.mySurfaceDistance = other.mySurfaceDistance;\r\n\r\n this.myBaseInsideCollision = other.myBaseInsideCollision;\r\n this.myOnSurfaceDueToBasePartiallyInsideCollision = other.myOnSurfaceDueToBasePartiallyInsideCollision;\r\n};\r\n\r\nCharacterCollisionWallSlideResults.prototype.reset = function reset() {\r\n this.myHasSlid = false;\r\n this.mySlideMovementAngle = 0;\r\n this.mySlideMovementWallAngle = 0;\r\n this.myWallNormal.vec3_zero();\r\n};\r\n\r\nCharacterCollisionWallSlideResults.prototype.copy = function copy(other) {\r\n this.myHasSlid = other.myHasSlid;\r\n this.mySlideMovementAngle = other.mySlideMovementAngle;\r\n this.mySlideMovementWallAngle = other.mySlideMovementWallAngle;\r\n this.myWallNormal.vec3_copy(other.myWallNormal);\r\n};\r\n\r\nCharacterCollisionTransformResults.prototype.reset = function reset() {\r\n this.myInitialTransformQuat.quat2_identity();\r\n this.myFinalTransformQuat.quat2_identity();\r\n};\r\n\r\nCharacterCollisionTransformResults.prototype.copy = function copy(other) {\r\n this.myInitialTransformQuat.quat2_copy(other.myInitialTransformQuat);\r\n this.myFinalTransformQuat.quat2_copy(other.myFinalTransformQuat);\r\n};\r\n\r\nCharacterCollisionMovementResults.prototype.reset = function reset() {\r\n this.myInitialMovement.vec3_zero();\r\n this.myFinalMovement.vec3_zero();\r\n this.myMovementFailed = false;\r\n this.myMovementCollided = false;\r\n this.myReferenceCollisionHit.reset();\r\n};\r\n\r\nCharacterCollisionMovementResults.prototype.copy = function copy(other) {\r\n this.myInitialMovement.vec3_copy(other.myInitialMovement);\r\n this.myFinalMovement.vec3_copy(other.myFinalMovement);\r\n this.myMovementFailed = other.myMovementFailed;\r\n this.myMovementCollided = other.myMovementCollided;\r\n this.myReferenceCollisionHit.copy(other.myReferenceCollisionHit);\r\n};\r\n\r\nCharacterCollisionTeleportResults.prototype.reset = function reset() {\r\n this.myInitialTeleportTransformQuat.quat2_identity();\r\n this.myFinalTeleportTransformQuat.quat2_identity();\r\n this.myTeleportFailed = false;\r\n};\r\n\r\nCharacterCollisionTeleportResults.prototype.copy = function copy(other) {\r\n this.myInitialTeleportTransformQuat.quat2_copy(other.myInitialTeleportTransformQuat);\r\n this.myFinalTeleportTransformQuat.quat2_copy(other.myFinalTeleportTransformQuat);\r\n this.myTeleportFailed = other.myTeleportFailed;\r\n};\r\n\r\nCharacterCollisionCheckTransformResults.prototype.reset = function reset() {\r\n this.myInitialCheckTransformQuat.quat2_identity();\r\n this.myFinalCheckTransformQuat.quat2_identity();\r\n this.myCheckTransformFailed = false;\r\n};\r\n\r\nCharacterCollisionCheckTransformResults.prototype.copy = function copy(other) {\r\n this.myInitialCheckTransformQuat.quat2_copy(other.myInitialCheckTransformQuat);\r\n this.myFinalCheckTransformQuat.quat2_copy(other.myFinalCheckTransformQuat);\r\n this.myCheckTransformFailed = other.myCheckTransformFailed;\r\n};\r\n\r\nCharacterCollisionSurfaceResults.prototype.reset = function reset() {\r\n this.myHasSnappedOnSurface = false;\r\n this.myHasPoppedOutSurface = false;\r\n this.myHasHorizontalMovementAdjustedVerticalMovementOverSurfacePerceivedAngleDownhill = false;\r\n this.myHasHorizontalMovementAdjustedVerticalMovementOverSurfacePerceivedAngleUphill = false;\r\n this.myHasVerticalMovementAdjustedHorizontalMovementOverSurfaceAngleDownhill = false;\r\n};\r\n\r\nCharacterCollisionSurfaceResults.prototype.copy = function copy(other) {\r\n this.myHasSnappedOnSurface = other.myHasSnappedOnSurface;\r\n this.myHasPoppedOutSurface = other.myHasPoppedOutSurface;\r\n this.myHasHorizontalMovementAdjustedVerticalMovementOverSurfacePerceivedAngleDownhill = other.myHasHorizontalMovementAdjustedVerticalMovementOverSurfacePerceivedAngleDownhill;\r\n this.myHasHorizontalMovementAdjustedVerticalMovementOverSurfacePerceivedAngleUphill = other.myHasHorizontalMovementAdjustedVerticalMovementOverSurfacePerceivedAngleUphill;\r\n this.myHasVerticalMovementAdjustedHorizontalMovementOverSurfaceAngleDownhill = other.myHasVerticalMovementAdjustedHorizontalMovementOverSurfaceAngleDownhill;\r\n};\r\n\r\nCharacterCollisionSplitMovementResults.prototype.reset = function reset() {\r\n this.myStepsToPerform = 0;\r\n this.myStepsPerformed = 0;\r\n this.myMovementInterrupted = false;\r\n this.myMovementReduced = false;\r\n this.myLastStepLongerThanMaxStepLength = false;\r\n this.myMovementChecked.vec3_zero();\r\n};\r\n\r\nCharacterCollisionSplitMovementResults.prototype.copy = function copy(other) {\r\n this.myStepsToPerform = other.myStepsToPerform;\r\n this.myStepsPerformed = other.myStepsPerformed;\r\n this.myMovementInterrupted = other.myMovementInterrupted;\r\n this.myMovementReduced = other.myMovementReduced;\r\n this.myLastStepLongerThanMaxStepLength = other.myLastStepLongerThanMaxStepLength;\r\n this.myMovementChecked.vec3_copy(other.myMovementChecked);\r\n};\r\n\r\nCharacterCollisionDebugResults.prototype.reset = function reset() {\r\n this._myRaycastsPerformed = 0;\r\n};\r\n\r\nCharacterCollisionDebugResults.prototype.copy = function copy(other) {\r\n this._myRaycastsPerformed = other._myRaycastsPerformed;\r\n};\r\n\r\nCharacterCollisionInternalResults.prototype.reset = function reset() {\r\n};\r\n\r\nCharacterCollisionInternalResults.prototype.copy = function copy(other) {\r\n this.myLastRelevantInitialHorizontalMovement.vec3_copy(other.myLastRelevantInitialHorizontalMovement);\r\n this.myLastRelevantAdjustedInitialHorizontalMovement.vec3_copy(other.myLastRelevantAdjustedInitialHorizontalMovement);\r\n this.myLastRelevantFinalHorizontalMovement.vec3_copy(other.myLastRelevantFinalHorizontalMovement);\r\n\r\n this.myLastRelevantInitialVerticalMovement.vec3_copy(other.myLastRelevantInitialVerticalMovement);\r\n this.myLastRelevantAdjustedInitialVerticalMovement.vec3_copy(other.myLastRelevantAdjustedInitialVerticalMovement);\r\n this.myLastRelevantFinalVerticalMovement.vec3_copy(other.myLastRelevantFinalVerticalMovement);\r\n\r\n this.myLastRelevantHasWallSlid = other.myLastRelevantHasWallSlid;\r\n this.myHasWallSlidTowardOppositeDirection = other.myHasWallSlidTowardOppositeDirection;\r\n this.myLastRelevantWallSlideFlickerPrevented = other.myLastRelevantWallSlideFlickerPrevented;\r\n this.myWallSlideFlickerPreventionForceCheckCounter = other.myWallSlideFlickerPreventionForceCheckCounter;\r\n this.myWallSlide90DegreesDirectionSign = other.myWallSlide90DegreesDirectionSign;\r\n this.myWallSlide90DegreesRecomputeDirectionSign = other.myWallSlide90DegreesRecomputeDirectionSign;\r\n};", "import { PhysicsLayerFlags } from \"../../../../../../cauldron/physics/physics_layer_flags.js\";\r\nimport { RaycastBlockColliderType, RaycastHit } from \"../../../../../../cauldron/physics/physics_raycast_params.js\";\r\nimport { quat_create, vec3_create } from \"../../../../../../plugin/js/extensions/array/vec_create_extension.js\";\r\n\r\nexport class CollisionCheckParams {\r\n\r\n constructor() {\r\n this.mySplitMovementEnabled = false;\r\n this.mySplitMovementMaxLength = 0;\r\n this.mySplitMovementMaxLengthEnabled = false;\r\n this.mySplitMovementMaxLengthLastStepCanBeLonger = false;\r\n this.mySplitMovementMaxSteps = 0;\r\n this.mySplitMovementMaxStepsEnabled = false;\r\n this.mySplitMovementMinLength = 0;\r\n this.mySplitMovementMinLengthEnabled = false;\r\n this.mySplitMovementStopWhenHorizontalMovementCanceled = false;\r\n this.mySplitMovementStopWhenVerticalMovementCanceled = false;\r\n this.mySplitMovementStopWhenVerticalMovementReduced = false;\r\n this.mySplitMovementStopCallback = null; // Signature: callback(collisionRuntimeParams)\r\n this.mySplitMovementStopReturnPrevious = false;\r\n this.mySplitMovementStopAndFailIfMovementWouldBeReduced = false; // It means the overall movement would be reduced due to max steps for example\r\n\r\n this.myRadius = 0;\r\n this.myDistanceFromFeetToIgnore = 0;\r\n this.myDistanceFromHeadToIgnore = 0;\r\n\r\n this.myPositionOffsetLocal = vec3_create();\r\n this.myRotationOffsetLocalQuat = quat_create();\r\n\r\n this.myHorizontalMovementCheckEnabled = false;\r\n\r\n // Usually the horizontal movement is very small and it could be simply skipped has a check, the horizontal position check will be enough\r\n // With small I mean that it's very unlikely that in 10 cm of movement in a frame u are going to hit something in between but not in the final position\r\n // If u feel like the movement is bigger or want to be sure u can always enabled this\r\n // If the movement is really that big it's probably better to use the mySplitMovementEnabled flag and split the movement check into smaller movements\r\n this.myHorizontalMovementStepEnabled = false;\r\n this.myHorizontalMovementStepMaxLength = 0;\r\n\r\n this.myHorizontalMovementRadialStepAmount = 0;\r\n this.myHorizontalMovementCheckDiagonalOutward = false;\r\n this.myHorizontalMovementCheckDiagonalInward = false;\r\n this.myHorizontalMovementCheckStraight = false;\r\n this.myHorizontalMovementCheckHorizontalBorder = false;\r\n this.myHorizontalMovementCheckVerticalStraight = false;\r\n this.myHorizontalMovementCheckVerticalDiagonalUpwardOutward = false;\r\n this.myHorizontalMovementCheckVerticalDiagonalUpwardInward = false;\r\n this.myHorizontalMovementCheckVerticalDiagonalDownwardOutward = false;\r\n this.myHorizontalMovementCheckVerticalDiagonalDownwardInward = false;\r\n this.myHorizontalMovementCheckVerticalStraightDiagonalUpward = false;\r\n this.myHorizontalMovementCheckVerticalStraightDiagonalDownward = false;\r\n this.myHorizontalMovementCheckVerticalHorizontalBorderDiagonalOutward = false;\r\n this.myHorizontalMovementCheckVerticalHorizontalBorderDiagonalInward = false;\r\n this.myHorizontalMovementHorizontalStraightCentralCheckEnabled = false;\r\n this.myHorizontalMovementVerticalStraightCentralCheckEnabled = false;\r\n this.myHorizontalMovementVerticalStraightDiagonalUpwardCentralCheckEnabled = false;\r\n this.myHorizontalMovementVerticalStraightDiagonalDownwardCentralCheckEnabled = false;\r\n\r\n this.myHorizontalPositionCheckEnabled = false;\r\n\r\n this.myHalfConeAngle = 0;\r\n this.myHalfConeSliceAmount = 0;\r\n this.myCheckConeBorder = false;\r\n this.myCheckConeRay = false;\r\n this.myHorizontalPositionCheckVerticalIgnoreHitsInsideCollision = true; // True gives less issues(tm), but may also collide a bit more, resulting in less sliding\r\n this.myHorizontalPositionCheckVerticalDirectionType = 0; // Somewhat expensive, 2 times the check for the vertical check of the horizontal movement!\r\n // 0: check upward, gives less issues(tm) (hitting a very small step at the end of a slope /-) with a grounded movement (not fly or snapped to ceiling), but may also collide a bit more, resulting in less sliding\r\n // 1: check downard, gives less issues(tm) with a ceiling-ed movement (not fly or snapped to ground), but may also collide a bit more, resulting in less sliding and more stuck in front of a wall\r\n // 2: check both directions, more expensive and better prevent collision, sliding more, but is more expensive and gives more issues \r\n // ___\r\n // The issues(tm) means that a small step at the end of a slope, maybe due to 2 rectangles, one for the floor and the other for the slope like this -> / \r\n // can create a small step if the floor rectangle is a bit above the end of the slope, this will make the character get stuck thinking it's a wall\r\n // 0 avoid this issue for a grounded movement, 2 instead do a more \"aggressive\" vertical check that makes the character get less stuck in other situations, but can get stuck in this one\r\n // The better solution is to properly create the level, and if possible combine the 2 rectangles by having the floor a little below the end of the slope\r\n // The step that is created \"on the other side\" in fact can easily be ignored thanks to the myDistanceFromFeetToIgnore field\r\n // If the level is properly created the best solution should be myHorizontalPositionCheckVerticalIgnoreHitsInsideCollision = false and myHorizontalPositionCheckVerticalDirectionType = 0\r\n\r\n this.myCheckHorizontalFixedForwardEnabled = false; // This is basically only useful if the cone angle is 180 degrees\r\n this.myCheckHorizontalFixedForward = vec3_create();\r\n\r\n this.myVerticalMovementCheckEnabled = false;\r\n this.myVerticalPositionCheckEnabled = false;\r\n this.myFeetRadius = 0;\r\n\r\n this.myAdjustVerticalMovementWithGroundAngleDownhill = false;\r\n this.myAdjustVerticalMovementWithGroundAngleUphill = false;\r\n this.myAdjustVerticalMovementWithGroundAngleDownhillMaxAngle = null;\r\n this.myAdjustVerticalMovementWithGroundAngleUphillMaxAngle = null;\r\n this.myAdjustVerticalMovementWithGroundAngleDownhillMaxPerceivedAngle = null;\r\n this.myAdjustVerticalMovementWithGroundAngleUphillMaxPerceivedAngle = null;\r\n this.myAdjustHorizontalMovementWithGroundAngleDownhill = false;\r\n this.myAdjustHorizontalMovementWithGroundAngleDownhillMinAngle = null;\r\n\r\n this.myAdjustVerticalMovementWithCeilingAngleDownhill = false;\r\n this.myAdjustVerticalMovementWithCeilingAngleUphill = false;\r\n this.myAdjustVerticalMovementWithCeilingAngleDownhillMaxAngle = null;\r\n this.myAdjustVerticalMovementWithCeilingAngleUphillMaxAngle = null;\r\n this.myAdjustVerticalMovementWithCeilingAngleDownhillMaxAngle = null;\r\n this.myAdjustVerticalMovementWithCeilingAngleUphillMaxAngle = null;\r\n this.myAdjustHorizontalMovementWithCeilingAngleDownhill = false;\r\n this.myAdjustHorizontalMovementWithCeilingAngleDownhillMinAngle = null;\r\n\r\n this.myCheckVerticalFixedForwardEnabled = false;\r\n this.myCheckVerticalFixedForward = vec3_create();\r\n this.myCheckVerticalBothDirection = false;\r\n this.myCheckVerticalPositionBothDirection = false;\r\n\r\n this.mySnapOnGroundEnabled = false;\r\n this.mySnapOnGroundExtraDistance = 0;\r\n this.mySnapOnCeilingEnabled = false;\r\n this.mySnapOnCeilingExtraDistance = 0;\r\n\r\n this.myGroundPopOutEnabled = false;\r\n this.myGroundPopOutExtraDistance = 0;\r\n this.myCeilingPopOutEnabled = false;\r\n this.myCeilingPopOutExtraDistance = 0;\r\n\r\n this.myVerticalMovementReduceEnabled = false;\r\n\r\n this.myGroundCircumferenceAddCenter = false;\r\n this.myGroundCircumferenceSliceAmount = 0;\r\n this.myGroundCircumferenceStepAmount = 0;\r\n this.myGroundCircumferenceRotationPerStep = 0;\r\n this.myVerticalAllowHitInsideCollisionIfOneOk = false;\r\n\r\n this.myCheckHeight = false;\r\n this.myCheckHeightVerticalMovement = false;\r\n this.myCheckHeightVerticalPosition = false;\r\n this.myCheckHeightTopMovement = false;\r\n this.myCheckHeightTopPosition = false;\r\n this.myCheckHeightConeOnCollision = false;\r\n this.myCheckHeightConeOnCollisionKeepHit = false;\r\n // If true and myCheckHeightConeOnCollision is true, if the cone does not hit the height hit will be restored\r\n // The fact that the cone does not hit could be due to the fact that it thinks that the collision can be ignored though, sop restoring can be a bit safer but also collide more\r\n\r\n this.myHeightCheckStepAmountMovement = 0;\r\n this.myHeightCheckStepAmountPosition = 0;\r\n this.myCheckVerticalStraight = false;\r\n this.myCheckVerticalDiagonalRayOutward = false;\r\n this.myCheckVerticalDiagonalRayInward = false;\r\n this.myCheckVerticalDiagonalBorderOutward = false;\r\n this.myCheckVerticalDiagonalBorderInward = false;\r\n this.myCheckVerticalDiagonalBorderRayOutward = false;\r\n this.myCheckVerticalDiagonalBorderRayInward = false;\r\n this.myCheckVerticalSearchFartherVerticalHit = false; // Somewhat expensive, but can help fix sime sliding issues\r\n\r\n this.myGroundAngleToIgnore = 0;\r\n this.myGroundAngleToIgnoreWithPerceivedAngle = null;\r\n this.myCeilingAngleToIgnore = 0;\r\n this.myCeilingAngleToIgnoreWithPerceivedAngle = null;\r\n\r\n this.myHorizontalMovementGroundAngleIgnoreHeight = null;\r\n this.myHorizontalMovementCeilingAngleIgnoreHeight = null;\r\n this.myHorizontalPositionGroundAngleIgnoreHeight = null;\r\n this.myHorizontalPositionCeilingAngleIgnoreHeight = null;\r\n\r\n this.myHorizontalMovementGroundAngleIgnoreMaxMovementLeft = null;\r\n this.myHorizontalMovementCeilingAngleIgnoreMaxMovementLeft = null;\r\n\r\n this.myHeight = 0;\r\n\r\n this.myComputeGroundInfoEnabled = false;\r\n this.myComputeCeilingInfoEnabled = false;\r\n this.myDistanceToBeOnGround = 0;\r\n this.myDistanceToComputeGroundInfo = 0;\r\n this.myDistanceToBeOnCeiling = 0;\r\n this.myDistanceToComputeCeilingInfo = 0;\r\n this.myVerticalFixToBeOnGround = 0;\r\n this.myVerticalFixToComputeGroundInfo = 0;\r\n this.myVerticalFixToBeOnCeiling = 0;\r\n this.myVerticalFixToComputeCeilingInfo = 0;\r\n this.myGroundIsBaseInsideCollisionCheckEnabled = false;\r\n this.myCeilingIsBaseInsideCollisionCheckEnabled = false;\r\n this.myIsOnGroundIfInsideHit = false;\r\n this.myIsOnCeilingIfInsideHit = false;\r\n this.myIsOnGroundMaxSurfaceAngle = null;\r\n this.myIsOnCeilingMaxSurfaceAngle = null;\r\n this.myFindGroundDistanceMaxOutsideDistance = 0;\r\n this.myFindGroundDistanceMaxInsideDistance = 0;\r\n this.myFindCeilingDistanceMaxOutsideDistance = 0;\r\n this.myFindCeilingDistanceMaxInsideDistance = 0;\r\n this.myCollectGroundCollisionHitOutsideDistance = 0;\r\n this.myCollectGroundCollisionHitInsideDistance = 0;\r\n this.myCollectCeilingCollisionHitOutsideDistance = 0;\r\n this.myCollectCeilingCollisionHitInsideDistance = 0;\r\n\r\n this.myAllowGroundSteepFix = false;\r\n this.myAllowCeilingSteepFix = false;\r\n this.myMustStayOnGround = false;\r\n this.myMustStayOnCeiling = false;\r\n this.myMustStayOnValidGroundAngleDownhill = false;\r\n this.myMustStayOnValidCeilingAngleDownhill = false;\r\n this.myRegatherGroundInfoOnSurfaceCheckFail = false;\r\n this.myRegatherCeilingInfoOnSurfaceCheckFail = false;\r\n this.myMustStayBelowIgnorableGroundAngleDownhill = false;\r\n this.myMustStayBelowIgnorableCeilingAngleDownhill = false;\r\n this.myMustStayBelowGroundAngleDownhill = null;\r\n this.myMustStayBelowCeilingAngleDownhill = null;\r\n this.myMovementMustStayOnGroundHitAngle = null;\r\n this.myMovementMustStayOnCeilingHitAngle = null;\r\n\r\n this.myTeleportMustBeOnIgnorableGroundAngle = false;\r\n this.myCheckTransformMustBeOnIgnorableGroundAngle = false;\r\n this.myTeleportMustBeOnIgnorableCeilingAngle = false;\r\n this.myCheckTransformMustBeOnIgnorableCeilingAngle = false;\r\n\r\n this.myTeleportMustBeOnGroundAngle = null;\r\n this.myCheckTransformMustBeOnGroundAngle = null;\r\n this.myTeleportMustBeOnCeilingAngle = null;\r\n this.myCheckTransformMustBeOnCeilingAngle = null;\r\n\r\n this.myTeleportMustBeOnGround = false;\r\n this.myCheckTransformMustBeOnGround = false;\r\n this.myTeleportMustBeOnCeiling = false;\r\n this.myCheckTransformMustBeOnCeiling = false;\r\n\r\n this.mySlidingEnabled = false;\r\n this.mySlidingHorizontalMovementCheckBetterNormal = false;\r\n this.mySlidingMaxAttempts = 0;\r\n this.mySlidingCheckBothDirections = false; // Expensive, 2 times the check for the whole horizontal movement!\r\n // This can fix some edge cases in which u can get stuck instead of sliding\r\n // It basically require that u also add flicker prevention\r\n\r\n this.mySlidingFlickeringPreventionType = 0; // Expensive, 2 times the check for the whole horizontal movement!\r\n // 0: no prevention\r\n // 1: use previous frame data to understand if the sliding could flicker, this avoid stopping the movement when the flicker would just last some frames, \r\n // but also allows a bit of flicker that stabilize after 2-3 frames\r\n // 2: check when sliding collision angle is more then 90 degrees, prevents most flicker apart those on almost flat surfaces\r\n // 3: check 2 + check when sliding movement angle is more then 85 degrees, prevents almost all flicker, even on almost flat surfaces\r\n // 4: check every time\r\n //\r\n // From 3 and above you could have that the flicker prevents the movement when u expect it, because it's a more aggressive prevention\r\n // In case a fluid movement is more important than a bit of flicker from time to time, 1 is a better choice (which is also less expensive than 3 and above)\r\n // 2 is just a less expensive version of 3 (check less times) but also less precise, allowing more flickering\r\n\r\n this.mySlidingFlickeringPreventionCheckOnlyIfAlreadySliding = false;\r\n // This flag make it so the prevention is done only if it was already sliding, this can lead to a few frames of flicker if u go toward a corner directly\r\n // but allow the movement to be more fluid, avoiding getting stuck\r\n\r\n this.mySlidingFlickerPreventionCheckAnywayCounter = 0;\r\n // If the collision think it needs to check for flicker, it will keep checking for the next X frames based on this value even if the condition are not met anymore\r\n // This help in catching the flicker when the direction is not changing every frame but every 2-3 for example\r\n // It's especially useful if combo-ed with mySlidingFlickeringPreventionType == 1, making it a bit less fluid but also less flickering\r\n\r\n this.mySlidingAdjustSign90Degrees = false;\r\n\r\n this.myHorizontalBlockLayerFlags = new PhysicsLayerFlags();\r\n this.myHorizontalObjectsToIgnore = [];\r\n\r\n // #TODO it should just hit NORMAL colliders, but for perf reasons since I need to get the component from the object it's better to keep it like this\r\n // When changing this to NORMAL, do also remember to update the other place like player teleport where BOTH is also used to NORMAL\r\n this.myHorizontalBlockColliderType = RaycastBlockColliderType.BOTH;\r\n\r\n this.myVerticalBlockLayerFlags = new PhysicsLayerFlags();\r\n this.myVerticalObjectsToIgnore = [];\r\n\r\n // #TODO it should just hit NORMAL colliders, but for perf reasons since I need to get the component from the object it's better to keep it like this\r\n // When changing this to NORMAL, do also remember to update the other place like player teleport where BOTH is also used to NORMAL\r\n this.myVerticalBlockColliderType = RaycastBlockColliderType.BOTH;\r\n\r\n this.myExtraMovementCheckCallback = null; // Signature: callback(startMovement, endMovement, currentPosition, currentTransformUp, currentTransformForward, currentHeight, collisionCheckParams, prevCollisionRuntimeParams, outCollisionRuntimeParams, outFixedMovement) -> outFixedMovement\r\n this.myExtraTeleportCheckCallback = null; // Signature: callback(collisionRuntimeParams) -> bool\r\n this.myExtraCheckTransformCheckCallback = null; // Signature: callback(collisionRuntimeParams) -> bool\r\n\r\n this.myDebugEnabled = false;\r\n\r\n this.myDebugHorizontalMovementEnabled = false;\r\n this.myDebugHorizontalPositionEnabled = false;\r\n this.myDebugVerticalMovementEnabled = false;\r\n this.myDebugVerticalPositionEnabled = false;\r\n this.myDebugSlidingEnabled = false;\r\n this.myDebugGroundInfoEnabled = false;\r\n this.myDebugCeilingInfoEnabled = false;\r\n this.myDebugRuntimeParamsEnabled = false;\r\n this.myDebugMovementEnabled = false;\r\n\r\n /** Internal Flags */\r\n\r\n this._myInternalSplitMovementMaxStepsDisabled = false; // Specifically used when the movement should be tested completely and not stop on max steps\r\n }\r\n\r\n copy(other) {\r\n if (this == other) return;\r\n\r\n this.mySplitMovementEnabled = other.mySplitMovementEnabled;\r\n this.mySplitMovementMaxLength = other.mySplitMovementMaxLength;\r\n this.mySplitMovementMaxLengthEnabled = other.mySplitMovementMaxLengthEnabled;\r\n this.mySplitMovementMaxLengthLastStepCanBeLonger = other.mySplitMovementMaxLengthLastStepCanBeLonger;\r\n this.mySplitMovementMaxSteps = other.mySplitMovementMaxSteps;\r\n this.mySplitMovementMaxStepsEnabled = other.mySplitMovementMaxStepsEnabled;\r\n this.mySplitMovementMinLength = other.mySplitMovementMinLength;\r\n this.mySplitMovementMinLengthEnabled = other.mySplitMovementMinLengthEnabled;\r\n this.mySplitMovementStopWhenHorizontalMovementCanceled = other.mySplitMovementStopWhenHorizontalMovementCanceled;\r\n this.mySplitMovementStopWhenVerticalMovementCanceled = other.mySplitMovementStopWhenVerticalMovementCanceled;\r\n this.mySplitMovementStopWhenVerticalMovementReduced = other.mySplitMovementStopWhenVerticalMovementReduced;\r\n this.mySplitMovementStopCallback = other.mySplitMovementStopCallback;\r\n this.mySplitMovementStopReturnPrevious = other.mySplitMovementStopReturnPrevious;\r\n this.mySplitMovementStopAndFailIfMovementWouldBeReduced = other.mySplitMovementStopAndFailIfMovementWouldBeReduced;\r\n\r\n this.myRadius = other.myRadius;\r\n this.myDistanceFromFeetToIgnore = other.myDistanceFromFeetToIgnore;\r\n this.myDistanceFromHeadToIgnore = other.myDistanceFromHeadToIgnore;\r\n\r\n this.myPositionOffsetLocal.vec3_copy(other.myPositionOffsetLocal);\r\n this.myRotationOffsetLocalQuat.quat_copy(other.myRotationOffsetLocalQuat);\r\n\r\n this.myHorizontalMovementCheckEnabled = other.myHorizontalMovementCheckEnabled;\r\n this.myHorizontalMovementStepEnabled = other.myHorizontalMovementStepEnabled;\r\n this.myHorizontalMovementStepMaxLength = other.myHorizontalMovementStepMaxLength;\r\n this.myHorizontalMovementRadialStepAmount = other.myHorizontalMovementRadialStepAmount;\r\n this.myHorizontalMovementCheckDiagonalOutward = other.myHorizontalMovementCheckDiagonalOutward;\r\n this.myHorizontalMovementCheckDiagonalInward = other.myHorizontalMovementCheckDiagonalInward;\r\n this.myHorizontalMovementCheckStraight = other.myHorizontalMovementCheckStraight;\r\n this.myHorizontalMovementCheckHorizontalBorder = other.myHorizontalMovementCheckHorizontalBorder;\r\n this.myHorizontalMovementCheckVerticalStraight = other.myHorizontalMovementCheckVerticalStraight;\r\n this.myHorizontalMovementCheckVerticalDiagonalUpwardOutward = other.myHorizontalMovementCheckVerticalDiagonalUpwardOutward;\r\n this.myHorizontalMovementCheckVerticalDiagonalUpwardInward = other.myHorizontalMovementCheckVerticalDiagonalUpwardInward;\r\n this.myHorizontalMovementCheckVerticalDiagonalDownwardOutward = other.myHorizontalMovementCheckVerticalDiagonalDownwardOutward;\r\n this.myHorizontalMovementCheckVerticalDiagonalDownwardInward = other.myHorizontalMovementCheckVerticalDiagonalDownwardInward;\r\n this.myHorizontalMovementCheckVerticalStraightDiagonalUpward = other.myHorizontalMovementCheckVerticalStraightDiagonalUpward;\r\n this.myHorizontalMovementCheckVerticalStraightDiagonalDownward = other.myHorizontalMovementCheckVerticalStraightDiagonalDownward;\r\n this.myHorizontalMovementCheckVerticalHorizontalBorderDiagonalOutward = other.myHorizontalMovementCheckVerticalHorizontalBorderDiagonalOutward;\r\n this.myHorizontalMovementCheckVerticalHorizontalBorderDiagonalInward = other.myHorizontalMovementCheckVerticalHorizontalBorderDiagonalInward;\r\n this.myHorizontalMovementHorizontalStraightCentralCheckEnabled = other.myHorizontalMovementHorizontalStraightCentralCheckEnabled;\r\n this.myHorizontalMovementVerticalStraightCentralCheckEnabled = other.myHorizontalMovementVerticalStraightCentralCheckEnabled;\r\n this.myHorizontalMovementVerticalStraightDiagonalUpwardCentralCheckEnabled = other.myHorizontalMovementVerticalStraightDiagonalUpwardCentralCheckEnabled;\r\n this.myHorizontalMovementVerticalStraightDiagonalDownwardCentralCheckEnabled = other.myHorizontalMovementVerticalStraightDiagonalDownwardCentralCheckEnabled;\r\n\r\n this.myHorizontalPositionCheckEnabled = other.myHorizontalPositionCheckEnabled;\r\n this.myHalfConeAngle = other.myHalfConeAngle;\r\n this.myHalfConeSliceAmount = other.myHalfConeSliceAmount;\r\n this.myCheckConeBorder = other.myCheckConeBorder;\r\n this.myCheckConeRay = other.myCheckConeRay;\r\n this.myHorizontalPositionCheckVerticalIgnoreHitsInsideCollision = other.myHorizontalPositionCheckVerticalIgnoreHitsInsideCollision;\r\n this.myHorizontalPositionCheckVerticalDirectionType = other.myHorizontalPositionCheckVerticalDirectionType;\r\n\r\n this.myVerticalMovementCheckEnabled = other.myVerticalMovementCheckEnabled;\r\n this.myVerticalPositionCheckEnabled = other.myVerticalPositionCheckEnabled;\r\n this.myFeetRadius = other.myFeetRadius;\r\n\r\n this.myAdjustVerticalMovementWithGroundAngleDownhill = other.myAdjustVerticalMovementWithGroundAngleDownhill;\r\n this.myAdjustVerticalMovementWithGroundAngleUphill = other.myAdjustVerticalMovementWithGroundAngleUphill;\r\n this.myAdjustVerticalMovementWithGroundAngleDownhillMaxAngle = other.myAdjustVerticalMovementWithGroundAngleDownhillMaxAngle;\r\n this.myAdjustVerticalMovementWithGroundAngleUphillMaxAngle = other.myAdjustVerticalMovementWithGroundAngleUphillMaxAngle;\r\n this.myAdjustVerticalMovementWithGroundAngleDownhillMaxPerceivedAngle = other.myAdjustVerticalMovementWithGroundAngleDownhillMaxPerceivedAngle;\r\n this.myAdjustVerticalMovementWithGroundAngleUphillMaxPerceivedAngle = other.myAdjustVerticalMovementWithGroundAngleUphillMaxPerceivedAngle;\r\n this.myAdjustHorizontalMovementWithGroundAngleDownhill = other.myAdjustHorizontalMovementWithGroundAngleDownhill;\r\n this.myAdjustHorizontalMovementWithGroundAngleDownhillMinAngle = other.myAdjustHorizontalMovementWithGroundAngleDownhillMinAngle;\r\n\r\n this.myAdjustVerticalMovementWithCeilingAngleDownhill = other.myAdjustVerticalMovementWithCeilingAngleDownhill;\r\n this.myAdjustVerticalMovementWithCeilingAngleUphill = other.myAdjustVerticalMovementWithCeilingAngleUphill;\r\n this.myAdjustVerticalMovementWithCeilingAngleDownhillMaxAngle = other.myAdjustVerticalMovementWithCeilingAngleDownhillMaxAngle;\r\n this.myAdjustVerticalMovementWithCeilingAngleUphillMaxAngle = other.myAdjustVerticalMovementWithCeilingAngleUphillMaxAngle;\r\n this.myAdjustVerticalMovementWithCeilingAngleDownhillMaxAngle = other.myAdjustVerticalMovementWithCeilingAngleDownhillMaxAngle;\r\n this.myAdjustVerticalMovementWithCeilingAngleUphillMaxAngle = other.myAdjustVerticalMovementWithCeilingAngleUphillMaxAngle;\r\n this.myAdjustHorizontalMovementWithCeilingAngleDownhill = other.myAdjustHorizontalMovementWithCeilingAngleDownhill;\r\n this.myAdjustHorizontalMovementWithCeilingAngleDownhillMinAngle = other.myAdjustHorizontalMovementWithCeilingAngleDownhillMinAngle;\r\n\r\n this.myCheckVerticalFixedForwardEnabled = other.myCheckVerticalFixedForwardEnabled;\r\n this.myCheckVerticalFixedForward.vec3_copy(other.myCheckVerticalFixedForward);\r\n this.myCheckVerticalBothDirection = other.myCheckVerticalBothDirection;\r\n this.myCheckVerticalPositionBothDirection = other.myCheckVerticalPositionBothDirection;\r\n\r\n this.mySnapOnGroundEnabled = other.mySnapOnGroundEnabled;\r\n this.mySnapOnGroundExtraDistance = other.mySnapOnGroundExtraDistance;\r\n this.mySnapOnCeilingEnabled = other.mySnapOnCeilingEnabled;\r\n this.mySnapOnCeilingExtraDistance = other.mySnapOnCeilingExtraDistance;\r\n\r\n this.myGroundPopOutEnabled = other.myGroundPopOutEnabled;\r\n this.myGroundPopOutExtraDistance = other.myGroundPopOutExtraDistance;\r\n this.myCeilingPopOutEnabled = other.myCeilingPopOutEnabled;\r\n this.myCeilingPopOutExtraDistance = other.myCeilingPopOutExtraDistance;\r\n\r\n this.myVerticalMovementReduceEnabled = other.myVerticalMovementReduceEnabled;\r\n\r\n this.myGroundCircumferenceAddCenter = other.myGroundCircumferenceAddCenter;\r\n this.myGroundCircumferenceSliceAmount = other.myGroundCircumferenceSliceAmount;\r\n this.myGroundCircumferenceStepAmount = other.myGroundCircumferenceStepAmount;\r\n this.myGroundCircumferenceRotationPerStep = other.myGroundCircumferenceRotationPerStep;\r\n this.myVerticalAllowHitInsideCollisionIfOneOk = other.myVerticalAllowHitInsideCollisionIfOneOk;\r\n\r\n this.myCheckHeight = other.myCheckHeight;\r\n this.myCheckHeightVerticalMovement = other.myCheckHeightVerticalMovement;\r\n this.myCheckHeightVerticalPosition = other.myCheckHeightVerticalPosition;\r\n this.myCheckHeightTopMovement = other.myCheckHeightTopMovement;\r\n this.myCheckHeightTopPosition = other.myCheckHeightTopPosition;\r\n this.myCheckHeightConeOnCollision = other.myCheckHeightConeOnCollision;\r\n this.myCheckHeightConeOnCollisionKeepHit = other.myCheckHeightConeOnCollisionKeepHit;\r\n this.myHeightCheckStepAmountMovement = other.myHeightCheckStepAmountMovement;\r\n this.myHeightCheckStepAmountPosition = other.myHeightCheckStepAmountPosition;\r\n this.myCheckVerticalStraight = other.myCheckVerticalStraight;\r\n this.myCheckVerticalDiagonalRayOutward = other.myCheckVerticalDiagonalRayOutward;\r\n this.myCheckVerticalDiagonalRayInward = other.myCheckVerticalDiagonalRayInward;\r\n this.myCheckVerticalDiagonalBorderOutward = other.myCheckVerticalDiagonalBorderOutward;\r\n this.myCheckVerticalDiagonalBorderInward = other.myCheckVerticalDiagonalBorderInward;\r\n this.myCheckVerticalDiagonalBorderRayOutward = other.myCheckVerticalDiagonalBorderRayOutward;\r\n this.myCheckVerticalDiagonalBorderRayInward = other.myCheckVerticalDiagonalBorderRayInward;\r\n this.myCheckVerticalSearchFartherVerticalHit = other.myCheckVerticalSearchFartherVerticalHit;\r\n\r\n this.myGroundAngleToIgnore = other.myGroundAngleToIgnore;\r\n this.myGroundAngleToIgnoreWithPerceivedAngle = other.myGroundAngleToIgnoreWithPerceivedAngle;\r\n this.myCeilingAngleToIgnore = other.myCeilingAngleToIgnore;\r\n this.myCeilingAngleToIgnoreWithPerceivedAngle = other.myCeilingAngleToIgnoreWithPerceivedAngle;\r\n\r\n this.myHorizontalMovementGroundAngleIgnoreHeight = other.myHorizontalMovementGroundAngleIgnoreHeight;\r\n this.myHorizontalMovementCeilingAngleIgnoreHeight = other.myHorizontalMovementCeilingAngleIgnoreHeight;\r\n this.myHorizontalPositionGroundAngleIgnoreHeight = other.myHorizontalPositionGroundAngleIgnoreHeight;\r\n this.myHorizontalPositionCeilingAngleIgnoreHeight = other.myHorizontalPositionCeilingAngleIgnoreHeight;\r\n\r\n this.myHorizontalMovementGroundAngleIgnoreMaxMovementLeft = other.myHorizontalMovementGroundAngleIgnoreMaxMovementLeft;\r\n this.myHorizontalMovementCeilingAngleIgnoreMaxMovementLeft = other.myHorizontalMovementCeilingAngleIgnoreMaxMovementLeft;\r\n\r\n this.myHeight = other.myHeight;\r\n\r\n this.myComputeGroundInfoEnabled = other.myComputeGroundInfoEnabled;\r\n this.myComputeCeilingInfoEnabled = other.myComputeCeilingInfoEnabled;\r\n this.myDistanceToBeOnGround = other.myDistanceToBeOnGround;\r\n this.myDistanceToComputeGroundInfo = other.myDistanceToComputeGroundInfo;\r\n this.myDistanceToBeOnCeiling = other.myDistanceToBeOnCeiling;\r\n this.myDistanceToComputeCeilingInfo = other.myDistanceToComputeCeilingInfo;\r\n this.myVerticalFixToBeOnGround = other.myVerticalFixToBeOnGround;\r\n this.myVerticalFixToComputeGroundInfo = other.myVerticalFixToComputeGroundInfo;\r\n this.myVerticalFixToBeOnCeiling = other.myVerticalFixToBeOnCeiling;\r\n this.myVerticalFixToComputeCeilingInfo = other.myVerticalFixToComputeCeilingInfo;\r\n this.myGroundIsBaseInsideCollisionCheckEnabled = other.myGroundIsBaseInsideCollisionCheckEnabled;\r\n this.myCeilingIsBaseInsideCollisionCheckEnabled = other.myCeilingIsBaseInsideCollisionCheckEnabled;\r\n this.myIsOnGroundIfInsideHit = other.myIsOnGroundIfInsideHit;\r\n this.myIsOnCeilingIfInsideHit = other.myIsOnCeilingIfInsideHit;\r\n this.myIsOnGroundMaxSurfaceAngle = other.myIsOnGroundMaxSurfaceAngle;\r\n this.myIsOnCeilingMaxSurfaceAngle = other.myIsOnCeilingMaxSurfaceAngle;\r\n this.myFindGroundDistanceMaxOutsideDistance = other.myFindGroundDistanceMaxOutsideDistance;\r\n this.myFindGroundDistanceMaxInsideDistance = other.myFindGroundDistanceMaxInsideDistance;\r\n this.myFindCeilingDistanceMaxOutsideDistance = other.myFindCeilingDistanceMaxOutsideDistance;\r\n this.myFindCeilingDistanceMaxInsideDistance = other.myFindCeilingDistanceMaxInsideDistance;\r\n this.myCollectGroundCollisionHitOutsideDistance = other.myCollectGroundCollisionHitOutsideDistance;\r\n this.myCollectGroundCollisionHitInsideDistance = other.myCollectGroundCollisionHitInsideDistance;\r\n this.myCollectCeilingCollisionHitOutsideDistance = other.myCollectCeilingCollisionHitOutsideDistance;\r\n this.myCollectCeilingCollisionHitInsideDistance = other.myCollectCeilingCollisionHitInsideDistance;\r\n\r\n this.myAllowGroundSteepFix = other.myAllowGroundSteepFix;\r\n this.myAllowCeilingSteepFix = other.myAllowCeilingSteepFix;\r\n this.myMustStayOnGround = other.myMustStayOnGround;\r\n this.myMustStayOnCeiling = other.myMustStayOnCeiling;\r\n this.myMustStayOnValidGroundAngleDownhill = other.myMustStayOnValidGroundAngleDownhill;\r\n this.myMustStayOnValidCeilingAngleDownhill = other.myMustStayOnValidCeilingAngleDownhill;\r\n this.myRegatherGroundInfoOnSurfaceCheckFail = other.myRegatherGroundInfoOnSurfaceCheckFail;\r\n this.myRegatherCeilingInfoOnSurfaceCheckFail = other.myRegatherCeilingInfoOnSurfaceCheckFail;\r\n this.myMustStayBelowGroundAngleDownhill = other.myMustStayBelowGroundAngleDownhill;\r\n this.myMustStayBelowCeilingAngleDownhill = other.myMustStayBelowCeilingAngleDownhill;\r\n this.myMustStayBelowIgnorableGroundAngleDownhill = other.myMustStayBelowIgnorableGroundAngleDownhill;\r\n this.myMustStayBelowIgnorableCeilingAngleDownhill = other.myMustStayBelowIgnorableCeilingAngleDownhill;\r\n this.myMovementMustStayOnGroundHitAngle = other.myMovementMustStayOnGroundHitAngle;\r\n this.myMovementMustStayOnCeilingHitAngle = other.myMovementMustStayOnCeilingHitAngle;\r\n\r\n this.myTeleportMustBeOnIgnorableGroundAngle = other.myTeleportMustBeOnIgnorableGroundAngle;\r\n this.myCheckTransformMustBeOnIgnorableGroundAngle = other.myCheckTransformMustBeOnIgnorableGroundAngle;\r\n this.myTeleportMustBeOnIgnorableCeilingAngle = other.myTeleportMustBeOnIgnorableCeilingAngle;\r\n this.myCheckTransformMustBeOnIgnorableCeilingAngle = other.myCheckTransformMustBeOnIgnorableCeilingAngle;\r\n\r\n this.myTeleportMustBeOnGroundAngle = other.myTeleportMustBeOnGroundAngle;\r\n this.myCheckTransformMustBeOnGroundAngle = other.myCheckTransformMustBeOnGroundAngle;\r\n this.myTeleportMustBeOnCeilingAngle = other.myTeleportMustBeOnCeilingAngle;\r\n this.myCheckTransformMustBeOnCeilingAngle = other.myCheckTransformMustBeOnCeilingAngle;\r\n\r\n this.myTeleportMustBeOnGround = other.myTeleportMustBeOnGround;\r\n this.myCheckTransformMustBeOnGround = other.myCheckTransformMustBeOnGround;\r\n this.myTeleportMustBeOnCeiling = other.myTeleportMustBeOnCeiling;\r\n this.myCheckTransformMustBeOnCeiling = other.myCheckTransformMustBeOnCeiling;\r\n\r\n this.mySlidingEnabled = other.mySlidingEnabled;\r\n this.mySlidingHorizontalMovementCheckBetterNormal = other.mySlidingHorizontalMovementCheckBetterNormal;\r\n this.mySlidingMaxAttempts = other.mySlidingMaxAttempts;\r\n this.mySlidingCheckBothDirections = other.mySlidingCheckBothDirections;\r\n this.mySlidingFlickeringPreventionType = other.mySlidingFlickeringPreventionType;\r\n this.mySlidingFlickeringPreventionCheckOnlyIfAlreadySliding = other.mySlidingFlickeringPreventionCheckOnlyIfAlreadySliding;\r\n this.mySlidingFlickerPreventionCheckAnywayCounter = other.mySlidingFlickerPreventionCheckAnywayCounter;\r\n\r\n this.mySlidingAdjustSign90Degrees = other.mySlidingAdjustSign90Degrees;\r\n\r\n this.myHorizontalBlockLayerFlags.copy(other.myHorizontalBlockLayerFlags);\r\n this.myHorizontalObjectsToIgnore.pp_copy(other.myHorizontalObjectsToIgnore);\r\n this.myHorizontalBlockColliderType = other.myHorizontalBlockColliderType;\r\n\r\n this.myVerticalBlockLayerFlags.copy(other.myVerticalBlockLayerFlags);\r\n this.myVerticalObjectsToIgnore.pp_copy(other.myVerticalObjectsToIgnore);\r\n this.myVerticalBlockColliderType = other.myVerticalBlockColliderType;\r\n\r\n this.myExtraMovementCheckCallback = other.myExtraMovementCheckCallback;\r\n this.myExtraTeleportCheckCallback = other.myExtraTeleportCheckCallback;\r\n this.myExtraCheckTransformCheckCallback = other.myExtraCheckTransformCheckCallback;\r\n\r\n this.myDebugEnabled = other.myDebugEnabled;\r\n\r\n this.myDebugHorizontalMovementEnabled = other.myDebugHorizontalMovementEnabled;\r\n this.myDebugHorizontalPositionEnabled = other.myDebugHorizontalPositionEnabled;\r\n this.myDebugVerticalMovementEnabled = other.myDebugVerticalMovementEnabled;\r\n this.myDebugVerticalPositionEnabled = other.myDebugVerticalPositionEnabled;\r\n this.myDebugSlidingEnabled = other.myDebugSlidingEnabled;\r\n this.myDebugGroundInfoEnabled = other.myDebugGroundInfoEnabled;\r\n this.myDebugCeilingInfoEnabled = other.myDebugCeilingInfoEnabled;\r\n this.myDebugRuntimeParamsEnabled = other.myDebugRuntimeParamsEnabled;\r\n this.myDebugMovementEnabled = other.myDebugMovementEnabled;\r\n\r\n this._myInternalSplitMovementMaxStepsDisabled = other._myInternalSplitMovementMaxStepsDisabled;\r\n }\r\n}\r\n\r\nexport class CollisionRuntimeParams {\r\n\r\n constructor() {\r\n this.myOriginalPosition = vec3_create();\r\n this.myNewPosition = vec3_create();\r\n\r\n this.myOriginalHeight = 0;\r\n\r\n this.myOriginalForward = vec3_create();\r\n this.myOriginalUp = vec3_create();\r\n\r\n this.myOffsetUp = vec3_create();\r\n this.myTeleportForward = vec3_create();\r\n\r\n this.myOriginalMovement = vec3_create();\r\n this.myFixedMovement = vec3_create();\r\n\r\n this.myLastValidOriginalHorizontalMovement = vec3_create();\r\n this.myLastValidOriginalVerticalMovement = vec3_create();\r\n this.myLastValidSurfaceAdjustedHorizontalMovement = vec3_create();\r\n this.myLastValidSurfaceAdjustedVerticalMovement = vec3_create();\r\n this.myLastValidEndHorizontalMovement = vec3_create();\r\n this.myLastValidEndVerticalMovement = vec3_create();\r\n\r\n this.myIsOnGround = false;\r\n this.myGroundCollisionHit = new RaycastHit();\r\n this.myGroundAngle = 0;\r\n this.myGroundPerceivedAngle = 0;\r\n this.myGroundNormal = vec3_create();\r\n this.myGroundHitMaxAngle = 0;\r\n this.myGroundHitMaxNormal = vec3_create();\r\n this.myGroundDistance = null;\r\n this.myGroundIsBaseInsideCollision = false;\r\n\r\n this.myIsOnCeiling = false;\r\n this.myCeilingCollisionHit = new RaycastHit();\r\n this.myCeilingAngle = 0;\r\n this.myCeilingPerceivedAngle = 0;\r\n this.myCeilingNormal = vec3_create();\r\n this.myCeilingHitMaxAngle = 0;\r\n this.myCeilingHitMaxNormal = vec3_create();\r\n this.myCeilingDistance = null;\r\n this.myCeilingIsBaseInsideCollision = false;\r\n\r\n this.myHorizontalMovementCanceled = false; // Could add HorizontalMovementCanceledReason\r\n this.myIsCollidingHorizontally = false;\r\n this.myHorizontalCollisionHit = new RaycastHit();\r\n\r\n this.myVerticalMovementCanceled = false;\r\n this.myIsCollidingVertically = false;\r\n this.myVerticalCollisionHit = new RaycastHit();\r\n\r\n this.myHasSnappedOnGround = false;\r\n this.myHasSnappedOnCeiling = false;\r\n this.myHasPoppedOutGround = false;\r\n this.myHasPoppedOutCeiling = false;\r\n this.myHasReducedVerticalMovement = false;\r\n\r\n this.myHorizontalMovementHasAdjustedVerticalMovementOverGroundPerceivedAngleDownhill = false;\r\n this.myHorizontalMovementHasAdjustedVerticalMovementOverGroundPerceivedAngleUphill = false;\r\n this.myVerticalMovementHasAdjustedHorizontalMovementOverGroundAngleDownhill = false;\r\n\r\n this.myHorizontalMovementHasAdjustedVerticalMovementOverCeilingPerceivedAngleDownhill = false;\r\n this.myHorizontalMovementHasAdjustedVerticalMovementOverCeilingPerceivedAngleUphill = false;\r\n this.myVerticalMovementHasAdjustedHorizontalMovementOverCeilingAngleDownhill = false;\r\n\r\n this.myIsSliding = false;\r\n this.myIsSlidingIntoOppositeDirection = false;\r\n this.myIsSlidingFlickerPrevented = false;\r\n this.mySlidingFlickerPreventionCheckAnywayCounter = 0;\r\n this.mySlidingMovementAngle = 0;\r\n this.mySlidingCollisionAngle = 0;\r\n this.mySlidingCollisionHit = new RaycastHit();\r\n this.mySlidingWallNormal = new vec3_create();\r\n this.mySliding90DegreesSign = 0;\r\n this.mySlidingRecompute90DegreesSign = true;\r\n this.myLastValidIsSliding = false;\r\n this.mySlidingPreviousHorizontalMovement = vec3_create();\r\n\r\n this.myOriginalTeleportPosition = vec3_create();\r\n this.myFixedTeleportPosition = vec3_create();\r\n\r\n this.myOriginalPositionCheckPosition = vec3_create();\r\n this.myFixedPositionCheckPosition = vec3_create();\r\n\r\n this.myTeleportCanceled = false;\r\n\r\n this.myIsPositionOk = false;\r\n\r\n this.myIsTeleport = false; // Could be a single bool but not sure if there should be an option and don't want to create an enum for now\r\n this.myIsMove = false;\r\n this.myIsPositionCheck = false;\r\n this.myIsPositionCheckAllowAdjustments = false;\r\n\r\n this.mySplitMovementSteps = 0;\r\n this.mySplitMovementStepsPerformed = 0;\r\n this.mySplitMovementStop = false;\r\n this.mySplitMovementLastStepLongerThanMaxLength = false;\r\n this.mySplitMovementReduced = false;\r\n this.mySplitMovementMovementChecked = vec3_create();\r\n\r\n this.myRealIsOnGround = false;\r\n this.myRealIsOnCeiling = false;\r\n }\r\n\r\n reset() {\r\n this.myOriginalPosition.vec3_zero();\r\n this.myNewPosition.vec3_zero();\r\n\r\n this.myOriginalHeight = 0;\r\n\r\n this.myOriginalForward.vec3_zero();\r\n this.myOriginalUp.vec3_zero();\r\n\r\n this.myOffsetUp.vec3_zero();\r\n this.myTeleportForward.vec3_zero();\r\n\r\n this.myOriginalMovement.vec3_zero();\r\n this.myFixedMovement.vec3_zero();\r\n\r\n this.myLastValidOriginalHorizontalMovement.vec3_zero();\r\n this.myLastValidOriginalVerticalMovement.vec3_zero();\r\n this.myLastValidSurfaceAdjustedHorizontalMovement.vec3_zero();\r\n this.myLastValidSurfaceAdjustedVerticalMovement.vec3_zero();\r\n this.myLastValidEndHorizontalMovement.vec3_zero();\r\n this.myLastValidEndVerticalMovement.vec3_zero();\r\n\r\n\r\n this.myIsOnGround = false;\r\n this.myGroundCollisionHit.reset();\r\n this.myGroundAngle = 0;\r\n this.myGroundPerceivedAngle = 0;\r\n this.myGroundNormal.vec3_zero();\r\n this.myGroundHitMaxAngle = 0;\r\n this.myGroundHitMaxNormal.vec3_zero();\r\n this.myGroundDistance = null;\r\n this.myGroundIsBaseInsideCollision = false;\r\n\r\n this.myIsOnCeiling = false;\r\n this.myCeilingCollisionHit.reset();\r\n this.myCeilingAngle = 0;\r\n this.myCeilingPerceivedAngle = 0;\r\n this.myCeilingNormal.vec3_zero();\r\n this.myCeilingHitMaxAngle = 0;\r\n this.myCeilingHitMaxNormal.vec3_zero();\r\n this.myCeilingDistance = null;\r\n this.myCeilingIsBaseInsideCollision = false;\r\n\r\n this.myHorizontalMovementCanceled = false;\r\n this.myIsCollidingHorizontally = false;\r\n this.myHorizontalCollisionHit.reset();\r\n\r\n this.myVerticalMovementCanceled = false;\r\n this.myIsCollidingVertically = false;\r\n this.myVerticalCollisionHit.reset();\r\n\r\n this.myHasSnappedOnGround = false;\r\n this.myHasSnappedOnCeiling = false;\r\n this.myHasPoppedOutGround = false;\r\n this.myHasPoppedOutCeiling = false;\r\n this.myHasReducedVerticalMovement = false;\r\n\r\n this.myHorizontalMovementHasAdjustedVerticalMovementOverGroundPerceivedAngleDownhill = false;\r\n this.myHorizontalMovementHasAdjustedVerticalMovementOverGroundPerceivedAngleUphill = false;\r\n this.myVerticalMovementHasAdjustedHorizontalMovementOverGroundAngleDownhill = false;\r\n\r\n this.myHorizontalMovementHasAdjustedVerticalMovementOverCeilingPerceivedAngleDownhill = false;\r\n this.myHorizontalMovementHasAdjustedVerticalMovementOverCeilingPerceivedAngleUphill = false;\r\n this.myVerticalMovementHasAdjustedHorizontalMovementOverCeilingAngleDownhill = false;\r\n\r\n this.myIsSliding = false;\r\n this.myIsSlidingIntoOppositeDirection = false;\r\n this.myIsSlidingFlickerPrevented = false;\r\n this.mySlidingFlickerPreventionCheckAnywayCounter = 0;\r\n this.mySlidingMovementAngle = 0;\r\n this.mySlidingCollisionAngle = 0;\r\n this.mySlidingCollisionHit.reset();\r\n this.mySliding90DegreesSign = 0;\r\n this.mySlidingRecompute90DegreesSign = true;\r\n this.myLastValidIsSliding = false;\r\n this.mySlidingPreviousHorizontalMovement.vec3_zero();\r\n this.mySlidingWallNormal.vec3_zero();\r\n\r\n this.myOriginalTeleportPosition.vec3_zero();\r\n this.myFixedTeleportPosition.vec3_zero();\r\n\r\n this.myOriginalPositionCheckPosition.vec3_zero();\r\n this.myFixedPositionCheckPosition.vec3_zero();\r\n\r\n this.myTeleportCanceled = false;\r\n\r\n this.myIsPositionOk = false;\r\n\r\n this.myIsTeleport = false;\r\n this.myIsMove = false;\r\n this.myIsPositionCheck = false;\r\n this.myIsPositionCheckAllowAdjustments = false;\r\n\r\n this.mySplitMovementSteps = 0;\r\n this.mySplitMovementStepsPerformed = 0;\r\n this.mySplitMovementStop = false;\r\n this.mySplitMovementLastStepLongerThanMaxLength = false;\r\n this.mySplitMovementReduced = false;\r\n this.mySplitMovementMovementChecked.vec3_zero();\r\n\r\n this.myRealIsOnGround = false;\r\n this.myRealIsOnCeiling = false;\r\n }\r\n\r\n copy(other) {\r\n if (this == other) return;\r\n\r\n this.myOriginalPosition.vec3_copy(other.myOriginalPosition);\r\n this.myNewPosition.vec3_copy(other.myNewPosition);\r\n\r\n this.myOriginalHeight = other.myOriginalHeight;\r\n\r\n this.myOriginalForward.vec3_copy(other.myOriginalForward);\r\n this.myOriginalUp.vec3_copy(other.myOriginalUp);\r\n\r\n this.myOffsetUp.vec3_copy(other.myOffsetUp);\r\n this.myTeleportForward.vec3_copy(other.myTeleportForward);\r\n\r\n this.myOriginalMovement.vec3_copy(other.myOriginalMovement);\r\n this.myFixedMovement.vec3_copy(other.myFixedMovement);\r\n\r\n this.myLastValidOriginalHorizontalMovement.vec3_copy(other.myLastValidOriginalHorizontalMovement);\r\n this.myLastValidOriginalVerticalMovement.vec3_copy(other.myLastValidOriginalVerticalMovement);\r\n this.myLastValidSurfaceAdjustedHorizontalMovement.vec3_copy(other.myLastValidSurfaceAdjustedHorizontalMovement);\r\n this.myLastValidSurfaceAdjustedVerticalMovement.vec3_copy(other.myLastValidSurfaceAdjustedVerticalMovement);\r\n this.myLastValidEndHorizontalMovement.vec3_copy(other.myLastValidEndHorizontalMovement);\r\n this.myLastValidEndVerticalMovement.vec3_copy(other.myLastValidEndVerticalMovement);\r\n\r\n this.myIsOnGround = other.myIsOnGround;\r\n this.myGroundCollisionHit.copy(other.myGroundCollisionHit);\r\n this.myGroundAngle = other.myGroundAngle;\r\n this.myGroundPerceivedAngle = other.myGroundPerceivedAngle;\r\n this.myGroundNormal.vec3_copy(other.myGroundNormal);\r\n this.myGroundHitMaxAngle = other.myGroundHitMaxAngle;\r\n this.myGroundHitMaxNormal.vec3_copy(other.myGroundHitMaxNormal);\r\n this.myGroundDistance = other.myGroundDistance;\r\n this.myGroundIsBaseInsideCollision = other.myGroundIsBaseInsideCollision;\r\n\r\n this.myIsOnCeiling = other.myIsOnCeiling;\r\n this.myCeilingCollisionHit.copy(other.myCeilingCollisionHit);\r\n this.myCeilingAngle = other.myCeilingAngle;\r\n this.myCeilingPerceivedAngle = other.myCeilingPerceivedAngle;\r\n this.myCeilingNormal.vec3_copy(other.myCeilingNormal);\r\n this.myCeilingHitMaxAngle = other.myCeilingHitMaxAngle;\r\n this.myCeilingHitMaxNormal.vec3_copy(other.myCeilingHitMaxNormal);\r\n this.myCeilingDistance = other.myCeilingDistance;\r\n this.myCeilingIsBaseInsideCollision = other.myCeilingIsBaseInsideCollision;\r\n\r\n this.myHorizontalMovementCanceled = other.myHorizontalMovementCanceled;\r\n this.myIsCollidingHorizontally = other.myIsCollidingHorizontally;\r\n this.myHorizontalCollisionHit.copy(other.myHorizontalCollisionHit);\r\n\r\n this.myVerticalMovementCanceled = other.myVerticalMovementCanceled;\r\n this.myIsCollidingVertically = other.myIsCollidingVertically;\r\n this.myVerticalCollisionHit.copy(other.myVerticalCollisionHit);\r\n\r\n this.myHasSnappedOnGround = other.myHasSnappedOnGround;\r\n this.myHasSnappedOnCeiling = other.myHasSnappedOnCeiling;\r\n this.myHasPoppedOutGround = other.myHasPoppedOutGround;\r\n this.myHasPoppedOutCeiling = other.myHasPoppedOutCeiling;\r\n this.myHasReducedVerticalMovement = other.myHasReducedVerticalMovement;\r\n\r\n this.myHorizontalMovementHasAdjustedVerticalMovementOverGroundPerceivedAngleDownhill = other.myHorizontalMovementHasAdjustedVerticalMovementOverGroundPerceivedAngleDownhill;\r\n this.myHorizontalMovementHasAdjustedVerticalMovementOverGroundPerceivedAngleUphill = other.myHorizontalMovementHasAdjustedVerticalMovementOverGroundPerceivedAngleUphill;\r\n this.myVerticalMovementHasAdjustedHorizontalMovementOverGroundAngleDownhill = other.myVerticalMovementHasAdjustedHorizontalMovementOverGroundAngleDownhill;\r\n\r\n this.myHorizontalMovementHasAdjustedVerticalMovementOverCeilingPerceivedAngleDownhill = other.myHorizontalMovementHasAdjustedVerticalMovementOverCeilingPerceivedAngleDownhill;\r\n this.myHorizontalMovementHasAdjustedVerticalMovementOverCeilingPerceivedAngleUphill = other.myHorizontalMovementHasAdjustedVerticalMovementOverCeilingPerceivedAngleUphill;\r\n this.myVerticalMovementHasAdjustedHorizontalMovementOverCeilingAngleDownhill = other.myVerticalMovementHasAdjustedHorizontalMovementOverCeilingAngleDownhill;\r\n\r\n this.myIsSliding = other.myIsSliding;\r\n this.myIsSlidingIntoOppositeDirection = other.myIsSlidingIntoOppositeDirection;\r\n this.myIsSlidingFlickerPrevented = other.myIsSlidingFlickerPrevented;\r\n this.mySlidingFlickerPreventionCheckAnywayCounter = other.mySlidingFlickerPreventionCheckAnywayCounter;\r\n this.mySlidingMovementAngle = other.mySlidingMovementAngle;\r\n this.mySlidingCollisionAngle = other.mySlidingCollisionAngle;\r\n this.mySlidingCollisionHit.copy(other.mySlidingCollisionHit);\r\n this.mySliding90DegreesSign = other.mySliding90DegreesSign;\r\n this.mySlidingRecompute90DegreesSign = other.mySlidingRecompute90DegreesSign;\r\n this.myLastValidIsSliding = other.myLastValidIsSliding;\r\n this.mySlidingPreviousHorizontalMovement.vec3_copy(other.mySlidingPreviousHorizontalMovement);\r\n this.mySlidingWallNormal.vec3_copy(other.mySlidingWallNormal);\r\n\r\n this.myOriginalTeleportPosition.vec3_copy(other.myOriginalTeleportPosition);\r\n this.myFixedTeleportPosition.vec3_copy(other.myFixedTeleportPosition);\r\n this.myTeleportCanceled = other.myTeleportCanceled;\r\n\r\n this.myIsPositionOk = other.myIsPositionOk;\r\n\r\n this.myOriginalPositionCheckPosition.vec3_copy(other.myOriginalPositionCheckPosition);\r\n this.myFixedPositionCheckPosition.vec3_copy(other.myFixedPositionCheckPosition);\r\n\r\n this.myIsTeleport = other.myIsTeleport;\r\n this.myIsMove = other.myIsMove;\r\n this.myIsPositionCheck = other.myIsPositionCheck;\r\n this.myIsPositionCheckAllowAdjustments = other.myIsPositionCheckAllowAdjustments;\r\n\r\n this.mySplitMovementSteps = other.mySplitMovementSteps;\r\n this.mySplitMovementStepsPerformed = other.mySplitMovementStepsPerformed;\r\n this.mySplitMovementStop = other.mySplitMovementStop;\r\n this.mySplitMovementLastStepLongerThanMaxLength = other.mySplitMovementLastStepLongerThanMaxLength;\r\n this.mySplitMovementReduced = other.mySplitMovementReduced;\r\n this.mySplitMovementMovementChecked.vec3_copy(other.mySplitMovementMovementChecked);\r\n\r\n this.myRealIsOnGround = other.myRealIsOnGround;\r\n this.myRealIsOnCeiling = other.myRealIsOnCeiling;\r\n }\r\n}", "import { RaycastHit, RaycastParams, RaycastResults } from \"../../../../../../cauldron/physics/physics_raycast_params.js\";\r\nimport { PhysicsUtils } from \"../../../../../../cauldron/physics/physics_utils.js\";\r\nimport { quat2_create, vec3_create, vec4_create } from \"../../../../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Globals } from \"../../../../../../pp/globals.js\";\r\nimport { CollisionRuntimeParams } from \"./collision_params.js\";\r\n\r\nexport class CollisionCheckBase {\r\n\r\n constructor(engine = Globals.getMainEngine()) {\r\n this._myEngine = engine;\r\n\r\n this._myRaycastParams = new RaycastParams(Globals.getPhysics(this._myEngine));\r\n this._myRaycastResult = new RaycastResults();\r\n this._myFixRaycastResult = new RaycastResults();\r\n\r\n this._myBackupRaycastHit = new RaycastHit();\r\n\r\n this._myPrevCollisionRuntimeParams = new CollisionRuntimeParams();\r\n\r\n this._mySlidingCollisionRuntimeParams = new CollisionRuntimeParams();\r\n this._myCheckBetterSlidingNormalCollisionRuntimeParams = new CollisionRuntimeParams();\r\n this._myInternalSlidingCollisionRuntimeParams = new CollisionRuntimeParams();\r\n this._mySlidingFlickeringFixCollisionRuntimeParams = new CollisionRuntimeParams();\r\n this._mySlidingFlickeringFixSlidingCollisionRuntimeParams = new CollisionRuntimeParams();\r\n this._mySlidingOppositeDirectionCollisionRuntimeParams = new CollisionRuntimeParams();\r\n this._mySlidingOnVerticalCheckCollisionRuntimeParams = new CollisionRuntimeParams();\r\n\r\n this._myCollisionCheckDisabled = false;\r\n\r\n this._myDebugEnabled = false;\r\n\r\n this._myTotalRaycasts = 0;\r\n }\r\n\r\n isCollisionCheckDisabled() {\r\n return this._myCollisionCheckDisabled;\r\n }\r\n\r\n setCollisionCheckDisabled(collisionCheckDisabled) {\r\n this._myCollisionCheckDisabled = collisionCheckDisabled;\r\n }\r\n\r\n _raycastAndDebug(origin, direction, distance, ignoreHitsInsideCollision, isHorizontal, collisionCheckParams, collisionRuntimeParams) {\r\n // Implemented outside class definition\r\n }\r\n\r\n _setRuntimeParamsForMoveCollisionCheckDisabled(movement, transformQuat, collisionCheckParams, collisionRuntimeParams) {\r\n // Implemented outside class definition\r\n }\r\n\r\n _setRuntimeParamsForTeleportCollisionCheckDisabled(position, transformQuat, collisionCheckParams, collisionRuntimeParams) {\r\n // Implemented outside class definition\r\n }\r\n\r\n _setRuntimeParamsForPositionCheckCollisionCheckDisabled(allowFix, transformQuat, collisionCheckParams, collisionRuntimeParams) {\r\n // Implemented outside class definition\r\n }\r\n\r\n _setRuntimeParamsForUpdateSurfaceInfoCollisionCheckDisabled(transformQuat, collisionCheckParams, collisionRuntimeParams) {\r\n // Implemented outside class definition\r\n }\r\n\r\n _debugMovement(movement, fixedMovement, feetPosition, up, collisionCheckParams) {\r\n let originalHorizontalMovement = movement.vec3_removeComponentAlongAxis(up);\r\n\r\n let horizontalMovement = fixedMovement.vec3_removeComponentAlongAxis(up);\r\n let verticalMovement = fixedMovement.vec3_componentAlongAxis(up);\r\n\r\n let feetPositionPlusOffset = feetPosition.vec3_add(up.vec3_scale(collisionCheckParams.myDistanceFromFeetToIgnore + 0.001));\r\n\r\n if (!originalHorizontalMovement.vec3_isZero()) {\r\n originalHorizontalMovement.vec3_normalize(originalHorizontalMovement);\r\n\r\n Globals.getDebugVisualManager(this._myEngine).drawArrow(0, feetPositionPlusOffset, originalHorizontalMovement, 0.2, vec4_create(0.5, 0.5, 1, 1));\r\n }\r\n\r\n if (!horizontalMovement.vec3_isZero()) {\r\n horizontalMovement.vec3_normalize(horizontalMovement);\r\n\r\n Globals.getDebugVisualManager(this._myEngine).drawArrow(0, feetPositionPlusOffset, horizontalMovement, 0.2, vec4_create(0, 0, 1, 1));\r\n }\r\n\r\n if (!verticalMovement.vec3_isZero()) {\r\n verticalMovement.vec3_normalize(verticalMovement);\r\n\r\n Globals.getDebugVisualManager(this._myEngine).drawArrow(0, feetPosition, verticalMovement, 0.2, vec4_create(0, 0, 1, 1));\r\n }\r\n }\r\n\r\n _debugRuntimeParams(collisionRuntimeParams) {\r\n if (collisionRuntimeParams.myHorizontalCollisionHit.isValid()) {\r\n Globals.getDebugVisualManager(this._myEngine).drawArrow(0,\r\n collisionRuntimeParams.myHorizontalCollisionHit.myPosition,\r\n collisionRuntimeParams.myHorizontalCollisionHit.myNormal, 0.2, vec4_create(1, 0, 0, 1));\r\n }\r\n\r\n if (collisionRuntimeParams.mySlidingCollisionHit.isValid()) {\r\n Globals.getDebugVisualManager(this._myEngine).drawArrow(0,\r\n collisionRuntimeParams.mySlidingCollisionHit.myPosition,\r\n collisionRuntimeParams.mySlidingCollisionHit.myNormal, 0.2, vec4_create(1, 0, 0, 1));\r\n }\r\n\r\n if (collisionRuntimeParams.myVerticalCollisionHit.isValid()) {\r\n Globals.getDebugVisualManager(this._myEngine).drawArrow(0,\r\n collisionRuntimeParams.myVerticalCollisionHit.myPosition,\r\n collisionRuntimeParams.myVerticalCollisionHit.myNormal, 0.2, vec4_create(1, 0, 0, 1));\r\n }\r\n }\r\n}\r\n\r\n\r\n\r\n// IMPLEMENTATION\r\n\r\nCollisionCheckBase.prototype._raycastAndDebug = function () {\r\n let tempRaycastResult = new RaycastResults();\r\n return function _raycastAndDebug(origin, direction, distance, ignoreHitsInsideCollision, isHorizontal, collisionCheckParams, collisionRuntimeParams) {\r\n this._myRaycastParams.myOrigin.vec3_copy(origin);\r\n this._myRaycastParams.myDirection.vec3_copy(direction);\r\n this._myRaycastParams.myDistance = distance;\r\n\r\n if (isHorizontal) {\r\n this._myRaycastParams.myBlockLayerFlags.copy(collisionCheckParams.myHorizontalBlockLayerFlags);\r\n this._myRaycastParams.myObjectsToIgnore = collisionCheckParams.myHorizontalObjectsToIgnore;\r\n this._myRaycastParams.myBlockColliderType = collisionCheckParams.myHorizontalBlockColliderType;\r\n } else {\r\n this._myRaycastParams.myBlockLayerFlags.copy(collisionCheckParams.myVerticalBlockLayerFlags);\r\n this._myRaycastParams.myObjectsToIgnore = collisionCheckParams.myVerticalObjectsToIgnore;\r\n this._myRaycastParams.myBlockColliderType = collisionCheckParams.myVerticalBlockColliderType;\r\n }\r\n\r\n this._myRaycastParams.myIgnoreHitsInsideCollision = ignoreHitsInsideCollision;\r\n\r\n let raycastResult = null;\r\n\r\n let raycastPerformanceDebugEnabled = false;\r\n if (raycastPerformanceDebugEnabled && Globals.isDebugEnabled(this._myEngine)) {\r\n // Quick debug to remove raycasts and/or let all raycasts fail\r\n\r\n let raycastAlways = false;\r\n if (raycastAlways || !this._myRaycastResult.isColliding()) {\r\n raycastResult = PhysicsUtils.raycast(this._myRaycastParams, tempRaycastResult);\r\n }\r\n\r\n if (!this._myRaycastResult.isColliding() && tempRaycastResult.isColliding()) {\r\n this._myRaycastResult.copy(tempRaycastResult);\r\n }\r\n\r\n raycastResult = this._myRaycastResult;\r\n } else {\r\n raycastResult = PhysicsUtils.raycast(this._myRaycastParams, this._myRaycastResult);\r\n }\r\n\r\n\r\n this._myTotalRaycasts++;\r\n\r\n if (this._myDebugEnabled && Globals.isDebugEnabled(this._myEngine)) {\r\n Globals.getDebugVisualManager(this._myEngine).drawRaycast(0, raycastResult);\r\n }\r\n\r\n return raycastResult;\r\n };\r\n}();\r\n\r\nCollisionCheckBase.prototype._setRuntimeParamsForMoveCollisionCheckDisabled = function () {\r\n let transformOffsetLocalQuat = quat2_create();\r\n let offsetTransformQuat = quat2_create();\r\n return function _setRuntimeParamsForMoveCollisionCheckDisabled(movement, transformQuat, collisionCheckParams, collisionRuntimeParams) {\r\n collisionRuntimeParams.reset();\r\n\r\n collisionRuntimeParams.myRealIsOnGround = true;\r\n collisionRuntimeParams.myIsOnGround = true;\r\n collisionRuntimeParams.myGroundCollisionHit.reset();\r\n collisionRuntimeParams.myGroundAngle = 0;\r\n collisionRuntimeParams.myGroundPerceivedAngle = 0;\r\n collisionRuntimeParams.myGroundNormal.vec3_set(0, 1, 0);\r\n collisionRuntimeParams.myGroundHitMaxAngle = collisionRuntimeParams.myGroundAngle;\r\n collisionRuntimeParams.myGroundHitMaxNormal.vec3_copy(collisionRuntimeParams.myGroundNormal);\r\n collisionRuntimeParams.myGroundDistance = 0;\r\n collisionRuntimeParams.myGroundIsBaseInsideCollision = false;\r\n collisionRuntimeParams.myOnGroundDueToBasePartiallyInsideCollision = false;\r\n\r\n collisionRuntimeParams.myRealIsOnCeiling = false;\r\n collisionRuntimeParams.myIsOnCeiling = false;\r\n collisionRuntimeParams.myCeilingCollisionHit.reset();\r\n collisionRuntimeParams.myCeilingAngle = 0;\r\n collisionRuntimeParams.myCeilingPerceivedAngle = 0;\r\n collisionRuntimeParams.myCeilingNormal.vec3_set(0, 1, 0);\r\n collisionRuntimeParams.myCeilingHitMaxAngle = collisionRuntimeParams.myCeilingAngle;\r\n collisionRuntimeParams.myCeilingHitMaxNormal.vec3_copy(collisionRuntimeParams.myCeilingNormal);\r\n collisionRuntimeParams.myCeilingDistance = 0;\r\n collisionRuntimeParams.myCeilingIsBaseInsideCollision = false;\r\n collisionRuntimeParams.myOnCeilingDueToBasePartiallyInsideCollision = false;\r\n\r\n collisionRuntimeParams.mySplitMovementSteps = 1;\r\n collisionRuntimeParams.mySplitMovementStepsPerformed = 1;\r\n collisionRuntimeParams.mySplitMovementStop = false;\r\n collisionRuntimeParams.mySplitMovementMovementChecked.vec3_copy(movement);\r\n\r\n collisionRuntimeParams.myOriginalUp = transformQuat.quat2_getUp(collisionRuntimeParams.myOriginalUp);\r\n collisionRuntimeParams.myOriginalForward = transformQuat.quat2_getForward(collisionRuntimeParams.myOriginalForward);\r\n collisionRuntimeParams.myOriginalPosition = transformQuat.quat2_getPosition(collisionRuntimeParams.myOriginalPosition);\r\n\r\n transformOffsetLocalQuat.quat2_setPositionRotationQuat(collisionCheckParams.myPositionOffsetLocal, collisionCheckParams.myRotationOffsetLocalQuat);\r\n offsetTransformQuat = transformOffsetLocalQuat.quat2_toWorld(transformQuat, offsetTransformQuat);\r\n if (transformQuat.vec_equals(offsetTransformQuat, 0.00001)) {\r\n offsetTransformQuat.quat2_copy(transformQuat);\r\n }\r\n collisionRuntimeParams.myOffsetUp = offsetTransformQuat.quat2_getUp(collisionRuntimeParams.myOffsetUp);\r\n\r\n collisionRuntimeParams.myOriginalHeight = collisionCheckParams.myHeight;\r\n\r\n collisionRuntimeParams.myOriginalMovement.vec3_copy(movement);\r\n collisionRuntimeParams.myFixedMovement.vec3_copy(movement);\r\n\r\n collisionRuntimeParams.myNewPosition = collisionRuntimeParams.myOriginalPosition.vec3_add(collisionRuntimeParams.myFixedMovement, collisionRuntimeParams.myNewPosition);\r\n\r\n collisionRuntimeParams.myIsMove = true;\r\n };\r\n}();\r\n\r\nCollisionCheckBase.prototype._setRuntimeParamsForTeleportCollisionCheckDisabled = function () {\r\n let transformOffsetLocalQuat = quat2_create();\r\n let offsetTransformQuat = quat2_create();\r\n return function _setRuntimeParamsForTeleportCollisionCheckDisabled(position, transformQuat, collisionCheckParams, collisionRuntimeParams) {\r\n collisionRuntimeParams.reset();\r\n\r\n collisionRuntimeParams.myRealIsOnGround = true;\r\n collisionRuntimeParams.myIsOnGround = true;\r\n collisionRuntimeParams.myGroundCollisionHit.reset();\r\n collisionRuntimeParams.myGroundAngle = 0;\r\n collisionRuntimeParams.myGroundPerceivedAngle = 0;\r\n collisionRuntimeParams.myGroundNormal.vec3_set(0, 1, 0);\r\n collisionRuntimeParams.myGroundHitMaxAngle = collisionRuntimeParams.myGroundAngle;\r\n collisionRuntimeParams.myGroundHitMaxNormal.vec3_copy(collisionRuntimeParams.myGroundNormal);\r\n collisionRuntimeParams.myGroundDistance = 0;\r\n collisionRuntimeParams.myGroundIsBaseInsideCollision = false;\r\n collisionRuntimeParams.myOnGroundDueToBasePartiallyInsideCollision = false;\r\n\r\n collisionRuntimeParams.myRealIsOnCeiling = false;\r\n collisionRuntimeParams.myIsOnCeiling = false;\r\n collisionRuntimeParams.myCeilingCollisionHit.reset();\r\n collisionRuntimeParams.myCeilingAngle = 0;\r\n collisionRuntimeParams.myCeilingPerceivedAngle = 0;\r\n collisionRuntimeParams.myCeilingNormal.vec3_set(0, 1, 0);\r\n collisionRuntimeParams.myCeilingHitMaxAngle = collisionRuntimeParams.myCeilingAngle;\r\n collisionRuntimeParams.myCeilingHitMaxNormal.vec3_copy(collisionRuntimeParams.myCeilingNormal);\r\n collisionRuntimeParams.myCeilingDistance = 0;\r\n collisionRuntimeParams.myCeilingIsBaseInsideCollision = false;\r\n collisionRuntimeParams.myOnCeilingDueToBasePartiallyInsideCollision = false;\r\n\r\n collisionRuntimeParams.myOriginalUp = transformQuat.quat2_getUp(collisionRuntimeParams.myOriginalUp);\r\n collisionRuntimeParams.myOriginalForward = transformQuat.quat2_getForward(collisionRuntimeParams.myOriginalForward);\r\n collisionRuntimeParams.myOriginalPosition = transformQuat.quat2_getPosition(collisionRuntimeParams.myOriginalPosition);\r\n\r\n transformOffsetLocalQuat.quat2_setPositionRotationQuat(collisionCheckParams.myPositionOffsetLocal, collisionCheckParams.myRotationOffsetLocalQuat);\r\n offsetTransformQuat = transformOffsetLocalQuat.quat2_toWorld(transformQuat, offsetTransformQuat);\r\n if (transformQuat.vec_equals(offsetTransformQuat, 0.00001)) {\r\n offsetTransformQuat.quat2_copy(transformQuat);\r\n }\r\n collisionRuntimeParams.myOffsetUp = offsetTransformQuat.quat2_getUp(collisionRuntimeParams.myOffsetUp);\r\n\r\n collisionRuntimeParams.myOriginalHeight = collisionCheckParams.myHeight;\r\n\r\n collisionRuntimeParams.myOriginalTeleportPosition.vec3_copy(position);\r\n collisionRuntimeParams.myFixedTeleportPosition.vec3_copy(position);\r\n\r\n collisionRuntimeParams.myNewPosition.vec3_copy(collisionRuntimeParams.myFixedTeleportPosition);\r\n\r\n collisionRuntimeParams.myIsTeleport = true;\r\n };\r\n}();\r\n\r\nCollisionCheckBase.prototype._setRuntimeParamsForPositionCheckCollisionCheckDisabled = function () {\r\n let feetPosition = vec3_create();\r\n return function _setRuntimeParamsForPositionCheckCollisionCheckDisabled(allowFix, transformQuat, collisionCheckParams, collisionRuntimeParams) {\r\n feetPosition = transformQuat.quat2_getPosition(feetPosition);\r\n this._setRuntimeParamsForTeleportCollisionCheckDisabled(feetPosition, transformQuat, collisionCheckParams, collisionRuntimeParams);\r\n\r\n collisionRuntimeParams.myIsPositionOk = true;\r\n collisionRuntimeParams.myIsPositionCheck = true;\r\n\r\n collisionRuntimeParams.myOriginalPositionCheckPosition.vec3_copy(collisionRuntimeParams.myOriginalTeleportPosition);\r\n collisionRuntimeParams.myFixedPositionCheckPosition.vec3_copy(collisionRuntimeParams.myFixedTeleportPosition);\r\n collisionRuntimeParams.myIsPositionCheckAllowAdjustments = allowFix;\r\n\r\n collisionRuntimeParams.myOriginalTeleportPosition.vec3_zero();\r\n collisionRuntimeParams.myFixedTeleportPosition.vec3_zero();\r\n collisionRuntimeParams.myTeleportCanceled = false;\r\n collisionRuntimeParams.myIsTeleport = false;\r\n };\r\n}();\r\n\r\nCollisionCheckBase.prototype._setRuntimeParamsForUpdateSurfaceInfoCollisionCheckDisabled = function () {\r\n return function _setRuntimeParamsForUpdateSurfaceInfoCollisionCheckDisabled(transformQuat, collisionCheckParams, collisionRuntimeParams) {\r\n collisionRuntimeParams.myRealIsOnGround = true;\r\n collisionRuntimeParams.myIsOnGround = true;\r\n collisionRuntimeParams.myGroundCollisionHit.reset();\r\n collisionRuntimeParams.myGroundAngle = 0;\r\n collisionRuntimeParams.myGroundPerceivedAngle = 0;\r\n collisionRuntimeParams.myGroundNormal.vec3_set(0, 1, 0);\r\n collisionRuntimeParams.myGroundHitMaxAngle = collisionRuntimeParams.myGroundAngle;\r\n collisionRuntimeParams.myGroundHitMaxNormal.vec3_copy(collisionRuntimeParams.myGroundNormal);\r\n collisionRuntimeParams.myGroundDistance = 0;\r\n collisionRuntimeParams.myGroundIsBaseInsideCollision = false;\r\n collisionRuntimeParams.myOnGroundDueToBasePartiallyInsideCollision = false;\r\n\r\n collisionRuntimeParams.myRealIsOnCeiling = false;\r\n collisionRuntimeParams.myIsOnCeiling = false;\r\n collisionRuntimeParams.myCeilingCollisionHit.reset();\r\n collisionRuntimeParams.myCeilingAngle = 0;\r\n collisionRuntimeParams.myCeilingPerceivedAngle = 0;\r\n collisionRuntimeParams.myCeilingNormal.vec3_set(0, 1, 0);\r\n collisionRuntimeParams.myCeilingHitMaxAngle = collisionRuntimeParams.myCeilingAngle;\r\n collisionRuntimeParams.myCeilingHitMaxNormal.vec3_copy(collisionRuntimeParams.myCeilingNormal);\r\n collisionRuntimeParams.myCeilingDistance = 0;\r\n collisionRuntimeParams.myCeilingIsBaseInsideCollision = false;\r\n collisionRuntimeParams.myOnCeilingDueToBasePartiallyInsideCollision = false;\r\n };\r\n}();", "import { RaycastHit } from \"../../../../../../cauldron/physics/physics_raycast_params.js\";\r\nimport { quat2_create, vec3_create } from \"../../../../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Globals } from \"../../../../../../pp/globals.js\";\r\nimport { CollisionCheckBase } from \"./collision_check_base.js\";\r\n\r\nexport class CollisionCheckSurface extends CollisionCheckBase {\r\n\r\n updateSurfaceInfo(transformQuat, collisionCheckParams, collisionRuntimeParams) {\r\n if (this.isCollisionCheckDisabled() && Globals.isDebugEnabled(this._myEngine)) {\r\n this._setRuntimeParamsForUpdateSurfaceInfoCollisionCheckDisabled(transformQuat, collisionCheckParams, collisionRuntimeParams);\r\n return;\r\n }\r\n\r\n this._updateSurfaceInfo(transformQuat, collisionCheckParams, collisionRuntimeParams);\r\n }\r\n\r\n computeSurfacePerceivedAngle(surfaceNormal, forward, up, isGround = true) {\r\n // Implemented outside class definition\r\n }\r\n\r\n _updateSurfaceInfo(transformQuat, collisionCheckParams, collisionRuntimeParams) {\r\n // Implemented outside class definition\r\n }\r\n\r\n _postSurfaceCheck(fixedHorizontalMovement, originalVerticalMovement, transformUp, collisionCheckParams, collisionRuntimeParams, previousCollisionRuntimeParams) {\r\n // Implemented outside class definition\r\n }\r\n\r\n _surfaceTooSteep(up, direction, collisionCheckParams, collisionRuntimeParams) {\r\n // Implemented outside class definition\r\n }\r\n\r\n _adjustVerticalMovementWithSurface(horizontalMovement, verticalMovement, up, collisionCheckParams, collisionRuntimeParams, previousCollisionRuntimeParams, outAdjustedVerticalMovement) {\r\n // Implemented outside class definition\r\n }\r\n\r\n _adjustHorizontalMovementWithSurface(horizontalMovement, verticalMovement, up, collisionCheckParams, collisionRuntimeParams, previousCollisionRuntimeParams, outAdjustedHorizontalMovement) {\r\n // Implemented outside class definition\r\n }\r\n\r\n _computeExtraSurfaceVerticalMovement(horizontalMovement, up, collisionCheckParams, collisionRuntimeParams, outExtraSurfaceVerticalMovement) {\r\n // Implemented outside class definition\r\n }\r\n\r\n _gatherSurfaceInfo(feetPosition, height, up, forwardForPerceivedAngle, forwardForVertical, isGround, collisionCheckParams, collisionRuntimeParams) {\r\n // Implemented outside class definition\r\n }\r\n}\r\n\r\n\r\n\r\n// IMPLEMENTATION\r\n\r\nCollisionCheckSurface.prototype._updateSurfaceInfo = function () {\r\n let transformUp = vec3_create();\r\n let transformForward = vec3_create();\r\n let feetPosition = vec3_create();\r\n\r\n let transformOffsetLocalQuat = quat2_create();\r\n let offsetTransformQuat = quat2_create();\r\n\r\n let forwardForPerceivedAngle = vec3_create();\r\n let forwardForVertical = vec3_create();\r\n\r\n let zAxis = vec3_create(0, 0, 1);\r\n let xAxis = vec3_create(1, 0, 0);\r\n return function _updateSurfaceInfo(transformQuat, collisionCheckParams, collisionRuntimeParams) {\r\n transformOffsetLocalQuat.quat2_setPositionRotationQuat(collisionCheckParams.myPositionOffsetLocal, collisionCheckParams.myRotationOffsetLocalQuat);\r\n offsetTransformQuat = transformOffsetLocalQuat.quat2_toWorld(transformQuat, offsetTransformQuat);\r\n if (transformQuat.vec_equals(offsetTransformQuat, 0.00001)) {\r\n offsetTransformQuat.quat2_copy(transformQuat);\r\n }\r\n\r\n transformUp = offsetTransformQuat.quat2_getUp(transformUp);\r\n transformForward = offsetTransformQuat.quat2_getForward(transformForward);\r\n feetPosition = offsetTransformQuat.quat2_getPosition(feetPosition);\r\n\r\n let height = collisionCheckParams.myHeight;\r\n height = height - 0.00001; // This makes it easier to setup things at the same exact height of a character so that it can go under it\r\n if (height < 0.00001) {\r\n height = 0;\r\n }\r\n\r\n forwardForPerceivedAngle.vec3_copy(transformForward);\r\n\r\n forwardForVertical.vec3_copy(collisionCheckParams.myCheckVerticalFixedForward);\r\n if (!collisionCheckParams.myCheckVerticalFixedForwardEnabled) {\r\n forwardForVertical.vec3_copy(transformForward);\r\n } else {\r\n if (collisionCheckParams.myCheckVerticalFixedForward.vec3_isOnAxis(transformUp)) {\r\n if (zAxis.vec3_isOnAxis(transformUp)) {\r\n forwardForVertical.vec3_copy(xAxis);\r\n } else {\r\n forwardForVertical.vec3_copy(zAxis);\r\n }\r\n }\r\n\r\n forwardForVertical = forwardForVertical.vec3_removeComponentAlongAxis(transformUp, forwardForVertical);\r\n forwardForVertical = forwardForVertical.vec3_normalize(forwardForVertical);\r\n\r\n if (forwardForVertical.vec_equals(collisionCheckParams.myCheckVerticalFixedForward, 0.00001)) {\r\n forwardForVertical.vec3_copy(collisionCheckParams.myCheckVerticalFixedForward);\r\n }\r\n }\r\n\r\n if (collisionCheckParams.myComputeGroundInfoEnabled) {\r\n this._gatherSurfaceInfo(feetPosition, height, transformUp, forwardForPerceivedAngle, forwardForVertical, true, collisionCheckParams, collisionRuntimeParams);\r\n }\r\n\r\n if (collisionCheckParams.myComputeCeilingInfoEnabled) {\r\n this._gatherSurfaceInfo(feetPosition, height, transformUp, forwardForPerceivedAngle, forwardForVertical, false, collisionCheckParams, collisionRuntimeParams);\r\n }\r\n };\r\n}();\r\n\r\nCollisionCheckSurface.prototype._postSurfaceCheck = function () {\r\n let horizontalDirection = vec3_create();\r\n return function _postSurfaceCheck(fixedHorizontalMovement, originalVerticalMovement, transformUp, collisionCheckParams, collisionRuntimeParams, previousCollisionRuntimeParams) {\r\n\r\n let isVerticalMovementZero = originalVerticalMovement.vec3_isZero(0.00001);\r\n let isVerticalMovemenDownward = Math.pp_sign(originalVerticalMovement.vec3_lengthSigned(transformUp), -1) < 0;\r\n\r\n let horizontalMovementIsZero = fixedHorizontalMovement.vec3_isZero(0.00001);\r\n horizontalDirection = fixedHorizontalMovement.vec3_normalize(horizontalDirection);\r\n\r\n let groundPerceivedAngle = this.computeSurfacePerceivedAngle(collisionRuntimeParams.myGroundNormal, horizontalDirection, transformUp, true);\r\n let ceilingPerceivedAngle = this.computeSurfacePerceivedAngle(collisionRuntimeParams.myCeilingNormal, horizontalDirection, transformUp, false);\r\n\r\n let mustRemainOnGroundOk = true;\r\n if (collisionCheckParams.myMustStayOnGround) {\r\n if (previousCollisionRuntimeParams.myIsOnGround && !collisionRuntimeParams.myIsOnGround && (isVerticalMovementZero || isVerticalMovemenDownward)) {\r\n mustRemainOnGroundOk = false;\r\n }\r\n }\r\n\r\n let mustRemainOnCeilingOk = true;\r\n if (collisionCheckParams.myMustStayOnCeiling) {\r\n if (previousCollisionRuntimeParams.myIsOnCeiling && !collisionRuntimeParams.myIsOnCeiling && (isVerticalMovementZero || isVerticalMovemenDownward)) {\r\n mustRemainOnCeilingOk = false;\r\n }\r\n }\r\n\r\n let mustStayBelowGroundAngleOk = true;\r\n if (collisionCheckParams.myMustStayBelowGroundAngleDownhill != null || collisionCheckParams.myMustStayBelowIgnorableGroundAngleDownhill) {\r\n let minAngle = null;\r\n if (!collisionCheckParams.myMustStayBelowIgnorableGroundAngleDownhill) {\r\n minAngle = collisionCheckParams.myMustStayBelowGroundAngleDownhill;\r\n } else if (collisionCheckParams.myMustStayBelowGroundAngleDownhill == null) {\r\n minAngle = collisionCheckParams.myGroundAngleToIgnore;\r\n } else {\r\n minAngle = Math.min(collisionCheckParams.myMustStayBelowGroundAngleDownhill, collisionCheckParams.myGroundAngleToIgnore);\r\n }\r\n\r\n if (!horizontalMovementIsZero && groundPerceivedAngle < 0 && previousCollisionRuntimeParams.myIsOnGround &&\r\n previousCollisionRuntimeParams.myGroundAngle <= minAngle &&\r\n collisionRuntimeParams.myIsOnGround && collisionRuntimeParams.myGroundAngle > minAngle + 0.0001) {\r\n mustStayBelowGroundAngleOk = false;\r\n }\r\n }\r\n\r\n let mustStayBelowCeilingAngleOk = true;\r\n if (collisionCheckParams.myMustStayBelowCeilingAngleDownhill != null || collisionCheckParams.myMustStayBelowIgnorableCeilingAngleDownhill) {\r\n let minAngle = null;\r\n if (!collisionCheckParams.myMustStayBelowIgnorableCeilingAngleDownhill) {\r\n minAngle = collisionCheckParams.myMustStayBelowCeilingAngleDownhill;\r\n } else if (collisionCheckParams.myMustStayBelowCeilingAngleDownhill == null) {\r\n minAngle = collisionCheckParams.myCeilingAngleToIgnore;\r\n } else {\r\n minAngle = Math.min(collisionCheckParams.myMustStayBelowCeilingAngleDownhill, collisionCheckParams.myCeilingAngleToIgnore);\r\n }\r\n\r\n if (!horizontalMovementIsZero && groundPerceivedAngle < 0 && previousCollisionRuntimeParams.myIsOnCeiling &&\r\n previousCollisionRuntimeParams.myCeilingAngle <= minAngle &&\r\n collisionRuntimeParams.myIsOnCeiling && collisionRuntimeParams.myCeilingAngle > minAngle + 0.0001) {\r\n mustStayBelowCeilingAngleOk = false;\r\n }\r\n }\r\n\r\n let mustStayOnGroundHitAngleOk = true;\r\n if (collisionCheckParams.myMovementMustStayOnGroundHitAngle != null) {\r\n if (!horizontalMovementIsZero && previousCollisionRuntimeParams.myIsOnGround &&\r\n previousCollisionRuntimeParams.myGroundHitMaxAngle <= collisionCheckParams.myMovementMustStayOnGroundHitAngle &&\r\n collisionRuntimeParams.myIsOnGround && collisionRuntimeParams.myGroundHitMaxAngle > collisionCheckParams.myMovementMustStayOnGroundHitAngle + 0.0001) {\r\n mustStayOnGroundHitAngleOk = false;\r\n }\r\n }\r\n\r\n let mustStayOnCeilingHitAngleOk = true;\r\n if (collisionCheckParams.myMovementMustStayOnCeilingHitAngle != null) {\r\n if (!horizontalMovementIsZero && previousCollisionRuntimeParams.myIsOnCeiling &&\r\n previousCollisionRuntimeParams.myCeilingHitMaxAngle <= collisionCheckParams.myMovementMustStayOnCeilingHitAngle &&\r\n collisionRuntimeParams.myIsOnCeiling && collisionRuntimeParams.myCeilingHitMaxAngle > collisionCheckParams.myMovementMustStayOnCeilingHitAngle + 0.0001) {\r\n mustStayOnCeilingHitAngleOk = false;\r\n }\r\n }\r\n\r\n let isOnValidGroundAngleUphill = true;\r\n let isOnValidGroundAngleDownhill = true;\r\n if (collisionRuntimeParams.myIsOnGround && collisionRuntimeParams.myGroundAngle > collisionCheckParams.myGroundAngleToIgnore + 0.0001) {\r\n if (previousCollisionRuntimeParams.myIsOnGround && !horizontalMovementIsZero) {\r\n if (groundPerceivedAngle > 0) {\r\n isOnValidGroundAngleUphill = false;\r\n if (collisionCheckParams.myGroundAngleToIgnoreWithPerceivedAngle != null &&\r\n collisionRuntimeParams.myGroundAngle <= collisionCheckParams.myGroundAngleToIgnoreWithPerceivedAngle + 0.0001) {\r\n isOnValidGroundAngleUphill = Math.abs(groundPerceivedAngle) <= collisionCheckParams.myGroundAngleToIgnore + 0.0001;\r\n }\r\n } else if (groundPerceivedAngle < 0) {\r\n if (previousCollisionRuntimeParams.myGroundAngle <= collisionCheckParams.myGroundAngleToIgnore + 0.0001) {\r\n if (collisionCheckParams.myMustStayOnValidGroundAngleDownhill) {\r\n isOnValidGroundAngleDownhill = false;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n let isOnValidCeilingAngleUphill = true;\r\n let isOnValidCeilingAngleDownhill = true;\r\n if (collisionRuntimeParams.myIsOnCeiling && collisionRuntimeParams.myCeilingAngle > collisionCheckParams.myCeilingAngleToIgnore + 0.0001) {\r\n if (previousCollisionRuntimeParams.myIsOnCeiling && !horizontalMovementIsZero) {\r\n if (ceilingPerceivedAngle > 0) {\r\n isOnValidCeilingAngleUphill = false;\r\n if (collisionCheckParams.myCeilingAngleToIgnoreWithPerceivedAngle != null &&\r\n collisionRuntimeParams.myCeilingAngle <= collisionCheckParams.myCeilingAngleToIgnoreWithPerceivedAngle + 0.0001) {\r\n isOnValidCeilingAngleUphill = Math.abs(ceilingPerceivedAngle) <= collisionCheckParams.myCeilingAngleToIgnore + 0.0001;\r\n }\r\n } else if (ceilingPerceivedAngle < 0) {\r\n if (previousCollisionRuntimeParams.myCeilingAngle <= collisionCheckParams.myCeilingAngleToIgnore + 0.0001) {\r\n if (collisionCheckParams.myMustStayOnValidCeilingAngleDownhill) {\r\n isOnValidCeilingAngleDownhill = false;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n return mustRemainOnGroundOk && mustRemainOnCeilingOk && mustStayBelowGroundAngleOk && mustStayBelowCeilingAngleOk && mustStayOnGroundHitAngleOk && mustStayOnCeilingHitAngleOk && isOnValidGroundAngleUphill && isOnValidGroundAngleDownhill && isOnValidCeilingAngleUphill && isOnValidCeilingAngleDownhill;\r\n };\r\n}();\r\n\r\nCollisionCheckSurface.prototype._surfaceTooSteep = function () {\r\n let surfaceSteepResults = [false, false];\r\n return function _surfaceTooSteep(up, direction, collisionCheckParams, collisionRuntimeParams) {\r\n let groundTooSteep = false;\r\n let ceilingTooSteep = false;\r\n\r\n if (collisionRuntimeParams.myIsOnGround && collisionRuntimeParams.myGroundAngle > collisionCheckParams.myGroundAngleToIgnore + 0.0001) {\r\n let groundPerceivedAngle = this.computeSurfacePerceivedAngle(\r\n collisionRuntimeParams.myGroundNormal,\r\n direction, up, true);\r\n\r\n groundTooSteep = groundPerceivedAngle > 0;\r\n if (groundTooSteep &&\r\n collisionCheckParams.myGroundAngleToIgnoreWithPerceivedAngle != null &&\r\n collisionRuntimeParams.myGroundAngle <= collisionCheckParams.myGroundAngleToIgnoreWithPerceivedAngle + 0.0001) {\r\n groundTooSteep = Math.abs(groundPerceivedAngle) > collisionCheckParams.myGroundAngleToIgnore + 0.0001;\r\n }\r\n }\r\n\r\n if (!groundTooSteep) {\r\n if (collisionRuntimeParams.myIsOnCeiling && collisionRuntimeParams.myCeilingAngle > collisionCheckParams.myCeilingAngleToIgnore + 0.0001) {\r\n let ceilingPerceivedAngle = this.computeSurfacePerceivedAngle(\r\n collisionRuntimeParams.myCeilingNormal,\r\n direction, up, false);\r\n\r\n ceilingTooSteep = ceilingPerceivedAngle > 0;\r\n if (ceilingTooSteep &&\r\n collisionCheckParams.myCeilingAngleToIgnoreWithPerceivedAngle != null &&\r\n collisionRuntimeParams.myCeilingAngle <= collisionCheckParams.myCeilingAngleToIgnoreWithPerceivedAngle + 0.0001) {\r\n ceilingTooSteep = Math.abs(ceilingPerceivedAngle) > collisionCheckParams.myCeilingAngleToIgnore + 0.0001;\r\n }\r\n }\r\n }\r\n\r\n surfaceSteepResults[0] = groundTooSteep;\r\n surfaceSteepResults[1] = ceilingTooSteep;\r\n return surfaceSteepResults;\r\n };\r\n}();\r\n\r\nCollisionCheckSurface.prototype._adjustVerticalMovementWithSurface = function () {\r\n let horizontalDirection = vec3_create();\r\n let extraVerticalMovement = vec3_create();\r\n return function _adjustVerticalMovementWithSurface(horizontalMovement, verticalMovement, up, collisionCheckParams, collisionRuntimeParams, previousCollisionRuntimeParams, outAdjustedVerticalMovement) {\r\n outAdjustedVerticalMovement.vec3_copy(verticalMovement);\r\n\r\n if (horizontalMovement.vec3_isZero(0.00001)) {\r\n return outAdjustedVerticalMovement;\r\n }\r\n\r\n let extraVerticalLength = 0;\r\n horizontalDirection = horizontalMovement.vec3_normalize(horizontalDirection);\r\n\r\n if (previousCollisionRuntimeParams.myIsOnGround) {\r\n let groundPerceivedAngle = this.computeSurfacePerceivedAngle(\r\n previousCollisionRuntimeParams.myGroundNormal,\r\n horizontalDirection, up, true);\r\n\r\n let groundExtraVerticalLength = horizontalMovement.vec3_length() * Math.tan(Math.pp_toRadians(Math.abs(groundPerceivedAngle)));\r\n groundExtraVerticalLength *= Math.pp_sign(groundPerceivedAngle);\r\n\r\n if (Math.abs(groundExtraVerticalLength) > 0.00001) {\r\n if (groundPerceivedAngle > 0) {\r\n if (collisionCheckParams.myAdjustVerticalMovementWithGroundAngleUphill &&\r\n (collisionCheckParams.myAdjustVerticalMovementWithGroundAngleUphillMaxPerceivedAngle == null || Math.abs(groundPerceivedAngle) <= collisionCheckParams.myAdjustVerticalMovementWithGroundAngleUphillMaxPerceivedAngle) &&\r\n (collisionCheckParams.myAdjustVerticalMovementWithGroundAngleUphillMaxAngle == null || previousCollisionRuntimeParams.myGroundAngle <= collisionCheckParams.myAdjustVerticalMovementWithGroundAngleUphillMaxAngle)) {\r\n extraVerticalLength = groundExtraVerticalLength;\r\n collisionRuntimeParams.myHorizontalMovementHasAdjustedVerticalMovementOverGroundPerceivedAngleUphill = true;\r\n }\r\n } else if (groundPerceivedAngle < 0) {\r\n if (collisionCheckParams.myAdjustVerticalMovementWithGroundAngleDownhill &&\r\n (collisionCheckParams.myAdjustVerticalMovementWithGroundAngleDownhillMaxPerceivedAngle == null || Math.abs(groundPerceivedAngle) <= collisionCheckParams.myAdjustVerticalMovementWithGroundAngleDownhillMaxPerceivedAngle) &&\r\n (collisionCheckParams.myAdjustVerticalMovementWithGroundAngleDownhillMaxAngle == null || previousCollisionRuntimeParams.myGroundAngle <= collisionCheckParams.myAdjustVerticalMovementWithGroundAngleDownhillMaxAngle)) {\r\n extraVerticalLength = groundExtraVerticalLength;\r\n collisionRuntimeParams.myHorizontalMovementHasAdjustedVerticalMovementOverGroundPerceivedAngleDownhill = true;\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (previousCollisionRuntimeParams.myIsOnCeiling) {\r\n let ceilingPerceivedAngle = this.computeSurfacePerceivedAngle(\r\n previousCollisionRuntimeParams.myCeilingNormal,\r\n horizontalDirection, up, false);\r\n\r\n let ceilingExtraVerticalLength = horizontalMovement.vec3_length() * Math.tan(Math.pp_toRadians(Math.abs(ceilingPerceivedAngle)));\r\n ceilingExtraVerticalLength *= Math.pp_sign(ceilingPerceivedAngle);\r\n\r\n if (Math.abs(ceilingExtraVerticalLength) > 0.00001) {\r\n let sameSignThanGround = Math.pp_sign(extraVerticalLength) == Math.pp_sign(ceilingExtraVerticalLength);\r\n if (extraVerticalLength == 0 || (sameSignThanGround && Math.abs(ceilingExtraVerticalLength) > Math.abs(extraVerticalLength))) {\r\n if (ceilingPerceivedAngle > 0) {\r\n if (collisionCheckParams.myAdjustVerticalMovementWithCeilingAngleUphill &&\r\n (collisionCheckParams.myAdjustVerticalMovementWithCeilingAngleUphillMaxPerceivedAngle == null || Math.abs(ceilingPerceivedAngle) <= collisionCheckParams.myAdjustVerticalMovementWithCeilingAngleUphillMaxPerceivedAngle) &&\r\n (collisionCheckParams.myAdjustVerticalMovementWithCeilingAngleUphillMaxAngle == null || previousCollisionRuntimeParams.myCeilingAngle <= collisionCheckParams.myAdjustVerticalMovementWithCeilingAngleUphillMaxAngle)) {\r\n extraVerticalLength = ceilingExtraVerticalLength;\r\n collisionRuntimeParams.myHorizontalMovementHasAdjustedVerticalMovementOverCeilingPerceivedAngleUphill = true;\r\n collisionRuntimeParams.myHorizontalMovementHasAdjustedVerticalMovementOverGroundPerceivedAngleUphill = false;\r\n }\r\n } else if (ceilingPerceivedAngle < 0) {\r\n if (collisionCheckParams.myAdjustVerticalMovementWithCeilingAngleDownhill &&\r\n (collisionCheckParams.myAdjustVerticalMovementWithCeilingAngleDownhillMaxPerceivedAngle == null || Math.abs(ceilingPerceivedAngle) <= collisionCheckParams.myAdjustVerticalMovementWithCeilingAngleDownhillMaxPerceivedAngle) &&\r\n (collisionCheckParams.myAdjustVerticalMovementWithCeilingAngleDownhillMaxAngle == null || previousCollisionRuntimeParams.myCeilingAngle <= collisionCheckParams.myAdjustVerticalMovementWithCeilingAngleDownhillMaxAngle)) {\r\n extraVerticalLength = ceilingExtraVerticalLength;\r\n collisionRuntimeParams.myHorizontalMovementHasAdjustedVerticalMovementOverCeilingPerceivedAngleDownhill = true;\r\n collisionRuntimeParams.myHorizontalMovementHasAdjustedVerticalMovementOverGroundPerceivedAngleDownhill = false;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (Math.abs(extraVerticalLength) > 0.00001) {\r\n let verticalMovementLength = verticalMovement.vec3_lengthSigned(up);\r\n let sameSignThanExtra = Math.pp_sign(extraVerticalLength) == Math.pp_sign(verticalMovementLength);\r\n extraVerticalMovement = up.vec3_scale(extraVerticalLength, extraVerticalMovement);\r\n if (verticalMovement.vec3_isZero(0.00001)) {\r\n outAdjustedVerticalMovement.vec3_copy(extraVerticalMovement);\r\n } else if (sameSignThanExtra) {\r\n outAdjustedVerticalMovement = verticalMovement.vec3_add(extraVerticalMovement, outAdjustedVerticalMovement);\r\n } else if (!sameSignThanExtra && (\r\n collisionRuntimeParams.myHorizontalMovementHasAdjustedVerticalMovementOverGroundPerceivedAngleUphill ||\r\n collisionRuntimeParams.myHorizontalMovementHasAdjustedVerticalMovementOverCeilingPerceivedAngleUphill)) {\r\n // Do not add for downhill, since it means the vertical movement was about to go away from surface and u should not cancel that\r\n outAdjustedVerticalMovement = verticalMovement.vec3_add(extraVerticalMovement, outAdjustedVerticalMovement);\r\n } else {\r\n collisionRuntimeParams.myHorizontalMovementHasAdjustedVerticalMovementOverCeilingPerceivedAngleUphill = false;\r\n collisionRuntimeParams.myHorizontalMovementHasAdjustedVerticalMovementOverGroundPerceivedAngleUphill = false;\r\n collisionRuntimeParams.myHorizontalMovementHasAdjustedVerticalMovementOverCeilingPerceivedAngleDownhill = false;\r\n collisionRuntimeParams.myHorizontalMovementHasAdjustedVerticalMovementOverGroundPerceivedAngleDownhill = false;\r\n }\r\n }\r\n\r\n if (outAdjustedVerticalMovement.vec3_isZero(0.000001)) {\r\n outAdjustedVerticalMovement.vec3_zero();\r\n }\r\n\r\n return outAdjustedVerticalMovement;\r\n };\r\n}();\r\n\r\nCollisionCheckSurface.prototype._adjustHorizontalMovementWithSurface = function () {\r\n let extraHorizontalMovement = vec3_create();\r\n let groundHorizontalDirection = vec3_create();\r\n let ceilingHorizontalDirection = vec3_create();\r\n let scaledCeilingHorizontalDirection = vec3_create();\r\n let scaledCeilingHorizontalDirectionAlongGroundHorizontalDirection = vec3_create();\r\n let scaledCeilingHorizontalDirectionWithoutGroundHorizontalDirection = vec3_create();\r\n return function _adjustHorizontalMovementWithSurface(horizontalMovement, verticalMovement, up, collisionCheckParams, collisionRuntimeParams, previousCollisionRuntimeParams, outAdjustedHorizontalMovement) {\r\n outAdjustedHorizontalMovement.vec3_copy(horizontalMovement);\r\n\r\n if (verticalMovement.vec3_isZero(0.00001)) {\r\n return outAdjustedHorizontalMovement;\r\n }\r\n\r\n let isMovementDownward = !verticalMovement.vec3_isConcordant(up);\r\n\r\n extraHorizontalMovement.vec3_zero();\r\n groundHorizontalDirection.vec3_zero();\r\n\r\n if (previousCollisionRuntimeParams.myIsOnGround) {\r\n groundHorizontalDirection = previousCollisionRuntimeParams.myGroundNormal.vec3_removeComponentAlongAxis(up, groundHorizontalDirection);\r\n if (!groundHorizontalDirection.vec3_isZero(0.00001)) {\r\n groundHorizontalDirection.vec3_normalize(groundHorizontalDirection);\r\n\r\n let groundExtraHorizontalLength = verticalMovement.vec3_length() / Math.tan(Math.pp_toRadians(previousCollisionRuntimeParams.myGroundAngle));\r\n groundExtraHorizontalLength *= (isMovementDownward) ? 1 : -1;\r\n\r\n if (Math.abs(groundExtraHorizontalLength) > 0.00001) {\r\n if (isMovementDownward) {\r\n if (collisionCheckParams.myAdjustHorizontalMovementWithGroundAngleDownhill &&\r\n (collisionCheckParams.myAdjustHorizontalMovementWithGroundAngleDownhillMinAngle == null || previousCollisionRuntimeParams.myGroundAngle >= collisionCheckParams.myAdjustHorizontalMovementWithGroundAngleDownhillMinAngle)) {\r\n extraHorizontalMovement = groundHorizontalDirection.vec3_scale(groundExtraHorizontalLength, extraHorizontalMovement);\r\n collisionRuntimeParams.myVerticalMovementHasAdjustedHorizontalMovementOverGroundAngleDownhill = true;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (previousCollisionRuntimeParams.myIsOnCeiling) {\r\n ceilingHorizontalDirection = previousCollisionRuntimeParams.myCeilingNormal.vec3_removeComponentAlongAxis(up, ceilingHorizontalDirection);\r\n if (!ceilingHorizontalDirection.vec3_isZero(0.00001)) {\r\n ceilingHorizontalDirection.vec3_normalize(ceilingHorizontalDirection);\r\n\r\n let ceilingExtraHorizontalLength = verticalMovement.vec3_length() / Math.tan(Math.pp_toRadians(previousCollisionRuntimeParams.myCeilingAngle));\r\n ceilingExtraHorizontalLength *= (isMovementDownward) ? -1 : 1;\r\n\r\n if (Math.abs(ceilingExtraHorizontalLength) > 0.00001) {\r\n let sameDirectionAsGround = ceilingHorizontalDirection.vec3_isConcordant(groundHorizontalDirection);\r\n if (extraHorizontalMovement.vec3_isZero() || sameDirectionAsGround) {\r\n if (!isMovementDownward) {\r\n if (collisionCheckParams.myAdjustHorizontalMovementWithCeilingAngleDownhill &&\r\n (collisionCheckParams.myAdjustHorizontalMovementWithCeilingAngleDownhillMinAngle == null || previousCollisionRuntimeParams.myCeilingAngle >= collisionCheckParams.myAdjustHorizontalMovementWithCeilingAngleDownhillMinAngle)) {\r\n scaledCeilingHorizontalDirection = ceilingHorizontalDirection.vec3_scale(ceilingExtraHorizontalLength, scaledCeilingHorizontalDirection);\r\n if (!groundHorizontalDirection.vec3_isZero()) {\r\n scaledCeilingHorizontalDirectionWithoutGroundHorizontalDirection = scaledCeilingHorizontalDirection.vec3_removeComponentAlongAxis(scaledCeilingHorizontalDirectionWithoutGroundHorizontalDirection);\r\n scaledCeilingHorizontalDirectionAlongGroundHorizontalDirection = scaledCeilingHorizontalDirection.vec3_componentAlongAxis(scaledCeilingHorizontalDirectionWithoutGroundHorizontalDirection);\r\n\r\n if (scaledCeilingHorizontalDirectionAlongGroundHorizontalDirection.vec3_isFartherAlongAxis(extraHorizontalMovement, groundHorizontalDirection)) {\r\n collisionRuntimeParams.myVerticalMovementHasAdjustedHorizontalMovementOverGroundAngleDownhill = false;\r\n extraHorizontalMovement.vec3_copy(scaledCeilingHorizontalDirection);\r\n collisionRuntimeParams.myVerticalMovementHasAdjustedHorizontalMovementOverCeilingAngleDownhill = true;\r\n } else if (!scaledCeilingHorizontalDirectionWithoutGroundHorizontalDirection.vec3_isZero(0.00001)) {\r\n extraHorizontalMovement = extraHorizontalMovement.vec3_add(scaledCeilingHorizontalDirectionWithoutGroundHorizontalDirection, extraHorizontalMovement);\r\n collisionRuntimeParams.myVerticalMovementHasAdjustedHorizontalMovementOverCeilingAngleDownhill = true;\r\n }\r\n } else {\r\n extraHorizontalMovement.vec3_copy(scaledCeilingHorizontalDirection);\r\n collisionRuntimeParams.myVerticalMovementHasAdjustedHorizontalMovementOverCeilingAngleDownhill = true;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (!extraHorizontalMovement.vec3_isZero()) {\r\n if (horizontalMovement.vec3_isZero(0.00001)) {\r\n outAdjustedHorizontalMovement.vec3_copy(extraHorizontalMovement);\r\n } else if (extraHorizontalMovement.vec3_isConcordant(horizontalMovement)) {\r\n outAdjustedHorizontalMovement = horizontalMovement.vec3_add(extraHorizontalMovement, outAdjustedHorizontalMovement);\r\n } else {\r\n outAdjustedHorizontalMovement = horizontalMovement.vec3_add(extraHorizontalMovement, outAdjustedHorizontalMovement);\r\n }\r\n }\r\n\r\n if (outAdjustedHorizontalMovement.vec3_isZero(0.000001)) {\r\n outAdjustedHorizontalMovement.vec3_zero();\r\n }\r\n\r\n return outAdjustedHorizontalMovement;\r\n };\r\n}();\r\n\r\n// Useless now\r\nCollisionCheckSurface.prototype._computeExtraSurfaceVerticalMovement = function () {\r\n let direction = vec3_create();\r\n let tempVector = vec3_create();\r\n return function _computeExtraSurfaceVerticalMovement(horizontalMovement, up, collisionCheckParams, collisionRuntimeParams, outExtraSurfaceVerticalMovement) {\r\n outExtraSurfaceVerticalMovement.vec3_zero();\r\n\r\n if (!horizontalMovement.vec3_isZero()) {\r\n if (collisionRuntimeParams.myIsOnGround && collisionRuntimeParams.myGroundAngle != 0) {\r\n direction = horizontalMovement.vec3_normalize(direction);\r\n let groundPerceivedAngle = this.computeSurfacePerceivedAngle(\r\n collisionRuntimeParams.myGroundNormal,\r\n direction, up, true);\r\n\r\n let extraVerticalLength = horizontalMovement.vec3_length() * Math.tan(Math.pp_toRadians(Math.abs(groundPerceivedAngle)));\r\n extraVerticalLength *= Math.pp_sign(groundPerceivedAngle);\r\n\r\n if (Math.abs(extraVerticalLength) > 0.00001 && (collisionCheckParams.mySnapOnGroundEnabled || extraVerticalLength > 0)) {\r\n outExtraSurfaceVerticalMovement.vec3_add(up.vec3_scale(extraVerticalLength, tempVector), outExtraSurfaceVerticalMovement);\r\n }\r\n } else if (collisionRuntimeParams.myIsOnCeiling && collisionRuntimeParams.myCeilingAngle != 0) {\r\n direction = horizontalMovement.vec3_normalize(direction);\r\n let ceilingPerceivedAngle = this.computeSurfacePerceivedAngle(\r\n collisionRuntimeParams.myCeilingNormal,\r\n direction, up, false);\r\n\r\n let extraVerticalLength = horizontalMovement.vec3_length() * Math.tan(Math.pp_toRadians(Math.abs(ceilingPerceivedAngle)));\r\n extraVerticalLength *= Math.pp_sign(ceilingPerceivedAngle);\r\n extraVerticalLength *= -1;\r\n\r\n if (Math.abs(extraVerticalLength) > 0.00001 && (collisionCheckParams.mySnapOnCeilingEnabled || extraVerticalLength < 0)) {\r\n outExtraSurfaceVerticalMovement.vec3_add(up.vec3_scale(extraVerticalLength, tempVector), outExtraSurfaceVerticalMovement);\r\n }\r\n }\r\n }\r\n\r\n return outExtraSurfaceVerticalMovement;\r\n };\r\n}();\r\n\r\nCollisionCheckSurface.prototype._gatherSurfaceInfo = function () {\r\n let verticalDirection = vec3_create();\r\n let startOffset = vec3_create();\r\n let endOffset = vec3_create();\r\n let heightOffset = vec3_create();\r\n let smallOffset = vec3_create();\r\n let smallStartPosition = vec3_create();\r\n let smallEndPosition = vec3_create();\r\n let surfaceNormal = vec3_create();\r\n let surfaceHitMaxNormal = vec3_create();\r\n let hitFromCurrentPosition = vec3_create();\r\n let startPosition = vec3_create();\r\n let endPosition = vec3_create();\r\n let direction = vec3_create();\r\n\r\n let surfaceCollisionHit = new RaycastHit();\r\n let surfaceCollisionHitForBaseInsideCollision = new RaycastHit();\r\n return function _gatherSurfaceInfo(feetPosition, height, up, forwardForPerceivedAngle, forwardForVertical, isGround, collisionCheckParams, collisionRuntimeParams) {\r\n this._myDebugEnabled = collisionCheckParams.myDebugEnabled && ((isGround && collisionCheckParams.myDebugGroundInfoEnabled) || (!isGround && collisionCheckParams.myDebugCeilingInfoEnabled));\r\n\r\n let checkPositions = this._getVerticalCheckPositions(feetPosition, up, forwardForVertical, collisionCheckParams, collisionRuntimeParams);\r\n\r\n verticalDirection.vec3_copy(up);\r\n let distanceToBeOnSurface = collisionCheckParams.myDistanceToBeOnGround;\r\n let distanceToComputeSurfaceInfo = collisionCheckParams.myDistanceToComputeGroundInfo;\r\n let distanceToFindSurfaceDistance = collisionCheckParams.myFindGroundDistanceMaxOutsideDistance;\r\n let distanceToCollectCollisionHit = collisionCheckParams.myCollectGroundCollisionHitOutsideDistance;\r\n let verticalFixToBeOnSurface = collisionCheckParams.myVerticalFixToBeOnGround;\r\n let verticalFixToComputeSurfaceInfo = collisionCheckParams.myVerticalFixToComputeGroundInfo;\r\n let verticalFixToFindSurfaceDistance = collisionCheckParams.myFindGroundDistanceMaxInsideDistance;\r\n let verticalFixToCollectCollisionHit = collisionCheckParams.myCollectGroundCollisionHitInsideDistance;\r\n let isOnSurfaceIfInsideHit = collisionCheckParams.myIsOnGroundIfInsideHit;\r\n let isBaseInsideCollisionCheckEnabled = collisionCheckParams.myGroundIsBaseInsideCollisionCheckEnabled;\r\n if (!isGround) {\r\n verticalDirection.vec3_negate(verticalDirection);\r\n distanceToBeOnSurface = collisionCheckParams.myDistanceToBeOnCeiling;\r\n distanceToComputeSurfaceInfo = collisionCheckParams.myDistanceToComputeCeilingInfo;\r\n distanceToFindSurfaceDistance = collisionCheckParams.myFindCeilingDistanceMaxOutsideDistance;\r\n distanceToCollectCollisionHit = collisionCheckParams.myCollectCeilingCollisionHitOutsideDistance;\r\n verticalFixToBeOnSurface = collisionCheckParams.myVerticalFixToBeOnCeiling;\r\n verticalFixToComputeSurfaceInfo = collisionCheckParams.myVerticalFixToComputeCeilingInfo;\r\n verticalFixToFindSurfaceDistance = collisionCheckParams.myFindCeilingDistanceMaxInsideDistance;\r\n verticalFixToCollectCollisionHit = collisionCheckParams.myCollectCeilingCollisionHitInsideDistance;\r\n isOnSurfaceIfInsideHit = collisionCheckParams.myIsOnCeilingIfInsideHit;\r\n isBaseInsideCollisionCheckEnabled = collisionCheckParams.myCeilingIsBaseInsideCollisionCheckEnabled;\r\n }\r\n\r\n startOffset = verticalDirection.vec3_scale(Math.max(verticalFixToBeOnSurface, verticalFixToComputeSurfaceInfo, verticalFixToFindSurfaceDistance, 0.00001), startOffset);\r\n endOffset = verticalDirection.vec3_negate(endOffset).vec3_scale(Math.max(distanceToBeOnSurface, distanceToComputeSurfaceInfo, distanceToFindSurfaceDistance, 0.00001), endOffset);\r\n\r\n heightOffset.vec3_zero();\r\n if (!isGround) {\r\n heightOffset = up.vec3_scale(height, heightOffset);\r\n }\r\n\r\n smallOffset = verticalDirection.vec3_scale(0.0001, smallOffset);\r\n\r\n let isOnSurface = false;\r\n let isActuallyOnSurface = false;\r\n let surfaceAngle = 0;\r\n let surfacePerceivedAngle = 0;\r\n surfaceNormal.vec3_zero();\r\n surfaceCollisionHit.reset();\r\n surfaceCollisionHitForBaseInsideCollision.reset();\r\n\r\n let surfaceHitMaxAngle = 0;\r\n surfaceHitMaxNormal.vec3_zero();\r\n\r\n let surfaceDistance = null;\r\n let surfaceDistanceForCollectCollisionHit = null;\r\n let isBaseInsideCollision = checkPositions.length > 0;\r\n\r\n for (let i = 0; i < checkPositions.length; i++) {\r\n let currentPosition = checkPositions[i];\r\n currentPosition.vec3_add(heightOffset, currentPosition);\r\n\r\n let baseHitIsInsideCollision = false;\r\n if (isBaseInsideCollisionCheckEnabled) {\r\n smallStartPosition = currentPosition.vec3_add(smallOffset, smallStartPosition);\r\n smallEndPosition = currentPosition.vec3_sub(smallOffset, smallEndPosition);\r\n\r\n let origin = smallStartPosition;\r\n direction = smallEndPosition.vec3_sub(origin, direction);\r\n let distance = direction.vec3_length();\r\n direction.vec3_normalize(direction);\r\n let raycastResult = this._raycastAndDebug(origin, direction, distance, false, false, collisionCheckParams, collisionRuntimeParams);\r\n\r\n if (raycastResult.isColliding()) {\r\n baseHitIsInsideCollision = raycastResult.myHits[0].myInsideCollision;\r\n surfaceCollisionHitForBaseInsideCollision.copy(raycastResult.myHits[0]);\r\n }\r\n }\r\n\r\n isBaseInsideCollision &&= baseHitIsInsideCollision;\r\n\r\n if (!baseHitIsInsideCollision) {\r\n startPosition = currentPosition.vec3_add(startOffset, startPosition);\r\n endPosition = currentPosition.vec3_add(endOffset, endPosition);\r\n\r\n let origin = startPosition;\r\n direction = endPosition.vec3_sub(origin, direction);\r\n let distance = direction.vec3_length();\r\n direction.vec3_normalize(direction);\r\n let raycastResult = this._raycastAndDebug(origin, direction, distance, true, false, collisionCheckParams, collisionRuntimeParams);\r\n\r\n if (raycastResult.isColliding()) {\r\n hitFromCurrentPosition = raycastResult.myHits[0].myPosition.vec3_sub(currentPosition, hitFromCurrentPosition);\r\n let hitFromCurrentPositionLength = hitFromCurrentPosition.vec3_lengthSigned(verticalDirection);\r\n\r\n if ((hitFromCurrentPositionLength >= 0 && hitFromCurrentPositionLength <= verticalFixToBeOnSurface + 0.00001) ||\r\n (hitFromCurrentPositionLength < 0 && Math.abs(hitFromCurrentPositionLength) <= distanceToBeOnSurface + 0.00001)) {\r\n isOnSurface = true;\r\n isActuallyOnSurface = true;\r\n }\r\n\r\n if ((hitFromCurrentPositionLength >= 0 && hitFromCurrentPositionLength <= verticalFixToComputeSurfaceInfo + 0.00001) ||\r\n (hitFromCurrentPositionLength < 0 && Math.abs(hitFromCurrentPositionLength) <= distanceToComputeSurfaceInfo + 0.00001)) {\r\n let currentSurfaceNormal = raycastResult.myHits[0].myNormal;\r\n surfaceNormal.vec3_add(currentSurfaceNormal, surfaceNormal);\r\n\r\n let surfaceHitAngle = currentSurfaceNormal.vec3_angle(verticalDirection);\r\n if (surfaceHitAngle > surfaceHitMaxAngle) {\r\n surfaceHitMaxAngle = surfaceHitAngle;\r\n surfaceHitMaxNormal.vec3_copy(currentSurfaceNormal);\r\n }\r\n }\r\n\r\n if ((hitFromCurrentPositionLength >= 0 && hitFromCurrentPositionLength <= verticalFixToFindSurfaceDistance + 0.00001) ||\r\n (hitFromCurrentPositionLength < 0 && Math.abs(hitFromCurrentPositionLength) <= distanceToFindSurfaceDistance + 0.00001)) {\r\n if (surfaceDistance == null) {\r\n surfaceDistance = -hitFromCurrentPositionLength;\r\n } else {\r\n if (Math.abs(hitFromCurrentPositionLength) < Math.abs(surfaceDistance)) {\r\n surfaceDistance = -hitFromCurrentPositionLength;\r\n }\r\n }\r\n }\r\n\r\n if ((hitFromCurrentPositionLength >= 0 && hitFromCurrentPositionLength <= verticalFixToCollectCollisionHit + 0.00001) ||\r\n (hitFromCurrentPositionLength < 0 && Math.abs(hitFromCurrentPositionLength) <= distanceToCollectCollisionHit + 0.00001)) {\r\n if (surfaceDistanceForCollectCollisionHit == null) {\r\n surfaceDistanceForCollectCollisionHit = -hitFromCurrentPositionLength;\r\n surfaceCollisionHit.copy(raycastResult.myHits[0]);\r\n } else {\r\n if (Math.abs(hitFromCurrentPositionLength) < Math.abs(surfaceDistanceForCollectCollisionHit)) {\r\n surfaceDistanceForCollectCollisionHit = -hitFromCurrentPositionLength;\r\n surfaceCollisionHit.copy(raycastResult.myHits[0]);\r\n }\r\n }\r\n }\r\n }\r\n } else if (isOnSurfaceIfInsideHit) {\r\n if (!isOnSurface) {\r\n isOnSurface = true;\r\n if (!surfaceCollisionHit.isValid()) {\r\n surfaceCollisionHit.copy(surfaceCollisionHitForBaseInsideCollision);\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (!surfaceNormal.vec3_isZero()) {\r\n surfaceNormal.vec3_normalize(surfaceNormal);\r\n surfaceAngle = surfaceNormal.vec3_angle(verticalDirection);\r\n\r\n if (surfaceAngle <= 0.0001) {\r\n surfaceAngle = 0;\r\n surfaceNormal.vec3_copy(verticalDirection);\r\n } else if (surfaceAngle >= 180 - 0.0001) {\r\n surfaceAngle = 180;\r\n surfaceNormal = verticalDirection.vec3_negate(surfaceNormal);\r\n }\r\n\r\n surfacePerceivedAngle = this.computeSurfacePerceivedAngle(surfaceNormal, forwardForPerceivedAngle, up, isGround);\r\n }\r\n\r\n if (isGround) {\r\n collisionRuntimeParams.myRealIsOnGround = isOnSurface;\r\n\r\n collisionRuntimeParams.myGroundCollisionHit.copy(surfaceCollisionHit);\r\n\r\n collisionRuntimeParams.myGroundAngle = surfaceAngle;\r\n collisionRuntimeParams.myGroundPerceivedAngle = surfacePerceivedAngle;\r\n collisionRuntimeParams.myGroundNormal.vec3_copy(surfaceNormal);\r\n\r\n collisionRuntimeParams.myGroundHitMaxAngle = surfaceHitMaxAngle;\r\n collisionRuntimeParams.myGroundHitMaxNormal.vec3_copy(surfaceHitMaxNormal);\r\n\r\n collisionRuntimeParams.myGroundDistance = surfaceDistance;\r\n\r\n collisionRuntimeParams.myGroundIsBaseInsideCollision = isBaseInsideCollision;\r\n\r\n if (isOnSurface && (collisionCheckParams.myIsOnGroundMaxSurfaceAngle == null || collisionRuntimeParams.myGroundAngle <= collisionCheckParams.myIsOnGroundMaxSurfaceAngle)) {\r\n collisionRuntimeParams.myIsOnGround = true;\r\n } else {\r\n collisionRuntimeParams.myIsOnGround = false;\r\n }\r\n\r\n collisionRuntimeParams.myOnGroundDueToBasePartiallyInsideCollision = isOnSurface && !isActuallyOnSurface;\r\n } else {\r\n collisionRuntimeParams.myRealIsOnCeiling = isOnSurface;\r\n\r\n collisionRuntimeParams.myCeilingCollisionHit.copy(surfaceCollisionHit);\r\n\r\n collisionRuntimeParams.myCeilingAngle = surfaceAngle;\r\n collisionRuntimeParams.myCeilingPerceivedAngle = surfacePerceivedAngle;\r\n collisionRuntimeParams.myCeilingNormal.vec3_copy(surfaceNormal);\r\n\r\n collisionRuntimeParams.myCeilingHitMaxAngle = surfaceHitMaxAngle;\r\n collisionRuntimeParams.myCeilingHitMaxNormal.vec3_copy(surfaceHitMaxNormal);\r\n\r\n collisionRuntimeParams.myCeilingDistance = surfaceDistance;\r\n\r\n collisionRuntimeParams.myCeilingIsBaseInsideCollision = isBaseInsideCollision;\r\n\r\n if (isOnSurface && (collisionCheckParams.myIsOnCeilingMaxSurfaceAngle == null || collisionRuntimeParams.myCeilingAngle <= collisionCheckParams.myIsOnCeilingMaxSurfaceAngle)) {\r\n collisionRuntimeParams.myIsOnCeiling = true;\r\n } else {\r\n collisionRuntimeParams.myIsOnCeiling = false;\r\n }\r\n\r\n collisionRuntimeParams.myOnCeilingDueToBasePartiallyInsideCollision = isOnSurface && !isActuallyOnSurface;\r\n }\r\n };\r\n}();\r\n\r\nCollisionCheckSurface.prototype.computeSurfacePerceivedAngle = function () {\r\n let forwardOnSurface = vec3_create();\r\n let verticalDirection = vec3_create();\r\n return function computeSurfacePerceivedAngle(surfaceNormal, forward, up, isGround = true) {\r\n let surfacePerceivedAngle = 0;\r\n\r\n verticalDirection.vec3_copy(up);\r\n if (!isGround) {\r\n verticalDirection.vec3_negate(verticalDirection);\r\n }\r\n\r\n let surfaceAngle = surfaceNormal.vec3_angle(verticalDirection);\r\n if (surfaceAngle <= Math.PP_EPSILON_DEGREES) {\r\n surfaceAngle = 0;\r\n } else if (surfaceAngle >= 180 - Math.PP_EPSILON_DEGREES) {\r\n surfaceAngle = 180;\r\n }\r\n\r\n forwardOnSurface = forward.vec3_projectOnPlaneAlongAxis(surfaceNormal, up, forwardOnSurface);\r\n surfacePerceivedAngle = forwardOnSurface.vec3_angle(forward);\r\n\r\n let isFartherOnUp = forwardOnSurface.vec3_isFartherAlongAxis(forward, up);\r\n if ((!isFartherOnUp && isGround) || (isFartherOnUp && !isGround)) {\r\n surfacePerceivedAngle *= -1;\r\n }\r\n\r\n if (Math.abs(surfacePerceivedAngle) >= surfaceAngle) {\r\n if (surfaceAngle != 0 && surfaceAngle != 180) {\r\n surfacePerceivedAngle = surfaceAngle * Math.pp_sign(surfacePerceivedAngle);\r\n } else {\r\n surfacePerceivedAngle = surfaceAngle;\r\n }\r\n }\r\n\r\n return surfacePerceivedAngle;\r\n };\r\n}();", "import { vec3_create } from \"../../../../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { CollisionCheckSurface } from \"./collision_check_surface.js\";\r\n\r\nexport class CollisionCheckHorizontalBase extends CollisionCheckSurface {\r\n\r\n _horizontalCheckRaycast(startPosition, endPosition, movementDirection, up,\r\n ignoreHitsInsideCollision, ignoreGroundAngleCallback, ignoreCeilingAngleCallback,\r\n feetPosition, fixHitOnCollision,\r\n collisionCheckParams, collisionRuntimeParams, checkAllHits = false, ignoreHitsInsideCollisionIfObjectToIgnore = false) {\r\n // Implemented outside class definition\r\n }\r\n\r\n _ignoreSurfaceAngle(feetPosition, height, movementOrForward, objectsToIgnore, outIgnoredObjects, isGround, isMovementCheck, up, collisionCheckParams, hit, ignoreHitsInsideCollisionIfObjectToIgnore) {\r\n // Implemented outside class definition\r\n }\r\n}\r\n\r\n\r\n\r\n// IMPLEMENTATION\r\n\r\nCollisionCheckHorizontalBase.prototype._horizontalCheckRaycast = function () {\r\n let direction = vec3_create();\r\n let fixedFeetPosition = vec3_create();\r\n let fixedHitPosition = vec3_create();\r\n return function _horizontalCheckRaycast(startPosition, endPosition, movementDirection, up,\r\n ignoreHitsInsideCollision, ignoreGroundAngleCallback, ignoreCeilingAngleCallback,\r\n feetPosition, fixHitOnCollision,\r\n collisionCheckParams, collisionRuntimeParams, checkAllHits = false, ignoreHitsInsideCollisionIfObjectToIgnore = false) {\r\n\r\n let origin = startPosition;\r\n direction = endPosition.vec3_sub(origin, direction);\r\n\r\n if (movementDirection != null && !direction.vec3_isConcordant(movementDirection)) {\r\n direction.vec3_negate(direction);\r\n origin = endPosition;\r\n }\r\n\r\n let distance = direction.vec3_length();\r\n direction.vec3_normalize(direction);\r\n let raycastResult = this._raycastAndDebug(origin, direction, distance, ignoreHitsInsideCollision, true, collisionCheckParams, collisionRuntimeParams);\r\n\r\n let isOk = true;\r\n\r\n if (raycastResult.isColliding()) {\r\n let hitsToControl = checkAllHits ? raycastResult.myHits.length : 1;\r\n let validHitIndex = 0;\r\n for (let i = 0; i < hitsToControl; i++) {\r\n let hit = raycastResult.myHits[i];\r\n if ((ignoreGroundAngleCallback == null || !ignoreGroundAngleCallback(hit, ignoreHitsInsideCollisionIfObjectToIgnore)) &&\r\n (ignoreCeilingAngleCallback == null || !ignoreCeilingAngleCallback(hit, ignoreHitsInsideCollisionIfObjectToIgnore))) {\r\n isOk = false;\r\n validHitIndex = i;\r\n break;\r\n }\r\n }\r\n\r\n if (!isOk && validHitIndex > 0) {\r\n for (let i = 0; i < validHitIndex; i++) {\r\n raycastResult.removeHit(0);\r\n }\r\n }\r\n }\r\n\r\n if (!isOk && fixHitOnCollision) {\r\n let hitPosition = raycastResult.myHits[0].myPosition;\r\n\r\n fixedFeetPosition = feetPosition.vec3_copyComponentAlongAxis(hitPosition, up, fixedFeetPosition);\r\n fixedHitPosition.vec3_copy(hitPosition);\r\n\r\n let directionOffsetEpsilonValue = 0.0001;\r\n direction = direction.vec3_componentAlongAxis(up, direction);\r\n if (!direction.vec3_isZero(0.000001)) {\r\n // If the check has an up part move the hit a bit on the that direction\r\n direction.vec3_normalize(direction);\r\n direction.vec3_scale(directionOffsetEpsilonValue, direction);\r\n\r\n // This offset is a workaround for objects that in the editor are aligned but due to clamp get a bit tilted when in the game\r\n // and therefore trying an horizontal cast on the vertical hit position could result in hitting the bottom which in theory should be parallel and therefore not possible\r\n fixedFeetPosition.vec3_add(direction, fixedFeetPosition);\r\n fixedHitPosition.vec3_add(direction, fixedHitPosition);\r\n }\r\n\r\n // Move the hit a bit further to prevent miss\r\n direction = fixedHitPosition.vec3_sub(fixedFeetPosition, direction);\r\n direction.vec3_normalize(direction);\r\n direction.vec3_scale(directionOffsetEpsilonValue, direction);\r\n fixedHitPosition = fixedHitPosition.vec3_add(direction, fixedHitPosition);\r\n\r\n let swapRaycastResult = this._myRaycastResult;\r\n this._myRaycastResult = this._myFixRaycastResult;\r\n\r\n isOk = this._horizontalCheckRaycast(fixedFeetPosition, fixedHitPosition, null, up,\r\n false, ignoreGroundAngleCallback, ignoreCeilingAngleCallback,\r\n feetPosition, false,\r\n collisionCheckParams, collisionRuntimeParams);\r\n\r\n if (this._myRaycastResult.isColliding()) {\r\n this._myFixRaycastResult = swapRaycastResult;\r\n } else {\r\n isOk = false;\r\n this._myRaycastResult = swapRaycastResult;\r\n }\r\n }\r\n\r\n return isOk;\r\n };\r\n}();\r\n\r\nCollisionCheckHorizontalBase.prototype._ignoreSurfaceAngle = function () {\r\n let objectsEqualCallback = (first, second) => first == second;\r\n\r\n let movementDirection = vec3_create();\r\n let hitDirection = vec3_create();\r\n let hitMovement = vec3_create();\r\n let projectAlongAxis = vec3_create();\r\n return function _ignoreSurfaceAngle(feetPosition, height, movementOrForward, objectsToIgnore, outIgnoredObjects, isGround, isMovementCheck, up, collisionCheckParams, hit, ignoreHitsInsideCollisionIfObjectToIgnore) {\r\n let isIgnorable = false;\r\n\r\n let surfaceIgnoreHeight = null;\r\n let groundIgnoreHeight = isMovementCheck ? collisionCheckParams.myHorizontalMovementGroundAngleIgnoreHeight : collisionCheckParams.myHorizontalPositionGroundAngleIgnoreHeight;\r\n let ceilingIgnoreHeight = isMovementCheck ? collisionCheckParams.myHorizontalMovementCeilingAngleIgnoreHeight : collisionCheckParams.myHorizontalPositionCeilingAngleIgnoreHeight;\r\n if (isGround && groundIgnoreHeight != null) {\r\n surfaceIgnoreHeight = Math.pp_clamp(groundIgnoreHeight + 0.0002, 0, height);\r\n } else if (!isGround && ceilingIgnoreHeight != null) {\r\n surfaceIgnoreHeight = Math.pp_clamp(height - ceilingIgnoreHeight - 0.0002, 0, height);\r\n }\r\n\r\n let surfaceIgnoreMaxMovementLeft = null;\r\n if (isMovementCheck) {\r\n if (isGround && collisionCheckParams.myHorizontalMovementGroundAngleIgnoreMaxMovementLeft != null) {\r\n surfaceIgnoreMaxMovementLeft = collisionCheckParams.myHorizontalMovementGroundAngleIgnoreMaxMovementLeft;\r\n } else if (!isGround && collisionCheckParams.myHorizontalMovementCeilingAngleIgnoreMaxMovementLeft != null) {\r\n surfaceIgnoreMaxMovementLeft = collisionCheckParams.myHorizontalMovementCeilingAngleIgnoreMaxMovementLeft;\r\n }\r\n }\r\n\r\n if (!hit.myInsideCollision) {\r\n movementDirection = movementOrForward.vec3_normalize(movementDirection);\r\n\r\n let surfaceAngle = hit.myNormal.vec3_angle(up);\r\n if (!isGround) {\r\n surfaceAngle = 180 - surfaceAngle;\r\n }\r\n\r\n if (isGround && collisionCheckParams.myGroundAngleToIgnore > 0 && (surfaceAngle > collisionCheckParams.myGroundAngleToIgnore + 0.0001)) {\r\n if (collisionCheckParams.myGroundAngleToIgnoreWithPerceivedAngle != null &&\r\n surfaceAngle <= collisionCheckParams.myGroundAngleToIgnoreWithPerceivedAngle + 0.0001) {\r\n let perceivedAngle = this.computeSurfacePerceivedAngle(\r\n hit.myNormal,\r\n movementDirection, up, true);\r\n surfaceAngle = Math.abs(perceivedAngle);\r\n }\r\n } else if (!isGround && collisionCheckParams.myCeilingAngleToIgnore > 0 && surfaceAngle > collisionCheckParams.myCeilingAngleToIgnore + 0.0001) {\r\n if (collisionCheckParams.myCeilingAngleToIgnoreWithPerceivedAngle != null &&\r\n surfaceAngle <= collisionCheckParams.myCeilingAngleToIgnoreWithPerceivedAngle + 0.0001) {\r\n let perceivedAngle = this.computeSurfacePerceivedAngle(\r\n hit.myNormal,\r\n movementDirection, up, false);\r\n surfaceAngle = Math.abs(perceivedAngle);\r\n }\r\n }\r\n\r\n if ((isGround && (collisionCheckParams.myGroundAngleToIgnore > 0 && surfaceAngle <= collisionCheckParams.myGroundAngleToIgnore + 0.0001)) ||\r\n (!isGround && (collisionCheckParams.myCeilingAngleToIgnore > 0 && surfaceAngle <= collisionCheckParams.myCeilingAngleToIgnore + 0.0001))) {\r\n if (objectsToIgnore == null || objectsToIgnore.pp_hasEqual(hit.myObject, objectsEqualCallback)) {\r\n let surfaceHeightCheckOk = true;\r\n let maxMovementLeftCheckOk = true;\r\n\r\n if (surfaceIgnoreHeight != null) {\r\n surfaceHeightCheckOk = false;\r\n\r\n let feetPositionUp = feetPosition.vec3_valueAlongAxis(up);\r\n let hitUp = hit.myPosition.vec3_valueAlongAxis(up);\r\n let hitHeight = hitUp - feetPositionUp;\r\n if ((isGround && hitHeight <= surfaceIgnoreHeight) || (!isGround && hitHeight >= surfaceIgnoreHeight)) {\r\n surfaceHeightCheckOk = true;\r\n } else {\r\n //console.error(hitHeight.toFixed(6));\r\n }\r\n }\r\n\r\n if (surfaceHeightCheckOk && isMovementCheck) {\r\n if (surfaceIgnoreMaxMovementLeft != null) {\r\n let movementLength = movementOrForward.vec3_length();\r\n if (movementLength > surfaceIgnoreMaxMovementLeft) {\r\n maxMovementLeftCheckOk = false;\r\n\r\n let hitPosition = hit.myPosition;\r\n let halfConeAngle = Math.min(collisionCheckParams.myHalfConeAngle, 90);\r\n hitDirection = hitPosition.vec3_sub(feetPosition, hitDirection);\r\n\r\n if (hitDirection.vec3_isToTheRight(movementDirection, up)) {\r\n projectAlongAxis = movementDirection.vec3_rotateAxis(-halfConeAngle, up, projectAlongAxis);\r\n } else {\r\n projectAlongAxis = movementDirection.vec3_rotateAxis(halfConeAngle, up, projectAlongAxis);\r\n }\r\n\r\n hitMovement = hitDirection.vec3_projectOnAxisAlongAxis(movementDirection, projectAlongAxis, hitMovement);\r\n\r\n let hitMovementLength = hitMovement.vec3_length();\r\n let movementLeft = movementLength - hitMovementLength;\r\n\r\n if (movementLeft <= surfaceIgnoreMaxMovementLeft) {\r\n maxMovementLeftCheckOk = true;\r\n } else {\r\n //console.error(movementLeft.toFixed(3));\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (surfaceHeightCheckOk && maxMovementLeftCheckOk) {\r\n isIgnorable = true;\r\n }\r\n }\r\n }\r\n } else if (ignoreHitsInsideCollisionIfObjectToIgnore) {\r\n // #TODO When raycast pierce will work, if it gives the normal even when inside check if the angle is ok and only ignore if that's the case\r\n if (objectsToIgnore == null || objectsToIgnore.pp_hasEqual(hit.myObject, objectsEqualCallback)) {\r\n isIgnorable = true;\r\n }\r\n }\r\n\r\n if (isIgnorable) {\r\n if (outIgnoredObjects != null) {\r\n outIgnoredObjects.pp_pushUnique(hit.myObject, objectsEqualCallback);\r\n }\r\n }\r\n\r\n\r\n return isIgnorable;\r\n };\r\n}();", "import { RaycastHit } from \"../../../../../../cauldron/physics/physics_raycast_params.js\";\r\nimport { vec3_create } from \"../../../../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { CollisionCheckHorizontalBase } from \"./collision_check_horizontal_base.js\";\r\n\r\nexport class CollisionCheckHorizontalPosition extends CollisionCheckHorizontalBase {\r\n\r\n _horizontalPositionCheck(originalFeetPosition, originalHeight, feetPosition, height, up, forward, collisionCheckParams, collisionRuntimeParams) {\r\n // Implemented outside class definition\r\n }\r\n\r\n _horizontalPositionHorizontalCheck(feetPosition, checkPositions, heightOffset, up, forward, ignoreGroundAngleCallback, ignoreCeilingAngleCallback, collisionCheckParams, collisionRuntimeParams) {\r\n // Implemented outside class definition\r\n }\r\n\r\n _horizontalPositionVerticalCheck(feetPosition, checkPositions, heightOffset, heightStep, verticalDirection, up, ignoreGroundAngleCallback, ignoreCeilingAngleCallback, collisionCheckParams, collisionRuntimeParams) {\r\n // Implemented outside class definition\r\n }\r\n}\r\n\r\n\r\n\r\n// IMPLEMENTATION\r\n\r\nCollisionCheckHorizontalPosition.prototype._horizontalPositionCheck = function () {\r\n let checkPositions = [];\r\n let cachedCheckPositions = [];\r\n let currentCachedCheckPositionIndex = 0;\r\n let _localGetCachedCheckPosition = function () {\r\n let item = null;\r\n while (cachedCheckPositions.length <= currentCachedCheckPositionIndex) {\r\n cachedCheckPositions.push(vec3_create());\r\n }\r\n\r\n item = cachedCheckPositions[currentCachedCheckPositionIndex];\r\n currentCachedCheckPositionIndex++;\r\n return item;\r\n };\r\n\r\n let _localGroundObjectsToIgnore = [];\r\n let _localCeilingObjectsToIgnore = [];\r\n let _localGroundCeilingObjectsToIgnore = [];\r\n\r\n let objectsEqualCallback = (first, second) => first == second;\r\n\r\n let heightOffset = vec3_create();\r\n let heightStep = vec3_create();\r\n let currentHeightOffset = vec3_create();\r\n let hitHeightOffset = vec3_create();\r\n let hitHeightOffsetEpsilon = vec3_create();\r\n let downwardHeightOffset = vec3_create();\r\n let downwardHeightStep = vec3_create();\r\n\r\n let verticalDirection = vec3_create();\r\n\r\n let vertilCheckHit = new RaycastHit();\r\n\r\n return function _horizontalPositionCheck(originalFeetPosition, originalHeight, feetPosition, height, up, forward, collisionCheckParams, collisionRuntimeParams) {\r\n this._myDebugEnabled = collisionCheckParams.myDebugEnabled && collisionCheckParams.myDebugHorizontalPositionEnabled;\r\n\r\n checkPositions.length = 0;\r\n currentCachedCheckPositionIndex = 0;\r\n\r\n let halfConeAngle = Math.min(collisionCheckParams.myHalfConeAngle, 180);\r\n let sliceAngle = halfConeAngle / collisionCheckParams.myHalfConeSliceAmount;\r\n let tempCheckPosition = _localGetCachedCheckPosition();\r\n checkPositions.push(feetPosition.vec3_add(forward.vec3_scale(collisionCheckParams.myRadius, tempCheckPosition), tempCheckPosition));\r\n for (let i = 1; i <= collisionCheckParams.myHalfConeSliceAmount; i++) {\r\n let currentAngle = i * sliceAngle;\r\n\r\n tempCheckPosition = _localGetCachedCheckPosition();\r\n let radialDirection = forward.vec3_rotateAxis(-currentAngle, up, tempCheckPosition);\r\n checkPositions.push(feetPosition.vec3_add(radialDirection.vec3_scale(collisionCheckParams.myRadius, radialDirection), radialDirection));\r\n\r\n tempCheckPosition = _localGetCachedCheckPosition();\r\n radialDirection = forward.vec3_rotateAxis(currentAngle, up, tempCheckPosition);\r\n checkPositions.push(feetPosition.vec3_add(radialDirection.vec3_scale(collisionCheckParams.myRadius, radialDirection), radialDirection));\r\n }\r\n\r\n let groundObjectsToIgnore = null;\r\n let ceilingObjectsToIgnore = null;\r\n let groundCeilingObjectsToIgnore = null;\r\n\r\n if (collisionCheckParams.myGroundAngleToIgnore > 0) {\r\n // Gather ground objects to ignore\r\n groundObjectsToIgnore = _localGroundObjectsToIgnore;\r\n groundObjectsToIgnore.length = 0;\r\n groundCeilingObjectsToIgnore = _localGroundCeilingObjectsToIgnore;\r\n groundCeilingObjectsToIgnore.length = 0;\r\n\r\n let ignoreGroundAngleCallback = this._ignoreSurfaceAngle.bind(this, originalFeetPosition, originalHeight, forward, null, groundObjectsToIgnore, true, false, up, collisionCheckParams);\r\n\r\n let ignoreCeilingAngleCallback = null;\r\n if (collisionCheckParams.myCeilingAngleToIgnore > 0) {\r\n ignoreCeilingAngleCallback = this._ignoreSurfaceAngle.bind(this, originalFeetPosition, originalHeight, forward, null, groundCeilingObjectsToIgnore, false, false, up, collisionCheckParams);\r\n }\r\n\r\n heightOffset.vec3_zero();\r\n this._horizontalPositionHorizontalCheck(feetPosition, checkPositions, heightOffset, up, forward, ignoreGroundAngleCallback, ignoreCeilingAngleCallback, collisionCheckParams, collisionRuntimeParams);\r\n }\r\n\r\n if (collisionCheckParams.myCeilingAngleToIgnore > 0) {\r\n // Gather ceiling objects to ignore\r\n if (!collisionRuntimeParams.myIsCollidingHorizontally && collisionCheckParams.myCheckHeight) {\r\n ceilingObjectsToIgnore = _localCeilingObjectsToIgnore;\r\n ceilingObjectsToIgnore.length = 0;\r\n\r\n let ignoreGroundAngleCallback = null;\r\n if (collisionCheckParams.myGroundAngleToIgnore > 0) {\r\n ignoreGroundAngleCallback = this._ignoreSurfaceAngle.bind(this, originalFeetPosition, originalHeight, forward, groundObjectsToIgnore, null, true, false, up, collisionCheckParams);\r\n }\r\n\r\n let ignoreCeilingAngleCallback = this._ignoreSurfaceAngle.bind(this, originalFeetPosition, originalHeight, forward, null, ceilingObjectsToIgnore, false, false, up, collisionCheckParams);\r\n\r\n heightOffset = up.vec3_scale(height, heightOffset);\r\n this._horizontalPositionHorizontalCheck(feetPosition, checkPositions, heightOffset, up, forward, ignoreGroundAngleCallback, ignoreCeilingAngleCallback, collisionCheckParams, collisionRuntimeParams);\r\n }\r\n }\r\n\r\n if (!collisionRuntimeParams.myIsCollidingHorizontally) {\r\n\r\n let groundCeilingCheckIsFine = true;\r\n\r\n if (groundCeilingObjectsToIgnore != null) {\r\n // Check that the ceiling objects ignored by the ground are the correct ones, that is the one ignored by the upper check\r\n for (let object of groundCeilingObjectsToIgnore) {\r\n if (!ceilingObjectsToIgnore.pp_hasEqual(object, objectsEqualCallback)) {\r\n groundCeilingCheckIsFine = false;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n let ignoreGroundAngleCallback = null;\r\n let ignoreCeilingAngleCallback = null;\r\n\r\n if (collisionCheckParams.myGroundAngleToIgnore > 0) {\r\n ignoreGroundAngleCallback = this._ignoreSurfaceAngle.bind(this, originalFeetPosition, originalHeight, forward, groundObjectsToIgnore, null, true, false, up, collisionCheckParams);\r\n }\r\n\r\n if (collisionCheckParams.myCeilingAngleToIgnore > 0) {\r\n ignoreCeilingAngleCallback = this._ignoreSurfaceAngle.bind(this, originalFeetPosition, originalHeight, forward, ceilingObjectsToIgnore, null, false, false, up, collisionCheckParams);\r\n }\r\n\r\n let heightStepAmount = 0;\r\n if (collisionCheckParams.myCheckHeight && collisionCheckParams.myHeightCheckStepAmountPosition > 0 && height > 0) {\r\n heightStepAmount = collisionCheckParams.myHeightCheckStepAmountPosition;\r\n up.vec3_scale(height / heightStepAmount, heightStep);\r\n }\r\n\r\n for (let i = 0; i <= heightStepAmount; i++) {\r\n currentHeightOffset = heightStep.vec3_scale(i, currentHeightOffset);\r\n\r\n // We can skip the ground check since we have already done that, but if there was an error do it again with the proper set of objects to ignore\r\n // The ceiling check can always be ignored, it used the proper ground objects already\r\n if (collisionCheckParams.myCheckHeightTopPosition || i == 0) {\r\n if ((i != 0 && i != heightStepAmount) ||\r\n (i == 0 && !groundCeilingCheckIsFine) ||\r\n (i == 0 && collisionCheckParams.myGroundAngleToIgnore == 0) ||\r\n (i != 0 && i == heightStepAmount && collisionCheckParams.myCeilingAngleToIgnore == 0)) {\r\n this._horizontalPositionHorizontalCheck(feetPosition, checkPositions, currentHeightOffset, up, forward, ignoreGroundAngleCallback, ignoreCeilingAngleCallback, collisionCheckParams, collisionRuntimeParams);\r\n\r\n if (collisionRuntimeParams.myIsCollidingHorizontally) {\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if (i > 0) {\r\n if (collisionCheckParams.myCheckHeightVerticalPosition) {\r\n // This offset is a workaround for objects that in the editor are aligned but due to clamp get a bit tilted when in the game\r\n // and therefore trying an horizontal cast on the vertical hit position could result in hitting the bottom which in theory should be parallel and therefore not possible\r\n let hitHeightOffsetEpsilonValue = 0.0001;\r\n\r\n if (collisionCheckParams.myHorizontalPositionCheckVerticalDirectionType == 0 || collisionCheckParams.myHorizontalPositionCheckVerticalDirectionType == 2) {\r\n verticalDirection.vec3_copy(up);\r\n this._horizontalPositionVerticalCheck(feetPosition, checkPositions, currentHeightOffset, heightStep, verticalDirection, up, ignoreGroundAngleCallback, ignoreCeilingAngleCallback, collisionCheckParams, collisionRuntimeParams);\r\n\r\n if (collisionRuntimeParams.myIsCollidingHorizontally && collisionCheckParams.myCheckHeightConeOnCollision) {\r\n hitHeightOffset = collisionRuntimeParams.myHorizontalCollisionHit.myPosition.vec3_sub(feetPosition, hitHeightOffset).vec3_componentAlongAxis(up, hitHeightOffset);\r\n hitHeightOffset.vec3_add(verticalDirection.vec3_scale(hitHeightOffsetEpsilonValue, hitHeightOffsetEpsilon), hitHeightOffset);\r\n\r\n collisionRuntimeParams.myIsCollidingHorizontally = false;\r\n if (collisionCheckParams.myCheckHeightConeOnCollisionKeepHit) {\r\n vertilCheckHit.copy(collisionRuntimeParams.myHorizontalCollisionHit);\r\n }\r\n collisionRuntimeParams.myHorizontalCollisionHit.reset();\r\n this._horizontalPositionHorizontalCheck(feetPosition, checkPositions, hitHeightOffset, up, forward, ignoreGroundAngleCallback, ignoreCeilingAngleCallback, collisionCheckParams, collisionRuntimeParams);\r\n\r\n if (collisionRuntimeParams.myIsCollidingHorizontally) {\r\n break;\r\n } else if (collisionCheckParams.myCheckHeightConeOnCollisionKeepHit) {\r\n collisionRuntimeParams.myIsCollidingHorizontally = true;\r\n collisionRuntimeParams.myHorizontalCollisionHit.copy(vertilCheckHit);\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if (!collisionRuntimeParams.myIsCollidingHorizontally) {\r\n if (collisionCheckParams.myHorizontalPositionCheckVerticalDirectionType == 1 || collisionCheckParams.myHorizontalPositionCheckVerticalDirectionType == 2) {\r\n verticalDirection = up.vec3_negate(verticalDirection);\r\n downwardHeightOffset = currentHeightOffset.vec3_sub(heightStep, downwardHeightOffset);\r\n downwardHeightStep = heightStep.vec3_negate(downwardHeightStep);\r\n this._horizontalPositionVerticalCheck(feetPosition, checkPositions, downwardHeightOffset, downwardHeightStep, verticalDirection, up, ignoreGroundAngleCallback, ignoreCeilingAngleCallback, collisionCheckParams, collisionRuntimeParams);\r\n }\r\n\r\n if (collisionRuntimeParams.myIsCollidingHorizontally && collisionCheckParams.myCheckHeightConeOnCollision) {\r\n hitHeightOffset = collisionRuntimeParams.myHorizontalCollisionHit.myPosition.vec3_sub(feetPosition, hitHeightOffset).vec3_componentAlongAxis(up, hitHeightOffset);\r\n hitHeightOffset.vec3_add(verticalDirection.vec3_scale(hitHeightOffsetEpsilonValue, hitHeightOffsetEpsilon), hitHeightOffset);\r\n\r\n collisionRuntimeParams.myIsCollidingHorizontally = false;\r\n if (collisionCheckParams.myCheckHeightConeOnCollisionKeepHit) {\r\n vertilCheckHit.copy(collisionRuntimeParams.myHorizontalCollisionHit);\r\n }\r\n collisionRuntimeParams.myHorizontalCollisionHit.reset();\r\n this._horizontalPositionHorizontalCheck(feetPosition, checkPositions, hitHeightOffset, up, forward, ignoreGroundAngleCallback, ignoreCeilingAngleCallback, collisionCheckParams, collisionRuntimeParams);\r\n\r\n if (collisionRuntimeParams.myIsCollidingHorizontally) {\r\n break;\r\n } else if (collisionCheckParams.myCheckHeightConeOnCollisionKeepHit) {\r\n collisionRuntimeParams.myIsCollidingHorizontally = true;\r\n collisionRuntimeParams.myHorizontalCollisionHit.copy(vertilCheckHit);\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n return !collisionRuntimeParams.myIsCollidingHorizontally;\r\n };\r\n}();\r\n\r\nCollisionCheckHorizontalPosition.prototype._horizontalPositionHorizontalCheck = function () {\r\n let basePosition = vec3_create();\r\n let forwardNegate = vec3_create();\r\n let currentRadialPosition = vec3_create();\r\n let previousRadialPosition = vec3_create();\r\n return function _horizontalPositionHorizontalCheck(feetPosition, checkPositions, heightOffset, up, forward, ignoreGroundAngleCallback, ignoreCeilingAngleCallback, collisionCheckParams, collisionRuntimeParams) {\r\n let isHorizontalCheckOk = true;\r\n\r\n basePosition = feetPosition.vec3_add(heightOffset, basePosition);\r\n\r\n let halfRadialPositions = Math.floor(checkPositions.length / 2) + 1;\r\n for (let j = 0; j < halfRadialPositions; j++) {\r\n if (j > 0) {\r\n let leftIndex = Math.max(0, j * 2);\r\n let rightIndex = Math.max(0, (j * 2 - 1));\r\n let leftAndRightEqual = checkPositions[leftIndex].vec_equals(checkPositions[rightIndex], 0.000001);\r\n\r\n if (collisionCheckParams.myCheckConeBorder) {\r\n for (let r = 0; r < 2; r++) {\r\n let currentIndex = r == 0 ? leftIndex : rightIndex;\r\n\r\n currentRadialPosition = checkPositions[currentIndex].vec3_add(heightOffset, currentRadialPosition);\r\n\r\n let previousIndex = Math.max(0, currentIndex - 2);\r\n previousRadialPosition = checkPositions[previousIndex].vec3_add(heightOffset, previousRadialPosition);\r\n\r\n isHorizontalCheckOk = this._horizontalCheckRaycast(previousRadialPosition, currentRadialPosition, forward.vec3_negate(forwardNegate), up,\r\n true, ignoreGroundAngleCallback, ignoreCeilingAngleCallback,\r\n feetPosition, true,\r\n collisionCheckParams, collisionRuntimeParams);\r\n\r\n if (!isHorizontalCheckOk) break;\r\n }\r\n }\r\n\r\n if (collisionCheckParams.myCheckConeRay && isHorizontalCheckOk) {\r\n for (let r = 0; r < 2; r++) {\r\n if (r == 1 && leftAndRightEqual) {\r\n break;\r\n }\r\n\r\n let currentIndex = r == 0 ? leftIndex : rightIndex;\r\n\r\n currentRadialPosition = checkPositions[currentIndex].vec3_add(heightOffset, currentRadialPosition);\r\n\r\n isHorizontalCheckOk = this._horizontalCheckRaycast(basePosition, currentRadialPosition, null, up,\r\n false, ignoreGroundAngleCallback, ignoreCeilingAngleCallback,\r\n feetPosition, false,\r\n collisionCheckParams, collisionRuntimeParams);\r\n\r\n if (!isHorizontalCheckOk) break;\r\n }\r\n }\r\n } else {\r\n if (collisionCheckParams.myCheckConeRay) {\r\n currentRadialPosition = checkPositions[j].vec3_add(heightOffset, currentRadialPosition);\r\n\r\n isHorizontalCheckOk = this._horizontalCheckRaycast(basePosition, currentRadialPosition, null, up,\r\n false, ignoreGroundAngleCallback, ignoreCeilingAngleCallback,\r\n feetPosition, false,\r\n collisionCheckParams, collisionRuntimeParams);\r\n\r\n if (!isHorizontalCheckOk) break;\r\n }\r\n }\r\n\r\n if (!isHorizontalCheckOk) {\r\n break;\r\n }\r\n }\r\n\r\n if (!isHorizontalCheckOk) {\r\n collisionRuntimeParams.myIsCollidingHorizontally = true;\r\n collisionRuntimeParams.myHorizontalCollisionHit.copy(this._myRaycastResult.myHits[0]);\r\n }\r\n\r\n return isHorizontalCheckOk;\r\n };\r\n}();\r\n\r\nCollisionCheckHorizontalPosition.prototype._horizontalPositionVerticalCheck = function () {\r\n let basePosition = vec3_create();\r\n let previousBasePosition = vec3_create();\r\n let currentRadialPosition = vec3_create();\r\n let previousRadialPosition = vec3_create();\r\n let previousCurrentRadialPosition = vec3_create();\r\n let previousPreviousRadialPosition = vec3_create();\r\n return function _horizontalPositionVerticalCheck(feetPosition, checkPositions, heightOffset, heightStep, verticalDirection, up, ignoreGroundAngleCallback, ignoreCeilingAngleCallback, collisionCheckParams, collisionRuntimeParams) {\r\n let isHorizontalCheckOk = true;\r\n\r\n basePosition = feetPosition.vec3_add(heightOffset, basePosition);\r\n previousBasePosition = basePosition.vec3_sub(heightStep, previousBasePosition);\r\n\r\n for (let j = 0; j <= checkPositions.length; j++) {\r\n let previousCheckPositionIsEqual = false;\r\n\r\n if (j == checkPositions.length) {\r\n currentRadialPosition.vec3_copy(basePosition);\r\n previousRadialPosition.vec3_copy(previousBasePosition);\r\n } else {\r\n currentRadialPosition = checkPositions[j].vec3_add(heightOffset, currentRadialPosition);\r\n previousRadialPosition = currentRadialPosition.vec3_sub(heightStep, previousRadialPosition);\r\n\r\n if (j > 0) {\r\n previousCheckPositionIsEqual = checkPositions[j].vec_equals(checkPositions[j - 1], 0.000001);\r\n }\r\n }\r\n\r\n if (collisionCheckParams.myCheckVerticalStraight && !previousCheckPositionIsEqual) {\r\n isHorizontalCheckOk = this._horizontalCheckRaycast(previousRadialPosition, currentRadialPosition, null, up,\r\n collisionCheckParams.myHorizontalPositionCheckVerticalIgnoreHitsInsideCollision, ignoreGroundAngleCallback, ignoreCeilingAngleCallback,\r\n feetPosition, true,\r\n collisionCheckParams, collisionRuntimeParams, true, true);\r\n\r\n if (!isHorizontalCheckOk) {\r\n if (!collisionRuntimeParams.myIsCollidingHorizontally) {\r\n collisionRuntimeParams.myIsCollidingHorizontally = true;\r\n collisionRuntimeParams.myHorizontalCollisionHit.copy(this._myRaycastResult.myHits[0]);\r\n } else if (this._myRaycastResult.myHits[0].myPosition.vec3_isFartherAlongAxis(collisionRuntimeParams.myHorizontalCollisionHit.myPosition, verticalDirection)) {\r\n collisionRuntimeParams.myHorizontalCollisionHit.copy(this._myRaycastResult.myHits[0]);\r\n }\r\n\r\n if (!collisionCheckParams.myCheckVerticalSearchFartherVerticalHit) {\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if (j < checkPositions.length) {\r\n if ((collisionCheckParams.myCheckVerticalDiagonalRayOutward ||\r\n (collisionCheckParams.myCheckVerticalDiagonalBorderRayOutward && (j == checkPositions.length - 2 || j == checkPositions.length - 1))) &&\r\n !previousCheckPositionIsEqual) {\r\n isHorizontalCheckOk = this._horizontalCheckRaycast(previousBasePosition, currentRadialPosition, null, up,\r\n collisionCheckParams.myHorizontalPositionCheckVerticalIgnoreHitsInsideCollision, ignoreGroundAngleCallback, ignoreCeilingAngleCallback,\r\n feetPosition, true,\r\n collisionCheckParams, collisionRuntimeParams, true, true);\r\n\r\n if (!isHorizontalCheckOk) {\r\n if (!collisionRuntimeParams.myIsCollidingHorizontally) {\r\n collisionRuntimeParams.myIsCollidingHorizontally = true;\r\n collisionRuntimeParams.myHorizontalCollisionHit.copy(this._myRaycastResult.myHits[0]);\r\n } else if (this._myRaycastResult.myHits[0].myPosition.vec3_isFartherAlongAxis(collisionRuntimeParams.myHorizontalCollisionHit.myPosition, verticalDirection)) {\r\n collisionRuntimeParams.myHorizontalCollisionHit.copy(this._myRaycastResult.myHits[0]);\r\n }\r\n\r\n if (!collisionCheckParams.myCheckVerticalSearchFartherVerticalHit) {\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if ((collisionCheckParams.myCheckVerticalDiagonalRayInward ||\r\n (collisionCheckParams.myCheckVerticalDiagonalBorderRayInward && (j == checkPositions.length - 2 || j == checkPositions.length - 1))) &&\r\n !previousCheckPositionIsEqual) {\r\n isHorizontalCheckOk = this._horizontalCheckRaycast(previousRadialPosition, basePosition, null, up,\r\n collisionCheckParams.myHorizontalPositionCheckVerticalIgnoreHitsInsideCollision, ignoreGroundAngleCallback, ignoreCeilingAngleCallback,\r\n feetPosition, true,\r\n collisionCheckParams, collisionRuntimeParams, true, true);\r\n\r\n if (!isHorizontalCheckOk) {\r\n if (!collisionRuntimeParams.myIsCollidingHorizontally) {\r\n collisionRuntimeParams.myIsCollidingHorizontally = true;\r\n collisionRuntimeParams.myHorizontalCollisionHit.copy(this._myRaycastResult.myHits[0]);\r\n } else if (this._myRaycastResult.myHits[0].myPosition.vec3_isFartherAlongAxis(collisionRuntimeParams.myHorizontalCollisionHit.myPosition, verticalDirection)) {\r\n collisionRuntimeParams.myHorizontalCollisionHit.copy(this._myRaycastResult.myHits[0]);\r\n }\r\n\r\n if (!collisionCheckParams.myCheckVerticalSearchFartherVerticalHit) {\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if (j > 0) {\r\n if (collisionCheckParams.myCheckVerticalDiagonalBorderOutward || collisionCheckParams.myCheckVerticalDiagonalBorderInward) {\r\n let previousIndex = Math.max(0, j - 2);\r\n previousCurrentRadialPosition = checkPositions[previousIndex].vec3_add(heightOffset, previousCurrentRadialPosition);\r\n previousPreviousRadialPosition = previousCurrentRadialPosition.vec3_sub(heightStep, previousPreviousRadialPosition);\r\n\r\n if (collisionCheckParams.myCheckVerticalDiagonalBorderOutward) {\r\n isHorizontalCheckOk = this._horizontalCheckRaycast(previousPreviousRadialPosition, currentRadialPosition, null, up,\r\n collisionCheckParams.myHorizontalPositionCheckVerticalIgnoreHitsInsideCollision, ignoreGroundAngleCallback, ignoreCeilingAngleCallback,\r\n feetPosition, true,\r\n collisionCheckParams, collisionRuntimeParams, true, true);\r\n\r\n if (!isHorizontalCheckOk) {\r\n if (!collisionRuntimeParams.myIsCollidingHorizontally) {\r\n collisionRuntimeParams.myIsCollidingHorizontally = true;\r\n collisionRuntimeParams.myHorizontalCollisionHit.copy(this._myRaycastResult.myHits[0]);\r\n } else if (this._myRaycastResult.myHits[0].myPosition.vec3_isFartherAlongAxis(collisionRuntimeParams.myHorizontalCollisionHit.myPosition, verticalDirection)) {\r\n collisionRuntimeParams.myHorizontalCollisionHit.copy(this._myRaycastResult.myHits[0]);\r\n }\r\n\r\n if (!collisionCheckParams.myCheckVerticalSearchFartherVerticalHit) {\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if (collisionCheckParams.myCheckVerticalDiagonalBorderInward) {\r\n isHorizontalCheckOk = this._horizontalCheckRaycast(previousRadialPosition, previousCurrentRadialPosition, null, up,\r\n collisionCheckParams.myHorizontalPositionCheckVerticalIgnoreHitsInsideCollision, ignoreGroundAngleCallback, ignoreCeilingAngleCallback,\r\n feetPosition, true,\r\n collisionCheckParams, collisionRuntimeParams, true, true);\r\n\r\n if (!isHorizontalCheckOk) {\r\n if (!collisionRuntimeParams.myIsCollidingHorizontally) {\r\n collisionRuntimeParams.myIsCollidingHorizontally = true;\r\n collisionRuntimeParams.myHorizontalCollisionHit.copy(this._myRaycastResult.myHits[0]);\r\n } else if (this._myRaycastResult.myHits[0].myPosition.vec3_isFartherAlongAxis(collisionRuntimeParams.myHorizontalCollisionHit.myPosition, verticalDirection)) {\r\n collisionRuntimeParams.myHorizontalCollisionHit.copy(this._myRaycastResult.myHits[0]);\r\n }\r\n\r\n if (!collisionCheckParams.myCheckVerticalSearchFartherVerticalHit) {\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n return !collisionRuntimeParams.myIsCollidingHorizontally;\r\n };\r\n}();", "import { vec3_create } from \"../../../../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { CollisionCheckHorizontalPosition } from \"./collision_check_horizontal_position.js\";\r\n\r\nexport class CollisionCheckHorizontalMovement extends CollisionCheckHorizontalPosition {\r\n\r\n _horizontalMovementCheck(movement, originalFeetPosition, originalHeight, feetPosition, height, up, collisionCheckParams, collisionRuntimeParams) {\r\n // Implemented outside class definition\r\n }\r\n\r\n _horizontalMovementVerticalCheck(movement, feetPosition, checkPositions, heightOffset, heightStep, up, ignoreGroundAngleCallback, ignoreCeilingAngleCallback, collisionCheckParams, collisionRuntimeParams) {\r\n // Implemented outside class definition\r\n }\r\n\r\n _horizontalMovementHorizontalCheck(movement, feetPosition, checkPositions, heightOffset, up, ignoreGroundAngleCallback, ignoreCeilingAngleCallback, collisionCheckParams, collisionRuntimeParams) {\r\n // Implemented outside class definition\r\n }\r\n}\r\n\r\n\r\n\r\n// IMPLEMENTATION\r\n\r\nCollisionCheckHorizontalMovement.prototype._horizontalMovementCheck = function () {\r\n let checkPositions = [];\r\n let cachedCheckPositions = [];\r\n let currentCachedCheckPositionIndex = 0;\r\n let _localGetCachedCheckPosition = function () {\r\n let item = null;\r\n while (cachedCheckPositions.length <= currentCachedCheckPositionIndex) {\r\n cachedCheckPositions.push(vec3_create());\r\n }\r\n\r\n item = cachedCheckPositions[currentCachedCheckPositionIndex];\r\n currentCachedCheckPositionIndex++;\r\n return item;\r\n };\r\n\r\n let _localGroundObjectsToIgnore = [];\r\n let _localCeilingObjectsToIgnore = [];\r\n let _localGroundCeilingObjectsToIgnore = [];\r\n\r\n let objectsEqualCallback = (first, second) => first == second;\r\n\r\n let movementDirection = vec3_create();\r\n let heightOffset = vec3_create();\r\n let heightStep = vec3_create();\r\n let currentHeightOffset = vec3_create();\r\n let leftRadialDirection = vec3_create();\r\n let rightRadialDirection = vec3_create();\r\n return function _horizontalMovementCheck(movement, originalFeetPosition, originalHeight, feetPosition, height, up, collisionCheckParams, collisionRuntimeParams) {\r\n // #TODO Add a flag in the params to specify if u want to allow movement inside collision (to hope that it will end up in a non collision position)\r\n // Also vertical check should check all hits like the position check\r\n // For now is ok as it is, the movement check is not as important and could also be disabled it the movement per frame is very small\r\n\r\n this._myDebugEnabled = collisionCheckParams.myDebugEnabled && collisionCheckParams.myDebugHorizontalMovementEnabled;\r\n\r\n let halfConeAngle = Math.min(collisionCheckParams.myHalfConeAngle, 90);\r\n movementDirection = movement.vec3_normalize(movementDirection);\r\n\r\n checkPositions.length = 0;\r\n currentCachedCheckPositionIndex = 0;\r\n\r\n let steplength = collisionCheckParams.myRadius / collisionCheckParams.myHorizontalMovementRadialStepAmount;\r\n\r\n {\r\n let tempCheckPosition = _localGetCachedCheckPosition();\r\n tempCheckPosition.vec3_copy(feetPosition);\r\n checkPositions.push(tempCheckPosition);\r\n }\r\n\r\n {\r\n leftRadialDirection = movementDirection.vec3_rotateAxis(halfConeAngle, up, leftRadialDirection);\r\n rightRadialDirection = movementDirection.vec3_rotateAxis(-halfConeAngle, up, rightRadialDirection);\r\n for (let i = 1; i <= collisionCheckParams.myHorizontalMovementRadialStepAmount; i++) {\r\n // Left\r\n {\r\n let currentStep = i * steplength;\r\n let tempCheckPosition = _localGetCachedCheckPosition();\r\n let currentRadialPosition = leftRadialDirection.vec3_scale(currentStep, tempCheckPosition);\r\n let currentCheckPosition = currentRadialPosition.vec3_add(feetPosition, currentRadialPosition);\r\n checkPositions.push(currentCheckPosition);\r\n }\r\n\r\n // Right\r\n {\r\n let currentStep = i * steplength;\r\n let tempCheckPosition = _localGetCachedCheckPosition();\r\n let currentRadialPosition = rightRadialDirection.vec3_scale(currentStep, tempCheckPosition);\r\n let currentCheckPosition = currentRadialPosition.vec3_add(feetPosition, currentRadialPosition);\r\n checkPositions.push(currentCheckPosition);\r\n }\r\n }\r\n }\r\n\r\n // If result is inside a collision it's ignored, so that at least you can exit it before seeing if the new position works now\r\n\r\n let groundObjectsToIgnore = null;\r\n let ceilingObjectsToIgnore = null;\r\n let groundCeilingObjectsToIgnore = null;\r\n\r\n if (collisionCheckParams.myGroundAngleToIgnore > 0) {\r\n // Gather ground objects to ignore\r\n groundObjectsToIgnore = _localGroundObjectsToIgnore;\r\n groundObjectsToIgnore.length = 0;\r\n groundCeilingObjectsToIgnore = _localGroundCeilingObjectsToIgnore;\r\n groundCeilingObjectsToIgnore.length = 0;\r\n\r\n let ignoreGroundAngleCallback = this._ignoreSurfaceAngle.bind(this, originalFeetPosition, originalHeight, movement, null, groundObjectsToIgnore, true, true, up, collisionCheckParams);\r\n\r\n let ignoreCeilingAngleCallback = null;\r\n if (collisionCheckParams.myCeilingAngleToIgnore > 0) {\r\n ignoreCeilingAngleCallback = this._ignoreSurfaceAngle.bind(this, originalFeetPosition, originalHeight, movement, null, groundCeilingObjectsToIgnore, false, true, up, collisionCheckParams);\r\n }\r\n\r\n heightOffset.vec3_zero();\r\n this._horizontalMovementHorizontalCheck(movement, feetPosition, checkPositions, heightOffset, up, ignoreGroundAngleCallback, ignoreCeilingAngleCallback, collisionCheckParams, collisionRuntimeParams);\r\n }\r\n\r\n if (collisionCheckParams.myCeilingAngleToIgnore > 0) {\r\n // Gather ceiling objects to ignore\r\n if (!collisionRuntimeParams.myIsCollidingHorizontally && collisionCheckParams.myCheckHeight) {\r\n ceilingObjectsToIgnore = _localCeilingObjectsToIgnore;\r\n ceilingObjectsToIgnore.length = 0;\r\n\r\n let ignoreGroundAngleCallback = null;\r\n if (collisionCheckParams.myGroundAngleToIgnore > 0) {\r\n ignoreGroundAngleCallback = this._ignoreSurfaceAngle.bind(this, originalFeetPosition, originalHeight, movement, groundObjectsToIgnore, null, true, true, up, collisionCheckParams);\r\n }\r\n\r\n let ignoreCeilingAngleCallback = this._ignoreSurfaceAngle.bind(this, originalFeetPosition, originalHeight, movement, null, ceilingObjectsToIgnore, false, true, up, collisionCheckParams);\r\n\r\n heightOffset = up.vec3_scale(height, heightOffset);\r\n this._horizontalMovementHorizontalCheck(movement, feetPosition, checkPositions, heightOffset, up, ignoreGroundAngleCallback, ignoreCeilingAngleCallback, collisionCheckParams, collisionRuntimeParams);\r\n }\r\n }\r\n\r\n if (!collisionRuntimeParams.myIsCollidingHorizontally) {\r\n\r\n let groundCeilingCheckIsFine = true;\r\n\r\n if (groundCeilingObjectsToIgnore != null) {\r\n // Check that the ceiling objects ignored by the ground are the correct ones, that is the one ignored by the upper check\r\n for (let object of groundCeilingObjectsToIgnore) {\r\n if (!ceilingObjectsToIgnore.pp_hasEqual(object, objectsEqualCallback)) {\r\n groundCeilingCheckIsFine = false;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n let ignoreGroundAngleCallback = null;\r\n let ignoreCeilingAngleCallback = null;\r\n\r\n if (collisionCheckParams.myGroundAngleToIgnore > 0) {\r\n ignoreGroundAngleCallback = this._ignoreSurfaceAngle.bind(this, originalFeetPosition, originalHeight, movement, groundObjectsToIgnore, null, true, true, up, collisionCheckParams);\r\n }\r\n\r\n if (collisionCheckParams.myCeilingAngleToIgnore > 0) {\r\n ignoreCeilingAngleCallback = this._ignoreSurfaceAngle.bind(this, originalFeetPosition, originalHeight, movement, ceilingObjectsToIgnore, null, false, true, up, collisionCheckParams);\r\n }\r\n\r\n let heightStepAmount = 0;\r\n if (collisionCheckParams.myCheckHeight && collisionCheckParams.myHeightCheckStepAmountMovement > 0 && height > 0.000001) {\r\n heightStepAmount = collisionCheckParams.myHeightCheckStepAmountMovement;\r\n heightStep = up.vec3_scale(height / heightStepAmount, heightStep);\r\n }\r\n\r\n for (let i = 0; i <= heightStepAmount; i++) {\r\n currentHeightOffset = heightStep.vec3_scale(i, currentHeightOffset);\r\n\r\n // We can skip the ground check since we have already done that, but if there was an error do it again with the proper set of objects to ignore\r\n // The ceiling check can always be ignored, it used the proper ground objects already\r\n if (collisionCheckParams.myCheckHeightTopMovement || i == 0) {\r\n if ((i != 0 && i != heightStepAmount) ||\r\n (i == 0 && !groundCeilingCheckIsFine) ||\r\n (i == 0 && collisionCheckParams.myGroundAngleToIgnore == 0) ||\r\n (i == heightStepAmount && collisionCheckParams.myCeilingAngleToIgnore == 0)) {\r\n this._horizontalMovementHorizontalCheck(movement, feetPosition, checkPositions, currentHeightOffset, up, ignoreGroundAngleCallback, ignoreCeilingAngleCallback, collisionCheckParams, collisionRuntimeParams);\r\n\r\n if (collisionRuntimeParams.myIsCollidingHorizontally) {\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if (i > 0) {\r\n if (collisionCheckParams.myCheckHeightVerticalMovement) {\r\n this._horizontalMovementVerticalCheck(movement, feetPosition, checkPositions, currentHeightOffset, heightStep, up, ignoreGroundAngleCallback, ignoreCeilingAngleCallback, collisionCheckParams, collisionRuntimeParams);\r\n }\r\n\r\n if (collisionRuntimeParams.myIsCollidingHorizontally) {\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n return !collisionRuntimeParams.myIsCollidingHorizontally;\r\n };\r\n}();\r\n\r\nCollisionCheckHorizontalMovement.prototype._horizontalMovementVerticalCheck = function () {\r\n let movementStep = vec3_create();\r\n let movementDirection = vec3_create();\r\n let firstPosition = vec3_create();\r\n let secondPosition = vec3_create();\r\n let firstMovementPosition = vec3_create();\r\n let secondMovementPosition = vec3_create();\r\n let firstHeightPosition = vec3_create();\r\n let secondHeightPosition = vec3_create();\r\n let firstHeightMovementPosition = vec3_create();\r\n let secondHeightMovementPosition = vec3_create();\r\n return function _horizontalMovementVerticalCheck(movement, feetPosition, checkPositions, heightOffset, heightStep, up, ignoreGroundAngleCallback, ignoreCeilingAngleCallback, collisionCheckParams, collisionRuntimeParams) {\r\n let isHorizontalCheckOk = true;\r\n\r\n let movementStepAmount = 1;\r\n movementStep.vec3_copy(movement);\r\n\r\n if (collisionCheckParams.myHorizontalMovementStepEnabled) {\r\n movementStepAmount = Math.max(1, Math.ceil(movement.vec3_length() / collisionCheckParams.myHorizontalMovementStepMaxLength));\r\n movement.vec3_scale(1 / movementStepAmount, movementStep);\r\n }\r\n\r\n movementDirection = movement.vec3_normalize(movementDirection);\r\n\r\n for (let m = 0; m < movementStepAmount; m++) {\r\n for (let j = 0; j < checkPositions.length; j++) {\r\n firstPosition = checkPositions[j].vec3_add(movementStep.vec3_scale(m, firstPosition), firstPosition).vec3_add(heightOffset, firstPosition);\r\n\r\n if (j > 0) {\r\n let secondIndex = Math.max(0, j - 2);\r\n secondPosition = checkPositions[secondIndex].vec3_add(movementStep.vec3_scale(m, secondPosition), secondPosition).vec3_add(heightOffset, secondPosition);\r\n\r\n if (collisionCheckParams.myHorizontalMovementCheckVerticalDiagonalUpwardOutward) {\r\n firstMovementPosition = firstPosition.vec3_add(movementStep, firstMovementPosition);\r\n secondHeightPosition = secondPosition.vec3_sub(heightStep, secondHeightPosition);\r\n\r\n isHorizontalCheckOk = this._horizontalCheckRaycast(secondHeightPosition, firstMovementPosition, movementDirection, up,\r\n true, ignoreGroundAngleCallback, ignoreCeilingAngleCallback,\r\n feetPosition, true,\r\n collisionCheckParams, collisionRuntimeParams);\r\n\r\n if (!isHorizontalCheckOk) break;\r\n }\r\n\r\n if (collisionCheckParams.myHorizontalMovementCheckVerticalDiagonalUpwardInward) {\r\n secondMovementPosition = secondPosition.vec3_add(movementStep, secondMovementPosition);\r\n firstHeightPosition = firstPosition.vec3_sub(heightStep, firstHeightPosition);\r\n\r\n isHorizontalCheckOk = this._horizontalCheckRaycast(firstHeightPosition, secondMovementPosition, movementDirection, up,\r\n true, ignoreGroundAngleCallback, ignoreCeilingAngleCallback,\r\n feetPosition, true,\r\n collisionCheckParams, collisionRuntimeParams);\r\n\r\n if (!isHorizontalCheckOk) break;\r\n }\r\n\r\n if (collisionCheckParams.myHorizontalMovementCheckVerticalDiagonalDownwardOutward) {\r\n firstHeightMovementPosition = firstPosition.vec3_add(movementStep, firstHeightMovementPosition);\r\n firstHeightMovementPosition = firstHeightMovementPosition.vec3_sub(heightStep, firstHeightMovementPosition);\r\n\r\n isHorizontalCheckOk = this._horizontalCheckRaycast(secondPosition, firstHeightMovementPosition, movementDirection, up,\r\n true, ignoreGroundAngleCallback, ignoreCeilingAngleCallback,\r\n feetPosition, true,\r\n collisionCheckParams, collisionRuntimeParams);\r\n\r\n if (!isHorizontalCheckOk) break;\r\n }\r\n\r\n if (collisionCheckParams.myHorizontalMovementCheckVerticalDiagonalDownwardInward) {\r\n secondHeightMovementPosition = secondPosition.vec3_add(movementStep, secondHeightMovementPosition);\r\n secondHeightMovementPosition = secondHeightMovementPosition.vec3_sub(heightStep, secondHeightMovementPosition);\r\n\r\n isHorizontalCheckOk = this._horizontalCheckRaycast(firstPosition, secondHeightMovementPosition, movementDirection, up,\r\n true, ignoreGroundAngleCallback, ignoreCeilingAngleCallback,\r\n feetPosition, true,\r\n collisionCheckParams, collisionRuntimeParams);\r\n\r\n if (!isHorizontalCheckOk) break;\r\n }\r\n\r\n if (m == 0) {\r\n if (collisionCheckParams.myHorizontalMovementCheckVerticalHorizontalBorderDiagonalOutward) {\r\n secondHeightPosition = secondPosition.vec3_sub(heightStep, secondHeightPosition);\r\n\r\n isHorizontalCheckOk = this._horizontalCheckRaycast(secondHeightPosition, firstPosition, movementDirection, up,\r\n true, ignoreGroundAngleCallback, ignoreCeilingAngleCallback,\r\n feetPosition, true,\r\n collisionCheckParams, collisionRuntimeParams);\r\n\r\n if (!isHorizontalCheckOk) break;\r\n }\r\n\r\n if (collisionCheckParams.myHorizontalMovementCheckVerticalHorizontalBorderDiagonalInward) {\r\n let firstHeightPosition = firstPosition.vec3_sub(heightStep);\r\n\r\n isHorizontalCheckOk = this._horizontalCheckRaycast(firstHeightPosition, secondPosition, movementDirection, up,\r\n true, ignoreGroundAngleCallback, ignoreCeilingAngleCallback,\r\n feetPosition, true,\r\n collisionCheckParams, collisionRuntimeParams);\r\n\r\n if (!isHorizontalCheckOk) break;\r\n }\r\n }\r\n\r\n if (collisionCheckParams.myHorizontalMovementCheckVerticalHorizontalBorderDiagonalOutward) {\r\n firstMovementPosition = firstPosition.vec3_add(movementStep, firstMovementPosition);\r\n secondHeightMovementPosition = secondPosition.vec3_sub(heightStep, secondHeightMovementPosition).vec3_add(movementStep, secondHeightMovementPosition);\r\n\r\n isHorizontalCheckOk = this._horizontalCheckRaycast(secondHeightMovementPosition, firstMovementPosition, movementDirection, up,\r\n true, ignoreGroundAngleCallback, ignoreCeilingAngleCallback,\r\n feetPosition, true,\r\n collisionCheckParams, collisionRuntimeParams);\r\n\r\n if (!isHorizontalCheckOk) break;\r\n }\r\n\r\n if (collisionCheckParams.myHorizontalMovementCheckVerticalHorizontalBorderDiagonalInward) {\r\n secondMovementPosition = secondPosition.vec3_add(movementStep, secondMovementPosition);\r\n firstHeightMovementPosition = firstPosition.vec3_sub(heightStep, firstHeightMovementPosition).vec3_add(movementStep, firstHeightMovementPosition);\r\n\r\n isHorizontalCheckOk = this._horizontalCheckRaycast(firstHeightMovementPosition, secondMovementPosition, movementDirection, up,\r\n true, ignoreGroundAngleCallback, ignoreCeilingAngleCallback,\r\n feetPosition, true,\r\n collisionCheckParams, collisionRuntimeParams);\r\n\r\n if (!isHorizontalCheckOk) break;\r\n }\r\n }\r\n\r\n if (collisionCheckParams.myHorizontalMovementCheckVerticalStraight ||\r\n (collisionCheckParams.myHorizontalMovementHorizontalStraightCentralCheckEnabled && j == 0)) {\r\n if (m == 0) {\r\n firstHeightPosition = firstPosition.vec3_sub(heightStep, firstHeightPosition);\r\n\r\n isHorizontalCheckOk = this._horizontalCheckRaycast(firstHeightPosition, firstPosition, movementDirection, up,\r\n true, ignoreGroundAngleCallback, ignoreCeilingAngleCallback,\r\n feetPosition, true,\r\n collisionCheckParams, collisionRuntimeParams);\r\n\r\n if (!isHorizontalCheckOk) break;\r\n }\r\n\r\n {\r\n firstMovementPosition = firstPosition.vec3_add(movementStep, firstMovementPosition);\r\n firstHeightMovementPosition = firstMovementPosition.vec3_sub(heightStep, firstHeightMovementPosition);\r\n\r\n isHorizontalCheckOk = this._horizontalCheckRaycast(firstHeightMovementPosition, firstMovementPosition, movementDirection, up,\r\n true, ignoreGroundAngleCallback, ignoreCeilingAngleCallback,\r\n feetPosition, true,\r\n collisionCheckParams, collisionRuntimeParams);\r\n\r\n if (!isHorizontalCheckOk) break;\r\n }\r\n }\r\n\r\n if (collisionCheckParams.myHorizontalMovementCheckVerticalStraightDiagonalUpward ||\r\n (collisionCheckParams.myHorizontalMovementVerticalStraightDiagonalUpwardCentralCheckEnabled && j == 0)) {\r\n firstMovementPosition = firstPosition.vec3_add(movementStep, firstMovementPosition);\r\n firstHeightPosition = firstPosition.vec3_sub(heightStep, firstHeightPosition);\r\n\r\n isHorizontalCheckOk = this._horizontalCheckRaycast(firstHeightPosition, firstMovementPosition, movementDirection, up,\r\n true, ignoreGroundAngleCallback, ignoreCeilingAngleCallback,\r\n feetPosition, true,\r\n collisionCheckParams, collisionRuntimeParams);\r\n\r\n if (!isHorizontalCheckOk) break;\r\n }\r\n\r\n if (collisionCheckParams.myHorizontalMovementCheckVerticalStraightDiagonalDownward ||\r\n (collisionCheckParams.myHorizontalMovementVerticalStraightDiagonalDownwardCentralCheckEnabled && j == 0)) {\r\n firstHeightMovementPosition = firstPosition.vec3_sub(heightStep, firstHeightMovementPosition).vec3_add(movementStep, firstHeightMovementPosition);\r\n\r\n isHorizontalCheckOk = this._horizontalCheckRaycast(firstPosition, firstHeightMovementPosition, movementDirection, up,\r\n true, ignoreGroundAngleCallback, ignoreCeilingAngleCallback,\r\n feetPosition, true,\r\n collisionCheckParams, collisionRuntimeParams);\r\n\r\n if (!isHorizontalCheckOk) break;\r\n }\r\n\r\n if (!isHorizontalCheckOk) {\r\n collisionRuntimeParams.myIsCollidingHorizontally = true;\r\n collisionRuntimeParams.myHorizontalCollisionHit.copy(this._myRaycastResult.myHits[0]);\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return isHorizontalCheckOk;\r\n };\r\n}();\r\n\r\nCollisionCheckHorizontalMovement.prototype._horizontalMovementHorizontalCheck = function () {\r\n let movementStep = vec3_create();\r\n let movementDirection = vec3_create();\r\n let firstPosition = vec3_create();\r\n let secondPosition = vec3_create();\r\n let firstMovementPosition = vec3_create();\r\n let secondMovementPosition = vec3_create();\r\n return function _horizontalMovementHorizontalCheck(movement, feetPosition, checkPositions, heightOffset, up, ignoreGroundAngleCallback, ignoreCeilingAngleCallback, collisionCheckParams, collisionRuntimeParams) {\r\n let isHorizontalCheckOk = true;\r\n\r\n let movementStepAmount = 1;\r\n movementStep.vec3_copy(movement);\r\n\r\n if (collisionCheckParams.myHorizontalMovementStepEnabled) {\r\n movementStepAmount = Math.max(1, Math.ceil(movement.vec3_length() / collisionCheckParams.myHorizontalMovementStepMaxLength));\r\n movement.vec3_scale(1 / movementStepAmount, movementStep);\r\n }\r\n\r\n movementDirection = movement.vec3_normalize(movementDirection);\r\n\r\n for (let m = 0; m < movementStepAmount; m++) {\r\n for (let j = 0; j < checkPositions.length; j++) {\r\n firstPosition = checkPositions[j].vec3_add(movementStep.vec3_scale(m, firstPosition), firstPosition).vec3_add(heightOffset, firstPosition);\r\n\r\n if (j > 0) {\r\n let secondIndex = Math.max(0, j - 2);\r\n secondPosition = checkPositions[secondIndex].vec3_add(movementStep.vec3_scale(m, secondPosition), secondPosition).vec3_add(heightOffset, secondPosition);\r\n\r\n if (collisionCheckParams.myHorizontalMovementCheckDiagonalOutward) {\r\n firstMovementPosition = firstPosition.vec3_add(movementStep, firstMovementPosition);\r\n\r\n // #TODO Ignore hits if inside could be a paramter, so you can specify if u want to be able to exit from a collision\r\n isHorizontalCheckOk = this._horizontalCheckRaycast(secondPosition, firstMovementPosition, movementDirection, up,\r\n true, ignoreGroundAngleCallback, ignoreCeilingAngleCallback,\r\n feetPosition, true,\r\n collisionCheckParams, collisionRuntimeParams);\r\n\r\n if (!isHorizontalCheckOk) break;\r\n }\r\n\r\n if (collisionCheckParams.myHorizontalMovementCheckDiagonalInward) {\r\n secondMovementPosition = secondPosition.vec3_add(movementStep, secondMovementPosition);\r\n\r\n isHorizontalCheckOk = this._horizontalCheckRaycast(firstPosition, secondMovementPosition, movementDirection, up,\r\n true, ignoreGroundAngleCallback, ignoreCeilingAngleCallback,\r\n feetPosition, true,\r\n collisionCheckParams, collisionRuntimeParams);\r\n\r\n if (!isHorizontalCheckOk) break;\r\n }\r\n\r\n if (collisionCheckParams.myHorizontalMovementCheckHorizontalBorder) {\r\n if (m == 0) {\r\n isHorizontalCheckOk = this._horizontalCheckRaycast(secondPosition, firstPosition, movementDirection, up,\r\n true, ignoreGroundAngleCallback, ignoreCeilingAngleCallback,\r\n feetPosition, true,\r\n collisionCheckParams, collisionRuntimeParams);\r\n\r\n if (!isHorizontalCheckOk) break;\r\n }\r\n\r\n {\r\n firstMovementPosition = firstPosition.vec3_add(movementStep, firstMovementPosition);\r\n secondMovementPosition = secondPosition.vec3_add(movementStep, secondMovementPosition);\r\n\r\n isHorizontalCheckOk = this._horizontalCheckRaycast(secondMovementPosition, firstMovementPosition, movementDirection, up,\r\n true, ignoreGroundAngleCallback, ignoreCeilingAngleCallback,\r\n feetPosition, true,\r\n collisionCheckParams, collisionRuntimeParams);\r\n\r\n if (!isHorizontalCheckOk) break;\r\n }\r\n }\r\n }\r\n\r\n if (collisionCheckParams.myHorizontalMovementCheckStraight ||\r\n (collisionCheckParams.myHorizontalMovementVerticalStraightCentralCheckEnabled && j == 0)) {\r\n firstMovementPosition = firstPosition.vec3_add(movementStep, firstMovementPosition);\r\n\r\n isHorizontalCheckOk = this._horizontalCheckRaycast(firstPosition, firstMovementPosition, null, up,\r\n true, ignoreGroundAngleCallback, ignoreCeilingAngleCallback,\r\n feetPosition, true,\r\n collisionCheckParams, collisionRuntimeParams);\r\n\r\n if (!isHorizontalCheckOk) break;\r\n }\r\n }\r\n\r\n if (!isHorizontalCheckOk) {\r\n collisionRuntimeParams.myIsCollidingHorizontally = true;\r\n collisionRuntimeParams.myHorizontalCollisionHit.copy(this._myRaycastResult.myHits[0]);\r\n break;\r\n }\r\n }\r\n\r\n return isHorizontalCheckOk;\r\n };\r\n}();", "import { vec3_create, vec4_create } from \"../../../../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Globals } from \"../../../../../../pp/globals.js\";\r\nimport { CollisionCheckHorizontalMovement } from \"./collision_check_horizontal_movement.js\";\r\n\r\nexport class CollisionCheckHorizontalSliding extends CollisionCheckHorizontalMovement {\r\n\r\n _horizontalSlide(movement, feetPosition, height, up, forward, allowSurfaceSteepFix, collisionCheckParams, collisionRuntimeParams, previousCollisionRuntimeParams, outSlideMovement) {\r\n // Implemented outside class definition\r\n }\r\n\r\n _horizontalSlideCheckOpposite(movement, feetPosition, height, up, forward, previousHorizontalMovement, previousIsSliding, allowSurfaceSteepFix, collisionCheckParams, preSlideCollisionRuntimeParams, postSlideCollisionRuntimeParams, previousCollisionRuntimeParams, outSlideMovement) {\r\n // Implemented outside class definition\r\n }\r\n\r\n _horizontalSlideFlickerCheck(movement, slideMovement, feetPosition, height, up, forward, allowSurfaceSteepFix, collisionCheckParams, collisionRuntimeParams, previousCollisionRuntimeParams) {\r\n // Implemented outside class definition\r\n }\r\n\r\n _internalHorizontalSlide(movement, feetPosition, height, up, forward, previousHorizontalMovement, allowSurfaceSteepFix, collisionCheckParams, collisionRuntimeParams, previousCollisionRuntimeParams, checkOppositeDirection, outSlideMovement) {\r\n // Implemented outside class definition\r\n }\r\n\r\n _horizontalCheckBetterSlideNormal(movement, originalFeetPosition, originalHeight, feetPosition, height, up, forward, collisionCheckParams, collisionRuntimeParams) {\r\n // Implemented outside class definition\r\n }\r\n\r\n _isSlidingNormalValid(movement, up, collisionRuntimeParams) {\r\n // Implemented outside class definition\r\n }\r\n}\r\n\r\n\r\n\r\n// IMPLEMENTATION\r\n\r\nCollisionCheckHorizontalSliding.prototype._horizontalSlide = function () {\r\n let previousHorizontalMovement = vec3_create();\r\n return function _horizontalSlide(movement, feetPosition, height, up, forward, allowSurfaceSteepFix, collisionCheckParams, collisionRuntimeParams, previousCollisionRuntimeParams, outSlideMovement) {\r\n if (movement.vec3_isZero(0.00001)) {\r\n return outSlideMovement.vec3_zero();\r\n }\r\n\r\n this._mySlidingCollisionRuntimeParams.copy(collisionRuntimeParams);\r\n\r\n previousHorizontalMovement.vec3_copy(collisionRuntimeParams.mySlidingPreviousHorizontalMovement);\r\n outSlideMovement = this._internalHorizontalSlide(movement, feetPosition, height, up, forward, previousHorizontalMovement, allowSurfaceSteepFix, collisionCheckParams, this._mySlidingCollisionRuntimeParams, previousCollisionRuntimeParams, false, outSlideMovement);\r\n\r\n if (collisionCheckParams.mySlidingCheckBothDirections) {\r\n this._horizontalSlideCheckOpposite(movement, feetPosition, height, up, forward, previousHorizontalMovement, this._myPrevCollisionRuntimeParams.myIsSliding, allowSurfaceSteepFix, collisionCheckParams, collisionRuntimeParams, this._mySlidingCollisionRuntimeParams, previousCollisionRuntimeParams, outSlideMovement);\r\n\r\n //console.error(\"post oppo:\", outSlideMovement.vec_toString());\r\n }\r\n\r\n //console.error(\" \");\r\n\r\n if (this._mySlidingCollisionRuntimeParams.myIsSliding && collisionCheckParams.mySlidingFlickeringPreventionType > 0) {\r\n let isFlickering = this._horizontalSlideFlickerCheck(movement, outSlideMovement, feetPosition, height, up, forward, allowSurfaceSteepFix, collisionCheckParams, this._mySlidingCollisionRuntimeParams, previousCollisionRuntimeParams);\r\n this._mySlidingCollisionRuntimeParams.myIsSliding = !isFlickering;\r\n }\r\n\r\n if (this._mySlidingCollisionRuntimeParams.myIsSliding) {\r\n let backupFlickerPrevented = collisionRuntimeParams.myIsSlidingFlickerPrevented;\r\n collisionRuntimeParams.copy(this._mySlidingCollisionRuntimeParams);\r\n collisionRuntimeParams.myIsSlidingFlickerPrevented = backupFlickerPrevented || this._mySlidingCollisionRuntimeParams.myIsSlidingFlickerPrevented;\r\n } else {\r\n collisionRuntimeParams.myIsSlidingFlickerPrevented = collisionRuntimeParams.myIsSlidingFlickerPrevented || this._mySlidingCollisionRuntimeParams.myIsSlidingFlickerPrevented;\r\n //console.error(\"slide cancel\");\r\n outSlideMovement.vec3_zero();\r\n }\r\n\r\n return outSlideMovement;\r\n };\r\n}();\r\n\r\nCollisionCheckHorizontalSliding.prototype._horizontalSlideCheckOpposite = function () {\r\n let horizontalCollisionNormal = vec3_create();\r\n let oppositeSlideMovement = vec3_create();\r\n //let hitNormal = vec3_create();\r\n return function _horizontalSlideCheckOpposite(movement, feetPosition, height, up, forward, previousHorizontalMovement, previousIsSliding, allowSurfaceSteepFix, collisionCheckParams, preSlideCollisionRuntimeParams, postSlideCollisionRuntimeParams, previousCollisionRuntimeParams, outSlideMovement) {\r\n horizontalCollisionNormal = preSlideCollisionRuntimeParams.myHorizontalCollisionHit.myNormal.vec3_removeComponentAlongAxis(up, horizontalCollisionNormal);\r\n horizontalCollisionNormal.vec3_normalize(horizontalCollisionNormal);\r\n\r\n //console.error(\"oppo\", outSlideMovement.vec_toString(), movement.vec_toString(15));\r\n let angleNormalWithMovementThreshold = 20;\r\n if (horizontalCollisionNormal.vec3_angle(movement) > 180 - angleNormalWithMovementThreshold) {\r\n //console.error(\"opposite normal ok\");\r\n return;\r\n } else if (previousIsSliding && postSlideCollisionRuntimeParams.myIsSliding && outSlideMovement.vec3_isConcordant(previousHorizontalMovement)) {\r\n //console.error(\"previous direction ok\");\r\n //console.error(postSlideCollisionRuntimeParams.myIsSliding, outSlideMovement.vec3_isConcordant(previousHorizontalMovement), outSlideMovement.vec_toString(), previousHorizontalMovement.vec_toString());\r\n return;\r\n } else {\r\n //console.error(\"no fast exit\");\r\n }\r\n\r\n //console.error(horizontalCollisionNormal.vec3_angle(movement));\r\n\r\n this._mySlidingOppositeDirectionCollisionRuntimeParams.copy(preSlideCollisionRuntimeParams);\r\n\r\n oppositeSlideMovement = this._internalHorizontalSlide(movement, feetPosition, height, up, forward, previousHorizontalMovement, allowSurfaceSteepFix, collisionCheckParams, this._mySlidingOppositeDirectionCollisionRuntimeParams, previousCollisionRuntimeParams, true, oppositeSlideMovement);\r\n\r\n //console.error(previousHorizontalMovement.vec_toString(), outSlideMovement.vec_toString(), oppositeSlideMovement.vec_toString());\r\n if (this._mySlidingOppositeDirectionCollisionRuntimeParams.myIsSliding) {\r\n\r\n let isOppositeBetter = false;\r\n if (postSlideCollisionRuntimeParams.myIsSliding) {\r\n if (movement.vec3_angle(oppositeSlideMovement) < movement.vec3_angle(outSlideMovement) - 0.0001) {\r\n //console.error(\"oppo minor\");\r\n isOppositeBetter = true;\r\n } else {\r\n if (Math.abs(movement.vec3_angle(oppositeSlideMovement) - movement.vec3_angle(outSlideMovement)) <= 0.0001) {\r\n if (previousHorizontalMovement.vec3_angle(oppositeSlideMovement) < previousHorizontalMovement.vec3_angle(outSlideMovement) - 0.0001) {\r\n let angleNormalWithMovementThreshold = 5;\r\n if (horizontalCollisionNormal.vec3_angle(movement) < 90 + angleNormalWithMovementThreshold) {\r\n //console.error(\"oppo equal\");\r\n isOppositeBetter = true;\r\n }\r\n }\r\n }\r\n }\r\n //console.error(movement.vec3_angle(outSlideMovement), movement.vec3_angle(oppositeSlideMovement));\r\n\r\n } else {\r\n let angleEpsilon = 0.001;\r\n if (movement.vec3_isConcordant(oppositeSlideMovement) && movement.vec3_angle(oppositeSlideMovement) < 90 - angleEpsilon) {\r\n //console.error(\"oppo not\");\r\n isOppositeBetter = true;\r\n } else {\r\n //console.error(\"oppo not prevention\");\r\n }\r\n }\r\n\r\n if (isOppositeBetter) {\r\n /* {\r\n hitNormal.vec3_copy(preSlideCollisionRuntimeParams.myHorizontalCollisionHit.myNormal);\r\n \r\n let visualParams = new VisualArrowParams();\r\n visualParams.myStart = feetPosition;\r\n visualParams.myDirection = slideMovement.vec3_normalize();\r\n visualParams.myLength = 0.2;\r\n visualParams.myMaterial = Globals.getDefaultMaterials(this._myEngine).myFlatOpaque.clone();\r\n visualParams.myMaterial.color = vec4_create(0, 0, 1, 1);\r\n Globals.getDebugVisualManager(this._myEngine).draw(visualParams, 1);\r\n }\r\n \r\n {\r\n let visualParams = new VisualArrowParams();\r\n visualParams.myStart = feetPosition;\r\n visualParams.myDirection = oppositeSlideMovement.vec3_normalize();\r\n visualParams.myLength = 0.2;\r\n visualParams.myMaterial = Globals.getDefaultMaterials(this._myEngine).myFlatOpaque.clone();\r\n visualParams.myMaterial.color = vec4_create(1, 0, 1, 1);\r\n Globals.getDebugVisualManager(this._myEngine).draw(visualParams, 1);\r\n }\r\n \r\n {\r\n let visualParams = new VisualArrowParams();\r\n visualParams.myStart = feetPosition;\r\n visualParams.myDirection = hitNormal.vec3_normalize();\r\n visualParams.myLength = 0.2;\r\n visualParams.myMaterial = Globals.getDefaultMaterials(this._myEngine).myFlatOpaque.clone();\r\n visualParams.myMaterial.color = vec4_create(1, 1, 1, 1);\r\n Globals.getDebugVisualManager(this._myEngine).draw(visualParams, 1);\r\n } */\r\n\r\n outSlideMovement.vec3_copy(oppositeSlideMovement);\r\n postSlideCollisionRuntimeParams.copy(this._mySlidingOppositeDirectionCollisionRuntimeParams);\r\n } else {\r\n //console.error(\"normal\", previousHorizontalMovement.vec_toString(), outSlideMovement.vec_toString(), oppositeSlideMovement.vec_toString());\r\n }\r\n } else {\r\n //console.error(\"oppo not sliding\");\r\n }\r\n };\r\n}();\r\n\r\nCollisionCheckHorizontalSliding.prototype._horizontalSlideFlickerCheck = function () {\r\n let previousHorizontalMovement = vec3_create();\r\n let newFeetPosition = vec3_create();\r\n let fixedMovement = vec3_create();\r\n let flickerFixSlideMovement = vec3_create();\r\n return function _horizontalSlideFlickerCheck(movement, slideMovement, feetPosition, height, up, forward, allowSurfaceSteepFix, collisionCheckParams, collisionRuntimeParams, previousCollisionRuntimeParams) {\r\n let isFlickering = false;\r\n\r\n previousHorizontalMovement.vec3_copy(collisionRuntimeParams.mySlidingPreviousHorizontalMovement);\r\n let shouldCheckFlicker =\r\n this._myPrevCollisionRuntimeParams.myIsSlidingFlickerPrevented ||\r\n previousHorizontalMovement.vec3_isZero(0.00001);\r\n\r\n if (!shouldCheckFlicker) {\r\n if (this._myPrevCollisionRuntimeParams.myIsSliding || !collisionCheckParams.mySlidingFlickeringPreventionCheckOnlyIfAlreadySliding) {\r\n let flickerCollisionAngle = 90;\r\n let flickerMovementAngle = 85;\r\n switch (collisionCheckParams.mySlidingFlickeringPreventionType) {\r\n case 1:\r\n shouldCheckFlicker = previousHorizontalMovement.vec3_signTo(movement, up, 0) != slideMovement.vec3_signTo(movement, up, 0);\r\n break;\r\n case 2:\r\n shouldCheckFlicker = collisionCheckParams.mySlidingCheckBothDirections && collisionRuntimeParams.myIsSlidingIntoOppositeDirection;\r\n shouldCheckFlicker = shouldCheckFlicker || Math.abs(collisionRuntimeParams.mySlidingCollisionAngle) > flickerCollisionAngle + 0.00001;\r\n break;\r\n case 3:\r\n shouldCheckFlicker = collisionCheckParams.mySlidingCheckBothDirections && collisionRuntimeParams.myIsSlidingIntoOppositeDirection;\r\n shouldCheckFlicker = shouldCheckFlicker || Math.abs(collisionRuntimeParams.mySlidingCollisionAngle) > flickerCollisionAngle + 0.00001;\r\n\r\n shouldCheckFlicker = shouldCheckFlicker || (\r\n Math.abs(Math.abs(collisionRuntimeParams.mySlidingCollisionAngle) - flickerCollisionAngle) < 0.00001 &&\r\n Math.abs(collisionRuntimeParams.mySlidingMovementAngle) > flickerMovementAngle + 0.00001);\r\n break;\r\n case 4:\r\n shouldCheckFlicker = true;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n //console.error(this._myPrevCollisionRuntimeParams.myIsSlidingFlickerPrevented);\r\n if (shouldCheckFlicker || this._myPrevCollisionRuntimeParams.mySlidingFlickerPreventionCheckAnywayCounter > 0) {\r\n if (shouldCheckFlicker) {\r\n collisionRuntimeParams.mySlidingFlickerPreventionCheckAnywayCounter = collisionCheckParams.mySlidingFlickerPreventionCheckAnywayCounter;\r\n } else {\r\n collisionRuntimeParams.mySlidingFlickerPreventionCheckAnywayCounter = Math.max(0, this._myPrevCollisionRuntimeParams.mySlidingFlickerPreventionCheckAnywayCounter - 1);\r\n //console.error(collisionRuntimeParams.mySlidingFlickerPreventionCheckAnywayCounter);\r\n }\r\n\r\n //console.error(previousHorizontalMovement.vec3_signTo(movement, up, 0), slideMovement.vec3_signTo(movement, up, 0));\r\n if ((collisionCheckParams.mySlidingFlickeringPreventionType != 1 || collisionRuntimeParams.myIsSlidingFlickerPrevented || this._myPrevCollisionRuntimeParams.mySlidingFlickerPreventionCheckAnywayCounter > 0) &&\r\n (this._myPrevCollisionRuntimeParams.myIsSliding && previousHorizontalMovement.vec3_signTo(movement, up, 0) != slideMovement.vec3_signTo(movement, up, 0))) {\r\n isFlickering = true;\r\n collisionRuntimeParams.myIsSlidingFlickerPrevented = true;\r\n //console.error(\"quick flicker fix\");\r\n } else {\r\n this._mySlidingFlickeringFixCollisionRuntimeParams.reset();\r\n this._mySlidingFlickeringFixCollisionRuntimeParams.mySliding90DegreesSign = collisionRuntimeParams.mySliding90DegreesSign;\r\n this._mySlidingFlickeringFixCollisionRuntimeParams.mySlidingRecompute90DegreesSign = false;\r\n\r\n //console.error(\"slide movement\", slideMovement.vec_toString(), feetPosition.vec_toString());\r\n newFeetPosition = feetPosition.vec3_add(slideMovement, newFeetPosition);\r\n\r\n let backupDebugEnabled = collisionCheckParams.myDebugEnabled;\r\n collisionCheckParams.myDebugEnabled = collisionCheckParams.myDebugEnabled && collisionCheckParams.myDebugSlidingEnabled;\r\n\r\n fixedMovement.vec3_zero();\r\n fixedMovement = this._horizontalCheck(movement, newFeetPosition, height, up, forward, allowSurfaceSteepFix, collisionCheckParams, this._mySlidingFlickeringFixCollisionRuntimeParams, previousCollisionRuntimeParams, false, fixedMovement);\r\n collisionCheckParams.myDebugEnabled = backupDebugEnabled;\r\n\r\n if (fixedMovement.vec3_isZero(0.00001)) {\r\n this._mySlidingFlickeringFixSlidingCollisionRuntimeParams.copy(this._mySlidingFlickeringFixCollisionRuntimeParams);\r\n\r\n flickerFixSlideMovement = this._internalHorizontalSlide(movement, newFeetPosition, height, up, forward, slideMovement, allowSurfaceSteepFix, collisionCheckParams, this._mySlidingFlickeringFixSlidingCollisionRuntimeParams, previousCollisionRuntimeParams, false, flickerFixSlideMovement);\r\n\r\n if (collisionCheckParams.mySlidingCheckBothDirections) {\r\n this._horizontalSlideCheckOpposite(movement, newFeetPosition, height, up, forward, slideMovement, true, allowSurfaceSteepFix, collisionCheckParams, this._mySlidingFlickeringFixCollisionRuntimeParams, this._mySlidingFlickeringFixSlidingCollisionRuntimeParams, previousCollisionRuntimeParams, flickerFixSlideMovement);\r\n }\r\n\r\n if (this._mySlidingFlickeringFixSlidingCollisionRuntimeParams.myIsSliding) {\r\n if (slideMovement.vec3_signTo(movement, up, 0) != flickerFixSlideMovement.vec3_signTo(movement, up, 0)) {\r\n\r\n /* {\r\n hitNormal.vec3_copy(collisionRuntimeParams.mySlidingCollisionHit.myNormal);\r\n \r\n let visualParams = new VisualArrowParams();\r\n visualParams.myStart = feetPosition;\r\n visualParams.myDirection = slideMovement.vec3_normalize();\r\n visualParams.myLength = 0.2;\r\n visualParams.myMaterial = Globals.getDefaultMaterials(this._myEngine).myFlatOpaque.clone();\r\n visualParams.myMaterial.color = vec4_create(0.5, 0.5, 0.5, 1);\r\n Globals.getDebugVisualManager(this._myEngine).draw(visualParams, 2);\r\n }\r\n \r\n {\r\n let visualParams = new VisualArrowParams();\r\n visualParams.myStart = feetPosition;\r\n visualParams.myDirection = flickerFixSlideMovement.vec3_normalize();\r\n visualParams.myLength = 0.2;\r\n visualParams.myMaterial = Globals.getDefaultMaterials(this._myEngine).myFlatOpaque.clone();\r\n visualParams.myMaterial.color = vec4_create(1, 1, 1, 1);\r\n Globals.getDebugVisualManager(this._myEngine).draw(visualParams, 2);\r\n }\r\n \r\n {\r\n let visualParams = new VisualArrowParams();\r\n visualParams.myStart = feetPosition;\r\n visualParams.myDirection = hitNormal.vec3_normalize();\r\n visualParams.myLength = 0.2;\r\n visualParams.myMaterial = Globals.getDefaultMaterials(this._myEngine).myFlatOpaque.clone();\r\n visualParams.myMaterial.color = vec4_create(1, 0, 0.5, 1);\r\n Globals.getDebugVisualManager(this._myEngine).draw(visualParams, 2);\r\n } */\r\n\r\n isFlickering = true;\r\n collisionRuntimeParams.myIsSlidingFlickerPrevented = true;\r\n //console.error(\"expensive flicker fix\");\r\n }\r\n }\r\n }\r\n }\r\n } else {\r\n //console.error(\"no flicker check\");\r\n }\r\n\r\n if (isFlickering) {\r\n //console.error(\"flicker\", shouldCheckFlicker, slideMovement.vec_toString(), \"\\n\");\r\n } else {\r\n //console.error(\"no flicker\", shouldCheckFlicker, slideMovement.vec_toString(), \"\\n\");\r\n }\r\n\r\n return isFlickering;\r\n };\r\n}();\r\n\r\nCollisionCheckHorizontalSliding.prototype._internalHorizontalSlide = function () {\r\n let invertedNormal = vec3_create();\r\n let slidingMovement = vec3_create();\r\n let movement90 = vec3_create();\r\n let currentMovement = vec3_create();\r\n let slideMovementForward = vec3_create();\r\n let fixedMovement = vec3_create();\r\n return function _internalHorizontalSlide(movement, feetPosition, height, up, forward, previousHorizontalMovement, allowSurfaceSteepFix, collisionCheckParams, collisionRuntimeParams, previousCollisionRuntimeParams, checkOppositeDirection, outSlideMovement) {\r\n if (movement.vec3_isZero(0.00001)) {\r\n return outSlideMovement.vec3_zero();\r\n }\r\n\r\n //let copiedNormal = collisionRuntimeParams.myHorizontalCollisionHit.myNormal.pp_clone();\r\n invertedNormal = collisionRuntimeParams.myHorizontalCollisionHit.myNormal.vec3_negate(invertedNormal);\r\n invertedNormal.vec3_removeComponentAlongAxis(up, invertedNormal);\r\n invertedNormal[0] = Math.abs(invertedNormal[0]) < 0.01 ? 0 : invertedNormal[0];\r\n invertedNormal[2] = Math.abs(invertedNormal[2]) < 0.01 ? 0 : invertedNormal[2];\r\n invertedNormal.vec3_normalize(invertedNormal);\r\n\r\n collisionRuntimeParams.mySlidingCollisionHit.copy(collisionRuntimeParams.myHorizontalCollisionHit);\r\n collisionRuntimeParams.mySlidingWallNormal.vec3_copy(collisionRuntimeParams.myHorizontalCollisionHit.myNormal);\r\n\r\n outSlideMovement.vec3_zero();\r\n\r\n slidingMovement.vec3_copy(invertedNormal);\r\n if (checkOppositeDirection) {\r\n slidingMovement.vec3_copy(movement);\r\n slidingMovement.vec3_normalize(slidingMovement);\r\n }\r\n\r\n if (!slidingMovement.vec3_isZero(0.00001)) {\r\n\r\n slidingMovement.vec3_scale(movement.vec3_length(), slidingMovement);\r\n\r\n let slidingSign = invertedNormal.vec3_signTo(movement, up);\r\n\r\n if (collisionCheckParams.mySlidingAdjustSign90Degrees) {\r\n let angleThreshold = 0.1;\r\n if (invertedNormal.vec3_angle(movement) < angleThreshold && collisionRuntimeParams.mySliding90DegreesSign != 0) {\r\n //console.error(slidingSign, collisionRuntimeParams.mySliding90DegreesSign);\r\n slidingSign = collisionRuntimeParams.mySliding90DegreesSign;\r\n } else if (collisionRuntimeParams.mySliding90DegreesSign == 0 || collisionRuntimeParams.mySlidingRecompute90DegreesSign) {\r\n collisionRuntimeParams.mySliding90DegreesSign = slidingSign;\r\n } else {\r\n //console.error(\"no fix\");\r\n }\r\n\r\n collisionRuntimeParams.mySlidingRecompute90DegreesSign = false;\r\n }\r\n\r\n if (checkOppositeDirection) {\r\n slidingSign *= -1;\r\n }\r\n\r\n let currentAngle = 90 * slidingSign;\r\n let maxAngle = Math.pp_angleClamp(slidingMovement.vec3_angleSigned(movement.vec3_rotateAxis(90 * slidingSign, up, movement90), up) * slidingSign, true) * slidingSign;\r\n let minAngle = Math.pp_angleClamp(slidingMovement.vec3_angleSigned(movement, up) * slidingSign, true) * slidingSign;\r\n\r\n if (checkOppositeDirection) {\r\n maxAngle = currentAngle;\r\n minAngle = 0;\r\n } else {\r\n if (Math.abs(maxAngle) < Math.abs(minAngle)) {\r\n // This should only happens because of the 90 degrees adjustment\r\n //console.error(\"90 adjust\");\r\n minAngle = 0;\r\n }\r\n\r\n if (Math.abs(Math.abs(maxAngle) - Math.abs(minAngle)) < 0.0001) {\r\n minAngle = maxAngle;\r\n }\r\n\r\n if (Math.abs(maxAngle) < Math.abs(currentAngle) || Math.abs(Math.abs(maxAngle) - Math.abs(currentAngle)) < 0.0001) {\r\n //console.error(\"max\", currentAngle.toFixed(15), maxAngle.toFixed(15));\r\n currentAngle = maxAngle;\r\n }\r\n\r\n if (Math.abs(currentAngle) < Math.abs(minAngle) || Math.abs(Math.abs(minAngle) - Math.abs(currentAngle)) < 0.0001) {\r\n //console.error(\"min\", currentAngle.toFixed(3), minAngle.toFixed(3));\r\n currentAngle = minAngle;\r\n }\r\n\r\n //console.error(maxAngle.toFixed(3), minAngle.toFixed(3));\r\n }\r\n\r\n if (checkOppositeDirection && !previousHorizontalMovement.vec3_isZero(0.000001)) {\r\n let angleWithPrevious = movement.vec3_angleSigned(previousHorizontalMovement, up);\r\n if (Math.pp_sign(angleWithPrevious) == Math.pp_sign(maxAngle) && Math.abs(maxAngle) > Math.abs(angleWithPrevious)) {\r\n currentAngle = angleWithPrevious;\r\n //console.error(\"better angle\", currentAngle, previousHorizontalMovement.vec_toString(10), movement.vec_toString(10));\r\n }\r\n }\r\n\r\n currentMovement.vec3_zero();\r\n\r\n let backupDebugEnabled = collisionCheckParams.myDebugEnabled;\r\n collisionCheckParams.myDebugEnabled = collisionCheckParams.myDebugEnabled && collisionCheckParams.myDebugSlidingEnabled;\r\n\r\n //let originalCurrentAngle = currentAngle;\r\n for (let i = 0; i < collisionCheckParams.mySlidingMaxAttempts; i++) {\r\n this._myInternalSlidingCollisionRuntimeParams.copy(collisionRuntimeParams);\r\n\r\n currentMovement = slidingMovement.vec3_rotateAxis(currentAngle, up, currentMovement);\r\n\r\n slideMovementForward.vec3_copy(forward);\r\n if (!collisionCheckParams.myCheckHorizontalFixedForwardEnabled) {\r\n if (!currentMovement.vec3_isZero()) {\r\n slideMovementForward = currentMovement.vec3_normalize(slideMovementForward);\r\n }\r\n }\r\n\r\n fixedMovement.vec3_zero();\r\n fixedMovement = this._horizontalCheck(currentMovement, feetPosition, height, up, slideMovementForward, allowSurfaceSteepFix, collisionCheckParams, this._myInternalSlidingCollisionRuntimeParams, previousCollisionRuntimeParams, true, fixedMovement);\r\n if (!fixedMovement.vec3_isZero(0.00001)) {\r\n outSlideMovement.vec3_copy(currentMovement);\r\n collisionRuntimeParams.copy(this._myInternalSlidingCollisionRuntimeParams);\r\n collisionRuntimeParams.myIsSliding = true;\r\n collisionRuntimeParams.myIsSlidingIntoOppositeDirection = checkOppositeDirection;\r\n collisionRuntimeParams.mySlidingMovementAngle = movement.vec3_angleSigned(currentMovement, up);\r\n collisionRuntimeParams.mySlidingCollisionAngle = invertedNormal.vec3_angleSigned(currentMovement, up);\r\n\r\n maxAngle = currentAngle;\r\n currentAngle = (maxAngle + minAngle) / 2;\r\n } else {\r\n if (currentAngle != maxAngle) {\r\n minAngle = currentAngle;\r\n }\r\n\r\n if (i == 0 && currentAngle != maxAngle) {\r\n currentAngle = maxAngle;\r\n } else {\r\n currentAngle = (minAngle + maxAngle) / 2;\r\n }\r\n }\r\n\r\n if (Math.abs(Math.abs(maxAngle) - Math.abs(minAngle)) < 0.0001) {\r\n //console.error(\"fast slide exit\", maxAngle, minAngle, originalCurrentAngle, collisionRuntimeParams.myIsSliding, checkOppositeDirection);\r\n break;\r\n }\r\n }\r\n\r\n collisionCheckParams.myDebugEnabled = backupDebugEnabled;\r\n }\r\n\r\n if (!collisionRuntimeParams.myIsSliding) {\r\n collisionRuntimeParams.mySlidingCollisionHit.reset();\r\n } else {\r\n //console.error(\"slide angle\", movement.vec3_angleSigned(invertedNormal, up), invertedNormal.vec_toString(), copiedNormal.vec_toString());\r\n }\r\n\r\n return outSlideMovement;\r\n };\r\n}();\r\n\r\nCollisionCheckHorizontalSliding.prototype._horizontalCheckBetterSlideNormal = function () {\r\n let movementDirection = vec3_create();\r\n let hitDirection = vec3_create();\r\n let projectAlongAxis = vec3_create();\r\n let fixedMovement = vec3_create();\r\n let newFixedFeetPosition = vec3_create();\r\n let newFeetPosition = vec3_create();\r\n return function _horizontalCheckBetterSlideNormal(movement, originalFeetPosition, originalHeight, feetPosition, height, up, forward, collisionCheckParams, collisionRuntimeParams) {\r\n // Check for a better slide hit position and normal\r\n\r\n movementDirection = movement.vec3_normalize(movementDirection);\r\n\r\n let hitPosition = collisionRuntimeParams.myHorizontalCollisionHit.myPosition;\r\n let halfConeAngle = Math.min(collisionCheckParams.myHalfConeAngle, 90);\r\n hitDirection = hitPosition.vec3_sub(feetPosition, hitDirection);\r\n if (hitDirection.vec3_isToTheRight(movementDirection, up)) {\r\n projectAlongAxis = movementDirection.vec3_rotateAxis(-halfConeAngle, up, projectAlongAxis);\r\n } else {\r\n projectAlongAxis = movementDirection.vec3_rotateAxis(halfConeAngle, up, projectAlongAxis);\r\n }\r\n\r\n fixedMovement = hitDirection.vec3_projectOnAxisAlongAxis(movementDirection, projectAlongAxis, fixedMovement);\r\n /* if (fixedMovement.vec3_angle(movementDirection) >= 0.00001 || fixedMovement.vec3_length() > movement.vec3_length() + 0.00001) {\r\n console.error(\"ERROR, project function should return a smaller movement in the same direction\",\r\n fixedMovement.vec3_angle(movementDirection), fixedMovement.vec3_length(), movement.vec3_length());\r\n // Maybe epsilon could be 0.0001? is higher but still 10 times less then a millimiter\r\n } */\r\n\r\n if (fixedMovement.vec3_isConcordant(movementDirection)) {\r\n fixedMovement = movementDirection.vec3_scale(Math.min(fixedMovement.vec3_length(), movement.vec3_length()), fixedMovement);\r\n } else {\r\n fixedMovement.vec3_zero();\r\n }\r\n\r\n if (collisionCheckParams.myDebugEnabled && collisionCheckParams.myDebugHorizontalMovementEnabled && Globals.isDebugEnabled(this._myEngine)) {\r\n Globals.getDebugVisualManager(this._myEngine).drawArrow(0, feetPosition, movementDirection, fixedMovement.vec3_length(), vec4_create(1, 0, 1, 1));\r\n }\r\n\r\n this._myCheckBetterSlidingNormalCollisionRuntimeParams.copy(collisionRuntimeParams);\r\n this._myCheckBetterSlidingNormalCollisionRuntimeParams.myIsCollidingHorizontally = false;\r\n this._myCheckBetterSlidingNormalCollisionRuntimeParams.myHorizontalCollisionHit.reset();\r\n\r\n newFixedFeetPosition = feetPosition.vec3_add(fixedMovement, newFixedFeetPosition);\r\n newFeetPosition = feetPosition.vec3_add(fixedMovement, newFeetPosition);\r\n\r\n let backupDebugEnabled = collisionCheckParams.myDebugEnabled;\r\n collisionCheckParams.myDebugEnabled = collisionCheckParams.myDebugEnabled && collisionCheckParams.myDebugSlidingEnabled;\r\n\r\n if (collisionCheckParams.myHorizontalPositionCheckEnabled) {\r\n this._horizontalPositionCheck(originalFeetPosition, originalHeight, newFixedFeetPosition, height, up, forward, collisionCheckParams, this._myCheckBetterSlidingNormalCollisionRuntimeParams);\r\n }\r\n\r\n collisionCheckParams.myDebugEnabled = backupDebugEnabled;\r\n\r\n if (this._myCheckBetterSlidingNormalCollisionRuntimeParams.myIsCollidingHorizontally &&\r\n !this._myCheckBetterSlidingNormalCollisionRuntimeParams.myHorizontalCollisionHit.myInsideCollision) {\r\n collisionRuntimeParams.copy(this._myCheckBetterSlidingNormalCollisionRuntimeParams);\r\n }\r\n };\r\n}();\r\n\r\nCollisionCheckHorizontalSliding.prototype._isSlidingNormalValid = function () {\r\n let flatNormal = vec3_create();\r\n return function _isSlidingNormalValid(movement, up, collisionRuntimeParams) {\r\n let isValid = false;\r\n\r\n flatNormal = collisionRuntimeParams.myHorizontalCollisionHit.myNormal.vec3_removeComponentAlongAxis(up, flatNormal);\r\n flatNormal.vec3_normalize(flatNormal);\r\n\r\n if (!flatNormal.vec3_isZero(0.000001)) {\r\n isValid = true;\r\n }\r\n\r\n // I wanted to check if the normal angle was not concordant and thought that in that case it shouldn't slide but it turns out it makes sense\r\n // even for back hits which either can't resolve or at least makes me slide out of collision\r\n // At least a check for the normal to be not up is ok\r\n\r\n return isValid;\r\n };\r\n}();", "import { vec3_create } from \"../../../../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { CollisionCheckHorizontalSliding } from \"./collision_check_horizontal_sliding.js\";\r\n\r\nexport class CollisionCheckHorizontal extends CollisionCheckHorizontalSliding {\r\n\r\n _horizontalCheck(movement, feetPosition, height, up, forward, allowSurfaceSteepFix, collisionCheckParams, collisionRuntimeParams, previousCollisionRuntimeParams, avoidSlidingExtraCheck, outFixedMovement) {\r\n // Implemented outside class definition\r\n }\r\n}\r\n\r\n\r\n\r\n// IMPLEMENTATION\r\n\r\nCollisionCheckHorizontal.prototype._horizontalCheck = function () {\r\n let fixedFeetPosition = vec3_create();\r\n let newFixedFeetPosition = vec3_create();\r\n let newFeetPosition = vec3_create();\r\n let horizontalDirection = vec3_create();\r\n return function _horizontalCheck(movement, feetPosition, height, up, forward, allowSurfaceSteepFix, collisionCheckParams, collisionRuntimeParams, previousCollisionRuntimeParams, avoidSlidingExtraCheck, outFixedMovement) {\r\n collisionRuntimeParams.myIsCollidingHorizontally = false;\r\n collisionRuntimeParams.myHorizontalCollisionHit.reset();\r\n outFixedMovement.vec3_zero();\r\n\r\n horizontalDirection = movement.vec3_normalize(horizontalDirection);\r\n let surfaceTooSteepResults = this._surfaceTooSteep(up, horizontalDirection, collisionCheckParams, previousCollisionRuntimeParams);\r\n if (movement.vec3_isZero(0.000001) ||\r\n ((!surfaceTooSteepResults[0] || (allowSurfaceSteepFix && collisionCheckParams.myAllowGroundSteepFix)) &&\r\n (!surfaceTooSteepResults[1] || (allowSurfaceSteepFix && collisionCheckParams.myAllowCeilingSteepFix)))) {\r\n fixedFeetPosition = feetPosition.vec3_add(up.vec3_scale(collisionCheckParams.myDistanceFromFeetToIgnore + 0.0001, fixedFeetPosition), fixedFeetPosition);\r\n let fixedHeight = Math.max(0, height - collisionCheckParams.myDistanceFromFeetToIgnore - collisionCheckParams.myDistanceFromHeadToIgnore - 0.0001 * 2);\r\n\r\n let canMove = true;\r\n if (collisionCheckParams.myHorizontalMovementCheckEnabled && !movement.vec3_isZero(0.000001)) {\r\n canMove = this._horizontalMovementCheck(movement, feetPosition, height, fixedFeetPosition, fixedHeight, up, collisionCheckParams, collisionRuntimeParams);\r\n }\r\n\r\n if (canMove) {\r\n if (collisionCheckParams.myHorizontalPositionCheckEnabled) {\r\n newFixedFeetPosition = fixedFeetPosition.vec3_add(movement, newFixedFeetPosition);\r\n newFeetPosition = feetPosition.vec3_add(movement, newFeetPosition);\r\n let canStay = this._horizontalPositionCheck(newFeetPosition, height, newFixedFeetPosition, fixedHeight, up, forward, collisionCheckParams, collisionRuntimeParams);\r\n if (canStay) {\r\n outFixedMovement.vec3_copy(movement);\r\n }\r\n\r\n if (outFixedMovement.vec3_isZero(0.000001)) {\r\n outFixedMovement.vec3_zero();\r\n }\r\n } else {\r\n outFixedMovement.vec3_copy(movement);\r\n }\r\n } else if (!avoidSlidingExtraCheck && collisionCheckParams.mySlidingEnabled && collisionCheckParams.mySlidingHorizontalMovementCheckBetterNormal) {\r\n this._horizontalCheckBetterSlideNormal(movement, feetPosition, height, fixedFeetPosition, fixedHeight, up, forward, collisionCheckParams, collisionRuntimeParams);\r\n }\r\n }\r\n\r\n return outFixedMovement;\r\n };\r\n}();", "import { RaycastHit } from \"../../../../../../cauldron/physics/physics_raycast_params.js\";\r\nimport { vec3_create } from \"../../../../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { CollisionCheckHorizontal } from \"./collision_check_horizontal.js\";\r\n\r\nexport class CollisionCheckVertical extends CollisionCheckHorizontal {\r\n\r\n _verticalCheck(verticalMovement, originalMovementSign, feetPosition, height, up, forward, collisionCheckParams, collisionRuntimeParams, outFixedMovement) {\r\n // Implemented outside class definition\r\n }\r\n\r\n _verticalMovementAdjustment(verticalMovement, isMovementDownward, originalMovementSign, feetPosition, height, up, forward, collisionCheckParams, collisionRuntimeParams, outFixedMovement) {\r\n // Implemented outside class definition\r\n }\r\n\r\n _verticalPositionCheck(feetPosition, checkUpward, height, up, forward, collisionCheckParams, collisionRuntimeParams) {\r\n // Implemented outside class definition\r\n }\r\n\r\n _getVerticalCheckPositions(feetPosition, up, forward, collisionCheckParams, collisionRuntimeParams) {\r\n // Implemented outside class definition\r\n }\r\n}\r\n\r\n\r\n\r\n// IMPLEMENTATION\r\n\r\nCollisionCheckVertical.prototype._verticalCheck = function () {\r\n let newFeetPosition = vec3_create();\r\n let additionalFixedMovement = vec3_create();\r\n let zero = vec3_create(0, 0, 0);\r\n return function _verticalCheck(verticalMovement, originalMovementSign, feetPosition, height, up, forward, collisionCheckParams, collisionRuntimeParams, outFixedMovement) {\r\n collisionRuntimeParams.myIsCollidingVertically = false;\r\n collisionRuntimeParams.myVerticalCollisionHit.reset();\r\n\r\n // #TODO the sign of 0 is by default downward, but it should probably be based on if u previously were on Ground or Ceiling\r\n // If none, ok downward, if on Ground downward, if on Ceiling upward, so that even without @myCheckVerticalBothDirection\r\n // if u were snapped to the ceiling u will keep snap on it even when 0 vertical movement\r\n let movementSign = Math.pp_sign(verticalMovement.vec3_lengthSigned(up), -1);\r\n let isMovementDownward = movementSign < 0;\r\n\r\n outFixedMovement.vec3_copy(verticalMovement);\r\n if (collisionCheckParams.myVerticalMovementCheckEnabled) {\r\n const firstRaycastPerformed = this._verticalMovementAdjustment(verticalMovement, isMovementDownward, originalMovementSign, feetPosition, height, up, forward, collisionCheckParams, collisionRuntimeParams, outFixedMovement);\r\n\r\n if (!collisionRuntimeParams.myIsCollidingVertically && collisionCheckParams.myCheckVerticalBothDirection &&\r\n (outFixedMovement.vec_equals(verticalMovement, 0.00001) || originalMovementSign == 0 || (movementSign != originalMovementSign))) {\r\n newFeetPosition = feetPosition.vec3_add(outFixedMovement, newFeetPosition);\r\n let isOppositeMovementDownward = !isMovementDownward;\r\n const secondRaycastPerformed = this._verticalMovementAdjustment(zero, isOppositeMovementDownward, originalMovementSign, newFeetPosition, height, up, forward, collisionCheckParams, collisionRuntimeParams, additionalFixedMovement);\r\n\r\n if (!additionalFixedMovement.vec3_isZero() || (secondRaycastPerformed && !firstRaycastPerformed)) {\r\n outFixedMovement.vec3_add(additionalFixedMovement, outFixedMovement);\r\n isMovementDownward = !isMovementDownward;\r\n }\r\n }\r\n }\r\n\r\n // #TODO Here, if there is no vertical movement and there is no horizontal movement (or it has been canceled)\r\n // it would probably make more sense to skip this check, and if it is vertically colliding, but the movement is 0,0,0\r\n // we can say that the movement is, after all, fine\r\n // For now I will keep it as it is because i'm not sure if some feature (like the transform manager) could make assumption\r\n // on the fact that even a 0,0,0 movement can fail thanks to this (like the head colliding check)\r\n // Is not a big problem anyway, u can just check if the movement is 0 before checking the collision, and if it is 0\r\n // u won't move anyway\r\n if (!collisionRuntimeParams.myIsCollidingVertically && collisionCheckParams.myVerticalPositionCheckEnabled) {\r\n newFeetPosition = feetPosition.vec3_add(outFixedMovement, newFeetPosition);\r\n let canStay = this._verticalPositionCheck(newFeetPosition, isMovementDownward, height, up, forward, collisionCheckParams, collisionRuntimeParams);\r\n if (canStay && collisionCheckParams.myCheckVerticalPositionBothDirection) {\r\n canStay = this._verticalPositionCheck(newFeetPosition, !isMovementDownward, height, up, forward, collisionCheckParams, collisionRuntimeParams);\r\n }\r\n\r\n if (!canStay) {\r\n outFixedMovement.vec3_zero();\r\n\r\n // #TODO Probably this should not be reset, you should be required to check if the movement was ok to be sure this values have a meaning\r\n collisionRuntimeParams.myHasSnappedOnGround = false;\r\n collisionRuntimeParams.myHasSnappedOnCeiling = false;\r\n collisionRuntimeParams.myHasPoppedOutGround = false;\r\n collisionRuntimeParams.myHasPoppedOutCeiling = false;\r\n collisionRuntimeParams.myHasReducedVerticalMovement = false;\r\n }\r\n } else if (collisionRuntimeParams.myIsCollidingVertically) {\r\n outFixedMovement.vec3_zero();\r\n }\r\n\r\n return outFixedMovement;\r\n };\r\n}();\r\n\r\nCollisionCheckVertical.prototype._verticalMovementAdjustment = function () {\r\n let startOffset = vec3_create();\r\n let endOffset = vec3_create();\r\n let tempVector = vec3_create();\r\n let furtherDirection = vec3_create();\r\n let furtherDirectionPosition = vec3_create();\r\n let upNegate = vec3_create();\r\n let origin = vec3_create();\r\n let direction = vec3_create();\r\n\r\n let verticalCollisionHit = new RaycastHit();\r\n return function _verticalMovementAdjustment(verticalMovement, isMovementDownward, originalMovementSign, feetPosition, height, up, forward, collisionCheckParams, collisionRuntimeParams, outFixedMovement) {\r\n this._myDebugEnabled = collisionCheckParams.myDebugEnabled && collisionCheckParams.myDebugVerticalMovementEnabled;\r\n\r\n startOffset.vec3_zero();\r\n endOffset.vec3_zero();\r\n\r\n let raycastPerformed = false;\r\n\r\n let popOutEnabled = false;\r\n let snapEnabled = false;\r\n\r\n if (isMovementDownward) {\r\n startOffset.vec3_zero();\r\n endOffset.vec3_copy(verticalMovement);\r\n\r\n if (collisionCheckParams.myGroundPopOutExtraDistance > 0 && collisionCheckParams.myGroundPopOutEnabled) {\r\n startOffset.vec3_add(up.vec3_scale(collisionCheckParams.myGroundPopOutExtraDistance + 0.00001, tempVector), startOffset);\r\n popOutEnabled = true;\r\n }\r\n } else {\r\n startOffset = up.vec3_scale(height, startOffset);\r\n endOffset = up.vec3_scale(height, endOffset).vec3_add(verticalMovement, endOffset);\r\n\r\n if (collisionCheckParams.myCeilingPopOutExtraDistance > 0 && collisionCheckParams.myCeilingPopOutEnabled) {\r\n startOffset.vec3_add(up.vec3_scale(-collisionCheckParams.myCeilingPopOutExtraDistance - 0.00001, tempVector), startOffset);\r\n popOutEnabled = true;\r\n }\r\n }\r\n\r\n if (isMovementDownward && originalMovementSign <= 0 && this._myPrevCollisionRuntimeParams.myIsOnGround && collisionCheckParams.mySnapOnGroundEnabled && collisionCheckParams.mySnapOnGroundExtraDistance > 0) {\r\n endOffset.vec3_add(up.vec3_scale(-collisionCheckParams.mySnapOnGroundExtraDistance - 0.00001, tempVector), endOffset);\r\n snapEnabled = true;\r\n } else if (!isMovementDownward && this._myPrevCollisionRuntimeParams.myIsOnCeiling && collisionCheckParams.mySnapOnCeilingEnabled && collisionCheckParams.mySnapOnCeilingExtraDistance > 0 &&\r\n (originalMovementSign > 0 || (originalMovementSign == 0 && (!this._myPrevCollisionRuntimeParams.myIsOnGround || !collisionCheckParams.mySnapOnGroundEnabled)))) {\r\n endOffset.vec3_add(up.vec3_scale(collisionCheckParams.mySnapOnCeilingExtraDistance + 0.00001, tempVector), endOffset);\r\n snapEnabled = true;\r\n }\r\n\r\n outFixedMovement.vec3_zero();\r\n if (startOffset.vec3_distance(endOffset) > 0.00001) {\r\n let checkPositions = this._getVerticalCheckPositions(feetPosition, up, forward, collisionCheckParams, collisionRuntimeParams);\r\n\r\n furtherDirection.vec3_copy(up);\r\n if (!isMovementDownward) {\r\n furtherDirection.vec3_negate(furtherDirection);\r\n }\r\n\r\n let furtherDirectionPositionSet = false;\r\n let atLeastOneIsOk = false;\r\n let insideHitSet = false;\r\n\r\n for (let i = 0; i < checkPositions.length; i++) {\r\n let currentPosition = checkPositions[i];\r\n\r\n origin = currentPosition.vec3_add(startOffset, origin);\r\n direction = currentPosition.vec3_add(endOffset, direction).vec3_sub(origin, direction);\r\n let distance = direction.vec3_length();\r\n direction.vec3_normalize(direction);\r\n\r\n let raycastResult = this._raycastAndDebug(origin, direction, distance, false, false, collisionCheckParams, collisionRuntimeParams);\r\n raycastPerformed = true;\r\n\r\n if (raycastResult.isColliding()) {\r\n let hit = raycastResult.myHits[0];\r\n if (!hit.myInsideCollision) {\r\n atLeastOneIsOk = true;\r\n\r\n if (furtherDirectionPositionSet) {\r\n if (hit.myPosition.vec3_isFartherAlongAxis(furtherDirectionPosition, furtherDirection)) {\r\n furtherDirectionPosition.vec3_copy(hit.myPosition);\r\n verticalCollisionHit.copy(hit);\r\n }\r\n } else {\r\n furtherDirectionPositionSet = true;\r\n furtherDirectionPosition.vec3_copy(hit.myPosition);\r\n verticalCollisionHit.copy(hit);\r\n }\r\n } else if (!insideHitSet) {\r\n insideHitSet = true;\r\n verticalCollisionHit.copy(hit);\r\n if (!collisionCheckParams.myVerticalAllowHitInsideCollisionIfOneOk) {\r\n break;\r\n }\r\n }\r\n } else {\r\n atLeastOneIsOk = true;\r\n }\r\n }\r\n\r\n if (!atLeastOneIsOk) {\r\n outFixedMovement.vec3_zero();\r\n\r\n // #TODO Probably this should not be reset, you should be required to check if the movement was ok to be sure this values have a meaning\r\n collisionRuntimeParams.myHasSnappedOnGround = false;\r\n collisionRuntimeParams.myHasSnappedOnCeiling = false;\r\n collisionRuntimeParams.myHasPoppedOutGround = false;\r\n collisionRuntimeParams.myHasPoppedOutCeiling = false;\r\n collisionRuntimeParams.myHasReducedVerticalMovement = false;\r\n\r\n collisionRuntimeParams.myIsCollidingVertically = true;\r\n collisionRuntimeParams.myVerticalCollisionHit.copy(verticalCollisionHit);\r\n } else {\r\n if (furtherDirectionPositionSet) {\r\n upNegate = up.vec3_negate(upNegate);\r\n if (isMovementDownward) {\r\n outFixedMovement = furtherDirectionPosition.vec3_sub(feetPosition, outFixedMovement).vec3_componentAlongAxis(up, outFixedMovement);\r\n\r\n if (!outFixedMovement.vec3_equals(verticalMovement, 0.00001)) {\r\n const outFixedMovementValueAlongUp = outFixedMovement.vec3_valueAlongAxis(up);\r\n const verticalMovementValueAlongUp = verticalMovement.vec3_valueAlongAxis(up);\r\n if (snapEnabled && outFixedMovementValueAlongUp < verticalMovementValueAlongUp) {\r\n collisionRuntimeParams.myHasSnappedOnGround = true;\r\n } else if (popOutEnabled && outFixedMovementValueAlongUp > 0.00001) {\r\n collisionRuntimeParams.myHasPoppedOutGround = true;\r\n } else if (outFixedMovementValueAlongUp > verticalMovementValueAlongUp) {\r\n collisionRuntimeParams.myHasReducedVerticalMovement = true;\r\n }\r\n }\r\n } else {\r\n outFixedMovement = furtherDirectionPosition.vec3_sub(feetPosition.vec3_add(up.vec3_scale(height, outFixedMovement), outFixedMovement), outFixedMovement).\r\n vec3_componentAlongAxis(up, outFixedMovement);\r\n\r\n if (!outFixedMovement.vec3_equals(verticalMovement, 0.00001)) {\r\n const outFixedMovementValueAlongUp = outFixedMovement.vec3_valueAlongAxis(up);\r\n const verticalMovementValueAlongUp = verticalMovement.vec3_valueAlongAxis(up);\r\n if (snapEnabled && outFixedMovementValueAlongUp > verticalMovementValueAlongUp) {\r\n collisionRuntimeParams.myHasSnappedOnCeiling = true;\r\n } else if (popOutEnabled && outFixedMovementValueAlongUp < -0.00001) {\r\n collisionRuntimeParams.myHasPoppedOutCeiling = true;\r\n } else if (outFixedMovementValueAlongUp < verticalMovementValueAlongUp) {\r\n collisionRuntimeParams.myHasReducedVerticalMovement = true;\r\n }\r\n }\r\n }\r\n\r\n if (!popOutEnabled && !outFixedMovement.vec3_isConcordant(verticalMovement)) {\r\n outFixedMovement.vec3_zero();\r\n }\r\n\r\n if (!collisionCheckParams.myVerticalMovementReduceEnabled && collisionRuntimeParams.myHasReducedVerticalMovement) {\r\n outFixedMovement.vec3_zero();\r\n\r\n // #TODO Probably this should not be reset, you should be required to check if the movement was ok to be sure this values have a meaning\r\n collisionRuntimeParams.myHasSnappedOnGround = false;\r\n collisionRuntimeParams.myHasSnappedOnCeiling = false;\r\n collisionRuntimeParams.myHasPoppedOutGround = false;\r\n collisionRuntimeParams.myHasPoppedOutCeiling = false;\r\n collisionRuntimeParams.myHasReducedVerticalMovement = false;\r\n\r\n collisionRuntimeParams.myIsCollidingVertically = true;\r\n collisionRuntimeParams.myVerticalCollisionHit.copy(verticalCollisionHit);\r\n }\r\n } else {\r\n outFixedMovement.vec3_copy(verticalMovement);\r\n }\r\n }\r\n } else {\r\n outFixedMovement.vec3_copy(verticalMovement);\r\n }\r\n\r\n if (outFixedMovement.vec3_length() < 0.00001) {\r\n outFixedMovement.vec3_zero();\r\n }\r\n\r\n return raycastPerformed;\r\n };\r\n}();\r\n\r\nCollisionCheckVertical.prototype._verticalPositionCheck = function () {\r\n let smallHeightFixOffset = vec3_create();\r\n let heightOffset = vec3_create();\r\n let startPosition = vec3_create();\r\n let endPosition = vec3_create();\r\n let direction = vec3_create();\r\n return function _verticalPositionCheck(feetPosition, checkUpward, height, up, forward, collisionCheckParams, collisionRuntimeParams) {\r\n if (height < 0.00001) {\r\n return true;\r\n }\r\n\r\n this._myDebugEnabled = collisionCheckParams.myDebugEnabled && collisionCheckParams.myDebugVerticalPositionEnabled;\r\n\r\n let checkPositions = this._getVerticalCheckPositions(feetPosition, up, forward, collisionCheckParams, collisionRuntimeParams);\r\n\r\n let isVerticalPositionOk = true;\r\n let atLeastOneIsOk = false;\r\n\r\n let adjustmentEpsilon = 0.0001; // Small offset to prevent hitting with the surface where u are on\r\n smallHeightFixOffset = up.vec3_scale(adjustmentEpsilon, smallHeightFixOffset);\r\n heightOffset = up.vec3_scale(height - adjustmentEpsilon, heightOffset);\r\n if (height - adjustmentEpsilon < adjustmentEpsilon * 10) {\r\n heightOffset = up.vec3_scale(adjustmentEpsilon * 10, heightOffset);\r\n }\r\n\r\n let insideHitSet = false;\r\n for (let i = 0; i < checkPositions.length; i++) {\r\n let currentPosition = checkPositions[i];\r\n\r\n if (checkUpward) {\r\n startPosition = currentPosition.vec3_add(smallHeightFixOffset, startPosition);\r\n endPosition = currentPosition.vec3_add(heightOffset, endPosition);\r\n } else {\r\n startPosition = currentPosition.vec3_add(heightOffset, startPosition);\r\n endPosition = currentPosition.vec3_add(smallHeightFixOffset, endPosition);\r\n }\r\n\r\n let origin = startPosition;\r\n direction = endPosition.vec3_sub(origin, direction);\r\n let distance = direction.vec3_length();\r\n direction.vec3_normalize(direction);\r\n\r\n let raycastResult = this._raycastAndDebug(origin, direction, distance, false, false, collisionCheckParams, collisionRuntimeParams);\r\n\r\n if (raycastResult.isColliding()) {\r\n let firstHitOutsideCollision = raycastResult.getFirstHitOutsideCollision();\r\n if (firstHitOutsideCollision != null) {\r\n isVerticalPositionOk = false;\r\n collisionRuntimeParams.myVerticalCollisionHit.copy(firstHitOutsideCollision);\r\n break;\r\n } else if (!insideHitSet) {\r\n insideHitSet = true;\r\n collisionRuntimeParams.myVerticalCollisionHit.copy(raycastResult.myHits[0]);\r\n if (!collisionCheckParams.myVerticalAllowHitInsideCollisionIfOneOk) {\r\n isVerticalPositionOk = false;\r\n break;\r\n }\r\n }\r\n } else {\r\n atLeastOneIsOk = true;\r\n }\r\n }\r\n\r\n collisionRuntimeParams.myIsCollidingVertically = !isVerticalPositionOk || !atLeastOneIsOk;\r\n\r\n return !collisionRuntimeParams.myIsCollidingVertically;\r\n };\r\n}();\r\n\r\nCollisionCheckVertical.prototype._getVerticalCheckPositions = function () {\r\n let checkPositions = [];\r\n let cachedCheckPositions = [];\r\n let currentCachedCheckPositionIndex = 0;\r\n let _localGetCachedCheckPosition = function () {\r\n let item = null;\r\n while (cachedCheckPositions.length <= currentCachedCheckPositionIndex) {\r\n cachedCheckPositions.push(vec3_create());\r\n }\r\n\r\n item = cachedCheckPositions[currentCachedCheckPositionIndex];\r\n currentCachedCheckPositionIndex++;\r\n return item;\r\n };\r\n\r\n let currentDirection = vec3_create();\r\n return function _getVerticalCheckPositions(feetPosition, up, forward, collisionCheckParams, collisionRuntimeParams) {\r\n checkPositions.length = 0;\r\n currentCachedCheckPositionIndex = 0;\r\n\r\n if (collisionCheckParams.myGroundCircumferenceAddCenter) {\r\n let tempCheckPosition = _localGetCachedCheckPosition();\r\n tempCheckPosition.vec3_copy(feetPosition);\r\n checkPositions.push(tempCheckPosition);\r\n }\r\n\r\n let radiusStep = collisionCheckParams.myFeetRadius / collisionCheckParams.myGroundCircumferenceStepAmount;\r\n let sliceAngle = 360 / collisionCheckParams.myGroundCircumferenceSliceAmount;\r\n let currentStepRotation = -collisionCheckParams.myGroundCircumferenceRotationPerStep * (collisionCheckParams.myGroundCircumferenceStepAmount - 1);\r\n for (let i = 0; i < collisionCheckParams.myGroundCircumferenceStepAmount; i++) {\r\n let currentRadius = radiusStep * (i + 1);\r\n\r\n currentDirection = forward.vec3_rotateAxis(currentStepRotation, up, currentDirection);\r\n for (let j = 0; j < collisionCheckParams.myGroundCircumferenceSliceAmount; j++) {\r\n let tempCheckPosition = _localGetCachedCheckPosition();\r\n let sliceDirection = currentDirection.vec3_rotateAxis(sliceAngle * j, up, tempCheckPosition);\r\n checkPositions.push(feetPosition.vec3_add(sliceDirection.vec3_scale(currentRadius, sliceDirection), sliceDirection));\r\n }\r\n\r\n currentStepRotation += collisionCheckParams.myGroundCircumferenceRotationPerStep;\r\n }\r\n\r\n return checkPositions;\r\n };\r\n}();", "import { quat2_create, vec3_create } from \"../../../../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Globals } from \"../../../../../../pp/globals.js\";\r\nimport { CollisionCheckVertical } from \"./collision_check_vertical.js\";\r\nimport { CollisionRuntimeParams } from \"./collision_params.js\";\r\n\r\nexport class CollisionCheckMove extends CollisionCheckVertical {\r\n\r\n move(movement, transformQuat, collisionCheckParams, collisionRuntimeParams) {\r\n if (this.isCollisionCheckDisabled() && Globals.isDebugEnabled(this._myEngine)) {\r\n this._setRuntimeParamsForMoveCollisionCheckDisabled(movement, transformQuat, collisionCheckParams, collisionRuntimeParams);\r\n return;\r\n }\r\n\r\n this._move(movement, transformQuat, collisionCheckParams, collisionRuntimeParams);\r\n }\r\n\r\n _move(movement, transformQuat, collisionCheckParams, collisionRuntimeParams) {\r\n // Implemented outside class definition\r\n }\r\n\r\n _moveStep(movement, feetPosition, transformUp, transformForward, height, allowSurfaceSteepFix, collisionCheckParams, collisionRuntimeParams, outFixedMovement) {\r\n // Implemented outside class definition\r\n }\r\n\r\n _syncCollisionRuntimeParamsWithPrevious(surfaceAdjustedHorizontalMovement, verticalMovement, up, collisionCheckParams, collisionRuntimeParams, previousCollisionRuntimeParams) {\r\n // Implemented outside class definition\r\n }\r\n}\r\n\r\n\r\n\r\n// IMPLEMENTATION\r\n\r\nCollisionCheckMove.prototype._move = function () {\r\n let transformUp = vec3_create();\r\n let transformForward = vec3_create();\r\n let feetPosition = vec3_create();\r\n\r\n let transformOffsetLocalQuat = quat2_create();\r\n let offsetTransformQuat = quat2_create();\r\n\r\n let horizontalMovement = vec3_create();\r\n let verticalMovement = vec3_create();\r\n\r\n let movementStep = vec3_create();\r\n let currentMovementStep = vec3_create();\r\n let movementChecked = vec3_create();\r\n let fixedMovement = vec3_create();\r\n let newFeetPosition = vec3_create();\r\n let fixedMovementStep = vec3_create();\r\n\r\n let previousCollisionRuntimeParams = new CollisionRuntimeParams();\r\n let previousFixedMovement = vec3_create();\r\n let previousMovementChecked = vec3_create();\r\n return function _move(movement, transformQuat, collisionCheckParams, collisionRuntimeParams) {\r\n //return vec3_create();\r\n //movement = vec3_create(0, 0, -1);\r\n\r\n transformOffsetLocalQuat.quat2_setPositionRotationQuat(collisionCheckParams.myPositionOffsetLocal, collisionCheckParams.myRotationOffsetLocalQuat);\r\n offsetTransformQuat = transformOffsetLocalQuat.quat2_toWorld(transformQuat, offsetTransformQuat);\r\n if (transformQuat.vec_equals(offsetTransformQuat, 0.00001)) {\r\n offsetTransformQuat.quat2_copy(transformQuat);\r\n }\r\n\r\n transformUp = offsetTransformQuat.quat2_getUp(transformUp);\r\n transformForward = offsetTransformQuat.quat2_getForward(transformForward);\r\n feetPosition = offsetTransformQuat.quat2_getPosition(feetPosition);\r\n\r\n let height = collisionCheckParams.myHeight;\r\n height = height - 0.00001; // This makes it easier to setup things at the same exact height of a character so that it can go under it\r\n if (height < 0.00001) {\r\n height = 0;\r\n }\r\n //height = 1.70;\r\n\r\n horizontalMovement = movement.vec3_removeComponentAlongAxis(transformUp, horizontalMovement);\r\n if (horizontalMovement.vec3_isZero(0.000001)) {\r\n horizontalMovement.vec3_zero();\r\n }\r\n\r\n verticalMovement = movement.vec3_componentAlongAxis(transformUp, verticalMovement);\r\n if (verticalMovement.vec3_isZero(0.000001)) {\r\n verticalMovement.vec3_zero();\r\n }\r\n\r\n //feetPosition = feetPosition.vec3_add(horizontalMovement.vec3_normalize().vec3_scale(0.5));\r\n //height = height / 2;\r\n //horizontalMovement.vec3_normalize(horizontalMovement).vec3_scale(0.3, horizontalMovement); movement = horizontalMovement.vec3_add(verticalMovement);\r\n\r\n let movementStepAmount = 1;\r\n movementStep.vec3_copy(movement);\r\n\r\n let lastStepLongerThanMaxLength = false;\r\n\r\n if (!movement.vec3_isZero(0.00001) && collisionCheckParams.mySplitMovementEnabled) {\r\n let minLength = collisionCheckParams.mySplitMovementMinLengthEnabled ? collisionCheckParams.mySplitMovementMinLength : undefined;\r\n let maxLength = collisionCheckParams.mySplitMovementMaxLengthEnabled && collisionCheckParams.mySplitMovementMaxLength > 0 ? collisionCheckParams.mySplitMovementMaxLength : undefined;\r\n let maxSteps = collisionCheckParams.mySplitMovementMaxStepsEnabled && collisionCheckParams.mySplitMovementMaxSteps > 0 ? collisionCheckParams.mySplitMovementMaxSteps : 1;\r\n\r\n let movementLength = movement.vec3_length();\r\n let equalStepLength = movementLength / maxSteps;\r\n\r\n let stepLength = Math.pp_clamp(equalStepLength, minLength, maxLength);\r\n if (stepLength != equalStepLength) {\r\n movementStepAmount = Math.ceil(movementLength / stepLength);\r\n movementStep = movementStep.vec3_normalize(movementStep).vec3_scale(stepLength, movementStep);\r\n\r\n if (collisionCheckParams.mySplitMovementMaxStepsEnabled && (collisionCheckParams.mySplitMovementMaxLengthLastStepCanBeLonger || !collisionCheckParams._myInternalSplitMovementMaxStepsDisabled)) {\r\n if (movementStepAmount > maxSteps) {\r\n lastStepLongerThanMaxLength = true;\r\n }\r\n\r\n movementStepAmount = Math.min(movementStepAmount, maxSteps);\r\n }\r\n } else {\r\n movementStepAmount = maxSteps;\r\n movementStep = movementStep.vec3_normalize(movementStep).vec3_scale(equalStepLength, movementStep);\r\n }\r\n\r\n movementStepAmount = Math.max(1, movementStepAmount);\r\n\r\n if (movementStepAmount == 1) {\r\n movementStep.vec3_copy(movement);\r\n }\r\n }\r\n\r\n fixedMovement.vec3_zero();\r\n movementChecked.vec3_zero();\r\n\r\n previousCollisionRuntimeParams.copy(collisionRuntimeParams);\r\n previousFixedMovement.vec3_copy(fixedMovement);\r\n previousMovementChecked.vec3_copy(movementChecked);\r\n\r\n let stepsPerformed = 0;\r\n let splitMovementStop = false;\r\n let splitMovementLastStepLongerThanMaxLength = false;\r\n let splitMovementReduced = false;\r\n\r\n if (collisionCheckParams.mySplitMovementStopAndFailIfMovementWouldBeReduced && (!collisionCheckParams.mySplitMovementMaxLengthLastStepCanBeLonger && lastStepLongerThanMaxLength)) {\r\n fixedMovement.vec3_zero();\r\n this._moveStep(fixedMovement, feetPosition, transformUp, transformForward, height, true, collisionCheckParams, collisionRuntimeParams, fixedMovementStep);\r\n\r\n collisionRuntimeParams.myHorizontalMovementCanceled = true;\r\n collisionRuntimeParams.myVerticalMovementCanceled = true;\r\n\r\n splitMovementStop = true;\r\n } else {\r\n for (let i = 0; i < movementStepAmount; i++) {\r\n if (movementStepAmount == 1 || i != movementStepAmount - 1) {\r\n currentMovementStep.vec3_copy(movementStep);\r\n } else {\r\n if (collisionCheckParams.mySplitMovementMaxLengthLastStepCanBeLonger || !lastStepLongerThanMaxLength) {\r\n splitMovementLastStepLongerThanMaxLength = lastStepLongerThanMaxLength;\r\n\r\n currentMovementStep = movement.vec3_sub(movementChecked, currentMovementStep);\r\n } else {\r\n splitMovementReduced = true;\r\n\r\n currentMovementStep.vec3_copy(movementStep);\r\n }\r\n }\r\n\r\n newFeetPosition = feetPosition.vec3_add(fixedMovement, newFeetPosition);\r\n fixedMovementStep.vec3_zero();\r\n fixedMovementStep = this._moveStep(currentMovementStep, newFeetPosition, transformUp, transformForward, height, true, collisionCheckParams, collisionRuntimeParams, fixedMovementStep);\r\n fixedMovement.vec3_add(fixedMovementStep, fixedMovement);\r\n\r\n movementChecked = movementChecked.vec3_add(currentMovementStep, movementChecked);\r\n\r\n stepsPerformed = i + 1;\r\n\r\n if ((collisionRuntimeParams.myHorizontalMovementCanceled && collisionRuntimeParams.myVerticalMovementCanceled) ||\r\n (collisionRuntimeParams.myHorizontalMovementCanceled && (collisionCheckParams.mySplitMovementStopWhenHorizontalMovementCanceled || (verticalMovement.vec3_isZero() && fixedMovementStep.vec3_isZero()))) ||\r\n (collisionRuntimeParams.myVerticalMovementCanceled && (collisionCheckParams.mySplitMovementStopWhenVerticalMovementCanceled || (horizontalMovement.vec3_isZero() && fixedMovementStep.vec3_isZero()))) ||\r\n (collisionRuntimeParams.myHasReducedVerticalMovement && collisionCheckParams.mySplitMovementStopWhenVerticalMovementReduced) ||\r\n (collisionCheckParams.mySplitMovementStopCallback != null && collisionCheckParams.mySplitMovementStopCallback(collisionRuntimeParams))) {\r\n\r\n if (collisionCheckParams.mySplitMovementStopReturnPrevious) {\r\n collisionRuntimeParams.copy(previousCollisionRuntimeParams);\r\n fixedMovement.vec3_copy(previousFixedMovement);\r\n movementChecked.vec3_copy(previousMovementChecked);\r\n stepsPerformed -= 1;\r\n }\r\n\r\n splitMovementStop = true;\r\n\r\n break;\r\n }\r\n\r\n previousCollisionRuntimeParams.copy(collisionRuntimeParams);\r\n previousFixedMovement.vec3_copy(fixedMovement);\r\n previousMovementChecked.vec3_copy(movementChecked);\r\n }\r\n }\r\n\r\n //fixedMovement.vec3_zero();\r\n\r\n collisionRuntimeParams.mySplitMovementSteps = movementStepAmount;\r\n collisionRuntimeParams.mySplitMovementStepsPerformed = stepsPerformed;\r\n collisionRuntimeParams.mySplitMovementStop = splitMovementStop;\r\n collisionRuntimeParams.mySplitMovementLastStepLongerThanMaxLength = splitMovementLastStepLongerThanMaxLength;\r\n collisionRuntimeParams.mySplitMovementReduced = splitMovementReduced;\r\n collisionRuntimeParams.mySplitMovementMovementChecked.vec3_copy(movementChecked);\r\n\r\n collisionRuntimeParams.myOriginalUp = transformQuat.quat2_getUp(collisionRuntimeParams.myOriginalUp);\r\n collisionRuntimeParams.myOriginalForward = transformQuat.quat2_getForward(collisionRuntimeParams.myOriginalForward);\r\n collisionRuntimeParams.myOriginalPosition = transformQuat.quat2_getPosition(collisionRuntimeParams.myOriginalPosition);\r\n\r\n collisionRuntimeParams.myOffsetUp.vec3_copy(transformUp);\r\n\r\n //console.error(collisionRuntimeParams.myOriginalPosition.vec3_sub(feetPosition)[1].toFixed(3));\r\n\r\n collisionRuntimeParams.myOriginalHeight = collisionCheckParams.myHeight;\r\n\r\n collisionRuntimeParams.myOriginalMovement.vec3_copy(movement);\r\n collisionRuntimeParams.myFixedMovement.vec3_copy(fixedMovement);\r\n\r\n collisionRuntimeParams.myNewPosition = collisionRuntimeParams.myOriginalPosition.vec3_add(collisionRuntimeParams.myFixedMovement, collisionRuntimeParams.myNewPosition);\r\n\r\n collisionRuntimeParams.myIsMove = true;\r\n };\r\n}();\r\n\r\nCollisionCheckMove.prototype._moveStep = function () {\r\n let horizontalMovement = vec3_create();\r\n let verticalMovement = vec3_create();\r\n let fixedHorizontalMovement = vec3_create();\r\n let fixedVerticalMovement = vec3_create();\r\n let horizontalDirection = vec3_create();\r\n let forwardForHorizontal = vec3_create();\r\n let forwardForVertical = vec3_create();\r\n let forwardForPerceivedAngle = vec3_create();\r\n let newFeetPosition = vec3_create();\r\n let surfaceAdjustedVerticalMovement = vec3_create();\r\n let surfaceAdjustedHorizontalMovement = vec3_create();\r\n let fixedMovement = vec3_create();\r\n\r\n let zAxis = vec3_create(0, 0, 1);\r\n let xAxis = vec3_create(1, 0, 0);\r\n return function _moveStep(movement, feetPosition, transformUp, transformForward, height, allowSurfaceSteepFix, collisionCheckParams, collisionRuntimeParams, outFixedMovement) {\r\n // #TODO Refactor and split horizontal check and vertical check into: hMovement + vMovement + hPosition + vPosition?\r\n // Will make the sliding heavier, if I slide repeating all the 4 steps instead of 2 as now, but would be more correct\r\n\r\n // #TODO When on high slopes where u are not allowed to move the check does not manage to slide\r\n\r\n // #TODO When moving upward on the edge of a slope, the edge can be detected as a wall and prevent movement, while it should just keep moving\r\n\r\n horizontalMovement = movement.vec3_removeComponentAlongAxis(transformUp, horizontalMovement);\r\n if (horizontalMovement.vec3_isZero(0.000001)) {\r\n horizontalMovement.vec3_zero();\r\n }\r\n\r\n verticalMovement = movement.vec3_componentAlongAxis(transformUp, verticalMovement);\r\n if (verticalMovement.vec3_isZero(0.000001)) {\r\n verticalMovement.vec3_zero();\r\n }\r\n\r\n if (horizontalMovement.vec3_isZero()) {\r\n //return vec3_create();\r\n }\r\n\r\n //collisionCheckParams.myDebugEnabled = true;\r\n\r\n this._myPrevCollisionRuntimeParams.copy(collisionRuntimeParams);\r\n collisionRuntimeParams.reset();\r\n\r\n surfaceAdjustedHorizontalMovement = this._adjustHorizontalMovementWithSurface(horizontalMovement, verticalMovement, transformUp, collisionCheckParams, collisionRuntimeParams, this._myPrevCollisionRuntimeParams, surfaceAdjustedHorizontalMovement);\r\n if (surfaceAdjustedHorizontalMovement.vec3_isZero(0.00001)) {\r\n surfaceAdjustedHorizontalMovement.vec3_zero();\r\n }\r\n\r\n this._syncCollisionRuntimeParamsWithPrevious(surfaceAdjustedHorizontalMovement, verticalMovement, transformUp, collisionCheckParams, collisionRuntimeParams, this._myPrevCollisionRuntimeParams);\r\n\r\n {\r\n forwardForHorizontal.vec3_copy(collisionCheckParams.myCheckHorizontalFixedForward);\r\n if (!collisionCheckParams.myCheckHorizontalFixedForwardEnabled) {\r\n if (!surfaceAdjustedHorizontalMovement.vec3_isZero()) {\r\n forwardForHorizontal = surfaceAdjustedHorizontalMovement.vec3_normalize(forwardForHorizontal);\r\n } else if (!horizontalMovement.vec3_isZero()) {\r\n forwardForHorizontal = horizontalMovement.vec3_normalize(forwardForHorizontal);\r\n } else {\r\n forwardForHorizontal.vec3_copy(transformForward);\r\n }\r\n } else {\r\n if (collisionCheckParams.myCheckHorizontalFixedForward.vec3_isOnAxis(transformUp)) {\r\n if (zAxis.vec3_isOnAxis(transformUp)) {\r\n forwardForHorizontal.vec3_copy(xAxis);\r\n } else {\r\n forwardForHorizontal.vec3_copy(zAxis);\r\n }\r\n }\r\n\r\n forwardForHorizontal = forwardForHorizontal.vec3_removeComponentAlongAxis(transformUp, forwardForHorizontal);\r\n forwardForHorizontal = forwardForHorizontal.vec3_normalize(forwardForHorizontal);\r\n\r\n if (forwardForHorizontal.vec_equals(collisionCheckParams.myCheckHorizontalFixedForward, 0.00001)) {\r\n forwardForHorizontal.vec3_copy(collisionCheckParams.myCheckHorizontalFixedForward);\r\n }\r\n }\r\n\r\n fixedHorizontalMovement.vec3_zero();\r\n\r\n if (!surfaceAdjustedHorizontalMovement.vec3_isZero()) {\r\n fixedHorizontalMovement = this._horizontalCheck(surfaceAdjustedHorizontalMovement, feetPosition, height, transformUp, forwardForHorizontal, allowSurfaceSteepFix, collisionCheckParams, collisionRuntimeParams, this._myPrevCollisionRuntimeParams, false, fixedHorizontalMovement);\r\n //collisionRuntimeParams.myIsCollidingHorizontally = true;\r\n //collisionRuntimeParams.myHorizontalCollisionHit.myNormal = vec3_create(0, 0, 1);\r\n if (collisionCheckParams.mySlidingEnabled && collisionRuntimeParams.myIsCollidingHorizontally && this._isSlidingNormalValid(surfaceAdjustedHorizontalMovement, transformUp, collisionRuntimeParams)) {\r\n fixedHorizontalMovement = this._horizontalSlide(surfaceAdjustedHorizontalMovement, feetPosition, height, transformUp, forwardForHorizontal, allowSurfaceSteepFix, collisionCheckParams, collisionRuntimeParams, this._myPrevCollisionRuntimeParams, fixedHorizontalMovement);\r\n } else {\r\n //console.error(\"no slide\");\r\n }\r\n }\r\n\r\n if (fixedHorizontalMovement.vec3_isZero(0.000001)) {\r\n fixedHorizontalMovement.vec3_zero();\r\n }\r\n\r\n if (!surfaceAdjustedHorizontalMovement.vec3_isZero() && fixedHorizontalMovement.vec3_isZero()) {\r\n collisionRuntimeParams.myHorizontalMovementCanceled = true;\r\n }\r\n }\r\n\r\n {\r\n forwardForVertical.vec3_copy(collisionCheckParams.myCheckVerticalFixedForward);\r\n if (!collisionCheckParams.myCheckVerticalFixedForwardEnabled) {\r\n if (fixedHorizontalMovement.vec3_isZero()) {\r\n if (!surfaceAdjustedHorizontalMovement.vec3_isZero()) {\r\n forwardForVertical = surfaceAdjustedHorizontalMovement.vec3_normalize(forwardForVertical);\r\n } else if (!horizontalMovement.vec3_isZero()) {\r\n forwardForVertical = horizontalMovement.vec3_normalize(forwardForVertical);\r\n } else {\r\n forwardForVertical.vec3_copy(transformForward);\r\n }\r\n } else {\r\n forwardForVertical = fixedHorizontalMovement.vec3_normalize(forwardForVertical);\r\n }\r\n } else {\r\n if (collisionCheckParams.myCheckVerticalFixedForward.vec3_isOnAxis(transformUp)) {\r\n if (zAxis.vec3_isOnAxis(transformUp)) {\r\n forwardForVertical.vec3_copy(xAxis);\r\n } else {\r\n forwardForVertical.vec3_copy(zAxis);\r\n }\r\n }\r\n\r\n forwardForVertical = forwardForVertical.vec3_removeComponentAlongAxis(transformUp, forwardForVertical);\r\n forwardForVertical = forwardForVertical.vec3_normalize(forwardForVertical);\r\n\r\n if (forwardForVertical.vec_equals(collisionCheckParams.myCheckVerticalFixedForward, 0.00001)) {\r\n forwardForVertical.vec3_copy(collisionCheckParams.myCheckVerticalFixedForward);\r\n }\r\n }\r\n\r\n //collisionCheckParams.myDebugEnabled = false;\r\n\r\n surfaceAdjustedVerticalMovement = this._adjustVerticalMovementWithSurface(fixedHorizontalMovement, verticalMovement, transformUp, collisionCheckParams, collisionRuntimeParams, this._myPrevCollisionRuntimeParams, surfaceAdjustedVerticalMovement);\r\n\r\n newFeetPosition = feetPosition.vec3_add(fixedHorizontalMovement, newFeetPosition);\r\n let originalMovementSign = Math.pp_sign(verticalMovement.vec3_lengthSigned(transformUp), 0);\r\n\r\n fixedVerticalMovement.vec3_zero();\r\n fixedVerticalMovement = this._verticalCheck(surfaceAdjustedVerticalMovement, originalMovementSign, newFeetPosition, height, transformUp, forwardForVertical, collisionCheckParams, collisionRuntimeParams, fixedVerticalMovement);\r\n\r\n if (fixedVerticalMovement.vec3_isZero(0.000001)) {\r\n fixedVerticalMovement.vec3_zero();\r\n }\r\n }\r\n\r\n outFixedMovement.vec3_zero();\r\n if (!collisionRuntimeParams.myIsCollidingVertically) {\r\n outFixedMovement = fixedHorizontalMovement.vec3_add(fixedVerticalMovement, outFixedMovement);\r\n } else {\r\n collisionRuntimeParams.myHorizontalMovementCanceled = true;\r\n collisionRuntimeParams.myVerticalMovementCanceled = true;\r\n fixedHorizontalMovement.vec3_zero();\r\n fixedVerticalMovement.vec3_zero();\r\n\r\n if (!collisionCheckParams.myCheckVerticalFixedForwardEnabled) {\r\n if (!surfaceAdjustedHorizontalMovement.vec3_isZero()) {\r\n forwardForVertical = surfaceAdjustedHorizontalMovement.vec3_normalize(forwardForVertical);\r\n } else if (!horizontalMovement.vec3_isZero()) {\r\n forwardForVertical = horizontalMovement.vec3_normalize(forwardForVertical);\r\n } else {\r\n forwardForVertical.vec3_copy(transformForward);\r\n }\r\n }\r\n }\r\n\r\n newFeetPosition = feetPosition.vec3_add(outFixedMovement, newFeetPosition);\r\n\r\n forwardForPerceivedAngle.vec3_copy(transformForward);\r\n\r\n if (!fixedHorizontalMovement.vec3_isZero()) {\r\n forwardForPerceivedAngle = fixedHorizontalMovement.vec3_normalize(forwardForPerceivedAngle);\r\n } else if (!surfaceAdjustedHorizontalMovement.vec3_isZero()) {\r\n forwardForPerceivedAngle = surfaceAdjustedHorizontalMovement.vec3_normalize(forwardForPerceivedAngle);\r\n } else if (!horizontalMovement.vec3_isZero()) {\r\n forwardForPerceivedAngle = horizontalMovement.vec3_normalize(forwardForPerceivedAngle);\r\n }\r\n\r\n if (collisionCheckParams.myComputeGroundInfoEnabled) {\r\n this._gatherSurfaceInfo(newFeetPosition, height, transformUp, forwardForPerceivedAngle, forwardForVertical, true, collisionCheckParams, collisionRuntimeParams);\r\n }\r\n\r\n if (collisionCheckParams.myComputeCeilingInfoEnabled) {\r\n this._gatherSurfaceInfo(newFeetPosition, height, transformUp, forwardForPerceivedAngle, forwardForVertical, false, collisionCheckParams, collisionRuntimeParams);\r\n }\r\n\r\n if (!surfaceAdjustedHorizontalMovement.vec3_isZero() && !collisionRuntimeParams.myHorizontalMovementCanceled) {\r\n let surfaceCheckOk = this._postSurfaceCheck(fixedHorizontalMovement, fixedVerticalMovement, transformUp, collisionCheckParams, collisionRuntimeParams, this._myPrevCollisionRuntimeParams);\r\n\r\n if (!surfaceCheckOk) {\r\n collisionRuntimeParams.myHorizontalMovementCanceled = true;\r\n collisionRuntimeParams.myVerticalMovementCanceled = true;\r\n fixedHorizontalMovement.vec3_zero();\r\n fixedVerticalMovement.vec3_zero();\r\n outFixedMovement.vec3_zero();\r\n newFeetPosition = feetPosition.vec3_add(outFixedMovement, newFeetPosition);\r\n\r\n if (!surfaceAdjustedHorizontalMovement.vec3_isZero()) {\r\n forwardForPerceivedAngle = surfaceAdjustedHorizontalMovement.vec3_normalize(forwardForPerceivedAngle);\r\n } else if (!horizontalMovement.vec3_isZero()) {\r\n forwardForPerceivedAngle = horizontalMovement.vec3_normalize(forwardForPerceivedAngle);\r\n } else {\r\n forwardForPerceivedAngle.vec3_copy(transformForward);\r\n }\r\n\r\n if (collisionCheckParams.myComputeGroundInfoEnabled && collisionCheckParams.myRegatherGroundInfoOnSurfaceCheckFail) {\r\n this._gatherSurfaceInfo(newFeetPosition, height, transformUp, forwardForPerceivedAngle, forwardForVertical, true, collisionCheckParams, collisionRuntimeParams);\r\n } else {\r\n collisionRuntimeParams.myRealIsOnGround = this._myPrevCollisionRuntimeParams.myRealIsOnGround;\r\n collisionRuntimeParams.myIsOnGround = this._myPrevCollisionRuntimeParams.myIsOnGround;\r\n collisionRuntimeParams.myGroundCollisionHit.copy(this._myPrevCollisionRuntimeParams.myGroundCollisionHit);\r\n collisionRuntimeParams.myGroundAngle = this._myPrevCollisionRuntimeParams.myGroundAngle;\r\n collisionRuntimeParams.myGroundPerceivedAngle = this._myPrevCollisionRuntimeParams.myGroundPerceivedAngle;\r\n collisionRuntimeParams.myGroundNormal.vec3_copy(this._myPrevCollisionRuntimeParams.myGroundNormal);\r\n collisionRuntimeParams.myGroundHitMaxAngle = this._myPrevCollisionRuntimeParams.myGroundHitMaxAngle;\r\n collisionRuntimeParams.myGroundHitMaxNormal.vec3_copy(this._myPrevCollisionRuntimeParams.myGroundHitMaxNormal);\r\n collisionRuntimeParams.myGroundDistance = this._myPrevCollisionRuntimeParams.myGroundDistance;\r\n collisionRuntimeParams.myGroundIsBaseInsideCollision = this._myPrevCollisionRuntimeParams.myGroundIsBaseInsideCollision;\r\n collisionRuntimeParams.myOnGroundDueToBasePartiallyInsideCollision = this._myPrevCollisionRuntimeParams.myOnGroundDueToBasePartiallyInsideCollision;\r\n }\r\n\r\n if (collisionCheckParams.myComputeCeilingInfoEnabled && collisionCheckParams.myRegatherCeilingInfoOnSurfaceCheckFail) {\r\n this._gatherSurfaceInfo(newFeetPosition, height, transformUp, forwardForPerceivedAngle, forwardForVertical, false, collisionCheckParams, collisionRuntimeParams);\r\n } else {\r\n collisionRuntimeParams.myRealIsOnCeiling = this._myPrevCollisionRuntimeParams.myRealIsOnCeiling;\r\n collisionRuntimeParams.myIsOnCeiling = this._myPrevCollisionRuntimeParams.myIsOnCeiling;\r\n collisionRuntimeParams.myCeilingCollisionHit.copy(this._myPrevCollisionRuntimeParams.myCeilingCollisionHit);\r\n collisionRuntimeParams.myCeilingAngle = this._myPrevCollisionRuntimeParams.myCeilingAngle;\r\n collisionRuntimeParams.myCeilingPerceivedAngle = this._myPrevCollisionRuntimeParams.myCeilingPerceivedAngle;\r\n collisionRuntimeParams.myCeilingNormal.vec3_copy(this._myPrevCollisionRuntimeParams.myCeilingNormal);\r\n collisionRuntimeParams.myCeilingHitMaxAngle = this._myPrevCollisionRuntimeParams.myCeilingHitMaxAngle;\r\n collisionRuntimeParams.myCeilingHitMaxNormal.vec3_copy(this._myPrevCollisionRuntimeParams.myCeilingHitMaxNormal);\r\n collisionRuntimeParams.myCeilingDistance = this._myPrevCollisionRuntimeParams.myCeilingDistance;\r\n collisionRuntimeParams.myCeilingIsBaseInsideCollision = this._myPrevCollisionRuntimeParams.myCeilingIsBaseInsideCollision;\r\n collisionRuntimeParams.myOnCeilingDueToBasePartiallyInsideCollision = this._myPrevCollisionRuntimeParams.myOnCeilingDueToBasePartiallyInsideCollision;\r\n }\r\n }\r\n }\r\n\r\n //return outFixedMovement.vec3_zero(); \r\n\r\n if (collisionCheckParams.myExtraMovementCheckCallback != null) {\r\n fixedMovement.vec3_copy(outFixedMovement);\r\n outFixedMovement = collisionCheckParams.myExtraMovementCheckCallback(\r\n movement, fixedMovement, feetPosition, transformUp, transformForward, height,\r\n collisionCheckParams, this._myPrevCollisionRuntimeParams, collisionRuntimeParams, outFixedMovement);\r\n\r\n fixedHorizontalMovement = outFixedMovement.vec3_removeComponentAlongAxis(transformUp, fixedHorizontalMovement);\r\n fixedVerticalMovement = outFixedMovement.vec3_componentAlongAxis(transformUp, fixedVerticalMovement);\r\n }\r\n\r\n {\r\n if (collisionCheckParams.mySlidingAdjustSign90Degrees) {\r\n if (!collisionRuntimeParams.myHorizontalMovementCanceled && !collisionRuntimeParams.myIsSliding && !fixedHorizontalMovement.vec3_isZero()) {\r\n /* let angleWithPreviousThreshold = 0.5;\r\n check use surfaceAdjustedHorizontalMovement instead of horizontalMovement if re-enable this\r\n \r\n if (!this._myPrevCollisionRuntimeParams.myLastValidOriginalHorizontalMovement.vec3_isZero() && !horizontalMovement.vec3_isZero() &&\r\n horizontalMovement.vec3_angle(this._myPrevCollisionRuntimeParams.myLastValidOriginalHorizontalMovement) > angleWithPreviousThreshold) {\r\n collisionRuntimeParams.mySliding90DegreesSign = horizontalMovement.vec3_signTo(this._myPrevCollisionRuntimeParams.myLastValidOriginalHorizontalMovement, transformUp);\r\n console.error(\"sp\", collisionRuntimeParams.mySliding90DegreesSign, collisionRuntimeParams.myIsSliding);\r\n } */\r\n collisionRuntimeParams.mySlidingRecompute90DegreesSign = true;\r\n //console.error(\"empty renew\");\r\n }\r\n }\r\n\r\n if (!horizontalMovement.vec3_isZero()) {\r\n collisionRuntimeParams.myLastValidOriginalHorizontalMovement.vec3_copy(horizontalMovement);\r\n }\r\n\r\n if (!surfaceAdjustedHorizontalMovement.vec3_isZero()) {\r\n collisionRuntimeParams.myLastValidSurfaceAdjustedHorizontalMovement.vec3_copy(surfaceAdjustedHorizontalMovement);\r\n }\r\n\r\n if (!verticalMovement.vec3_isZero()) {\r\n collisionRuntimeParams.myLastValidOriginalVerticalMovement.vec3_copy(verticalMovement);\r\n }\r\n\r\n if (!surfaceAdjustedVerticalMovement.vec3_isZero()) {\r\n collisionRuntimeParams.myLastValidSurfaceAdjustedVerticalMovement.vec3_copy(surfaceAdjustedVerticalMovement);\r\n }\r\n\r\n if (!fixedHorizontalMovement.vec3_isZero(0.000001)) {\r\n collisionRuntimeParams.myLastValidIsSliding = collisionRuntimeParams.myIsSliding;\r\n collisionRuntimeParams.myIsSlidingFlickerPrevented = false;\r\n collisionRuntimeParams.myLastValidEndHorizontalMovement.vec3_copy(fixedHorizontalMovement);\r\n //fixedHorizontalMovement.vec_error();\r\n\r\n if (!collisionRuntimeParams.myIsSliding) {\r\n //console.error(\"not sliding\");\r\n } else {\r\n //console.error(\"sliding\", collisionRuntimeParams.myIsSlidingFlickerPrevented, collisionRuntimeParams.mySlidingFlickerPreventionCheckAnywayCounter);\r\n }\r\n } else {\r\n //console.error(\"still\", collisionRuntimeParams.myIsSlidingFlickerPrevented, collisionRuntimeParams.mySlidingFlickerPreventionCheckAnywayCounter);\r\n }\r\n\r\n if (!fixedVerticalMovement.vec3_isZero(0.000001)) {\r\n collisionRuntimeParams.myLastValidEndVerticalMovement.vec3_copy(fixedVerticalMovement);\r\n }\r\n }\r\n\r\n let moveStepFixed = false;\r\n if (!collisionRuntimeParams.myHorizontalMovementCanceled && !fixedHorizontalMovement.vec3_isZero(0.000001)) {\r\n horizontalDirection = fixedHorizontalMovement.vec3_normalize(horizontalDirection);\r\n let surfaceTooSteepResults = this._surfaceTooSteep(transformUp, horizontalDirection, collisionCheckParams, this._myPrevCollisionRuntimeParams);\r\n if (surfaceTooSteepResults[0] || surfaceTooSteepResults[1]) {\r\n horizontalDirection = fixedHorizontalMovement.vec3_normalize(horizontalDirection);\r\n let newSurfaceTooSteepResults = this._surfaceTooSteep(transformUp, horizontalDirection, collisionCheckParams, collisionRuntimeParams);\r\n\r\n if ((surfaceTooSteepResults[0] && newSurfaceTooSteepResults[0]) ||\r\n (surfaceTooSteepResults[1] && newSurfaceTooSteepResults[1]) ||\r\n !allowSurfaceSteepFix ||\r\n (surfaceTooSteepResults[0] && !collisionCheckParams.myAllowGroundSteepFix) ||\r\n (surfaceTooSteepResults[1] && !collisionCheckParams.myAllowCeilingSteepFix)) {\r\n outFixedMovement.vec3_zero();\r\n collisionRuntimeParams.copy(this._myPrevCollisionRuntimeParams);\r\n this._moveStep(movement, feetPosition, transformUp, transformForward, height, false, collisionCheckParams, collisionRuntimeParams, outFixedMovement);\r\n moveStepFixed = true;\r\n }\r\n }\r\n }\r\n\r\n if (!moveStepFixed) {\r\n if (collisionCheckParams.myDebugEnabled && collisionCheckParams.myDebugMovementEnabled && Globals.isDebugEnabled(this._myEngine)) {\r\n this._debugMovement(movement, outFixedMovement, newFeetPosition, transformUp, collisionCheckParams);\r\n }\r\n\r\n if (collisionCheckParams.myDebugEnabled && collisionCheckParams.myDebugRuntimeParamsEnabled && Globals.isDebugEnabled(this._myEngine)) {\r\n this._debugRuntimeParams(collisionRuntimeParams);\r\n }\r\n }\r\n\r\n return outFixedMovement;\r\n };\r\n}();\r\n\r\nCollisionCheckMove.prototype._syncCollisionRuntimeParamsWithPrevious = function () {\r\n let previousFixedHorizontalMovement = vec3_create();\r\n return function _syncCollisionRuntimeParamsWithPrevious(surfaceAdjustedHorizontalMovement, verticalMovement, up, collisionCheckParams, collisionRuntimeParams, previousCollisionRuntimeParams) {\r\n collisionRuntimeParams.myIsSlidingFlickerPrevented = previousCollisionRuntimeParams.myIsSlidingFlickerPrevented;\r\n //console.error(\"prevented\", collisionRuntimeParams.myIsSlidingFlickerPrevented);\r\n\r\n collisionRuntimeParams.myLastValidOriginalHorizontalMovement.vec3_copy(previousCollisionRuntimeParams.myLastValidOriginalHorizontalMovement);\r\n collisionRuntimeParams.myLastValidOriginalVerticalMovement.vec3_copy(previousCollisionRuntimeParams.myLastValidOriginalVerticalMovement);\r\n collisionRuntimeParams.myLastValidSurfaceAdjustedHorizontalMovement.vec3_copy(previousCollisionRuntimeParams.myLastValidSurfaceAdjustedHorizontalMovement);\r\n collisionRuntimeParams.myLastValidSurfaceAdjustedVerticalMovement.vec3_copy(previousCollisionRuntimeParams.myLastValidSurfaceAdjustedVerticalMovement);\r\n collisionRuntimeParams.myLastValidIsSliding = previousCollisionRuntimeParams.myLastValidIsSliding;\r\n\r\n collisionRuntimeParams.mySliding90DegreesSign = previousCollisionRuntimeParams.mySliding90DegreesSign;\r\n collisionRuntimeParams.mySlidingRecompute90DegreesSign = previousCollisionRuntimeParams.mySlidingRecompute90DegreesSign;\r\n if (collisionCheckParams.mySlidingAdjustSign90Degrees) {\r\n let angleWithPreviousThreshold = 0.5;\r\n if (!previousCollisionRuntimeParams.myLastValidSurfaceAdjustedHorizontalMovement.vec3_isZero() && !surfaceAdjustedHorizontalMovement.vec3_isZero() &&\r\n surfaceAdjustedHorizontalMovement.vec3_angle(previousCollisionRuntimeParams.myLastValidSurfaceAdjustedHorizontalMovement) > angleWithPreviousThreshold) {\r\n //previousFixedHorizontalMovement = previousCollisionRuntimeParams.myFixedMovement.vec3_removeComponentAlongAxis(up, previousFixedHorizontalMovement);\r\n if (!previousCollisionRuntimeParams.myLastValidIsSliding) {\r\n let angleSigned = surfaceAdjustedHorizontalMovement.vec3_angleSigned(previousCollisionRuntimeParams.myLastValidSurfaceAdjustedHorizontalMovement, up);\r\n let angleSignedThreshold = 10;\r\n if (Math.abs(angleSigned) < 180 - angleSignedThreshold) {\r\n collisionRuntimeParams.mySliding90DegreesSign = Math.pp_sign(angleSigned);\r\n //console.error(\"special sign\");\r\n }\r\n }\r\n collisionRuntimeParams.mySlidingRecompute90DegreesSign = true;\r\n //console.error(\"direction new\");\r\n }\r\n }\r\n\r\n previousFixedHorizontalMovement = previousCollisionRuntimeParams.myFixedMovement.vec3_removeComponentAlongAxis(up, previousFixedHorizontalMovement);\r\n if (previousFixedHorizontalMovement.vec3_isZero(0.000001)) {\r\n collisionRuntimeParams.mySlidingPreviousHorizontalMovement.vec3_copy(previousCollisionRuntimeParams.mySlidingPreviousHorizontalMovement);\r\n } else {\r\n collisionRuntimeParams.mySlidingPreviousHorizontalMovement.vec3_copy(previousFixedHorizontalMovement);\r\n }\r\n };\r\n}();", "import { quat2_create, vec3_create } from \"../../../../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Globals } from \"../../../../../../pp/globals.js\";\r\nimport { CollisionCheckMove } from \"./collision_check_move.js\";\r\n\r\nexport class CollisionCheckTeleport extends CollisionCheckMove {\r\n\r\n // #TODO Add teleport position/transform and return originalteleportransform\r\n // instead of position old transform / new transform\r\n teleport(position, transformQuat, collisionCheckParams, collisionRuntimeParams) {\r\n if (this.isCollisionCheckDisabled() && Globals.isDebugEnabled(this._myEngine)) {\r\n this._setRuntimeParamsForTeleportCollisionCheckDisabled(position, transformQuat, collisionCheckParams, collisionRuntimeParams);\r\n return;\r\n }\r\n\r\n this._teleport(position, transformQuat, collisionCheckParams, collisionRuntimeParams);\r\n }\r\n\r\n _teleport(teleportPosition, transformQuat, collisionCheckParams, collisionRuntimeParams, isPositionCheck = false) {\r\n // Implemented outside class definition\r\n }\r\n}\r\n\r\n\r\n\r\n// IMPLEMENTATION\r\n\r\nCollisionCheckTeleport.prototype._teleport = function () {\r\n let transformUp = vec3_create();\r\n let transformForward = vec3_create();\r\n let feetPosition = vec3_create();\r\n let originalFeetPosition = vec3_create();\r\n\r\n let transformOffsetLocalQuat = quat2_create();\r\n let offsetTransformQuat = quat2_create();\r\n\r\n let feetPositionOffsetToOriginal = vec3_create();\r\n let offsetTeleportPosition = vec3_create();\r\n\r\n let zero = vec3_create();\r\n let forwardForHorizontal = vec3_create();\r\n let forwardForVertical = vec3_create();\r\n let forwardForPerceivedAngle = vec3_create();\r\n let fixedHorizontalMovement = vec3_create();\r\n let fixedVerticalMovement = vec3_create();\r\n let newFeetPosition = vec3_create();\r\n let endPosition = vec3_create();\r\n\r\n let zAxis = vec3_create(0, 0, 1);\r\n let xAxis = vec3_create(1, 0, 0);\r\n return function _teleport(teleportPosition, transformQuat, collisionCheckParams, collisionRuntimeParams, isPositionCheck = false) {\r\n transformOffsetLocalQuat.quat2_setPositionRotationQuat(collisionCheckParams.myPositionOffsetLocal, collisionCheckParams.myRotationOffsetLocalQuat);\r\n offsetTransformQuat = transformOffsetLocalQuat.quat2_toWorld(transformQuat, offsetTransformQuat);\r\n if (transformQuat.vec_equals(offsetTransformQuat, 0.00001)) {\r\n offsetTransformQuat.quat2_copy(transformQuat);\r\n }\r\n\r\n transformUp = offsetTransformQuat.quat2_getUp(transformUp);\r\n transformForward = offsetTransformQuat.quat2_getForward(transformForward);\r\n feetPosition = offsetTransformQuat.quat2_getPosition(feetPosition);\r\n\r\n offsetTeleportPosition.vec3_copy(teleportPosition);\r\n originalFeetPosition = transformQuat.quat2_getPosition(originalFeetPosition);\r\n feetPositionOffsetToOriginal = originalFeetPosition.vec3_sub(feetPosition, feetPositionOffsetToOriginal);\r\n if (feetPositionOffsetToOriginal.vec3_isZero(0.00001)) {\r\n feetPositionOffsetToOriginal.vec3_zero();\r\n } else {\r\n offsetTeleportPosition = offsetTeleportPosition.vec3_sub(feetPositionOffsetToOriginal, offsetTeleportPosition);\r\n }\r\n\r\n\r\n let height = collisionCheckParams.myHeight;\r\n height = height - 0.00001; // This makes it easier to setup things at the same exact height of a character so that it can go under it\r\n if (height < 0.00001) {\r\n height = 0;\r\n }\r\n //height = 1.70;\r\n\r\n this._myPrevCollisionRuntimeParams.copy(collisionRuntimeParams);\r\n collisionRuntimeParams.reset();\r\n\r\n forwardForHorizontal.vec3_copy(collisionCheckParams.myCheckHorizontalFixedForward);\r\n if (!collisionCheckParams.myCheckHorizontalFixedForwardEnabled) {\r\n forwardForHorizontal.vec3_copy(transformForward);\r\n } else {\r\n if (collisionCheckParams.myCheckHorizontalFixedForward.vec3_isOnAxis(transformUp)) {\r\n if (zAxis.vec3_isOnAxis(transformUp)) {\r\n forwardForHorizontal.vec3_copy(xAxis);\r\n } else {\r\n forwardForHorizontal.vec3_copy(zAxis);\r\n }\r\n }\r\n\r\n forwardForHorizontal = forwardForHorizontal.vec3_removeComponentAlongAxis(transformUp, forwardForHorizontal);\r\n forwardForHorizontal = forwardForHorizontal.vec3_normalize(forwardForHorizontal);\r\n\r\n if (forwardForHorizontal.vec_equals(collisionCheckParams.myCheckHorizontalFixedForward, 0.00001)) {\r\n forwardForHorizontal.vec3_copy(collisionCheckParams.myCheckHorizontalFixedForward);\r\n }\r\n }\r\n\r\n fixedHorizontalMovement = this._horizontalCheck(zero, offsetTeleportPosition, height, transformUp, forwardForHorizontal, false, collisionCheckParams, collisionRuntimeParams, this._myPrevCollisionRuntimeParams, false, fixedHorizontalMovement);\r\n if (!collisionRuntimeParams.myIsCollidingHorizontally) {\r\n newFeetPosition = offsetTeleportPosition.vec3_add(fixedHorizontalMovement, newFeetPosition);\r\n\r\n forwardForVertical.vec3_copy(collisionCheckParams.myCheckVerticalFixedForward);\r\n if (!collisionCheckParams.myCheckVerticalFixedForwardEnabled) {\r\n forwardForVertical.vec3_copy(transformForward);\r\n } else {\r\n if (collisionCheckParams.myCheckVerticalFixedForward.vec3_isOnAxis(transformUp)) {\r\n if (zAxis.vec3_isOnAxis(transformUp)) {\r\n forwardForVertical.vec3_copy(xAxis);\r\n } else {\r\n forwardForVertical.vec3_copy(zAxis);\r\n }\r\n }\r\n\r\n forwardForVertical = forwardForVertical.vec3_removeComponentAlongAxis(transformUp, forwardForVertical);\r\n forwardForVertical = forwardForVertical.vec3_normalize(forwardForVertical);\r\n\r\n if (forwardForVertical.vec_equals(collisionCheckParams.myCheckVerticalFixedForward, 0.00001)) {\r\n forwardForVertical.vec3_copy(collisionCheckParams.myCheckVerticalFixedForward);\r\n }\r\n }\r\n\r\n let downward = -1;\r\n fixedVerticalMovement = this._verticalCheck(zero, downward, newFeetPosition, height, transformUp, forwardForVertical, collisionCheckParams, collisionRuntimeParams, fixedVerticalMovement);\r\n if (!collisionRuntimeParams.myIsCollidingVertically) {\r\n newFeetPosition = newFeetPosition.vec3_add(fixedVerticalMovement, newFeetPosition);\r\n\r\n forwardForPerceivedAngle.vec3_copy(transformForward);\r\n\r\n if (collisionCheckParams.myComputeGroundInfoEnabled) {\r\n this._gatherSurfaceInfo(newFeetPosition, height, transformUp, forwardForPerceivedAngle, forwardForVertical, true, collisionCheckParams, collisionRuntimeParams);\r\n }\r\n\r\n if (collisionCheckParams.myComputeCeilingInfoEnabled) {\r\n this._gatherSurfaceInfo(newFeetPosition, height, transformUp, forwardForPerceivedAngle, forwardForVertical, false, collisionCheckParams, collisionRuntimeParams);\r\n }\r\n\r\n if (!collisionRuntimeParams.myIsOnGround) {\r\n if ((collisionCheckParams.myTeleportMustBeOnGround && !isPositionCheck)\r\n || (collisionCheckParams.myCheckTransformMustBeOnGround && isPositionCheck)) {\r\n collisionRuntimeParams.myTeleportCanceled = true;\r\n }\r\n }\r\n\r\n if (!collisionRuntimeParams.myIsOnCeiling) {\r\n if ((collisionCheckParams.myTeleportMustBeOnCeiling && !isPositionCheck)\r\n || (collisionCheckParams.myCheckTransformMustBeOnCeiling && isPositionCheck)) {\r\n collisionRuntimeParams.myTeleportCanceled = true;\r\n }\r\n }\r\n\r\n if (collisionRuntimeParams.myIsOnGround) {\r\n let minAngle = null;\r\n if (!isPositionCheck) {\r\n if (collisionCheckParams.myTeleportMustBeOnIgnorableGroundAngle) {\r\n minAngle = collisionCheckParams.myGroundAngleToIgnore;\r\n }\r\n\r\n if (collisionCheckParams.myTeleportMustBeOnGroundAngle != null) {\r\n minAngle = Math.min(minAngle, collisionCheckParams.myTeleportMustBeOnGroundAngle);\r\n }\r\n } else {\r\n if (collisionCheckParams.myCheckTransformMustBeOnIgnorableGroundAngle) {\r\n minAngle = collisionCheckParams.myGroundAngleToIgnore;\r\n }\r\n\r\n if (collisionCheckParams.myCheckTransformMustBeOnGroundAngle != null) {\r\n minAngle = Math.min(minAngle, collisionCheckParams.myCheckTransformMustBeOnGroundAngle);\r\n }\r\n }\r\n\r\n if (minAngle != null && collisionRuntimeParams.myGroundAngle > minAngle + 0.0001) {\r\n collisionRuntimeParams.myTeleportCanceled = true;\r\n }\r\n }\r\n\r\n if (collisionRuntimeParams.myIsOnCeiling) {\r\n let minAngle = null;\r\n if (!isPositionCheck) {\r\n if (collisionCheckParams.myTeleportMustBeOnIgnorableCeilingAngle) {\r\n minAngle = collisionCheckParams.myCeilingAngleToIgnore;\r\n }\r\n\r\n if (collisionCheckParams.myTeleportMustBeOnCeilingAngle != null) {\r\n minAngle = Math.min(minAngle, collisionCheckParams.myTeleportMustBeOnCeilingAngle);\r\n }\r\n } else {\r\n if (collisionCheckParams.myCheckTransformMustBeOnIgnorableCeilingAngle) {\r\n minAngle = collisionCheckParams.myCeilingAngleToIgnore;\r\n }\r\n\r\n if (collisionCheckParams.myCheckTransformMustBeOnCeilingAngle != null) {\r\n minAngle = Math.min(minAngle, collisionCheckParams.myCheckTransformMustBeOnCeilingAngle);\r\n }\r\n }\r\n\r\n if (minAngle != null && collisionRuntimeParams.myCeilingAngle > minAngle + 0.0001) {\r\n collisionRuntimeParams.myTeleportCanceled = true;\r\n }\r\n }\r\n\r\n if (collisionRuntimeParams.myTeleportCanceled) {\r\n if (collisionCheckParams.myComputeGroundInfoEnabled && collisionCheckParams.myRegatherGroundInfoOnSurfaceCheckFail) {\r\n this._gatherSurfaceInfo(newFeetPosition, height, transformUp, forwardForPerceivedAngle, forwardForVertical, true, collisionCheckParams, collisionRuntimeParams);\r\n } else {\r\n collisionRuntimeParams.myRealIsOnGround = this._myPrevCollisionRuntimeParams.myRealIsOnGround;\r\n collisionRuntimeParams.myIsOnGround = this._myPrevCollisionRuntimeParams.myIsOnGround;\r\n collisionRuntimeParams.myGroundCollisionHit.copy(this._myPrevCollisionRuntimeParams.myGroundCollisionHit);\r\n collisionRuntimeParams.myGroundAngle = this._myPrevCollisionRuntimeParams.myGroundAngle;\r\n collisionRuntimeParams.myGroundPerceivedAngle = this._myPrevCollisionRuntimeParams.myGroundPerceivedAngle;\r\n collisionRuntimeParams.myGroundNormal.vec3_copy(this._myPrevCollisionRuntimeParams.myGroundNormal);\r\n collisionRuntimeParams.myGroundHitMaxAngle = this._myPrevCollisionRuntimeParams.myGroundHitMaxAngle;\r\n collisionRuntimeParams.myGroundHitMaxNormal.vec3_copy(this._myPrevCollisionRuntimeParams.myGroundHitMaxNormal);\r\n collisionRuntimeParams.myGroundDistance = this._myPrevCollisionRuntimeParams.myGroundDistance;\r\n collisionRuntimeParams.myGroundIsBaseInsideCollision = this._myPrevCollisionRuntimeParams.myGroundIsBaseInsideCollision;\r\n collisionRuntimeParams.myOnGroundDueToBasePartiallyInsideCollision = this._myPrevCollisionRuntimeParams.myOnGroundDueToBasePartiallyInsideCollision;\r\n }\r\n\r\n if (collisionCheckParams.myComputeCeilingInfoEnabled && collisionCheckParams.myRegatherCeilingInfoOnSurfaceCheckFail) {\r\n this._gatherSurfaceInfo(newFeetPosition, height, transformUp, forwardForPerceivedAngle, forwardForVertical, false, collisionCheckParams, collisionRuntimeParams);\r\n } else {\r\n collisionRuntimeParams.myRealIsOnCeiling = this._myPrevCollisionRuntimeParams.myRealIsOnCeiling;\r\n collisionRuntimeParams.myIsOnCeiling = this._myPrevCollisionRuntimeParams.myIsOnCeiling;\r\n collisionRuntimeParams.myCeilingCollisionHit.copy(this._myPrevCollisionRuntimeParams.myCeilingCollisionHit);\r\n collisionRuntimeParams.myCeilingAngle = this._myPrevCollisionRuntimeParams.myCeilingAngle;\r\n collisionRuntimeParams.myCeilingPerceivedAngle = this._myPrevCollisionRuntimeParams.myCeilingPerceivedAngle;\r\n collisionRuntimeParams.myCeilingNormal.vec3_copy(this._myPrevCollisionRuntimeParams.myCeilingNormal);\r\n collisionRuntimeParams.myCeilingHitMaxAngle = this._myPrevCollisionRuntimeParams.myCeilingHitMaxAngle;\r\n collisionRuntimeParams.myCeilingHitMaxNormal.vec3_copy(this._myPrevCollisionRuntimeParams.myCeilingHitMaxNormal);\r\n collisionRuntimeParams.myCeilingDistance = this._myPrevCollisionRuntimeParams.myCeilingDistance;\r\n collisionRuntimeParams.myCeilingIsBaseInsideCollision = this._myPrevCollisionRuntimeParams.myCeilingIsBaseInsideCollision;\r\n collisionRuntimeParams.myOnCeilingDueToBasePartiallyInsideCollision = this._myPrevCollisionRuntimeParams.myOnCeilingDueToBasePartiallyInsideCollision;\r\n }\r\n }\r\n\r\n // Regather surface if invalid else use before\r\n } else {\r\n collisionRuntimeParams.myTeleportCanceled = true;\r\n }\r\n } else {\r\n collisionRuntimeParams.myTeleportCanceled = true;\r\n }\r\n\r\n if (!isPositionCheck) {\r\n if (collisionCheckParams.myExtraTeleportCheckCallback != null) {\r\n endPosition.vec3_copy(newFeetPosition);\r\n newFeetPosition = collisionCheckParams.myExtraTeleportCheckCallback(\r\n offsetTeleportPosition, endPosition, feetPosition, transformUp, transformForward, height,\r\n collisionCheckParams, this._myPrevCollisionRuntimeParams, collisionRuntimeParams, newFeetPosition);\r\n }\r\n } else {\r\n if (collisionCheckParams.myExtraCheckTransformCheckCallback != null) {\r\n endPosition.vec3_copy(newFeetPosition);\r\n newFeetPosition = collisionCheckParams.myExtraCheckTransformCheckCallback(\r\n endPosition, feetPosition, transformUp, transformForward, height,\r\n collisionCheckParams, this._myPrevCollisionRuntimeParams, collisionRuntimeParams, newFeetPosition);\r\n }\r\n }\r\n\r\n collisionRuntimeParams.myOriginalUp = transformQuat.quat2_getUp(collisionRuntimeParams.myOriginalUp);\r\n collisionRuntimeParams.myOriginalForward = transformQuat.quat2_getForward(collisionRuntimeParams.myOriginalForward);\r\n collisionRuntimeParams.myOriginalPosition = transformQuat.quat2_getPosition(collisionRuntimeParams.myOriginalPosition);\r\n\r\n collisionRuntimeParams.myOffsetUp.vec3_copy(transformUp);\r\n collisionRuntimeParams.myTeleportForward.vec3_copy(forwardForHorizontal);\r\n\r\n collisionRuntimeParams.myOriginalHeight = collisionCheckParams.myHeight;\r\n\r\n collisionRuntimeParams.myOriginalTeleportPosition.vec3_copy(teleportPosition);\r\n\r\n if (!collisionRuntimeParams.myTeleportCanceled) {\r\n collisionRuntimeParams.myFixedTeleportPosition.vec3_copy(newFeetPosition);\r\n if (!feetPositionOffsetToOriginal.vec3_isZero(0.00001)) {\r\n collisionRuntimeParams.myFixedTeleportPosition = collisionRuntimeParams.myFixedTeleportPosition.vec3_add(feetPositionOffsetToOriginal, collisionRuntimeParams.myFixedTeleportPosition);\r\n }\r\n\r\n collisionRuntimeParams.myNewPosition.vec3_copy(collisionRuntimeParams.myFixedTeleportPosition);\r\n } else {\r\n collisionRuntimeParams.myNewPosition.vec3_copy(collisionRuntimeParams.myOriginalPosition);\r\n }\r\n\r\n collisionRuntimeParams.myIsTeleport = true;\r\n\r\n if (collisionCheckParams.myDebugEnabled && collisionCheckParams.myDebugRuntimeParamsEnabled && Globals.isDebugEnabled(this._myEngine)) {\r\n this._debugRuntimeParams(collisionRuntimeParams);\r\n }\r\n };\r\n}();", "import { vec3_create } from \"../../../../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Globals } from \"../../../../../../pp/globals.js\";\r\nimport { CollisionCheckTeleport } from \"./collision_check_teleport.js\";\r\n\r\nexport class CollisionCheckPosition extends CollisionCheckTeleport {\r\n\r\n positionCheck(allowFix, transformQuat, collisionCheckParams, collisionRuntimeParams) {\r\n if (this.isCollisionCheckDisabled() && Globals.isDebugEnabled(this._myEngine)) {\r\n this._setRuntimeParamsForPositionCheckCollisionCheckDisabled(allowFix, transformQuat, collisionCheckParams, collisionRuntimeParams);\r\n return;\r\n }\r\n\r\n this._positionCheck(allowFix, transformQuat, collisionCheckParams, collisionRuntimeParams);\r\n }\r\n\r\n _positionCheck(allowAdjustments, transformQuat, collisionCheckParams, collisionRuntimeParams) {\r\n // Implemented outside class definition\r\n }\r\n}\r\n\r\n\r\n\r\n// IMPLEMENTATION\r\n\r\nCollisionCheckPosition.prototype._positionCheck = function () {\r\n let feetPosition = vec3_create();\r\n return function _positionCheck(allowAdjustments, transformQuat, collisionCheckParams, collisionRuntimeParams) {\r\n feetPosition = transformQuat.quat2_getPosition(feetPosition);\r\n\r\n this._teleport(feetPosition, transformQuat, collisionCheckParams, collisionRuntimeParams, true);\r\n\r\n collisionRuntimeParams.myIsPositionOk = !collisionRuntimeParams.myTeleportCanceled;\r\n collisionRuntimeParams.myIsPositionCheck = true;\r\n collisionRuntimeParams.myOriginalPositionCheckPosition.vec3_copy(collisionRuntimeParams.myOriginalTeleportPosition);\r\n collisionRuntimeParams.myFixedPositionCheckPosition.vec3_copy(collisionRuntimeParams.myFixedTeleportPosition);\r\n collisionRuntimeParams.myIsPositionCheckAllowAdjustments = allowAdjustments;\r\n\r\n if (!allowAdjustments) {\r\n collisionRuntimeParams.myIsPositionOk = collisionRuntimeParams.myIsPositionOk &&\r\n collisionRuntimeParams.myOriginalPositionCheckPosition.vec_equals(collisionRuntimeParams.myFixedPositionCheckPosition, 0.00001);\r\n }\r\n\r\n collisionRuntimeParams.myOriginalTeleportPosition.vec3_zero();\r\n collisionRuntimeParams.myFixedTeleportPosition.vec3_zero();\r\n collisionRuntimeParams.myTeleportCanceled = false;\r\n collisionRuntimeParams.myIsTeleport = false;\r\n };\r\n}();", "import { CollisionCheckPosition } from \"./collision_check_position.js\";\r\n\r\nexport class CollisionCheck extends CollisionCheckPosition {\r\n\r\n}", "import { quat_create, vec3_create } from \"../../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Globals } from \"../../../../pp/globals.js\";\r\nimport { CharacterCollisionCheckType, CharacterCollisionResults } from \"./character_collision_results.js\";\r\nimport { CollisionCheck } from \"./legacy/collision_check/collision_check.js\";\r\nimport { CollisionCheckParams, CollisionRuntimeParams } from \"./legacy/collision_check/collision_params.js\";\r\n\r\nlet _myCollisionChecks = new WeakMap();\r\n\r\nexport function getCollisionCheck(engine = Globals.getMainEngine()) {\r\n return _myCollisionChecks.get(engine);\r\n}\r\n\r\nexport function setCollisionCheck(collisionCheck, engine = Globals.getMainEngine()) {\r\n _myCollisionChecks.set(engine, collisionCheck);\r\n}\r\n\r\nexport function isCollisionCheckDisabled(engine = Globals.getMainEngine()) {\r\n let collisionCheck = CollisionCheckBridge.getCollisionCheck(engine);\r\n\r\n if (collisionCheck != null) {\r\n return collisionCheck.isCollisionCheckDisabled();\r\n }\r\n\r\n return false;\r\n}\r\n\r\nexport function setCollisionCheckDisabled(collisionCheckDisabled, engine = Globals.getMainEngine()) {\r\n let collisionCheck = CollisionCheckBridge.getCollisionCheck(engine);\r\n\r\n if (collisionCheck != null) {\r\n collisionCheck.setCollisionCheckDisabled(collisionCheckDisabled);\r\n }\r\n}\r\n\r\nexport function initBridge(engine = Globals.getMainEngine()) {\r\n if (!_myCollisionChecks.has(engine)) {\r\n CollisionCheckBridge.setCollisionCheck(new CollisionCheck(engine), engine);\r\n }\r\n}\r\n\r\nexport let checkMovement = function () {\r\n let collisionCheckParams = new CollisionCheckParams();\r\n let collisionRuntimeParams = new CollisionRuntimeParams();\r\n return function checkMovement(movement, currentTransformQuat, characterColliderSetup, prevCharacterCollisionResults, outCharacterCollisionResults = new CharacterCollisionResults(), engine = Globals.getMainEngine()) {\r\n CollisionCheckBridge.convertCharacterColliderSetupToCollisionCheckParams(characterColliderSetup, collisionCheckParams);\r\n CollisionCheckBridge.convertCharacterCollisionResultsToCollisionRuntimeParams(prevCharacterCollisionResults, collisionRuntimeParams);\r\n CollisionCheckBridge.getCollisionCheck(engine).move(movement, currentTransformQuat, collisionCheckParams, collisionRuntimeParams);\r\n CollisionCheckBridge.convertCollisionRuntimeParamsToCharacterCollisionResults(collisionRuntimeParams, currentTransformQuat, outCharacterCollisionResults);\r\n };\r\n}();\r\n\r\nexport let checkTeleportToTransform = function () {\r\n let teleportPosition = vec3_create();\r\n let collisionCheckParams = new CollisionCheckParams();\r\n let collisionRuntimeParams = new CollisionRuntimeParams();\r\n return function checkTeleportToTransform(teleportTransformQuat, currentTransformQuat, characterColliderSetup, prevCharacterCollisionResults, outCharacterCollisionResults = new CharacterCollisionResults(), engine = Globals.getMainEngine()) {\r\n CollisionCheckBridge.convertCharacterColliderSetupToCollisionCheckParams(characterColliderSetup, collisionCheckParams);\r\n CollisionCheckBridge.convertCharacterCollisionResultsToCollisionRuntimeParams(prevCharacterCollisionResults, collisionRuntimeParams);\r\n teleportPosition = teleportTransformQuat.quat2_getPosition(teleportPosition);\r\n CollisionCheckBridge.getCollisionCheck(engine).teleport(teleportPosition, teleportTransformQuat, collisionCheckParams, collisionRuntimeParams);\r\n CollisionCheckBridge.convertCollisionRuntimeParamsToCharacterCollisionResults(collisionRuntimeParams, currentTransformQuat, outCharacterCollisionResults);\r\n };\r\n}();\r\n\r\nexport let checkTransform = function () {\r\n let collisionCheckParams = new CollisionCheckParams();\r\n let collisionRuntimeParams = new CollisionRuntimeParams();\r\n return function checkTransform(checkTransformQuat, characterColliderSetup, prevCharacterCollisionResults, outCharacterCollisionResults = new CharacterCollisionResults(), engine = Globals.getMainEngine()) {\r\n CollisionCheckBridge.convertCharacterColliderSetupToCollisionCheckParams(characterColliderSetup, collisionCheckParams);\r\n CollisionCheckBridge.convertCharacterCollisionResultsToCollisionRuntimeParams(prevCharacterCollisionResults, collisionRuntimeParams);\r\n CollisionCheckBridge.getCollisionCheck(engine).positionCheck(true, checkTransformQuat, collisionCheckParams, collisionRuntimeParams);\r\n CollisionCheckBridge.convertCollisionRuntimeParamsToCharacterCollisionResults(collisionRuntimeParams, checkTransformQuat, outCharacterCollisionResults);\r\n };\r\n}();\r\n\r\nexport let updateGroundInfo = function () {\r\n let collisionCheckParams = new CollisionCheckParams();\r\n let collisionRuntimeParams = new CollisionRuntimeParams();\r\n return function updateGroundInfo(currentTransformQuat, characterColliderSetup, prevCharacterCollisionResults, outCharacterCollisionResults = new CharacterCollisionResults(), engine = Globals.getMainEngine()) {\r\n CollisionCheckBridge.convertCharacterColliderSetupToCollisionCheckParams(characterColliderSetup, collisionCheckParams);\r\n CollisionCheckBridge.convertCharacterCollisionResultsToCollisionRuntimeParams(prevCharacterCollisionResults, collisionRuntimeParams);\r\n collisionCheckParams.myComputeCeilingInfoEnabled = false;\r\n CollisionCheckBridge.getCollisionCheck(engine).updateSurfaceInfo(currentTransformQuat, collisionCheckParams, collisionRuntimeParams);\r\n CollisionCheckBridge.convertCollisionRuntimeParamsToCharacterCollisionResults(collisionRuntimeParams, currentTransformQuat, outCharacterCollisionResults);\r\n };\r\n}();\r\n\r\nexport let updateCeilingInfo = function () {\r\n let collisionCheckParams = new CollisionCheckParams();\r\n let collisionRuntimeParams = new CollisionRuntimeParams();\r\n return function updateCeilingInfo(currentTransformQuat, characterColliderSetup, prevCharacterCollisionResults, outCharacterCollisionResults = new CharacterCollisionResults(), engine = Globals.getMainEngine()) {\r\n CollisionCheckBridge.convertCharacterColliderSetupToCollisionCheckParams(characterColliderSetup, collisionCheckParams);\r\n CollisionCheckBridge.convertCharacterCollisionResultsToCollisionRuntimeParams(prevCharacterCollisionResults, collisionRuntimeParams);\r\n collisionCheckParams.myComputeGroundInfoEnabled = false;\r\n CollisionCheckBridge.getCollisionCheck(engine).updateSurfaceInfo(currentTransformQuat, collisionCheckParams, collisionRuntimeParams);\r\n CollisionCheckBridge.convertCollisionRuntimeParamsToCharacterCollisionResults(collisionRuntimeParams, currentTransformQuat, outCharacterCollisionResults);\r\n };\r\n}();\r\n\r\nexport function convertCharacterCollisionResultsToCollisionRuntimeParams(characterCollisionResults, outCollisionRuntimeParams = new CollisionRuntimeParams()) {\r\n outCollisionRuntimeParams.reset();\r\n\r\n characterCollisionResults.myTransformResults.myInitialTransformQuat.quat2_getPosition(outCollisionRuntimeParams.myOriginalPosition);\r\n characterCollisionResults.myTransformResults.myFinalTransformQuat.quat2_getPosition(outCollisionRuntimeParams.myNewPosition);\r\n\r\n characterCollisionResults.myTransformResults.myInitialTransformQuat.quat2_getForward(outCollisionRuntimeParams.myOriginalForward);\r\n characterCollisionResults.myTransformResults.myInitialTransformQuat.quat2_getUp(outCollisionRuntimeParams.myOriginalUp);\r\n\r\n // Ok: outCollisionRuntimeParams.myOriginalHeight = characterCollisionResults.myOriginalHeight;\r\n\r\n outCollisionRuntimeParams.myOriginalMovement.vec3_copy(characterCollisionResults.myMovementResults.myInitialMovement);\r\n outCollisionRuntimeParams.myFixedMovement.vec3_copy(characterCollisionResults.myMovementResults.myFinalMovement);\r\n\r\n outCollisionRuntimeParams.myLastValidOriginalHorizontalMovement.vec3_copy(characterCollisionResults.myInternalResults.myLastRelevantInitialHorizontalMovement);\r\n outCollisionRuntimeParams.myLastValidOriginalVerticalMovement.vec3_copy(characterCollisionResults.myInternalResults.myLastRelevantInitialVerticalMovement);\r\n\r\n outCollisionRuntimeParams.myLastValidEndHorizontalMovement.vec3_copy(characterCollisionResults.myInternalResults.myLastRelevantFinalHorizontalMovement);\r\n outCollisionRuntimeParams.myLastValidEndVerticalMovement.vec3_copy(characterCollisionResults.myInternalResults.myLastRelevantFinalVerticalMovement);\r\n\r\n outCollisionRuntimeParams.myLastValidSurfaceAdjustedHorizontalMovement.vec3_copy(characterCollisionResults.myInternalResults.myLastRelevantAdjustedInitialHorizontalMovement);\r\n outCollisionRuntimeParams.myLastValidSurfaceAdjustedVerticalMovement.vec3_copy(characterCollisionResults.myInternalResults.myLastRelevantAdjustedInitialVerticalMovement);\r\n\r\n outCollisionRuntimeParams.myIsOnGround = characterCollisionResults.myGroundInfo.myOnSurface;\r\n outCollisionRuntimeParams.myGroundCollisionHit.copy(characterCollisionResults.myGroundInfo.mySurfaceReferenceCollisionHit);\r\n outCollisionRuntimeParams.myGroundAngle = characterCollisionResults.myGroundInfo.mySurfaceAngle;\r\n outCollisionRuntimeParams.myGroundPerceivedAngle = characterCollisionResults.myGroundInfo.mySurfacePerceivedAngle;\r\n outCollisionRuntimeParams.myGroundNormal.vec3_copy(characterCollisionResults.myGroundInfo.mySurfaceNormal);\r\n outCollisionRuntimeParams.myGroundHitMaxAngle = characterCollisionResults.myGroundInfo.mySurfaceHitMaxAngle;\r\n outCollisionRuntimeParams.myGroundHitMaxNormal.vec3_copy(characterCollisionResults.myGroundInfo.mySurfaceHitMaxNormal);\r\n outCollisionRuntimeParams.myGroundDistance = characterCollisionResults.myGroundInfo.mySurfaceDistance;\r\n outCollisionRuntimeParams.myGroundIsBaseInsideCollision = characterCollisionResults.myGroundInfo.myBaseInsideCollision;\r\n outCollisionRuntimeParams.myOnGroundDueToBasePartiallyInsideCollision = characterCollisionResults.myGroundInfo.myOnSurfaceDueToBasePartiallyInsideCollision;\r\n\r\n outCollisionRuntimeParams.myIsOnCeiling = characterCollisionResults.myCeilingInfo.myOnSurface;\r\n outCollisionRuntimeParams.myCeilingCollisionHit.copy(characterCollisionResults.myCeilingInfo.mySurfaceReferenceCollisionHit);\r\n outCollisionRuntimeParams.myCeilingAngle = characterCollisionResults.myCeilingInfo.mySurfaceAngle;\r\n outCollisionRuntimeParams.myCeilingPerceivedAngle = characterCollisionResults.myCeilingInfo.mySurfacePerceivedAngle;\r\n outCollisionRuntimeParams.myCeilingNormal.vec3_copy(characterCollisionResults.myCeilingInfo.mySurfaceNormal);\r\n outCollisionRuntimeParams.myCeilingHitMaxAngle = characterCollisionResults.myCeilingInfo.mySurfaceHitMaxAngle;\r\n outCollisionRuntimeParams.myCeilingHitMaxNormal.vec3_copy(characterCollisionResults.myCeilingInfo.mySurfaceHitMaxNormal);\r\n outCollisionRuntimeParams.myCeilingDistance = characterCollisionResults.myCeilingInfo.mySurfaceDistance;\r\n outCollisionRuntimeParams.myCeilingIsBaseInsideCollision = characterCollisionResults.myCeilingInfo.myBaseInsideCollision;\r\n outCollisionRuntimeParams.myOnCeilingDueToBasePartiallyInsideCollision = characterCollisionResults.myCeilingInfo.myOnSurfaceDueToBasePartiallyInsideCollision;\r\n\r\n outCollisionRuntimeParams.myHorizontalMovementCanceled = characterCollisionResults.myHorizontalMovementResults.myMovementFailed;\r\n outCollisionRuntimeParams.myIsCollidingHorizontally = characterCollisionResults.myHorizontalMovementResults.myMovementCollided;\r\n outCollisionRuntimeParams.myHorizontalCollisionHit.copy(characterCollisionResults.myHorizontalMovementResults.myReferenceCollisionHit);\r\n\r\n outCollisionRuntimeParams.myVerticalMovementCanceled = characterCollisionResults.myVerticalMovementResults.myMovementFailed;\r\n outCollisionRuntimeParams.myIsCollidingVertically = characterCollisionResults.myVerticalMovementResults.myMovementCollided;\r\n outCollisionRuntimeParams.myVerticalCollisionHit.copy(characterCollisionResults.myVerticalMovementResults.myReferenceCollisionHit);\r\n\r\n outCollisionRuntimeParams.myHasSnappedOnGround = characterCollisionResults.myGroundResults.myHasSnappedOnSurface;\r\n outCollisionRuntimeParams.myHasSnappedOnCeiling = characterCollisionResults.myCeilingResults.myHasSnappedOnSurface;\r\n outCollisionRuntimeParams.myHasPoppedOutGround = characterCollisionResults.myGroundResults.myHasPoppedOutSurface;\r\n outCollisionRuntimeParams.myHasPoppedOutCeiling = characterCollisionResults.myCeilingResults.myHasPoppedOutSurface;\r\n\r\n outCollisionRuntimeParams.myHorizontalMovementHasAdjustedVerticalMovementOverGroundPerceivedAngleDownhill = characterCollisionResults.myGroundResults.myHasHorizontalMovementAdjustedVerticalMovementOverSurfacePerceivedAngleDownhill;\r\n outCollisionRuntimeParams.myHorizontalMovementHasAdjustedVerticalMovementOverGroundPerceivedAngleUphill = characterCollisionResults.myGroundResults.myHasHorizontalMovementAdjustedVerticalMovementOverSurfacePerceivedAngleUphill;\r\n outCollisionRuntimeParams.myVerticalMovementHasAdjustedHorizontalMovementOverGroundAngleDownhill = characterCollisionResults.myGroundResults.myHasVerticalMovementAdjustedHorizontalMovementOverSurfaceAngleDownhill;\r\n\r\n outCollisionRuntimeParams.myHorizontalMovementHasAdjustedVerticalMovementOverCeilingPerceivedAngleDownhill = characterCollisionResults.myCeilingResults.myHasHorizontalMovementAdjustedVerticalMovementOverSurfacePerceivedAngleDownhill;\r\n outCollisionRuntimeParams.myHorizontalMovementHasAdjustedVerticalMovementOverCeilingPerceivedAngleUphill = characterCollisionResults.myCeilingResults.myHasHorizontalMovementAdjustedVerticalMovementOverSurfacePerceivedAngleUphill;\r\n outCollisionRuntimeParams.myVerticalMovementHasAdjustedHorizontalMovementOverCeilingAngleDownhill = characterCollisionResults.myCeilingResults.myHasVerticalMovementAdjustedHorizontalMovementOverSurfaceAngleDownhill;\r\n\r\n // Ok: outCollisionRuntimeParams.myHasReducedVerticalMovement = characterCollisionResults.myVerticalMovementResults.myHasMovementBeenReduced;\r\n\r\n outCollisionRuntimeParams.myIsSliding = characterCollisionResults.myWallSlideResults.myHasSlid;\r\n outCollisionRuntimeParams.mySlidingMovementAngle = characterCollisionResults.myWallSlideResults.mySlideMovementAngle;\r\n outCollisionRuntimeParams.mySlidingCollisionAngle = characterCollisionResults.myWallSlideResults.mySlideMovementWallAngle;\r\n outCollisionRuntimeParams.mySlidingWallNormal.vec3_copy(characterCollisionResults.myWallSlideResults.myWallNormal);\r\n\r\n outCollisionRuntimeParams.myIsSlidingIntoOppositeDirection = characterCollisionResults.myInternalResults.myHasWallSlidTowardOppositeDirection;\r\n outCollisionRuntimeParams.myIsSlidingFlickerPrevented = characterCollisionResults.myInternalResults.myLastRelevantWallSlideFlickerPrevented;\r\n outCollisionRuntimeParams.mySlidingFlickerPreventionCheckAnywayCounter = characterCollisionResults.myInternalResults.myWallSlideFlickerPreventionForceCheckCounter;\r\n outCollisionRuntimeParams.mySliding90DegreesSign = characterCollisionResults.myInternalResults.myWallSlide90DegreesDirectionSign;\r\n outCollisionRuntimeParams.mySlidingRecompute90DegreesSign = characterCollisionResults.myInternalResults.myWallSlide90DegreesRecomputeDirectionSign;\r\n outCollisionRuntimeParams.myLastValidIsSliding = characterCollisionResults.myInternalResults.myLastRelevantHasWallSlid;\r\n outCollisionRuntimeParams.mySlidingPreviousHorizontalMovement.vec3_copy(characterCollisionResults.myInternalResults.myLastRelevantFinalHorizontalMovement);\r\n\r\n outCollisionRuntimeParams.myOriginalTeleportPosition.vec3_copy(characterCollisionResults.myTeleportResults.myInitialTeleportTransformQuat);\r\n outCollisionRuntimeParams.myFixedTeleportPosition.vec3_copy(characterCollisionResults.myTeleportResults.myFinalTeleportTransformQuat);\r\n outCollisionRuntimeParams.myTeleportCanceled = characterCollisionResults.myTeleportResults.myTeleportFailed;\r\n\r\n outCollisionRuntimeParams.myIsPositionOk = characterCollisionResults.myCheckTransformResults.myCheckTransformFailed;\r\n characterCollisionResults.myCheckTransformResults.myInitialCheckTransformQuat.quat2_getPosition(outCollisionRuntimeParams.myOriginalPositionCheckPosition);\r\n characterCollisionResults.myCheckTransformResults.myFinalCheckTransformQuat.quat2_getPosition(outCollisionRuntimeParams.myFixedPositionCheckPosition);\r\n\r\n outCollisionRuntimeParams.myIsTeleport = characterCollisionResults.myCheckType == CharacterCollisionCheckType.CHECK_TELEPORT;\r\n outCollisionRuntimeParams.myIsMove = characterCollisionResults.myCheckType == CharacterCollisionCheckType.CHECK_MOVEMENT;\r\n outCollisionRuntimeParams.myIsPositionCheck = characterCollisionResults.myCheckType == CharacterCollisionCheckType.CHECK_TRANSFORM;\r\n\r\n outCollisionRuntimeParams.mySplitMovementSteps = characterCollisionResults.mySplitMovementResults.myStepsToPerform;\r\n outCollisionRuntimeParams.mySplitMovementStepsPerformed = characterCollisionResults.mySplitMovementResults.myStepsPerformed;\r\n outCollisionRuntimeParams.mySplitMovementStop = characterCollisionResults.mySplitMovementResults.myMovementInterrupted;\r\n outCollisionRuntimeParams.mySplitMovementReduced = characterCollisionResults.mySplitMovementResults.myMovementReduced;\r\n outCollisionRuntimeParams.mySplitMovementLastStepLongerThanMaxLength = characterCollisionResults.mySplitMovementResults.myLastStepLongerThanMaxStepLength;\r\n outCollisionRuntimeParams.mySplitMovementMovementChecked.vec3_copy(characterCollisionResults.mySplitMovementResults.myMovementChecked);\r\n\r\n return outCollisionRuntimeParams;\r\n}\r\n\r\nexport let convertCollisionRuntimeParamsToCharacterCollisionResults = function () {\r\n let rotationQuat = quat_create();\r\n return function convertCollisionRuntimeParamsToCharacterCollisionResults(collisionRuntimeParams, currentTransformQuat, outCharacterCollisionResults = new CharacterCollisionResults()) {\r\n outCharacterCollisionResults.reset();\r\n\r\n if (collisionRuntimeParams.myIsMove) {\r\n outCharacterCollisionResults.myCheckType = CharacterCollisionCheckType.CHECK_MOVEMENT;\r\n } else if (collisionRuntimeParams.myIsTeleport) {\r\n outCharacterCollisionResults.myCheckType = CharacterCollisionCheckType.CHECK_TELEPORT;\r\n } else if (collisionRuntimeParams.myIsPositionCheck) {\r\n outCharacterCollisionResults.myCheckType = CharacterCollisionCheckType.CHECK_TRANSFORM;\r\n }\r\n\r\n rotationQuat.quat_setForward(collisionRuntimeParams.myOriginalForward, collisionRuntimeParams.myOriginalUp);\r\n outCharacterCollisionResults.myTransformResults.myInitialTransformQuat.quat2_setPositionRotationQuat(collisionRuntimeParams.myOriginalPosition, rotationQuat);\r\n outCharacterCollisionResults.myTransformResults.myFinalTransformQuat.quat2_setPositionRotationQuat(collisionRuntimeParams.myNewPosition, rotationQuat);\r\n\r\n outCharacterCollisionResults.myMovementResults.myInitialMovement.vec3_copy(collisionRuntimeParams.myOriginalMovement);\r\n outCharacterCollisionResults.myMovementResults.myFinalMovement.vec3_copy(collisionRuntimeParams.myFixedMovement);\r\n outCharacterCollisionResults.myMovementResults.myMovementFailed = collisionRuntimeParams.myHorizontalMovementCanceled && collisionRuntimeParams.myVerticalMovementCanceled;\r\n outCharacterCollisionResults.myMovementResults.myMovementCollided = collisionRuntimeParams.myIsCollidingHorizontally || collisionRuntimeParams.myIsCollidingVertically;\r\n if (collisionRuntimeParams.myIsCollidingHorizontally) {\r\n outCharacterCollisionResults.myMovementResults.myReferenceCollisionHit.copy(collisionRuntimeParams.myHorizontalCollisionHit);\r\n } else if (collisionRuntimeParams.myIsCollidingVertically) {\r\n outCharacterCollisionResults.myMovementResults.myReferenceCollisionHit.copy(collisionRuntimeParams.myVerticalCollisionHit);\r\n }\r\n\r\n outCharacterCollisionResults.myHorizontalMovementResults.myMovementFailed = collisionRuntimeParams.myHorizontalMovementCanceled;\r\n outCharacterCollisionResults.myHorizontalMovementResults.myMovementCollided = collisionRuntimeParams.myIsCollidingHorizontally;\r\n outCharacterCollisionResults.myHorizontalMovementResults.myReferenceCollisionHit.copy(collisionRuntimeParams.myHorizontalCollisionHit);\r\n outCharacterCollisionResults.myHorizontalMovementResults.myInitialMovement = collisionRuntimeParams.myOriginalMovement.vec3_removeComponentAlongAxis(collisionRuntimeParams.myOffsetUp, outCharacterCollisionResults.myHorizontalMovementResults.myInitialMovement);\r\n outCharacterCollisionResults.myHorizontalMovementResults.myFinalMovement = collisionRuntimeParams.myFixedMovement.vec3_removeComponentAlongAxis(collisionRuntimeParams.myOffsetUp, outCharacterCollisionResults.myHorizontalMovementResults.myFinalMovement);\r\n\r\n outCharacterCollisionResults.myVerticalMovementResults.myMovementFailed = collisionRuntimeParams.myVerticalMovementCanceled;\r\n outCharacterCollisionResults.myVerticalMovementResults.myMovementCollided = collisionRuntimeParams.myIsCollidingVertically;\r\n outCharacterCollisionResults.myVerticalMovementResults.myReferenceCollisionHit.copy(collisionRuntimeParams.myVerticalCollisionHit);\r\n outCharacterCollisionResults.myVerticalMovementResults.myInitialMovement = collisionRuntimeParams.myOriginalMovement.vec3_componentAlongAxis(collisionRuntimeParams.myOffsetUp, outCharacterCollisionResults.myVerticalMovementResults.myInitialMovement);\r\n outCharacterCollisionResults.myVerticalMovementResults.myFinalMovement = collisionRuntimeParams.myFixedMovement.vec3_componentAlongAxis(collisionRuntimeParams.myOffsetUp, outCharacterCollisionResults.myVerticalMovementResults.myFinalMovement);\r\n\r\n outCharacterCollisionResults.myTeleportResults.myInitialTeleportTransformQuat.quat2_copy(outCharacterCollisionResults.myTransformResults.myInitialTransformQuat);\r\n outCharacterCollisionResults.myTeleportResults.myInitialTeleportTransformQuat.quat2_setPosition(collisionRuntimeParams.myOriginalTeleportPosition);\r\n outCharacterCollisionResults.myTeleportResults.myFinalTeleportTransformQuat.quat2_copy(outCharacterCollisionResults.myTransformResults.myFinalTransformQuat);\r\n outCharacterCollisionResults.myTeleportResults.myFinalTeleportTransformQuat.quat2_setPosition(collisionRuntimeParams.myFixedTeleportPosition);\r\n outCharacterCollisionResults.myTeleportResults.myTeleportFailed = collisionRuntimeParams.myTeleportCanceled;\r\n\r\n outCharacterCollisionResults.myCheckTransformResults.myInitialCheckTransformQuat.quat2_copy(outCharacterCollisionResults.myTransformResults.myInitialTransformQuat);\r\n outCharacterCollisionResults.myCheckTransformResults.myInitialCheckTransformQuat.quat2_setPosition(collisionRuntimeParams.myOriginalPositionCheckPosition);\r\n outCharacterCollisionResults.myCheckTransformResults.myFinalCheckTransformQuat.quat2_copy(outCharacterCollisionResults.myTransformResults.myFinalTransformQuat);\r\n outCharacterCollisionResults.myCheckTransformResults.myFinalCheckTransformQuat.quat2_setPosition(collisionRuntimeParams.myFixedPositionCheckPosition);\r\n outCharacterCollisionResults.myCheckTransformResults.myCheckTransformFailed = !collisionRuntimeParams.myIsPositionOk;\r\n\r\n outCharacterCollisionResults.myWallSlideResults.myHasSlid = collisionRuntimeParams.myIsSliding;\r\n outCharacterCollisionResults.myWallSlideResults.mySlideMovementAngle = collisionRuntimeParams.mySlidingMovementAngle;\r\n outCharacterCollisionResults.myWallSlideResults.mySlideMovementWallAngle = collisionRuntimeParams.mySlidingCollisionAngle;\r\n outCharacterCollisionResults.myWallSlideResults.myWallNormal.vec3_copy(collisionRuntimeParams.mySlidingWallNormal);\r\n\r\n outCharacterCollisionResults.myGroundInfo.myOnSurface = collisionRuntimeParams.myIsOnGround;\r\n outCharacterCollisionResults.myGroundInfo.mySurfaceReferenceCollisionHit.copy(collisionRuntimeParams.myGroundCollisionHit);\r\n outCharacterCollisionResults.myGroundInfo.mySurfaceAngle = collisionRuntimeParams.myGroundAngle;\r\n outCharacterCollisionResults.myGroundInfo.mySurfacePerceivedAngle = collisionRuntimeParams.myGroundPerceivedAngle;\r\n outCharacterCollisionResults.myGroundInfo.mySurfaceNormal.vec3_copy(collisionRuntimeParams.myGroundNormal);\r\n outCharacterCollisionResults.myGroundInfo.mySurfaceHitMaxAngle = collisionRuntimeParams.myGroundHitMaxAngle;\r\n outCharacterCollisionResults.myGroundInfo.mySurfaceHitMaxNormal.vec3_copy(collisionRuntimeParams.myGroundHitMaxNormal);\r\n outCharacterCollisionResults.myGroundInfo.mySurfaceDistance = collisionRuntimeParams.myGroundDistance;\r\n outCharacterCollisionResults.myGroundInfo.myBaseInsideCollision = collisionRuntimeParams.myGroundIsBaseInsideCollision;\r\n\r\n outCharacterCollisionResults.myCeilingInfo.myOnSurface = collisionRuntimeParams.myIsOnCeiling;\r\n outCharacterCollisionResults.myCeilingInfo.mySurfaceReferenceCollisionHit.copy(collisionRuntimeParams.myCeilingCollisionHit);\r\n outCharacterCollisionResults.myCeilingInfo.mySurfaceAngle = collisionRuntimeParams.myCeilingAngle;\r\n outCharacterCollisionResults.myCeilingInfo.mySurfacePerceivedAngle = collisionRuntimeParams.myCeilingPerceivedAngle;\r\n outCharacterCollisionResults.myCeilingInfo.mySurfaceNormal.vec3_copy(collisionRuntimeParams.myCeilingNormal);\r\n outCharacterCollisionResults.myCeilingInfo.mySurfaceHitMaxAngle = collisionRuntimeParams.myCeilingHitMaxAngle;\r\n outCharacterCollisionResults.myCeilingInfo.mySurfaceHitMaxNormal.vec3_copy(collisionRuntimeParams.myCeilingHitMaxNormal);\r\n outCharacterCollisionResults.myCeilingInfo.mySurfaceDistance = collisionRuntimeParams.myCeilingDistance;\r\n outCharacterCollisionResults.myCeilingInfo.myBaseInsideCollision = collisionRuntimeParams.myCeilingIsBaseInsideCollision;\r\n\r\n outCharacterCollisionResults.myGroundResults.myHasSnappedOnSurface = collisionRuntimeParams.myHasSnappedOnGround;\r\n outCharacterCollisionResults.myGroundResults.myHasPoppedOutSurface = collisionRuntimeParams.myHasPoppedOutGround;\r\n outCharacterCollisionResults.myCeilingResults.myHasSnappedOnSurface = collisionRuntimeParams.myHasSnappedOnCeiling;\r\n outCharacterCollisionResults.myCeilingResults.myHasPoppedOutSurface = collisionRuntimeParams.myHasPoppedOutCeiling;\r\n\r\n outCharacterCollisionResults.myGroundResults.myHasHorizontalMovementAdjustedVerticalMovementOverSurfacePerceivedAngleDownhill = collisionRuntimeParams.myHorizontalMovementHasAdjustedVerticalMovementOverGroundPerceivedAngleDownhill;\r\n outCharacterCollisionResults.myGroundResults.myHasHorizontalMovementAdjustedVerticalMovementOverSurfacePerceivedAngleUphill = collisionRuntimeParams.myHorizontalMovementHasAdjustedVerticalMovementOverGroundPerceivedAngleUphill;\r\n outCharacterCollisionResults.myGroundResults.myHasVerticalMovementAdjustedHorizontalMovementOverSurfaceAngleDownhill = collisionRuntimeParams.myVerticalMovementHasAdjustedHorizontalMovementOverGroundAngleDownhill;\r\n\r\n outCharacterCollisionResults.myCeilingResults.myHasHorizontalMovementAdjustedVerticalMovementOverSurfacePerceivedAngleDownhill = collisionRuntimeParams.myHorizontalMovementHasAdjustedVerticalMovementOverCeilingPerceivedAngleDownhill;\r\n outCharacterCollisionResults.myCeilingResults.myHasHorizontalMovementAdjustedVerticalMovementOverSurfacePerceivedAngleUphill = collisionRuntimeParams.myHorizontalMovementHasAdjustedVerticalMovementOverCeilingPerceivedAngleUphill;\r\n outCharacterCollisionResults.myCeilingResults.myHasVerticalMovementAdjustedHorizontalMovementOverSurfaceAngleDownhill = collisionRuntimeParams.myVerticalMovementHasAdjustedHorizontalMovementOverCeilingAngleDownhill;\r\n\r\n outCharacterCollisionResults.mySplitMovementResults.myStepsToPerform = collisionRuntimeParams.mySplitMovementSteps;\r\n outCharacterCollisionResults.mySplitMovementResults.myStepsPerformed = collisionRuntimeParams.mySplitMovementStepsPerformed;\r\n outCharacterCollisionResults.mySplitMovementResults.myMovementInterrupted = collisionRuntimeParams.mySplitMovementStop;\r\n outCharacterCollisionResults.mySplitMovementResults.myMovementReduced = collisionRuntimeParams.mySplitMovementReduced;\r\n outCharacterCollisionResults.mySplitMovementResults.myLastStepLongerThanMaxStepLength = collisionRuntimeParams.mySplitMovementLastStepLongerThanMaxLength;\r\n outCharacterCollisionResults.mySplitMovementResults.myMovementChecked.vec3_copy(collisionRuntimeParams.mySplitMovementMovementChecked);\r\n\r\n outCharacterCollisionResults.myInternalResults.myLastRelevantInitialHorizontalMovement.vec3_copy(collisionRuntimeParams.myLastValidOriginalHorizontalMovement);\r\n outCharacterCollisionResults.myInternalResults.myLastRelevantFinalHorizontalMovement.vec3_copy(collisionRuntimeParams.myLastValidEndHorizontalMovement);\r\n outCharacterCollisionResults.myInternalResults.myLastRelevantInitialVerticalMovement.vec3_copy(collisionRuntimeParams.myLastValidOriginalVerticalMovement);\r\n outCharacterCollisionResults.myInternalResults.myLastRelevantFinalVerticalMovement.vec3_copy(collisionRuntimeParams.myLastValidEndVerticalMovement);\r\n\r\n outCharacterCollisionResults.myInternalResults.myLastRelevantAdjustedInitialHorizontalMovement.vec3_copy(collisionRuntimeParams.myLastValidSurfaceAdjustedHorizontalMovement);\r\n outCharacterCollisionResults.myInternalResults.myLastRelevantAdjustedInitialVerticalMovement.vec3_copy(collisionRuntimeParams.myLastValidSurfaceAdjustedVerticalMovement);\r\n\r\n outCharacterCollisionResults.myInternalResults.myLastRelevantHasWallSlid = collisionRuntimeParams.myLastValidIsSliding;\r\n outCharacterCollisionResults.myInternalResults.myHasWallSlidTowardOppositeDirection = collisionRuntimeParams.myIsSlidingIntoOppositeDirection;\r\n outCharacterCollisionResults.myInternalResults.myLastRelevantWallSlideFlickerPrevented = collisionRuntimeParams.myIsSlidingFlickerPrevented;\r\n outCharacterCollisionResults.myInternalResults.myWallSlideFlickerPreventionForceCheckCounter = collisionRuntimeParams.mySlidingFlickerPreventionCheckAnywayCounter;\r\n outCharacterCollisionResults.myInternalResults.myWallSlide90DegreesDirectionSign = collisionRuntimeParams.mySliding90DegreesSign;\r\n outCharacterCollisionResults.myInternalResults.myWallSlide90DegreesRecomputeDirectionSign = collisionRuntimeParams.mySlidingRecompute90DegreesSign;\r\n\r\n outCharacterCollisionResults.myTransformResults.myInitialTransformQuat.quat2_copy(currentTransformQuat);\r\n\r\n return outCharacterCollisionResults;\r\n };\r\n}();\r\n\r\nexport let convertCharacterColliderSetupToCollisionCheckParams = function () {\r\n return function convertCharacterColliderSetupToCollisionCheckParams(characterColliderSetup, outCollisionCheckParams = new CollisionCheckParams()) {\r\n outCollisionCheckParams.myHeight = characterColliderSetup.myHeight;\r\n\r\n outCollisionCheckParams.myRadius = characterColliderSetup.myHorizontalCheckParams.myHorizontalCheckConeRadius;\r\n outCollisionCheckParams.myDistanceFromFeetToIgnore = characterColliderSetup.myHorizontalCheckParams.myHorizontalCheckFeetDistanceToIgnore;\r\n outCollisionCheckParams.myDistanceFromHeadToIgnore = characterColliderSetup.myHorizontalCheckParams.myHorizontalCheckHeadDistanceToIgnore;\r\n\r\n outCollisionCheckParams.myHorizontalMovementCheckEnabled = characterColliderSetup.myHorizontalCheckParams.myHorizontalMovementCheckEnabled;\r\n\r\n outCollisionCheckParams.myHorizontalMovementStepEnabled = characterColliderSetup.myHorizontalCheckParams.myHorizontalMovementCheckSplitMovementEnabled;\r\n outCollisionCheckParams.myHorizontalMovementStepMaxLength = characterColliderSetup.myHorizontalCheckParams.myHorizontalMovementCheckSplitMovementMaxStepLength == null ? 0 : characterColliderSetup.myHorizontalCheckParams.myHorizontalMovementCheckSplitMovementMaxStepLength;\r\n\r\n outCollisionCheckParams.myHorizontalMovementRadialStepAmount = characterColliderSetup.myHorizontalCheckParams.myHorizontalMovementCheckRadialSteps;\r\n\r\n outCollisionCheckParams.myHorizontalMovementCheckDiagonalOutward = characterColliderSetup.myHorizontalCheckParams.myHorizontalMovementHorizontalDiagonalOutwardCheckEnabled;\r\n outCollisionCheckParams.myHorizontalMovementCheckDiagonalInward = characterColliderSetup.myHorizontalCheckParams.myHorizontalMovementHorizontalDiagonalInwardCheckEnabled;\r\n outCollisionCheckParams.myHorizontalMovementCheckStraight = characterColliderSetup.myHorizontalCheckParams.myHorizontalMovementHorizontalStraightCheckEnabled;\r\n outCollisionCheckParams.myHorizontalMovementCheckHorizontalBorder = characterColliderSetup.myHorizontalCheckParams.myHorizontalMovementHorizontalRadialCheckEnabled;\r\n outCollisionCheckParams.myHorizontalMovementCheckVerticalStraight = characterColliderSetup.myHorizontalCheckParams.myHorizontalMovementVerticalStraightCheckEnabled;\r\n outCollisionCheckParams.myHorizontalMovementCheckVerticalDiagonalUpwardOutward = characterColliderSetup.myHorizontalCheckParams.myHorizontalMovementVerticalDiagonalOutwardUpwardCheckEnabled;\r\n outCollisionCheckParams.myHorizontalMovementCheckVerticalDiagonalUpwardInward = characterColliderSetup.myHorizontalCheckParams.myHorizontalMovementVerticalDiagonalInwardUpwardCheckEnabled;\r\n outCollisionCheckParams.myHorizontalMovementCheckVerticalDiagonalDownwardOutward = characterColliderSetup.myHorizontalCheckParams.myHorizontalMovementVerticalDiagonalOutwardDownwardCheckEnabled;\r\n outCollisionCheckParams.myHorizontalMovementCheckVerticalDiagonalDownwardInward = characterColliderSetup.myHorizontalCheckParams.myHorizontalMovementVerticalDiagonalInwardDownwardCheckEnabled;\r\n outCollisionCheckParams.myHorizontalMovementCheckVerticalStraightDiagonalUpward = characterColliderSetup.myHorizontalCheckParams.myHorizontalMovementVerticalStraightDiagonalUpwardCheckEnabled;\r\n outCollisionCheckParams.myHorizontalMovementCheckVerticalStraightDiagonalDownward = characterColliderSetup.myHorizontalCheckParams.myHorizontalMovementVerticalStraightDiagonalDownwardCheckEnabled;\r\n outCollisionCheckParams.myHorizontalMovementCheckVerticalHorizontalBorderDiagonalOutward = characterColliderSetup.myHorizontalCheckParams.myHorizontalMovementVerticalRadialDiagonalOutwardCheckEnabled;\r\n outCollisionCheckParams.myHorizontalMovementCheckVerticalHorizontalBorderDiagonalInward = characterColliderSetup.myHorizontalCheckParams.myHorizontalMovementVerticalRadialDiagonalInwardCheckEnabled;\r\n\r\n outCollisionCheckParams.myHorizontalMovementHorizontalStraightCentralCheckEnabled = characterColliderSetup.myHorizontalCheckParams.myHorizontalMovementHorizontalStraightCentralCheckEnabled;\r\n outCollisionCheckParams.myHorizontalMovementVerticalStraightCentralCheckEnabled = characterColliderSetup.myHorizontalCheckParams.myHorizontalMovementVerticalStraightCentralCheckEnabled;\r\n outCollisionCheckParams.myHorizontalMovementVerticalStraightDiagonalUpwardCentralCheckEnabled = characterColliderSetup.myHorizontalCheckParams.myHorizontalMovementVerticalStraightDiagonalUpwardCentralCheckEnabled;\r\n outCollisionCheckParams.myHorizontalMovementVerticalStraightDiagonalDownwardCentralCheckEnabled = characterColliderSetup.myHorizontalCheckParams.myHorizontalMovementVerticalStraightDiagonalDownwardCentralCheckEnabled;\r\n\r\n outCollisionCheckParams.myHorizontalPositionCheckEnabled = characterColliderSetup.myHorizontalCheckParams.myHorizontalPositionCheckEnabled;\r\n\r\n outCollisionCheckParams.myHalfConeAngle = characterColliderSetup.myHorizontalCheckParams.myHorizontalCheckConeHalfAngle;\r\n outCollisionCheckParams.myHalfConeSliceAmount = characterColliderSetup.myHorizontalCheckParams.myHorizontalPositionCheckConeHalfSlices;\r\n outCollisionCheckParams.myCheckConeBorder = characterColliderSetup.myHorizontalCheckParams.myHorizontalPositionHorizontalBorderCheckEnabled;\r\n outCollisionCheckParams.myCheckConeRay = characterColliderSetup.myHorizontalCheckParams.myHorizontalPositionHorizontalRadialCheckEnabled;\r\n outCollisionCheckParams.myHorizontalPositionCheckVerticalIgnoreHitsInsideCollision = characterColliderSetup.myHorizontalCheckParams.myHorizontalPositionVerticalCheckIgnoreHitsInsideCollision;\r\n outCollisionCheckParams.myHorizontalPositionCheckVerticalDirectionType = characterColliderSetup.myHorizontalCheckParams.myHorizontalPositionVerticalCheckDirection;\r\n\r\n outCollisionCheckParams.myCheckHeight = characterColliderSetup.myHorizontalCheckParams.myHorizontalHeightCheckEnabled;\r\n\r\n outCollisionCheckParams.myCheckHeightVerticalMovement = characterColliderSetup.myHorizontalCheckParams.myHorizontalMovementHeightVerticalCheckEnabled;\r\n outCollisionCheckParams.myCheckHeightVerticalPosition = characterColliderSetup.myHorizontalCheckParams.myHorizontalPositionHeightVerticalCheckEnabled;\r\n outCollisionCheckParams.myCheckHeightTopMovement = characterColliderSetup.myHorizontalCheckParams.myHorizontalMovementHeightHorizontalCheckEnabled;\r\n outCollisionCheckParams.myCheckHeightTopPosition = characterColliderSetup.myHorizontalCheckParams.myHorizontalPositionHeightHorizontalCheckEnabled;\r\n outCollisionCheckParams.myCheckHeightConeOnCollision = characterColliderSetup.myHorizontalCheckParams.myHorizontalPositionVerticalCheckPerformHorizontalCheckOnHit;\r\n outCollisionCheckParams.myCheckHeightConeOnCollisionKeepHit = characterColliderSetup.myHorizontalCheckParams.myHorizontalPositionVerticalCheckPerformHorizontalCheckOnHitKeepVerticalHitIfNoHorizontalHit;\r\n\r\n outCollisionCheckParams.myHeightCheckStepAmountMovement = characterColliderSetup.myHorizontalCheckParams.myHorizontalMovementHeightCheckSteps;\r\n outCollisionCheckParams.myHeightCheckStepAmountPosition = characterColliderSetup.myHorizontalCheckParams.myHorizontalPositionHeightCheckSteps;\r\n outCollisionCheckParams.myCheckVerticalStraight = characterColliderSetup.myHorizontalCheckParams.myHorizontalPositionVerticalStraightCheckEnabled;\r\n outCollisionCheckParams.myCheckVerticalDiagonalRayOutward = characterColliderSetup.myHorizontalCheckParams.myHorizontalPositionVerticalRadialDiagonalOutwardCheckEnabled;\r\n outCollisionCheckParams.myCheckVerticalDiagonalRayInward = characterColliderSetup.myHorizontalCheckParams.myHorizontalPositionVerticalRadialDiagonalInwardCheckEnabled;\r\n outCollisionCheckParams.myCheckVerticalDiagonalBorderOutward = characterColliderSetup.myHorizontalCheckParams.myHorizontalPositionVerticalBorderDiagonalOutwardCheckEnabled;\r\n outCollisionCheckParams.myCheckVerticalDiagonalBorderInward = characterColliderSetup.myHorizontalCheckParams.myHorizontalPositionVerticalBorderDiagonalInwardCheckEnabled;\r\n outCollisionCheckParams.myCheckVerticalDiagonalBorderRayOutward = characterColliderSetup.myHorizontalCheckParams.myHorizontalPositionVerticalRadialBorderDiagonalOutwardCheckEnabled;\r\n outCollisionCheckParams.myCheckVerticalDiagonalBorderRayInward = characterColliderSetup.myHorizontalCheckParams.myHorizontalPositionVerticalRadialBorderDiagonalInwardCheckEnabled;\r\n outCollisionCheckParams.myCheckVerticalSearchFartherVerticalHit = characterColliderSetup.myHorizontalCheckParams.myHorizontalPositionVerticalCheckGetFarthestHit;\r\n\r\n outCollisionCheckParams.myCheckHorizontalFixedForwardEnabled = characterColliderSetup.myHorizontalCheckParams.myHorizontalCheckFixedForwardEnabled;\r\n outCollisionCheckParams.myCheckHorizontalFixedForward.vec3_copy(characterColliderSetup.myHorizontalCheckParams.myHorizontalCheckFixedForward);\r\n\r\n outCollisionCheckParams.myVerticalMovementCheckEnabled = characterColliderSetup.myVerticalCheckParams.myVerticalMovementCheckEnabled;\r\n outCollisionCheckParams.myVerticalPositionCheckEnabled = characterColliderSetup.myVerticalCheckParams.myVerticalPositionCheckEnabled;\r\n outCollisionCheckParams.myFeetRadius = characterColliderSetup.myVerticalCheckParams.myVerticalCheckCircumferenceRadius;\r\n\r\n outCollisionCheckParams.myAdjustVerticalMovementWithGroundAngleDownhill = characterColliderSetup.myGroundParams.myHorizontalMovementAdjustVerticalMovementOverSurfacePerceivedAngleDownhill;\r\n outCollisionCheckParams.myAdjustVerticalMovementWithGroundAngleUphill = characterColliderSetup.myGroundParams.myHorizontalMovementAdjustVerticalMovementOverSurfacePerceivedAngleUphill;\r\n outCollisionCheckParams.myAdjustVerticalMovementWithGroundAngleDownhillMaxAngle = characterColliderSetup.myGroundParams.myHorizontalMovementAdjustVerticalMovementOverSurfacePerceivedAngleDownhillMaxSurfaceAngle;\r\n outCollisionCheckParams.myAdjustVerticalMovementWithGroundAngleUphillMaxAngle = characterColliderSetup.myGroundParams.myHorizontalMovementAdjustVerticalMovementOverSurfacePerceivedAngleUphillMaxSurfaceAngle;\r\n outCollisionCheckParams.myAdjustVerticalMovementWithGroundAngleDownhillMaxPerceivedAngle = characterColliderSetup.myGroundParams.myHorizontalMovementAdjustVerticalMovementOverSurfacePerceivedAngleDownhillMaxSurfacePerceivedAngle;\r\n outCollisionCheckParams.myAdjustVerticalMovementWithGroundAngleUphillMaxPerceivedAngle = characterColliderSetup.myGroundParams.myHorizontalMovementAdjustVerticalMovementOverSurfacePerceivedAngleUphillMaxSurfacePerceivedAngle;\r\n outCollisionCheckParams.myAdjustHorizontalMovementWithGroundAngleDownhill = characterColliderSetup.myGroundParams.myVerticalMovementAdjustHorizontalMovementOverSurfaceAngleDownhill;\r\n outCollisionCheckParams.myAdjustHorizontalMovementWithGroundAngleDownhillMinAngle = characterColliderSetup.myGroundParams.myVerticalMovementAdjustHorizontalMovementOverSurfaceAngleDownhillMinSurfaceAngle;\r\n\r\n outCollisionCheckParams.myAdjustVerticalMovementWithCeilingAngleDownhill = characterColliderSetup.myCeilingParams.myHorizontalMovementAdjustVerticalMovementOverSurfacePerceivedAngleDownhill;\r\n outCollisionCheckParams.myAdjustVerticalMovementWithCeilingAngleUphill = characterColliderSetup.myCeilingParams.myHorizontalMovementAdjustVerticalMovementOverSurfacePerceivedAngleUphill;\r\n outCollisionCheckParams.myAdjustVerticalMovementWithCeilingAngleDownhillMaxAngle = characterColliderSetup.myCeilingParams.myHorizontalMovementAdjustVerticalMovementOverSurfacePerceivedAngleDownhillMaxSurfaceAngle;\r\n outCollisionCheckParams.myAdjustVerticalMovementWithCeilingAngleUphillMaxAngle = characterColliderSetup.myCeilingParams.myHorizontalMovementAdjustVerticalMovementOverSurfacePerceivedAngleUphillMaxSurfaceAngle;\r\n outCollisionCheckParams.myAdjustVerticalMovementWithCeilingAngleDownhillMaxPerceivedAngle = characterColliderSetup.myCeilingParams.myHorizontalMovementAdjustVerticalMovementOverSurfacePerceivedAngleDownhillMaxSurfacePerceivedAngle;\r\n outCollisionCheckParams.myAdjustVerticalMovementWithCeilingAngleUphillMaxPerceivedAngle = characterColliderSetup.myCeilingParams.myHorizontalMovementAdjustVerticalMovementOverSurfacePerceivedAngleUphillMaxSurfacePerceivedAngle;\r\n outCollisionCheckParams.myAdjustHorizontalMovementWithCeilingAngleDownhill = characterColliderSetup.myCeilingParams.myVerticalMovementAdjustHorizontalMovementOverSurfaceAngleDownhill;\r\n outCollisionCheckParams.myAdjustHorizontalMovementWithCeilingAngleDownhillMinAngle = characterColliderSetup.myCeilingParams.myVerticalMovementAdjustHorizontalMovementOverSurfaceAngleDownhillMinSurfaceAngle;\r\n\r\n outCollisionCheckParams.myCheckVerticalFixedForwardEnabled = characterColliderSetup.myVerticalCheckParams.myVerticalCheckFixedForwardEnabled;\r\n outCollisionCheckParams.myCheckVerticalFixedForward.vec3_copy(characterColliderSetup.myVerticalCheckParams.myVerticalCheckFixedForward);\r\n outCollisionCheckParams.myCheckVerticalBothDirection = characterColliderSetup.myVerticalCheckParams.myVerticalMovementCheckPerformCheckOnBothSides;\r\n outCollisionCheckParams.myCheckVerticalPositionBothDirection = characterColliderSetup.myVerticalCheckParams.myVerticalPositionCheckPerformCheckOnBothSides;\r\n\r\n outCollisionCheckParams.myVerticalMovementReduceEnabled = characterColliderSetup.myVerticalCheckParams.myVerticalMovementCheckReductionEnabled;\r\n\r\n outCollisionCheckParams.myGroundCircumferenceAddCenter = characterColliderSetup.myVerticalCheckParams.myVerticalCheckCircumferenceCentralCheckEnabled;\r\n outCollisionCheckParams.myGroundCircumferenceSliceAmount = characterColliderSetup.myVerticalCheckParams.myVerticalCheckCircumferenceSlices;\r\n outCollisionCheckParams.myGroundCircumferenceStepAmount = characterColliderSetup.myVerticalCheckParams.myVerticalCheckCircumferenceRadialSteps;\r\n outCollisionCheckParams.myGroundCircumferenceRotationPerStep = characterColliderSetup.myVerticalCheckParams.myVerticalCheckCircumferenceRotationPerRadialStep;\r\n outCollisionCheckParams.myVerticalAllowHitInsideCollisionIfOneOk = characterColliderSetup.myVerticalCheckParams.myVerticalCheckAllowHitsInsideCollisionIfOneValid;\r\n\r\n outCollisionCheckParams.myHorizontalBlockLayerFlags.copy(characterColliderSetup.myHorizontalCheckParams.myHorizontalCheckBlockLayerFlags);\r\n outCollisionCheckParams.myVerticalBlockLayerFlags.copy(characterColliderSetup.myVerticalCheckParams.myVerticalCheckBlockLayerFlags);\r\n outCollisionCheckParams.myHorizontalObjectsToIgnore.pp_copy(characterColliderSetup.myHorizontalCheckParams.myHorizontalCheckObjectsToIgnore);\r\n outCollisionCheckParams.myVerticalObjectsToIgnore.pp_copy(characterColliderSetup.myVerticalCheckParams.myVerticalCheckObjectsToIgnore);\r\n outCollisionCheckParams.myHorizontalBlockColliderType = characterColliderSetup.myHorizontalCheckParams.myHorizontalBlockColliderType;\r\n outCollisionCheckParams.myVerticalBlockColliderType = characterColliderSetup.myVerticalCheckParams.myVerticalBlockColliderType;\r\n\r\n outCollisionCheckParams.mySnapOnGroundEnabled = characterColliderSetup.myGroundParams.mySurfaceSnapMaxDistance > 0;\r\n outCollisionCheckParams.mySnapOnGroundExtraDistance = characterColliderSetup.myGroundParams.mySurfaceSnapMaxDistance;\r\n outCollisionCheckParams.mySnapOnCeilingEnabled = characterColliderSetup.myCeilingParams.mySurfaceSnapMaxDistance > 0;\r\n outCollisionCheckParams.mySnapOnCeilingExtraDistance = characterColliderSetup.myCeilingParams.mySurfaceSnapMaxDistance;\r\n\r\n outCollisionCheckParams.myGroundPopOutEnabled = characterColliderSetup.myGroundParams.mySurfacePopOutMaxDistance > 0;\r\n outCollisionCheckParams.myGroundPopOutExtraDistance = characterColliderSetup.myGroundParams.mySurfacePopOutMaxDistance;\r\n outCollisionCheckParams.myCeilingPopOutEnabled = characterColliderSetup.myCeilingParams.mySurfacePopOutMaxDistance > 0;\r\n outCollisionCheckParams.myCeilingPopOutExtraDistance = characterColliderSetup.myCeilingParams.mySurfacePopOutMaxDistance;\r\n\r\n outCollisionCheckParams.myGroundAngleToIgnore = characterColliderSetup.myGroundParams.mySurfaceAngleToIgnore;\r\n outCollisionCheckParams.myGroundAngleToIgnoreWithPerceivedAngle = characterColliderSetup.myGroundParams.mySurfaceAngleToIgnoreWithSurfacePerceivedAngle;\r\n outCollisionCheckParams.myCeilingAngleToIgnore = characterColliderSetup.myCeilingParams.mySurfaceAngleToIgnore;\r\n outCollisionCheckParams.myCeilingAngleToIgnoreWithPerceivedAngle = characterColliderSetup.myCeilingParams.mySurfaceAngleToIgnoreWithSurfacePerceivedAngle;\r\n\r\n outCollisionCheckParams.myHorizontalMovementGroundAngleIgnoreHeight = characterColliderSetup.myGroundParams.myHorizontalMovementSurfaceAngleToIgnoreMaxVerticalDistance;\r\n outCollisionCheckParams.myHorizontalMovementCeilingAngleIgnoreHeight = characterColliderSetup.myCeilingParams.myHorizontalMovementSurfaceAngleToIgnoreMaxVerticalDistance;\r\n outCollisionCheckParams.myHorizontalPositionGroundAngleIgnoreHeight = characterColliderSetup.myGroundParams.myHorizontalPositionSurfaceAngleToIgnoreMaxVerticalDistance;\r\n outCollisionCheckParams.myHorizontalPositionCeilingAngleIgnoreHeight = characterColliderSetup.myCeilingParams.myHorizontalPositionSurfaceAngleToIgnoreMaxVerticalDistance;\r\n\r\n outCollisionCheckParams.myHorizontalMovementGroundAngleIgnoreMaxMovementLeft = characterColliderSetup.myGroundParams.myHorizontalMovementSurfaceAngleToIgnoreMaxHorizontalMovementLeft;\r\n outCollisionCheckParams.myHorizontalMovementCeilingAngleIgnoreMaxMovementLeft = characterColliderSetup.myCeilingParams.myHorizontalMovementSurfaceAngleToIgnoreMaxHorizontalMovementLeft;\r\n\r\n outCollisionCheckParams.myComputeGroundInfoEnabled = characterColliderSetup.myGroundParams.myCollectSurfaceInfo;\r\n outCollisionCheckParams.myComputeCeilingInfoEnabled = characterColliderSetup.myCeilingParams.myCollectSurfaceInfo;\r\n outCollisionCheckParams.myDistanceToBeOnGround = characterColliderSetup.myGroundParams.myOnSurfaceMaxOutsideDistance;\r\n outCollisionCheckParams.myDistanceToComputeGroundInfo = characterColliderSetup.myGroundParams.myCollectSurfaceNormalMaxOutsideDistance;\r\n outCollisionCheckParams.myDistanceToBeOnCeiling = characterColliderSetup.myCeilingParams.myOnSurfaceMaxOutsideDistance;\r\n outCollisionCheckParams.myDistanceToComputeCeilingInfo = characterColliderSetup.myCeilingParams.myCollectSurfaceNormalMaxOutsideDistance;\r\n outCollisionCheckParams.myVerticalFixToBeOnGround = characterColliderSetup.myGroundParams.myOnSurfaceMaxInsideDistance;\r\n outCollisionCheckParams.myVerticalFixToComputeGroundInfo = characterColliderSetup.myGroundParams.myCollectSurfaceNormalMaxInsideDistance;\r\n outCollisionCheckParams.myVerticalFixToBeOnCeiling = characterColliderSetup.myCeilingParams.myOnSurfaceMaxInsideDistance;\r\n outCollisionCheckParams.myVerticalFixToComputeCeilingInfo = characterColliderSetup.myCeilingParams.myCollectSurfaceNormalMaxInsideDistance;\r\n\r\n outCollisionCheckParams.myGroundIsBaseInsideCollisionCheckEnabled = characterColliderSetup.myGroundParams.myBaseInsideCollisionCheckEnabled;\r\n outCollisionCheckParams.myCeilingIsBaseInsideCollisionCheckEnabled = characterColliderSetup.myCeilingParams.myBaseInsideCollisionCheckEnabled;\r\n outCollisionCheckParams.myIsOnGroundIfInsideHit = characterColliderSetup.myGroundParams.myOnSurfaceIfBaseInsideCollision;\r\n outCollisionCheckParams.myIsOnCeilingIfInsideHit = characterColliderSetup.myCeilingParams.myOnSurfaceIfBaseInsideCollision;\r\n\r\n outCollisionCheckParams.myFindGroundDistanceMaxOutsideDistance = characterColliderSetup.myGroundParams.myCollectSurfaceDistanceOutsideDistance;\r\n outCollisionCheckParams.myFindGroundDistanceMaxInsideDistance = characterColliderSetup.myGroundParams.myCollectSurfaceDistanceInsideDistance;\r\n outCollisionCheckParams.myFindCeilingDistanceMaxOutsideDistance = characterColliderSetup.myCeilingParams.myCollectSurfaceDistanceOutsideDistance;\r\n outCollisionCheckParams.myFindCeilingDistanceMaxInsideDistance = characterColliderSetup.myCeilingParams.myCollectSurfaceDistanceInsideDistance;\r\n\r\n outCollisionCheckParams.myCollectGroundCollisionHitOutsideDistance = characterColliderSetup.myGroundParams.myCollectSurfaceCollisionHitOutsideDistance;\r\n outCollisionCheckParams.myCollectGroundCollisionHitInsideDistance = characterColliderSetup.myGroundParams.myCollectSurfaceCollisionHitInsideDistance;\r\n outCollisionCheckParams.myCollectCeilingCollisionHitOutsideDistance = characterColliderSetup.myCeilingParams.myCollectSurfaceCollisionHitOutsideDistance;\r\n outCollisionCheckParams.myCollectCeilingCollisionHitInsideDistance = characterColliderSetup.myCeilingParams.myCollectSurfaceCollisionHitInsideDistance;\r\n\r\n outCollisionCheckParams.myAllowGroundSteepFix = characterColliderSetup.myGroundParams.myHorizontalMovementAllowExitAttemptWhenOnNotIgnorableSurfacePerceivedAngle;\r\n outCollisionCheckParams.myAllowCeilingSteepFix = characterColliderSetup.myCeilingParams.myHorizontalMovementAllowExitAttemptWhenOnNotIgnorableSurfacePerceivedAngle;\r\n\r\n outCollisionCheckParams.myMustStayOnGround = characterColliderSetup.myGroundParams.myMovementMustStayOnSurface;\r\n outCollisionCheckParams.myMustStayOnCeiling = characterColliderSetup.myCeilingParams.myMovementMustStayOnSurface;\r\n outCollisionCheckParams.myRegatherGroundInfoOnSurfaceCheckFail = characterColliderSetup.myGroundParams.myRecollectSurfaceInfoOnSurfaceCheckFailed;\r\n outCollisionCheckParams.myRegatherCeilingInfoOnSurfaceCheckFail = characterColliderSetup.myCeilingParams.myRecollectSurfaceInfoOnSurfaceCheckFailed;\r\n outCollisionCheckParams.myMustStayBelowIgnorableGroundAngleDownhill = characterColliderSetup.myGroundParams.myMovementMustStayOnIgnorableSurfaceAngleDownhill;\r\n outCollisionCheckParams.myMustStayBelowIgnorableCeilingAngleDownhill = characterColliderSetup.myCeilingParams.myMovementMustStayOnIgnorableSurfaceAngleDownhill;\r\n outCollisionCheckParams.myMustStayBelowGroundAngleDownhill = characterColliderSetup.myGroundParams.myMovementMustStayOnSurfaceAngleDownhill;\r\n outCollisionCheckParams.myMustStayBelowCeilingAngleDownhill = characterColliderSetup.myCeilingParams.myMovementMustStayOnSurfaceAngleDownhill;\r\n outCollisionCheckParams.myMovementMustStayOnGroundHitAngle = characterColliderSetup.myGroundParams.myMovementMustStayOnSurfaceHitMaxAngle;\r\n outCollisionCheckParams.myMovementMustStayOnCeilingHitAngle = characterColliderSetup.myCeilingParams.myMovementMustStayOnSurfaceHitMaxAngle;\r\n\r\n outCollisionCheckParams.myTeleportMustBeOnIgnorableGroundAngle = characterColliderSetup.myGroundParams.myTeleportMustBeOnIgnorableSurfaceAngle;\r\n outCollisionCheckParams.myCheckTransformMustBeOnIgnorableGroundAngle = characterColliderSetup.myGroundParams.myCheckTransformMustBeOnIgnorableSurfaceAngle;\r\n outCollisionCheckParams.myTeleportMustBeOnIgnorableCeilingAngle = characterColliderSetup.myCeilingParams.myTeleportMustBeOnIgnorableSurfaceAngle;\r\n outCollisionCheckParams.myCheckTransformMustBeOnIgnorableCeilingAngle = characterColliderSetup.myCeilingParams.myCheckTransformMustBeOnIgnorableSurfaceAngle;\r\n\r\n outCollisionCheckParams.myTeleportMustBeOnGroundAngle = characterColliderSetup.myGroundParams.myTeleportMustBeOnSurfaceAngle;\r\n outCollisionCheckParams.myCheckTransformMustBeOnGroundAngle = characterColliderSetup.myGroundParams.myCheckTransformMustBeOnSurfaceAngle;\r\n outCollisionCheckParams.myTeleportMustBeOnCeilingAngle = characterColliderSetup.myCeilingParams.myTeleportMustBeOnSurfaceAngle;\r\n outCollisionCheckParams.myCheckTransformMustBeOnCeilingAngle = characterColliderSetup.myCeilingParams.myCheckTransformMustBeOnSurfaceAngle;\r\n\r\n outCollisionCheckParams.myTeleportMustBeOnGround = characterColliderSetup.myGroundParams.myTeleportMustBeOnSurface;\r\n outCollisionCheckParams.myCheckTransformMustBeOnGround = characterColliderSetup.myGroundParams.myCheckTransformMustBeOnSurface;\r\n outCollisionCheckParams.myTeleportMustBeOnCeiling = characterColliderSetup.myCeilingParams.myTeleportMustBeOnSurface;\r\n outCollisionCheckParams.myCheckTransformMustBeOnCeiling = characterColliderSetup.myCeilingParams.myCheckTransformMustBeOnSurface;\r\n\r\n outCollisionCheckParams.mySlidingEnabled = characterColliderSetup.myWallSlideParams.myWallSlideEnabled;\r\n outCollisionCheckParams.mySlidingHorizontalMovementCheckBetterNormal = characterColliderSetup.myHorizontalCheckParams.myHorizontalMovementCheckGetBetterReferenceHit;\r\n outCollisionCheckParams.mySlidingMaxAttempts = characterColliderSetup.myWallSlideParams.myWallSlideMaxAttempts;\r\n outCollisionCheckParams.mySlidingCheckBothDirections = characterColliderSetup.myWallSlideParams.myCheckBothWallSlideDirections;\r\n outCollisionCheckParams.mySlidingFlickeringPreventionType = characterColliderSetup.myWallSlideParams.myWallSlideFlickerPreventionMode;\r\n outCollisionCheckParams.mySlidingFlickeringPreventionCheckOnlyIfAlreadySliding = characterColliderSetup.myWallSlideParams.myWallSlideFlickerPreventionCheckOnlyIfAlreadySliding;\r\n outCollisionCheckParams.mySlidingFlickerPreventionCheckAnywayCounter = characterColliderSetup.myWallSlideParams.myWallSlideFlickerPreventionForceCheckCounter;\r\n outCollisionCheckParams.mySlidingAdjustSign90Degrees = characterColliderSetup.myWallSlideParams.my90DegreesWallSlideAdjustDirectionSign;\r\n\r\n outCollisionCheckParams.mySplitMovementEnabled = characterColliderSetup.mySplitMovementParams.mySplitMovementEnabled;\r\n outCollisionCheckParams.mySplitMovementMaxLength = characterColliderSetup.mySplitMovementParams.mySplitMovementMaxStepLength == null ? 0 : characterColliderSetup.mySplitMovementParams.mySplitMovementMaxStepLength;\r\n outCollisionCheckParams.mySplitMovementMaxLengthEnabled = characterColliderSetup.mySplitMovementParams.mySplitMovementMaxStepLength != null;\r\n outCollisionCheckParams.mySplitMovementMaxLengthLastStepCanBeLonger = characterColliderSetup.mySplitMovementParams.mySplitMovementLastStepCanBeLongerThanMaxStepLength;\r\n outCollisionCheckParams.mySplitMovementMaxSteps = characterColliderSetup.mySplitMovementParams.mySplitMovementMaxSteps == null ? 0 : characterColliderSetup.mySplitMovementParams.mySplitMovementMaxSteps;\r\n outCollisionCheckParams.mySplitMovementMaxStepsEnabled = characterColliderSetup.mySplitMovementParams.mySplitMovementMaxSteps != null;\r\n outCollisionCheckParams.mySplitMovementMinLength = characterColliderSetup.mySplitMovementParams.mySplitMovementMinStepLength == null ? 0 : characterColliderSetup.mySplitMovementParams.mySplitMovementMinStepLength;\r\n outCollisionCheckParams.mySplitMovementMinLengthEnabled = characterColliderSetup.mySplitMovementParams.mySplitMovementMinStepLength != null;\r\n outCollisionCheckParams.mySplitMovementStopWhenHorizontalMovementCanceled = characterColliderSetup.mySplitMovementParams.mySplitMovementStopOnHorizontalMovementFailed;\r\n outCollisionCheckParams.mySplitMovementStopAndFailIfMovementWouldBeReduced = characterColliderSetup.mySplitMovementParams.mySplitMovementStopAndFailIfMovementWouldBeReduced;\r\n outCollisionCheckParams.mySplitMovementStopWhenVerticalMovementCanceled = characterColliderSetup.mySplitMovementParams.mySplitMovementStopOnVerticalMovementFailed;\r\n outCollisionCheckParams.mySplitMovementStopWhenVerticalMovementReduced = characterColliderSetup.mySplitMovementParams.mySplitMovementStopOnVerticalMovementReduced;\r\n outCollisionCheckParams.mySplitMovementStopCallback = null;\r\n outCollisionCheckParams.mySplitMovementStopReturnPrevious = characterColliderSetup.mySplitMovementParams.mySplitMovementStopReturnPreviousResults;\r\n\r\n outCollisionCheckParams.myPositionOffsetLocal.vec3_copy(characterColliderSetup.myAdditionalParams.myPositionOffsetLocal);\r\n outCollisionCheckParams.myRotationOffsetLocalQuat.quat_copy(characterColliderSetup.myAdditionalParams.myRotationOffsetLocalQuat);\r\n\r\n outCollisionCheckParams.myDebugEnabled = characterColliderSetup.myDebugParams.myVisualDebugEnabled;\r\n\r\n outCollisionCheckParams.myDebugHorizontalMovementEnabled = characterColliderSetup.myDebugParams.myVisualDebugHorizontalMovementCheckEnabled;\r\n outCollisionCheckParams.myDebugHorizontalPositionEnabled = characterColliderSetup.myDebugParams.myVisualDebugHorizontalPositionCheckEnabled;\r\n outCollisionCheckParams.myDebugVerticalMovementEnabled = characterColliderSetup.myDebugParams.myVisualDebugVerticalMovementCheckEnabled;\r\n outCollisionCheckParams.myDebugVerticalPositionEnabled = characterColliderSetup.myDebugParams.myVisualDebugVerticalPositionCheckEnabled;\r\n outCollisionCheckParams.myDebugSlidingEnabled = characterColliderSetup.myDebugParams.myVisualDebugSlideEnabled;\r\n\r\n outCollisionCheckParams.myDebugGroundInfoEnabled = characterColliderSetup.myDebugParams.myVisualDebugGroundInfoEnabled;\r\n outCollisionCheckParams.myDebugCeilingInfoEnabled = characterColliderSetup.myDebugParams.myVisualDebugGroundInfoEnabled;\r\n outCollisionCheckParams.myDebugRuntimeParamsEnabled = characterColliderSetup.myDebugParams.myVisualDebugResultsEnabled;\r\n outCollisionCheckParams.myDebugMovementEnabled = characterColliderSetup.myDebugParams.myVisualDebugMovementEnabled;\r\n\r\n return outCollisionCheckParams;\r\n };\r\n}();\r\n\r\nexport let CollisionCheckBridge = {\r\n getCollisionCheck,\r\n setCollisionCheck,\r\n isCollisionCheckDisabled,\r\n setCollisionCheckDisabled,\r\n initBridge,\r\n checkMovement,\r\n checkTeleportToTransform,\r\n checkTransform,\r\n updateGroundInfo,\r\n updateCeilingInfo,\r\n convertCharacterCollisionResultsToCollisionRuntimeParams,\r\n convertCollisionRuntimeParamsToCharacterCollisionResults,\r\n convertCharacterColliderSetupToCollisionCheckParams\r\n};", "import { quat2_create } from \"../../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Globals } from \"../../../../pp/globals.js\";\r\nimport { CharacterCollisionResults } from \"./character_collision_results.js\";\r\nimport { CollisionCheckBridge } from \"./collision_check_bridge.js\";\r\n\r\nexport class CharacterCollisionSystem {\r\n\r\n constructor(engine = Globals.getMainEngine()) {\r\n this._myLastCheckRaycastsPerformed = 0;\r\n this._myCurrentFrameRaycastsPerformed = 0;\r\n this._myMaxFrameRaycastsPerformed = 0;\r\n\r\n this.myEngine = engine;\r\n\r\n CollisionCheckBridge.initBridge(this.myEngine);\r\n }\r\n\r\n update(dt) {\r\n this._myMaxFrameRaycastsPerformed = Math.max(this._myCurrentFrameRaycastsPerformed, this._myMaxFrameRaycastsPerformed);\r\n this._myCurrentFrameRaycastsPerformed = 0;\r\n CollisionCheckBridge.getCollisionCheck(this.myEngine)._myTotalRaycasts = 0;\r\n }\r\n\r\n checkMovement(movement, currentTransformQuat, characterColliderSetup, prevCharacterCollisionResults, outCharacterCollisionResults = new CharacterCollisionResults()) {\r\n CollisionCheckBridge.checkMovement(movement, currentTransformQuat, characterColliderSetup, prevCharacterCollisionResults, outCharacterCollisionResults, this.myEngine);\r\n\r\n this._myLastCheckRaycastsPerformed = CollisionCheckBridge.getCollisionCheck(this.myEngine)._myTotalRaycasts - this._myCurrentFrameRaycastsPerformed;\r\n this._myCurrentFrameRaycastsPerformed = CollisionCheckBridge.getCollisionCheck(this.myEngine)._myTotalRaycasts;\r\n this._myMaxFrameRaycastsPerformed = Math.max(this._myCurrentFrameRaycastsPerformed, this._myMaxFrameRaycastsPerformed);\r\n outCharacterCollisionResults.myDebugResults._myRaycastsPerformed = this._myLastCheckRaycastsPerformed;\r\n }\r\n\r\n checkTeleportToPosition(teleportPosition, currentTransformQuat, characterColliderSetup, prevCharacterCollisionResults, outCharacterCollisionResults = new CharacterCollisionResults()) {\r\n // Implemented outside class definition\r\n }\r\n\r\n checkTeleportToTransform(teleportTransformQuat, currentTransformQuat, characterColliderSetup, prevCharacterCollisionResults, outCharacterCollisionResults = new CharacterCollisionResults()) {\r\n CollisionCheckBridge.checkTeleportToTransform(teleportTransformQuat, currentTransformQuat, characterColliderSetup, prevCharacterCollisionResults, outCharacterCollisionResults, this.myEngine);\r\n\r\n this._myLastCheckRaycastsPerformed = CollisionCheckBridge.getCollisionCheck(this.myEngine)._myTotalRaycasts - this._myCurrentFrameRaycastsPerformed;\r\n this._myCurrentFrameRaycastsPerformed = CollisionCheckBridge.getCollisionCheck(this.myEngine)._myTotalRaycasts;\r\n this._myMaxFrameRaycastsPerformed = Math.max(this._myCurrentFrameRaycastsPerformed, this._myMaxFrameRaycastsPerformed);\r\n outCharacterCollisionResults.myDebugResults._myRaycastsPerformed = this._myLastCheckRaycastsPerformed;\r\n }\r\n\r\n checkTransform(checkTransformQuat, characterColliderSetup, prevCharacterCollisionResults, outCharacterCollisionResults = new CharacterCollisionResults()) {\r\n CollisionCheckBridge.checkTransform(checkTransformQuat, characterColliderSetup, prevCharacterCollisionResults, outCharacterCollisionResults, this.myEngine);\r\n\r\n this._myLastCheckRaycastsPerformed = CollisionCheckBridge.getCollisionCheck(this.myEngine)._myTotalRaycasts - this._myCurrentFrameRaycastsPerformed;\r\n this._myCurrentFrameRaycastsPerformed = CollisionCheckBridge.getCollisionCheck(this.myEngine)._myTotalRaycasts;\r\n this._myMaxFrameRaycastsPerformed = Math.max(this._myCurrentFrameRaycastsPerformed, this._myMaxFrameRaycastsPerformed);\r\n outCharacterCollisionResults.myDebugResults._myRaycastsPerformed = this._myLastCheckRaycastsPerformed;\r\n }\r\n\r\n updateSurfaceInfo(currentTransformQuat, characterColliderSetup, prevCharacterCollisionResults, outCharacterCollisionResults = new CharacterCollisionResults()) {\r\n let currentFramePerformedRaycasts = this._myCurrentFrameRaycastsPerformed;\r\n\r\n this.updateGroundInfo(currentTransformQuat, characterColliderSetup, prevCharacterCollisionResults, outCharacterCollisionResults);\r\n this.updateCeilingInfo(currentTransformQuat, characterColliderSetup, prevCharacterCollisionResults, outCharacterCollisionResults);\r\n\r\n this._myLastCheckRaycastsPerformed = CollisionCheckBridge.getCollisionCheck(this.myEngine)._myTotalRaycasts - currentFramePerformedRaycasts;\r\n this._myCurrentFrameRaycastsPerformed = CollisionCheckBridge.getCollisionCheck(this.myEngine)._myTotalRaycasts;\r\n this._myMaxFrameRaycastsPerformed = Math.max(this._myCurrentFrameRaycastsPerformed, this._myMaxFrameRaycastsPerformed);\r\n outCharacterCollisionResults.myDebugResults._myRaycastsPerformed = this._myLastCheckRaycastsPerformed;\r\n }\r\n\r\n updateGroundInfo(currentTransformQuat, characterColliderSetup, prevCharacterCollisionResults, outCharacterCollisionResults = new CharacterCollisionResults()) {\r\n CollisionCheckBridge.updateGroundInfo(currentTransformQuat, characterColliderSetup, prevCharacterCollisionResults, outCharacterCollisionResults, this.myEngine);\r\n\r\n this._myLastCheckRaycastsPerformed = CollisionCheckBridge.getCollisionCheck(this.myEngine)._myTotalRaycasts - this._myCurrentFrameRaycastsPerformed;\r\n this._myCurrentFrameRaycastsPerformed = CollisionCheckBridge.getCollisionCheck(this.myEngine)._myTotalRaycasts;\r\n this._myMaxFrameRaycastsPerformed = Math.max(this._myCurrentFrameRaycastsPerformed, this._myMaxFrameRaycastsPerformed);\r\n outCharacterCollisionResults.myDebugResults._myRaycastsPerformed = this._myLastCheckRaycastsPerformed;\r\n }\r\n\r\n updateCeilingInfo(currentTransformQuat, characterColliderSetup, prevCharacterCollisionResults, outCharacterCollisionResults = new CharacterCollisionResults()) {\r\n CollisionCheckBridge.updateCeilingInfo(currentTransformQuat, characterColliderSetup, prevCharacterCollisionResults, outCharacterCollisionResults, this.myEngine);\r\n\r\n this._myLastCheckRaycastsPerformed = CollisionCheckBridge.getCollisionCheck(this.myEngine)._myTotalRaycasts - this._myCurrentFrameRaycastsPerformed;\r\n this._myCurrentFrameRaycastsPerformed = CollisionCheckBridge.getCollisionCheck(this.myEngine)._myTotalRaycasts;\r\n this._myMaxFrameRaycastsPerformed = Math.max(this._myCurrentFrameRaycastsPerformed, this._myMaxFrameRaycastsPerformed);\r\n outCharacterCollisionResults.myDebugResults._myRaycastsPerformed = this._myLastCheckRaycastsPerformed;\r\n }\r\n}\r\n\r\n\r\n\r\n// IMPLEMENTATION\r\n\r\nCharacterCollisionSystem.prototype.checkTeleportToPosition = function () {\r\n let teleportTransformQuat = quat2_create();\r\n return function checkTeleportToPosition(teleportPosition, currentTransformQuat, characterColliderSetup, prevCharacterCollisionResults, outCharacterCollisionResults) {\r\n teleportTransformQuat.quat2_copy(currentTransformQuat);\r\n teleportTransformQuat.quat2_setPosition(teleportPosition);\r\n this.checkTeleportToTransform(teleportTransformQuat, currentTransformQuat, characterColliderSetup, prevCharacterCollisionResults, outCharacterCollisionResults);\r\n };\r\n}();", "import { Component, Property } from \"@wonderlandengine/api\";\r\nimport { Globals } from \"../../../pp/globals.js\";\r\nimport { ClassicGamepadCore } from \"../../gamepad/gamepad_cores/classic_gamepad_core.js\";\r\nimport { KeyboardGamepadCore } from \"../../gamepad/gamepad_cores/keyboard_gamepad_core.js\";\r\nimport { XRGamepadCore } from \"../../gamepad/gamepad_cores/xr_gamepad_core.js\";\r\nimport { InputManager } from \"../input_manager.js\";\r\n\r\nexport class InputManagerComponent extends Component {\r\n static TypeName = \"pp-input-manager\";\r\n static Properties = {\r\n _myPoseForwardFixed: Property.bool(true),\r\n _myPreventMouseContextMenu: Property.bool(true),\r\n _myPreventMouseMiddleButtonScroll: Property.bool(true),\r\n _myEnableTrackedHandPoses: Property.bool(true)\r\n };\r\n\r\n init() {\r\n this._myInputManager = null;\r\n }\r\n\r\n update(dt) {\r\n if (Globals.getInputManager(this.engine) == this._myInputManager) {\r\n this._myInputManager.update(dt);\r\n }\r\n }\r\n\r\n _setupMousePrevent() {\r\n if (this._myPreventMouseContextMenu) {\r\n this._myInputManager.getMouse().setContextMenuActive(false);\r\n }\r\n\r\n if (this._myPreventMouseMiddleButtonScroll) {\r\n this._myInputManager.getMouse().setMiddleButtonScrollActive(false);\r\n }\r\n }\r\n\r\n _addGamepadCores() {\r\n let leftHandPose = this._myInputManager.getLeftHandPose();\r\n let rightHandPose = this._myInputManager.getRightHandPose();\r\n\r\n let leftXRGamepadCore = new XRGamepadCore(leftHandPose);\r\n let rightXRGamepadCore = new XRGamepadCore(rightHandPose);\r\n\r\n this._myInputManager.getGamepadsManager().getLeftGamepad().addGamepadCore(\"pp_left_xr_gamepad\", leftXRGamepadCore);\r\n this._myInputManager.getGamepadsManager().getRightGamepad().addGamepadCore(\"pp_right_xr_gamepad\", rightXRGamepadCore);\r\n\r\n let leftKeyboardGamepadCore = new KeyboardGamepadCore(leftHandPose);\r\n let rightKeyboardGamepadCore = new KeyboardGamepadCore(rightHandPose);\r\n\r\n this._myInputManager.getGamepadsManager().getLeftGamepad().addGamepadCore(\"pp_left_keyboard_gamepad\", leftKeyboardGamepadCore);\r\n this._myInputManager.getGamepadsManager().getRightGamepad().addGamepadCore(\"pp_right_keyboard_gamepad\", rightKeyboardGamepadCore);\r\n\r\n let leftClassicGamepadCore = new ClassicGamepadCore(null, leftHandPose);\r\n let rightClassicGamepadCore = new ClassicGamepadCore(null, rightHandPose);\r\n\r\n this._myInputManager.getGamepadsManager().getLeftGamepad().addGamepadCore(\"pp_left_classic_gamepad\", leftClassicGamepadCore);\r\n this._myInputManager.getGamepadsManager().getRightGamepad().addGamepadCore(\"pp_right_classic_gamepad\", rightClassicGamepadCore);\r\n }\r\n\r\n onActivate() {\r\n if (this._myInputManager == null) {\r\n this._myInputManager = new InputManager(this.engine);\r\n this._myInputManager.setTrackedHandPosesEnabled(this._myEnableTrackedHandPoses);\r\n\r\n this._myInputManager.start();\r\n\r\n this._setupMousePrevent();\r\n\r\n this._addGamepadCores();\r\n }\r\n\r\n if (!Globals.hasInputManager(this.engine)) {\r\n this._myInputManager.setActive(true);\r\n\r\n Globals.setInputManager(this._myInputManager, this.engine);\r\n }\r\n\r\n if (!Globals.hasPoseForwardFixed(this.engine)) {\r\n Globals.setPoseForwardFixed(this._myPoseForwardFixed, this.engine);\r\n }\r\n }\r\n\r\n onDeactivate() {\r\n if (this._myInputManager != null) {\r\n this._myInputManager.setActive(false);\r\n\r\n if (Globals.getInputManager(this.engine) == this._myInputManager) {\r\n Globals.removeInputManager(this.engine);\r\n }\r\n }\r\n\r\n if (Globals.isPoseForwardFixed(this.engine) == this._myPoseForwardFixed) {\r\n Globals.removePoseForwardFixed(this.engine);\r\n }\r\n }\r\n\r\n onDestroy() {\r\n if (this._myInputManager != null) {\r\n this._myInputManager.destroy();\r\n }\r\n }\r\n}", "import { Emitter } from \"@wonderlandengine/api\";\r\nimport { Vector2 } from \"../../cauldron/type_definitions/array_type_definitions.js\";\r\nimport { vec2_create } from \"../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Handedness } from \"../cauldron/input_types.js\";\r\nimport { HandPose } from \"../pose/hand_pose.js\";\r\nimport { GamepadAxesEvent, GamepadAxesID, GamepadAxesInfo, GamepadButtonEvent, GamepadButtonID, GamepadButtonInfo, GamepadPulseInfo } from \"./gamepad_buttons.js\";\r\n\r\nexport class GamepadRawButtonData {\r\n public myValue: number = 0;\r\n\r\n public myPressed: boolean = false;\r\n public myTouched: boolean = false;\r\n\r\n public reset(): void {\r\n this.myValue = 0;\r\n\r\n this.myPressed = false;\r\n this.myTouched = false;\r\n }\r\n}\r\n\r\nexport class GamepadRawAxesData {\r\n public myAxes: Vector2 = vec2_create(0);\r\n\r\n public reset(): void {\r\n this.myAxes.vec2_zero();\r\n }\r\n}\r\n\r\nexport abstract class Gamepad {\r\n\r\n private readonly _myHandedness: Handedness;\r\n\r\n // Switched to `object` instead of `Map` for memory optimization reasons since iterating allocates a lot\r\n private readonly _myButtonInfos: Partial> = {};\r\n private readonly _myButtonInfosIDs: GamepadButtonID[] = [];\r\n\r\n private readonly _myAxesInfos: Partial> = {};\r\n private readonly _myAxesInfosIDs: GamepadAxesID[] = [];\r\n\r\n private readonly _myButtonEmitters: Partial>>>> = {};\r\n\r\n private readonly _myAxesEmitters: Partial>>>> = {};\r\n\r\n private readonly _myPulseInfo: GamepadPulseInfo = new GamepadPulseInfo();\r\n\r\n private _myActive: boolean = true;\r\n\r\n // Config\r\n private _myMultiplePressMaxDelay: number = 0.4;\r\n private _myMultipleTouchMaxDelay: number = 0.4;\r\n\r\n private _myDestroyed: boolean = false;\r\n\r\n constructor(handedness: Handedness) {\r\n this._myHandedness = handedness;\r\n\r\n this._myButtonInfos = {};\r\n this._myButtonInfosIDs = [];\r\n for (const key in GamepadButtonID) {\r\n const gamepadButtonID = GamepadButtonID[key as keyof typeof GamepadButtonID];\r\n this._myButtonInfos[gamepadButtonID] = new GamepadButtonInfo(gamepadButtonID, this._myHandedness);\r\n this._myButtonInfosIDs.push(gamepadButtonID);\r\n }\r\n\r\n this._myAxesInfos = {};\r\n this._myAxesInfosIDs = [];\r\n for (const key in GamepadAxesID) {\r\n const gamepadAxesID = GamepadAxesID[key as keyof typeof GamepadAxesID];\r\n this._myAxesInfos[gamepadAxesID] = new GamepadAxesInfo(gamepadAxesID, this._myHandedness);\r\n this._myAxesInfosIDs.push(gamepadAxesID);\r\n }\r\n\r\n for (const key in GamepadButtonID) {\r\n const gamepadButtonID = GamepadButtonID[key as keyof typeof GamepadButtonID];\r\n this._myButtonEmitters[gamepadButtonID] = {};\r\n for (const eventKey in GamepadButtonEvent) {\r\n const gamepadButtonEvent = GamepadButtonEvent[eventKey as keyof typeof GamepadButtonEvent];\r\n this._myButtonEmitters[gamepadButtonID]![gamepadButtonEvent] = new Emitter();\r\n }\r\n }\r\n\r\n for (const key in GamepadAxesID) {\r\n const gamepadAxesID = GamepadAxesID[key as keyof typeof GamepadAxesID];\r\n this._myAxesEmitters[gamepadAxesID] = {};\r\n for (const eventKey in GamepadAxesEvent) {\r\n const gamepadAxesEvent = GamepadAxesEvent[eventKey as keyof typeof GamepadAxesEvent];\r\n this._myAxesEmitters[gamepadAxesID]![gamepadAxesEvent] = new Emitter();\r\n }\r\n }\r\n }\r\n\r\n public setActive(active: boolean): void {\r\n this._setActiveHook(active);\r\n\r\n if (this._myActive != active) {\r\n this._myActive = active;\r\n\r\n if (!this._myActive) {\r\n\r\n // Quick way to trigger callbacks\r\n this._preUpdateButtonInfos();\r\n this._updateButtonInfos();\r\n this._postUpdateButtonInfos(0);\r\n\r\n this._preUpdateAxesInfos();\r\n this._updateAxesInfos();\r\n this._postUpdateAxesInfos();\r\n\r\n this.stopPulse();\r\n this._updatePulse(0);\r\n\r\n // Reset buttons\r\n for (let i = 0; i < this._myButtonInfosIDs.length; i++) {\r\n const id = this._myButtonInfosIDs[i];\r\n const info = this._myButtonInfos[id]!;\r\n info.reset();\r\n }\r\n\r\n for (let i = 0; i < this._myAxesInfosIDs.length; i++) {\r\n const id = this._myAxesInfosIDs[i];\r\n const info = this._myAxesInfos[id]!;\r\n info.reset();\r\n }\r\n }\r\n }\r\n }\r\n\r\n public isActive(): boolean {\r\n return this._myActive;\r\n }\r\n\r\n public getHandedness(): Handedness {\r\n return this._myHandedness;\r\n }\r\n\r\n public getButtonInfo(buttonID: GamepadButtonID): Readonly {\r\n return this._myButtonInfos[buttonID]!;\r\n }\r\n\r\n public registerButtonEventListener(buttonID: GamepadButtonID, buttonEvent: GamepadButtonEvent, id: unknown, listener: (buttonInfo: Readonly, gamepad: Gamepad) => void): void {\r\n this._myButtonEmitters[buttonID]![buttonEvent]!.add(listener, { id: id });\r\n }\r\n\r\n public unregisterButtonEventListener(buttonID: GamepadButtonID, buttonEvent: GamepadButtonEvent, id: unknown): void {\r\n this._myButtonEmitters[buttonID]![buttonEvent]!.remove(id);\r\n }\r\n\r\n public getAxesInfo(axesID: GamepadAxesID): Readonly {\r\n return this._myAxesInfos[axesID]!;\r\n }\r\n\r\n public registerAxesEventListener(axesID: GamepadAxesID, axesEvent: GamepadAxesEvent, id: unknown, listener: (axesInfo: Readonly, gamepad: Gamepad) => void): void {\r\n this._myAxesEmitters[axesID]![axesEvent]!.add(listener, { id: id });\r\n }\r\n\r\n public unregisterAxesEventListener(axesID: GamepadAxesID, axesEvent: GamepadAxesEvent, id: unknown): void {\r\n this._myAxesEmitters[axesID]![axesEvent]!.remove(id);\r\n }\r\n\r\n public pulse(intensity: number, duration: number = 0): void {\r\n this._myPulseInfo.myIntensity = Math.pp_clamp(intensity, 0, 1);\r\n this._myPulseInfo.myDuration = Math.max(duration, 0);\r\n }\r\n\r\n public stopPulse(): void {\r\n this._myPulseInfo.myIntensity = 0;\r\n this._myPulseInfo.myDuration = 0;\r\n }\r\n\r\n public isPulsing(): boolean {\r\n return this._myPulseInfo.myIntensity > 0 || this._myPulseInfo.myDuration > 0;\r\n }\r\n\r\n public getPulseInfo(): Readonly {\r\n return this._myPulseInfo;\r\n }\r\n\r\n public getMultiplePressMaxDelay(): number {\r\n return this._myMultiplePressMaxDelay;\r\n }\r\n\r\n public setMultiplePressMaxDelay(maxDelay: number): void {\r\n this._myMultiplePressMaxDelay = maxDelay;\r\n }\r\n\r\n public getMultipleTouchMaxDelay(): number {\r\n return this._myMultipleTouchMaxDelay;\r\n }\r\n\r\n public setMultipleTouchMaxDelay(maxDelay: number): void {\r\n this._myMultipleTouchMaxDelay = maxDelay;\r\n }\r\n\r\n // Hooks\r\n\r\n public getHandPose(): HandPose | null {\r\n return null;\r\n }\r\n\r\n protected _setActiveHook(active: boolean): void {\r\n\r\n }\r\n\r\n protected _startHook(): void {\r\n\r\n }\r\n\r\n protected _preUpdate(dt: number): void {\r\n\r\n }\r\n\r\n protected _postUpdate(dt: number): void {\r\n\r\n }\r\n\r\n protected _getButtonData(buttonID: GamepadButtonID): Readonly {\r\n return new GamepadRawButtonData();\r\n }\r\n\r\n protected _getAxesData(axesID: GamepadAxesID): Readonly {\r\n return new GamepadRawAxesData();\r\n }\r\n\r\n protected _getHapticActuators(): GamepadHapticActuator[] {\r\n const hapticActuator: GamepadHapticActuator[] = [];\r\n return hapticActuator;\r\n }\r\n\r\n protected _destroyHook(): void {\r\n\r\n }\r\n\r\n // Hooks End\r\n\r\n public start(): void {\r\n this._startHook();\r\n }\r\n\r\n public update(dt: number): void {\r\n if (!this._myActive) return;\r\n\r\n this._preUpdate(dt);\r\n\r\n this._preUpdateButtonInfos();\r\n this._updateButtonInfos();\r\n this._postUpdateButtonInfos(dt);\r\n\r\n this._preUpdateAxesInfos();\r\n this._updateAxesInfos();\r\n this._postUpdateAxesInfos();\r\n\r\n this._updatePulse(dt);\r\n\r\n this._postUpdate(dt);\r\n }\r\n\r\n private _preUpdateButtonInfos(): void {\r\n for (let i = 0; i < this._myButtonInfosIDs.length; i++) {\r\n const id = this._myButtonInfosIDs[i];\r\n const info = this._myButtonInfos[id]!;\r\n info.myPrevIsPressed = info.myPressed;\r\n info.myPrevIsTouched = info.myTouched;\r\n info.myPrevValue = info.myValue;\r\n }\r\n }\r\n\r\n private _updateButtonInfos(): void {\r\n this._updateSingleButtonInfo(GamepadButtonID.SELECT);\r\n this._updateSingleButtonInfo(GamepadButtonID.SQUEEZE);\r\n this._updateSingleButtonInfo(GamepadButtonID.THUMBSTICK);\r\n this._updateSingleButtonInfo(GamepadButtonID.TOP_BUTTON);\r\n this._updateSingleButtonInfo(GamepadButtonID.BOTTOM_BUTTON);\r\n this._updateSingleButtonInfo(GamepadButtonID.LEFT_BUTTON);\r\n this._updateSingleButtonInfo(GamepadButtonID.RIGHT_BUTTON);\r\n this._updateSingleButtonInfo(GamepadButtonID.MENU);\r\n this._updateSingleButtonInfo(GamepadButtonID.TOUCHPAD);\r\n this._updateSingleButtonInfo(GamepadButtonID.THUMB_REST);\r\n }\r\n\r\n private _updateSingleButtonInfo(buttonID: GamepadButtonID): void {\r\n const buttonInfo = this._myButtonInfos[buttonID]!;\r\n const buttonData = this._getButtonData(buttonID);\r\n\r\n buttonInfo.myPressed = buttonData.myPressed;\r\n buttonInfo.myTouched = buttonData.myTouched;\r\n buttonInfo.myValue = buttonData.myValue;\r\n\r\n if (buttonInfo.myPressed) {\r\n buttonInfo.myTouched = true;\r\n\r\n if (buttonInfo.myValue == 0) {\r\n buttonInfo.myValue = 1;\r\n }\r\n }\r\n }\r\n\r\n private _postUpdateButtonInfos(dt: number): void {\r\n for (let i = 0; i < this._myButtonInfosIDs.length; i++) {\r\n const id = this._myButtonInfosIDs[i];\r\n const info = this._myButtonInfos[id]!;\r\n if (info.myPressed) {\r\n info.myTimePressed += dt;\r\n if (!info.myPrevIsPressed) {\r\n info.myMultiplePressStartCount += 1;\r\n\r\n info.myPrevTimeNotPressed = info.myTimeNotPressed;\r\n info.myTimeNotPressed = 0;\r\n }\r\n\r\n if (info.myPrevTimeNotPressed + info.myTimePressed > this._myMultiplePressMaxDelay && info.myMultiplePressEndCount > 0) {\r\n info.myPrevMultiplePressEndCount = info.myMultiplePressEndCount;\r\n info.myMultiplePressEndCount = 0;\r\n }\r\n\r\n if (info.myTimePressed > this._myMultiplePressMaxDelay && info.myMultiplePressStartCount > 0) {\r\n info.myPrevMultiplePressStartCount = info.myMultiplePressStartCount;\r\n info.myMultiplePressStartCount = 0;\r\n }\r\n } else {\r\n info.myTimeNotPressed += dt;\r\n if (info.myPrevIsPressed) {\r\n info.myMultiplePressEndCount += 1;\r\n\r\n info.myPrevTimePressed = info.myTimePressed;\r\n info.myTimePressed = 0;\r\n }\r\n\r\n if (info.myPrevTimePressed + info.myTimeNotPressed > this._myMultiplePressMaxDelay && info.myMultiplePressStartCount > 0) {\r\n info.myPrevMultiplePressStartCount = info.myMultiplePressStartCount;\r\n info.myMultiplePressStartCount = 0;\r\n }\r\n\r\n if (info.myTimeNotPressed > this._myMultiplePressMaxDelay && info.myMultiplePressEndCount > 0) {\r\n info.myPrevMultiplePressEndCount = info.myMultiplePressEndCount;\r\n info.myMultiplePressEndCount = 0;\r\n }\r\n }\r\n\r\n if (info.myTouched) {\r\n info.myTimeTouched += dt;\r\n if (!info.myPrevIsTouched) {\r\n info.myMultipleTouchStartCount += 1;\r\n\r\n info.myPrevTimeNotTouched = info.myTimeNotTouched;\r\n info.myTimeNotTouched = 0;\r\n }\r\n\r\n if (info.myPrevTimeNotTouched + info.myTimeTouched > this._myMultipleTouchMaxDelay && info.myMultipleTouchEndCount > 0) {\r\n info.myPrevMultipleTouchEndCount = info.myMultipleTouchEndCount;\r\n info.myMultipleTouchEndCount = 0;\r\n }\r\n\r\n if (info.myTimeTouched > this._myMultipleTouchMaxDelay && info.myMultipleTouchStartCount > 0) {\r\n info.myPrevMultipleTouchStartCount = info.myMultipleTouchStartCount;\r\n info.myMultipleTouchStartCount = 0;\r\n }\r\n } else {\r\n info.myTimeNotTouched += dt;\r\n if (info.myPrevIsTouched) {\r\n info.myMultipleTouchEndCount += 1;\r\n\r\n info.myPrevTimeTouched = info.myTimeTouched;\r\n info.myTimeTouched = 0;\r\n }\r\n\r\n if (info.myPrevTimeTouched + info.myTimeNotTouched > this._myMultipleTouchMaxDelay && info.myMultipleTouchStartCount > 0) {\r\n info.myPrevMultipleTouchStartCount = info.myMultipleTouchStartCount;\r\n info.myMultipleTouchStartCount = 0;\r\n }\r\n\r\n if (info.myTimeNotTouched > this._myMultipleTouchMaxDelay && info.myMultipleTouchEndCount > 0) {\r\n info.myPrevMultipleTouchEndCount = info.myMultipleTouchEndCount;\r\n info.myMultipleTouchEndCount = 0;\r\n }\r\n }\r\n }\r\n\r\n for (let i = 0; i < this._myButtonInfosIDs.length; i++) {\r\n const id = this._myButtonInfosIDs[i];\r\n const buttonInfo = this._myButtonInfos[id]!;\r\n const buttonEventEmitters = this._myButtonEmitters[id]!;\r\n\r\n // PRESSED\r\n if (buttonInfo.myPressed && !buttonInfo.myPrevIsPressed) {\r\n const emitter = buttonEventEmitters[GamepadButtonEvent.PRESS_START]!;\r\n emitter.notify(buttonInfo, this);\r\n }\r\n\r\n if (!buttonInfo.myPressed && buttonInfo.myPrevIsPressed) {\r\n const emitter = buttonEventEmitters[GamepadButtonEvent.PRESS_END]!;\r\n emitter.notify(buttonInfo, this);\r\n }\r\n\r\n if (buttonInfo.myPressed) {\r\n const emitter = buttonEventEmitters[GamepadButtonEvent.PRESSED]!;\r\n emitter.notify(buttonInfo, this);\r\n } else {\r\n const emitter = buttonEventEmitters[GamepadButtonEvent.NOT_PRESSED]!;\r\n emitter.notify(buttonInfo, this);\r\n }\r\n\r\n // TOUCHED\r\n if (buttonInfo.myTouched && !buttonInfo.myPrevIsTouched) {\r\n const emitter = buttonEventEmitters[GamepadButtonEvent.TOUCH_START]!;\r\n emitter.notify(buttonInfo, this);\r\n }\r\n\r\n if (!buttonInfo.myTouched && buttonInfo.myPrevIsTouched) {\r\n const emitter = buttonEventEmitters[GamepadButtonEvent.TOUCH_END]!;\r\n emitter.notify(buttonInfo, this);\r\n }\r\n\r\n if (buttonInfo.myTouched) {\r\n const emitter = buttonEventEmitters[GamepadButtonEvent.TOUCHED]!;\r\n emitter.notify(buttonInfo, this);\r\n } else {\r\n const emitter = buttonEventEmitters[GamepadButtonEvent.NOT_TOUCHED]!;\r\n emitter.notify(buttonInfo, this);\r\n }\r\n\r\n // VALUE\r\n if (buttonInfo.myValue != buttonInfo.myPrevValue) {\r\n const emitter = buttonEventEmitters[GamepadButtonEvent.VALUE_CHANGED]!;\r\n emitter.notify(buttonInfo, this);\r\n }\r\n\r\n // ALWAYS\r\n const emitter = buttonEventEmitters[GamepadButtonEvent.ALWAYS]!;\r\n emitter.notify(buttonInfo, this);\r\n }\r\n }\r\n\r\n private _preUpdateAxesInfos(): void {\r\n for (let i = 0; i < this._myAxesInfosIDs.length; i++) {\r\n const id = this._myAxesInfosIDs[i];\r\n const info = this._myAxesInfos[id]!;\r\n info.myPrevAxes[0] = info.myAxes[0];\r\n info.myPrevAxes[1] = info.myAxes[1];\r\n }\r\n }\r\n\r\n private _updateAxesInfos(): void {\r\n this._updateSingleAxesInfo(GamepadAxesID.THUMBSTICK);\r\n }\r\n\r\n private _updateSingleAxesInfo(axesID: GamepadAxesID): void {\r\n const axesInfo = this._myAxesInfos[axesID]!;\r\n const axesData = this._getAxesData(axesID);\r\n\r\n axesInfo.myAxes[0] = axesData.myAxes[0];\r\n axesInfo.myAxes[1] = axesData.myAxes[1];\r\n }\r\n\r\n private _postUpdateAxesInfos(): void {\r\n for (const key in GamepadAxesID) {\r\n const gamepadAxesID = GamepadAxesID[key as keyof typeof GamepadAxesID];\r\n const axesInfo = this._myAxesInfos[gamepadAxesID]!;\r\n const axesEventEmitters = this._myAxesEmitters[gamepadAxesID]!;\r\n\r\n // X CHANGED\r\n if (axesInfo.myAxes[0] != axesInfo.myPrevAxes[0]) {\r\n const emitter = axesEventEmitters[GamepadAxesEvent.X_CHANGED]!;\r\n emitter.notify(axesInfo, this);\r\n }\r\n\r\n // Y CHANGED\r\n if (axesInfo.myAxes[1] != axesInfo.myPrevAxes[1]) {\r\n const emitter = axesEventEmitters[GamepadAxesEvent.Y_CHANGED]!;\r\n emitter.notify(axesInfo, this);\r\n }\r\n\r\n // AXES CHANGED\r\n if (axesInfo.myAxes[0] != axesInfo.myPrevAxes[0] ||\r\n axesInfo.myAxes[1] != axesInfo.myPrevAxes[1]) {\r\n const emitter = axesEventEmitters[GamepadAxesEvent.AXES_CHANGED]!;\r\n emitter.notify(axesInfo, this);\r\n }\r\n\r\n // ALWAYS \r\n const emitter = axesEventEmitters[GamepadAxesEvent.ALWAYS]!;\r\n emitter.notify(axesInfo, this);\r\n }\r\n }\r\n\r\n private _updatePulse(dt: number): void {\r\n if (this._myPulseInfo.myDevicePulsing || this._myPulseInfo.myIntensity > 0) {\r\n const hapticActuators = this._getHapticActuators();\r\n if (hapticActuators.length > 0) {\r\n if (this._myPulseInfo.myIntensity > 0) {\r\n for (let i = 0; i < hapticActuators.length; i++) {\r\n const hapticActuator = hapticActuators[i];\r\n\r\n // Duration is managed by this class\r\n hapticActuator.playEffect(\"dual-rumble\", {\r\n startDelay: 0,\r\n duration: Math.max(250, this._myPulseInfo.myDuration * 1000),\r\n weakMagnitude: this._myPulseInfo.myIntensity,\r\n strongMagnitude: this._myPulseInfo.myIntensity\r\n });\r\n }\r\n this._myPulseInfo.myDevicePulsing = true;\r\n } else if (this._myPulseInfo.myDevicePulsing) {\r\n for (let i = 0; i < hapticActuators.length; i++) {\r\n const hapticActuator = hapticActuators[i];\r\n\r\n try {\r\n if (hapticActuator.reset != null) {\r\n hapticActuator.reset();\r\n }\r\n } catch (error) {\r\n // Do nothing\r\n }\r\n }\r\n\r\n this._myPulseInfo.myDevicePulsing = false;\r\n }\r\n } else {\r\n this._myPulseInfo.myDevicePulsing = false;\r\n }\r\n }\r\n\r\n this._myPulseInfo.myDuration -= dt;\r\n if (this._myPulseInfo.myDuration <= 0) {\r\n this._myPulseInfo.myIntensity = 0;\r\n this._myPulseInfo.myDuration = 0;\r\n }\r\n }\r\n\r\n public destroy(): void {\r\n this._myDestroyed = true;\r\n\r\n this.setActive(false);\r\n\r\n this._destroyHook();\r\n }\r\n\r\n public isDestroyed(): boolean {\r\n return this._myDestroyed;\r\n }\r\n}", "import { Vector2 } from \"../../cauldron/type_definitions/array_type_definitions.js\";\r\nimport { vec2_create } from \"../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Handedness } from \"../cauldron/input_types.js\";\r\n\r\nexport enum GamepadButtonID {\r\n /** Trigger */\r\n SELECT = 0,\r\n\r\n /** Grip */\r\n SQUEEZE = 1,\r\n\r\n THUMBSTICK = 2,\r\n\r\n /** B or Y button on oculus quest gamepad, reverts to `TOUCHPAD` button for gamepads that does not support `TOP_BUTTON` */\r\n TOP_BUTTON = 3,\r\n\r\n /** A or X button on oculus quest gamepad */\r\n BOTTOM_BUTTON = 4,\r\n\r\n /** Square button on a playstation gamepad */\r\n LEFT_BUTTON = 5,\r\n\r\n /** Circle button on a playstation gamepad */\r\n RIGHT_BUTTON = 6,\r\n\r\n MENU = 7,\r\n\r\n TOUCHPAD = 8,\r\n\r\n THUMB_REST = 9\r\n}\r\n\r\nexport enum GamepadButtonEvent {\r\n PRESS_START = 0,\r\n PRESS_END = 1,\r\n\r\n /** Every frame that it is pressed */\r\n PRESSED = 2,\r\n\r\n /** Every frame that it is not pressed */\r\n NOT_PRESSED = 3,\r\n\r\n TOUCH_START = 4,\r\n TOUCH_END = 5,\r\n\r\n /** Every frame that it is touched */\r\n TOUCHED = 6,\r\n\r\n /** Every frame that it is not touched */\r\n NOT_TOUCHED = 7,\r\n\r\n VALUE_CHANGED = 8,\r\n\r\n /** Every frame */\r\n ALWAYS = 9\r\n}\r\n\r\nexport enum GamepadAxesID {\r\n THUMBSTICK = 0\r\n}\r\n\r\nexport enum GamepadAxesEvent {\r\n X_CHANGED = 0,\r\n Y_CHANGED = 1,\r\n AXES_CHANGED = 2,\r\n ALWAYS = 3\r\n}\r\n\r\nexport class GamepadButtonInfo {\r\n\r\n public myID: GamepadButtonID;\r\n public myHandedness: Handedness;\r\n\r\n public myPressed: boolean = false;\r\n public myPrevIsPressed: boolean = false;\r\n\r\n public myTouched: boolean = false;\r\n public myPrevIsTouched: boolean = false;\r\n\r\n public myValue: number = 0;\r\n public myPrevValue: number = 0;\r\n\r\n public myTimePressed: number = 0;\r\n public myPrevTimePressed: number = 0;\r\n\r\n public myTimeNotPressed: number = 0;\r\n public myPrevTimeNotPressed: number = 0;\r\n\r\n public myTimeTouched: number = 0;\r\n public myPrevTimeTouched: number = 0;\r\n\r\n public myTimeNotTouched: number = 0;\r\n public myPrevTimeNotTouched: number = 0;\r\n\r\n public myMultiplePressStartCount: number = 0;\r\n public myPrevMultiplePressStartCount: number = 0;\r\n public myMultiplePressEndCount: number = 0;\r\n public myPrevMultiplePressEndCount: number = 0;\r\n\r\n public myMultipleTouchStartCount: number = 0;\r\n public myPrevMultipleTouchStartCount: number = 0;\r\n public myMultipleTouchEndCount: number = 0;\r\n public myPrevMultipleTouchEndCount: number = 0;\r\n\r\n constructor(id: GamepadButtonID, handedness: Handedness) {\r\n this.myID = id;\r\n this.myHandedness = handedness;\r\n }\r\n\r\n public getID(): GamepadButtonID {\r\n return this.myID;\r\n }\r\n\r\n public getHandedness(): Handedness {\r\n return this.myHandedness;\r\n }\r\n\r\n public getValue(): number {\r\n return this.myValue;\r\n }\r\n\r\n public isPressed(): boolean {\r\n return this.myPressed;\r\n }\r\n\r\n public isTouched(): boolean {\r\n return this.myTouched;\r\n }\r\n\r\n public isPressStart(multiplePressCount: number | null = null): boolean {\r\n return (this.myPressed && !this.myPrevIsPressed) && (multiplePressCount == null || this.myMultiplePressStartCount == multiplePressCount);\r\n }\r\n\r\n public isPressEnd(multiplePressCount: number | null = null): boolean {\r\n return (!this.myPressed && this.myPrevIsPressed) && (multiplePressCount == null || this.myMultiplePressEndCount == multiplePressCount);\r\n }\r\n\r\n public isTouchStart(multipleTouchCount: number | null = null): boolean {\r\n return (this.myTouched && !this.myPrevIsTouched) && (multipleTouchCount == null || this.myMultipleTouchStartCount == multipleTouchCount);\r\n }\r\n\r\n public isTouchEnd(multipleTouchCount: number | null = null): boolean {\r\n return (!this.myTouched && this.myPrevIsTouched) && (multipleTouchCount == null || this.myMultipleTouchEndCount == multipleTouchCount);\r\n }\r\n\r\n public reset(): void {\r\n this.myPressed = false;\r\n this.myPrevIsPressed = false;\r\n this.myTouched = false;\r\n this.myPrevIsTouched = false;\r\n this.myValue = 0;\r\n this.myPrevValue = 0;\r\n\r\n this.myTimePressed = 0;\r\n this.myPrevTimePressed = 0;\r\n this.myTimeNotPressed = 0;\r\n this.myPrevTimeNotPressed = 0;\r\n\r\n this.myTimeTouched = 0;\r\n this.myPrevTimeTouched = 0;\r\n this.myTimeNotTouched = 0;\r\n this.myPrevTimeNotTouched = 0;\r\n\r\n this.myMultiplePressStartCount = 0;\r\n this.myPrevMultiplePressStartCount = 0;\r\n this.myMultiplePressEndCount = 0;\r\n this.myPrevMultiplePressEndCount = 0;\r\n\r\n this.myMultipleTouchStartCount = 0;\r\n this.myPrevMultipleTouchStartCount = 0;\r\n this.myMultipleTouchEndCount = 0;\r\n this.myPrevMultipleTouchEndCount = 0;\r\n }\r\n\r\n public clone(): GamepadButtonInfo {\r\n const value = new GamepadButtonInfo(this.myID, this.myHandedness);\r\n\r\n value.myPressed = this.myPressed;\r\n value.myPrevIsPressed = this.myPrevIsPressed;\r\n value.myTouched = this.myTouched;\r\n value.myPrevIsTouched = this.myPrevIsTouched;\r\n value.myValue = this.myValue;\r\n value.myPrevValue = this.myPrevValue;\r\n\r\n value.myTimePressed = this.myTimePressed;\r\n value.myPrevTimePressed = this.myPrevTimePressed;\r\n value.myTimeNotPressed = this.myTimeNotPressed;\r\n value.myPrevTimeNotPressed = this.myPrevTimeNotPressed;\r\n\r\n value.myTimeTouched = this.myTimeTouched;\r\n value.myPrevTimeTouched = this.myPrevTimeTouched;\r\n value.myTimeNotTouched = this.myTimeNotTouched;\r\n value.myPrevTimeNotTouched = this.myPrevTimeNotTouched;\r\n\r\n value.myMultiplePressStartCount = this.myMultiplePressStartCount;\r\n value.myPrevMultiplePressStartCount = this.myPrevMultiplePressStartCount;\r\n value.myMultiplePressEndCount = this.myMultiplePressEndCount;\r\n value.myPrevMultiplePressEndCount = this.myPrevMultiplePressEndCount;\r\n\r\n value.myMultipleTouchStartCount = this.myMultipleTouchStartCount;\r\n value.myPrevMultipleTouchStartCount = this.myPrevMultipleTouchStartCount;\r\n value.myMultipleTouchEndCount = this.myMultipleTouchEndCount;\r\n value.myPrevMultipleTouchEndCount = this.myPrevMultipleTouchEndCount;\r\n\r\n return value;\r\n }\r\n}\r\n\r\nexport class GamepadAxesInfo {\r\n public myID: GamepadAxesID;\r\n\r\n public myHandedness: Handedness;\r\n\r\n /** `myAxes[0]` is X, `myAxes[1]` is Y */\r\n public myAxes = vec2_create(0);\r\n\r\n /** `myPrevAxes[0]` is X, `myPrevAxes[1]` is Y */\r\n public myPrevAxes = vec2_create(0);\r\n\r\n constructor(id: GamepadAxesID, handedness: Handedness) {\r\n this.myID = id;\r\n this.myHandedness = handedness;\r\n }\r\n\r\n public getID(): GamepadAxesID {\r\n return this.myID;\r\n }\r\n\r\n public getAxes(): Readonly {\r\n return this.myAxes;\r\n }\r\n\r\n public getHandedness(): Handedness {\r\n return this.myHandedness;\r\n }\r\n\r\n public reset(): void {\r\n this.myAxes.vec2_zero();\r\n this.myPrevAxes.vec2_zero();\r\n }\r\n\r\n public clone(): GamepadAxesInfo {\r\n const value = new GamepadAxesInfo(this.myID, this.myHandedness);\r\n\r\n value.myAxes.vec2_copy(this.myAxes);\r\n value.myPrevAxes.vec2_copy(this.myPrevAxes);\r\n\r\n return value;\r\n }\r\n}\r\n\r\nexport class GamepadPulseInfo {\r\n\r\n public myIntensity = 0;\r\n public myDuration = 0;\r\n\r\n /** `true` if the gamepad actually sent a request to pulse to the device */\r\n public myDevicePulsing: boolean = false;\r\n\r\n public clone(): GamepadPulseInfo {\r\n const value = new GamepadPulseInfo();\r\n\r\n value.myIntensity = this.myIntensity;\r\n value.myDuration = this.myDuration;\r\n value.myDevicePulsing = this.myDevicePulsing;\r\n\r\n return value;\r\n }\r\n}", "import { GamepadRawAxesData, GamepadRawButtonData } from \"../gamepad.js\";\r\n\r\nexport class GamepadCore {\r\n\r\n constructor(handPose) {\r\n this._myHandPose = handPose;\r\n\r\n this._myManagingHandPose = false;\r\n\r\n this._myActive = true;\r\n this._myStarted = false;\r\n\r\n this._myDestroyed = false;\r\n }\r\n\r\n setActive(active) {\r\n this._setActiveHook(active);\r\n\r\n this._myActive = active;\r\n }\r\n\r\n isActive() {\r\n return this._myActive;\r\n }\r\n\r\n getHandedness() {\r\n return this.getHandPose().getHandedness();\r\n }\r\n\r\n getHandPose() {\r\n return this._myHandPose;\r\n }\r\n\r\n getEngine() {\r\n return this.getHandPose().getEngine();\r\n }\r\n\r\n isGamepadCoreActive() {\r\n return true;\r\n }\r\n\r\n setManageHandPose(manageHandPose) {\r\n this._myManagingHandPose = manageHandPose;\r\n }\r\n\r\n isManagingHandPose() {\r\n return this._myManagingHandPose;\r\n }\r\n\r\n start() {\r\n if (this._myStarted) return;\r\n\r\n this._myStarted = true;\r\n\r\n if (this.getHandPose() && this.isManagingHandPose()) {\r\n this.getHandPose().start();\r\n }\r\n\r\n this._startHook();\r\n\r\n this._myActive = false;\r\n this.setActive(true);\r\n }\r\n\r\n preUpdate(dt) {\r\n if (!this._myActive) return;\r\n\r\n if (this.getHandPose() && this.isManagingHandPose()) {\r\n this.getHandPose().update(dt);\r\n }\r\n\r\n this._preUpdateHook(dt);\r\n }\r\n\r\n postUpdate(dt) {\r\n if (!this._myActive) return;\r\n\r\n this._postUpdateHook(dt);\r\n }\r\n\r\n getButtonData(buttonID) {\r\n return new GamepadRawButtonData();\r\n }\r\n\r\n getAxesData(axesID) {\r\n return new GamepadRawAxesData();\r\n }\r\n\r\n getHapticActuators() {\r\n let hapticActuators = [];\r\n return hapticActuators;\r\n }\r\n\r\n // Hooks\r\n\r\n _setActiveHook(active) {\r\n\r\n }\r\n\r\n _startHook() {\r\n\r\n }\r\n\r\n _preUpdateHook(dt) {\r\n\r\n }\r\n\r\n _postUpdateHook(dt) {\r\n\r\n }\r\n\r\n _destroyHook() {\r\n\r\n }\r\n\r\n // Hooks end\r\n\r\n destroy() {\r\n if (this._myDestroyed) return;\r\n\r\n this._myDestroyed = true;\r\n\r\n this.setActive(false);\r\n\r\n this._destroyHook();\r\n\r\n if (this.isManagingHandPose()) {\r\n this.getHandPose().destroy();\r\n }\r\n }\r\n\r\n isDestroyed() {\r\n return this._myDestroyed;\r\n }\r\n}", "import { Handedness } from \"../../cauldron/input_types.js\";\r\nimport { GamepadRawAxesData, GamepadRawButtonData } from \"../gamepad.js\";\r\nimport { GamepadButtonID } from \"../gamepad_buttons.js\";\r\nimport { GamepadCore } from \"./gamepad_core.js\";\r\n\r\nexport class ClassicGamepadCore extends GamepadCore {\r\n\r\n constructor(gamepadIndex, handPose) {\r\n super(handPose);\r\n\r\n this._myGamepadIndex = gamepadIndex; // null means any active gamepad\r\n\r\n this._myCurrentGamepads = null;\r\n\r\n // Support Variables\r\n this._myButtonData = new GamepadRawButtonData();\r\n this._myAxesData = new GamepadRawAxesData();\r\n this._myHapticActuators = [];\r\n }\r\n\r\n _preUpdateHook(dt) {\r\n this._myCurrentGamepads = navigator.getGamepads();\r\n }\r\n\r\n _setActiveHook(active) {\r\n if (this.isActive() != active) {\r\n if (!active) {\r\n this._myCurrentGamepads = null;\r\n }\r\n }\r\n }\r\n\r\n isGamepadCoreActive() {\r\n let classicGamepad = this._getClassicGamepad();\r\n return this.isActive() && classicGamepad != null && (classicGamepad.connected == null || classicGamepad.connected);\r\n }\r\n\r\n getButtonData(buttonID) {\r\n this._myButtonData.reset();\r\n\r\n let classicGamepad = this._getClassicGamepad();\r\n if (classicGamepad != null && this.isGamepadCoreActive()) {\r\n let button = null;\r\n if (this.getHandedness() == Handedness.LEFT) {\r\n switch (buttonID) {\r\n case GamepadButtonID.SELECT:\r\n button = classicGamepad.buttons[4];\r\n break;\r\n case GamepadButtonID.SQUEEZE:\r\n button = classicGamepad.buttons[6];\r\n break;\r\n case GamepadButtonID.THUMBSTICK:\r\n button = classicGamepad.buttons[10];\r\n break;\r\n case GamepadButtonID.TOP_BUTTON:\r\n button = classicGamepad.buttons[12];\r\n break;\r\n case GamepadButtonID.BOTTOM_BUTTON:\r\n button = classicGamepad.buttons[13];\r\n break;\r\n case GamepadButtonID.LEFT_BUTTON:\r\n button = classicGamepad.buttons[14];\r\n break;\r\n case GamepadButtonID.RIGHT_BUTTON:\r\n button = classicGamepad.buttons[15];\r\n break;\r\n case GamepadButtonID.MENU:\r\n button = classicGamepad.buttons[8];\r\n break;\r\n case GamepadButtonID.TOUCHPAD:\r\n button = null;\r\n break;\r\n case GamepadButtonID.THUMB_REST:\r\n button = null;\r\n break;\r\n }\r\n } else {\r\n switch (buttonID) {\r\n case GamepadButtonID.SELECT:\r\n button = classicGamepad.buttons[5];\r\n break;\r\n case GamepadButtonID.SQUEEZE:\r\n button = classicGamepad.buttons[7];\r\n break;\r\n case GamepadButtonID.THUMBSTICK:\r\n button = classicGamepad.buttons[11];\r\n break;\r\n case GamepadButtonID.TOP_BUTTON:\r\n button = classicGamepad.buttons[3];\r\n break;\r\n case GamepadButtonID.BOTTOM_BUTTON:\r\n button = classicGamepad.buttons[0];\r\n break;\r\n case GamepadButtonID.LEFT_BUTTON:\r\n button = classicGamepad.buttons[2];\r\n break;\r\n case GamepadButtonID.RIGHT_BUTTON:\r\n button = classicGamepad.buttons[1];\r\n break;\r\n case GamepadButtonID.MENU:\r\n button = classicGamepad.buttons[9];\r\n break;\r\n case GamepadButtonID.TOUCHPAD:\r\n button = null;\r\n break;\r\n case GamepadButtonID.THUMB_REST:\r\n button = null;\r\n break;\r\n }\r\n }\r\n\r\n if (button != null) {\r\n this._myButtonData.myPressed = button.pressed;\r\n this._myButtonData.myTouched = button.touched;\r\n this._myButtonData.myValue = button.value;\r\n }\r\n }\r\n\r\n return this._myButtonData;\r\n }\r\n\r\n getAxesData(axesID) {\r\n this._myAxesData.reset();\r\n\r\n let classicGamepad = this._getClassicGamepad();\r\n if (classicGamepad != null && this.isGamepadCoreActive()) {\r\n if (this.getHandedness() == Handedness.LEFT) {\r\n this._myAxesData.myAxes[0] = classicGamepad.axes[0];\r\n this._myAxesData.myAxes[1] = classicGamepad.axes[1];\r\n } else {\r\n this._myAxesData.myAxes[0] = classicGamepad.axes[2];\r\n this._myAxesData.myAxes[1] = classicGamepad.axes[3];\r\n }\r\n\r\n // Y axis is recorded negative when thumbstick is pressed forward for weird reasons\r\n this._myAxesData.myAxes[1] = -this._myAxesData.myAxes[1];\r\n }\r\n\r\n return this._myAxesData;\r\n }\r\n\r\n getHapticActuators() {\r\n this._myHapticActuators.pp_clear();\r\n\r\n let classicGamepad = this._getClassicGamepad();\r\n if (classicGamepad != null && this.isGamepadCoreActive()) {\r\n if (classicGamepad.hapticActuators != null) {\r\n for (let i = 0; i < classicGamepad.hapticActuators.length; i++) {\r\n this._myHapticActuators.push(classicGamepad.hapticActuators[i]);\r\n }\r\n }\r\n\r\n if (classicGamepad.vibrationActuator != null) {\r\n this._myHapticActuators.push(classicGamepad.vibrationActuator);\r\n }\r\n }\r\n\r\n return this._myHapticActuators;\r\n }\r\n\r\n _getClassicGamepad() {\r\n if (this._myCurrentGamepads == null) return null;\r\n\r\n let classicGamepad = null;\r\n\r\n if (this._myGamepadIndex != null) {\r\n if (this._myGamepadIndex < this._myCurrentGamepads.length) {\r\n classicGamepad = this._myCurrentGamepads[this._myGamepadIndex];\r\n }\r\n } else {\r\n for (let i = 0; i < this._myCurrentGamepads.length; i++) {\r\n let gamepad = this._myCurrentGamepads[i];\r\n if (gamepad != null && (gamepad.connected == null || gamepad.connected)) {\r\n classicGamepad = gamepad;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return classicGamepad;\r\n }\r\n}", "import { Globals } from \"../../pp/globals.js\";\r\n\r\nexport let KeyID = {\r\n /** These are when the number is pressed in some way */\r\n Number0: \"0\",\r\n Number1: \"1\",\r\n Number2: \"2\",\r\n Number3: \"3\",\r\n Number4: \"4\",\r\n Number5: \"5\",\r\n Number6: \"6\",\r\n Number7: \"7\",\r\n Number8: \"8\",\r\n Number9: \"9\",\r\n\r\n /** These are just the numbers above the letters on the keyboard */\r\n Digit0: \"Digit0\",\r\n Digit1: \"Digit1\",\r\n Digit2: \"Digit2\",\r\n Digit3: \"Digit3\",\r\n Digit4: \"Digit4\",\r\n Digit5: \"Digit5\",\r\n Digit6: \"Digit6\",\r\n Digit7: \"Digit7\",\r\n Digit8: \"Digit8\",\r\n Digit9: \"Digit9\",\r\n\r\n /** These are just the numbers on the numpad, but works even is num lock is disabled */\r\n Numpad0: \"Numpad0\",\r\n Numpad1: \"Numpad1\",\r\n Numpad2: \"Numpad2\",\r\n Numpad3: \"Numpad3\",\r\n Numpad4: \"Numpad4\",\r\n Numpad5: \"Numpad5\",\r\n Numpad6: \"Numpad6\",\r\n Numpad7: \"Numpad7\",\r\n Numpad8: \"Numpad8\",\r\n Numpad9: \"Numpad9\",\r\n\r\n KeyA: \"KeyA\",\r\n KeyB: \"KeyB\",\r\n KeyC: \"KeyC\",\r\n KeyD: \"KeyD\",\r\n KeyE: \"KeyE\",\r\n KeyF: \"KeyF\",\r\n KeyG: \"KeyG\",\r\n KeyH: \"KeyH\",\r\n KeyI: \"KeyI\",\r\n KeyJ: \"KeyJ\",\r\n KeyK: \"KeyK\",\r\n KeyL: \"KeyL\",\r\n KeyM: \"KeyM\",\r\n KeyN: \"KeyN\",\r\n KeyO: \"KeyO\",\r\n KeyP: \"KeyP\",\r\n KeyQ: \"KeyQ\",\r\n KeyR: \"KeyR\",\r\n KeyS: \"KeyS\",\r\n KeyT: \"KeyT\",\r\n KeyU: \"KeyU\",\r\n KeyV: \"KeyV\",\r\n KeyW: \"KeyW\",\r\n KeyX: \"KeyX\",\r\n KeyY: \"KeyY\",\r\n KeyZ: \"KeyZ\",\r\n\r\n A: \"A\",\r\n B: \"B\",\r\n C: \"C\",\r\n D: \"D\",\r\n E: \"E\",\r\n F: \"F\",\r\n G: \"G\",\r\n H: \"H\",\r\n I: \"I\",\r\n J: \"J\",\r\n K: \"K\",\r\n L: \"L\",\r\n M: \"M\",\r\n N: \"N\",\r\n O: \"O\",\r\n P: \"P\",\r\n Q: \"Q\",\r\n R: \"R\",\r\n S: \"S\",\r\n T: \"T\",\r\n U: \"U\",\r\n V: \"V\",\r\n W: \"W\",\r\n X: \"X\",\r\n Y: \"Y\",\r\n Z: \"Z\",\r\n\r\n a: \"a\",\r\n b: \"b\",\r\n c: \"c\",\r\n d: \"d\",\r\n e: \"e\",\r\n f: \"f\",\r\n g: \"g\",\r\n h: \"h\",\r\n i: \"i\",\r\n j: \"j\",\r\n k: \"k\",\r\n l: \"l\",\r\n m: \"m\",\r\n n: \"n\",\r\n o: \"o\",\r\n p: \"p\",\r\n q: \"q\",\r\n r: \"r\",\r\n s: \"s\",\r\n t: \"t\",\r\n u: \"u\",\r\n v: \"v\",\r\n w: \"w\",\r\n x: \"x\",\r\n y: \"y\",\r\n z: \"z\",\r\n\r\n UP: \"ArrowUp\",\r\n DOWN: \"ArrowDown\",\r\n LEFT: \"ArrowLeft\",\r\n RIGHT: \"ArrowRight\",\r\n\r\n SPACE: \"Space\",\r\n ENTER: \"Enter\",\r\n BACKSPACE: \"Backspace\",\r\n ESC: \"Escape\",\r\n\r\n SHIFT_LEFT: \"ShiftLeft\",\r\n SHIFT_RIGHT: \"ShiftRight\",\r\n CONTROL_LEFT: \"ControlLeft\",\r\n CONTROL_RIGHT: \"ControlRight\",\r\n ALT_LEFT: \"AltLeft\",\r\n ALT_RIGHT: \"AltRight\"\r\n};\r\n\r\nexport class Keyboard {\r\n\r\n constructor(engine = Globals.getMainEngine()) {\r\n this._myEngine = engine;\r\n\r\n this._myKeyInfos = {};\r\n this._myKeyInfosIDs = [];\r\n for (let key in KeyID) {\r\n this.addKey(KeyID[key]);\r\n }\r\n\r\n this._myOnKeyDownEventListener = null;\r\n this._myOnKeyUpEventListener = null;\r\n\r\n this._myActive = true;\r\n\r\n this._myDestroyed = false;\r\n }\r\n\r\n setActive(active) {\r\n if (this._myActive != active) {\r\n this._myActive = active;\r\n\r\n if (this._myActive) {\r\n this._myOnKeyDownEventListener = this._keyDown.bind(this);\r\n window.addEventListener(\"keydown\", this._myOnKeyDownEventListener);\r\n this._myOnKeyUpEventListener = this._keyUp.bind(this);\r\n window.addEventListener(\"keyup\", this._myOnKeyUpEventListener);\r\n } else {\r\n for (let i = 0; i < this._myKeyInfosIDs.length; i++) {\r\n let id = this._myKeyInfosIDs[i];\r\n let keyInfo = this._myKeyInfos[id];\r\n keyInfo.myPressed = false;\r\n keyInfo.myPressStart = false;\r\n keyInfo.myPressEnd = false;\r\n keyInfo.myPressStartToProcess = false;\r\n keyInfo.myPressEndToProcess = false;\r\n }\r\n\r\n window.removeEventListener(\"keydown\", this._myOnKeyDownEventListener);\r\n window.removeEventListener(\"keyup\", this._myOnKeyUpEventListener);\r\n\r\n this._myOnKeyDownEventListener = null;\r\n this._myOnKeyUpEventListener = null;\r\n\r\n }\r\n }\r\n }\r\n\r\n isActive() {\r\n return this._myActive;\r\n }\r\n\r\n isKeyPressed(keyID) {\r\n let pressed = false;\r\n\r\n if (this._myKeyInfos[keyID] != null) {\r\n pressed = this._myKeyInfos[keyID].myPressed;\r\n }\r\n\r\n return pressed;\r\n }\r\n\r\n isKeyPressStart(keyID) {\r\n let pressStart = false;\r\n\r\n if (this._myKeyInfos[keyID] != null) {\r\n pressStart = this._myKeyInfos[keyID].myPressStart;\r\n }\r\n\r\n return pressStart;\r\n }\r\n\r\n isKeyPressEnd(keyID) {\r\n let pressEnd = false;\r\n\r\n if (this._myKeyInfos[keyID] != null) {\r\n pressEnd = this._myKeyInfos[keyID].myPressEnd;\r\n }\r\n\r\n return pressEnd;\r\n }\r\n\r\n addKey(keyID) {\r\n this._myKeyInfos[keyID] = this._createKeyInfo();\r\n this._myKeyInfosIDs.push(keyID);\r\n }\r\n\r\n start() {\r\n this._myActive = false;\r\n this.setActive(true);\r\n }\r\n\r\n update(dt) {\r\n if (!this._myActive) return;\r\n\r\n if (!document.hasFocus()) {\r\n for (let i = 0; i < this._myKeyInfosIDs.length; i++) {\r\n let id = this._myKeyInfosIDs[i];\r\n let keyInfo = this._myKeyInfos[id];\r\n if (keyInfo.myPressed) {\r\n keyInfo.myPressed = false;\r\n keyInfo.myPressEndToProcess = true;\r\n }\r\n }\r\n }\r\n\r\n for (let i = 0; i < this._myKeyInfosIDs.length; i++) {\r\n let id = this._myKeyInfosIDs[i];\r\n let keyInfo = this._myKeyInfos[id];\r\n keyInfo.myPressStart = keyInfo.myPressStartToProcess;\r\n keyInfo.myPressEnd = keyInfo.myPressEndToProcess;\r\n keyInfo.myPressStartToProcess = false;\r\n keyInfo.myPressEndToProcess = false;\r\n }\r\n }\r\n\r\n _keyDown(event) {\r\n if (event.repeat) return;\r\n\r\n this._keyPressedChanged(event.key, true);\r\n if (event.key != event.code) {\r\n this._keyPressedChanged(event.code, true);\r\n }\r\n }\r\n\r\n _keyUp(event) {\r\n this._keyPressedChanged(event.key, false);\r\n if (event.key != event.code) {\r\n this._keyPressedChanged(event.code, false);\r\n }\r\n }\r\n\r\n _keyPressedChanged(keyID, pressed) {\r\n if (this._myKeyInfos[keyID] != null) {\r\n let keyInfo = this._myKeyInfos[keyID];\r\n\r\n if (pressed != keyInfo.myPressed) {\r\n if (pressed) {\r\n keyInfo.myPressed = true;\r\n keyInfo.myPressStartToProcess = true;\r\n } else {\r\n keyInfo.myPressed = false;\r\n keyInfo.myPressEndToProcess = true;\r\n }\r\n }\r\n }\r\n }\r\n\r\n _createKeyInfo() {\r\n return { myPressed: false, myPressStart: false, myPressStartToProcess: false, myPressEnd: false, myPressEndToProcess: false, };\r\n }\r\n\r\n destroy() {\r\n this._myDestroyed = true;\r\n\r\n this.setActive(false);\r\n }\r\n\r\n isDestroyed() {\r\n return this._myDestroyed;\r\n }\r\n}", "import { Globals } from \"../../../pp/globals.js\";\r\nimport { Handedness } from \"../../cauldron/input_types.js\";\r\nimport { KeyID } from \"../../cauldron/keyboard.js\";\r\nimport { GamepadRawAxesData, GamepadRawButtonData } from \"../gamepad.js\";\r\nimport { GamepadButtonID } from \"../gamepad_buttons.js\";\r\nimport { GamepadCore } from \"./gamepad_core.js\";\r\n\r\nexport class KeyboardGamepadCore extends GamepadCore {\r\n\r\n constructor(handPose) {\r\n super(handPose);\r\n\r\n // Support Variables\r\n this._myButtonData = new GamepadRawButtonData();\r\n this._myAxesData = new GamepadRawAxesData();\r\n this._myHapticActuators = [];\r\n }\r\n\r\n isGamepadCoreActive() {\r\n return this.isActive();\r\n }\r\n\r\n getButtonData(buttonID) {\r\n this._myButtonData.reset();\r\n\r\n let keyboard = Globals.getKeyboard(this.getEngine());\r\n\r\n if (this.isGamepadCoreActive()) {\r\n if (this.getHandedness() == Handedness.LEFT) {\r\n switch (buttonID) {\r\n case GamepadButtonID.SELECT:\r\n this._myButtonData.myPressed = keyboard.isKeyPressed(KeyID.KeyE);\r\n break;\r\n case GamepadButtonID.SQUEEZE:\r\n this._myButtonData.myPressed = keyboard.isKeyPressed(KeyID.KeyQ);\r\n break;\r\n case GamepadButtonID.THUMBSTICK:\r\n this._myButtonData.myPressed = keyboard.isKeyPressed(KeyID.KeyR);\r\n break;\r\n case GamepadButtonID.TOP_BUTTON:\r\n this._myButtonData.myPressed = keyboard.isKeyPressed(KeyID.KeyF);\r\n break;\r\n case GamepadButtonID.BOTTOM_BUTTON:\r\n this._myButtonData.myPressed = keyboard.isKeyPressed(KeyID.KeyC);\r\n break;\r\n case GamepadButtonID.LEFT_BUTTON:\r\n this._myButtonData.myPressed = keyboard.isKeyPressed(KeyID.KeyX);\r\n break;\r\n case GamepadButtonID.RIGHT_BUTTON:\r\n this._myButtonData.myPressed = keyboard.isKeyPressed(KeyID.KeyV);\r\n break;\r\n case GamepadButtonID.MENU:\r\n this._myButtonData.myPressed = keyboard.isKeyPressed(KeyID.Digit3);\r\n break;\r\n case GamepadButtonID.TOUCHPAD:\r\n this._myButtonData.myPressed = keyboard.isKeyPressed(KeyID.Digit2);\r\n break;\r\n case GamepadButtonID.THUMB_REST:\r\n this._myButtonData.myPressed = keyboard.isKeyPressed(KeyID.Digit1);\r\n break;\r\n }\r\n } else {\r\n switch (buttonID) {\r\n case GamepadButtonID.SELECT:\r\n this._myButtonData.myPressed = keyboard.isKeyPressed(KeyID.KeyU);\r\n break;\r\n case GamepadButtonID.SQUEEZE:\r\n this._myButtonData.myPressed = keyboard.isKeyPressed(KeyID.KeyO);\r\n break;\r\n case GamepadButtonID.THUMBSTICK:\r\n this._myButtonData.myPressed = keyboard.isKeyPressed(KeyID.KeyY);\r\n break;\r\n case GamepadButtonID.TOP_BUTTON:\r\n this._myButtonData.myPressed = keyboard.isKeyPressed(KeyID.KeyH);\r\n break;\r\n case GamepadButtonID.BOTTOM_BUTTON:\r\n this._myButtonData.myPressed = keyboard.isKeyPressed(KeyID.KeyN);\r\n break;\r\n case GamepadButtonID.LEFT_BUTTON:\r\n this._myButtonData.myPressed = keyboard.isKeyPressed(KeyID.KeyB);\r\n break;\r\n case GamepadButtonID.RIGHT_BUTTON:\r\n this._myButtonData.myPressed = keyboard.isKeyPressed(KeyID.KeyM);\r\n break;\r\n case GamepadButtonID.MENU:\r\n this._myButtonData.myPressed = keyboard.isKeyPressed(KeyID.Digit8);\r\n break;\r\n case GamepadButtonID.TOUCHPAD:\r\n this._myButtonData.myPressed = keyboard.isKeyPressed(KeyID.Digit9);\r\n break;\r\n case GamepadButtonID.THUMB_REST:\r\n this._myButtonData.myPressed = keyboard.isKeyPressed(KeyID.Digit0);\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if (this._myButtonData.myPressed) {\r\n this._myButtonData.myTouched = true;\r\n this._myButtonData.myValue = 1;\r\n }\r\n\r\n return this._myButtonData;\r\n }\r\n\r\n getAxesData(axesID) {\r\n this._myAxesData.reset();\r\n\r\n let keyboard = Globals.getKeyboard(this.getEngine());\r\n\r\n if (this.isGamepadCoreActive()) {\r\n if (this.getHandedness() == Handedness.LEFT) {\r\n if (keyboard.isKeyPressed(KeyID.KeyW)) this._myAxesData.myAxes[1] += 1.0;\r\n if (keyboard.isKeyPressed(KeyID.KeyS)) this._myAxesData.myAxes[1] += -1.0;\r\n if (keyboard.isKeyPressed(KeyID.KeyD)) this._myAxesData.myAxes[0] += 1.0;\r\n if (keyboard.isKeyPressed(KeyID.KeyA)) this._myAxesData.myAxes[0] += -1.0;\r\n } else {\r\n if (keyboard.isKeyPressed(KeyID.KeyI) || keyboard.isKeyPressed(KeyID.UP)) this._myAxesData.myAxes[1] += 1.0;\r\n if (keyboard.isKeyPressed(KeyID.KeyK) || keyboard.isKeyPressed(KeyID.DOWN)) this._myAxesData.myAxes[1] += -1.0;\r\n if (keyboard.isKeyPressed(KeyID.KeyL) || keyboard.isKeyPressed(KeyID.RIGHT)) this._myAxesData.myAxes[0] += 1.0;\r\n if (keyboard.isKeyPressed(KeyID.KeyJ) || keyboard.isKeyPressed(KeyID.LEFT)) this._myAxesData.myAxes[0] += -1.0;\r\n }\r\n }\r\n\r\n return this._myAxesData;\r\n }\r\n\r\n getHapticActuators() {\r\n return this._myHapticActuators;\r\n }\r\n}", "// xr-standard mapping is assumed\r\n\r\nimport { XRUtils } from \"../../../cauldron/utils/xr_utils.js\";\r\nimport { GamepadRawAxesData, GamepadRawButtonData } from \"../gamepad.js\";\r\nimport { GamepadButtonID } from \"../gamepad_buttons.js\";\r\nimport { GamepadCore } from \"./gamepad_core.js\";\r\n\r\nexport class XRGamepadCore extends GamepadCore {\r\n\r\n constructor(handPose) {\r\n super(handPose);\r\n\r\n this._mySelectPressed = false;\r\n this._mySqueezePressed = false;\r\n\r\n this._myXRSessionActive = false;\r\n this._myInputSource = null;\r\n this._myGamepad = null;\r\n\r\n this._mySelectStartEventListener = null;\r\n this._mySelectEndEventListener = null;\r\n this._mySqueezeStartEventListener = null;\r\n this._mySqueezeEndEventListener = null;\r\n\r\n // Support Variables\r\n this._myButtonData = new GamepadRawButtonData();\r\n this._myAxesData = new GamepadRawAxesData();\r\n this._myHapticActuators = [];\r\n }\r\n\r\n isGamepadCoreActive() {\r\n // connected == null is to fix webxr emulator that leaves that field undefined\r\n return this.isActive() && this._myXRSessionActive && this._myGamepad != null && (this._myGamepad.connected == null || this._myGamepad.connected);\r\n }\r\n\r\n _setActiveHook(active) {\r\n if (this.isActive() != active) {\r\n if (active) {\r\n XRUtils.registerSessionStartEndEventListeners(this, this._onXRSessionStart.bind(this), this._onXRSessionEnd.bind(this), true, false, this.getEngine());\r\n } else {\r\n this._mySelectPressed = false;\r\n this._mySqueezePressed = false;\r\n\r\n this._myXRSessionActive = false;\r\n this._myInputSource = null;\r\n this._myGamepad = null;\r\n\r\n XRUtils.getSession(this.getEngine())?.removeEventListener(\"selectstart\", this._mySelectStartEventListener);\r\n XRUtils.getSession(this.getEngine())?.removeEventListener(\"selectend\", this._mySelectEndEventListener);\r\n XRUtils.getSession(this.getEngine())?.removeEventListener(\"squeezestart\", this._mySqueezeStartEventListener);\r\n XRUtils.getSession(this.getEngine())?.removeEventListener(\"squeezeend\", this._mySqueezeEndEventListener);\r\n\r\n XRUtils.unregisterSessionStartEndEventListeners(this, this.getEngine());\r\n\r\n this._mySelectStartEventListener = null;\r\n this._mySelectEndEventListener = null;\r\n this._mySqueezeStartEventListener = null;\r\n this._mySqueezeEndEventListener = null;\r\n }\r\n }\r\n }\r\n\r\n _preUpdateHook(dt) {\r\n let prevInputSource = this._myInputSource;\r\n this._myInputSource = this.getHandPose().getInputSource();\r\n\r\n if (prevInputSource != this._myInputSource) {\r\n this._mySelectPressed = false;\r\n this._mySqueezePressed = false;\r\n }\r\n\r\n if (this._myInputSource != null) {\r\n this._myGamepad = this._myInputSource.gamepad;\r\n } else {\r\n this._myGamepad = null;\r\n }\r\n }\r\n\r\n getButtonData(buttonID) {\r\n this._myButtonData.reset();\r\n\r\n if (this.isGamepadCoreActive()) {\r\n let button = null;\r\n\r\n switch (buttonID) {\r\n case GamepadButtonID.SELECT:\r\n button = this._myGamepad.buttons[0];\r\n break;\r\n case GamepadButtonID.SQUEEZE:\r\n button = this._myGamepad.buttons[1];\r\n break;\r\n case GamepadButtonID.THUMBSTICK:\r\n button = this._myGamepad.buttons[3];\r\n break;\r\n case GamepadButtonID.TOP_BUTTON:\r\n button = this._myGamepad.buttons[5];\r\n break;\r\n case GamepadButtonID.BOTTOM_BUTTON:\r\n button = this._myGamepad.buttons[4];\r\n break;\r\n case GamepadButtonID.LEFT_BUTTON:\r\n button = null;\r\n break;\r\n case GamepadButtonID.RIGHT_BUTTON:\r\n button = null;\r\n break;\r\n case GamepadButtonID.MENU:\r\n {\r\n const inputSourceProfiles = this._myInputSource.profiles;\r\n if (inputSourceProfiles.includes(\"oculus-touch-v3\") || inputSourceProfiles.includes(\"meta-quest-touch-pro\")) {\r\n button = this._myGamepad.buttons[this._myGamepad.buttons.length - 1];\r\n }\r\n\r\n break;\r\n }\r\n case GamepadButtonID.TOUCHPAD:\r\n button = this._myGamepad.buttons[2];\r\n break;\r\n case GamepadButtonID.THUMB_REST:\r\n button = this._myGamepad.buttons[6];\r\n break;\r\n }\r\n\r\n if (button != null) {\r\n this._myButtonData.myPressed = button.pressed;\r\n this._myButtonData.myTouched = button.touched;\r\n this._myButtonData.myValue = button.value;\r\n }\r\n }\r\n\r\n return this._myButtonData;\r\n }\r\n\r\n getAxesData(axesID) {\r\n this._myAxesData.reset();\r\n\r\n if (this.isGamepadCoreActive()) {\r\n let internalAxes = this._myGamepad.axes;\r\n if (internalAxes.length == 4) {\r\n // In this case it could be both touch axes or thumbstick axes, that depends on the gamepad\r\n // to support both I simply choose the absolute max value (unused axes will always be 0)\r\n\r\n // X\r\n if (Math.abs(internalAxes[0]) > Math.abs(internalAxes[2])) {\r\n this._myAxesData.myAxes[0] = internalAxes[0];\r\n } else {\r\n this._myAxesData.myAxes[0] = internalAxes[2];\r\n }\r\n\r\n // Y\r\n if (Math.abs(internalAxes[1]) > Math.abs(internalAxes[3])) {\r\n this._myAxesData.myAxes[1] = internalAxes[1];\r\n } else {\r\n this._myAxesData.myAxes[1] = internalAxes[3];\r\n }\r\n\r\n } else if (internalAxes.length == 2) {\r\n this._myAxesData.myAxes[0] = internalAxes[0];\r\n this._myAxesData.myAxes[1] = internalAxes[1];\r\n }\r\n\r\n // Y axis is recorded negative when thumbstick is pressed forward for weird reasons\r\n this._myAxesData.myAxes[1] = -this._myAxesData.myAxes[1];\r\n }\r\n\r\n return this._myAxesData;\r\n }\r\n\r\n getHapticActuators() {\r\n this._myHapticActuators.pp_clear();\r\n\r\n if (this.isGamepadCoreActive()) {\r\n if (this._myGamepad.hapticActuators != null) {\r\n for (let i = 0; i < this._myGamepad.hapticActuators.length; i++) {\r\n this._myHapticActuators.push(this._myGamepad.hapticActuators[i]);\r\n }\r\n }\r\n\r\n if (this._myGamepad.vibrationActuator != null) {\r\n this._myHapticActuators.push(this._myGamepad.vibrationActuator);\r\n }\r\n }\r\n\r\n return this._myHapticActuators;\r\n }\r\n\r\n // This is to be more compatible\r\n _getSpecialButtonPressed(buttonID) {\r\n let pressed = false;\r\n\r\n if (this.isGamepadCoreActive()) {\r\n if (buttonID == GamepadButtonID.SELECT) {\r\n pressed = this._mySelectPressed;\r\n } else if (buttonID == GamepadButtonID.SQUEEZE) {\r\n pressed = this._mySqueezePressed;\r\n }\r\n }\r\n\r\n return pressed;\r\n }\r\n\r\n _onXRSessionStart(session) {\r\n this._mySelectStartEventListener = this._selectStart.bind(this);\r\n this._mySelectEndEventListener = this._selectEnd.bind(this);\r\n this._mySqueezeStartEventListener = this._squeezeStart.bind(this);\r\n this._mySqueezeEndEventListener = this._squeezeEnd.bind(this);\r\n\r\n session.addEventListener(\"selectstart\", this._mySelectStartEventListener);\r\n session.addEventListener(\"selectend\", this._mySelectEndEventListener);\r\n\r\n session.addEventListener(\"squeezestart\", this._mySqueezeStartEventListener);\r\n session.addEventListener(\"squeezeend\", this._mySqueezeEndEventListener);\r\n\r\n this._myXRSessionActive = true;\r\n }\r\n\r\n _onXRSessionEnd(session) {\r\n this._mySelectStartEventListener = null;\r\n this._mySelectEndEventListener = null;\r\n this._mySqueezeStartEventListener = null;\r\n this._mySqueezeEndEventListener = null;\r\n\r\n this._mySelectPressed = false;\r\n this._mySqueezePressed = false;\r\n\r\n this._myXRSessionActive = false;\r\n }\r\n\r\n // Select and Squeeze are managed this way to be more compatible\r\n _selectStart(event) {\r\n if (this._myInputSource != null && this._myInputSource == event.inputSource) {\r\n this._mySelectPressed = true;\r\n }\r\n }\r\n\r\n _selectEnd(event) {\r\n if (this._myInputSource != null && this._myInputSource == event.inputSource) {\r\n this._mySelectPressed = false;\r\n }\r\n }\r\n\r\n _squeezeStart(event) {\r\n if (this._myInputSource != null && this._myInputSource == event.inputSource) {\r\n this._mySqueezePressed = true;\r\n }\r\n }\r\n\r\n _squeezeEnd(event) {\r\n if (this._myInputSource != null && this._myInputSource == event.inputSource) {\r\n this._mySqueezePressed = false;\r\n }\r\n }\r\n}", "import { Emitter, WonderlandEngine } from \"@wonderlandengine/api\";\r\nimport { Globals } from \"../../pp/globals.js\";\r\nimport { GamepadsManager } from \"../gamepad/cauldron/gamepads_manager.js\";\r\nimport { BasePoseParams } from \"../pose/base_pose.js\";\r\nimport { HandPose, HandPoseParams } from \"../pose/hand_pose.js\";\r\nimport { HandRayPose, HandRayPoseParams } from \"../pose/hand_ray_pose.js\";\r\nimport { HeadPose } from \"../pose/head_pose.js\";\r\nimport { TrackedHandPose, TrackedHandPoseParams } from \"../pose/tracked_hand_pose.js\";\r\nimport { Handedness } from \"./input_types.js\";\r\nimport { Keyboard } from \"./keyboard.js\";\r\nimport { Mouse } from \"./mouse.js\";\r\n\r\nexport class InputManager {\r\n\r\n private readonly _myMouse: Mouse;\r\n private readonly _myKeyboard: Keyboard;\r\n\r\n private readonly _myHeadPose: HeadPose;\r\n\r\n private readonly _myHandPoses: Record;\r\n private readonly _myHandRayPoses: Record;\r\n\r\n private readonly _myTrackedHandPoses: Record;\r\n\r\n private readonly _myGamepadsManager: GamepadsManager = new GamepadsManager();\r\n\r\n private _myStarted: boolean = false;\r\n private _myActive: boolean = false;\r\n\r\n private _myTrackedHandPosesEnabled: boolean = true;\r\n private _myTrackedHandPosesStarted: boolean = false;\r\n\r\n private readonly _myPreUpdateEmitter: Emitter<[number, InputManager]> = new Emitter();\r\n private readonly _myPostUpdateEmitter: Emitter<[number, InputManager]> = new Emitter();\r\n\r\n private readonly _myEngine: Readonly;\r\n\r\n private _myDestroyed: boolean = false;\r\n\r\n constructor(engine: Readonly = Globals.getMainEngine()!) {\r\n this._myEngine = engine;\r\n\r\n this._myMouse = new Mouse(this._myEngine as any);\r\n this._myKeyboard = new Keyboard(this._myEngine as any);\r\n\r\n this._myHeadPose = new HeadPose(new BasePoseParams(this._myEngine as any));\r\n this._myHeadPose.setReferenceObject(Globals.getPlayerObjects(this._myEngine)!.myReferenceSpace);\r\n this._myHeadPose.setForwardFixed(Globals.isPoseForwardFixed(this._myEngine));\r\n\r\n this._myHandPoses = {\r\n [Handedness.LEFT]: new HandPose(Handedness.LEFT, new HandPoseParams(this._myEngine)),\r\n [Handedness.RIGHT]: new HandPose(Handedness.RIGHT, new HandPoseParams(this._myEngine))\r\n };\r\n this._myHandPoses[Handedness.LEFT].setReferenceObject(Globals.getPlayerObjects(this._myEngine)!.myReferenceSpace);\r\n this._myHandPoses[Handedness.RIGHT].setReferenceObject(Globals.getPlayerObjects(this._myEngine)!.myReferenceSpace);\r\n this._myHandPoses[Handedness.LEFT].setForwardFixed(Globals.isPoseForwardFixed(this._myEngine));\r\n this._myHandPoses[Handedness.RIGHT].setForwardFixed(Globals.isPoseForwardFixed(this._myEngine));\r\n\r\n this._myHandRayPoses = {\r\n [Handedness.LEFT]: new HandRayPose(Handedness.LEFT, new HandRayPoseParams(this._myEngine)),\r\n [Handedness.RIGHT]: new HandRayPose(Handedness.RIGHT, new HandRayPoseParams(this._myEngine))\r\n };\r\n this._myHandRayPoses[Handedness.LEFT].setReferenceObject(Globals.getPlayerObjects(this._myEngine)!.myReferenceSpace);\r\n this._myHandRayPoses[Handedness.RIGHT].setReferenceObject(Globals.getPlayerObjects(this._myEngine)!.myReferenceSpace);\r\n this._myHandRayPoses[Handedness.LEFT].setForwardFixed(Globals.isPoseForwardFixed(this._myEngine));\r\n this._myHandRayPoses[Handedness.RIGHT].setForwardFixed(Globals.isPoseForwardFixed(this._myEngine));\r\n\r\n this._myTrackedHandPoses = {\r\n [Handedness.LEFT]: new TrackedHandPose(Handedness.LEFT, new TrackedHandPoseParams(true, this._myEngine as any)),\r\n [Handedness.RIGHT]: new TrackedHandPose(Handedness.RIGHT, new TrackedHandPoseParams(true, this._myEngine as any))\r\n };\r\n this._myTrackedHandPoses[Handedness.LEFT].setReferenceObject(Globals.getPlayerObjects(this._myEngine)!.myReferenceSpace);\r\n this._myTrackedHandPoses[Handedness.RIGHT].setReferenceObject(Globals.getPlayerObjects(this._myEngine)!.myReferenceSpace);\r\n this._myTrackedHandPoses[Handedness.LEFT].setForwardFixed(Globals.isPoseForwardFixed(this._myEngine));\r\n this._myTrackedHandPoses[Handedness.RIGHT].setForwardFixed(Globals.isPoseForwardFixed(this._myEngine));\r\n }\r\n\r\n public setActive(active: boolean): void {\r\n this._myActive = active;\r\n\r\n this._myMouse.setActive(active);\r\n this._myKeyboard.setActive(active);\r\n\r\n this._myHeadPose.setActive(active);\r\n\r\n for (const rawHandedness in this._myHandPoses) {\r\n const handedness = rawHandedness as Handedness;\r\n this._myHandPoses[handedness].setActive(active);\r\n }\r\n\r\n for (const rawHandedness in this._myHandRayPoses) {\r\n const handedness = rawHandedness as Handedness;\r\n this._myHandRayPoses[handedness].setActive(active);\r\n }\r\n\r\n for (const rawHandedness in this._myTrackedHandPoses) {\r\n const handedness = rawHandedness as Handedness;\r\n this._myTrackedHandPoses[handedness].setActive(active);\r\n }\r\n\r\n this._myGamepadsManager.setActive(active);\r\n }\r\n\r\n public isActive(): boolean {\r\n return this._myActive;\r\n }\r\n\r\n public start(): void {\r\n this._myMouse.start();\r\n this._myKeyboard.start();\r\n\r\n this._myHeadPose.setReferenceObject(Globals.getPlayerObjects(this._myEngine)!.myReferenceSpace);\r\n this._myHeadPose.setForwardFixed(Globals.isPoseForwardFixed(this._myEngine));\r\n this._myHeadPose.start();\r\n\r\n for (const rawHandedness in this._myHandPoses) {\r\n const handedness = rawHandedness as Handedness;\r\n this._myHandPoses[handedness].setReferenceObject(Globals.getPlayerObjects(this._myEngine)!.myReferenceSpace);\r\n this._myHandPoses[handedness].setForwardFixed(Globals.isPoseForwardFixed(this._myEngine));\r\n this._myHandPoses[handedness].start();\r\n }\r\n\r\n for (const rawHandedness in this._myHandRayPoses) {\r\n const handedness = rawHandedness as Handedness;\r\n this._myHandRayPoses[handedness].setReferenceObject(Globals.getPlayerObjects(this._myEngine)!.myReferenceSpace);\r\n this._myHandRayPoses[handedness].setForwardFixed(Globals.isPoseForwardFixed(this._myEngine));\r\n this._myHandRayPoses[handedness].start();\r\n }\r\n\r\n if (this._myTrackedHandPosesEnabled) {\r\n this._startTrackedHandPoses();\r\n }\r\n\r\n this._myGamepadsManager.start();\r\n\r\n this._myStarted = true;\r\n\r\n const currentActive = this._myActive;\r\n this._myActive = !this._myActive;\r\n this.setActive(currentActive);\r\n }\r\n\r\n public update(dt: number): void {\r\n if (!this._myActive) return;\r\n\r\n this._myPreUpdateEmitter.notify(dt, this);\r\n\r\n this._myMouse.update(dt);\r\n this._myKeyboard.update(dt);\r\n\r\n this._myHeadPose.setReferenceObject(Globals.getPlayerObjects(this._myEngine)!.myReferenceSpace);\r\n this._myHeadPose.setForwardFixed(Globals.isPoseForwardFixed(this._myEngine));\r\n this._myHeadPose.update(dt);\r\n\r\n for (const rawHandedness in this._myHandPoses) {\r\n const handedness = rawHandedness as Handedness;\r\n this._myHandPoses[handedness].setReferenceObject(Globals.getPlayerObjects(this._myEngine)!.myReferenceSpace);\r\n this._myHandPoses[handedness].setForwardFixed(Globals.isPoseForwardFixed(this._myEngine));\r\n this._myHandPoses[handedness].update(dt);\r\n }\r\n\r\n\r\n for (const rawHandedness in this._myHandRayPoses) {\r\n const handedness = rawHandedness as Handedness;\r\n this._myHandRayPoses[handedness].setReferenceObject(Globals.getPlayerObjects(this._myEngine)!.myReferenceSpace);\r\n this._myHandRayPoses[handedness].setForwardFixed(Globals.isPoseForwardFixed(this._myEngine));\r\n this._myHandRayPoses[handedness].update(dt);\r\n }\r\n\r\n this._updateTrackedHandPoses(dt);\r\n\r\n this._myGamepadsManager.update(dt);\r\n\r\n this._myPostUpdateEmitter.notify(dt, this);\r\n }\r\n\r\n public getMouse(): Mouse {\r\n return this._myMouse;\r\n }\r\n\r\n public getKeyboard(): Keyboard {\r\n return this._myKeyboard;\r\n }\r\n\r\n public getGamepadsManager(): GamepadsManager {\r\n return this._myGamepadsManager;\r\n }\r\n\r\n public getHeadPose(): HeadPose {\r\n return this._myHeadPose;\r\n }\r\n\r\n public getLeftHandPose(): HandPose {\r\n return this._myHandPoses[Handedness.LEFT];\r\n }\r\n\r\n public getRightHandPose(): HandPose {\r\n return this._myHandPoses[Handedness.RIGHT];\r\n }\r\n\r\n public getHandPose(handedness: Handedness): HandPose {\r\n return this._myHandPoses[handedness];\r\n }\r\n\r\n public getHandPoses(): Record {\r\n return this._myHandPoses;\r\n }\r\n\r\n public getLeftHandRayPose(): HandPose {\r\n return this._myHandRayPoses[Handedness.LEFT];\r\n }\r\n\r\n public getRightHandRayPose(): HandPose {\r\n return this._myHandRayPoses[Handedness.RIGHT];\r\n }\r\n\r\n public getHandRayPose(handedness: Handedness): HandPose {\r\n return this._myHandRayPoses[handedness];\r\n }\r\n\r\n public getHandRayPoses(): Record {\r\n return this._myHandRayPoses;\r\n }\r\n\r\n public getLeftTrackedHandPose(): TrackedHandPose {\r\n return this._myTrackedHandPoses[Handedness.LEFT];\r\n }\r\n\r\n public getRightTrackedHandPose(): TrackedHandPose {\r\n return this._myTrackedHandPoses[Handedness.RIGHT];\r\n }\r\n\r\n public getTrackedHandPose(handedness: Handedness): TrackedHandPose {\r\n return this._myTrackedHandPoses[handedness];\r\n }\r\n\r\n public getTrackedHandPoses(): Record {\r\n return this._myTrackedHandPoses;\r\n }\r\n\r\n public areTrackedHandPosesEnabled(): boolean {\r\n return this._myTrackedHandPosesEnabled;\r\n }\r\n\r\n public setTrackedHandPosesEnabled(enabled: boolean): void {\r\n this._myTrackedHandPosesEnabled = enabled;\r\n\r\n if (this._myStarted && this._myTrackedHandPosesEnabled) {\r\n this._startTrackedHandPoses();\r\n }\r\n }\r\n\r\n public registerPreUpdateCallback(id: unknown, callback: (dt: number, inputManager: InputManager) => void): void {\r\n this._myPreUpdateEmitter.add(callback, { id: id });\r\n }\r\n\r\n public unregisterPreUpdateCallback(id: unknown): void {\r\n this._myPreUpdateEmitter.remove(id);\r\n }\r\n\r\n public registerPostUpdateCallback(id: unknown, callback: (dt: number, inputManager: InputManager) => void): void {\r\n this._myPostUpdateEmitter.add(callback, { id: id });\r\n }\r\n\r\n public unregisterPostUpdateCallback(id: unknown): void {\r\n this._myPostUpdateEmitter.remove(id);\r\n }\r\n\r\n private _startTrackedHandPoses(): void {\r\n if (!this._myTrackedHandPosesStarted) {\r\n for (const rawHandedness in this._myTrackedHandPoses) {\r\n const handedness = rawHandedness as Handedness;\r\n this._myTrackedHandPoses[handedness].setReferenceObject(Globals.getPlayerObjects(this._myEngine)!.myReferenceSpace);\r\n this._myTrackedHandPoses[handedness].setForwardFixed(Globals.isPoseForwardFixed(this._myEngine));\r\n this._myTrackedHandPoses[handedness].start();\r\n\r\n if (this._myStarted) {\r\n this._myTrackedHandPoses[handedness].setActive(this._myActive);\r\n }\r\n }\r\n\r\n this._myTrackedHandPosesStarted = true;\r\n }\r\n }\r\n\r\n private _updateTrackedHandPoses(dt: number): void {\r\n if (this._myTrackedHandPosesEnabled && this._myTrackedHandPosesStarted) {\r\n for (const rawHandedness in this._myTrackedHandPoses) {\r\n const handedness = rawHandedness as Handedness;\r\n this._myTrackedHandPoses[handedness].setReferenceObject(Globals.getPlayerObjects(this._myEngine)!.myReferenceSpace);\r\n this._myTrackedHandPoses[handedness].setForwardFixed(Globals.isPoseForwardFixed(this._myEngine));\r\n this._myTrackedHandPoses[handedness].update(dt);\r\n }\r\n }\r\n }\r\n\r\n public destroy(): void {\r\n this._myDestroyed = true;\r\n\r\n this.setActive(false);\r\n\r\n this._myMouse.destroy();\r\n this._myKeyboard.destroy();\r\n\r\n this._myHeadPose.destroy();\r\n\r\n for (const rawHandedness in this._myHandPoses) {\r\n const handedness = rawHandedness as Handedness;\r\n this._myHandPoses[handedness].destroy();\r\n }\r\n\r\n for (const rawHandedness in this._myHandRayPoses) {\r\n const handedness = rawHandedness as Handedness;\r\n this._myHandRayPoses[handedness].destroy();\r\n }\r\n\r\n for (const rawHandedness in this._myTrackedHandPoses) {\r\n const handedness = rawHandedness as Handedness;\r\n this._myTrackedHandPoses[handedness].destroy();\r\n }\r\n\r\n this._myGamepadsManager.destroy();\r\n }\r\n\r\n public isDestroyed(): boolean {\r\n return this._myDestroyed;\r\n }\r\n}", "import { Handedness } from \"../cauldron/input_types.js\";\r\nimport { HandPose } from \"../pose/hand_pose.js\";\r\nimport { Gamepad, GamepadRawAxesData, GamepadRawButtonData } from \"./gamepad.js\";\r\nimport { GamepadAxesID, GamepadButtonID } from \"./gamepad_buttons.js\";\r\nimport { GamepadCore } from \"./gamepad_cores/gamepad_core.js\";\r\n\r\nexport class UniversalGamepad extends Gamepad {\r\n\r\n // Switched to `object` instead of `Map` for memory optimization reasons since iterating allocates a lot\r\n private _myGamepadCores: Record = {};\r\n private _myGamepadCoresIDs: string[] = [];\r\n\r\n private _myStarted = false;\r\n\r\n // Support Variables\r\n private readonly _myButtonData = new GamepadRawButtonData();\r\n private readonly _myAxesData = new GamepadRawAxesData();\r\n private readonly _myHapticActuators: GamepadHapticActuator[] = [];\r\n\r\n constructor(handedness: Handedness) {\r\n super(handedness);\r\n }\r\n\r\n public addGamepadCore(id: string, gamepadCore: GamepadCore): void {\r\n if (gamepadCore.getHandedness() == this.getHandedness()) {\r\n this._myGamepadCores[id] = gamepadCore;\r\n this._myGamepadCoresIDs.pp_pushUnique(id);\r\n\r\n if (this._myStarted) {\r\n gamepadCore.start();\r\n gamepadCore.setActive(this.isActive());\r\n }\r\n }\r\n }\r\n\r\n public getGamepadCore(id: string): GamepadCore {\r\n return this._myGamepadCores[id];\r\n }\r\n\r\n public removeGamepadCore(id: string): void {\r\n const gamepadCore = this._myGamepadCores[id];\r\n if (gamepadCore != null) {\r\n delete this._myGamepadCores[id];\r\n this._myGamepadCoresIDs.pp_removeEqual(id);\r\n }\r\n }\r\n\r\n public removeAllGamepadCores(): void {\r\n this._myGamepadCores = {};\r\n this._myGamepadCoresIDs = [];\r\n }\r\n\r\n public override getHandPose(): HandPose {\r\n let handPose = null;\r\n\r\n for (let i = 0; i < this._myGamepadCoresIDs.length; i++) {\r\n const id = this._myGamepadCoresIDs[i];\r\n const core = this._myGamepadCores[id];\r\n if (core.isGamepadCoreActive()) {\r\n const currentCoreHandPose = core.getHandPose();\r\n if (handPose == null || (currentCoreHandPose != null && currentCoreHandPose.isValid())) {\r\n handPose = currentCoreHandPose;\r\n }\r\n }\r\n\r\n if (handPose != null && handPose.isValid()) {\r\n break;\r\n }\r\n }\r\n\r\n return handPose;\r\n }\r\n\r\n protected override _setActiveHook(active: boolean): void {\r\n for (let i = 0; i < this._myGamepadCoresIDs.length; i++) {\r\n const id = this._myGamepadCoresIDs[i];\r\n const core = this._myGamepadCores[id];\r\n core.setActive(active);\r\n }\r\n }\r\n\r\n protected override _startHook(): void {\r\n for (let i = 0; i < this._myGamepadCoresIDs.length; i++) {\r\n const id = this._myGamepadCoresIDs[i];\r\n const core = this._myGamepadCores[id];\r\n core.start();\r\n core.setActive(this.isActive());\r\n }\r\n\r\n this._myStarted = true;\r\n }\r\n\r\n protected override _preUpdate(dt: number): void {\r\n for (let i = 0; i < this._myGamepadCoresIDs.length; i++) {\r\n const id = this._myGamepadCoresIDs[i];\r\n const core = this._myGamepadCores[id];\r\n core.preUpdate(dt);\r\n }\r\n }\r\n\r\n protected override _postUpdate(dt: number): void {\r\n for (let i = 0; i < this._myGamepadCoresIDs.length; i++) {\r\n const id = this._myGamepadCoresIDs[i];\r\n const core = this._myGamepadCores[id];\r\n core.postUpdate(dt);\r\n }\r\n }\r\n\r\n protected override _getButtonData(buttonID: GamepadButtonID): GamepadRawButtonData {\r\n this._myButtonData.reset();\r\n\r\n for (let i = 0; i < this._myGamepadCoresIDs.length; i++) {\r\n const id = this._myGamepadCoresIDs[i];\r\n const core = this._myGamepadCores[id];\r\n if (core.isGamepadCoreActive()) {\r\n const coreButtonData = core.getButtonData(buttonID);\r\n this._myButtonData.myPressed = this._myButtonData.myPressed || coreButtonData.myPressed;\r\n this._myButtonData.myTouched = this._myButtonData.myTouched || coreButtonData.myTouched;\r\n if (Math.abs(coreButtonData.myValue) > Math.abs(this._myButtonData.myValue)) {\r\n this._myButtonData.myValue = coreButtonData.myValue;\r\n }\r\n }\r\n }\r\n\r\n return this._myButtonData;\r\n }\r\n\r\n protected override _getAxesData(axesID: GamepadAxesID): GamepadRawAxesData {\r\n this._myAxesData.reset();\r\n\r\n for (let i = 0; i < this._myGamepadCoresIDs.length; i++) {\r\n const id = this._myGamepadCoresIDs[i];\r\n const core = this._myGamepadCores[id];\r\n if (core.isGamepadCoreActive()) {\r\n const coreAxesData = core.getAxesData(axesID);\r\n\r\n if (Math.abs(coreAxesData.myAxes[0]) > Math.abs(this._myAxesData.myAxes[0])) {\r\n this._myAxesData.myAxes[0] = coreAxesData.myAxes[0];\r\n }\r\n\r\n if (Math.abs(coreAxesData.myAxes[1]) > Math.abs(this._myAxesData.myAxes[1])) {\r\n this._myAxesData.myAxes[1] = coreAxesData.myAxes[1];\r\n }\r\n }\r\n }\r\n\r\n return this._myAxesData;\r\n }\r\n\r\n protected override _getHapticActuators(): GamepadHapticActuator[] {\r\n this._myHapticActuators.pp_clear();\r\n\r\n for (let i = 0; i < this._myGamepadCoresIDs.length; i++) {\r\n const id = this._myGamepadCoresIDs[i];\r\n const core = this._myGamepadCores[id];\r\n if (core.isGamepadCoreActive()) {\r\n const coreHapticActuators = core.getHapticActuators();\r\n for (let j = 0; j < coreHapticActuators.length; j++) {\r\n this._myHapticActuators.push(coreHapticActuators[j]);\r\n }\r\n }\r\n }\r\n\r\n return this._myHapticActuators;\r\n }\r\n\r\n protected override _destroyHook(): void {\r\n for (let i = 0; i < this._myGamepadCoresIDs.length; i++) {\r\n const id = this._myGamepadCoresIDs[i];\r\n const core = this._myGamepadCores[id];\r\n core.destroy();\r\n }\r\n }\r\n}", "import { Handedness } from \"../../cauldron/input_types.js\";\r\nimport { Gamepad } from \"../gamepad.js\";\r\nimport { UniversalGamepad } from \"../universal_gamepad.js\";\r\n\r\nexport class GamepadsManager {\r\n\r\n private readonly _myUniversalGamepads: Record;\r\n\r\n private _myActive: boolean = true;\r\n private _myDestroyed: boolean = false;\r\n\r\n constructor() {\r\n this._myUniversalGamepads = {\r\n [Handedness.LEFT]: new UniversalGamepad(Handedness.LEFT),\r\n [Handedness.RIGHT]: new UniversalGamepad(Handedness.RIGHT)\r\n };\r\n\r\n this._myDestroyed = false;\r\n }\r\n\r\n public setActive(active: boolean): void {\r\n this._myActive = active;\r\n\r\n for (const rawHandedness in this._myUniversalGamepads) {\r\n const handedness = rawHandedness as Handedness;\r\n this._myUniversalGamepads[handedness].setActive(active);\r\n }\r\n }\r\n\r\n public isActive(): boolean {\r\n return this._myActive;\r\n }\r\n\r\n public start(): void {\r\n for (const rawHandedness in this._myUniversalGamepads) {\r\n const handedness = rawHandedness as Handedness;\r\n this._myUniversalGamepads[handedness].start();\r\n }\r\n }\r\n\r\n public update(dt: number): void {\r\n if (!this._myActive) return;\r\n\r\n for (const rawHandedness in this._myUniversalGamepads) {\r\n const handedness = rawHandedness as Handedness;\r\n this._myUniversalGamepads[handedness].update(dt);\r\n }\r\n }\r\n\r\n public getGamepad(handedness: Handedness): Gamepad {\r\n return this._myUniversalGamepads[handedness];\r\n }\r\n\r\n public getGamepads(): Record {\r\n return this._myUniversalGamepads;\r\n }\r\n\r\n public getLeftGamepad(): Gamepad {\r\n return this._myUniversalGamepads[Handedness.LEFT];\r\n }\r\n\r\n public getRightGamepad(): Gamepad {\r\n return this._myUniversalGamepads[Handedness.RIGHT];\r\n }\r\n\r\n public getUniversalGamepad(handedness: Handedness): UniversalGamepad {\r\n return this._myUniversalGamepads[handedness];\r\n }\r\n\r\n public getUniversalGamepads(): Record {\r\n return this._myUniversalGamepads;\r\n }\r\n\r\n public getLeftUniversalGamepad(): UniversalGamepad {\r\n return this._myUniversalGamepads[Handedness.LEFT];\r\n }\r\n\r\n public getRightUniversalGamepad(): UniversalGamepad {\r\n return this._myUniversalGamepads[Handedness.RIGHT];\r\n }\r\n\r\n public destroy(): void {\r\n this._myDestroyed = true;\r\n\r\n this.setActive(false);\r\n\r\n for (const rawHandedness in this._myUniversalGamepads) {\r\n const handedness = rawHandedness as Handedness;\r\n this._myUniversalGamepads[handedness].destroy();\r\n }\r\n }\r\n\r\n public isDestroyed(): boolean {\r\n return this._myDestroyed;\r\n }\r\n}", "import { Emitter } from \"@wonderlandengine/api\";\r\nimport { XRUtils } from \"../../cauldron/utils/xr_utils.js\";\r\nimport { mat4_create, quat2_create, quat_create, vec3_create } from \"../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Globals } from \"../../pp/globals.js\";\r\n\r\nexport class BasePoseParams {\r\n\r\n constructor(engine = Globals.getMainEngine()) {\r\n this.myReferenceObject = null;\r\n this.myForwardFixed = true;\r\n this.myUpdateOnViewReset = false;\r\n this.myForceEmulatedVelocities = false;\r\n\r\n this.myEngine = engine;\r\n }\r\n}\r\n\r\n// BasePose transform is local by default (as if the parent/reference object was the identity transform)\r\n// You can use setReferenceObject if you want the BasePose to return the transform in world space \r\nexport class BasePose {\r\n\r\n constructor(basePoseParams = new BasePoseParams()) {\r\n this._myForwardFixed = basePoseParams.myForwardFixed;\r\n this._myForceEmulatedVelocities = basePoseParams.myForceEmulatedVelocities;\r\n this._myUpdateOnViewReset = basePoseParams.myUpdateOnViewReset;\r\n\r\n this._myReferenceObject = basePoseParams.myReferenceObject;\r\n\r\n this._myEngine = basePoseParams.myEngine;\r\n\r\n this._myPosition = vec3_create();\r\n this._myRotationQuat = quat_create();\r\n\r\n this._myPrevPosition = vec3_create();\r\n this._myPrevRotationQuat = quat_create();\r\n\r\n this._myLinearVelocity = vec3_create();\r\n this._myAngularVelocityRadians = vec3_create();\r\n\r\n this._myActive = true;\r\n\r\n this._myValid = false;\r\n this._myLinearVelocityEmulated = true;\r\n this._myAngularVelocityEmulated = true;\r\n\r\n this._myPrePoseUpdatedEventEmitter = new Emitter(); // Signature: listener(dt, pose, manualUpdate)\r\n this._myPoseUpdatedEmitter = new Emitter(); // Signature: listener(dt, pose, manualUpdate)\r\n this._myPostPoseUpdatedEventEmitter = new Emitter(); // Signature: listener(dt, pose, manualUpdate)\r\n\r\n this._myViewResetEventListener = null;\r\n\r\n this._myDestroyed = false;\r\n }\r\n\r\n getEngine() {\r\n return this._myEngine;\r\n }\r\n\r\n setActive(active) {\r\n if (this._myActive != active) {\r\n if (active) {\r\n XRUtils.registerSessionStartEndEventListeners(this, this._onXRSessionStart.bind(this), this._onXRSessionEnd.bind(this), true, true, this._myEngine);\r\n } else {\r\n this._myPosition.vec3_zero();\r\n this._myRotationQuat.quat_identity();\r\n\r\n this._myPrevPosition.vec3_zero();\r\n this._myPrevRotationQuat.quat_identity();\r\n\r\n this._myLinearVelocity.vec3_zero();\r\n this._myAngularVelocityRadians.vec3_zero();\r\n\r\n this._myValid = false;\r\n\r\n this._myLinearVelocityEmulated = true;\r\n this._myAngularVelocityEmulated = true;\r\n\r\n if (this._myViewResetEventListener != null) {\r\n XRUtils.getReferenceSpace(this._myEngine)?.removeEventListener?.(\"reset\", this._myViewResetEventListener);\r\n }\r\n\r\n this._myViewResetEventListener = null;\r\n\r\n XRUtils.unregisterSessionStartEndEventListeners(this, this._myEngine);\r\n }\r\n }\r\n\r\n this._setActiveHook(active);\r\n\r\n this._myActive = active;\r\n }\r\n\r\n isActive() {\r\n return this._myActive;\r\n }\r\n\r\n // If the reference object is set, the transform will be converted using it as a parent,\r\n // otherwise the transform will be local, as if the parent/reference object was the identity transform\r\n setReferenceObject(referenceObject) {\r\n this._myReferenceObject = referenceObject;\r\n }\r\n\r\n getReferenceObject() {\r\n return this._myReferenceObject;\r\n }\r\n\r\n setForwardFixed(forwardFixed) {\r\n this._myForwardFixed = forwardFixed;\r\n }\r\n\r\n isForwardFixed() {\r\n return this._myForwardFixed;\r\n }\r\n\r\n setForceEmulatedVelocities(forceEmulatedVelocities) {\r\n this._myForceEmulatedVelocities = forceEmulatedVelocities;\r\n }\r\n\r\n isForceEmulatedVelocities() {\r\n return this._myForceEmulatedVelocities;\r\n }\r\n\r\n setUpdateOnViewReset(updateOnViewReset) {\r\n this._myUpdateOnViewReset = updateOnViewReset;\r\n }\r\n\r\n isUpdateOnViewReset() {\r\n return this._myUpdateOnViewReset;\r\n }\r\n\r\n getReferenceSpace() {\r\n return XRUtils.getReferenceSpace(this._myEngine);\r\n }\r\n\r\n getPosition(out = vec3_create(), referenceObjectOverride = undefined) {\r\n // Implemented outside class definition\r\n }\r\n\r\n getRotation(out = vec3_create(), referenceObjectOverride = undefined) {\r\n return this.getRotationDegrees(out, referenceObjectOverride);\r\n }\r\n\r\n getRotationDegrees(out = vec3_create(), referenceObjectOverride = undefined) {\r\n // Implemented outside class definition\r\n }\r\n\r\n getRotationRadians(out = vec3_create(), referenceObjectOverride = undefined) {\r\n // Implemented outside class definition\r\n }\r\n\r\n getRotationQuat(out = quat_create(), referenceObjectOverride = undefined) {\r\n // Implemented outside class definition\r\n }\r\n\r\n getTransform(out = mat4_create(), referenceObjectOverride = undefined) {\r\n return this.getTransformMatrix(out, referenceObjectOverride);\r\n }\r\n\r\n getTransformMatrix(out = mat4_create(), referenceObjectOverride = undefined) {\r\n // Implemented outside class definition\r\n }\r\n\r\n /**\r\n * TS type inference helper\r\n * \r\n * @param {any} referenceObjectOverride\r\n * @return {any}\r\n */\r\n getTransformQuat(out = quat2_create(), referenceObjectOverride = undefined) {\r\n // Implemented outside class definition\r\n }\r\n\r\n getLinearVelocity(out = vec3_create(), referenceObjectOverride = undefined) {\r\n // Implemented outside class definition\r\n }\r\n\r\n getAngularVelocity(out = vec3_create(), referenceObjectOverride = undefined) {\r\n return this.getAngularVelocityDegrees(out, referenceObjectOverride);\r\n }\r\n\r\n getAngularVelocityDegrees(out = vec3_create(), referenceObjectOverride = undefined) {\r\n // Implemented outside class definition\r\n }\r\n\r\n getAngularVelocityRadians(out = vec3_create(), referenceObjectOverride = undefined) {\r\n // Implemented outside class definition\r\n }\r\n\r\n isValid() {\r\n return this._myValid;\r\n }\r\n\r\n isLinearVelocityEmulated() {\r\n return this._myLinearVelocityEmulated;\r\n }\r\n\r\n isAngularVelocityEmulated() {\r\n return this._myAngularVelocityEmulated;\r\n }\r\n\r\n registerPrePoseUpdatedEventListener(id, listener) {\r\n this._myPrePoseUpdatedEventEmitter.add(listener, { id: id });\r\n }\r\n\r\n unregisterPrePoseUpdatedEventListener(id) {\r\n this._myPrePoseUpdatedEventEmitter.remove(id);\r\n }\r\n\r\n registerPoseUpdatedEventListener(id, listener) {\r\n this._myPoseUpdatedEmitter.add(listener, { id: id });\r\n }\r\n\r\n unregisterPoseUpdatedEventListener(id) {\r\n this._myPoseUpdatedEmitter.remove(id);\r\n }\r\n\r\n registerPostPoseUpdatedEventListener(id, listener) {\r\n this._myPostPoseUpdatedEventEmitter.add(listener, { id: id });\r\n }\r\n\r\n unregisterPostPoseUpdatedEventListener(id) {\r\n this._myPostPoseUpdatedEventEmitter.remove(id);\r\n }\r\n\r\n start() {\r\n this._myActive = false;\r\n this.setActive(true);\r\n }\r\n\r\n update(dt) {\r\n if (!this._myActive) return;\r\n\r\n this._update(dt, true, false);\r\n }\r\n\r\n // Hooks\r\n\r\n _isReadyToGetPose() {\r\n return true;\r\n }\r\n\r\n _getPose(xrFrame) {\r\n return null;\r\n }\r\n\r\n _preUpdate(dt, updateVelocity, manualUpdate) {\r\n\r\n }\r\n\r\n _postUpdate(dt, updateVelocity, manualUpdate, xrPose) {\r\n\r\n }\r\n\r\n _onXRSessionStartHook(manualCall, session) {\r\n\r\n }\r\n\r\n _onXRSessionEndHook() {\r\n\r\n }\r\n\r\n _onViewResetHook() {\r\n\r\n }\r\n\r\n _setActiveHook(active) {\r\n\r\n }\r\n\r\n _destroyHook() {\r\n\r\n }\r\n\r\n // Hooks End\r\n\r\n _update(dt, updateVelocity, manualUpdate) {\r\n this._preUpdate(dt, updateVelocity, manualUpdate);\r\n\r\n this._myPrevPosition.vec3_copy(this._myPosition);\r\n this._myPrevRotationQuat.quat_copy(this._myRotationQuat);\r\n\r\n let xrFrame = XRUtils.getFrame(this._myEngine);\r\n if (xrFrame && this._isReadyToGetPose()) {\r\n let xrPose = null;\r\n try {\r\n xrPose = this._getPose(xrFrame);\r\n } catch (error) {\r\n // Not handled, pose will be null\r\n }\r\n\r\n if (xrPose) {\r\n this._myPosition[0] = xrPose.transform.position.x;\r\n this._myPosition[1] = xrPose.transform.position.y;\r\n this._myPosition[2] = xrPose.transform.position.z;\r\n\r\n this._myRotationQuat[0] = xrPose.transform.orientation.x;\r\n this._myRotationQuat[1] = xrPose.transform.orientation.y;\r\n this._myRotationQuat[2] = xrPose.transform.orientation.z;\r\n this._myRotationQuat[3] = xrPose.transform.orientation.w;\r\n this._myRotationQuat.quat_normalize(this._myRotationQuat);\r\n\r\n if (updateVelocity) {\r\n if (xrPose.linearVelocity && !this._myForceEmulatedVelocities) {\r\n this._myLinearVelocity[0] = xrPose.linearVelocity.x;\r\n this._myLinearVelocity[1] = xrPose.linearVelocity.y;\r\n this._myLinearVelocity[2] = xrPose.linearVelocity.z;\r\n\r\n this._myLinearVelocityEmulated = false;\r\n } else {\r\n this._computeEmulatedLinearVelocity(dt);\r\n\r\n this._myLinearVelocityEmulated = true;\r\n }\r\n\r\n if (xrPose.angularVelocity && !this._myForceEmulatedVelocities) {\r\n this._myAngularVelocityRadians[0] = xrPose.angularVelocity.x;\r\n this._myAngularVelocityRadians[1] = xrPose.angularVelocity.y;\r\n this._myAngularVelocityRadians[2] = xrPose.angularVelocity.z;\r\n\r\n this._myAngularVelocityEmulated = false;\r\n } else {\r\n this._computeEmulatedAngularVelocity(dt);\r\n\r\n this._myAngularVelocityEmulated = true;\r\n }\r\n }\r\n\r\n this._myValid = true;\r\n } else {\r\n // Keep previous position and rotation but reset velocity because reasons\r\n\r\n if (updateVelocity) {\r\n this._myLinearVelocity[0] = 0;\r\n this._myLinearVelocity[1] = 0;\r\n this._myLinearVelocity[2] = 0;\r\n\r\n this._myAngularVelocityRadians[0] = 0;\r\n this._myAngularVelocityRadians[1] = 0;\r\n this._myAngularVelocityRadians[2] = 0;\r\n }\r\n\r\n this._myValid = false;\r\n this._myLinearVelocityEmulated = true;\r\n this._myAngularVelocityEmulated = true;\r\n }\r\n\r\n this._postUpdate(dt, updateVelocity, manualUpdate, xrPose);\r\n } else {\r\n // Keep previous position and rotation but reset velocity because reasons\r\n\r\n if (updateVelocity) {\r\n this._myLinearVelocity[0] = 0;\r\n this._myLinearVelocity[1] = 0;\r\n this._myLinearVelocity[2] = 0;\r\n\r\n this._myAngularVelocityRadians[0] = 0;\r\n this._myAngularVelocityRadians[1] = 0;\r\n this._myAngularVelocityRadians[2] = 0;\r\n }\r\n\r\n this._myValid = false;\r\n this._myLinearVelocityEmulated = true;\r\n this._myAngularVelocityEmulated = true;\r\n\r\n this._postUpdate(dt, updateVelocity, manualUpdate, null);\r\n }\r\n\r\n // This is not a pre update event, it's a pre pose updated, which can be used to guarantee a bit of order if you want something\r\n // to update before the stuff that updates on pose updated\r\n this._myPrePoseUpdatedEventEmitter.notify(dt, this, manualUpdate);\r\n this._myPoseUpdatedEmitter.notify(dt, this, manualUpdate);\r\n this._myPostPoseUpdatedEventEmitter.notify(dt, this, manualUpdate);\r\n }\r\n\r\n _computeEmulatedLinearVelocity(dt) {\r\n if (dt > 0) {\r\n this._myPosition.vec3_sub(this._myPrevPosition, this._myLinearVelocity);\r\n this._myLinearVelocity.vec3_scale(1 / dt, this._myLinearVelocity);\r\n } else {\r\n this._myLinearVelocity[0] = 0;\r\n this._myLinearVelocity[1] = 0;\r\n this._myLinearVelocity[2] = 0;\r\n }\r\n }\r\n\r\n _onXRSessionStart(manualCall, session) {\r\n let referenceSpace = XRUtils.getReferenceSpace(this._myEngine);\r\n\r\n if (referenceSpace.addEventListener != null) {\r\n this._myViewResetEventListener = this._onViewReset.bind(this);\r\n referenceSpace.addEventListener(\"reset\", this._myViewResetEventListener);\r\n }\r\n\r\n this._onXRSessionStartHook(manualCall, session);\r\n }\r\n\r\n _onXRSessionEnd() {\r\n this._onXRSessionEndHook();\r\n\r\n this._myViewResetEventListener = null;\r\n }\r\n\r\n _onViewReset() {\r\n if (this._myUpdateOnViewReset) {\r\n this._update(0, false, true);\r\n }\r\n\r\n this._onViewResetHook();\r\n }\r\n\r\n _computeEmulatedAngularVelocity() {\r\n // Implemented outside class definition\r\n }\r\n\r\n destroy() {\r\n this._myDestroyed = true;\r\n\r\n this.setActive(false);\r\n\r\n this._destroyHook();\r\n }\r\n\r\n isDestroyed() {\r\n return this._myDestroyed;\r\n }\r\n}\r\n\r\n\r\n\r\n// IMPLEMENTATION\r\n\r\nBasePose.prototype.getPosition = function () {\r\n let transform = mat4_create();\r\n return function getPosition(out = vec3_create(), referenceObjectOverride = undefined) {\r\n let referenceObject = referenceObjectOverride === undefined ? this._myReferenceObject : referenceObjectOverride;\r\n\r\n out.vec3_copy(this._myPosition);\r\n\r\n if (referenceObject == null) {\r\n return out;\r\n }\r\n\r\n return out.vec3_convertPositionToWorld(referenceObject.pp_getTransform(transform), out);\r\n };\r\n}();\r\n\r\nBasePose.prototype.getRotationDegrees = function () {\r\n let rotationQuat = quat_create();\r\n return function getRotationDegrees(out = vec3_create(), referenceObjectOverride = undefined) {\r\n return this.getRotationQuat(rotationQuat, referenceObjectOverride).quat_toDegrees(out);\r\n };\r\n}();\r\n\r\nBasePose.prototype.getRotationRadians = function () {\r\n let rotationQuat = quat_create();\r\n return function getRotationRadians(out = vec3_create(), referenceObjectOverride = undefined) {\r\n return this.getRotationQuat(rotationQuat, referenceObjectOverride).quat_toRadians(out);\r\n };\r\n}();\r\n\r\nBasePose.prototype.getRotationQuat = function () {\r\n let playerRotationQuat = quat_create();\r\n let up = vec3_create();\r\n return function getRotationQuat(out = quat_create(), referenceObjectOverride = undefined) {\r\n let referenceObject = referenceObjectOverride === undefined ? this._myReferenceObject : referenceObjectOverride;\r\n\r\n out.quat_copy(this._myRotationQuat);\r\n\r\n if (this._myForwardFixed) {\r\n out.quat_rotateAxisRadians(Math.PI, out.quat_getUp(up), out);\r\n }\r\n\r\n if (referenceObject == null) {\r\n return out;\r\n }\r\n\r\n return out.quat_toWorld(referenceObject.pp_getRotationQuat(playerRotationQuat), out);\r\n };\r\n}();\r\n\r\nBasePose.prototype.getTransformMatrix = function () {\r\n let transformQuat = quat2_create();\r\n return function getTransformMatrix(out = mat4_create(), referenceObjectOverride = undefined) {\r\n return this.getTransformQuat(transformQuat, referenceObjectOverride).quat2_toMatrix(out);\r\n };\r\n}();\r\n\r\nBasePose.prototype.getTransformQuat = function () {\r\n let rotationQuat = quat_create();\r\n let playerTransformQuat = quat2_create();\r\n return function getTransformQuat(out = quat2_create(), referenceObjectOverride = undefined) {\r\n let referenceObject = referenceObjectOverride === undefined ? this._myReferenceObject : referenceObjectOverride;\r\n\r\n out.quat2_identity();\r\n out.quat2_setPositionRotationQuat(this._myPosition, this.getRotationQuat(rotationQuat, referenceObjectOverride));\r\n\r\n if (referenceObject == null) {\r\n return out;\r\n }\r\n\r\n return out.quat_toWorld(referenceObject.pp_getTransformQuat(playerTransformQuat), out);\r\n };\r\n}();\r\n\r\nBasePose.prototype.getLinearVelocity = function () {\r\n let transform = mat4_create();\r\n return function getLinearVelocity(out = vec3_create(), referenceObjectOverride = undefined) {\r\n let referenceObject = referenceObjectOverride === undefined ? this._myReferenceObject : referenceObjectOverride;\r\n\r\n out.vec3_copy(this._myLinearVelocity);\r\n\r\n if (referenceObject == null) {\r\n return out;\r\n }\r\n\r\n return out.vec3_convertDirectionToWorld(referenceObject.pp_getTransform(transform), out);\r\n };\r\n}();\r\n\r\nBasePose.prototype.getAngularVelocityDegrees = function () {\r\n let velocityRadians = vec3_create();\r\n return function getAngularVelocityDegrees(out = vec3_create(), referenceObjectOverride = undefined) {\r\n return this.getAngularVelocityRadians(velocityRadians, referenceObjectOverride).vec3_toDegrees(out);\r\n };\r\n}();\r\n\r\nBasePose.prototype.getAngularVelocityRadians = function () {\r\n let transform = mat4_create();\r\n return function getAngularVelocityRadians(out = vec3_create(), referenceObjectOverride = undefined) {\r\n let referenceObject = referenceObjectOverride === undefined ? this._myReferenceObject : referenceObjectOverride;\r\n\r\n out.vec3_copy(this._myAngularVelocityRadians);\r\n\r\n if (referenceObject == null) {\r\n return out;\r\n }\r\n\r\n return out.vec3_convertDirectionToWorld(referenceObject.pp_getTransform(transform), out);\r\n };\r\n}();\r\n\r\nBasePose.prototype._computeEmulatedAngularVelocity = function () {\r\n let rotationRadians = vec3_create();\r\n let prevRotationRadians = vec3_create();\r\n return function _computeEmulatedAngularVelocity(dt) {\r\n if (dt > 0) {\r\n rotationRadians = this._myRotationQuat.quat_toRadians(rotationRadians);\r\n prevRotationRadians = this._myPrevRotationQuat.quat_toRadians(prevRotationRadians);\r\n rotationRadians.vec3_sub(prevRotationRadians, this._myAngularVelocityRadians);\r\n this._myAngularVelocityRadians.vec3_scale(1 / dt, this._myAngularVelocityRadians);\r\n } else {\r\n this._myAngularVelocityRadians[0] = 0;\r\n this._myAngularVelocityRadians[1] = 0;\r\n this._myAngularVelocityRadians[2] = 0;\r\n }\r\n };\r\n}();", "import { WonderlandEngine } from \"@wonderlandengine/api\";\r\nimport { XRUtils } from \"../../cauldron/utils/xr_utils.js\";\r\nimport { Globals } from \"../../pp/globals.js\";\r\nimport { Handedness, HandednessIndex, InputSourceType, TrackedHandJointID, TrackedHandJointIDIndex } from \"./input_types.js\";\r\n\r\nexport function getHandednessByString(string: string): Handedness | null {\r\n let handedness = null;\r\n\r\n switch (string) {\r\n case Handedness.LEFT:\r\n handedness = Handedness.LEFT;\r\n break;\r\n case Handedness.RIGHT:\r\n handedness = Handedness.RIGHT;\r\n break;\r\n }\r\n\r\n return handedness;\r\n}\r\n\r\nexport function getHandednessByIndex(index: number): Handedness | null {\r\n let handedness = null;\r\n\r\n switch (index) {\r\n case HandednessIndex.LEFT:\r\n handedness = Handedness.LEFT;\r\n break;\r\n case HandednessIndex.RIGHT:\r\n handedness = Handedness.RIGHT;\r\n break;\r\n }\r\n\r\n return handedness;\r\n}\r\n\r\nexport function getInputSource(handedness: Handedness, inputSourceType: InputSourceType | null = null, engine: WonderlandEngine = Globals.getMainEngine()!): XRInputSource | null {\r\n let inputSource = null;\r\n\r\n const xrSession = XRUtils.getSession(engine);\r\n if (xrSession != null && xrSession.inputSources != null) {\r\n for (let i = 0; i < xrSession.inputSources.length; i++) {\r\n const input = xrSession.inputSources[i];\r\n\r\n const correctType = (inputSourceType == null) || (inputSourceType == InputSourceType.GAMEPAD && !input.hand) || (inputSourceType == InputSourceType.TRACKED_HAND && input.hand);\r\n if (correctType && input.handedness == handedness) {\r\n inputSource = input;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return inputSource;\r\n}\r\n\r\nexport function getInputSourceTypeByHandedness(handedness: Handedness, engine: WonderlandEngine = Globals.getMainEngine()!): InputSourceType | null {\r\n const inputSource = InputUtils.getInputSource(handedness, undefined, engine);\r\n\r\n return inputSource != null ? InputUtils.getInputSourceType(inputSource) : null;\r\n}\r\n\r\nexport function getInputSourceType(inputSource: XRInputSource): InputSourceType {\r\n let inputSourceType = null;\r\n\r\n if (inputSource.hand) {\r\n inputSourceType = InputSourceType.TRACKED_HAND;\r\n } else {\r\n inputSourceType = InputSourceType.GAMEPAD;\r\n }\r\n\r\n return inputSourceType;\r\n}\r\n\r\nexport function getOppositeHandedness(handedness: Handedness): Handedness {\r\n let oppositeHandedness = null;\r\n\r\n switch (handedness) {\r\n case Handedness.LEFT:\r\n oppositeHandedness = Handedness.RIGHT;\r\n break;\r\n case Handedness.RIGHT:\r\n oppositeHandedness = Handedness.LEFT;\r\n break;\r\n }\r\n\r\n return oppositeHandedness;\r\n}\r\n\r\nexport function getJointIDByIndex(index: number): TrackedHandJointID | null {\r\n let jointID = null;\r\n\r\n let jointIDKey = null;\r\n for (const jointIDIndexKey in TrackedHandJointIDIndex) {\r\n if (TrackedHandJointIDIndex[jointIDIndexKey as keyof typeof TrackedHandJointIDIndex] == index) {\r\n jointIDKey = jointIDIndexKey;\r\n break;\r\n }\r\n }\r\n\r\n if (jointIDKey != null) {\r\n jointID = TrackedHandJointID[jointIDKey as keyof typeof TrackedHandJointID];\r\n }\r\n\r\n return jointID;\r\n}\r\n\r\nexport const InputUtils = {\r\n getHandednessByString,\r\n getHandednessByIndex,\r\n getInputSource,\r\n getInputSourceTypeByHandedness,\r\n getInputSourceType,\r\n getOppositeHandedness,\r\n getJointIDByIndex\r\n} as const;", "import { Timer } from \"../../cauldron/cauldron/timer.js\";\r\nimport { XRUtils } from \"../../cauldron/utils/xr_utils.js\";\r\nimport { quat_create, vec3_create } from \"../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Handedness, InputSourceType } from \"../cauldron/input_types.js\";\r\nimport { InputUtils } from \"../cauldron/input_utils.js\";\r\nimport { BasePose, BasePoseParams } from \"./base_pose.js\";\r\n\r\nexport class HandPoseParams extends BasePoseParams {\r\n\r\n constructor(engine) {\r\n super(engine);\r\n\r\n this.myFixTrackedHandRotation = true;\r\n\r\n /**\r\n * This can be used to make it so that when you put down the gamepads and tracked hands would be picked, \r\n * the gamepads will still being used (if they exists) for a bit more before switching to hands (if they are still the best option)\r\n */\r\n this.mySwitchToTrackedHandDelayEnabled = false;\r\n\r\n this.mySwitchToTrackedHandDelay = 0;\r\n\r\n /**\r\n * Sadly, it can happen that when the game switches to hand tracking and we want to use the gamepad, the gamepad is \r\n * not available in the tracked sources for a few frames\r\n * \r\n * This make it so that, if the gamepad becomes available during this amount of frames, \r\n * it will be picked, otherwise it will switch to whatever input source is available at the moment\r\n * \r\n * In the meantime the input source will be `null` and not the tracked hand, to avoid activating tracked hand features,\r\n * just for a small amount of frames\r\n */\r\n this._mySwitchToTrackedHandDelayKeepCheckingForGamepadFrameCounter = 3;\r\n\r\n /**\r\n * While {@link _mySwitchToTrackedHandDelayKeepCheckingForGamepadFrameCounter} is being used to check for the gamepad to become available, \r\n * you will end up with a `null` input source\r\n * \r\n * This \"risky\" fix keeps the gamepad previous references anyway for that amount of frames\r\n * \r\n * This reference might be not valid anymore tho, even if it seems to always be working, \r\n * which is why it is marked as \"risky\", even though it seems to normally be ok\r\n */\r\n this.mySwitchToTrackedHandDelayNoInputSourceRiskyFixEnabled = false;\r\n }\r\n}\r\n\r\nexport class HandPose extends BasePose {\r\n\r\n constructor(handedness, handPoseParams = new HandPoseParams()) {\r\n super(handPoseParams);\r\n\r\n this._myHandedness = handedness;\r\n this._myFixTrackedHandRotation = handPoseParams.myFixTrackedHandRotation;\r\n\r\n this._myRealInputSource = null;\r\n this._myInputSource = null;\r\n this._myTrackedHand = false;\r\n\r\n this._myInputSourcesChangeEventListener = null;\r\n this._myVisibilityChangeEventListener = null;\r\n\r\n\r\n\r\n this._mySwitchToTrackedHandDelayEnabled = handPoseParams.mySwitchToTrackedHandDelayEnabled;\r\n this._mySwitchToTrackedHandDelay = handPoseParams.mySwitchToTrackedHandDelay;\r\n this._mySwitchToTrackedHandDelayKeepCheckingForGamepadFrameCounter = handPoseParams._mySwitchToTrackedHandDelayKeepCheckingForGamepadFrameCounter;\r\n this._mySwitchToTrackedHandDelayNoInputSourceRiskyFixEnabled = handPoseParams.mySwitchToTrackedHandDelayNoInputSourceRiskyFixEnabled;\r\n\r\n this._myDisableSwitchToTrackedHandDelaySessionChangeFrameCounter = 0;\r\n this._myDisableSwitchToTrackedHandDelaySessionChangeTimer = new Timer(1, false);\r\n\r\n this._myCurrentSwitchToTrackedHandDelayKeepCheckingForGamepadFrameCounter = 0;\r\n this._mySwitchToTrackedHandTimer = new Timer(this._mySwitchToTrackedHandDelay, false);\r\n\r\n }\r\n\r\n getHandedness() {\r\n return this._myHandedness;\r\n }\r\n\r\n getInputSource() {\r\n return this._myInputSource;\r\n }\r\n\r\n getInputSourceType() {\r\n if (this._myInputSource == null) {\r\n return null;\r\n }\r\n\r\n return InputUtils.getInputSourceType(this._myInputSource);\r\n }\r\n\r\n getInputSourceReal() {\r\n return this._myRealInputSource;\r\n }\r\n\r\n getInputSourceTypeReal() {\r\n if (this._myRealInputSource == null) {\r\n return null;\r\n }\r\n\r\n return InputUtils.getInputSourceType(this._myRealInputSource);\r\n }\r\n\r\n isFixTrackedHandRotation() {\r\n return this._myFixTrackedHandRotation;\r\n }\r\n\r\n setFixTrackedHandRotation(fixTrackedHandRotation) {\r\n this._myFixTrackedHandRotation = fixTrackedHandRotation;\r\n }\r\n\r\n isSwitchToTrackedHandDelayEnabled() {\r\n return this._mySwitchToTrackedHandDelayEnabled;\r\n }\r\n\r\n setSwitchToTrackedHandDelayEnabled(switchToTrackedHandDelayEnabled) {\r\n this._mySwitchToTrackedHandDelayEnabled = switchToTrackedHandDelayEnabled;\r\n }\r\n\r\n getSwitchToTrackedHandDelay() {\r\n return this._mySwitchToTrackedHandDelay;\r\n }\r\n\r\n setSwitchToTrackedHandDelay(switchToTrackedHandDelay) {\r\n this._mySwitchToTrackedHandDelay = switchToTrackedHandDelay;\r\n }\r\n\r\n getSwitchToTrackedHandDelayKeepCheckingForGamepadFrameCounter() {\r\n return this._mySwitchToTrackedHandDelayKeepCheckingForGamepadFrameCounter;\r\n }\r\n\r\n setSwitchToTrackedHandDelayKeepCheckingForGamepadFrameCounter(switchToTrackedHandDelayKeepCheckingForGamepadFrameCounter) {\r\n this._mySwitchToTrackedHandDelayKeepCheckingForGamepadFrameCounter = switchToTrackedHandDelayKeepCheckingForGamepadFrameCounter;\r\n }\r\n\r\n isSwitchToTrackedHandDelayNoInputSourceRiskyFixEnabled() {\r\n return this._mySwitchToTrackedHandDelayNoInputSourceRiskyFixEnabled;\r\n }\r\n\r\n setSwitchToTrackedHandDelayNoInputSourceRiskyFixEnabled(switchToTrackedHandDelayNoInputSourceRiskyFixEnabled) {\r\n this._mySwitchToTrackedHandDelayNoInputSourceRiskyFixEnabled = switchToTrackedHandDelayNoInputSourceRiskyFixEnabled;\r\n }\r\n\r\n getRotationQuat(out = quat_create(), referenceObjectOverride = undefined) {\r\n // Implemented outside class definition\r\n }\r\n\r\n _isReadyToGetPose() {\r\n return this._myInputSource != null;\r\n }\r\n\r\n _getPose(xrFrame) {\r\n return xrFrame.getPose(this._myInputSource.gripSpace, this.getReferenceSpace());\r\n }\r\n\r\n _preUpdate(dt) {\r\n if (this._mySwitchToTrackedHandDelayEnabled) {\r\n if (this._myCurrentSwitchToTrackedHandDelayKeepCheckingForGamepadFrameCounter > 0) {\r\n this._myCurrentSwitchToTrackedHandDelayKeepCheckingForGamepadFrameCounter--;\r\n if (this._myCurrentSwitchToTrackedHandDelayKeepCheckingForGamepadFrameCounter == 0) {\r\n this._myCurrentSwitchToTrackedHandDelayKeepCheckingForGamepadFrameCounter = 0;\r\n this._mySwitchToTrackedHandTimer.reset();\r\n }\r\n\r\n this._myInputSourcesChangeEventListener();\r\n }\r\n\r\n if (this._mySwitchToTrackedHandTimer.isRunning()) {\r\n this._mySwitchToTrackedHandTimer.update(dt);\r\n if (this._mySwitchToTrackedHandTimer.isDone()) {\r\n if (this._myInputSourcesChangeEventListener != null) {\r\n this._myCurrentSwitchToTrackedHandDelayKeepCheckingForGamepadFrameCounter = 0;\r\n this._mySwitchToTrackedHandTimer.reset();\r\n this._myInputSourcesChangeEventListener();\r\n }\r\n }\r\n }\r\n\r\n if (this._myDisableSwitchToTrackedHandDelaySessionChangeFrameCounter > 0) {\r\n this._myDisableSwitchToTrackedHandDelaySessionChangeFrameCounter--;\r\n } else {\r\n this._myDisableSwitchToTrackedHandDelaySessionChangeTimer.update(dt);\r\n }\r\n }\r\n }\r\n\r\n _setActiveHook(active) {\r\n if (this.isActive() != active) {\r\n if (!active) {\r\n this._myRealInputSource = null;\r\n this._myInputSource = null;\r\n this._myTrackedHand = false;\r\n\r\n XRUtils.getSession(this.getEngine())?.removeEventListener(\"inputsourceschange\", this._myInputSourcesChangeEventListener);\r\n XRUtils.getSession(this.getEngine())?.removeEventListener(\"visibilitychange\", this._myVisibilityChangeEventListener);\r\n\r\n this._myCurrentSwitchToTrackedHandDelayKeepCheckingForGamepadFrameCounter = 0;\r\n this._mySwitchToTrackedHandTimer.reset();\r\n\r\n this._myDisableSwitchToTrackedHandDelaySessionChangeFrameCounter = 0;\r\n this._myDisableSwitchToTrackedHandDelaySessionChangeTimer.reset();\r\n }\r\n }\r\n }\r\n\r\n _onXRSessionStartHook(manualCall, session) {\r\n if (this._mySwitchToTrackedHandDelayEnabled) {\r\n this._myDisableSwitchToTrackedHandDelaySessionChangeFrameCounter = 10;\r\n this._myDisableSwitchToTrackedHandDelaySessionChangeTimer.start();\r\n }\r\n\r\n this._myInputSourcesChangeEventListener = () => {\r\n let wasUsingGamepad = false;\r\n let lastGamepadInputSource = null;\r\n if (this._mySwitchToTrackedHandDelayEnabled) {\r\n if ((this.getInputSourceTypeReal() == InputSourceType.GAMEPAD || this._mySwitchToTrackedHandTimer.isRunning()) &&\r\n this._mySwitchToTrackedHandDelay > 0 && session.trackedSources != null &&\r\n this._myDisableSwitchToTrackedHandDelaySessionChangeFrameCounter == 0 &&\r\n !this._myDisableSwitchToTrackedHandDelaySessionChangeTimer.isRunning()) {\r\n\r\n wasUsingGamepad = true;\r\n if (this._mySwitchToTrackedHandDelayNoInputSourceRiskyFixEnabled) {\r\n lastGamepadInputSource = this._myInputSource;\r\n }\r\n }\r\n }\r\n\r\n this._myRealInputSource = null;\r\n this._myInputSource = null;\r\n this._myTrackedHand = false;\r\n\r\n if (session.inputSources != null) {\r\n for (const inputSource of session.inputSources) {\r\n if (inputSource.handedness == this._myHandedness) {\r\n this._myRealInputSource = inputSource;\r\n this._myInputSource = inputSource;\r\n this._myTrackedHand = InputUtils.getInputSourceType(this._myInputSource) == InputSourceType.TRACKED_HAND;\r\n\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if (this._mySwitchToTrackedHandDelayEnabled) {\r\n if (wasUsingGamepad && (this._myInputSource == null || this._myTrackedHand)) {\r\n const inputSourcesToCheck = [];\r\n\r\n if (session.inputSources != null) {\r\n inputSourcesToCheck.push(...session.inputSources);\r\n }\r\n\r\n if (session.trackedSources != null) {\r\n inputSourcesToCheck.push(...session.trackedSources);\r\n }\r\n\r\n let gamepadFound = false;\r\n for (const inputSourceToCheck of inputSourcesToCheck) {\r\n if (inputSourceToCheck.handedness == this._myHandedness) {\r\n const inputSourceToCheckType = InputUtils.getInputSourceType(inputSourceToCheck);\r\n if (inputSourceToCheckType == InputSourceType.GAMEPAD) {\r\n this._myInputSource = inputSourceToCheck;\r\n this._myTrackedHand = false;\r\n\r\n this._myCurrentSwitchToTrackedHandDelayKeepCheckingForGamepadFrameCounter = 0;\r\n if (!this._mySwitchToTrackedHandTimer.isRunning()) {\r\n this._mySwitchToTrackedHandTimer.start(this._mySwitchToTrackedHandDelay);\r\n }\r\n\r\n gamepadFound = true;\r\n\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if (!gamepadFound) {\r\n if (this._mySwitchToTrackedHandDelayKeepCheckingForGamepadFrameCounter > 0) {\r\n // Sadly the gamepad might be added in the tracked source only at the end of this callback\r\n\r\n if (this._mySwitchToTrackedHandDelayNoInputSourceRiskyFixEnabled) {\r\n this._myInputSource = lastGamepadInputSource;\r\n this._myTrackedHand = false;\r\n } else {\r\n // Prefer null over the actual input source to prevent activating features that uses tracked hands \r\n // just for a few frames\r\n this._myInputSource = null;\r\n this._myTrackedHand = false;\r\n }\r\n\r\n if (this._myCurrentSwitchToTrackedHandDelayKeepCheckingForGamepadFrameCounter == 0) {\r\n this._myCurrentSwitchToTrackedHandDelayKeepCheckingForGamepadFrameCounter = this._mySwitchToTrackedHandDelayKeepCheckingForGamepadFrameCounter;\r\n }\r\n\r\n if (!this._mySwitchToTrackedHandTimer.isRunning()) {\r\n this._mySwitchToTrackedHandTimer.start(this._mySwitchToTrackedHandDelay);\r\n }\r\n } else {\r\n this._myCurrentSwitchToTrackedHandDelayKeepCheckingForGamepadFrameCounter = 0;\r\n this._mySwitchToTrackedHandTimer.reset();\r\n }\r\n }\r\n } else {\r\n this._myCurrentSwitchToTrackedHandDelayKeepCheckingForGamepadFrameCounter = 0;\r\n this._mySwitchToTrackedHandTimer.reset();\r\n }\r\n }\r\n };\r\n\r\n this._myInputSourcesChangeEventListener();\r\n\r\n session.addEventListener(\"inputsourceschange\", this._myInputSourcesChangeEventListener);\r\n\r\n this._myVisibilityChangeEventListener = () => {\r\n this._myCurrentSwitchToTrackedHandDelayKeepCheckingForGamepadFrameCounter = 0;\r\n this._mySwitchToTrackedHandTimer.reset();\r\n\r\n if (this._mySwitchToTrackedHandDelayEnabled) {\r\n this._myDisableSwitchToTrackedHandDelaySessionChangeFrameCounter = 10;\r\n this._myDisableSwitchToTrackedHandDelaySessionChangeTimer.start();\r\n }\r\n };\r\n\r\n session.addEventListener(\"visibilitychange\", this._myVisibilityChangeEventListener);\r\n }\r\n\r\n _onXRSessionEndHook() {\r\n this._myRealInputSource = null;\r\n this._myInputSource = null;\r\n this._myTrackedHand = false;\r\n\r\n this._myInputSourcesChangeEventListener = null;\r\n this._myVisibilityChangeEventListener = null;\r\n\r\n this._myCurrentSwitchToTrackedHandDelayKeepCheckingForGamepadFrameCounter = 0;\r\n this._mySwitchToTrackedHandTimer.reset();\r\n\r\n this._myDisableSwitchToTrackedHandDelaySessionChangeFrameCounter = 0;\r\n this._myDisableSwitchToTrackedHandDelaySessionChangeTimer.reset();\r\n }\r\n}\r\n\r\n\r\n\r\n// IMPLEMENTATION\r\n\r\nHandPose.prototype.getRotationQuat = function () {\r\n let playerRotationQuat = quat_create();\r\n let up = vec3_create();\r\n let right = vec3_create();\r\n let forward = vec3_create();\r\n return function getRotationQuat(out = quat_create(), referenceObjectOverride = undefined) {\r\n let referenceObject = referenceObjectOverride === undefined ? this._myReferenceObject : referenceObjectOverride;\r\n\r\n out.quat_copy(this._myRotationQuat);\r\n\r\n if (this._myForwardFixed) {\r\n out.quat_rotateAxisRadians(Math.PI, out.quat_getUp(up), out);\r\n }\r\n\r\n if (this._myFixTrackedHandRotation && this._myTrackedHand) {\r\n out.quat_rotateAxis(-60, out.quat_getRight(right), out);\r\n\r\n let forwardRotation = 20;\r\n forwardRotation = (this._myHandedness == Handedness.LEFT) ? forwardRotation : -forwardRotation;\r\n out.quat_rotateAxis(forwardRotation, out.quat_getForward(forward), out);\r\n }\r\n\r\n if (referenceObject == null) {\r\n return out;\r\n }\r\n\r\n return out.quat_toWorld(referenceObject.pp_getRotationQuat(playerRotationQuat), out);\r\n };\r\n}();", "import { HandPose, HandPoseParams } from \"./hand_pose.js\";\r\n\r\nexport class HandRayPoseParams extends HandPoseParams { }\r\n\r\nexport class HandRayPose extends HandPose {\r\n\r\n constructor(handedness, handRayPoseParams = new HandRayPoseParams()) {\r\n super(handedness, handRayPoseParams);\r\n }\r\n\r\n _getPose(xrFrame) {\r\n return xrFrame.getPose(this._myInputSource.targetRaySpace, this.getReferenceSpace());\r\n }\r\n}", "import { BasePose } from \"./base_pose.js\";\r\n\r\nexport class HeadPose extends BasePose {\r\n _getPose(xrFrame) {\r\n return xrFrame.getViewerPose(this.getReferenceSpace());\r\n }\r\n}", "import { XRUtils } from \"../../cauldron/utils/xr_utils.js\";\r\nimport { InputSourceType } from \"../cauldron/input_types.js\";\r\nimport { InputUtils } from \"../cauldron/input_utils.js\";\r\nimport { BasePose, BasePoseParams } from \"./base_pose.js\";\r\n\r\nexport class TrackedHandJointPose extends BasePose {\r\n\r\n constructor(handedness, trackedHandJointID, basePoseParams = new BasePoseParams()) {\r\n super(basePoseParams);\r\n\r\n this._myInputSource = null;\r\n\r\n this._myHandedness = handedness;\r\n this._myTrackedHandJointID = trackedHandJointID;\r\n\r\n this._myJointRadius = 0;\r\n\r\n this._myInputSourcesChangeEventListener = null;\r\n }\r\n\r\n getHandedness() {\r\n return this._myHandedness;\r\n }\r\n\r\n getTrackedHandJointID() {\r\n return this._myTrackedHandJointID;\r\n }\r\n\r\n setTrackedHandJointID(trackedHandJointID) {\r\n this._myTrackedHandJointID = trackedHandJointID;\r\n }\r\n\r\n getJointRadius() {\r\n return this._myJointRadius;\r\n }\r\n\r\n _isReadyToGetPose() {\r\n return this._myInputSource != null;\r\n }\r\n\r\n _getPose(xrFrame) {\r\n return xrFrame.getJointPose(this._myInputSource.hand.get(this._myTrackedHandJointID), this.getReferenceSpace());\r\n }\r\n\r\n _postUpdate(dt, updateVelocity, manualUpdate, xrPose) {\r\n if (xrPose != null) {\r\n this._myJointRadius = xrPose.radius;\r\n }\r\n }\r\n\r\n _setActiveHook(active) {\r\n if (this.isActive() != active) {\r\n if (!active) {\r\n this._myInputSource = null;\r\n this._myJointRadius = 0;\r\n\r\n XRUtils.getSession(this.getEngine())?.removeEventListener(\"inputsourceschange\", this._myInputSourcesChangeEventListener);\r\n }\r\n }\r\n }\r\n\r\n _onXRSessionStartHook(manualCall, session) {\r\n this._myInputSourcesChangeEventListener = () => {\r\n this._myInputSource = null;\r\n\r\n if (session.inputSources != null && session.inputSources.length > 0) {\r\n\r\n for (let i = 0; i < session.inputSources.length; i++) {\r\n let inputSource = session.inputSources[i];\r\n if (inputSource.handedness == this._myHandedness) {\r\n if (InputUtils.getInputSourceType(inputSource) == InputSourceType.TRACKED_HAND) {\r\n this._myInputSource = inputSource;\r\n }\r\n }\r\n }\r\n }\r\n };\r\n\r\n this._myInputSourcesChangeEventListener();\r\n\r\n session.addEventListener(\"inputsourceschange\", this._myInputSourcesChangeEventListener);\r\n }\r\n\r\n _onXRSessionEndHook() {\r\n this._myInputSource = null;\r\n\r\n this._myInputSourcesChangeEventListener = null;\r\n }\r\n}", "import { Globals } from \"../../pp/globals.js\";\r\nimport { TrackedHandJointID } from \"../cauldron/input_types.js\";\r\nimport { InputUtils } from \"../cauldron/input_utils.js\";\r\nimport { BasePoseParams } from \"./base_pose.js\";\r\nimport { TrackedHandJointPose } from \"./tracked_hand_joint_pose.js\";\r\n\r\nexport class TrackedHandPoseParams extends BasePoseParams {\r\n\r\n constructor(addAllJointIDs = true, engine = Globals.getMainEngine()) {\r\n super(engine);\r\n\r\n this.myTrackedHandJointIDList = [];\r\n this._myActive = true;\r\n\r\n if (addAllJointIDs) {\r\n for (let key in TrackedHandJointID) {\r\n this.myTrackedHandJointIDList.push(TrackedHandJointID[key]);\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport class TrackedHandPose {\r\n\r\n constructor(handedness, trackedHandPoseParams = new TrackedHandPoseParams()) {\r\n this._myHandedness = handedness;\r\n\r\n this._myForwardFixed = trackedHandPoseParams.myForwardFixed;\r\n this._myForceEmulatedVelocities = trackedHandPoseParams.myForceEmulatedVelocities;\r\n this._myReferenceObject = trackedHandPoseParams.myReferenceObject;\r\n\r\n this._myEngine = trackedHandPoseParams.myEngine;\r\n this._myActive = true;\r\n\r\n this._myTrackedHandJointPoseParams = new BasePoseParams(this._myEngine);\r\n this._myTrackedHandJointPoseParams.myForwardFixed = this._myForwardFixed;\r\n this._myTrackedHandJointPoseParams.myForceEmulatedVelocities = this._myForceEmulatedVelocities;\r\n this._myTrackedHandJointPoseParams.myReferenceObject = this._myReferenceObject;\r\n\r\n this._myTrackedHandJointPoses = [];\r\n for (let jointID of trackedHandPoseParams.myTrackedHandJointIDList) {\r\n let trackedHandJointPose = new TrackedHandJointPose(this._myHandedness, jointID, this._myTrackedHandJointPoseParams);\r\n this._myTrackedHandJointPoses[jointID] = trackedHandJointPose;\r\n }\r\n }\r\n\r\n setActive(active) {\r\n this._myActive = active;\r\n\r\n for (let jointPose of this._myTrackedHandJointPoses) {\r\n jointPose.setActive(active);\r\n }\r\n }\r\n\r\n isActive() {\r\n return this._myActive;\r\n }\r\n\r\n start() {\r\n for (let jointPoseKey in this._myTrackedHandJointPoses) {\r\n let jointPose = this._myTrackedHandJointPoses[jointPoseKey];\r\n jointPose.start();\r\n }\r\n }\r\n\r\n update(dt) {\r\n if (!this._myActive) return;\r\n\r\n for (let jointPoseKey in this._myTrackedHandJointPoses) {\r\n let jointPose = this._myTrackedHandJointPoses[jointPoseKey];\r\n jointPose.update(dt);\r\n }\r\n }\r\n\r\n getEngine() {\r\n return this._myEngine;\r\n }\r\n\r\n getHandedness() {\r\n return this._myHandedness;\r\n }\r\n\r\n getJointPose(jointID) {\r\n return this._myTrackedHandJointPoses[jointID];\r\n }\r\n\r\n getJointPoseByIndex(jointIDIndex) {\r\n return this._myTrackedHandJointPoses[InputUtils.getJointIDByIndex(jointIDIndex)];\r\n }\r\n\r\n getJointPoses() {\r\n return this._myTrackedHandJointPoses;\r\n }\r\n\r\n addTrackedHandJointID(jointID) {\r\n if (!this._myTrackedHandJointPoses.pp_has(element => element.getTrackedHandJointID() == jointID)) {\r\n let trackedHandJointPose = new TrackedHandJointPose(this._myHandedness, jointID, this._myTrackedHandJointPoseParams);\r\n this._myTrackedHandJointPoses.push(trackedHandJointPose);\r\n }\r\n }\r\n\r\n removeTrackedHandJointID(jointID) {\r\n this._myTrackedHandJointPoses.pp_remove(element => element.getTrackedHandJointID() == jointID);\r\n }\r\n\r\n setReferenceObject(referenceObject) {\r\n this._myReferenceObject = referenceObject;\r\n this._myTrackedHandJointPoseParams.myReferenceObject = this._myReferenceObject;\r\n for (let jointPoseKey in this._myTrackedHandJointPoses) {\r\n let jointPose = this._myTrackedHandJointPoses[jointPoseKey];\r\n jointPose.setReferenceObject(referenceObject);\r\n }\r\n }\r\n\r\n getReferenceObject() {\r\n return this._myReferenceObject;\r\n }\r\n\r\n setForwardFixed(forwardFixed) {\r\n this._myForwardFixed = forwardFixed;\r\n this._myTrackedHandJointPoseParams.myForwardFixed = this._myForwardFixed;\r\n for (let jointPoseKey in this._myTrackedHandJointPoses) {\r\n let jointPose = this._myTrackedHandJointPoses[jointPoseKey];\r\n jointPose.setForwardFixed(forwardFixed);\r\n }\r\n }\r\n\r\n isForwardFixed() {\r\n return this._myForwardFixed;\r\n }\r\n\r\n setForceEmulatedVelocities(forceEmulatedVelocities) {\r\n this._myForceEmulatedVelocities = forceEmulatedVelocities;\r\n this._myTrackedHandJointPoseParams.myForceEmulatedVelocities = this._myForceEmulatedVelocities;\r\n for (let jointPoseKey in this._myTrackedHandJointPoses) {\r\n let jointPose = this._myTrackedHandJointPoses[jointPoseKey];\r\n jointPose.setForceEmulatedVelocities(forceEmulatedVelocities);\r\n }\r\n }\r\n\r\n isForceEmulatedVelocities() {\r\n return this._myForceEmulatedVelocities;\r\n }\r\n\r\n destroy() {\r\n this._myDestroyed = true;\r\n\r\n this.setActive(false);\r\n\r\n for (let jointPose of this._myTrackedHandJointPoses) {\r\n jointPose.destroy();\r\n }\r\n }\r\n\r\n isDestroyed() {\r\n return this._myDestroyed;\r\n }\r\n}", "import { ViewComponent } from \"@wonderlandengine/api\";\r\nimport { Timer } from \"../../cauldron/cauldron/timer.js\";\r\nimport { RaycastResults } from \"../../cauldron/physics/physics_raycast_params.js\";\r\nimport { PhysicsUtils } from \"../../cauldron/physics/physics_utils.js\";\r\nimport { XRUtils } from \"../../cauldron/utils/xr_utils.js\";\r\nimport { mat4_create, quat_create, vec2_create, vec3_create } from \"../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Globals } from \"../../pp/globals.js\";\r\n\r\nexport let MouseButtonID = {\r\n LEFT: 0,\r\n MIDDLE: 1,\r\n RIGHT: 2\r\n};\r\n\r\n// #TODO Refactor Mouse/Keyboard/Gamepad and create a sort of parent ButtonHandler that have the base ButtonInfo and all of them inherit\r\nexport class Mouse {\r\n\r\n constructor(engine = Globals.getMainEngine()) {\r\n this._myEngine = engine;\r\n\r\n this._myButtonInfos = {};\r\n this._myButtonInfosIDs = [];\r\n for (let key in MouseButtonID) {\r\n this._myButtonInfos[MouseButtonID[key]] = this._createButtonInfo();\r\n this._myButtonInfosIDs.push(MouseButtonID[key]);\r\n }\r\n\r\n this._myPreventContextMenuEventListener = this._preventContextMenu.bind(this);\r\n this._myPreventMiddleButtonScrollEventListener = this._preventMiddleButtonScroll.bind(this);\r\n\r\n this._myInternalMousePosition = vec2_create();\r\n\r\n this._myScreenSize = vec2_create();\r\n\r\n this._myResetMovingDelay = 0.15;\r\n this._myResetMovingTimer = new Timer(this._myResetMovingDelay, false);\r\n this._myMoving = false;\r\n\r\n this._myInsideView = false;\r\n this._myValid = false;\r\n\r\n this._myActive = true;\r\n\r\n this._myPointerUpOnPointerLeave = true;\r\n\r\n this._myContextMenuActive = true;\r\n this._myMiddleButtonScrollActive = true;\r\n\r\n this._myPointerID = null;\r\n this._myLastValidPointerEvent = null;\r\n\r\n this._myPointerEventValidCallbacks = {}; // Signature: callback(event)\r\n this._myPointerEventValidCallbacksIDs = [];\r\n\r\n this._myPointerMoveEventListener = null;\r\n this._myPointerDownEventListener = null;\r\n this._myPointerUpEventListener = null;\r\n this._myPointerLeaveEventListener = null;\r\n this._myPointerEnterEventListener = null;\r\n this._myMouseDownEventListener = null;\r\n this._myMouseUpEventListener = null;\r\n this._myWindowResizeEventListener = null;\r\n\r\n this._myDestroyed = false;\r\n\r\n // Support Variables\r\n this._myProjectionMatrixInverse = mat4_create();\r\n this._myRotationQuat = quat_create();\r\n this._myOriginWorld = vec3_create();\r\n this._myDirectionWorld = vec3_create();\r\n }\r\n\r\n setActive(active) {\r\n if (this._myActive != active) {\r\n this._myActive = active;\r\n\r\n if (this._myActive) {\r\n this._myPointerMoveEventListener = this._onPointerAction.bind(this, this._onPointerMove.bind(this));\r\n document.body.addEventListener(\"pointermove\", this._myPointerMoveEventListener);\r\n this._myPointerDownEventListener = this._onPointerAction.bind(this, this._onPointerDown.bind(this));\r\n document.body.addEventListener(\"pointerdown\", this._myPointerDownEventListener);\r\n this._myPointerUpEventListener = this._onPointerAction.bind(this, this._onPointerUp.bind(this));\r\n document.body.addEventListener(\"pointerup\", this._myPointerUpEventListener);\r\n this._myPointerLeaveEventListener = this._onPointerLeave.bind(this);\r\n document.body.addEventListener(\"pointerleave\", this._myPointerLeaveEventListener);\r\n this._myPointerEnterEventListener = this._onPointerEnter.bind(this);\r\n document.body.addEventListener(\"pointerenter\", this._myPointerEnterEventListener);\r\n\r\n // These are needed to being able to detect for example left and right click together, pointer only allow one down at a time\r\n this._myMouseDownEventListener = this._onMouseAction.bind(this, this._onPointerDown.bind(this));\r\n document.body.addEventListener(\"mousedown\", this._myMouseDownEventListener);\r\n this._myMouseUpEventListener = this._onMouseAction.bind(this, this._onPointerUp.bind(this));\r\n document.body.addEventListener(\"mouseup\", this._myMouseUpEventListener);\r\n\r\n this._updateScreenSize();\r\n this._myWindowResizeEventListener = this._updateScreenSize.bind(this);\r\n window.addEventListener(\"resize\", this._myWindowResizeEventListener);\r\n\r\n this._myContextMenuActive = !this._myContextMenuActive;\r\n this.setContextMenuActive(!this._myContextMenuActive);\r\n\r\n this._myMiddleButtonScrollActive = !this._myMiddleButtonScrollActive;\r\n this.setMiddleButtonScrollActive(!this._myMiddleButtonScrollActive);\r\n } else {\r\n for (let i = 0; i < this._myButtonInfosIDs.length; i++) {\r\n let id = this._myButtonInfosIDs[i];\r\n let buttonInfo = this._myButtonInfos[id];\r\n buttonInfo.myPressed = false;\r\n buttonInfo.myPressStart = false;\r\n buttonInfo.myPressEnd = false;\r\n buttonInfo.myPressStartToProcess = false;\r\n buttonInfo.myPressEndToProcess = false;\r\n }\r\n\r\n this._myInternalMousePosition.vec2_zero();\r\n\r\n this._myScreenSize.vec2_zero();\r\n\r\n this._myResetMovingTimer.reset();\r\n this._myMoving = false;\r\n\r\n this._myInsideView = false;\r\n this._myValid = false;\r\n\r\n this._myPointerID = null;\r\n this._myLastValidPointerEvent = null;\r\n\r\n document.body.removeEventListener(\"pointermove\", this._myPointerMoveEventListener);\r\n document.body.removeEventListener(\"pointerdown\", this._myPointerDownEventListener);\r\n document.body.removeEventListener(\"pointerup\", this._myPointerUpEventListener);\r\n document.body.removeEventListener(\"pointerleave\", this._myPointerLeaveEventListener);\r\n document.body.removeEventListener(\"pointerenter\", this._myPointerEnterEventListener);\r\n\r\n document.body.removeEventListener(\"mousedown\", this._myMouseDownEventListener);\r\n document.body.removeEventListener(\"mouseup\", this._myMouseUpEventListener);\r\n\r\n document.body.removeEventListener(\"contextmenu\", this._myPreventContextMenuEventListener);\r\n document.body.removeEventListener(\"mousedown\", this._myPreventMiddleButtonScrollEventListener);\r\n\r\n window.removeEventListener(\"resize\", this._myWindowResizeEventListener);\r\n\r\n this._myPointerMoveEventListener = null;\r\n this._myPointerDownEventListener = null;\r\n this._myPointerUpEventListener = null;\r\n this._myPointerLeaveEventListener = null;\r\n this._myPointerEnterEventListener = null;\r\n this._myMouseDownEventListener = null;\r\n this._myMouseUpEventListener = null;\r\n this._myWindowResizeEventListener = null;\r\n }\r\n }\r\n }\r\n\r\n isActive() {\r\n return this._myActive;\r\n }\r\n\r\n start() {\r\n this._myActive = false;\r\n this.setActive(true);\r\n }\r\n\r\n update(dt) {\r\n if (!this._myActive) return;\r\n\r\n if (this._myResetMovingTimer.isRunning()) {\r\n this._myResetMovingTimer.update(dt);\r\n if (this._myResetMovingTimer.isDone()) {\r\n this._myResetMovingTimer.reset();\r\n this._myMoving = false;\r\n }\r\n }\r\n\r\n for (let i = 0; i < this._myButtonInfosIDs.length; i++) {\r\n let id = this._myButtonInfosIDs[i];\r\n let buttonInfo = this._myButtonInfos[id];\r\n buttonInfo.myPressStart = buttonInfo.myPressStartToProcess;\r\n buttonInfo.myPressEnd = buttonInfo.myPressEndToProcess;\r\n buttonInfo.myPressStartToProcess = false;\r\n buttonInfo.myPressEndToProcess = false;\r\n }\r\n\r\n if (!this.isAnyButtonPressed() && !this._myMoving) {\r\n this._myPointerID = null;\r\n }\r\n\r\n if (this._myLastValidPointerEvent != null) {\r\n let lastValidPointerEventStillValid = this._isPointerEventValid(this._myLastValidPointerEvent);\r\n if (!lastValidPointerEventStillValid) {\r\n if (this._myInsideView) {\r\n this._onPointerLeave(this._myLastValidPointerEvent);\r\n }\r\n\r\n this._myLastValidPointerEvent = null;\r\n }\r\n }\r\n }\r\n\r\n isValid() {\r\n return this._myValid;\r\n }\r\n\r\n isButtonPressed(buttonID) {\r\n let pressed = false;\r\n\r\n if (this._myButtonInfosIDs[buttonID] != null) {\r\n pressed = this._myButtonInfos[buttonID].myPressed;\r\n }\r\n\r\n return pressed;\r\n }\r\n\r\n isAnyButtonPressed() {\r\n let pressed = false;\r\n\r\n for (let i = 0; i < this._myButtonInfosIDs.length; i++) {\r\n let id = this._myButtonInfosIDs[i];\r\n let buttonInfo = this._myButtonInfos[id];\r\n if (buttonInfo.myPressed) {\r\n pressed = true;\r\n break;\r\n }\r\n }\r\n\r\n return pressed;\r\n }\r\n\r\n isButtonPressStart(buttonID) {\r\n let pressStart = false;\r\n\r\n if (this._myButtonInfosIDs[buttonID] != null) {\r\n pressStart = this._myButtonInfos[buttonID].myPressStart;\r\n }\r\n\r\n return pressStart;\r\n }\r\n\r\n isButtonPressEnd(buttonID = null) {\r\n let pressEnd = false;\r\n\r\n if (this._myButtonInfosIDs[buttonID] != null) {\r\n pressEnd = this._myButtonInfos[buttonID].myPressEnd;\r\n }\r\n\r\n return pressEnd;\r\n }\r\n\r\n isMoving() {\r\n return this._myMoving;\r\n }\r\n\r\n isInsideView() {\r\n return this._myInsideView;\r\n }\r\n\r\n isTargetingRenderCanvas() {\r\n return this.isInsideView() && this._myLastValidPointerEvent != null && this._myLastValidPointerEvent.target == Globals.getCanvas(this._myEngine);\r\n }\r\n\r\n // The origin and direction are set by the mouse\r\n raycastWorld(raycastParams, raycastResults = new RaycastResults()) {\r\n this.getOriginWorld(raycastParams.myOrigin);\r\n this.getDirectionWorld(raycastParams.myDirection);\r\n raycastResults = PhysicsUtils.raycast(raycastParams, raycastResults, Globals.getPhysics(this._myEngine));\r\n return raycastResults;\r\n }\r\n\r\n getPositionScreen(out = vec2_create()) {\r\n let mousePosition = out;\r\n mousePosition[0] = this._myInternalMousePosition[0];\r\n mousePosition[1] = this._myScreenSize[1] - 1 - this._myInternalMousePosition[1];\r\n return mousePosition;\r\n }\r\n\r\n getPositionScreenNormalized(out = vec2_create()) {\r\n let mousePosition = out;\r\n mousePosition[0] = (this._myScreenSize[0] == 0) ? 0 : ((this._myInternalMousePosition[0] / this._myScreenSize[0]) * 2 - 1);\r\n mousePosition[1] = (this._myScreenSize[1] == 0) ? 0 : (((this._myScreenSize[1] - 1 - this._myInternalMousePosition[1]) / this._myScreenSize[1]) * 2 - 1);\r\n return mousePosition;\r\n }\r\n\r\n getScreenSize() {\r\n return this._myScreenSize;\r\n }\r\n\r\n getPositionWorld(distanceFromCamera, out = vec3_create()) {\r\n let originWorld = this.getOriginWorld(this._myOriginWorld);\r\n let directionWorld = this.getDirectionWorld(this._myDirectionWorld);\r\n\r\n out = originWorld.vec3_add(directionWorld.vec3_scale(distanceFromCamera, out), out);\r\n return out;\r\n }\r\n\r\n getOriginWorld(out = vec3_create()) {\r\n if (XRUtils.isSessionActive(this._myEngine)) {\r\n Globals.getPlayerObjects(this._myEngine).myEyeLeft.pp_getPosition(out); // In theory mouse should not be used inside the session, but may make sense for AR which uses eye left\r\n } else {\r\n Globals.getPlayerObjects(this._myEngine).myCameraNonXR.pp_getPosition(out);\r\n }\r\n\r\n return out;\r\n }\r\n\r\n getDirectionWorld(out = vec3_create()) {\r\n let right = this._myInternalMousePosition[0] / this._myScreenSize[0];\r\n let up = this._myInternalMousePosition[1] / this._myScreenSize[1];\r\n\r\n let directionLocal = out;\r\n directionLocal.vec3_set(right * 2 - 1, -up * 2 + 1, -1.0);\r\n\r\n let projectionMatrixInvert = this._myProjectionMatrixInverse;\r\n if (XRUtils.isSessionActive(this._myEngine)) {\r\n projectionMatrixInvert = Globals.getPlayerObjects(this._myEngine).myEyeLeft.pp_getComponent(ViewComponent).projectionMatrix.mat4_invert(projectionMatrixInvert);\r\n } else {\r\n projectionMatrixInvert = Globals.getPlayerObjects(this._myEngine).myCameraNonXR.pp_getComponent(ViewComponent).projectionMatrix.mat4_invert(projectionMatrixInvert);\r\n }\r\n\r\n directionLocal.vec3_transformMat4(projectionMatrixInvert, directionLocal);\r\n directionLocal.vec3_normalize(directionLocal);\r\n\r\n let directionWorld = directionLocal;\r\n if (XRUtils.isSessionActive(this._myEngine)) {\r\n directionWorld = directionLocal.vec3_transformQuat(Globals.getPlayerObjects(this._myEngine).myEyeLeft.pp_getRotationQuat(this._myRotationQuat), directionLocal);\r\n } else {\r\n directionWorld = directionLocal.vec3_transformQuat(Globals.getPlayerObjects(this._myEngine).myCameraNonXR.pp_getRotationQuat(this._myRotationQuat), directionLocal);\r\n }\r\n\r\n directionWorld.vec3_normalize(directionWorld);\r\n\r\n return out;\r\n }\r\n\r\n setTouchValid(touchValid) {\r\n let callbackID = \"pp_internal_touch_valid_callback\";\r\n if (touchValid) {\r\n this.removePointerEventValidCallback(callbackID);\r\n } else {\r\n this.addPointerEventValidCallback(callbackID, function (event) {\r\n return event.pointerType == \"mouse\";\r\n });\r\n }\r\n }\r\n\r\n setTargetOnlyRenderCanvas(targetOnlyRenderCanvas) {\r\n let callbackID = \"pp_internal_target_only_render_canvas_callback\";\r\n if (targetOnlyRenderCanvas) {\r\n this.addPointerEventValidCallback(callbackID, function (event) {\r\n return event.target == Globals.getCanvas(this._myEngine);\r\n });\r\n } else {\r\n this.removePointerEventValidCallback(callbackID);\r\n }\r\n }\r\n\r\n getLastValidPointerEvent() {\r\n return this._myLastValidPointerEvent;\r\n }\r\n\r\n // Can be used to specify that only some pointerType are valid (eg: mouse, touch, pen) or just some target (eg: Globals.getCanvas(this._myEngine))\r\n addPointerEventValidCallback(id, callback) {\r\n this._myPointerEventValidCallbacks[id] = callback;\r\n this._myPointerEventValidCallbacksIDs.push(id);\r\n }\r\n\r\n removePointerEventValidCallback(id) {\r\n delete this._myPointerEventValidCallbacks[id];\r\n this._myPointerEventValidCallbacksIDs.pp_removeEqual(id);\r\n }\r\n\r\n isPointerUpOnPointerLeave() {\r\n return this._myPointerUpOnPointerLeave;\r\n }\r\n\r\n setPointerUpOnPointerLeave(pointerUpOnPointerLeave) {\r\n this._myPointerUpOnPointerLeave = pointerUpOnPointerLeave;\r\n }\r\n\r\n isContextMenuActive() {\r\n return this._myContextMenuActive;\r\n }\r\n\r\n setContextMenuActive(active) {\r\n if (this._myContextMenuActive != active) {\r\n this._myContextMenuActive = active;\r\n\r\n if (this._myActive) {\r\n if (active) {\r\n document.body.removeEventListener(\"contextmenu\", this._myPreventContextMenuEventListener);\r\n } else {\r\n document.body.addEventListener(\"contextmenu\", this._myPreventContextMenuEventListener, false);\r\n }\r\n }\r\n }\r\n }\r\n\r\n isMiddleButtonScrollActive() {\r\n return this._myMiddleButtonScrollActive;\r\n }\r\n\r\n setMiddleButtonScrollActive(active) {\r\n if (this._myMiddleButtonScrollActive != active) {\r\n this._myMiddleButtonScrollActive = active;\r\n\r\n if (this._myActive) {\r\n if (active) {\r\n document.body.removeEventListener(\"mousedown\", this._myPreventMiddleButtonScrollEventListener);\r\n } else {\r\n document.body.addEventListener(\"mousedown\", this._myPreventMiddleButtonScrollEventListener, false);\r\n }\r\n }\r\n }\r\n }\r\n\r\n setResetMovingDelay(delay) {\r\n this._myResetMovingDelay = delay;\r\n }\r\n\r\n getResetMovingDelay() {\r\n return this._myResetMovingDelay;\r\n }\r\n\r\n _onPointerAction(actionCallback, event) {\r\n if (!this._isPointerEventIDValid(event)) return;\r\n\r\n if (!this._isPointerEventValid(event)) {\r\n if (this._myInsideView) {\r\n this._onPointerLeave(event);\r\n }\r\n return;\r\n }\r\n\r\n if (!this._myInsideView) {\r\n this._onPointerEnter(event);\r\n }\r\n\r\n actionCallback(event);\r\n\r\n this._updatePosition(event);\r\n this._updatePointerData(event);\r\n }\r\n\r\n _onMouseAction(actionCallback, event) {\r\n if (!this._myInsideView) return;\r\n if (!this._isMouseAllowed()) return;\r\n if (!this._isPointerEventIDValid(this._myLastValidPointerEvent)) return;\r\n if (!this._isPointerEventValid(this._myLastValidPointerEvent)) return;\r\n\r\n actionCallback(event);\r\n }\r\n\r\n _onPointerMove(event) {\r\n this._myResetMovingTimer.start(this._myResetMovingDelay);\r\n this._myMoving = true;\r\n }\r\n\r\n _onPointerDown(event) {\r\n let buttonInfo = this._myButtonInfos[event.button];\r\n if (!buttonInfo.myPressed) {\r\n buttonInfo.myPressed = true;\r\n buttonInfo.myPressStartToProcess = true;\r\n }\r\n }\r\n\r\n _onPointerUp(event) {\r\n let buttonInfo = this._myButtonInfos[event.button];\r\n if (buttonInfo.myPressed) {\r\n buttonInfo.myPressed = false;\r\n buttonInfo.myPressEndToProcess = true;\r\n }\r\n }\r\n\r\n _onPointerLeave(event) {\r\n if (!this._myInsideView || this._myLastValidPointerEvent == null || event.pointerId != this._myLastValidPointerEvent.pointerId) return;\r\n\r\n this._myInsideView = false;\r\n\r\n this._myMoving = false;\r\n\r\n if (this._myPointerUpOnPointerLeave) {\r\n for (let i = 0; i < this._myButtonInfosIDs.length; i++) {\r\n let id = this._myButtonInfosIDs[i];\r\n let buttonInfo = this._myButtonInfos[id];\r\n if (buttonInfo.myPressed) {\r\n buttonInfo.myPressed = false;\r\n buttonInfo.myPressEndToProcess = true;\r\n }\r\n }\r\n }\r\n\r\n this._myPointerID = null;\r\n }\r\n\r\n _onPointerEnter(event) {\r\n if ((this._myInsideView && this._myPointerID != null) || !this._isPointerEventIDValid(event) || !this._isPointerEventValid(event)) return;\r\n\r\n this._myInsideView = true;\r\n\r\n this._updatePosition(event);\r\n this._updatePointerData(event);\r\n }\r\n\r\n _preventContextMenu(event) {\r\n if (!this._isPointerEventIDValid(event) || !this._isPointerEventValid(event)) return;\r\n\r\n event.preventDefault();\r\n }\r\n\r\n _preventMiddleButtonScroll(event) {\r\n if (!this._isPointerEventIDValid(event) || !this._isPointerEventValid(event)) return;\r\n\r\n if (event.button == 1) {\r\n event.preventDefault();\r\n return false;\r\n }\r\n }\r\n\r\n _updatePosition(event) {\r\n this._myInternalMousePosition[0] = event.clientX;\r\n this._myInternalMousePosition[1] = event.clientY;\r\n\r\n this._myValid = true;\r\n }\r\n\r\n _updateScreenSize() {\r\n let bounds = document.body.getBoundingClientRect();\r\n this._myScreenSize[0] = bounds.width;\r\n this._myScreenSize[1] = bounds.height;\r\n }\r\n\r\n _updatePointerData(event) {\r\n this._myPointerID = event.pointerId;\r\n this._myLastValidPointerEvent = event;\r\n }\r\n\r\n _isPointerEventIDValid(event) {\r\n if (event == null) return false;\r\n\r\n return this._myPointerID == null || this._myPointerID == event.pointerId;\r\n }\r\n\r\n _isPointerEventValid(event) {\r\n if (event == null) return false;\r\n\r\n let valid = true;\r\n\r\n for (let i = 0; i < this._myPointerEventValidCallbacksIDs.length; i++) {\r\n let id = this._myPointerEventValidCallbacksIDs[i];\r\n let callback = this._myPointerEventValidCallbacks[id];\r\n if (!callback(event)) {\r\n valid = false;\r\n break;\r\n }\r\n }\r\n\r\n return valid;\r\n }\r\n\r\n _isMouseAllowed() {\r\n // Mouse events are valid only if the last pointer event was a mouse (id==1)\r\n return this._myLastValidPointerEvent != null && this._myLastValidPointerEvent.pointerId == 1;\r\n }\r\n\r\n _createButtonInfo() {\r\n return { myPressed: false, myPressStart: false, myPressStartToProcess: false, myPressEnd: false, myPressEndToProcess: false, };\r\n }\r\n\r\n destroy() {\r\n this._myDestroyed = true;\r\n\r\n this.setActive(false);\r\n }\r\n\r\n isDestroyed() {\r\n return this._myDestroyed;\r\n }\r\n}", "import { Component, Property } from \"@wonderlandengine/api\";\r\nimport { Globals } from \"../../../pp/globals.js\";\r\n\r\nexport class EnableToolComponent extends Component {\r\n static TypeName = \"pp-enable-tool\";\r\n static Properties = {\r\n _myEnable: Property.bool(true)\r\n };\r\n\r\n start() {\r\n this._myHasToolEnabled = this._myEnable;\r\n this._myToolEnabled = this._myEnable;\r\n }\r\n\r\n onActivate() {\r\n if (this._myHasToolEnabled) {\r\n Globals.setToolEnabled(this._myToolEnabled, this.engine);\r\n }\r\n }\r\n\r\n onDeactivate() {\r\n this._myHasToolEnabled = Globals.hasToolEnabled();\r\n this._myToolEnabled = Globals.isToolEnabled();\r\n Globals.removeToolEnabled(this.engine);\r\n }\r\n}", "import { Component, Property } from \"@wonderlandengine/api\";\r\nimport { Globals } from \"../../../pp/globals.js\";\r\nimport { ConsoleVR } from \"../console_vr.js\";\r\n\r\nexport class InitConsoleVRComponent extends Component {\r\n static TypeName = \"pp-init-console-vr\";\r\n static Properties = {\r\n _myInit: Property.bool(true)\r\n };\r\n\r\n init() {\r\n this._myConsoleVR = null;\r\n\r\n if (this._myInit) {\r\n this._myConsoleVR = new ConsoleVR(this.engine);\r\n }\r\n }\r\n\r\n onActivate() {\r\n if (this._myConsoleVR != null && !Globals.hasConsoleVR(this.engine)) {\r\n Globals.setConsoleVR(this._myConsoleVR, this.engine);\r\n }\r\n }\r\n\r\n onDeactivate() {\r\n if (this._myConsoleVR != null && Globals.getConsoleVR(this.engine) == this._myConsoleVR) {\r\n Globals.removeConsoleVR(this.engine);\r\n }\r\n }\r\n}", "import { Globals } from \"../../pp/globals.js\";\r\n\r\nlet _myConsoleOriginalLog = console.log;\r\nlet _myConsoleOriginalError = console.error;\r\nlet _myConsoleOriginalWarn = console.warn;\r\nlet _myConsoleOriginalInfo = console.info;\r\nlet _myConsoleOriginalDebug = console.debug;\r\nlet _myConsoleOriginalAssert = console.assert;\r\nlet _myConsoleOriginalClear = console.clear;\r\n\r\nexport function log(engine = Globals.getMainEngine(), ...args) {\r\n return ConsoleOriginalFunctions.getLog(engine).apply(console, args);\r\n}\r\n\r\nexport function error(engine = Globals.getMainEngine(), ...args) {\r\n return ConsoleOriginalFunctions.getError(engine).apply(console, args);\r\n}\r\n\r\nexport function warn(engine = Globals.getMainEngine(), ...args) {\r\n return ConsoleOriginalFunctions.getWarn(engine).apply(console, args);\r\n}\r\n\r\nexport function info(engine = Globals.getMainEngine(), ...args) {\r\n return ConsoleOriginalFunctions.getInfo(engine).apply(console, args);\r\n}\r\n\r\nexport function debug(engine = Globals.getMainEngine(), ...args) {\r\n return ConsoleOriginalFunctions.getDebug(engine).apply(console, args);\r\n}\r\n\r\nexport function assert(engine = Globals.getMainEngine(), ...args) {\r\n return ConsoleOriginalFunctions.getAssert(engine).apply(console, args);\r\n}\r\n\r\nexport function clear(engine = Globals.getMainEngine(), ...args) {\r\n return ConsoleOriginalFunctions.getClear(engine).apply(console, args);\r\n}\r\n\r\nexport function getLog(engine = Globals.getMainEngine()) {\r\n return _myConsoleOriginalLog;\r\n}\r\n\r\nexport function getError(engine = Globals.getMainEngine()) {\r\n return _myConsoleOriginalError;\r\n}\r\n\r\nexport function getWarn(engine = Globals.getMainEngine()) {\r\n return _myConsoleOriginalWarn;\r\n}\r\n\r\nexport function getInfo(engine = Globals.getMainEngine()) {\r\n return _myConsoleOriginalInfo;\r\n}\r\n\r\nexport function getDebug(engine = Globals.getMainEngine()) {\r\n return _myConsoleOriginalDebug;\r\n}\r\n\r\nexport function getAssert(engine = Globals.getMainEngine()) {\r\n return _myConsoleOriginalAssert;\r\n}\r\n\r\nexport function getClear(engine = Globals.getMainEngine()) {\r\n return _myConsoleOriginalClear;\r\n}\r\n\r\nexport let ConsoleOriginalFunctions = {\r\n log,\r\n error,\r\n warn,\r\n info,\r\n debug,\r\n assert,\r\n clear,\r\n getLog,\r\n getError,\r\n getWarn,\r\n getInfo,\r\n getDebug,\r\n getAssert,\r\n getClear\r\n};", "import { Globals } from \"../../pp/globals.js\";\r\nimport { ConsoleOriginalFunctions } from \"./console_original_functions.js\";\r\n\r\nexport class ConsoleVR {\r\n static myOriginalLog = ConsoleVR.prototype.log;\r\n static myOriginalError = ConsoleVR.prototype.error;\r\n static myOriginalWarn = ConsoleVR.prototype.warn;\r\n static myOriginalInfo = ConsoleVR.prototype.info;\r\n static myOriginalDebug = ConsoleVR.prototype.debug;\r\n static myOriginalAssert = ConsoleVR.prototype.assert;\r\n static myOriginalClear = ConsoleVR.prototype.clear;\r\n\r\n constructor(engine = Globals.getMainEngine()) {\r\n this._myEngine = engine;\r\n this._myForwardToBrowserConsole = true;\r\n }\r\n\r\n log(...args) {\r\n if (this._myForwardToBrowserConsole) {\r\n ConsoleOriginalFunctions.log(this._myEngine, ...args);\r\n }\r\n }\r\n\r\n error(...args) {\r\n if (this._myForwardToBrowserConsole) {\r\n ConsoleOriginalFunctions.error(this._myEngine, ...args);\r\n }\r\n }\r\n\r\n warn(...args) {\r\n if (this._myForwardToBrowserConsole) {\r\n ConsoleOriginalFunctions.warn(this._myEngine, ...args);\r\n }\r\n }\r\n\r\n info(...args) {\r\n if (this._myForwardToBrowserConsole) {\r\n ConsoleOriginalFunctions.info(this._myEngine, ...args);\r\n }\r\n }\r\n\r\n debug(...args) {\r\n if (this._myForwardToBrowserConsole) {\r\n ConsoleOriginalFunctions.debug(this._myEngine, ...args);\r\n }\r\n }\r\n\r\n assert(...args) {\r\n if (this._myForwardToBrowserConsole) {\r\n ConsoleOriginalFunctions.assert(this._myEngine, ...args);\r\n }\r\n }\r\n\r\n clear(...args) {\r\n if (this._myForwardToBrowserConsole) {\r\n ConsoleOriginalFunctions.clear(this._myEngine, ...args);\r\n }\r\n }\r\n\r\n setForwardToBrowserConsole(forwardToBrowserConsole) {\r\n this._myForwardToBrowserConsole = forwardToBrowserConsole;\r\n }\r\n\r\n isForwardToBrowserConsole() {\r\n return this._myForwardToBrowserConsole;\r\n }\r\n}", "import { Component, Property } from \"@wonderlandengine/api\";\r\nimport { Globals } from \"../../../pp/globals.js\";\r\nimport { EasyTuneVariables } from \"../easy_tune_variables.js\";\r\n\r\nexport class InitEasyTuneVariablesComponent extends Component {\r\n static TypeName = \"pp-init-easy-tune-variables\";\r\n static Properties = {\r\n _myInit: Property.bool(true)\r\n };\r\n\r\n init() {\r\n this._myEasyTuneVariables = null;\r\n\r\n if (this._myInit) {\r\n this._myEasyTuneVariables = new EasyTuneVariables();\r\n }\r\n }\r\n\r\n onActivate() {\r\n if (this._myEasyTuneVariables != null && !Globals.hasEasyTuneVariables(this.engine)) {\r\n Globals.setEasyTuneVariables(this._myEasyTuneVariables, this.engine);\r\n }\r\n }\r\n\r\n onDeactivate() {\r\n if (this._myEasyTuneVariables != null && Globals.getEasyTuneVariables(this.engine) == this._myEasyTuneVariables) {\r\n Globals.removeEasyTuneVariables(this.engine);\r\n }\r\n }\r\n}", "import { EasyTuneVariable, EasyTuneVariableTyped } from \"./easy_tune_variable_types.js\";\r\n\r\nexport class EasyTuneVariables {\r\n\r\n private readonly _myVariables: Map = new Map();\r\n\r\n public add(variable: EasyTuneVariable, overwriteCurrentOne = false): void {\r\n if (overwriteCurrentOne || !this._myVariables.has(variable.getName())) {\r\n this._myVariables.set(variable.getName(), variable);\r\n }\r\n }\r\n\r\n public remove(variableName: string): void {\r\n this._myVariables.delete(variableName);\r\n }\r\n\r\n public get(variableName: string): Readonly | null {\r\n const variable = this._myVariables.get(variableName);\r\n if (variable != null) {\r\n return variable.getValue() as ValueType;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n public set(variableName: string, value: Readonly, resetDefaultValue: boolean = false, skipValueChangedNotify: boolean = false): void {\r\n const variable = this._myVariables.get(variableName);\r\n if (variable != null) {\r\n variable.setValue(value, resetDefaultValue, skipValueChangedNotify);\r\n }\r\n }\r\n\r\n public has(variableName: string): boolean {\r\n return this._myVariables.has(variableName);\r\n }\r\n\r\n public length(): number {\r\n return this._myVariables.size;\r\n }\r\n\r\n public isWidgetCurrentVariable(variableName: string): boolean {\r\n const variable = this._myVariables.get(variableName);\r\n if (variable != null) {\r\n return variable.isWidgetCurrentVariable();\r\n }\r\n\r\n return false;\r\n }\r\n\r\n public getEasyTuneVariable(variableName: string): EasyTuneVariableType | null {\r\n return this._myVariables.get(variableName) as EasyTuneVariableType ?? null;\r\n }\r\n\r\n public getEasyTuneVariablesList(): EasyTuneVariable[] {\r\n return Array.from(this._myVariables.values());\r\n }\r\n\r\n public getEasyTuneVariablesNames(): string[] {\r\n return Array.from(this._myVariables.keys());\r\n }\r\n\r\n public changeEasyTuneVariableName(oldName: string, newName: string): void {\r\n const variableToChange = this._myVariables.get(oldName);\r\n if (variableToChange != null) {\r\n const oldVariables = new Map(this._myVariables);\r\n this._myVariables.clear();\r\n for (const [name, variable] of oldVariables) {\r\n if (name != oldName) {\r\n this._myVariables.set(name, variable);\r\n } else {\r\n this._myVariables.set(newName, variable);\r\n }\r\n }\r\n\r\n variableToChange.setName(newName);\r\n }\r\n }\r\n\r\n public fromJSON(json: string, resetDefaultValue: boolean = false, skipValueChangedNotify: boolean = false, manualImport: boolean = false): void {\r\n const objectJSON = JSON.parse(json);\r\n\r\n for (const variable of this._myVariables.values()) {\r\n if ((variable.isManualImportEnabled() && manualImport) || (variable.isAutoImportEnabled() && !manualImport)) {\r\n const variableName = variable.getName();\r\n if (Object.hasOwn(objectJSON, variableName)) {\r\n const variableValueJSON = objectJSON[variableName];\r\n variable.fromJSON(variableValueJSON, resetDefaultValue, skipValueChangedNotify);\r\n }\r\n }\r\n }\r\n }\r\n\r\n public toJSON(excludeVariablesWithValueAsDefault: boolean = false): string {\r\n const objectJSON: Record = {};\r\n\r\n for (const variable of this._myVariables.values()) {\r\n if (variable.isExportEnabled()) {\r\n if (!excludeVariablesWithValueAsDefault || !variable.isValueEqual(variable.getDefaultValue())) {\r\n objectJSON[variable.getName()] = variable.toJSON();\r\n }\r\n }\r\n }\r\n\r\n return JSON.stringify(objectJSON);\r\n }\r\n\r\n /**\r\n * @param id if `undefined` is used as id, it will overwrite the default variable listener\r\n */\r\n public registerValueChangedEventListener>(variableName: string, id: unknown, callback: (value: ValueType, easyTuneVariable: EasyTuneVariableType) => void): void {\r\n this._myVariables.get(variableName)!.registerValueChangedEventListener(id, callback as (value: unknown, easyTuneVariable: EasyTuneVariable) => void);\r\n }\r\n\r\n /**\r\n * @param id if `undefined` is used as id, it will unregister the default variable listener\r\n */\r\n public unregisterValueChangedEventListener(variableName: string, id?: unknown): void {\r\n this._myVariables.get(variableName)!.unregisterValueChangedEventListener(id);\r\n }\r\n}", "import { ARCamera8thwall, Cursor, CursorTarget, DebugObject, DeviceOrientationLook, FingerCursor, FixedFoveation, HandTracking, HitTestLocation, HowlerAudioListener, HowlerAudioSource, ImageTexture, MouseLookComponent, PlayerHeight, TargetFramerate, TeleportComponent, Trail, TwoJointIkSolver, VideoTexture, VrModeActiveSwitch, Vrm, WasdControlsComponent } from \"@wonderlandengine/components\";\r\n\r\nexport function registerWLComponents(engine) {\r\n engine.registerComponent(\r\n ARCamera8thwall,\r\n Cursor,\r\n CursorTarget,\r\n DebugObject,\r\n DeviceOrientationLook,\r\n FingerCursor,\r\n FixedFoveation,\r\n HandTracking,\r\n HitTestLocation,\r\n HowlerAudioListener,\r\n HowlerAudioSource,\r\n ImageTexture,\r\n MouseLookComponent,\r\n PlayerHeight,\r\n TargetFramerate,\r\n TeleportComponent,\r\n Trail,\r\n TwoJointIkSolver,\r\n VideoTexture,\r\n VrModeActiveSwitch,\r\n Vrm,\r\n WasdControlsComponent\r\n );\r\n}", "import { ArrayUtils } from \"./array/array_utils.js\";\r\n\r\nexport function getObjectPrototypes(object) {\r\n let prototypes = [];\r\n\r\n prototypes.push(object);\r\n\r\n let objectProto = Object.getPrototypeOf(object);\r\n while (objectProto != null) {\r\n ArrayUtils.pushUnique(prototypes, objectProto);\r\n objectProto = Object.getPrototypeOf(objectProto);\r\n }\r\n\r\n let prototypesToCheck = [object];\r\n while (prototypesToCheck.length > 0) {\r\n let prototypeToCheck = prototypesToCheck.shift();\r\n if (prototypeToCheck != null) {\r\n ArrayUtils.pushUnique(prototypes, prototypeToCheck);\r\n\r\n ArrayUtils.pushUnique(prototypesToCheck, Object.getPrototypeOf(prototypeToCheck));\r\n\r\n try {\r\n ArrayUtils.pushUnique(prototypesToCheck, prototypeToCheck.prototype);\r\n } catch (error) {\r\n // Ignored\r\n }\r\n }\r\n }\r\n\r\n return prototypes;\r\n}\r\n\r\nexport function getObjectPropertyNames(object) {\r\n let propertyNames = [];\r\n\r\n let prototypes = JSUtils.getObjectPrototypes(object);\r\n\r\n for (let prototype of prototypes) {\r\n if (prototype != null) {\r\n let ownPropertyNames = Object.getOwnPropertyNames(prototype);\r\n for (let ownPropertyName of ownPropertyNames) {\r\n ArrayUtils.pushUnique(propertyNames, ownPropertyName);\r\n }\r\n }\r\n }\r\n\r\n return propertyNames;\r\n}\r\n\r\nexport function getObjectPropertyDescriptor(object, propertyName) {\r\n let propertyDescriptor = null;\r\n\r\n let propertyParent = JSUtils.getObjectPropertyOwnParent(object, propertyName);\r\n\r\n if (propertyParent != null) {\r\n propertyDescriptor = Object.getOwnPropertyDescriptor(propertyParent, propertyName);\r\n }\r\n\r\n return propertyDescriptor;\r\n}\r\n\r\nexport function getObjectProperty(object, propertyName) {\r\n let property = undefined;\r\n\r\n let propertyDescriptor = JSUtils.getObjectPropertyDescriptor(object, propertyName);\r\n if (propertyDescriptor != null) {\r\n if (propertyDescriptor.get != null) {\r\n property = propertyDescriptor.get.bind(object)();\r\n } else {\r\n property = propertyDescriptor.value;\r\n }\r\n }\r\n\r\n return property;\r\n}\r\n\r\nexport function setObjectProperty(valueToSet, object, propertyName) {\r\n let propertyDescriptor = JSUtils.getObjectPropertyDescriptor(object, propertyName);\r\n\r\n let setUsed = false;\r\n if (propertyDescriptor != null) {\r\n if (propertyDescriptor.set != null) {\r\n setUsed = true;\r\n\r\n propertyDescriptor.set.bind(object)(valueToSet);\r\n }\r\n }\r\n\r\n if (!setUsed) {\r\n let propertyParent = JSUtils.getObjectPropertyOwnParent(object, propertyName);\r\n if (propertyParent == null) {\r\n propertyParent = object;\r\n }\r\n\r\n Object.defineProperty(propertyParent, propertyName, {\r\n value: valueToSet\r\n });\r\n }\r\n}\r\n\r\nexport function getObjectPropertyOwnParent(object, propertyName) {\r\n let parent = null;\r\n\r\n let parents = JSUtils.getObjectPropertyOwnParents(object, propertyName);\r\n if (parents.length > 0) {\r\n parent = parents[0];\r\n }\r\n\r\n return parent;\r\n}\r\n\r\nexport function getObjectPropertyOwnParents(object, propertyName) {\r\n let parents = [];\r\n\r\n let possibleParents = JSUtils.getObjectPrototypes(object);\r\n\r\n for (let possibleParent of possibleParents) {\r\n let propertyNames = Object.getOwnPropertyNames(possibleParent);\r\n if (ArrayUtils.hasEqual(propertyNames, propertyName)) {\r\n parents.push(possibleParent);\r\n }\r\n }\r\n\r\n return parents;\r\n}\r\n\r\nexport function getObjectFromPath(path, pathStartObject = window) {\r\n let object = null;\r\n\r\n let objectName = JSUtils.getObjectNameFromPath(path);\r\n if (objectName != null) {\r\n object = JSUtils.getObjectProperty(JSUtils.getObjectParentFromPath(path, pathStartObject), objectName);\r\n }\r\n\r\n return object;\r\n}\r\n\r\nexport function getObjectNameFromPath(path) {\r\n let objectName = null;\r\n\r\n if (path != null) {\r\n let pathSplit = path.split(\".\");\r\n if (pathSplit.length > 0) {\r\n objectName = pathSplit[pathSplit.length - 1];\r\n }\r\n }\r\n\r\n return objectName;\r\n}\r\n\r\nexport function getObjectParentFromPath(path, pathStartObject = window) {\r\n let pathSplit = path.split(\".\");\r\n let currentParent = pathStartObject;\r\n for (let i = 0; i < pathSplit.length - 1; i++) {\r\n currentParent = JSUtils.getObjectProperty(currentParent, pathSplit[i]);\r\n }\r\n\r\n return currentParent;\r\n}\r\n\r\nexport function overwriteObjectProperty(newProperty, object, propertyName, overwriteOnOwnParent = true, jsObjectFunctionsSpecialOverwrite = false, logEnabled = false) {\r\n let success = false;\r\n\r\n try {\r\n let propertyOwnParent = JSUtils.getObjectPropertyOwnParent(object, propertyName);\r\n if (propertyOwnParent != null) {\r\n let originalPropertyDescriptor = Object.getOwnPropertyDescriptor(propertyOwnParent, propertyName);\r\n\r\n if (originalPropertyDescriptor != null) {\r\n let originalProperty = JSUtils.getObjectProperty(propertyOwnParent, propertyName);\r\n JSUtils.copyObjectProperties(originalProperty, newProperty, true, jsObjectFunctionsSpecialOverwrite, logEnabled);\r\n\r\n let overwriteTarget = object;\r\n if (overwriteOnOwnParent) {\r\n overwriteTarget = propertyOwnParent;\r\n }\r\n\r\n Object.defineProperty(overwriteTarget, propertyName, {\r\n value: newProperty,\r\n enumerable: originalPropertyDescriptor.enumerable,\r\n writable: originalPropertyDescriptor.writable,\r\n configurable: originalPropertyDescriptor.configurable\r\n });\r\n\r\n success = true;\r\n } else {\r\n Object.defineProperty(object, propertyName, {\r\n value: newProperty\r\n });\r\n\r\n success = true;\r\n }\r\n } else {\r\n Object.defineProperty(object, propertyName, {\r\n value: newProperty\r\n });\r\n\r\n success = true;\r\n }\r\n } catch (error) {\r\n if (logEnabled) {\r\n console.error(\"Property:\", propertyName, \"of:\", object, \"can't be overwritten.\");\r\n }\r\n }\r\n\r\n return success;\r\n}\r\n\r\nexport function copyObjectProperties(fromObject, toObject, cleanCopy = false, jsObjectFunctionsSpecialCopy = false, logEnabled = false) {\r\n if (fromObject != null) {\r\n if (cleanCopy) {\r\n JSUtils.cleanObjectProperties(toObject);\r\n }\r\n\r\n Object.setPrototypeOf(toObject, Object.getPrototypeOf(fromObject));\r\n\r\n let fromObjectPropertyNames = Object.getOwnPropertyNames(fromObject);\r\n for (let fromObjectPropertyName of fromObjectPropertyNames) {\r\n try {\r\n let fromObjectPropertyDescriptor = Object.getOwnPropertyDescriptor(fromObject, fromObjectPropertyName);\r\n\r\n Object.defineProperty(toObject, fromObjectPropertyName, {\r\n value: fromObjectPropertyDescriptor.value,\r\n enumerable: fromObjectPropertyDescriptor.enumerable,\r\n writable: fromObjectPropertyDescriptor.writable,\r\n configurable: fromObjectPropertyDescriptor.configurable\r\n });\r\n } catch (error) {\r\n if (logEnabled) {\r\n console.error(\"Property:\", fromObjectPropertyName, \"of:\", fromObject.name, \"can't be overwritten.\");\r\n }\r\n }\r\n }\r\n\r\n if (jsObjectFunctionsSpecialCopy) {\r\n _jsObjectFunctionsSpecialCopy(fromObject, toObject);\r\n }\r\n }\r\n}\r\n\r\nexport function cleanObjectProperties(object) {\r\n let objectNames = Object.getOwnPropertyNames(object);\r\n ArrayUtils.pushUnique(objectNames, \"__proto__\");\r\n\r\n for (let objectName of objectNames) {\r\n try {\r\n Object.defineProperty(object, objectName, {\r\n value: undefined\r\n });\r\n } catch (error) {\r\n // Ignored\r\n }\r\n\r\n try {\r\n delete object[objectName];\r\n } catch (error) {\r\n // Ignored\r\n }\r\n }\r\n\r\n Object.setPrototypeOf(object, null);\r\n}\r\n\r\nexport function doesObjectPropertyUseAccessors(object, propertyName) {\r\n let propertyUseAccessors = false;\r\n\r\n let propertyDescriptor = JSUtils.getObjectPropertyDescriptor(object, propertyName);\r\n\r\n if (propertyDescriptor != null && (propertyDescriptor.get != null || propertyDescriptor.set != null)) {\r\n propertyUseAccessors = true;\r\n }\r\n\r\n return propertyUseAccessors;\r\n}\r\n\r\nexport function isFunctionByName(functionParent, functionName) {\r\n let isFunctionResult = false;\r\n\r\n let functionProperty = JSUtils.getObjectProperty(functionParent, functionName);\r\n if (functionProperty != null) {\r\n isFunctionResult = JSUtils.isFunction(functionProperty);\r\n }\r\n\r\n return isFunctionResult;\r\n}\r\n\r\nexport function isClassByName(classParent, className) {\r\n let isClassResult = false;\r\n\r\n let classProperty = JSUtils.getObjectProperty(classParent, className);\r\n if (classProperty != null) {\r\n isClassResult = JSUtils.isClass(classProperty);\r\n }\r\n\r\n return isClassResult;\r\n}\r\n\r\nexport function isObjectByName(objectParent, objectName) {\r\n let isObjectResult = false;\r\n\r\n let objectProperty = JSUtils.getObjectProperty(objectParent, objectName);\r\n if (objectProperty != null) {\r\n isObjectResult = JSUtils.isObject(objectProperty);\r\n }\r\n\r\n return isObjectResult;\r\n}\r\n\r\nexport function isFunction(property) {\r\n return typeof property == \"function\" && !JSUtils.isClass(property);\r\n}\r\n\r\nexport let isClass = function () {\r\n let checkClassRegex = new RegExp(\"^class\");\r\n return function isClass(property) {\r\n return typeof property == \"function\" &&\r\n property.prototype != null && typeof property.prototype.constructor == \"function\" &&\r\n property.toString != null && typeof property.toString == \"function\" && property.toString()?.match(checkClassRegex) != null;\r\n };\r\n}();\r\n\r\nexport function isObject(property) {\r\n return typeof property == \"object\";\r\n}\r\n\r\nexport let JSUtils = {\r\n getObjectPrototypes,\r\n getObjectPropertyNames,\r\n getObjectPropertyDescriptor,\r\n getObjectProperty,\r\n setObjectProperty,\r\n getObjectPropertyOwnParent,\r\n getObjectPropertyOwnParents,\r\n getObjectFromPath,\r\n getObjectNameFromPath,\r\n getObjectParentFromPath,\r\n overwriteObjectProperty,\r\n copyObjectProperties,\r\n cleanObjectProperties,\r\n doesObjectPropertyUseAccessors,\r\n isFunctionByName,\r\n isClassByName,\r\n isObjectByName,\r\n isFunction,\r\n isClass,\r\n isObject\r\n};\r\n\r\n\r\n\r\nfunction _jsObjectFunctionsSpecialCopy(fromObject, toObject) {\r\n try {\r\n if (typeof toObject == \"function\" && typeof fromObject == \"function\") {\r\n let functionsToOverwrite = [\"toString\", \"toLocaleString\", \"valueOf\"];\r\n\r\n for (let functionToOverwrite of functionsToOverwrite) {\r\n let propertyDescriptorToOverwrite = JSUtils.getObjectPropertyDescriptor(fromObject, functionToOverwrite);\r\n\r\n if (propertyDescriptorToOverwrite != null && propertyDescriptorToOverwrite.value != null &&\r\n (propertyDescriptorToOverwrite.value == Object[functionToOverwrite])) {\r\n let valueToReturn = Object[functionToOverwrite].bind(fromObject)();\r\n let overwrittenFunction = function () { return valueToReturn; };\r\n JSUtils.overwriteObjectProperty(overwrittenFunction, toObject, functionToOverwrite, false, false);\r\n }\r\n }\r\n }\r\n } catch (error) {\r\n // Ignored\r\n }\r\n}", "import { JSUtils } from \"../../cauldron/utils/js_utils.js\";\r\n\r\nexport function injectOwnProperties(fromReference: T, toReference: object, enumerable: boolean = true, writable: boolean = true, configurable: boolean = true, keepOriginalDescriptorAttributes: boolean = true, bindThisAsFirstParam: boolean = false, prefix?: string, functionNamesToExclude: Readonly = []): void {\r\n const ownPropertyNames = Object.getOwnPropertyNames(fromReference);\r\n const fromReferenceAsRecord = fromReference as Record;\r\n for (const ownPropertyName of ownPropertyNames) {\r\n if (functionNamesToExclude.includes(ownPropertyName)) continue;\r\n\r\n let enumerableToUse: boolean | undefined = enumerable;\r\n let writableToUse: boolean | undefined = writable;\r\n let configurableToUse: boolean | undefined = configurable;\r\n\r\n if (keepOriginalDescriptorAttributes) {\r\n const originalDescriptor = Object.getOwnPropertyDescriptor(toReference, ownPropertyName);\r\n if (originalDescriptor != null) {\r\n enumerableToUse = originalDescriptor.enumerable;\r\n writableToUse = originalDescriptor.writable;\r\n configurableToUse = originalDescriptor.configurable;\r\n }\r\n }\r\n\r\n let adjustedPropertyName = ownPropertyName;\r\n if (prefix != null) {\r\n if (adjustedPropertyName.length > 0 && adjustedPropertyName[0] == adjustedPropertyName[0].toUpperCase()) {\r\n adjustedPropertyName = prefix.toUpperCase() + adjustedPropertyName;\r\n } else {\r\n adjustedPropertyName = prefix + adjustedPropertyName;\r\n }\r\n }\r\n\r\n const propertyDescriptor = Object.getOwnPropertyDescriptor(fromReference, ownPropertyName);\r\n const useAccessors = propertyDescriptor != null && (propertyDescriptor.get != null || propertyDescriptor.set != null);\r\n\r\n if (!useAccessors) {\r\n let adjustedProperyValue = fromReferenceAsRecord[ownPropertyName];\r\n\r\n if (bindThisAsFirstParam && JSUtils.isFunction(adjustedProperyValue)) {\r\n const originalFunction = fromReferenceAsRecord[ownPropertyName] as (this: unknown, ...args: unknown[]) => unknown;\r\n adjustedProperyValue = function (this: unknown, ...args: unknown[]) {\r\n return originalFunction(this, ...args);\r\n };\r\n\r\n Object.defineProperty(adjustedProperyValue, \"name\", {\r\n value: adjustedPropertyName\r\n });\r\n }\r\n\r\n Object.defineProperty(toReference, adjustedPropertyName, {\r\n value: adjustedProperyValue,\r\n enumerable: enumerableToUse,\r\n writable: writableToUse,\r\n configurable: configurableToUse\r\n });\r\n } else {\r\n Object.defineProperty(toReference, adjustedPropertyName, {\r\n get: propertyDescriptor.get,\r\n set: propertyDescriptor.set,\r\n enumerable: enumerableToUse,\r\n configurable: configurableToUse\r\n });\r\n }\r\n }\r\n}\r\n\r\nexport const PluginUtils = {\r\n injectOwnProperties\r\n} as const;", "export const ARRAY_LIKE_CLASSES = [\r\n Array,\r\n Uint8ClampedArray,\r\n Uint8Array,\r\n Uint16Array,\r\n Uint32Array,\r\n Int8Array,\r\n Int16Array,\r\n Int32Array,\r\n Float32Array,\r\n Float64Array\r\n] as const;\r\n\r\nexport const MUTABLE_ARRAY_LIKE_CLASSES = [\r\n Array\r\n] as const;\r\n\r\nexport const ArrayExtensionUtils = {\r\n ARRAY_LIKE_CLASSES,\r\n MUTABLE_ARRAY_LIKE_CLASSES\r\n} as const;", "import { ArrayLike, DynamicArrayLike } from \"../../../../cauldron/type_definitions/array_type_definitions.js\";\r\nimport { ArrayUtils } from \"../../../../cauldron/utils/array/array_utils.js\";\r\nimport { PluginUtils } from \"../../../utils/plugin_utils.js\";\r\nimport { ArrayExtensionUtils } from \"./array_extension_utils.js\";\r\nimport { ArrayLikeExtension, DynamicArrayLikeOwnExtension } from \"./array_type_extension.js\";\r\n\r\nimport \"./array_type_extension.js\";\r\n\r\nexport function initArrayExtension(): void {\r\n _initArrayLikeExtensionProtoypes();\r\n _initDynamicArrayOwnExtensionProtoype();\r\n}\r\n\r\nfunction _initArrayLikeExtensionProtoypes(): void {\r\n\r\n const arrayLikeExtension: ArrayLikeExtension, any> = {\r\n\r\n pp_copy, T>(this: ArrayType, array: Readonly>, copyCallback?: (arrayElement: T, thisElement: T) => T): ArrayType {\r\n return ArrayUtils.copy(array, this, copyCallback);\r\n },\r\n\r\n pp_clone, T>(this: Readonly, cloneCallback?: (elementToClone: T) => T): ArrayType {\r\n return ArrayUtils.clone(this, cloneCallback);\r\n },\r\n\r\n pp_equals(this: Readonly>, array: Readonly>, elementsEqualCallback?: (thisElement: T, arrayElement: T) => boolean): boolean {\r\n return ArrayUtils.equals(this, array, elementsEqualCallback);\r\n },\r\n\r\n pp_first(this: Readonly>): T | undefined {\r\n return ArrayUtils.first(this);\r\n },\r\n\r\n pp_last(this: Readonly>): T | undefined {\r\n return ArrayUtils.last(this);\r\n },\r\n\r\n pp_has(this: Readonly>, callback: (elementToCheck: T, elementIndex: number) => boolean): boolean {\r\n return ArrayUtils.has(this, callback);\r\n },\r\n\r\n pp_hasEqual(this: Readonly>, elementToFind: T, elementsEqualCallback?: (elementToCheck: T, elementToFind: T) => boolean): boolean {\r\n return ArrayUtils.hasEqual(this, elementToFind, elementsEqualCallback);\r\n },\r\n\r\n pp_find(this: Readonly>, callback: (elementToCheck: T, elementIndex: number) => boolean): T | undefined {\r\n return ArrayUtils.find(this, callback);\r\n },\r\n\r\n pp_findIndex(this: Readonly>, callback: (elementToCheck: T, elementIndex: number) => boolean): number {\r\n return ArrayUtils.findIndex(this, callback);\r\n },\r\n\r\n pp_findAll(this: Readonly>, callback: (elementToCheck: T, elementIndex: number) => boolean): T[] {\r\n return ArrayUtils.findAll(this, callback);\r\n },\r\n\r\n pp_findAllIndexes(this: Readonly>, callback: (elementToCheck: T, elementIndex: number) => boolean): number[] {\r\n return ArrayUtils.findAllIndexes(this, callback);\r\n },\r\n\r\n pp_findEqual(this: Readonly>, elementToFind: T, elementsEqualCallback?: (elementToCheck: T, elementToFind: T) => boolean): T | undefined {\r\n return ArrayUtils.findEqual(this, elementToFind, elementsEqualCallback);\r\n },\r\n\r\n pp_findAllEqual(this: Readonly>, elementToFind: T, elementsEqualCallback?: (elementToCheck: T, elementToFind: T) => boolean): T[] {\r\n return ArrayUtils.findAllEqual(this, elementToFind, elementsEqualCallback);\r\n },\r\n\r\n pp_findIndexEqual(this: Readonly>, elementToFind: T, elementsEqualCallback?: (elementToCheck: T, elementToFind: T) => boolean): number {\r\n return ArrayUtils.findIndexEqual(this, elementToFind, elementsEqualCallback);\r\n },\r\n\r\n pp_findAllIndexesEqual(this: Readonly>, elementToFind: T, elementsEqualCallback?: (elementToCheck: T, elementToFind: T) => boolean): number[] {\r\n return ArrayUtils.findAllIndexesEqual(this, elementToFind, elementsEqualCallback);\r\n }\r\n };\r\n\r\n for (const arrayLikeClassToExtend of ArrayExtensionUtils.ARRAY_LIKE_CLASSES) {\r\n PluginUtils.injectOwnProperties(arrayLikeExtension, arrayLikeClassToExtend.prototype, false, true, true);\r\n }\r\n}\r\n\r\nfunction _initDynamicArrayOwnExtensionProtoype(): void {\r\n\r\n const dynamicArrayOwnExtension: DynamicArrayLikeOwnExtension, any> = {\r\n\r\n pp_remove(this: DynamicArrayLike, callback: (elementToCheck: T, elementIndex: number) => boolean): T | undefined {\r\n return ArrayUtils.remove(this, callback);\r\n },\r\n\r\n pp_removeIndex(this: DynamicArrayLike, index: number): T | undefined {\r\n return ArrayUtils.removeIndex(this, index);\r\n },\r\n\r\n pp_removeAll(this: DynamicArrayLike, callback: (elementToCheck: T, elementIndex: number) => boolean): T[] {\r\n return ArrayUtils.removeAll(this, callback);\r\n },\r\n\r\n pp_removeAllIndexes(this: DynamicArrayLike, indexes: ArrayLike): T[] {\r\n return ArrayUtils.removeAllIndexes(this, indexes);\r\n },\r\n\r\n pp_removeEqual(this: DynamicArrayLike, elementToRemove: T, elementsEqualCallback?: (elementToCheck: T, elementToRemove: T) => boolean): T | undefined {\r\n return ArrayUtils.removeEqual(this, elementToRemove, elementsEqualCallback);\r\n },\r\n\r\n pp_removeAllEqual(this: DynamicArrayLike, elementToRemove: T, elementsEqualCallback?: (elementToCheck: T, elementToRemove: T) => boolean): T[] {\r\n return ArrayUtils.removeAllEqual(this, elementToRemove, elementsEqualCallback);\r\n },\r\n\r\n pp_clear, T>(this: ArrayType): ArrayType {\r\n return ArrayUtils.clear(this);\r\n },\r\n\r\n pp_pushUnique(this: DynamicArrayLike, elementToAdd: T, elementsEqualCallback?: (elementToCheck: T, elementToAdd: T) => boolean): number {\r\n return ArrayUtils.pushUnique(this, elementToAdd, elementsEqualCallback);\r\n },\r\n\r\n pp_unshiftUnique(this: DynamicArrayLike, elementToAdd: T, elementsEqualCallback?: (elementToCheck: T, elementToAdd: T) => boolean): number {\r\n return ArrayUtils.unshiftUnique(this, elementToAdd, elementsEqualCallback);\r\n }\r\n };\r\n\r\n for (const dynamicArrayLikeClassToExtend of ArrayExtensionUtils.MUTABLE_ARRAY_LIKE_CLASSES) {\r\n PluginUtils.injectOwnProperties(dynamicArrayOwnExtension, dynamicArrayLikeClassToExtend.prototype, false, true, true);\r\n }\r\n}", "import { Matrix3, Quaternion, Vector3 } from \"../../../../cauldron/type_definitions/array_type_definitions.js\";\r\nimport { Mat3Utils } from \"../../../../cauldron/utils/array/mat3_utils.js\";\r\nimport { PluginUtils } from \"../../../utils/plugin_utils.js\";\r\nimport { ArrayExtensionUtils } from \"./array_extension_utils.js\";\r\nimport { Matrix3Extension } from \"./mat3_type_extension.js\";\r\n\r\nimport \"./mat3_type_extension.js\";\r\n\r\nexport function initMat3Extension(): void {\r\n _initMat3ExtensionProtoype();\r\n}\r\n\r\nfunction _initMat3ExtensionProtoype(): void {\r\n\r\n const mat3Extension: Matrix3Extension = {\r\n\r\n mat3_set(this: T,\r\n m00: number, m01?: number, m02?: number,\r\n m10?: number, m11?: number, m12?: number,\r\n m20?: number, m21?: number, m22?: number): T {\r\n return Mat3Utils.set(this,\r\n m00, m01!, m02!,\r\n m10!, m11!, m12!,\r\n m20!, m21!, m22!\r\n );\r\n },\r\n\r\n mat3_copy(this: T, matrix: Readonly): T {\r\n return Mat3Utils.copy(matrix, this);\r\n },\r\n\r\n mat3_clone(this: Readonly): T {\r\n return Mat3Utils.clone(this);\r\n },\r\n\r\n mat3_equals(this: Readonly, matrix: Readonly, epsilon?: number): boolean {\r\n return Mat3Utils.equals(this, matrix, epsilon);\r\n },\r\n\r\n mat3_toDegrees(this: Readonly, out?: Vector3 | U): Vector3 | U {\r\n return Mat3Utils.toDegrees(this, out!);\r\n },\r\n\r\n mat3_toRadians(this: Readonly, out?: Vector3 | U): Vector3 | U {\r\n return Mat3Utils.toRadians(this, out!);\r\n },\r\n\r\n mat3_toQuat(this: Readonly, out?: Quaternion | U): Quaternion | U {\r\n return Mat3Utils.toQuat(this, out!);\r\n },\r\n\r\n mat3_fromAxes(this: T, left: Readonly, up: Readonly, forward: Readonly): T {\r\n return Mat3Utils.fromAxes(left, up, forward, this);\r\n }\r\n };\r\n\r\n for (const arrayLikeClassToExtend of ArrayExtensionUtils.ARRAY_LIKE_CLASSES) {\r\n PluginUtils.injectOwnProperties(mat3Extension, arrayLikeClassToExtend.prototype, false, true, true);\r\n }\r\n}", "import { Matrix4, Quaternion, Quaternion2, Vector3 } from \"../../../../cauldron/type_definitions/array_type_definitions.js\";\r\nimport { Mat4Utils } from \"../../../../cauldron/utils/array/mat4_utils.js\";\r\nimport { PluginUtils } from \"../../../utils/plugin_utils.js\";\r\nimport { ArrayExtensionUtils } from \"./array_extension_utils.js\";\r\nimport { Matrix4Extension } from \"./mat4_type_extension.js\";\r\n\r\nimport \"./mat4_type_extension.js\";\r\n\r\nexport function initMat4Extension(): void {\r\n _initMat4ExtensionProtoype();\r\n}\r\n\r\nfunction _initMat4ExtensionProtoype(): void {\r\n\r\n const matrix4Extension: Matrix4Extension = {\r\n\r\n mat4_set(this: T,\r\n m00: number, m01?: number, m02?: number, m03?: number,\r\n m10?: number, m11?: number, m12?: number, m13?: number,\r\n m20?: number, m21?: number, m22?: number, m23?: number,\r\n m30?: number, m31?: number, m32?: number, m33?: number): T {\r\n return Mat4Utils.set(this,\r\n m00, m01!, m02!, m03!,\r\n m10!, m11!, m12!, m13!,\r\n m20!, m21!, m22!, m23!,\r\n m30!, m31!, m32!, m33!\r\n );\r\n },\r\n\r\n mat4_copy(this: T, matrix: Readonly): T {\r\n return Mat4Utils.copy(matrix, this);\r\n },\r\n\r\n mat4_clone(this: Readonly): T {\r\n return Mat4Utils.clone(this);\r\n },\r\n\r\n mat4_equals(this: Readonly, matrix: Readonly, epsilon?: number): boolean {\r\n return Mat4Utils.equals(this, matrix, epsilon);\r\n },\r\n\r\n mat4_identity(this: T): T {\r\n return Mat4Utils.identity(this);\r\n },\r\n\r\n mat4_invert(this: Readonly, out?: T | U): T | U {\r\n return Mat4Utils.invert(this, out!);\r\n },\r\n\r\n mat4_mul(this: Readonly, matrix: Readonly, out?: T | U): T | U {\r\n return Mat4Utils.mul(this, matrix, out!);\r\n },\r\n\r\n mat4_scale(this: Readonly, vector: Readonly, out?: T | U): T | U {\r\n return Mat4Utils.scale(this, vector, out!);\r\n },\r\n\r\n mat4_getPosition(this: Readonly, out?: Vector3): Vector3 | T {\r\n return Mat4Utils.getPosition(this, out!);\r\n },\r\n\r\n mat4_getRotation(this: Readonly, out?: Vector3): Vector3 | T {\r\n return Mat4Utils.getRotation(this, out!);\r\n },\r\n\r\n mat4_getRotationDegrees(this: Readonly, out?: Vector3): Vector3 | T {\r\n return Mat4Utils.getRotationDegrees(this, out!);\r\n },\r\n\r\n mat4_getRotationRadians(this: Readonly, out?: Vector3): Vector3 | T {\r\n return Mat4Utils.getRotationRadians(this, out!);\r\n },\r\n\r\n mat4_getRotationQuat(this: Readonly, out?: Quaternion | T): Quaternion | T {\r\n return Mat4Utils.getRotationQuat(this, out!);\r\n },\r\n\r\n mat4_getScale(this: Readonly, out?: Vector3): Vector3 | T {\r\n return Mat4Utils.getScale(this, out!);\r\n },\r\n\r\n mat4_setPosition(this: T, position: Readonly): T {\r\n return Mat4Utils.setPosition(this, position);\r\n },\r\n\r\n mat4_setRotation(this: T, rotation: Readonly): T {\r\n return Mat4Utils.setRotation(this, rotation);\r\n },\r\n\r\n mat4_setRotationDegrees(this: T, rotation: Readonly): T {\r\n return Mat4Utils.setRotationDegrees(this, rotation);\r\n },\r\n\r\n mat4_setRotationRadians(this: T, rotation: Readonly): T {\r\n return Mat4Utils.setRotationRadians(this, rotation);\r\n },\r\n\r\n mat4_setRotationQuat(this: T, rotation: Readonly): T {\r\n return Mat4Utils.setRotationQuat(this, rotation);\r\n },\r\n\r\n mat4_setScale(this: T, scale: Readonly): T {\r\n return Mat4Utils.setScale(this, scale);\r\n },\r\n\r\n mat4_setPositionRotationScale(this: T, position: Readonly, rotation: Readonly, scale: Readonly): T {\r\n return Mat4Utils.setPositionRotationScale(this, position, rotation, scale);\r\n },\r\n\r\n mat4_setPositionRotationDegreesScale(this: T, position: Readonly, rotation: Readonly, scale: Readonly): T {\r\n return Mat4Utils.setPositionRotationDegreesScale(this, position, rotation, scale);\r\n },\r\n\r\n mat4_setPositionRotationRadiansScale(this: T, position: Readonly, rotation: Readonly, scale: Readonly): T {\r\n return Mat4Utils.setPositionRotationRadiansScale(this, position, rotation, scale);\r\n },\r\n\r\n mat4_setPositionRotationQuatScale(this: T, position: Readonly, rotation: Readonly, scale: Readonly): T {\r\n return Mat4Utils.setPositionRotationQuatScale(this, position, rotation, scale);\r\n },\r\n\r\n mat4_setPositionRotation(this: T, position: Readonly, rotation: Readonly): T {\r\n return Mat4Utils.setPositionRotation(this, position, rotation);\r\n },\r\n\r\n mat4_setPositionRotationDegrees(this: T, position: Readonly, rotation: Readonly): T {\r\n return Mat4Utils.setPositionRotationDegrees(this, position, rotation);\r\n },\r\n\r\n mat4_setPositionRotationRadians(this: T, position: Readonly, rotation: Readonly): T {\r\n return Mat4Utils.setPositionRotationRadians(this, position, rotation);\r\n },\r\n\r\n mat4_setPositionRotationQuat(this: T, position: Readonly, rotation: Readonly): T {\r\n return Mat4Utils.setPositionRotationQuat(this, position, rotation);\r\n },\r\n\r\n mat4_getAxes(this: Readonly, out?: [Vector3, Vector3, Vector3] | [T, U, V]): [Vector3, Vector3, Vector3] | [T, U, V] {\r\n return Mat4Utils.getAxes(this, out!);\r\n },\r\n\r\n mat4_getForward(this: Readonly, out?: Vector3): Vector3 | T {\r\n return Mat4Utils.getForward(this, out!);\r\n },\r\n\r\n mat4_getBackward(this: Readonly, out?: Vector3 | T): Vector3 | T {\r\n return Mat4Utils.getBackward(this, out!);\r\n },\r\n\r\n mat4_getLeft(this: Readonly, out?: Vector3): Vector3 | T {\r\n return Mat4Utils.getLeft(this, out!);\r\n },\r\n\r\n mat4_getRight(this: Readonly, out?: Vector3 | T): Vector3 | T {\r\n return Mat4Utils.getRight(this, out!);\r\n },\r\n\r\n mat4_getUp(this: Readonly, out?: Vector3): Vector3 | T {\r\n return Mat4Utils.getUp(this, out!);\r\n },\r\n\r\n mat4_getDown(this: Readonly, out?: Vector3 | T): Vector3 | T {\r\n return Mat4Utils.getDown(this, out!);\r\n },\r\n\r\n mat4_hasUniformScale(this: Readonly): boolean {\r\n return Mat4Utils.hasUniformScale(this);\r\n },\r\n\r\n mat4_toWorld(this: Readonly, parentTransformMatrix: Readonly, out?: T | U): T | U {\r\n return Mat4Utils.toWorld(this, parentTransformMatrix, out!);\r\n },\r\n\r\n mat4_toLocal(this: Readonly, parentTransformMatrix: Readonly, out?: T | U): T | U {\r\n return Mat4Utils.toLocal(this, parentTransformMatrix, out!);\r\n },\r\n\r\n mat4_toQuat(this: Readonly, out?: Quaternion2 | T): Quaternion2 | T {\r\n return Mat4Utils.toQuat(this, out!);\r\n },\r\n\r\n mat4_fromQuat(this: T, quat: Readonly): T {\r\n return Mat4Utils.fromQuat(quat, this);\r\n }\r\n };\r\n\r\n for (const arrayLikeClassToExtend of ArrayExtensionUtils.ARRAY_LIKE_CLASSES) {\r\n PluginUtils.injectOwnProperties(matrix4Extension, arrayLikeClassToExtend.prototype, false, true, true);\r\n }\r\n}", "import { Matrix4, Quaternion, Quaternion2, Vector3 } from \"../../../../cauldron/type_definitions/array_type_definitions.js\";\r\nimport { Quat2Utils } from \"../../../../cauldron/utils/array/quat2_utils.js\";\r\nimport { EasingFunction } from \"../../../../cauldron/utils/math_utils.js\";\r\nimport { PluginUtils } from \"../../../utils/plugin_utils.js\";\r\nimport { ArrayExtensionUtils } from \"./array_extension_utils.js\";\r\nimport { Quaternion2Extension } from \"./quat2_type_extension.js\";\r\n\r\nimport \"./quat2_type_extension.js\";\r\n\r\nexport function initQuat2Extension(): void {\r\n _initQuat2ExtensionProtoype();\r\n}\r\n\r\nfunction _initQuat2ExtensionProtoype(): void {\r\n\r\n const quat2Extension: Quaternion2Extension = {\r\n\r\n quat2_set(this: T, x1: number, y1?: number, z1?: number, w1?: number, x2?: number, y2?: number, z2?: number, w2?: number): T {\r\n return Quat2Utils.set(this, x1, y1!, z1!, w1!, x2!, y2!, z2!, w2!);\r\n },\r\n\r\n quat2_copy(this: T, quat: Readonly): T {\r\n return Quat2Utils.copy(quat, this);\r\n },\r\n\r\n quat2_clone(this: Readonly): T {\r\n return Quat2Utils.clone(this);\r\n },\r\n\r\n quat2_equals(this: Readonly, quat: Readonly, epsilon?: number): boolean {\r\n return Quat2Utils.equals(this, quat, epsilon);\r\n },\r\n\r\n quat2_isNormalized(this: Readonly, epsilon?: number): boolean {\r\n return Quat2Utils.isNormalized(this, epsilon);\r\n },\r\n\r\n quat2_normalize(this: Readonly, out?: T | U): T | U {\r\n return Quat2Utils.normalize(this, out!);\r\n },\r\n\r\n quat2_length(this: Readonly): number {\r\n return Quat2Utils.length(this);\r\n },\r\n\r\n quat2_lengthSquared(this: Readonly): number {\r\n return Quat2Utils.lengthSquared(this);\r\n },\r\n\r\n quat2_identity(this: T): T {\r\n return Quat2Utils.identity(this);\r\n },\r\n\r\n quat2_mul(this: Readonly, quat: Readonly, out?: T | U): T | U {\r\n return Quat2Utils.mul(this, quat, out!);\r\n },\r\n\r\n quat2_invert(this: Readonly, out?: T | U): T | U {\r\n return Quat2Utils.invert(this, out!);\r\n },\r\n\r\n quat2_conjugate(this: Readonly, out?: T | U): T | U {\r\n return Quat2Utils.conjugate(this, out!);\r\n },\r\n\r\n quat2_lerp(this: Readonly, to: Readonly, interpolationFactor: number, out?: T | U): T | U {\r\n return Quat2Utils.lerp(this, to, interpolationFactor, out!);\r\n },\r\n\r\n quat2_interpolate(this: Readonly, to: Readonly, interpolationFactor: number, easingFunction?: EasingFunction, out?: T | U): T | U {\r\n return Quat2Utils.interpolate(this, to, interpolationFactor, easingFunction!, out!);\r\n },\r\n\r\n quat2_slerp(this: Readonly, to: Readonly, interpolationFactor: number, out?: T | U): T | U {\r\n return Quat2Utils.slerp(this, to, interpolationFactor, out!);\r\n },\r\n\r\n quat2_interpolateSpherical(this: Readonly, to: Readonly, interpolationFactor: number, easingFunction?: EasingFunction, out?: T | U): T | U {\r\n return Quat2Utils.interpolateSpherical(this, to, interpolationFactor, easingFunction!, out!);\r\n },\r\n\r\n quat2_getPosition(this: Readonly, out?: Vector3 | T): Vector3 | T {\r\n return Quat2Utils.getPosition(this, out!);\r\n },\r\n\r\n quat2_getRotation(this: Readonly, out?: Vector3 | T): Vector3 | T {\r\n return Quat2Utils.getRotation(this, out!);\r\n },\r\n\r\n quat2_getRotationDegrees(this: Readonly, out?: Vector3 | T): Vector3 | T {\r\n return Quat2Utils.getRotationDegrees(this, out!);\r\n },\r\n\r\n quat2_getRotationRadians(this: Readonly, out?: Vector3 | T): Vector3 | T {\r\n return Quat2Utils.getRotationRadians(this, out!);\r\n },\r\n\r\n quat2_getRotationQuat(this: Readonly, out?: Quaternion | T): Quaternion | T {\r\n return Quat2Utils.getRotationQuat(this, out!);\r\n },\r\n\r\n quat2_setPosition(this: T, position: Readonly): T {\r\n return Quat2Utils.setPosition(this, position);\r\n },\r\n\r\n quat2_setRotation(this: T, rotation: Readonly): T {\r\n return Quat2Utils.setRotation(this, rotation);\r\n },\r\n\r\n quat2_setRotationDegrees(this: T, rotation: Readonly): T {\r\n return Quat2Utils.setRotationDegrees(this, rotation);\r\n },\r\n\r\n quat2_setRotationRadians(this: T, rotation: Readonly): T {\r\n return Quat2Utils.setRotationRadians(this, rotation);\r\n },\r\n\r\n quat2_setRotationQuat(this: T, rotation: Readonly): T {\r\n return Quat2Utils.setRotationQuat(this, rotation);\r\n },\r\n\r\n quat2_setPositionRotation(this: T, position: Readonly, rotation: Readonly): T {\r\n return Quat2Utils.setPositionRotation(this, position, rotation);\r\n },\r\n\r\n quat2_setPositionRotationDegrees(this: T, position: Readonly, rotation: Readonly): T {\r\n return Quat2Utils.setPositionRotationDegrees(this, position, rotation);\r\n },\r\n\r\n quat2_setPositionRotationRadians(this: T, position: Readonly, rotation: Readonly): T {\r\n return Quat2Utils.setPositionRotationRadians(this, position, rotation);\r\n },\r\n\r\n quat2_setPositionRotationQuat(this: T, position: Readonly, rotation: Readonly): T {\r\n return Quat2Utils.setPositionRotationQuat(this, position, rotation);\r\n },\r\n\r\n quat2_getAxes(this: Readonly, out?: [Vector3, Vector3, Vector3] | [T, U, V]): [Vector3, Vector3, Vector3] | [T, U, V] {\r\n return Quat2Utils.getAxes(this, out!);\r\n },\r\n\r\n quat2_getForward(this: Readonly, out?: Vector3 | T): Vector3 | T {\r\n return Quat2Utils.getForward(this, out!);\r\n },\r\n\r\n quat2_getBackward(this: Readonly, out?: Vector3 | T): Vector3 | T {\r\n return Quat2Utils.getBackward(this, out!);\r\n },\r\n\r\n quat2_getLeft(this: Readonly, out?: Vector3 | T): Vector3 | T {\r\n return Quat2Utils.getLeft(this, out!);\r\n },\r\n\r\n quat2_getRight(this: Readonly, out?: Vector3 | T): Vector3 | T {\r\n return Quat2Utils.getRight(this, out!);\r\n },\r\n\r\n quat2_getUp(this: Readonly, out?: Vector3 | T): Vector3 | T {\r\n return Quat2Utils.getUp(this, out!);\r\n },\r\n\r\n quat2_getDown(this: Readonly, out?: Vector3 | T): Vector3 | T {\r\n return Quat2Utils.getDown(this, out!);\r\n },\r\n\r\n quat2_rotateAxis(this: Readonly, angle: number, axis: Readonly, out?: T | U): T | U {\r\n return Quat2Utils.rotateAxis(this, angle, axis, out!);\r\n },\r\n\r\n quat2_rotateAxisDegrees(this: Readonly, angle: number, axis: Readonly, out?: T | U): T | U {\r\n return Quat2Utils.rotateAxisDegrees(this, angle, axis, out!);\r\n },\r\n\r\n quat2_rotateAxisRadians(this: Readonly, angle: number, axis: Readonly, out?: T | U): T | U {\r\n return Quat2Utils.rotateAxisRadians(this, angle, axis, out!);\r\n },\r\n\r\n quat2_toWorld(this: Readonly, parentTransformQuat: Readonly, out?: T | U): T | U {\r\n return Quat2Utils.toWorld(this, parentTransformQuat, out!);\r\n },\r\n\r\n quat2_toLocal(this: Readonly, parentTransformQuat: Readonly, out?: T | U): T | U {\r\n return Quat2Utils.toLocal(this, parentTransformQuat, out!);\r\n },\r\n\r\n quat2_toMatrix(this: Readonly, out?: Matrix4 | T): Matrix4 | T {\r\n return Quat2Utils.toMatrix(this, out!);\r\n },\r\n\r\n quat2_fromMatrix(this: T, matrix: Readonly): T {\r\n return Quat2Utils.fromMatrix(matrix, this);\r\n }\r\n };\r\n\r\n for (const arrayLikeClassToExtend of ArrayExtensionUtils.ARRAY_LIKE_CLASSES) {\r\n PluginUtils.injectOwnProperties(quat2Extension, arrayLikeClassToExtend.prototype, false, true, true);\r\n }\r\n}", "import { Matrix3, Quaternion, Vector3 } from \"../../../../cauldron/type_definitions/array_type_definitions.js\";\r\nimport { QuatUtils } from \"../../../../cauldron/utils/array/quat_utils.js\";\r\nimport { EasingFunction } from \"../../../../cauldron/utils/math_utils.js\";\r\nimport { PluginUtils } from \"../../../utils/plugin_utils.js\";\r\nimport { ArrayExtensionUtils } from \"./array_extension_utils.js\";\r\nimport { QuaternionExtension } from \"./quat_type_extension.js\";\r\n\r\nimport \"./quat_type_extension.js\";\r\n\r\nexport function initQuatExtension(): void {\r\n _initQuatExtensionProtoype();\r\n}\r\n\r\nfunction _initQuatExtensionProtoype(): void {\r\n\r\n const quatExtension: QuaternionExtension = {\r\n\r\n quat_set(this: T, x: number, y?: number, z?: number, w?: number): T {\r\n return QuatUtils.set(this, x!, y!, z!, w!);\r\n },\r\n\r\n quat_copy(this: T, quat: Readonly): T {\r\n return QuatUtils.copy(quat, this);\r\n },\r\n\r\n quat_clone(this: Readonly): T {\r\n return QuatUtils.clone(this);\r\n },\r\n\r\n quat_equals(this: Readonly, quat: Readonly, epsilon?: number): boolean {\r\n return QuatUtils.equals(this, quat, epsilon);\r\n },\r\n\r\n quat_isNormalized(this: Readonly, epsilon?: number): boolean {\r\n return QuatUtils.isNormalized(this, epsilon);\r\n },\r\n\r\n quat_normalize(this: Readonly, out?: T | U): T | U {\r\n return QuatUtils.normalize(this, out!);\r\n },\r\n\r\n quat_length(this: Readonly): number {\r\n return QuatUtils.length(this);\r\n },\r\n\r\n quat_lengthSquared(this: Readonly): number {\r\n return QuatUtils.lengthSquared(this);\r\n },\r\n\r\n quat_identity(this: T): T {\r\n return QuatUtils.identity(this);\r\n },\r\n\r\n quat_mul(this: Readonly, quat: Readonly, out?: T | U): T | U {\r\n return QuatUtils.mul(this, quat, out!);\r\n },\r\n\r\n quat_invert(this: Readonly, out?: T | U): T | U {\r\n return QuatUtils.invert(this, out!);\r\n },\r\n\r\n quat_conjugate(this: Readonly, out?: T | U): T | U {\r\n return QuatUtils.conjugate(this, out!);\r\n },\r\n\r\n quat_lerp(this: Readonly, to: Readonly, interpolationFactor: number, out?: T | U): T | U {\r\n return QuatUtils.lerp(this, to, interpolationFactor, out!);\r\n },\r\n\r\n quat_interpolate(this: Readonly, to: Readonly, interpolationFactor: number, easingFunction?: EasingFunction, out?: T | U): T | U {\r\n return QuatUtils.interpolate(this, to, interpolationFactor, easingFunction!, out!);\r\n },\r\n\r\n quat_slerp(this: Readonly, to: Readonly, interpolationFactor: number, out?: T | U): T | U {\r\n return QuatUtils.slerp(this, to, interpolationFactor, out!);\r\n },\r\n\r\n quat_interpolateSpherical(this: Readonly, to: Readonly, interpolationFactor: number, easingFunction?: EasingFunction, out?: T | U): T | U {\r\n return QuatUtils.interpolateSpherical(this, to, interpolationFactor, easingFunction!, out!);\r\n },\r\n quat_getAngle(this: Readonly): number {\r\n return QuatUtils.getAngle(this);\r\n },\r\n\r\n quat_getAngleDegrees(this: Readonly): number {\r\n return QuatUtils.getAngleDegrees(this);\r\n },\r\n\r\n quat_getAngleRadians(this: Readonly): number {\r\n return QuatUtils.getAngleRadians(this);\r\n },\r\n\r\n quat_getAxis(this: Readonly, out?: Vector3 | T): Vector3 | T {\r\n return QuatUtils.getAxis(this, out!);\r\n },\r\n\r\n quat_getAxisScaled(this: Readonly, out?: Vector3 | T): Vector3 | T {\r\n return QuatUtils.getAxisScaled(this, out!);\r\n },\r\n\r\n quat_getAxisScaledDegrees(this: Readonly, out?: Vector3 | T): Vector3 | T {\r\n return QuatUtils.getAxisScaledDegrees(this, out!);\r\n },\r\n\r\n quat_getAxisScaledRadians(this: Readonly, out?: Vector3 | T): Vector3 | T {\r\n return QuatUtils.getAxisScaledRadians(this, out!);\r\n },\r\n\r\n quat_getAxes(this: Readonly, out?: [Vector3, Vector3, Vector3] | [T, U, V]): [Vector3, Vector3, Vector3] | [T, U, V] {\r\n return QuatUtils.getAxes(this, out!);\r\n },\r\n\r\n quat_getForward(this: Readonly, out?: Vector3 | T): Vector3 | T {\r\n return QuatUtils.getForward(this, out!);\r\n },\r\n\r\n quat_getBackward(this: Readonly, out?: Vector3 | T): Vector3 | T {\r\n return QuatUtils.getBackward(this, out!);\r\n },\r\n\r\n quat_getLeft(this: Readonly, out?: Vector3 | T): Vector3 | T {\r\n return QuatUtils.getLeft(this, out!);\r\n },\r\n\r\n quat_getRight(this: Readonly, out?: Vector3 | T): Vector3 | T {\r\n return QuatUtils.getRight(this, out!);\r\n },\r\n\r\n quat_getUp(this: Readonly, out?: Vector3 | T): Vector3 | T {\r\n return QuatUtils.getUp(this, out!);\r\n },\r\n\r\n quat_getDown(this: Readonly, out?: Vector3 | T): Vector3 | T {\r\n return QuatUtils.getDown(this, out!);\r\n },\r\n\r\n quat_setAxes(this: T, left: Readonly, up: Readonly, forward: Readonly): T {\r\n return QuatUtils.setAxes(this, left, up, forward);\r\n },\r\n\r\n quat_setForward(this: T, forward: Readonly, up?: Readonly, left?: Readonly): T {\r\n return QuatUtils.setForward(this, forward, up, left);\r\n },\r\n\r\n quat_setBackward(this: T, backward: Readonly, up?: Readonly, left?: Readonly): T {\r\n return QuatUtils.setBackward(this, backward, up, left);\r\n },\r\n\r\n quat_setUp(this: T, up: Readonly, forward?: Readonly, left?: Readonly): T {\r\n return QuatUtils.setUp(this, up, forward, left);\r\n },\r\n\r\n quat_setDown(this: T, down: Readonly, forward?: Readonly, left?: Readonly): T {\r\n return QuatUtils.setDown(this, down, forward, left);\r\n },\r\n\r\n quat_setLeft(this: T, left: Readonly, up?: Readonly, forward?: Readonly): T {\r\n return QuatUtils.setLeft(this, left, up, forward);\r\n },\r\n\r\n quat_setRight(this: T, right: Readonly, up?: Readonly, forward?: Readonly): T {\r\n return QuatUtils.setRight(this, right, up, forward);\r\n },\r\n\r\n quat_toWorld(this: Readonly, parentRotationQuat: Readonly, out?: T | U): T | U {\r\n return QuatUtils.toWorld(this, parentRotationQuat, out!);\r\n },\r\n\r\n quat_toLocal(this: Readonly, parentRotationQuat: Readonly, out?: T | U): T | U {\r\n return QuatUtils.toLocal(this, parentRotationQuat, out!);\r\n },\r\n\r\n quat_addRotation(this: Readonly, rotation: Readonly, out?: T | U): T | U {\r\n return QuatUtils.addRotation(this, rotation, out!);\r\n },\r\n\r\n quat_addRotationDegrees(this: Readonly, rotation: Readonly, out?: T | U): T | U {\r\n return QuatUtils.addRotationDegrees(this, rotation, out!);\r\n },\r\n\r\n quat_addRotationRadians(this: Readonly, rotation: Readonly, out?: T | U): T | U {\r\n return QuatUtils.addRotationRadians(this, rotation, out!);\r\n },\r\n\r\n quat_addRotationQuat(this: Readonly, rotation: Readonly, out?: T | U): T | U {\r\n return QuatUtils.addRotationQuat(this, rotation, out!);\r\n },\r\n\r\n quat_subRotation(this: Readonly, rotation: Readonly, out?: T | U): T | U {\r\n return QuatUtils.subRotation(this, rotation, out!);\r\n },\r\n\r\n quat_subRotationDegrees(this: Readonly, rotation: Readonly, out?: T | U): T | U {\r\n return QuatUtils.subRotationDegrees(this, rotation, out!);\r\n },\r\n\r\n quat_subRotationRadians(this: Readonly, rotation: Readonly, out?: T | U): T | U {\r\n return QuatUtils.subRotationRadians(this, rotation, out!);\r\n },\r\n\r\n quat_subRotationQuat(this: Readonly, rotation: Readonly, out?: T | U): T | U {\r\n return QuatUtils.subRotationQuat(this, rotation, out!);\r\n },\r\n\r\n quat_rotationTo(this: Readonly, to: Readonly, out?: T | U): T | U {\r\n return QuatUtils.rotationTo(this, to, out!);\r\n },\r\n\r\n quat_rotationToDegrees(this: Readonly, to: Readonly, out?: T | U): T | U {\r\n return QuatUtils.rotationToDegrees(this, to, out!);\r\n },\r\n\r\n quat_rotationToRadians(this: Readonly, to: Readonly, out?: T | U): T | U {\r\n return QuatUtils.rotationToRadians(this, to, out!);\r\n },\r\n\r\n quat_rotationToQuat(this: Readonly, to: Readonly, out?: T | U): T | U {\r\n return QuatUtils.rotationToQuat(this, to, out!);\r\n },\r\n\r\n quat_rotationAroundAxis(this: Readonly, axis: Readonly, out?: T | U): T | U {\r\n return QuatUtils.rotationAroundAxis(this, axis, out!);\r\n },\r\n\r\n quat_rotationAroundAxisDegrees(this: Readonly, axis: Readonly, out?: T | U): T | U {\r\n return QuatUtils.rotationAroundAxisDegrees(this, axis, out!);\r\n },\r\n\r\n quat_rotationAroundAxisRadians(this: Readonly, axis: Readonly, out?: T | U): T | U {\r\n return QuatUtils.rotationAroundAxisRadians(this, axis, out!);\r\n },\r\n\r\n quat_rotationAroundAxisQuat(this: Readonly, axis: Readonly, out?: T | U): T | U {\r\n return QuatUtils.rotationAroundAxisQuat(this, axis, out!);\r\n },\r\n\r\n quat_getTwist(this: Readonly, axis: Readonly, out?: T | U): T | U {\r\n return QuatUtils.getTwist(this, axis, out!);\r\n },\r\n\r\n quat_getSwing(this: Readonly, axis: Readonly, out?: T | U): T | U {\r\n return QuatUtils.getSwing(this, axis, out!);\r\n },\r\n\r\n quat_getSwingFromTwist(this: Readonly, twist: Readonly, out?: T | U): T | U {\r\n return QuatUtils.getSwingFromTwist(this, twist, out!);\r\n },\r\n\r\n quat_getTwistFromSwing(this: Readonly, swing: Readonly, out?: T | U): T | U {\r\n return QuatUtils.getTwistFromSwing(this, swing, out!);\r\n },\r\n\r\n quat_fromTwistSwing(this: T, twist: Readonly, swing: Readonly): T {\r\n return QuatUtils.fromTwistSwing(twist, swing, this);\r\n },\r\n\r\n quat_rotate(this: Readonly, rotation: Readonly, out?: T | U): T | U {\r\n return QuatUtils.rotate(this, rotation, out!);\r\n },\r\n\r\n quat_rotateDegrees(this: Readonly, rotation: Readonly, out?: T | U): T | U {\r\n return QuatUtils.rotateDegrees(this, rotation, out!);\r\n },\r\n\r\n quat_rotateRadians(this: Readonly, rotation: Readonly, out?: T | U): T | U {\r\n return QuatUtils.rotateRadians(this, rotation, out!);\r\n },\r\n\r\n quat_rotateQuat(this: Readonly, rotation: Readonly, out?: T | U): T | U {\r\n return QuatUtils.rotateQuat(this, rotation, out!);\r\n },\r\n\r\n quat_rotateAxis(this: Readonly, angle: number, axis: Readonly, out?: T | U): T | U {\r\n return QuatUtils.rotateAxis(this, angle, axis, out!);\r\n },\r\n\r\n quat_rotateAxisDegrees(this: Readonly, angle: number, axis: Readonly, out?: T | U): T | U {\r\n return QuatUtils.rotateAxisDegrees(this, angle, axis, out!);\r\n },\r\n\r\n quat_rotateAxisRadians(this: Readonly, angle: number, axis: Readonly, out?: T | U): T | U {\r\n return QuatUtils.rotateAxisRadians(this, angle, axis, out!);\r\n },\r\n\r\n quat_fromDegrees(this: T, rotation: Readonly): T {\r\n return QuatUtils.fromDegrees(rotation, this);\r\n },\r\n\r\n quat_fromRadians(this: T, rotation: Readonly): T {\r\n return QuatUtils.fromRadians(rotation, this);\r\n },\r\n\r\n quat_fromAxis(this: T, angle: number, axis: Readonly): T {\r\n return QuatUtils.fromAxis(angle, axis, this);\r\n },\r\n\r\n quat_fromAxisDegrees(this: T, angle: number, axis: Readonly): T {\r\n return QuatUtils.fromAxisDegrees(angle, axis, this);\r\n },\r\n\r\n quat_fromAxisRadians(this: T, angle: number, axis: Readonly): T {\r\n return QuatUtils.fromAxisRadians(angle, axis, this);\r\n },\r\n\r\n quat_fromAxes(this: T, left: Readonly, up: Readonly, forward: Readonly): Quaternion | T {\r\n return QuatUtils.fromAxes(left, up, forward, this);\r\n },\r\n\r\n quat_toDegrees(this: Readonly, out?: Vector3 | T): Vector3 | T {\r\n return QuatUtils.toDegrees(this, out!);\r\n },\r\n\r\n quat_toRadians(this: Readonly, out?: Vector3 | T): Vector3 | T {\r\n return QuatUtils.toRadians(this, out!);\r\n },\r\n\r\n quat_toMatrix(this: Readonly, out?: Matrix3 | T): Matrix3 | T {\r\n return QuatUtils.toMatrix(this, out!);\r\n }\r\n };\r\n\r\n for (const arrayLikeClassToExtend of ArrayExtensionUtils.ARRAY_LIKE_CLASSES) {\r\n PluginUtils.injectOwnProperties(quatExtension, arrayLikeClassToExtend.prototype, false, true, true);\r\n }\r\n}", "import { Vector2 } from \"../../../../cauldron/type_definitions/array_type_definitions.js\";\r\nimport { Vec2Utils } from \"../../../../cauldron/utils/array/vec2_utils.js\";\r\nimport { EasingFunction } from \"../../../../cauldron/utils/math_utils.js\";\r\nimport { PluginUtils } from \"../../../utils/plugin_utils.js\";\r\nimport { ArrayExtensionUtils } from \"./array_extension_utils.js\";\r\nimport { Vector2Extension } from \"./vec2_type_extension.js\";\r\n\r\nimport \"./vec2_type_extension.js\";\r\n\r\nexport function initVec2Extension(): void {\r\n _initVec2ExtensionProtoype();\r\n}\r\n\r\nfunction _initVec2ExtensionProtoype(): void {\r\n\r\n const vec2Extension: Vector2Extension = {\r\n\r\n vec2_set(this: T, x: number, y?: number): T {\r\n return Vec2Utils.set(this, x, y!);\r\n },\r\n\r\n vec2_copy(this: T, vector: Readonly): T {\r\n return Vec2Utils.copy(vector, this);\r\n },\r\n\r\n vec2_clone(this: Readonly): T {\r\n return Vec2Utils.clone(this);\r\n },\r\n\r\n vec2_equals(this: Readonly, vector: Readonly, epsilon?: number): boolean {\r\n return Vec2Utils.equals(this, vector, epsilon);\r\n },\r\n\r\n vec2_length(this: Readonly): number {\r\n return Vec2Utils.length(this);\r\n },\r\n\r\n vec2_normalize(this: Readonly, out?: U): U {\r\n return Vec2Utils.normalize(this, out!);\r\n },\r\n\r\n vec2_zero(this: T): T {\r\n return Vec2Utils.zero(this);\r\n },\r\n\r\n vec2_isZero(this: Readonly, epsilon?: number): boolean {\r\n return Vec2Utils.isZero(this, epsilon);\r\n },\r\n\r\n vec2_lerp(this: Readonly, to: Readonly, interpolationFactor: number, out?: T | U): T | U {\r\n return Vec2Utils.lerp(this, to, interpolationFactor, out!);\r\n },\r\n\r\n vec2_interpolate(this: Readonly, to: Readonly, interpolationFactor: number, easingFunction?: EasingFunction, out?: T | U): T | U {\r\n return Vec2Utils.interpolate(this, to, interpolationFactor, easingFunction!, out!);\r\n }\r\n };\r\n\r\n for (const arrayLikeClassToExtend of ArrayExtensionUtils.ARRAY_LIKE_CLASSES) {\r\n PluginUtils.injectOwnProperties(vec2Extension, arrayLikeClassToExtend.prototype, false, true, true);\r\n }\r\n}", "import { Matrix3, Matrix4, Quaternion, Vector3 } from \"../../../../cauldron/type_definitions/array_type_definitions.js\";\r\nimport { Vec3Utils } from \"../../../../cauldron/utils/array/vec3_utils.js\";\r\nimport { EasingFunction } from \"../../../../cauldron/utils/math_utils.js\";\r\nimport { PluginUtils } from \"../../../utils/plugin_utils.js\";\r\nimport { ArrayExtensionUtils } from \"./array_extension_utils.js\";\r\nimport { Vector3Extension } from \"./vec3_type_extension.js\";\r\n\r\nimport \"./vec3_type_extension.js\";\r\n\r\nexport function initVec3Extension(): void {\r\n _initVec3ExtensionProtoype();\r\n}\r\n\r\nfunction _initVec3ExtensionProtoype(): void {\r\n\r\n const vec3Extension: Vector3Extension = {\r\n\r\n vec3_set(this: T, x: number, y?: number, z?: number): T {\r\n return Vec3Utils.set(this, x!, y!, z!);\r\n },\r\n\r\n vec3_copy(this: T, vector: Readonly): T {\r\n return Vec3Utils.copy(vector, this);\r\n },\r\n\r\n vec3_clone(this: Readonly): T {\r\n return Vec3Utils.clone(this);\r\n },\r\n\r\n vec3_equals(this: Readonly, vector: Readonly, epsilon?: number): boolean {\r\n return Vec3Utils.equals(this, vector, epsilon);\r\n },\r\n\r\n vec3_isNormalized(this: Readonly, epsilon?: number): boolean {\r\n return Vec3Utils.isNormalized(this, epsilon);\r\n },\r\n\r\n vec3_normalize(this: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.normalize(this, out!);\r\n },\r\n vec3_isZero(this: Readonly, epsilon?: number): boolean {\r\n return Vec3Utils.isZero(this, epsilon);\r\n },\r\n vec3_zero(this: T): T {\r\n return Vec3Utils.zero(this);\r\n },\r\n\r\n vec3_length(this: Readonly): number {\r\n return Vec3Utils.length(this);\r\n },\r\n\r\n vec3_lengthSquared(this: Readonly): number {\r\n return Vec3Utils.lengthSquared(this);\r\n },\r\n\r\n vec3_lengthSigned(this: Readonly, positiveDirection: Readonly): number {\r\n return Vec3Utils.lengthSigned(this, positiveDirection);\r\n },\r\n\r\n vec3_distance(this: Readonly, vector: Readonly): number {\r\n return Vec3Utils.distance(this, vector);\r\n },\r\n\r\n vec3_distanceSquared(this: Readonly, vector: Readonly): number {\r\n return Vec3Utils.distanceSquared(this, vector);\r\n },\r\n\r\n vec3_add(this: Readonly, vector: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.add(this, vector, out!);\r\n },\r\n\r\n vec3_sub(this: Readonly, vector: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.sub(this, vector, out!);\r\n },\r\n\r\n vec3_mul(this: Readonly, vector: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.mul(this, vector, out!);\r\n },\r\n\r\n vec3_div(this: Readonly, vector: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.div(this, vector, out!);\r\n },\r\n\r\n vec3_scale(this: Readonly, value: number, out?: T | U): T | U {\r\n return Vec3Utils.scale(this, value, out!);\r\n },\r\n\r\n vec3_negate(this: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.negate(this, out!);\r\n },\r\n\r\n vec3_dot(this: Readonly, vector: Readonly): number {\r\n return Vec3Utils.dot(this, vector);\r\n },\r\n\r\n vec3_cross(this: Readonly, vector: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.cross(this, vector, out!);\r\n },\r\n\r\n vec3_transformQuat(this: Readonly, quat: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.transformQuat(this, quat, out!);\r\n },\r\n\r\n vec3_transformMat3(this: Readonly, matrix: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.transformMat3(this, matrix, out!);\r\n },\r\n\r\n vec3_transformMat4(this: Readonly, matrix: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.transformMat4(this, matrix, out!);\r\n },\r\n\r\n vec3_lerp(this: Readonly, to: Readonly, interpolationFactor: number, out?: T | U): T | U {\r\n return Vec3Utils.lerp(this, to, interpolationFactor, out!);\r\n },\r\n\r\n vec3_interpolate(this: Readonly, to: Readonly, interpolationFactor: number, easingFunction?: EasingFunction, out?: T | U): T | U {\r\n return Vec3Utils.interpolate(this, to, interpolationFactor, easingFunction!, out!);\r\n },\r\n\r\n vec3_angle(this: Readonly, vector: Readonly): number {\r\n return Vec3Utils.angle(this, vector);\r\n },\r\n\r\n vec3_angleDegrees(this: Readonly, vector: Readonly): number {\r\n return Vec3Utils.angleDegrees(this, vector);\r\n },\r\n\r\n vec3_angleRadians(this: Readonly, vector: Readonly): number {\r\n return Vec3Utils.angleRadians(this, vector);\r\n },\r\n\r\n vec3_angleSigned(this: Readonly, vector: Readonly, referenceAxis: Readonly): number {\r\n return Vec3Utils.angleSigned(this, vector, referenceAxis);\r\n },\r\n\r\n vec3_angleSignedDegrees(this: Readonly, vector: Readonly, referenceAxis: Readonly): number {\r\n return Vec3Utils.angleSignedDegrees(this, vector, referenceAxis);\r\n },\r\n\r\n vec3_angleSignedRadians(this: Readonly, vector: Readonly, referenceAxis: Readonly): number {\r\n return Vec3Utils.angleSignedRadians(this, vector, referenceAxis);\r\n },\r\n\r\n vec3_anglePivoted(this: Readonly, vector: Readonly, referenceAxis: Readonly): number {\r\n return Vec3Utils.anglePivoted(this, vector, referenceAxis);\r\n },\r\n\r\n vec3_anglePivotedDegrees(this: Readonly, vector: Readonly, referenceAxis: Readonly): number {\r\n return Vec3Utils.anglePivotedDegrees(this, vector, referenceAxis);\r\n },\r\n\r\n vec3_anglePivotedRadians(this: Readonly, vector: Readonly, referenceAxis: Readonly): number {\r\n return Vec3Utils.anglePivotedRadians(this, vector, referenceAxis);\r\n },\r\n\r\n vec3_anglePivotedSigned(this: Readonly, vector: Readonly, referenceAxis: Readonly): number {\r\n return Vec3Utils.anglePivotedSigned(this, vector, referenceAxis);\r\n },\r\n\r\n vec3_anglePivotedSignedDegrees(this: Readonly, vector: Readonly, referenceAxis: Readonly): number {\r\n return Vec3Utils.anglePivotedSignedDegrees(this, vector, referenceAxis);\r\n },\r\n\r\n vec3_anglePivotedSignedRadians(this: Readonly, vector: Readonly, referenceAxis: Readonly): number {\r\n return Vec3Utils.anglePivotedSignedRadians(this, vector, referenceAxis);\r\n },\r\n\r\n vec3_valueAlongAxis(this: Readonly, axis: Readonly): number {\r\n return Vec3Utils.valueAlongAxis(this, axis);\r\n },\r\n\r\n vec3_valueAlongPlane(this: Readonly, planeNormal: Readonly): number {\r\n return Vec3Utils.valueAlongPlane(this, planeNormal);\r\n },\r\n\r\n vec3_componentAlongAxis(this: Readonly, axis: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.componentAlongAxis(this, axis, out!);\r\n },\r\n\r\n vec3_removeComponentAlongAxis(this: Readonly, axis: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.removeComponentAlongAxis(this, axis, out!);\r\n },\r\n\r\n vec3_copyComponentAlongAxis(this: Readonly, vector: Readonly, axis: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.copyComponentAlongAxis(vector, this, axis, out!);\r\n },\r\n vec3_isConcordant(this: Readonly, vector: Readonly): boolean {\r\n return Vec3Utils.isConcordant(this, vector);\r\n },\r\n\r\n vec3_isFartherAlongAxis(this: Readonly, vector: Readonly, axis: Readonly): boolean {\r\n return Vec3Utils.isFartherAlongAxis(this, vector, axis);\r\n },\r\n\r\n vec3_isToTheRight(this: Readonly, vector: Readonly, referenceAxis: Readonly): boolean {\r\n return Vec3Utils.isToTheRight(this, vector, referenceAxis);\r\n },\r\n\r\n vec3_signTo(this: Readonly, vector: Readonly, referenceAxis: Readonly, zeroSign?: number): number {\r\n return Vec3Utils.signTo(this, vector, referenceAxis, zeroSign);\r\n },\r\n\r\n vec3_projectOnAxis(this: Readonly, axis: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.projectOnAxis(this, axis, out!);\r\n },\r\n\r\n vec3_projectOnAxisAlongAxis(this: Readonly, axis: Readonly, projectAlongAxis: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.projectOnAxisAlongAxis(this, axis, projectAlongAxis, out!);\r\n },\r\n\r\n vec3_projectOnPlane(this: Readonly, planeNormal: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.projectOnPlane(this, planeNormal, out!);\r\n },\r\n\r\n vec3_projectOnPlaneAlongAxis(this: Readonly, planeNormal: Readonly, projectAlongAxis: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.projectOnPlaneAlongAxis(this, planeNormal, projectAlongAxis, out!);\r\n },\r\n\r\n vec3_isOnAxis(this: Readonly, axis: Readonly): boolean {\r\n return Vec3Utils.isOnAxis(this, axis);\r\n },\r\n\r\n vec3_isOnPlane(this: Readonly, planeNormal: Readonly): boolean {\r\n return Vec3Utils.isOnPlane(this, planeNormal);\r\n },\r\n\r\n vec3_perpendicularAny(this: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.perpendicularAny(this, out!);\r\n },\r\n\r\n vec3_rotate(this: Readonly, rotation: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.rotate(this, rotation, out!);\r\n },\r\n\r\n vec3_rotateDegrees(this: Readonly, rotation: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.rotateDegrees(this, rotation, out!);\r\n },\r\n\r\n vec3_rotateRadians(this: Readonly, rotation: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.rotateRadians(this, rotation, out!);\r\n },\r\n\r\n vec3_rotateQuat(this: Readonly, rotation: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.rotateQuat(this, rotation, out!);\r\n },\r\n\r\n vec3_rotateAxis(this: Readonly, angle: number, axis: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.rotateAxis(this, angle, axis, out!);\r\n },\r\n\r\n vec3_rotateAxisDegrees(this: Readonly, angle: number, axis: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.rotateAxisDegrees(this, angle, axis, out!);\r\n },\r\n\r\n vec3_rotateAxisRadians(this: Readonly, angle: number, axis: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.rotateAxisRadians(this, angle, axis, out!);\r\n },\r\n\r\n vec3_rotateAround(this: Readonly, rotation: Readonly, origin: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.rotateAround(this, rotation, origin, out!);\r\n },\r\n\r\n vec3_rotateAroundDegrees(this: Readonly, rotation: Readonly, origin: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.rotateAroundDegrees(this, rotation, origin, out!);\r\n },\r\n\r\n vec3_rotateAroundRadians(this: Readonly, rotation: Readonly, origin: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.rotateAroundRadians(this, rotation, origin, out!);\r\n },\r\n\r\n vec3_rotateAroundQuat(this: Readonly, rotation: Readonly, origin: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.rotateAroundQuat(this, rotation, origin, out!);\r\n },\r\n\r\n vec3_rotateAroundAxis(this: Readonly, angle: number, axis: Readonly, origin: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.rotateAroundAxis(this, angle, axis, origin, out!);\r\n },\r\n\r\n vec3_rotateAroundAxisDegrees(this: Readonly, angle: number, axis: Readonly, origin: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.rotateAroundAxisDegrees(this, angle, axis, origin, out!);\r\n },\r\n\r\n vec3_rotateAroundAxisRadians(this: Readonly, angle: number, axis: Readonly, origin: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.rotateAroundAxisRadians(this, angle, axis, origin, out!);\r\n },\r\n\r\n vec3_addRotation(this: Readonly, rotation: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.addRotation(this, rotation, out!);\r\n },\r\n\r\n vec3_addRotationDegrees(this: Readonly, rotation: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.addRotationDegrees(this, rotation, out!);\r\n },\r\n\r\n vec3_addRotationRadians(this: Readonly, rotation: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.addRotationRadians(this, rotation, out!);\r\n },\r\n\r\n vec3_addRotationQuat(this: Readonly, rotation: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.addRotationQuat(this, rotation, out!);\r\n },\r\n\r\n vec3_degreesAddRotation(this: Readonly, rotation: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.degreesAddRotation(this, rotation, out!);\r\n },\r\n\r\n vec3_degreesAddRotationDegrees(this: Readonly, rotation: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.degreesAddRotationDegrees(this, rotation, out!);\r\n },\r\n\r\n vec3_degreesAddRotationRadians(this: Readonly, rotation: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.degreesAddRotationRadians(this, rotation, out!);\r\n },\r\n\r\n vec3_degreesAddRotationQuat(this: Readonly, rotation: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.degreesAddRotationQuat(this, rotation, out!);\r\n },\r\n\r\n vec3_radiansAddRotation(this: Readonly, rotation: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.radiansAddRotation(this, rotation, out!);\r\n },\r\n\r\n vec3_radiansAddRotationDegrees(this: Readonly, rotation: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.radiansAddRotationDegrees(this, rotation, out!);\r\n },\r\n\r\n vec3_radiansAddRotationRadians(this: Readonly, rotation: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.radiansAddRotationRadians(this, rotation, out!);\r\n },\r\n\r\n vec3_radiansAddRotationQuat(this: Readonly, rotation: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.radiansAddRotationQuat(this, rotation, out!);\r\n },\r\n\r\n vec3_rotationTo(this: Readonly, to: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.rotationTo(this, to, out!);\r\n },\r\n\r\n vec3_rotationToDegrees(this: Readonly, to: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.rotationToDegrees(this, to, out!);\r\n },\r\n\r\n vec3_rotationToRadians(this: Readonly, to: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.rotationToRadians(this, to, out!);\r\n },\r\n\r\n vec3_rotationToQuat(this: Readonly, to: Readonly, out?: Quaternion | T): Quaternion | T {\r\n return Vec3Utils.rotationToQuat(this, to, out!);\r\n },\r\n\r\n vec3_rotationToPivoted(this: Readonly, to: Readonly, pivotAxis: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.rotationToPivoted(this, to, pivotAxis, out!);\r\n },\r\n\r\n vec3_rotationToPivotedDegrees(this: Readonly, to: Readonly, pivotAxis: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.rotationToPivotedDegrees(this, to, pivotAxis, out!);\r\n },\r\n\r\n vec3_rotationToPivotedRadians(this: Readonly, to: Readonly, pivotAxis: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.rotationToPivotedRadians(this, to, pivotAxis, out!);\r\n },\r\n\r\n vec3_rotationToPivotedQuat(this: Readonly, to: Readonly, pivotAxis: Readonly, out?: Quaternion | T): Quaternion | T {\r\n return Vec3Utils.rotationToPivotedQuat(this, to, pivotAxis, out!);\r\n },\r\n\r\n vec3_convertPositionToWorld(this: Readonly, parentTransform: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.convertPositionToWorld(this, parentTransform, out!);\r\n },\r\n\r\n vec3_convertPositionToLocal(this: Readonly, parentTransform: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.convertPositionToLocal(this, parentTransform, out!);\r\n },\r\n\r\n vec3_convertPositionToWorldMatrix(this: Readonly, parentTransform: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.convertPositionToWorldMatrix(this, parentTransform, out!);\r\n },\r\n\r\n vec3_convertPositionToLocalMatrix(this: Readonly, parentTransform: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.convertPositionToLocalMatrix(this, parentTransform, out!);\r\n },\r\n\r\n vec3_convertPositionToWorldQuat(this: Readonly, parentTransform: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.convertPositionToWorldQuat(this, parentTransform, out!);\r\n },\r\n\r\n vec3_convertPositionToLocalQuat(this: Readonly, parentTransform: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.convertPositionToLocalQuat(this, parentTransform, out!);\r\n },\r\n\r\n vec3_convertDirectionToWorld(this: Readonly, parentTransform: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.convertDirectionToWorld(this, parentTransform, out!);\r\n },\r\n\r\n vec3_convertDirectionToLocal(this: Readonly, parentTransform: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.convertDirectionToLocal(this, parentTransform, out!);\r\n },\r\n\r\n vec3_convertDirectionToWorldMatrix(this: Readonly, parentTransform: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.convertDirectionToWorldMatrix(this, parentTransform, out!);\r\n },\r\n\r\n vec3_convertDirectionToLocalMatrix(this: Readonly, parentTransform: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.convertDirectionToLocalMatrix(this, parentTransform, out!);\r\n },\r\n\r\n vec3_convertDirectionToWorldQuat(this: Readonly, parentTransform: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.convertDirectionToWorldQuat(this, parentTransform, out!);\r\n },\r\n\r\n vec3_convertDirectionToLocalQuat(this: Readonly, parentTransform: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.convertDirectionToLocalQuat(this, parentTransform, out!);\r\n },\r\n\r\n vec3_toRadians(this: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.toRadians(this, out!);\r\n },\r\n\r\n vec3_toDegrees(this: Readonly, out?: T | U): T | U {\r\n return Vec3Utils.toDegrees(this, out!);\r\n },\r\n\r\n vec3_toQuat(this: Readonly, out?: Quaternion | T): Quaternion | T {\r\n return Vec3Utils.toQuat(this, out!);\r\n },\r\n\r\n vec3_radiansToQuat(this: Readonly, out?: Quaternion | T): Quaternion | T {\r\n return Vec3Utils.radiansToQuat(this, out!);\r\n },\r\n\r\n vec3_degreesToQuat(this: Readonly, out?: Quaternion | T): Quaternion | T {\r\n return Vec3Utils.degreesToQuat(this, out!);\r\n },\r\n\r\n vec3_toMatrix(this: Readonly, out?: Matrix3 | T): Matrix3 | T {\r\n return Vec3Utils.toMatrix(this, out!);\r\n },\r\n\r\n vec3_degreesToMatrix(this: Readonly, out?: Matrix3 | T): Matrix3 | T {\r\n return Vec3Utils.degreesToMatrix(this, out!);\r\n },\r\n\r\n vec3_radiansToMatrix(this: Readonly, out?: Matrix3 | T): Matrix3 | T {\r\n return Vec3Utils.radiansToMatrix(this, out!);\r\n }\r\n };\r\n\r\n for (const arrayLikeClassToExtend of ArrayExtensionUtils.ARRAY_LIKE_CLASSES) {\r\n PluginUtils.injectOwnProperties(vec3Extension, arrayLikeClassToExtend.prototype, false, true, true);\r\n }\r\n}", "import { Vector4 } from \"../../../../cauldron/type_definitions/array_type_definitions.js\";\r\nimport { Vec4Utils } from \"../../../../cauldron/utils/array/vec4_utils.js\";\r\nimport { EasingFunction } from \"../../../../cauldron/utils/math_utils.js\";\r\nimport { PluginUtils } from \"../../../utils/plugin_utils.js\";\r\nimport { ArrayExtensionUtils } from \"./array_extension_utils.js\";\r\nimport { Vector4Extension } from \"./vec4_type_extension.js\";\r\n\r\nimport \"./vec4_type_extension.js\";\r\n\r\nexport function initVec4Extension(): void {\r\n _initVec4ExtensionProtoype();\r\n}\r\n\r\nfunction _initVec4ExtensionProtoype(): void {\r\n\r\n const vec4Extension: Vector4Extension = {\r\n\r\n vec4_set(this: T, x: number, y?: number, z?: number, w?: number): T {\r\n return Vec4Utils.set(this, x, y!, z!, w!);\r\n },\r\n\r\n vec4_copy(this: T, vector: Readonly): T {\r\n return Vec4Utils.copy(vector, this);\r\n },\r\n\r\n vec4_clone(this: Readonly): T {\r\n return Vec4Utils.clone(this);\r\n },\r\n\r\n vec4_equals(this: Readonly, vector: Readonly, epsilon?: number): boolean {\r\n return Vec4Utils.equals(this, vector, epsilon);\r\n },\r\n\r\n vec4_lerp(this: Readonly, to: Readonly, interpolationFactor: number, out?: T | U): T | U {\r\n return Vec4Utils.lerp(this, to, interpolationFactor, out!);\r\n },\r\n\r\n vec4_interpolate(this: Readonly, to: Readonly, interpolationFactor: number, easingFunction?: EasingFunction, out?: T | U): T | U {\r\n return Vec4Utils.interpolate(this, to, interpolationFactor, easingFunction!, out!);\r\n }\r\n };\r\n\r\n for (const arrayLikeClassToExtend of ArrayExtensionUtils.ARRAY_LIKE_CLASSES) {\r\n PluginUtils.injectOwnProperties(vec4Extension, arrayLikeClassToExtend.prototype, false, true, true);\r\n }\r\n}", "import { Vector } from \"../../../../cauldron/type_definitions/array_type_definitions.js\";\r\nimport { VecUtils } from \"../../../../cauldron/utils/array/vec_utils.js\";\r\nimport { EasingFunction } from \"../../../../cauldron/utils/math_utils.js\";\r\nimport { PluginUtils } from \"../../../utils/plugin_utils.js\";\r\nimport { ArrayExtensionUtils } from \"./array_extension_utils.js\";\r\nimport { VectorExtension } from \"./vec_type_extension.js\";\r\n\r\nimport \"./vec_type_extension.js\";\r\n\r\nexport function initVecExtension(): void {\r\n _initVecExtensionProtoype();\r\n}\r\n\r\nfunction _initVecExtensionProtoype(): void {\r\n\r\n const vecExtension: VectorExtension = {\r\n\r\n vec_set(this: T, firstValue: number, ...remainingValues: number[]): T {\r\n return VecUtils.set(this, firstValue, ...remainingValues);\r\n },\r\n\r\n vec_copy(this: T, vector: Readonly): T {\r\n return VecUtils.copy(vector, this);\r\n },\r\n\r\n vec_clone(this: Readonly): T {\r\n return VecUtils.clone(this);\r\n },\r\n\r\n vec_equals(this: Readonly, vector: Readonly, epsilon?: number): boolean {\r\n return VecUtils.equals(this, vector, epsilon);\r\n },\r\n\r\n vec_zero(this: T): T {\r\n return VecUtils.zero(this);\r\n },\r\n\r\n vec_isZero(this: Readonly, epsilon?: number): boolean {\r\n return VecUtils.isZero(this, epsilon);\r\n },\r\n\r\n vec_scale(this: Readonly, value: number, out?: U): U {\r\n return VecUtils.scale(this, value, out!);\r\n },\r\n\r\n vec_round(this: Readonly, out?: U): U {\r\n return VecUtils.round(this, out!);\r\n },\r\n\r\n vec_floor(this: Readonly, out?: U): U {\r\n return VecUtils.floor(this, out!);\r\n },\r\n\r\n vec_ceil(this: Readonly, out?: U): U {\r\n return VecUtils.ceil(this, out!);\r\n },\r\n\r\n vec_clamp(this: Readonly, start?: number, end?: number, out?: U): U {\r\n return VecUtils.clamp(this, start!, end!, out!);\r\n },\r\n\r\n vec_lerp(this: Readonly, to: Readonly, interpolationFactor: number, out?: T | U): T | U {\r\n return VecUtils.lerp(this, to, interpolationFactor, out!);\r\n },\r\n\r\n vec_interpolate(this: Readonly, to: Readonly, interpolationFactor: number, easingFunction?: EasingFunction, out?: T | U): T | U {\r\n return VecUtils.interpolate(this, to, interpolationFactor, easingFunction!, out!);\r\n },\r\n\r\n vec_toString(this: Readonly, decimalPlaces?: number): string {\r\n return VecUtils.toString(this, decimalPlaces);\r\n },\r\n\r\n vec_log(this: Readonly, decimalPlaces?: number): Vector {\r\n return VecUtils.log(this, decimalPlaces);\r\n },\r\n\r\n vec_error(this: Readonly, decimalPlaces?: number): Vector {\r\n return VecUtils.error(this, decimalPlaces);\r\n },\r\n\r\n vec_warn(this: Readonly, decimalPlaces?: number): Vector {\r\n return VecUtils.warn(this, decimalPlaces);\r\n }\r\n };\r\n\r\n for (const arrayLikeClassToExtend of ArrayExtensionUtils.ARRAY_LIKE_CLASSES) {\r\n PluginUtils.injectOwnProperties(vecExtension, arrayLikeClassToExtend.prototype, false, true, true);\r\n }\r\n}", "import { EasingFunction, EasingFunctionName, MathUtils } from \"../../../cauldron/utils/math_utils.js\";\r\nimport { PluginUtils } from \"../../utils/plugin_utils.js\";\r\nimport { MathExtension } from \"./math_type_extension.js\";\r\n\r\nimport \"./math_type_extension.js\";\r\n\r\nexport function initMathExtension(): void {\r\n _initMathExtensionInstance();\r\n}\r\n\r\nfunction _initMathExtensionInstance(): void {\r\n\r\n const mathExtension: MathExtension = {\r\n\r\n get PP_EPSILON() {\r\n return MathUtils.EPSILON;\r\n },\r\n\r\n get PP_EPSILON_SQUARED() {\r\n return MathUtils.EPSILON_SQUARED;\r\n },\r\n\r\n get PP_EPSILON_DEGREES() {\r\n return MathUtils.EPSILON_DEGREES;\r\n },\r\n\r\n pp_clamp(value: number, start?: number, end?: number): number {\r\n return MathUtils.clamp(value, start, end);\r\n },\r\n\r\n pp_sign(value: number, zeroSign?: number): number {\r\n return MathUtils.sign(value, zeroSign);\r\n },\r\n\r\n pp_toDegrees(angle: number): number {\r\n return MathUtils.toDegrees(angle);\r\n },\r\n\r\n pp_toRadians(angle: number): number {\r\n return MathUtils.toRadians(angle);\r\n },\r\n\r\n pp_roundDecimal(number: number, decimalPlaces: number): number {\r\n return MathUtils.roundDecimal(number, decimalPlaces);\r\n },\r\n\r\n pp_mapToRange(value: number, originRangeStart: number, originRangeEnd: number, newRangeStart: number, newRangeEnd: number): number {\r\n return MathUtils.mapToRange(value, originRangeStart, originRangeEnd, newRangeStart, newRangeEnd);\r\n },\r\n\r\n pp_random(start?: number, end?: number): number {\r\n return MathUtils.random(start!, end!);\r\n },\r\n\r\n pp_randomInt(start: number, end: number): number {\r\n return MathUtils.randomInt(start, end);\r\n },\r\n\r\n pp_randomBool(): boolean {\r\n return MathUtils.randomBool();\r\n },\r\n\r\n pp_randomSign(): number {\r\n return MathUtils.randomSign();\r\n },\r\n\r\n pp_randomPick(...args: T[]): T | null {\r\n return MathUtils.randomPick(...args);\r\n },\r\n\r\n pp_randomUUID(): string {\r\n return MathUtils.randomUUID();\r\n },\r\n\r\n pp_lerp(from: number, to: number, interpolationFactor: number): number {\r\n return MathUtils.lerp(from, to, interpolationFactor);\r\n },\r\n\r\n pp_interpolate(from: number, to: number, interpolationFactor: number, easingFunction?: EasingFunction): number {\r\n return MathUtils.interpolate(from, to, interpolationFactor, easingFunction);\r\n },\r\n\r\n pp_interpolatePeriodic(from: number, to: number, interpolationFactor: number, easingFunction?: EasingFunction): number {\r\n return MathUtils.interpolatePeriodic(from, to, interpolationFactor, easingFunction);\r\n },\r\n\r\n pp_getEasingFunctionByName(easingFunctionName: EasingFunctionName): EasingFunction {\r\n return MathUtils.getEasingFunctionByName(easingFunctionName);\r\n },\r\n\r\n pp_getEasingFunctionNameByIndex(index: number): EasingFunctionName | null {\r\n return MathUtils.getEasingFunctionNameByIndex(index);\r\n },\r\n\r\n pp_angleDistance(from: number, to: number): number {\r\n return MathUtils.angleDistance(from, to);\r\n },\r\n\r\n pp_angleDistanceDegrees(from: number, to: number): number {\r\n return MathUtils.angleDistanceDegrees(from, to);\r\n },\r\n\r\n pp_angleDistanceRadians(from: number, to: number): number {\r\n return MathUtils.angleDistanceRadians(from, to);\r\n },\r\n\r\n pp_angleDistanceSigned(from: number, to: number): number {\r\n return MathUtils.angleDistanceSigned(from, to);\r\n },\r\n\r\n pp_angleDistanceSignedDegrees(from: number, to: number): number {\r\n return MathUtils.angleDistanceSignedDegrees(from, to);\r\n },\r\n\r\n pp_angleDistanceSignedRadians(from: number, to: number): number {\r\n return MathUtils.angleDistanceSignedRadians(from, to);\r\n },\r\n\r\n pp_angleClamp(angle: number, usePositiveRange?: boolean): number {\r\n return MathUtils.angleClamp(angle, usePositiveRange);\r\n },\r\n\r\n pp_angleClampDegrees(angle: number, usePositiveRange?: boolean): number {\r\n return MathUtils.angleClampDegrees(angle, usePositiveRange);\r\n },\r\n\r\n pp_angleClampRadians(angle: number, usePositiveRange?: boolean): number {\r\n return MathUtils.angleClampRadians(angle, usePositiveRange);\r\n },\r\n\r\n pp_isInsideAngleRange(angle: number, start: number, end: number, useShortestAngle?: boolean): boolean {\r\n return MathUtils.isInsideAngleRange(angle, start, end, useShortestAngle);\r\n },\r\n\r\n pp_isInsideAngleRangeDegrees(angle: number, start: number, end: number, useShortestAngle?: boolean): boolean {\r\n return MathUtils.isInsideAngleRangeDegrees(angle, start, end, useShortestAngle);\r\n },\r\n\r\n pp_isInsideAngleRangeRadians(angle: number, start: number, end: number, useShortestAngle?: boolean): boolean {\r\n return MathUtils.isInsideAngleRangeRadians(angle, start, end, useShortestAngle);\r\n }\r\n };\r\n\r\n PluginUtils.injectOwnProperties(mathExtension, Math, false, true, true);\r\n}", "import { PluginUtils } from \"../../utils/plugin_utils.js\";\r\nimport { NumberExtension } from \"./number_type_extension.js\";\r\n\r\nimport \"./number_type_extension.js\";\r\n\r\nexport function initNumberExtension(): void {\r\n _initNumberExtensionPrototype();\r\n}\r\n\r\nfunction _initNumberExtensionPrototype(): void {\r\n\r\n const numberExtension: NumberExtension = {\r\n get(this: number, factor?: number): number {\r\n return this.valueOf();\r\n }\r\n };\r\n\r\n PluginUtils.injectOwnProperties(numberExtension, Number.prototype, false, true, true);\r\n}", "import { initArrayExtension } from \"./array/array_extension.js\";\r\nimport { initMat3Extension } from \"./array/mat3_extension.js\";\r\nimport { initMat4Extension } from \"./array/mat4_extension.js\";\r\nimport { initQuat2Extension } from \"./array/quat2_extension.js\";\r\nimport { initQuatExtension } from \"./array/quat_extension.js\";\r\nimport { initVec2Extension } from \"./array/vec2_extension.js\";\r\nimport { initVec3Extension } from \"./array/vec3_extension.js\";\r\nimport { initVec4Extension } from \"./array/vec4_extension.js\";\r\nimport { initVecExtension } from \"./array/vec_extension.js\";\r\nimport { initMathExtension } from \"./math_extension.js\";\r\nimport { initNumberExtension } from \"./number_extension.js\";\r\n\r\n/**\r\n * TS import preserver\r\n * \r\n * This is only needed to make it so the import is not removed, since it makes the type extensions available to the Typescript \r\n */\r\nimport \"./array/array_extension.js\";\r\nimport \"./array/mat3_extension.js\";\r\nimport \"./array/mat4_extension.js\";\r\nimport \"./array/quat2_extension.js\";\r\nimport \"./array/quat_extension.js\";\r\nimport \"./array/vec2_extension.js\";\r\nimport \"./array/vec3_extension.js\";\r\nimport \"./array/vec4_extension.js\";\r\nimport \"./array/vec_extension.js\";\r\nimport \"./math_extension.js\";\r\nimport \"./number_extension.js\";\r\n\r\nexport function initJSExtensions(): void {\r\n initMathExtension();\r\n\r\n initArrayExtension();\r\n initVecExtension();\r\n initVec2Extension();\r\n initVec3Extension();\r\n initVec4Extension();\r\n initQuatExtension();\r\n initQuat2Extension();\r\n initMat3Extension();\r\n initMat4Extension();\r\n\r\n initNumberExtension();\r\n}", "import { initJSExtensions } from \"./extensions/init_js_extentions.js\";\r\n\r\n/**\r\n * TS import preserver\r\n * \r\n * This is only needed to make it so the import is not removed, since it makes the type extensions available to the Typescript \r\n */\r\nimport \"./extensions/init_js_extentions.js\";\r\n\r\nexport function initJSPlugins(): void {\r\n initJSExtensions();\r\n}", "import \"./number_array_type_extension.js\";\r\n\r\nexport function initNumberArrayExtension(): void {\r\n _initNumberArrayExtensionPrototype();\r\n}\r\n\r\nfunction _initNumberArrayExtensionPrototype(): void {\r\n}", "import { Component, Object3D, WonderlandEngine, type ComponentConstructor } from \"@wonderlandengine/api\";\r\nimport { Matrix3, Matrix4, Quaternion, Quaternion2, Vector3 } from \"../../../cauldron/type_definitions/array_type_definitions.js\";\r\nimport { ObjectCloneParams, ObjectUtils } from \"../../../cauldron/wl/utils/object_utils.js\";\r\nimport { PluginUtils } from \"../../utils/plugin_utils.js\";\r\nimport { Object3DExtension } from \"./object_type_extension.js\";\r\n\r\nimport \"./object_type_extension.js\";\r\n\r\nexport function initObjectExtension(): void {\r\n _initObjectExtensionProtoype();\r\n}\r\n\r\nfunction _initObjectExtensionProtoype(): void {\r\n\r\n const objectExtension: Object3DExtension = {\r\n pp_getPosition(this: Readonly, outPosition?: T): T {\r\n return ObjectUtils.getPosition(this, outPosition!);\r\n },\r\n\r\n pp_getPositionWorld(this: Readonly, outPosition?: Vector3 | T): Vector3 | T {\r\n return ObjectUtils.getPositionWorld(this, outPosition!);\r\n },\r\n\r\n pp_getPositionLocal(this: Readonly, outPosition?: Vector3 | T): Vector3 | T {\r\n return ObjectUtils.getPositionLocal(this, outPosition!);\r\n },\r\n\r\n pp_getRotation(this: Readonly, outRotation?: T): T {\r\n return ObjectUtils.getRotation(this, outRotation!);\r\n },\r\n\r\n pp_getRotationDegrees(this: Readonly, outRotation?: T): T {\r\n return ObjectUtils.getRotationDegrees(this, outRotation!);\r\n },\r\n\r\n pp_getRotationRadians(this: Readonly, outRotation?: T): T {\r\n return ObjectUtils.getRotationRadians(this, outRotation!);\r\n },\r\n\r\n pp_getRotationMatrix(this: Readonly, outRotation?: Matrix3 | T): Matrix3 | T {\r\n return ObjectUtils.getRotationMatrix(this, outRotation!);\r\n },\r\n\r\n pp_getRotationQuat(this: Readonly, outRotation?: Quaternion | T): Quaternion | T {\r\n return ObjectUtils.getRotationQuat(this, outRotation!);\r\n },\r\n\r\n pp_getRotationWorld(this: Readonly, outRotation?: T): T {\r\n return ObjectUtils.getRotationWorld(this, outRotation!);\r\n },\r\n\r\n pp_getRotationWorldDegrees(this: Readonly, outRotation?: T): T {\r\n return ObjectUtils.getRotationWorldDegrees(this, outRotation!);\r\n },\r\n\r\n pp_getRotationWorldRadians(this: Readonly, outRotation?: Vector3 | T): Vector3 | T {\r\n return ObjectUtils.getRotationWorldRadians(this, outRotation!);\r\n },\r\n\r\n pp_getRotationWorldMatrix(this: Readonly, outRotation?: Matrix3 | T): Matrix3 | T {\r\n return ObjectUtils.getRotationWorldMatrix(this, outRotation!);\r\n },\r\n\r\n pp_getRotationWorldQuat(this: Readonly, outRotation?: Quaternion | T): Quaternion | T {\r\n return ObjectUtils.getRotationWorldQuat(this, outRotation!);\r\n },\r\n\r\n pp_getRotationLocal(this: Readonly, outRotation?: T): T {\r\n return ObjectUtils.getRotationLocal(this, outRotation!);\r\n },\r\n\r\n pp_getRotationLocalDegrees(this: Readonly, outRotation?: T): T {\r\n return ObjectUtils.getRotationLocalDegrees(this, outRotation!);\r\n },\r\n\r\n pp_getRotationLocalRadians(this: Readonly, outRotation?: Vector3 | T): Vector3 | T {\r\n return ObjectUtils.getRotationLocalRadians(this, outRotation!);\r\n },\r\n\r\n pp_getRotationLocalMatrix(this: Readonly, outRotation?: Matrix3 | T): Matrix3 | T {\r\n return ObjectUtils.getRotationLocalMatrix(this, outRotation!);\r\n },\r\n\r\n pp_getRotationLocalQuat(this: Readonly, outRotation?: Quaternion | T): Quaternion | T {\r\n return ObjectUtils.getRotationLocalQuat(this, outRotation!);\r\n },\r\n\r\n pp_getScale(this: Readonly, outScale?: T): T {\r\n return ObjectUtils.getScale(this, outScale!);\r\n },\r\n\r\n pp_getScaleWorld(this: Readonly, outScale?: Vector3 | T): Vector3 | T {\r\n return ObjectUtils.getScaleWorld(this, outScale!);\r\n },\r\n\r\n pp_getScaleLocal(this: Readonly, outScale?: Vector3 | T): Vector3 | T {\r\n return ObjectUtils.getScaleLocal(this, outScale!);\r\n },\r\n\r\n pp_getTransform(this: Readonly, outTransform?: Matrix4 | T): Matrix4 | T {\r\n return ObjectUtils.getTransform(this, outTransform!);\r\n },\r\n\r\n pp_getTransformMatrix(this: Readonly, outTransform?: Matrix4 | T): Matrix4 | T {\r\n return ObjectUtils.getTransformMatrix(this, outTransform!);\r\n },\r\n\r\n pp_getTransformQuat(this: Readonly, outTransform?: Quaternion2 | T): Quaternion2 | T {\r\n return ObjectUtils.getTransformQuat(this, outTransform!);\r\n },\r\n\r\n pp_getTransformWorld(this: Readonly, outTransform?: Matrix4 | T): Matrix4 | T {\r\n return ObjectUtils.getTransformWorld(this, outTransform!);\r\n },\r\n\r\n pp_getTransformWorldMatrix(this: Readonly, outTransform?: Matrix4 | T): Matrix4 | T {\r\n return ObjectUtils.getTransformWorldMatrix(this, outTransform!);\r\n },\r\n\r\n pp_getTransformWorldQuat(this: Readonly, outTransform?: Quaternion2 | T): Quaternion2 | T {\r\n return ObjectUtils.getTransformWorldQuat(this, outTransform!);\r\n },\r\n\r\n pp_getTransformLocal(this: Readonly, outTransform?: Matrix4 | T): Matrix4 | T {\r\n return ObjectUtils.getTransformLocal(this, outTransform!);\r\n },\r\n\r\n pp_getTransformLocalMatrix(this: Readonly, outTransform?: Matrix4 | T): Matrix4 | T {\r\n return ObjectUtils.getTransformLocalMatrix(this, outTransform!);\r\n },\r\n\r\n pp_getTransformLocalQuat(this: Readonly, outTransform?: Quaternion2 | T): Quaternion2 | T {\r\n return ObjectUtils.getTransformLocalQuat(this, outTransform!);\r\n },\r\n\r\n pp_getAxes(this: Readonly, outAxes?: [Vector3, Vector3, Vector3] | [T, U, V]): [Vector3, Vector3, Vector3] | [T, U, V] {\r\n return ObjectUtils.getAxes(this, outAxes!);\r\n },\r\n\r\n pp_getAxesWorld(this: Readonly, outAxes?: [Vector3, Vector3, Vector3] | [T, U, V]): [Vector3, Vector3, Vector3] | [T, U, V] {\r\n return ObjectUtils.getAxesWorld(this, outAxes!);\r\n },\r\n\r\n pp_getAxesLocal(this: Readonly, outAxes?: [Vector3, Vector3, Vector3] | [T, U, V]): [Vector3, Vector3, Vector3] | [T, U, V] {\r\n return ObjectUtils.getAxesLocal(this, outAxes!);\r\n },\r\n\r\n pp_getForward(this: Readonly, outForward?: T): T {\r\n return ObjectUtils.getForward(this, outForward!);\r\n },\r\n\r\n pp_getForwardWorld(this: Readonly, outForward?: Vector3 | T): Vector3 | T {\r\n return ObjectUtils.getForwardWorld(this, outForward!);\r\n },\r\n\r\n pp_getForwardLocal(this: Readonly, outForward?: Vector3 | T): Vector3 | T {\r\n return ObjectUtils.getForwardLocal(this, outForward!);\r\n },\r\n\r\n pp_getBackward(this: Readonly, outBackward?: T): T {\r\n return ObjectUtils.getBackward(this, outBackward!);\r\n },\r\n\r\n pp_getBackwardWorld(this: Readonly, outBackward?: Vector3 | T): Vector3 | T {\r\n return ObjectUtils.getBackwardWorld(this, outBackward!);\r\n },\r\n\r\n pp_getBackwardLocal(this: Readonly, outBackward?: Vector3 | T): Vector3 | T {\r\n return ObjectUtils.getBackwardLocal(this, outBackward!);\r\n },\r\n\r\n pp_getUp(this: Readonly, outUp?: T): T {\r\n return ObjectUtils.getUp(this, outUp!);\r\n },\r\n\r\n pp_getUpWorld(this: Readonly, outUp?: Vector3 | T): Vector3 | T {\r\n return ObjectUtils.getUpWorld(this, outUp!);\r\n },\r\n\r\n pp_getUpLocal(this: Readonly, outUp?: Vector3 | T): Vector3 | T {\r\n return ObjectUtils.getUpLocal(this, outUp!);\r\n },\r\n\r\n pp_getDown(this: Readonly, outDown?: T): T {\r\n return ObjectUtils.getDown(this, outDown!);\r\n },\r\n\r\n pp_getDownWorld(this: Readonly, outDown?: Vector3 | T): Vector3 | T {\r\n return ObjectUtils.getDownWorld(this, outDown!);\r\n },\r\n\r\n pp_getDownLocal(this: Readonly, outDown?: Vector3 | T): Vector3 | T {\r\n return ObjectUtils.getDownLocal(this, outDown!);\r\n },\r\n\r\n pp_getLeft(this: Readonly, outLeft?: T): T {\r\n return ObjectUtils.getLeft(this, outLeft!);\r\n },\r\n\r\n pp_getLeftWorld(this: Readonly, outLeft?: Vector3 | T): Vector3 | T {\r\n return ObjectUtils.getLeftWorld(this, outLeft!);\r\n },\r\n\r\n pp_getLeftLocal(this: Readonly, outLeft?: Vector3 | T): Vector3 | T {\r\n return ObjectUtils.getLeftLocal(this, outLeft!);\r\n },\r\n\r\n pp_getRight(this: Readonly, outRight?: T): T {\r\n return ObjectUtils.getRight(this, outRight!);\r\n },\r\n\r\n pp_getRightWorld(this: Readonly, outRight?: Vector3 | T): Vector3 | T {\r\n return ObjectUtils.getRightWorld(this, outRight!);\r\n },\r\n\r\n pp_getRightLocal(this: Readonly, outRight?: Vector3 | T): Vector3 | T {\r\n return ObjectUtils.getRightLocal(this, outRight!);\r\n },\r\n\r\n pp_setPosition(this: Object3D, position: Readonly): Object3D {\r\n return ObjectUtils.setPosition(this, position);\r\n },\r\n\r\n pp_setPositionWorld(this: Object3D, position: Readonly): Object3D {\r\n return ObjectUtils.setPositionWorld(this, position);\r\n },\r\n\r\n pp_setPositionLocal(this: Object3D, position: Readonly): Object3D {\r\n return ObjectUtils.setPositionLocal(this, position);\r\n },\r\n\r\n pp_setRotation(this: Object3D, rotation: Readonly): Object3D {\r\n return ObjectUtils.setRotation(this, rotation);\r\n },\r\n\r\n pp_setRotationDegrees(this: Object3D, rotation: Readonly): Object3D {\r\n return ObjectUtils.setRotationDegrees(this, rotation);\r\n },\r\n\r\n pp_setRotationRadians(this: Object3D, rotation: Readonly): Object3D {\r\n return ObjectUtils.setRotationRadians(this, rotation);\r\n },\r\n\r\n pp_setRotationMatrix(this: Object3D, rotation: Readonly): Object3D {\r\n return ObjectUtils.setRotationMatrix(this, rotation);\r\n },\r\n\r\n pp_setRotationQuat(this: Object3D, rotation: Readonly): Object3D {\r\n return ObjectUtils.setRotationQuat(this, rotation);\r\n },\r\n\r\n pp_setRotationWorld(this: Object3D, rotation: Readonly): Object3D {\r\n return ObjectUtils.setRotationWorld(this, rotation);\r\n },\r\n\r\n pp_setRotationWorldDegrees(this: Object3D, rotation: Readonly): Object3D {\r\n return ObjectUtils.setRotationWorldDegrees(this, rotation);\r\n },\r\n\r\n pp_setRotationWorldRadians(this: Object3D, rotation: Readonly): Object3D {\r\n return ObjectUtils.setRotationWorldRadians(this, rotation);\r\n },\r\n\r\n pp_setRotationWorldMatrix(this: Object3D, rotation: Readonly): Object3D {\r\n return ObjectUtils.setRotationWorldMatrix(this, rotation);\r\n },\r\n\r\n pp_setRotationWorldQuat(this: Object3D, rotation: Readonly): Object3D {\r\n return ObjectUtils.setRotationWorldQuat(this, rotation);\r\n },\r\n\r\n pp_setRotationLocal(this: Object3D, rotation: Readonly): Object3D {\r\n return ObjectUtils.setRotationLocal(this, rotation);\r\n },\r\n\r\n pp_setRotationLocalDegrees(this: Object3D, rotation: Readonly): Object3D {\r\n return ObjectUtils.setRotationLocalDegrees(this, rotation);\r\n },\r\n\r\n pp_setRotationLocalRadians(this: Object3D, rotation: Readonly): Object3D {\r\n return ObjectUtils.setRotationLocalRadians(this, rotation);\r\n },\r\n\r\n pp_setRotationLocalMatrix(this: Object3D, rotation: Readonly): Object3D {\r\n return ObjectUtils.setRotationLocalMatrix(this, rotation);\r\n },\r\n\r\n pp_setRotationLocalQuat(this: Object3D, rotation: Readonly): Object3D {\r\n return ObjectUtils.setRotationLocalQuat(this, rotation);\r\n },\r\n\r\n pp_setScale(this: Object3D, scale: Readonly | number): Object3D {\r\n return ObjectUtils.setScale(this, scale as Vector3);\r\n },\r\n\r\n pp_setScaleWorld(this: Object3D, scale: Readonly | number): Object3D {\r\n return ObjectUtils.setScaleWorld(this, scale as Vector3);\r\n },\r\n\r\n pp_setScaleLocal(this: Object3D, scale: Readonly | number): Object3D {\r\n return ObjectUtils.setScaleLocal(this, scale as Vector3);\r\n },\r\n\r\n pp_setAxes(this: Object3D, left?: Readonly, up?: Readonly, forward?: Readonly): Object3D {\r\n return ObjectUtils.setAxes(this, left, up, forward);\r\n },\r\n\r\n pp_setAxesWorld(this: Object3D, left?: Readonly, up?: Readonly, forward?: Readonly): Object3D {\r\n return ObjectUtils.setAxesWorld(this, left, up, forward);\r\n },\r\n\r\n pp_setAxesLocal(this: Object3D, left?: Readonly, up?: Readonly, forward?: Readonly): Object3D {\r\n return ObjectUtils.setAxesLocal(this, left, up, forward);\r\n },\r\n\r\n pp_setForward(this: Object3D, forward: Readonly, up?: Readonly, left?: Readonly): Object3D {\r\n return ObjectUtils.setForward(this, forward, up, left);\r\n },\r\n\r\n pp_setForwardWorld(this: Object3D, forward: Readonly, up?: Readonly, left?: Readonly): Object3D {\r\n return ObjectUtils.setForwardWorld(this, forward, up, left);\r\n },\r\n\r\n pp_setForwardLocal(this: Object3D, forward: Readonly, up?: Readonly, left?: Readonly): Object3D {\r\n return ObjectUtils.setForwardLocal(this, forward, up, left);\r\n },\r\n\r\n pp_setBackward(this: Object3D, backward: Readonly, up?: Readonly, left?: Readonly): Object3D {\r\n return ObjectUtils.setBackward(this, backward, up, left);\r\n },\r\n\r\n pp_setBackwardWorld(this: Object3D, backward: Readonly, up?: Readonly, left?: Readonly): Object3D {\r\n return ObjectUtils.setBackwardWorld(this, backward, up, left);\r\n },\r\n\r\n pp_setBackwardLocal(this: Object3D, backward: Readonly, up?: Readonly, left?: Readonly): Object3D {\r\n return ObjectUtils.setBackwardLocal(this, backward, up, left);\r\n },\r\n\r\n pp_setUp(this: Object3D, up: Readonly, forward?: Readonly, left?: Readonly): Object3D {\r\n return ObjectUtils.setUp(this, up, forward, left);\r\n },\r\n\r\n pp_setUpWorld(this: Object3D, up: Readonly, forward?: Readonly, left?: Readonly): Object3D {\r\n return ObjectUtils.setUpWorld(this, up, forward, left);\r\n },\r\n\r\n pp_setUpLocal(this: Object3D, up: Readonly, forward?: Readonly, left?: Readonly): Object3D {\r\n return ObjectUtils.setUpLocal(this, up, forward, left);\r\n },\r\n\r\n pp_setDown(this: Object3D, down: Readonly, forward?: Readonly, left?: Readonly): Object3D {\r\n return ObjectUtils.setDown(this, down, forward, left);\r\n },\r\n\r\n pp_setDownWorld(this: Object3D, down: Readonly, forward?: Readonly, left?: Readonly): Object3D {\r\n return ObjectUtils.setDownWorld(this, down, forward, left);\r\n },\r\n\r\n pp_setDownLocal(this: Object3D, down: Readonly, forward?: Readonly, left?: Readonly): Object3D {\r\n return ObjectUtils.setDownLocal(this, down, forward, left);\r\n },\r\n\r\n pp_setLeft(this: Object3D, left: Readonly, up?: Readonly, forward?: Readonly): Object3D {\r\n return ObjectUtils.setLeft(this, left, up, forward);\r\n },\r\n\r\n pp_setLeftWorld(this: Object3D, left: Readonly, up?: Readonly, forward?: Readonly): Object3D {\r\n return ObjectUtils.setLeftWorld(this, left, up, forward);\r\n },\r\n\r\n pp_setLeftLocal(this: Object3D, left: Readonly, up?: Readonly, forward?: Readonly): Object3D {\r\n return ObjectUtils.setLeftLocal(this, left, up, forward);\r\n },\r\n\r\n pp_setRight(this: Object3D, right: Readonly, up?: Readonly, forward?: Readonly): Object3D {\r\n return ObjectUtils.setRight(this, right, up, forward);\r\n },\r\n\r\n pp_setRightWorld(this: Object3D, right: Readonly, up?: Readonly, forward?: Readonly): Object3D {\r\n return ObjectUtils.setRightWorld(this, right, up, forward);\r\n },\r\n\r\n pp_setRightLocal(this: Object3D, right: Readonly, up?: Readonly, forward?: Readonly): Object3D {\r\n return ObjectUtils.setRightLocal(this, right, up, forward);\r\n },\r\n\r\n pp_setTransform(this: Object3D, transform: Readonly): Object3D {\r\n return ObjectUtils.setTransform(this, transform);\r\n },\r\n\r\n pp_setTransformMatrix(this: Object3D, transform: Readonly): Object3D {\r\n return ObjectUtils.setTransformMatrix(this, transform);\r\n },\r\n\r\n pp_setTransformQuat(this: Object3D, transform: Readonly): Object3D {\r\n return ObjectUtils.setTransformQuat(this, transform);\r\n },\r\n\r\n pp_setTransformWorld(this: Object3D, transform: Readonly): Object3D {\r\n return ObjectUtils.setTransformWorld(this, transform);\r\n },\r\n\r\n pp_setTransformWorldMatrix(this: Object3D, transform: Readonly): Object3D {\r\n return ObjectUtils.setTransformWorldMatrix(this, transform);\r\n },\r\n\r\n pp_setTransformWorldQuat(this: Object3D, transform: Readonly): Object3D {\r\n return ObjectUtils.setTransformWorldQuat(this, transform);\r\n },\r\n\r\n pp_setTransformLocal(this: Object3D, transform: Readonly): Object3D {\r\n return ObjectUtils.setTransformLocal(this, transform);\r\n },\r\n\r\n pp_setTransformLocalMatrix(this: Object3D, transform: Readonly): Object3D {\r\n return ObjectUtils.setTransformLocalMatrix(this, transform);\r\n },\r\n\r\n pp_setTransformLocalQuat(this: Object3D, transform: Readonly): Object3D {\r\n return ObjectUtils.setTransformLocalQuat(this, transform);\r\n },\r\n\r\n pp_resetPosition(this: Object3D): Object3D {\r\n return ObjectUtils.resetPosition(this);\r\n },\r\n\r\n pp_resetPositionWorld(this: Object3D): Object3D {\r\n return ObjectUtils.resetPositionWorld(this);\r\n },\r\n\r\n pp_resetPositionLocal(this: Object3D): Object3D {\r\n return ObjectUtils.resetPositionLocal(this);\r\n },\r\n\r\n pp_resetRotation(this: Object3D): Object3D {\r\n return ObjectUtils.resetRotation(this);\r\n },\r\n\r\n pp_resetRotationWorld(this: Object3D): Object3D {\r\n return ObjectUtils.resetRotationWorld(this);\r\n },\r\n\r\n pp_resetRotationLocal(this: Object3D): Object3D {\r\n return ObjectUtils.resetRotationLocal(this);\r\n },\r\n\r\n pp_resetScale(this: Object3D): Object3D {\r\n return ObjectUtils.resetScale(this);\r\n },\r\n\r\n pp_resetScaleWorld(this: Object3D): Object3D {\r\n return ObjectUtils.resetScaleWorld(this);\r\n },\r\n\r\n pp_resetScaleLocal(this: Object3D): Object3D {\r\n return ObjectUtils.resetScaleLocal(this);\r\n },\r\n\r\n pp_resetTransform(this: Object3D): Object3D {\r\n return ObjectUtils.resetTransform(this);\r\n },\r\n\r\n pp_resetTransformWorld(this: Object3D): Object3D {\r\n return ObjectUtils.resetTransformWorld(this);\r\n },\r\n\r\n pp_resetTransformLocal(this: Object3D): Object3D {\r\n return ObjectUtils.resetTransformLocal(this);\r\n },\r\n\r\n pp_translate(this: Object3D, translation: Readonly): Object3D {\r\n return ObjectUtils.translate(this, translation);\r\n },\r\n\r\n pp_translateWorld(this: Object3D, translation: Readonly): Object3D {\r\n return ObjectUtils.translateWorld(this, translation);\r\n },\r\n\r\n pp_translateLocal(this: Object3D, translation: Readonly): Object3D {\r\n return ObjectUtils.translateLocal(this, translation);\r\n },\r\n\r\n pp_translateObject(this: Object3D, translation: Readonly): Object3D {\r\n return ObjectUtils.translateObject(this, translation);\r\n },\r\n\r\n pp_translateAxis(this: Object3D, amount: number, direction: Readonly): Object3D {\r\n return ObjectUtils.translateAxis(this, amount, direction);\r\n },\r\n\r\n pp_translateAxisWorld(this: Object3D, amount: number, direction: Readonly): Object3D {\r\n return ObjectUtils.translateAxisWorld(this, amount, direction);\r\n },\r\n\r\n pp_translateAxisLocal(this: Object3D, amount: number, direction: Readonly): Object3D {\r\n return ObjectUtils.translateAxisLocal(this, amount, direction);\r\n },\r\n\r\n pp_translateAxisObject(this: Object3D, amount: number, direction: Readonly): Object3D {\r\n return ObjectUtils.translateAxisObject(this, amount, direction);\r\n },\r\n\r\n pp_rotate(this: Object3D, rotation: Readonly): Object3D {\r\n return ObjectUtils.rotate(this, rotation);\r\n },\r\n\r\n pp_rotateDegrees(this: Object3D, rotation: Readonly): Object3D {\r\n return ObjectUtils.rotateDegrees(this, rotation);\r\n },\r\n\r\n pp_rotateRadians(this: Object3D, rotation: Readonly): Object3D {\r\n return ObjectUtils.rotateRadians(this, rotation);\r\n },\r\n\r\n pp_rotateMatrix(this: Object3D, rotation: Readonly): Object3D {\r\n return ObjectUtils.rotateMatrix(this, rotation);\r\n },\r\n\r\n pp_rotateQuat(this: Object3D, rotation: Readonly): Object3D {\r\n return ObjectUtils.rotateQuat(this, rotation);\r\n },\r\n\r\n pp_rotateWorld(this: Object3D, rotation: Readonly): Object3D {\r\n return ObjectUtils.rotateWorld(this, rotation);\r\n },\r\n\r\n pp_rotateWorldDegrees(this: Object3D, rotation: Readonly): Object3D {\r\n return ObjectUtils.rotateWorldDegrees(this, rotation);\r\n },\r\n\r\n pp_rotateWorldRadians(this: Object3D, rotation: Readonly): Object3D {\r\n return ObjectUtils.rotateWorldRadians(this, rotation);\r\n },\r\n\r\n pp_rotateWorldMatrix(this: Object3D, rotation: Readonly): Object3D {\r\n return ObjectUtils.rotateWorldMatrix(this, rotation);\r\n },\r\n\r\n pp_rotateWorldQuat(this: Object3D, rotation: Readonly): Object3D {\r\n return ObjectUtils.rotateWorldQuat(this, rotation);\r\n },\r\n\r\n pp_rotateLocal(this: Object3D, rotation: Readonly): Object3D {\r\n return ObjectUtils.rotateLocal(this, rotation);\r\n },\r\n\r\n pp_rotateLocalDegrees(this: Object3D, rotation: Readonly): Object3D {\r\n return ObjectUtils.rotateLocalDegrees(this, rotation);\r\n },\r\n\r\n pp_rotateLocalRadians(this: Object3D, rotation: Readonly): Object3D {\r\n return ObjectUtils.rotateLocalRadians(this, rotation);\r\n },\r\n\r\n pp_rotateLocalMatrix(this: Object3D, rotation: Readonly): Object3D {\r\n return ObjectUtils.rotateLocalMatrix(this, rotation);\r\n },\r\n\r\n pp_rotateLocalQuat(this: Object3D, rotation: Readonly): Object3D {\r\n return ObjectUtils.rotateLocalQuat(this, rotation);\r\n },\r\n\r\n pp_rotateObject(this: Object3D, rotation: Readonly): Object3D {\r\n return ObjectUtils.rotateObject(this, rotation);\r\n },\r\n\r\n pp_rotateObjectDegrees(this: Object3D, rotation: Readonly): Object3D {\r\n return ObjectUtils.rotateObjectDegrees(this, rotation);\r\n },\r\n\r\n pp_rotateObjectRadians(this: Object3D, rotation: Readonly): Object3D {\r\n return ObjectUtils.rotateObjectRadians(this, rotation);\r\n },\r\n\r\n pp_rotateObjectMatrix(this: Object3D, rotation: Readonly): Object3D {\r\n return ObjectUtils.rotateObjectMatrix(this, rotation);\r\n },\r\n\r\n pp_rotateObjectQuat(this: Object3D, rotation: Readonly): Object3D {\r\n return ObjectUtils.rotateObjectQuat(this, rotation);\r\n },\r\n\r\n pp_rotateAxis(this: Object3D, angle: number, axis: Readonly): Object3D {\r\n return ObjectUtils.rotateAxis(this, angle, axis);\r\n },\r\n\r\n pp_rotateAxisDegrees(this: Object3D, angle: number, axis: Readonly): Object3D {\r\n return ObjectUtils.rotateAxisDegrees(this, angle, axis);\r\n },\r\n\r\n pp_rotateAxisRadians(this: Object3D, angle: number, axis: Readonly): Object3D {\r\n return ObjectUtils.rotateAxisRadians(this, angle, axis);\r\n },\r\n\r\n pp_rotateAxisWorld(this: Object3D, angle: number, axis: Readonly): Object3D {\r\n return ObjectUtils.rotateAxisWorld(this, angle, axis);\r\n },\r\n\r\n pp_rotateAxisWorldDegrees(this: Object3D, angle: number, axis: Readonly): Object3D {\r\n return ObjectUtils.rotateAxisWorldDegrees(this, angle, axis);\r\n },\r\n\r\n pp_rotateAxisWorldRadians(this: Object3D, angle: number, axis: Readonly): Object3D {\r\n return ObjectUtils.rotateAxisWorldRadians(this, angle, axis);\r\n },\r\n\r\n pp_rotateAxisLocal(this: Object3D, angle: number, axis: Readonly): Object3D {\r\n return ObjectUtils.rotateAxisLocal(this, angle, axis);\r\n },\r\n\r\n pp_rotateAxisLocalDegrees(this: Object3D, angle: number, axis: Readonly): Object3D {\r\n return ObjectUtils.rotateAxisLocalDegrees(this, angle, axis);\r\n },\r\n\r\n pp_rotateAxisLocalRadians(this: Object3D, angle: number, axis: Readonly): Object3D {\r\n return ObjectUtils.rotateAxisLocalRadians(this, angle, axis);\r\n },\r\n\r\n pp_rotateAxisObject(this: Object3D, angle: number, axis: Readonly): Object3D {\r\n return ObjectUtils.rotateAxisObject(this, angle, axis);\r\n },\r\n\r\n pp_rotateAxisObjectDegrees(this: Object3D, angle: number, axis: Readonly): Object3D {\r\n return ObjectUtils.rotateAxisObjectDegrees(this, angle, axis);\r\n },\r\n\r\n pp_rotateAxisObjectRadians(this: Object3D, angle: number, axis: Readonly): Object3D {\r\n return ObjectUtils.rotateAxisObjectRadians(this, angle, axis);\r\n },\r\n\r\n pp_rotateAround(this: Object3D, rotation: Readonly, origin: Readonly): Object3D {\r\n return ObjectUtils.rotateAround(this, rotation, origin);\r\n },\r\n\r\n pp_rotateAroundDegrees(this: Object3D, rotation: Readonly, origin: Readonly): Object3D {\r\n return ObjectUtils.rotateAroundDegrees(this, rotation, origin);\r\n },\r\n\r\n pp_rotateAroundRadians(this: Object3D, rotation: Readonly, origin: Readonly): Object3D {\r\n return ObjectUtils.rotateAroundRadians(this, rotation, origin);\r\n },\r\n\r\n pp_rotateAroundMatrix(this: Object3D, rotation: Readonly, origin: Readonly): Object3D {\r\n return ObjectUtils.rotateAroundMatrix(this, rotation, origin);\r\n },\r\n\r\n pp_rotateAroundQuat(this: Object3D, rotation: Readonly, origin: Readonly): Object3D {\r\n return ObjectUtils.rotateAroundQuat(this, rotation, origin);\r\n },\r\n\r\n pp_rotateAroundWorld(this: Object3D, rotation: Readonly, origin: Readonly): Object3D {\r\n return ObjectUtils.rotateAroundWorld(this, rotation, origin);\r\n },\r\n\r\n pp_rotateAroundWorldDegrees(this: Object3D, rotation: Readonly, origin: Readonly): Object3D {\r\n return ObjectUtils.rotateAroundWorldDegrees(this, rotation, origin);\r\n },\r\n\r\n pp_rotateAroundWorldRadians(this: Object3D, rotation: Readonly, origin: Readonly): Object3D {\r\n return ObjectUtils.rotateAroundWorldRadians(this, rotation, origin);\r\n },\r\n\r\n pp_rotateAroundWorldMatrix(this: Object3D, rotation: Readonly, origin: Readonly): Object3D {\r\n return ObjectUtils.rotateAroundWorldMatrix(this, rotation, origin);\r\n },\r\n\r\n pp_rotateAroundWorldQuat(this: Object3D, rotation: Readonly, origin: Readonly): Object3D {\r\n return ObjectUtils.rotateAroundWorldQuat(this, rotation, origin);\r\n },\r\n\r\n pp_rotateAroundLocal(this: Object3D, rotation: Readonly, origin: Readonly): Object3D {\r\n return ObjectUtils.rotateAroundLocal(this, rotation, origin);\r\n },\r\n\r\n pp_rotateAroundLocalDegrees(this: Object3D, rotation: Readonly, origin: Readonly): Object3D {\r\n return ObjectUtils.rotateAroundLocalDegrees(this, rotation, origin);\r\n },\r\n\r\n pp_rotateAroundLocalRadians(this: Object3D, rotation: Readonly, origin: Readonly): Object3D {\r\n return ObjectUtils.rotateAroundLocalRadians(this, rotation, origin);\r\n },\r\n\r\n pp_rotateAroundLocalMatrix(this: Object3D, rotation: Readonly, origin: Readonly): Object3D {\r\n return ObjectUtils.rotateAroundLocalMatrix(this, rotation, origin);\r\n },\r\n\r\n pp_rotateAroundLocalQuat(this: Object3D, rotation: Readonly, origin: Readonly): Object3D {\r\n return ObjectUtils.rotateAroundLocalQuat(this, rotation, origin);\r\n },\r\n\r\n pp_rotateAroundObject(this: Object3D, rotation: Readonly, origin: Readonly): Object3D {\r\n return ObjectUtils.rotateAroundObject(this, rotation, origin);\r\n },\r\n\r\n pp_rotateAroundObjectDegrees(this: Object3D, rotation: Readonly, origin: Readonly): Object3D {\r\n return ObjectUtils.rotateAroundObjectDegrees(this, rotation, origin);\r\n },\r\n\r\n pp_rotateAroundObjectRadians(this: Object3D, rotation: Readonly, origin: Readonly): Object3D {\r\n return ObjectUtils.rotateAroundObjectRadians(this, rotation, origin);\r\n },\r\n\r\n pp_rotateAroundObjectMatrix(this: Object3D, rotation: Readonly, origin: Readonly): Object3D {\r\n return ObjectUtils.rotateAroundObjectMatrix(this, rotation, origin);\r\n },\r\n\r\n pp_rotateAroundObjectQuat(this: Object3D, rotation: Readonly, origin: Readonly): Object3D {\r\n return ObjectUtils.rotateAroundObjectQuat(this, rotation, origin);\r\n },\r\n\r\n pp_rotateAroundAxis(this: Object3D, angle: number, axis: Readonly, origin: Readonly): Object3D {\r\n return ObjectUtils.rotateAroundAxis(this, angle, axis, origin);\r\n },\r\n\r\n pp_rotateAroundAxisDegrees(this: Object3D, angle: number, axis: Readonly, origin: Readonly): Object3D {\r\n return ObjectUtils.rotateAroundAxisDegrees(this, angle, axis, origin);\r\n },\r\n\r\n pp_rotateAroundAxisRadians(this: Object3D, angle: number, axis: Readonly, origin: Readonly): Object3D {\r\n return ObjectUtils.rotateAroundAxisRadians(this, angle, axis, origin);\r\n },\r\n\r\n pp_rotateAroundAxisWorld(this: Object3D, angle: number, axis: Readonly, origin: Readonly): Object3D {\r\n return ObjectUtils.rotateAroundAxisWorld(this, angle, axis, origin);\r\n },\r\n\r\n pp_rotateAroundAxisWorldDegrees(this: Object3D, angle: number, axis: Readonly, origin: Readonly): Object3D {\r\n return ObjectUtils.rotateAroundAxisWorldDegrees(this, angle, axis, origin);\r\n },\r\n\r\n pp_rotateAroundAxisWorldRadians(this: Object3D, angle: number, axis: Readonly, origin: Readonly): Object3D {\r\n return ObjectUtils.rotateAroundAxisWorldRadians(this, angle, axis, origin);\r\n },\r\n\r\n pp_rotateAroundAxisLocal(this: Object3D, angle: number, axis: Readonly, origin: Readonly): Object3D {\r\n return ObjectUtils.rotateAroundAxisLocal(this, angle, axis, origin);\r\n },\r\n\r\n pp_rotateAroundAxisLocalDegrees(this: Object3D, angle: number, axis: Readonly, origin: Readonly): Object3D {\r\n return ObjectUtils.rotateAroundAxisLocalDegrees(this, angle, axis, origin);\r\n },\r\n\r\n pp_rotateAroundAxisLocalRadians(this: Object3D, angle: number, axis: Readonly, origin: Readonly): Object3D {\r\n return ObjectUtils.rotateAroundAxisLocalRadians(this, angle, axis, origin);\r\n },\r\n\r\n pp_rotateAroundAxisObject(this: Object3D, angle: number, axis: Readonly, origin: Readonly): Object3D {\r\n return ObjectUtils.rotateAroundAxisObject(this, angle, axis, origin);\r\n },\r\n\r\n pp_rotateAroundAxisObjectDegrees(this: Object3D, angle: number, axis: Readonly, origin: Readonly): Object3D {\r\n return ObjectUtils.rotateAroundAxisObjectDegrees(this, angle, axis, origin);\r\n },\r\n\r\n pp_rotateAroundAxisObjectRadians(this: Object3D, angle: number, axis: Readonly, origin: Readonly): Object3D {\r\n return ObjectUtils.rotateAroundAxisObjectRadians(this, angle, axis, origin);\r\n },\r\n\r\n pp_scaleObject(this: Object3D, scale: Readonly | number): Object3D {\r\n return ObjectUtils.scaleObject(this, scale as Vector3);\r\n },\r\n\r\n pp_lookAt(this: Object3D, position: Readonly, up?: Readonly): Object3D {\r\n return ObjectUtils.lookAt(this, position, up);\r\n },\r\n\r\n pp_lookAtWorld(this: Object3D, position: Readonly, up?: Readonly): Object3D {\r\n return ObjectUtils.lookAtWorld(this, position, up);\r\n },\r\n\r\n pp_lookAtLocal(this: Object3D, position: Readonly, up?: Readonly): Object3D {\r\n return ObjectUtils.lookAtLocal(this, position, up);\r\n },\r\n\r\n pp_lookTo(this: Object3D, direction: Readonly, up?: Readonly): Object3D {\r\n return ObjectUtils.lookTo(this, direction, up);\r\n },\r\n\r\n pp_lookToWorld(this: Object3D, direction: Readonly, up?: Readonly): Object3D {\r\n return ObjectUtils.lookToWorld(this, direction, up);\r\n },\r\n\r\n pp_lookToLocal(this: Object3D, direction: Readonly, up?: Readonly): Object3D {\r\n return ObjectUtils.lookToLocal(this, direction, up);\r\n },\r\n\r\n pp_convertPositionObjectToWorld(this: Readonly, position: Readonly, outPosition?: Vector3 | T): Vector3 | T {\r\n return ObjectUtils.convertPositionObjectToWorld(this, position, outPosition!);\r\n },\r\n\r\n pp_convertDirectionObjectToWorld(this: Readonly, direction: Readonly, outDirection?: Vector3 | T): Vector3 | T {\r\n return ObjectUtils.convertDirectionObjectToWorld(this, direction, outDirection!);\r\n },\r\n\r\n pp_convertPositionWorldToObject(this: Readonly, position: Readonly, outPosition?: Vector3 | T): Vector3 | T {\r\n return ObjectUtils.convertPositionWorldToObject(this, position, outPosition!);\r\n },\r\n\r\n pp_convertDirectionWorldToObject(this: Readonly, direction: Readonly, outDirection?: Vector3 | T): Vector3 | T {\r\n return ObjectUtils.convertDirectionWorldToObject(this, direction, outDirection!);\r\n },\r\n\r\n pp_convertPositionLocalToWorld(this: Readonly, position: Readonly, outPosition?: Vector3 | T): Vector3 | T {\r\n return ObjectUtils.convertPositionLocalToWorld(this, position, outPosition!);\r\n },\r\n\r\n pp_convertDirectionLocalToWorld(this: Readonly, direction: Readonly, outDirection?: Vector3 | T): Vector3 | T {\r\n return ObjectUtils.convertDirectionLocalToWorld(this, direction, outDirection!);\r\n },\r\n\r\n pp_convertPositionWorldToLocal(this: Readonly, position: Readonly, outPosition?: Vector3 | T): Vector3 | T {\r\n return ObjectUtils.convertPositionWorldToLocal(this, position, outPosition!);\r\n },\r\n\r\n pp_convertDirectionWorldToLocal(this: Readonly, direction: Readonly, outDirection?: Vector3 | T): Vector3 | T {\r\n return ObjectUtils.convertDirectionWorldToLocal(this, direction, outDirection!);\r\n },\r\n\r\n pp_convertPositionObjectToLocal(this: Readonly, position: Readonly, outPosition?: Vector3 | T): Vector3 | T {\r\n return ObjectUtils.convertPositionObjectToLocal(this, position, outPosition!);\r\n },\r\n\r\n pp_convertDirectionObjectToLocal(this: Readonly, direction: Readonly, outDirection?: Vector3 | T): Vector3 | T {\r\n return ObjectUtils.convertDirectionObjectToLocal(this, direction, outDirection!);\r\n },\r\n\r\n pp_convertPositionLocalToObject(this: Readonly, position: Readonly, outPosition?: Vector3 | T): Vector3 | T {\r\n return ObjectUtils.convertPositionLocalToObject(this, position, outPosition!);\r\n },\r\n\r\n pp_convertDirectionLocalToObject(this: Readonly, direction: Readonly, outDirection?: Vector3 | T): Vector3 | T {\r\n return ObjectUtils.convertDirectionLocalToObject(this, direction, outDirection!);\r\n },\r\n\r\n pp_convertTransformObjectToWorld(this: Readonly, transform: Readonly, outTransform?: T | U): T | U {\r\n return ObjectUtils.convertTransformObjectToWorld(this, transform, outTransform!);\r\n },\r\n\r\n pp_convertTransformObjectToWorldMatrix(this: Readonly, transform: Readonly, outTransform?: T | U): T | U {\r\n return ObjectUtils.convertTransformObjectToWorldMatrix(this, transform, outTransform!);\r\n },\r\n\r\n pp_convertTransformObjectToWorldQuat(this: Readonly, transform: Readonly, outTransform?: T | U): T | U {\r\n return ObjectUtils.convertTransformObjectToWorldQuat(this, transform, outTransform!);\r\n },\r\n\r\n pp_convertTransformWorldToObject(this: Readonly, transform: Readonly, outTransform?: T | U): T | U {\r\n return ObjectUtils.convertTransformWorldToObject(this, transform, outTransform!);\r\n },\r\n\r\n pp_convertTransformWorldToObjectMatrix(this: Readonly, transform: Readonly, outTransform?: T | U): T | U {\r\n return ObjectUtils.convertTransformWorldToObjectMatrix(this, transform, outTransform!);\r\n },\r\n\r\n pp_convertTransformWorldToObjectQuat(this: Readonly, transform: Readonly, outTransform?: T | U): T | U {\r\n return ObjectUtils.convertTransformWorldToObjectQuat(this, transform, outTransform!);\r\n },\r\n\r\n pp_convertTransformLocalToWorld(this: Readonly, transform: Readonly, outTransform?: T | U): T | U {\r\n return ObjectUtils.convertTransformLocalToWorld(this, transform, outTransform!);\r\n },\r\n\r\n pp_convertTransformLocalToWorldMatrix(this: Readonly, transform: Readonly, outTransform?: T | U): T | U {\r\n return ObjectUtils.convertTransformLocalToWorldMatrix(this, transform, outTransform!);\r\n },\r\n\r\n pp_convertTransformLocalToWorldQuat(this: Readonly, transform: Readonly, outTransform?: T | U): T | U {\r\n return ObjectUtils.convertTransformLocalToWorldQuat(this, transform, outTransform!);\r\n },\r\n\r\n pp_convertTransformWorldToLocal(this: Readonly, transform: Readonly, outTransform?: T | U): T | U {\r\n return ObjectUtils.convertTransformWorldToLocal(this, transform, outTransform!);\r\n },\r\n\r\n pp_convertTransformWorldToLocalMatrix(this: Readonly, transform: Readonly, outTransform?: T | U): T | U {\r\n return ObjectUtils.convertTransformWorldToLocalMatrix(this, transform, outTransform!);\r\n },\r\n\r\n pp_convertTransformWorldToLocalQuat(this: Readonly, transform: Readonly, outTransform?: T | U): T | U {\r\n return ObjectUtils.convertTransformWorldToLocalQuat(this, transform, outTransform!);\r\n },\r\n\r\n pp_convertTransformObjectToLocal(this: Readonly, transform: Readonly, outTransform?: T | U): T | U {\r\n return ObjectUtils.convertTransformObjectToLocal(this, transform, outTransform!);\r\n },\r\n\r\n pp_convertTransformObjectToLocalMatrix(this: Readonly, transform: Readonly, outTransform?: T | U): T | U {\r\n return ObjectUtils.convertTransformObjectToLocalMatrix(this, transform, outTransform!);\r\n },\r\n\r\n pp_convertTransformObjectToLocalQuat(this: Readonly, transform: Readonly, outTransform?: T | U): T | U {\r\n return ObjectUtils.convertTransformObjectToLocalQuat(this, transform, outTransform!);\r\n },\r\n\r\n pp_convertTransformLocalToObject(this: Readonly, transform: Readonly, outTransform?: T | U): T | U {\r\n return ObjectUtils.convertTransformLocalToObject(this, transform, outTransform!);\r\n },\r\n\r\n pp_convertTransformLocalToObjectMatrix(this: Readonly, transform: Readonly, outTransform?: T | U): T | U {\r\n return ObjectUtils.convertTransformLocalToObjectMatrix(this, transform, outTransform!);\r\n },\r\n\r\n pp_convertTransformLocalToObjectQuat(this: Readonly, transform: Readonly, outTransform?: T | U): T | U {\r\n return ObjectUtils.convertTransformLocalToObjectQuat(this, transform, outTransform!);\r\n },\r\n\r\n pp_setParent(this: Object3D, newParent: Object3D, keepTransformWorld?: boolean): Object3D {\r\n return ObjectUtils.setParent(this, newParent, keepTransformWorld);\r\n },\r\n\r\n pp_getParent(this: Readonly): Object3D | null {\r\n return ObjectUtils.getParent(this);\r\n },\r\n\r\n pp_addComponent(this: Object3D, classOrType: ComponentConstructor | string, paramsOrActive?: Record | boolean, active?: boolean): T | null {\r\n return ObjectUtils.addComponent(this, classOrType, paramsOrActive, active);\r\n },\r\n\r\n pp_getComponent(this: Readonly, classOrType: ComponentConstructor | string, index?: number): T | null {\r\n return ObjectUtils.getComponent(this, classOrType, index);\r\n },\r\n\r\n pp_getComponentSelf(this: Readonly, classOrType: ComponentConstructor | string, index?: number): T | null {\r\n return ObjectUtils.getComponentSelf(this, classOrType, index);\r\n },\r\n\r\n pp_getComponentHierarchy(this: Readonly, classOrType: ComponentConstructor | string, index?: number): T | null {\r\n return ObjectUtils.getComponentHierarchy(this, classOrType, index);\r\n },\r\n\r\n pp_getComponentHierarchyBreadth(this: Readonly, classOrType: ComponentConstructor | string, index?: number): T | null {\r\n return ObjectUtils.getComponentHierarchyBreadth(this, classOrType, index);\r\n },\r\n\r\n pp_getComponentHierarchyDepth(this: Readonly, classOrType: ComponentConstructor | string, index?: number): T | null {\r\n return ObjectUtils.getComponentHierarchyDepth(this, classOrType, index);\r\n },\r\n\r\n pp_getComponentDescendants(this: Readonly, classOrType: ComponentConstructor | string, index?: number): T | null {\r\n return ObjectUtils.getComponentDescendants(this, classOrType, index);\r\n },\r\n\r\n pp_getComponentDescendantsBreadth(this: Readonly, classOrType: ComponentConstructor | string, index?: number): T | null {\r\n return ObjectUtils.getComponentDescendantsBreadth(this, classOrType, index);\r\n },\r\n\r\n pp_getComponentDescendantsDepth(this: Readonly, classOrType: ComponentConstructor | string, index?: number): T | null {\r\n return ObjectUtils.getComponentDescendantsDepth(this, classOrType, index);\r\n },\r\n\r\n pp_getComponentChildren(this: Readonly, classOrType: ComponentConstructor | string, index?: number): T | null {\r\n return ObjectUtils.getComponentChildren(this, classOrType, index);\r\n },\r\n\r\n pp_getComponents(this: Readonly, classOrType?: ComponentConstructor | string): T[] {\r\n return ObjectUtils.getComponents(this, classOrType);\r\n },\r\n\r\n pp_getComponentsSelf(this: Readonly, classOrType?: ComponentConstructor | string): T[] {\r\n return ObjectUtils.getComponentsSelf(this, classOrType);\r\n },\r\n\r\n pp_getComponentsHierarchy(this: Readonly, classOrType?: ComponentConstructor | string): T[] {\r\n return ObjectUtils.getComponentsHierarchy(this, classOrType);\r\n },\r\n\r\n pp_getComponentsHierarchyBreadth(this: Readonly, classOrType?: ComponentConstructor | string): T[] {\r\n return ObjectUtils.getComponentsHierarchyBreadth(this, classOrType);\r\n },\r\n\r\n pp_getComponentsHierarchyDepth(this: Readonly, classOrType?: ComponentConstructor | string): T[] {\r\n return ObjectUtils.getComponentsHierarchyDepth(this, classOrType);\r\n },\r\n\r\n pp_getComponentsDescendants(this: Readonly, classOrType?: ComponentConstructor | string): T[] {\r\n return ObjectUtils.getComponentsDescendants(this, classOrType);\r\n },\r\n\r\n pp_getComponentsDescendantsBreadth(this: Readonly, classOrType?: ComponentConstructor | string): T[] {\r\n return ObjectUtils.getComponentsDescendantsBreadth(this, classOrType);\r\n },\r\n\r\n pp_getComponentsDescendantsDepth(this: Readonly, classOrType?: ComponentConstructor | string): T[] {\r\n return ObjectUtils.getComponentsDescendantsDepth(this, classOrType);\r\n },\r\n\r\n pp_getComponentsChildren(this: Readonly, classOrType?: ComponentConstructor | string): T[] {\r\n return ObjectUtils.getComponentsChildren(this, classOrType);\r\n },\r\n\r\n pp_setActive(this: Object3D, active: boolean): Object3D {\r\n return ObjectUtils.setActive(this, active);\r\n },\r\n\r\n pp_setActiveSelf(this: Object3D, active: boolean): Object3D {\r\n return ObjectUtils.setActiveSelf(this, active);\r\n },\r\n\r\n pp_setActiveHierarchy(this: Object3D, active: boolean): Object3D {\r\n return ObjectUtils.setActiveHierarchy(this, active);\r\n },\r\n\r\n pp_setActiveHierarchyBreadth(this: Object3D, active: boolean): Object3D {\r\n return ObjectUtils.setActiveHierarchyBreadth(this, active);\r\n },\r\n\r\n pp_setActiveHierarchyDepth(this: Object3D, active: boolean): Object3D {\r\n return ObjectUtils.setActiveHierarchyDepth(this, active);\r\n },\r\n\r\n pp_setActiveDescendants(this: Object3D, active: boolean): Object3D {\r\n return ObjectUtils.setActiveDescendants(this, active);\r\n },\r\n\r\n pp_setActiveDescendantsBreadth(this: Object3D, active: boolean): Object3D {\r\n return ObjectUtils.setActiveDescendantsBreadth(this, active);\r\n },\r\n\r\n pp_setActiveDescendantsDepth(this: Object3D, active: boolean): Object3D {\r\n return ObjectUtils.setActiveDescendantsDepth(this, active);\r\n },\r\n\r\n pp_setActiveChildren(this: Object3D, active: boolean): Object3D {\r\n return ObjectUtils.setActiveChildren(this, active);\r\n },\r\n\r\n pp_hasUniformScale(this: Readonly): boolean {\r\n return ObjectUtils.hasUniformScale(this);\r\n },\r\n\r\n pp_hasUniformScaleWorld(this: Readonly): boolean {\r\n return ObjectUtils.hasUniformScaleWorld(this);\r\n },\r\n\r\n pp_hasUniformScaleLocal(this: Readonly): boolean {\r\n return ObjectUtils.hasUniformScaleLocal(this);\r\n },\r\n\r\n pp_clone(this: Readonly, cloneParams?: Readonly): Object3D | null {\r\n return ObjectUtils.clone(this, cloneParams);\r\n },\r\n\r\n pp_isCloneable(this: Readonly, cloneParams?: Readonly): boolean {\r\n return ObjectUtils.isCloneable(this, cloneParams);\r\n },\r\n\r\n pp_toString(this: Readonly): string {\r\n return ObjectUtils.toString(this);\r\n },\r\n\r\n pp_toStringExtended(this: Readonly): string {\r\n return ObjectUtils.toStringExtended(this);\r\n },\r\n\r\n pp_toStringCompact(this: Readonly): string {\r\n return ObjectUtils.toStringCompact(this);\r\n },\r\n\r\n pp_log(this: Readonly): Object3D {\r\n return ObjectUtils.log(this);\r\n },\r\n\r\n pp_logExtended(this: Readonly): Object3D {\r\n return ObjectUtils.logExtended(this);\r\n },\r\n\r\n pp_logCompact(this: Readonly): Object3D {\r\n return ObjectUtils.logCompact(this);\r\n },\r\n\r\n pp_warn(this: Readonly): Object3D {\r\n return ObjectUtils.warn(this);\r\n },\r\n\r\n pp_warnExtended(this: Readonly): Object3D {\r\n return ObjectUtils.warnExtended(this);\r\n },\r\n\r\n pp_warnCompact(this: Readonly): Object3D {\r\n return ObjectUtils.warnCompact(this);\r\n },\r\n\r\n pp_error(this: Readonly): Object3D {\r\n return ObjectUtils.error(this);\r\n },\r\n\r\n pp_errorExtended(this: Readonly): Object3D {\r\n return ObjectUtils.errorExtended(this);\r\n },\r\n\r\n pp_errorCompact(this: Readonly): Object3D {\r\n return ObjectUtils.errorCompact(this);\r\n },\r\n\r\n pp_getObjectByName(this: Readonly, name: string, isRegex?: boolean, index?: number): Object3D | null {\r\n return ObjectUtils.getObjectByName(this, name, isRegex, index);\r\n },\r\n\r\n pp_getObjectByNameHierarchy(this: Readonly, name: string, isRegex?: boolean, index?: number): Object3D | null {\r\n return ObjectUtils.getObjectByNameHierarchy(this, name, isRegex, index);\r\n },\r\n\r\n pp_getObjectByNameHierarchyBreadth(this: Readonly, name: string, isRegex?: boolean, index?: number): Object3D | null {\r\n return ObjectUtils.getObjectByNameHierarchyBreadth(this, name, isRegex, index);\r\n },\r\n\r\n pp_getObjectByNameHierarchyDepth(this: Readonly, name: string, isRegex?: boolean, index?: number): Object3D | null {\r\n return ObjectUtils.getObjectByNameHierarchyDepth(this, name, isRegex, index);\r\n },\r\n\r\n pp_getObjectByNameDescendants(this: Readonly, name: string, isRegex?: boolean, index?: number): Object3D | null {\r\n return ObjectUtils.getObjectByNameDescendants(this, name, isRegex, index);\r\n },\r\n\r\n pp_getObjectByNameDescendantsBreadth(this: Readonly, name: string, isRegex?: boolean, index?: number): Object3D | null {\r\n return ObjectUtils.getObjectByNameDescendantsBreadth(this, name, isRegex, index);\r\n },\r\n\r\n pp_getObjectByNameDescendantsDepth(this: Readonly, name: string, isRegex?: boolean, index?: number): Object3D | null {\r\n return ObjectUtils.getObjectByNameDescendantsDepth(this, name, isRegex, index);\r\n },\r\n\r\n pp_getObjectByNameChildren(this: Readonly, name: string, isRegex?: boolean, index?: number): Object3D | null {\r\n return ObjectUtils.getObjectByNameChildren(this, name, isRegex, index);\r\n },\r\n\r\n pp_getObjectsByName(this: Readonly, name: string, isRegex?: boolean): Object3D[] {\r\n return ObjectUtils.getObjectsByName(this, name, isRegex);\r\n },\r\n\r\n pp_getObjectsByNameHierarchy(this: Readonly, name: string, isRegex?: boolean): Object3D[] {\r\n return ObjectUtils.getObjectsByNameHierarchy(this, name, isRegex);\r\n },\r\n\r\n pp_getObjectsByNameHierarchyBreadth(this: Readonly, name: string, isRegex?: boolean): Object3D[] {\r\n return ObjectUtils.getObjectsByNameHierarchyBreadth(this, name, isRegex);\r\n },\r\n\r\n pp_getObjectsByNameHierarchyDepth(this: Readonly, name: string, isRegex?: boolean): Object3D[] {\r\n return ObjectUtils.getObjectsByNameHierarchyDepth(this, name, isRegex);\r\n },\r\n\r\n pp_getObjectsByNameDescendants(this: Readonly, name: string, isRegex?: boolean): Object3D[] {\r\n return ObjectUtils.getObjectsByNameDescendants(this, name, isRegex);\r\n },\r\n\r\n pp_getObjectsByNameDescendantsBreadth(this: Readonly, name: string, isRegex?: boolean): Object3D[] {\r\n return ObjectUtils.getObjectsByNameDescendantsBreadth(this, name, isRegex);\r\n },\r\n\r\n pp_getObjectsByNameDescendantsDepth(this: Readonly, name: string, isRegex?: boolean): Object3D[] {\r\n return ObjectUtils.getObjectsByNameDescendantsDepth(this, name, isRegex);\r\n },\r\n\r\n pp_getObjectsByNameChildren(this: Readonly, name: string, isRegex?: boolean): Object3D[] {\r\n return ObjectUtils.getObjectsByNameChildren(this, name, isRegex);\r\n },\r\n\r\n pp_getObjectByID(this: Readonly, id: number): Object3D | null {\r\n return ObjectUtils.getObjectByID(this, id);\r\n },\r\n\r\n pp_getObjectByIDHierarchy(this: Readonly, id: number): Object3D | null {\r\n return ObjectUtils.getObjectByIDHierarchy(this, id);\r\n },\r\n\r\n pp_getObjectByIDHierarchyBreadth(this: Readonly, id: number): Object3D | null {\r\n return ObjectUtils.getObjectByIDHierarchyBreadth(this, id);\r\n },\r\n\r\n pp_getObjectByIDHierarchyDepth(this: Readonly, id: number): Object3D | null {\r\n return ObjectUtils.getObjectByIDHierarchyDepth(this, id);\r\n },\r\n\r\n pp_getObjectByIDDescendants(this: Readonly, id: number): Object3D | null {\r\n return ObjectUtils.getObjectByIDDescendants(this, id);\r\n },\r\n\r\n pp_getObjectByIDDescendantsBreadth(this: Readonly, id: number): Object3D | null {\r\n return ObjectUtils.getObjectByIDDescendantsBreadth(this, id);\r\n },\r\n\r\n pp_getObjectByIDDescendantsDepth(this: Readonly, id: number): Object3D | null {\r\n return ObjectUtils.getObjectByIDDescendantsDepth(this, id);\r\n },\r\n\r\n pp_getObjectByIDChildren(this: Readonly, id: number): Object3D | null {\r\n return ObjectUtils.getObjectByIDChildren(this, id);\r\n },\r\n\r\n pp_getHierarchy(this: Readonly): Object3D[] {\r\n return ObjectUtils.getHierarchy(this);\r\n },\r\n\r\n pp_getHierarchyBreadth(this: Readonly): Object3D[] {\r\n return ObjectUtils.getHierarchyBreadth(this);\r\n },\r\n\r\n pp_getHierarchyDepth(this: Readonly): Object3D[] {\r\n return ObjectUtils.getHierarchyDepth(this);\r\n },\r\n\r\n pp_getDescendants(this: Readonly): Object3D[] {\r\n return ObjectUtils.getDescendants(this);\r\n },\r\n\r\n pp_getDescendantsBreadth(this: Readonly): Object3D[] {\r\n return ObjectUtils.getDescendantsBreadth(this);\r\n },\r\n\r\n pp_getDescendantsDepth(this: Readonly): Object3D[] {\r\n return ObjectUtils.getDescendantsDepth(this);\r\n },\r\n\r\n pp_getChildren(this: Readonly): Object3D[] {\r\n return ObjectUtils.getChildren(this);\r\n },\r\n\r\n pp_getSelf(this: Readonly): Object3D {\r\n return ObjectUtils.getSelf(this);\r\n },\r\n\r\n pp_addChild(this: Object3D): Object3D {\r\n return ObjectUtils.addChild(this);\r\n },\r\n\r\n pp_getName(this: Readonly): string {\r\n return ObjectUtils.getName(this);\r\n },\r\n\r\n pp_setName(this: Object3D, name: string): Object3D {\r\n return ObjectUtils.setName(this, name);\r\n },\r\n\r\n pp_getEngine(this: Readonly): WonderlandEngine {\r\n return ObjectUtils.getEngine(this);\r\n },\r\n\r\n pp_getID(this: Readonly): number {\r\n return ObjectUtils.getID(this);\r\n },\r\n\r\n pp_markDirty(this: Object3D): Object3D {\r\n return ObjectUtils.markDirty(this);\r\n },\r\n\r\n pp_isTransformChanged(this: Readonly): boolean {\r\n return ObjectUtils.isTransformChanged(this);\r\n },\r\n\r\n pp_destroy(this: Object3D): void {\r\n return ObjectUtils.destroy(this);\r\n },\r\n\r\n pp_reserveObjects(this: Readonly, count: number): Object3D {\r\n return ObjectUtils.reserveObjects(this, count);\r\n },\r\n\r\n pp_reserveObjectsSelf(this: Readonly, count: number): Object3D {\r\n return ObjectUtils.reserveObjectsSelf(this, count);\r\n },\r\n\r\n pp_reserveObjectsHierarchy(this: Readonly, count: number): Object3D {\r\n return ObjectUtils.reserveObjectsHierarchy(this, count);\r\n },\r\n\r\n pp_reserveObjectsDescendants(this: Readonly, count: number): Object3D {\r\n return ObjectUtils.reserveObjectsDescendants(this, count);\r\n },\r\n\r\n pp_reserveObjectsChildren(this: Readonly, count: number): Object3D {\r\n return ObjectUtils.reserveObjectsChildren(this, count);\r\n },\r\n\r\n pp_getComponentsAmountMap(this: Readonly, outComponentsAmountMap?: Map): Map {\r\n return ObjectUtils.getComponentsAmountMap(this, outComponentsAmountMap!);\r\n },\r\n\r\n pp_getComponentsAmountMapSelf(this: Readonly, outComponentsAmountMap?: Map): Map {\r\n return ObjectUtils.getComponentsAmountMapSelf(this, outComponentsAmountMap!);\r\n },\r\n\r\n pp_getComponentsAmountMapHierarchy(this: Readonly, outComponentsAmountMap?: Map): Map {\r\n return ObjectUtils.getComponentsAmountMapHierarchy(this, outComponentsAmountMap!);\r\n },\r\n\r\n pp_getComponentsAmountMapDescendants(this: Readonly, outComponentsAmountMap?: Map): Map {\r\n return ObjectUtils.getComponentsAmountMapDescendants(this, outComponentsAmountMap!);\r\n },\r\n\r\n pp_getComponentsAmountMapChildren(this: Readonly, outComponentsAmountMap?: Map): Map {\r\n return ObjectUtils.getComponentsAmountMapChildren(this, outComponentsAmountMap!);\r\n }\r\n };\r\n\r\n PluginUtils.injectOwnProperties(objectExtension, Object3D.prototype, false, true, true);\r\n}\r\n\r\n", "import { initNumberArrayExtension } from \"./number_array_extension.js\";\r\nimport { initObjectExtension } from \"./object_extension.js\";\r\n\r\n/**\r\n * TS import preserver\r\n * \r\n * This is only needed to make it so the import is not removed, since it makes the type extensions available to the Typescript \r\n */\r\nimport \"./number_array_extension.js\";\r\nimport \"./object_extension.js\";\r\n\r\nexport function initWLExtensions(): void {\r\n initObjectExtension();\r\n initNumberArrayExtension();\r\n}", "import { Emitter } from \"@wonderlandengine/api\";\r\nimport { PluginUtils } from \"../../../utils/plugin_utils.js\";\r\n\r\nexport function initCauldronMods(): void {\r\n _initEmitterModPrototype();\r\n}\r\n\r\nfunction _initEmitterModPrototype(): void {\r\n const emitterMod: Record = {\r\n add(this: Emitter, listener: unknown, opts: Partial<{ once: boolean, id: unknown }> = {}): Emitter {\r\n const { once = false, id = undefined } = opts;\r\n const data: any = { id, once, callback: listener };\r\n\r\n const _notifying: boolean = (this as unknown as { _notifying: boolean })._notifying;\r\n if (_notifying) {\r\n const _transactions: { type: number, data: any }[] = (this as unknown as { _transactions: { type: number, data: any }[] })._transactions;\r\n _transactions.push({ type: 1 /* TransactionType.Addition */, data });\r\n } else {\r\n this._listeners.pp_removeAll((listener: { callback: unknown, id: unknown }): boolean => {\r\n return (data.id !== undefined && listener.id === data.id) ||\r\n (data.id === undefined && listener.id === undefined && listener.callback === data.callback);\r\n });\r\n\r\n this._listeners.push(data);\r\n }\r\n\r\n return this;\r\n },\r\n _flushTransactions(this: Emitter): void {\r\n const listeners = this._listeners;\r\n const _transactions: { type: number, data: any }[] = (this as unknown as { _transactions: { type: number, data: any }[] })._transactions;\r\n\r\n for (let i = 0; i < _transactions.length; i++) {\r\n const transaction = _transactions[i];\r\n if (transaction.type == 1 /*TransactionType.Addition*/) {\r\n this._listeners.pp_removeAll((listener: { callback: unknown, id: unknown }): boolean => {\r\n return (transaction.data.id !== undefined && listener.id === transaction.data.id) ||\r\n (transaction.data.id === undefined && listener.id === undefined && listener.callback === transaction.data.callback);\r\n });\r\n\r\n listeners.push(transaction.data);\r\n } else {\r\n this.remove(transaction.data);\r\n }\r\n }\r\n\r\n _transactions.length = 0;\r\n }\r\n };\r\n\r\n\r\n\r\n PluginUtils.injectOwnProperties(emitterMod, Emitter.prototype, false, true, true);\r\n}", "import { InputComponent, ViewComponent } from \"@wonderlandengine/api\";\r\nimport { Cursor, CursorTarget, HitTestLocation } from \"@wonderlandengine/components\";\r\nimport { BrowserUtils } from \"../../../../cauldron/utils/browser_utils.js\";\r\nimport { XRUtils } from \"../../../../cauldron/utils/xr_utils.js\";\r\nimport { InputUtils } from \"../../../../input/cauldron/input_utils.js\";\r\nimport { Globals } from \"../../../../pp/globals.js\";\r\nimport { mat4_create, quat2_create, vec3_create } from \"../../../js/extensions/array/vec_create_extension.js\";\r\nimport { PluginUtils } from \"../../../utils/plugin_utils.js\";\r\n\r\nimport \"./cursor_component_type_extension.js\";\r\n\r\nexport function initCursorComponentMod() {\r\n _initCursorComponentModPrototype();\r\n}\r\n\r\nfunction _initCursorComponentModPrototype() {\r\n\r\n let cursorComponentMod = {};\r\n\r\n // Modified Functions\r\n\r\n cursorComponentMod.init = function init() {\r\n this.visible = false;\r\n this.globalTarget = this.object.pp_addComponent(CursorTarget);\r\n this.hitTestTarget = this.object.pp_addComponent(CursorTarget);\r\n this.hoveringObject = null;\r\n this.hoveringObjectTarget = null;\r\n\r\n this.handednessTyped = null;\r\n\r\n this.cursorPos = vec3_create();\r\n\r\n this._collisionMask = (1 << this.collisionGroup);\r\n\r\n this._doubleClickTimer = 0;\r\n this._tripleClickTimer = 0;\r\n this._multipleClickObject = null;\r\n this._multipleClickDelay = 0.3;\r\n\r\n this._onDeactivateCallbacks = [];\r\n\r\n this._prevHitLocationLocalToTarget = vec3_create();\r\n\r\n this._pointerID = null;\r\n\r\n this._updatePointerStyle = false;\r\n\r\n this._lastClientX = null;\r\n this._lastClientY = null;\r\n this._lastWidth = null;\r\n this._lastHeight = null;\r\n this._lastPointerID = null;\r\n\r\n this._lastOriginalMouseEvent = null;\r\n this._lastOriginalGamepadEvent = null;\r\n\r\n this._pointerLeaveToProcess = false;\r\n this._pointerLeaveMouseEvent = null;\r\n\r\n this._transformQuat = quat2_create();\r\n this._origin = vec3_create();\r\n this._direction = vec3_create();\r\n\r\n this._isHovering = false;\r\n\r\n this._isDown = false;\r\n this._lastIsDown = false;\r\n this._isRealDown = false;\r\n\r\n this._isDownForUpWithDown = false;\r\n this._isUpWithNoDown = false;\r\n\r\n this._tempVec = vec3_create();\r\n\r\n this._viewComponent = null;\r\n this._viewComponentBackup = null;\r\n\r\n this._cursorRayOrigin = vec3_create();\r\n this._cursorRayScale = vec3_create();\r\n\r\n this._projectionMatrix = mat4_create();\r\n\r\n this._hitTestLocation = null;\r\n this._hitTestObject = null;\r\n\r\n this._rayHitLocation = vec3_create();\r\n this._hitObjectData = [null, null, null];\r\n\r\n this._myViewEventListenersRegistered = false;\r\n };\r\n\r\n cursorComponentMod.start = function start() {\r\n this._screenSize = [0, 0];\r\n\r\n if (this.handedness == 0) {\r\n let inputComp = this.object.pp_getComponent(InputComponent);\r\n if (!inputComp) {\r\n console.warn(\"cursor component on object \" + this.object.pp_getName() + \" was configured with handedness \\\"input component\\\", \" + \"but object has no input component.\");\r\n this.handedness = null;\r\n } else {\r\n this.handedness = inputComp.handedness;\r\n this.input = inputComp;\r\n }\r\n } else {\r\n this.handedness = InputUtils.getHandednessByIndex(this.handedness - 1);\r\n }\r\n\r\n this.handednessTyped = this.handedness;\r\n\r\n this.pp_setViewComponent(this.object.pp_getComponent(ViewComponent));\r\n this._viewComponentBackup = null;\r\n\r\n if (this.cursorRayObject) {\r\n this.cursorRayObject.pp_setActive(false);\r\n this._cursorRayScale.set(this.cursorRayObject.pp_getScaleLocal());\r\n\r\n // Set ray to a good default distance of the cursor of 1m \r\n this._setCursorRayTransform(null);\r\n }\r\n\r\n this._setCursorVisibility(false);\r\n\r\n if (this.useWebXRHitTest) {\r\n this._hitTestObject = this.object.pp_addChild();\r\n this._hitTestLocation = this.hitTestObject.pp_addComponent(HitTestLocation, { scaleObject: false, });\r\n }\r\n\r\n // #TODO Remove this work around when the pointerId will be fixed on the Meta Quest since now onPointerMove is always 1\r\n // but for the onPointerDown and onPointerUp is always different\r\n // As long as this work around is needed, the cursor might not behave perfectly\r\n // For example, a onUnhover will be trigger every time the pointer is released since it always trigger onPointerLeave\r\n this.isHeadset = BrowserUtils.isDesktop() && XRUtils.isVRSupported(this.engine);\r\n };\r\n\r\n cursorComponentMod.update = function update(dt) {\r\n if (this._doubleClickTimer > 0) {\r\n this._doubleClickTimer -= dt;\r\n }\r\n\r\n if (this._tripleClickTimer > 0) {\r\n this._tripleClickTimer -= dt;\r\n }\r\n\r\n // If in XR, set the cursor ray based on object transform\r\n // View Component not null is currently used as a way to specify this is cursor should only work for Non XR\r\n if (XRUtils.isSessionActive(this.engine) && this._viewComponent == null) {\r\n if (this.handedness == null || Globals.getHandPose(this.handedness, this.engine).getInputSourceType() != null) {\r\n // Since Google Cardboard tap is registered as arTouchDown without a gamepad, we need to check for gamepad presence \r\n if (this.arTouchDown && this._pp_isAR()) {\r\n let axes = XRUtils.getSession(this.engine).inputSources[0].gamepad.axes;\r\n // Screenspace Y is inverted \r\n this._direction.vec3_set(axes[0], -axes[1], -1.0);\r\n this.updateDirection();\r\n } else {\r\n this.object.pp_getPosition(this._origin);\r\n this.object.pp_getForward(this._direction);\r\n }\r\n\r\n let hitObjectData = this._pp_rayCast();\r\n this._pp_hoverBehaviour(hitObjectData[0], hitObjectData[1], hitObjectData[2], this._lastOriginalGamepadEvent);\r\n } else if (this.hoveringObject != null) {\r\n this._pp_hoverBehaviour(null, null, null, this._lastOriginalGamepadEvent, true); // Trigger Unhover\r\n }\r\n } else if (!XRUtils.isSessionActive(this.engine) && this._viewComponent != null) {\r\n if (this._lastPointerID != null) {\r\n this._pp_updateMousePos(this._lastClientX, this._lastClientY, this._lastWidth, this._lastHeight);\r\n\r\n let hitObjectData = this._pp_rayCast();\r\n this._pp_hoverBehaviour(hitObjectData[0], hitObjectData[1], hitObjectData[2], this._lastOriginalMouseEvent);\r\n\r\n if (this.hoveringObject != null) {\r\n this._pointerID = this._lastPointerID;\r\n } else {\r\n this._pointerID = null;\r\n }\r\n } else if (this.hoveringObject != null) {\r\n this._pp_hoverBehaviour(null, null, null, this._lastOriginalMouseEvent, true); // Trigger Unhover\r\n }\r\n } else if (this.hoveringObject != null) {\r\n this._pp_hoverBehaviour(null, null, null, null, true); // Trigger Unhover\r\n }\r\n\r\n this._pp_processPointerLeave();\r\n\r\n if (this.hoveringObject != null && (this.cursorPos[0] != 0 || this.cursorPos[1] != 0 || this.cursorPos[2] != 0)) {\r\n if (this.cursorObject) {\r\n this._setCursorVisibility(true);\r\n\r\n this.cursorObject.pp_setPosition(this.cursorPos);\r\n this.cursorObject.pp_setTransformLocalQuat(this.cursorObject.pp_getTransformLocalQuat(this._transformQuat).quat2_normalize(this._transformQuat));\r\n }\r\n\r\n if (this.cursorRayObject) {\r\n this._setCursorRayTransform(this.cursorPos);\r\n }\r\n } else {\r\n if (this.cursorObject) {\r\n this._setCursorVisibility(false);\r\n }\r\n\r\n if (this.cursorRayObject) {\r\n this._setCursorRayTransform(null);\r\n }\r\n }\r\n\r\n if (this.cursorRayObject) {\r\n if ((XRUtils.isSessionActive(this.engine) && this._viewComponent == null) || (!XRUtils.isSessionActive(this.engine) && this._viewComponent != null && this.handedness == null)) {\r\n this.cursorRayObject.pp_setActive(true);\r\n } else {\r\n this.cursorRayObject.pp_setActive(false);\r\n }\r\n }\r\n\r\n if (this.hoveringObject == null) {\r\n this._pointerID = null;\r\n }\r\n\r\n this._updatePointerStyle = false;\r\n\r\n this._lastOriginalMouseEvent = null;\r\n this._lastOriginalGamepadEvent = null;\r\n };\r\n\r\n cursorComponentMod.onActivate = function onActivate() {\r\n this._isDown = false;\r\n this._lastIsDown = false;\r\n\r\n this._isDownForUpWithDown = false;\r\n this._isUpWithNoDown = false;\r\n\r\n if (this._viewComponent == null) {\r\n if (this._viewComponentBackup != null) {\r\n this.pp_setViewComponent(this._viewComponentBackup);\r\n } else {\r\n this.pp_setViewComponent(this.object.pp_getComponent(ViewComponent));\r\n this._viewComponentBackup = null;\r\n }\r\n }\r\n\r\n XRUtils.registerSessionStartEventListener(this, this.setupVREvents.bind(this), true, false, this.engine);\r\n this._onDeactivateCallbacks.push(() => {\r\n XRUtils.unregisterSessionStartEventListener(this, this.engine);\r\n });\r\n };\r\n\r\n cursorComponentMod.onDeactivate = function onDeactivate() {\r\n if (this.hoveringObject != null) {\r\n this._pp_hoverBehaviour(null, null, null, null, true); // Trigger Unhover\r\n }\r\n\r\n this.hoveringObject = null;\r\n this.hoveringObjectTarget = null;\r\n\r\n this._pp_updateCursorStyle();\r\n\r\n this._setCursorVisibility(false);\r\n if (this.cursorRayObject) {\r\n this.cursorRayObject.pp_setActive(false);\r\n }\r\n\r\n this._isDown = false;\r\n this._lastIsDown = false;\r\n this._isRealDown = false;\r\n\r\n this._isDownForUpWithDown = false;\r\n this._isUpWithNoDown = false;\r\n\r\n this._pointerID = null;\r\n\r\n this._lastPointerID = null;\r\n\r\n this._lastClientX = null;\r\n this._lastClientY = null;\r\n this._lastWidth = null;\r\n this._lastHeight = null;\r\n\r\n this._lastOriginalMouseEvent = null;\r\n this._lastOriginalGamepadEvent = null;\r\n\r\n this._pointerLeaveToProcess = false;\r\n this._pointerLeaveMouseEvent = null;\r\n\r\n for (let callback of this._onDeactivateCallbacks) {\r\n callback();\r\n }\r\n\r\n this._onDeactivateCallbacks = [];\r\n\r\n this._viewComponent = null;\r\n };\r\n\r\n cursorComponentMod.onDestroy = function onDestroy() {\r\n if (this._hitTestObject != null) {\r\n this._hitTestObject.pp_destroy();\r\n }\r\n };\r\n\r\n cursorComponentMod.updateDirection = function () {\r\n let transformWorld = quat2_create();\r\n return function updateDirection() {\r\n this.object.pp_getPosition(this._origin);\r\n\r\n // Reverse-project the direction into view space \r\n this._direction.vec3_transformMat4(this._projectionMatrix, this._direction);\r\n this._direction.vec3_normalize(this._direction);\r\n this._direction.vec3_transformQuat(this.object.pp_getTransformQuat(transformWorld), this._direction);\r\n };\r\n }();\r\n\r\n cursorComponentMod.setupVREvents = function setupVREvents(session) {\r\n // If in XR, one-time bind the listener \r\n\r\n let onSelect = this.onSelect.bind(this);\r\n session.addEventListener(\"select\", onSelect);\r\n let onSelectStart = this.onSelectStart.bind(this);\r\n session.addEventListener(\"selectstart\", onSelectStart);\r\n let onSelectEnd = this.onSelectEnd.bind(this);\r\n session.addEventListener(\"selectend\", onSelectEnd);\r\n\r\n this._onDeactivateCallbacks.push(() => {\r\n if (!XRUtils.isSessionActive(this.engine)) return;\r\n\r\n let session = XRUtils.getSession(this.engine);\r\n session.removeEventListener(\"select\", onSelect);\r\n session.removeEventListener(\"selectstart\", onSelectStart);\r\n session.removeEventListener(\"selectend\", onSelectEnd);\r\n });\r\n\r\n // After XR session was entered, the projection matrix changed \r\n this._onViewportResize();\r\n };\r\n\r\n cursorComponentMod.onSelect = function onSelect(e) {\r\n };\r\n\r\n cursorComponentMod.onSelectStart = function onSelectStart(e) {\r\n if (this.active) {\r\n if (this._pp_isAR()) {\r\n this.arTouchDown = true;\r\n this._lastOriginalGamepadEvent = e;\r\n } else if (e.inputSource.handedness == this.handedness) {\r\n this._isDown = true;\r\n this._isRealDown = true;\r\n\r\n if (!this._lastIsDown) {\r\n this._isDownForUpWithDown = true;\r\n }\r\n\r\n this._lastOriginalGamepadEvent = e;\r\n }\r\n }\r\n };\r\n\r\n cursorComponentMod.onSelectEnd = function onSelectEnd(e) {\r\n if (this.active) {\r\n if (this._pp_isAR()) {\r\n this.arTouchDown = false;\r\n this._lastOriginalGamepadEvent = e;\r\n } else if (e.inputSource.handedness == this.handedness) {\r\n if (!this._isDownForUpWithDown) {\r\n this._isUpWithNoDown = true;\r\n }\r\n\r\n this._isDown = false;\r\n this._isRealDown = false;\r\n\r\n this._isDownForUpWithDown = false;\r\n\r\n this._lastOriginalGamepadEvent = e;\r\n }\r\n }\r\n };\r\n\r\n cursorComponentMod.onPointerMove = function onPointerMove(e) {\r\n if (this.active && !this._pointerLeaveToProcess) {\r\n // Don't care about secondary pointers \r\n if (this._pointerID != null && this._pointerID != e.pointerId && !this.isHeadset) return;\r\n\r\n this._pp_updateMouseData(e, e.clientX, e.clientY, this._screenSize[0], this._screenSize[1], e.pointerId);\r\n }\r\n };\r\n\r\n cursorComponentMod.onClick = function onClick(e) {\r\n };\r\n\r\n cursorComponentMod.onPointerDown = function onPointerDown(e) {\r\n if (this.active && !this._pointerLeaveToProcess) {\r\n // Don't care about secondary pointers or non-left clicks \r\n if ((this._pointerID != null && this._pointerID != e.pointerId && !this.isHeadset) || e.button != 0) return;\r\n\r\n this._pp_updateMouseData(e, e.clientX, e.clientY, this._screenSize[0], this._screenSize[1], e.pointerId);\r\n\r\n this._isDown = true;\r\n this._isRealDown = true;\r\n\r\n if (!this._lastIsDown) {\r\n this._isDownForUpWithDown = true;\r\n }\r\n }\r\n };\r\n\r\n cursorComponentMod.onPointerUp = function onPointerUp(e) {\r\n if (this.active && !this._pointerLeaveToProcess) {\r\n // Don't care about secondary pointers or non-left clicks \r\n if ((this._pointerID != null && this._pointerID != e.pointerId && !this.isHeadset) || e.button != 0) return;\r\n\r\n this._pp_updateMouseData(e, e.clientX, e.clientY, this._screenSize[0], this._screenSize[1], e.pointerId);\r\n\r\n if (!this._isDownForUpWithDown) {\r\n this._isUpWithNoDown = true;\r\n }\r\n\r\n this._isDown = false;\r\n this._isRealDown = false;\r\n\r\n this._isDownForUpWithDown = false;\r\n\r\n this._updatePointerStyle = true;\r\n }\r\n };\r\n\r\n cursorComponentMod._onViewportResize = function _onViewportResize() {\r\n if (!this._viewComponent) return;\r\n\r\n // Projection matrix will change if the viewport is resized, which will affect the\r\n // projection matrix because of the aspect ratio\r\n this._viewComponent.projectionMatrix.mat4_invert(this._projectionMatrix);\r\n };\r\n\r\n cursorComponentMod._setCursorRayTransform = function _setCursorRayTransform(hitPosition) {\r\n if (!this.cursorRayObject) return;\r\n if (this.cursorRayScalingAxis != 4) {\r\n this.cursorRayObject.pp_resetScaleLocal();\r\n\r\n if (hitPosition != null) {\r\n this.cursorRayObject.pp_getPosition(this._cursorRayOrigin);\r\n let dist = this._cursorRayOrigin.vec3_distance(hitPosition);\r\n this._cursorRayScale[this.cursorRayScalingAxis] = dist;\r\n this.cursorRayObject.pp_scaleObject(this._cursorRayScale);\r\n }\r\n }\r\n };\r\n\r\n cursorComponentMod._setCursorVisibility = function _setCursorVisibility(visible) {\r\n this.visible = visible;\r\n if (!this.cursorObject) return;\r\n\r\n this.cursorObject.pp_setActive(visible);\r\n };\r\n\r\n // New Functions \r\n\r\n cursorComponentMod._pp_hoverBehaviour = function _pp_hoverBehaviour(hitObject, hitLocation, hitTestResults, originalEvent = null, forceUnhover = false) {\r\n if (!forceUnhover && hitObject != null) {\r\n let hoveringObjectChanged = false;\r\n if (this.hoveringObject == null || this.hoveringObject != hitObject) {\r\n // Unhover previous, if exists \r\n if (this.hoveringObject != null) {\r\n if (!this.hoveringReality) {\r\n if (this.hoveringObjectTarget && !this.hoveringObjectTarget.isDestroyed && this.hoveringObjectTarget.active) this.hoveringObjectTarget.onUnhover.notify(this.hoveringObject, this, originalEvent);\r\n this.globalTarget.onUnhover.notify(this.hoveringObject, this, originalEvent);\r\n } else {\r\n this.hitTestTarget.onUnhover.notify(null, this, originalEvent);\r\n }\r\n }\r\n\r\n hoveringObjectChanged = true;\r\n\r\n // Hover new object \r\n this.hoveringObject = hitObject;\r\n this.hoveringObjectTarget = this.hoveringObject.pp_getComponentSelf(CursorTarget);\r\n if (this.hoveringObjectTarget != null && !this.hoveringObjectTarget.active) {\r\n this.hoveringObjectTarget = null;\r\n }\r\n\r\n if (!this.hoveringReality) {\r\n if (this.hoveringObjectTarget) this.hoveringObjectTarget.onHover.notify(this.hoveringObject, this, originalEvent);\r\n this.globalTarget.onHover.notify(this.hoveringObject, this, originalEvent);\r\n } else {\r\n this.hitTestTarget.onHover.notify(hitTestResults, this, originalEvent);\r\n }\r\n\r\n this._pp_updateCursorStyle();\r\n\r\n if (!this._pp_isDownToProcess() && this._isRealDown) {\r\n this._isDown = true;\r\n this._lastIsDown = true;\r\n\r\n this._isDownForUpWithDown = false;\r\n this._isUpWithNoDown = false;\r\n\r\n if (!this.hoveringReality) {\r\n if (this.hoveringObjectTarget) this.hoveringObjectTarget.onDownOnHover.notify(this.hoveringObject, this, originalEvent);\r\n this.globalTarget.onDownOnHover.notify(this.hoveringObject, this, originalEvent);\r\n } else {\r\n this.hitTestTarget.onDownOnHover.notify(hitTestResults, this, originalEvent);\r\n }\r\n }\r\n }\r\n\r\n if (this._updatePointerStyle) {\r\n this._pp_updateCursorStyle();\r\n }\r\n\r\n if (!hoveringObjectChanged && this._pp_isMoving(hitLocation)) {\r\n\r\n if (!this.hoveringReality) {\r\n if (this.hoveringObjectTarget) this.hoveringObjectTarget.onMove.notify(this.hoveringObject, this, originalEvent);\r\n this.globalTarget.onMove.notify(this.hoveringObject, this, originalEvent);\r\n } else {\r\n this.hitTestTarget.onMove.notify(hitTestResults, this, originalEvent);\r\n }\r\n }\r\n\r\n if (this._pp_isDownToProcess()) {\r\n // Cursor down \r\n if (!this.hoveringReality) {\r\n if (this.hoveringObjectTarget) this.hoveringObjectTarget.onDown.notify(this.hoveringObject, this, originalEvent);\r\n this.globalTarget.onDown.notify(this.hoveringObject, this, originalEvent);\r\n } else {\r\n this.hitTestTarget.onDown.notify(hitTestResults, this, originalEvent);\r\n }\r\n\r\n // Click \r\n if (!this.hoveringReality) {\r\n if (this.hoveringObjectTarget) this.hoveringObjectTarget.onClick.notify(this.hoveringObject, this, originalEvent);\r\n this.globalTarget.onClick.notify(this.hoveringObject, this, originalEvent);\r\n } else {\r\n this.hitTestTarget.onClick.notify(hitTestResults, this, originalEvent);\r\n }\r\n\r\n // Multiple Clicks \r\n if (this._tripleClickTimer > 0 && this._multipleClickObject && this._multipleClickObject == this.hoveringObject) {\r\n if (!this.hoveringReality) {\r\n if (this.hoveringObjectTarget) this.hoveringObjectTarget.onTripleClick.notify(this.hoveringObject, this, originalEvent);\r\n this.globalTarget.onTripleClick.notify(this.hoveringObject, this, originalEvent);\r\n } else {\r\n this.hitTestTarget.onTripleClick.notify(hitTestResults, this, originalEvent);\r\n }\r\n\r\n this._tripleClickTimer = 0;\r\n } else if (this._doubleClickTimer > 0 && this._multipleClickObject && this._multipleClickObject == this.hoveringObject) {\r\n if (!this.hoveringReality) {\r\n if (this.hoveringObjectTarget) this.hoveringObjectTarget.onDoubleClick.notify(this.hoveringObject, this, originalEvent);\r\n this.globalTarget.onDoubleClick.notify(this.hoveringObject, this, originalEvent);\r\n } else {\r\n this.hitTestTarget.onDoubleClick.notify(hitTestResults, this, originalEvent);\r\n }\r\n\r\n this._tripleClickTimer = this._multipleClickDelay;\r\n this._doubleClickTimer = 0;\r\n } else {\r\n if (!this.hoveringReality) {\r\n if (this.hoveringObjectTarget) this.hoveringObjectTarget.onSingleClick.notify(this.hoveringObject, this, originalEvent);\r\n this.globalTarget.onSingleClick.notify(this.hoveringObject, this, originalEvent);\r\n } else {\r\n this.hitTestTarget.onSingleClick.notify(hitTestResults, this, originalEvent);\r\n }\r\n\r\n this._tripleClickTimer = 0;\r\n this._doubleClickTimer = this._multipleClickDelay;\r\n this._multipleClickObject = this.hoveringObject;\r\n }\r\n } else {\r\n // Cursor up \r\n if (!this._isUpWithNoDown && !hoveringObjectChanged && this._pp_isUpToProcess()) {\r\n if (!this.hoveringReality) {\r\n if (this.hoveringObjectTarget) this.hoveringObjectTarget.onUp.notify(this.hoveringObject, this, originalEvent);\r\n this.globalTarget.onUp.notify(this.hoveringObject, this, originalEvent);\r\n\r\n if (this.hoveringObjectTarget) this.hoveringObjectTarget.onUpWithDown.notify(this.hoveringObject, this, originalEvent);\r\n this.globalTarget.onUpWithDown.notify(this.hoveringObject, this, originalEvent);\r\n } else {\r\n this.hitTestTarget.onUp.notify(hitTestResults, this, originalEvent);\r\n\r\n this.hitTestTarget.onUpWithDown.notify(hitTestResults, this, originalEvent);\r\n }\r\n } else if (this._isUpWithNoDown || (hoveringObjectChanged && this._pp_isUpToProcess())) {\r\n if (!this.hoveringReality) {\r\n if (this.hoveringObjectTarget) this.hoveringObjectTarget.onUp.notify(this.hoveringObject, this, originalEvent);\r\n this.globalTarget.onUp.notify(this.hoveringObject, this, originalEvent);\r\n\r\n if (this.hoveringObjectTarget) this.hoveringObjectTarget.onUpWithNoDown.notify(this.hoveringObject, this, originalEvent);\r\n this.globalTarget.onUpWithNoDown.notify(this.hoveringObject, this, originalEvent);\r\n } else {\r\n this.hitTestTarget.onUp.notify(hitTestResults, this, originalEvent);\r\n\r\n this.hitTestTarget.onUpWithNoDown.notify(hitTestResults, this, originalEvent);\r\n }\r\n }\r\n }\r\n\r\n this._prevHitLocationLocalToTarget = this.hoveringObject.pp_convertPositionWorldToLocal(hitLocation, this._prevHitLocationLocalToTarget);\r\n } else if (this.hoveringObject != null && (forceUnhover || hitObject == null)) {\r\n if (!this.hoveringReality) {\r\n if (this.hoveringObjectTarget && !this.hoveringObjectTarget.isDestroyed && this.hoveringObjectTarget.active) this.hoveringObjectTarget.onUnhover.notify(this.hoveringObject, this, originalEvent);\r\n this.globalTarget.onUnhover.notify(this.hoveringObject, this, originalEvent);\r\n } else {\r\n this.hitTestTarget.onUnhover.notify(null, this, originalEvent);\r\n }\r\n\r\n this.hoveringObject = null;\r\n this.hoveringObjectTarget = null;\r\n\r\n this._pp_updateCursorStyle();\r\n }\r\n\r\n if (this.hoveringObject != null) {\r\n this._lastIsDown = this._isDown;\r\n } else {\r\n this._isDown = false;\r\n this._lastIsDown = false;\r\n\r\n this._isDownForUpWithDown = false;\r\n }\r\n\r\n this._isUpWithNoDown = false;\r\n };\r\n\r\n cursorComponentMod._pp_rayCast = function _pp_rayCast() {\r\n let rayHit =\r\n this.rayCastMode == 0\r\n ? Globals.getScene(this.engine).rayCast(\r\n this._origin,\r\n this._direction,\r\n this._collisionMask\r\n )\r\n : Globals.getPhysics(this.engine).rayCast(\r\n this._origin,\r\n this._direction,\r\n this._collisionMask,\r\n this.maxDistance\r\n );\r\n\r\n let rayHitCollisionDistanceValid = true;\r\n if (this.rayCastMode == 0 && rayHit.hitCount > 0 && rayHit.distances[0] > this.maxDistance) {\r\n rayHitCollisionDistanceValid = false;\r\n }\r\n\r\n this._hitObjectData[0] = null;\r\n this._hitObjectData[1] = null;\r\n this._hitObjectData[2] = null;\r\n\r\n let hitTestResultDistance = Infinity;\r\n if (this._hitTestLocation != null && this._hitTestLocation.visible) {\r\n this._hitTestObject.pp_getPositionWorld(this.cursorPos);\r\n this._rayHitLocation.vec3_copy(this.cursorPos);\r\n hitTestResultDistance = this.cursorPos.vec3_distance(this.object.pp_getPositionWorld(this._tempVec));\r\n\r\n this._hitObjectData[0] = this._hitTestObject;\r\n this._hitObjectData[1] = this._rayHitLocation;\r\n }\r\n\r\n this.hoveringReality = false;\r\n\r\n if (rayHit.hitCount > 0 && rayHitCollisionDistanceValid) {\r\n let rayHitDistance = rayHit.distances[0];\r\n if (rayHitDistance <= hitTestResultDistance) {\r\n // Overwrite cursorPos set by hit test location\r\n this.cursorPos.vec3_copy(rayHit.locations[0]);\r\n this._rayHitLocation.vec3_copy(this.cursorPos);\r\n\r\n this._hitObjectData[0] = rayHit.objects[0];\r\n this._hitObjectData[1] = this._rayHitLocation;\r\n } else {\r\n this.hoveringReality = true;\r\n }\r\n } else if (hitTestResultDistance == Infinity) {\r\n this.cursorPos.vec3_zero();\r\n\r\n this._hitObjectData[0] = null;\r\n this._hitObjectData[1] = null;\r\n }\r\n\r\n let xrFrame = XRUtils.getFrame(this.engine);\r\n if (this.hoveringReality && xrFrame != null) {\r\n this._hitObjectData[2] = this._hitTestLocation.getHitTestResults(xrFrame)[0];\r\n }\r\n\r\n if (this._hitObjectData[0] != null) {\r\n const cursorTarget = this._hitObjectData[0].pp_getComponentSelf(CursorTarget);\r\n if (cursorTarget == null || !cursorTarget.active) {\r\n this._hitObjectData[0] = null;\r\n this._hitObjectData[1] = null;\r\n this._hitObjectData[2] = null;\r\n }\r\n }\r\n\r\n return this._hitObjectData;\r\n };\r\n\r\n cursorComponentMod._pp_updateMouseData = function _pp_updateMouseData(e, clientX, clientY, w, h, pointerID) {\r\n this._lastClientX = clientX;\r\n this._lastClientY = clientY;\r\n this._lastWidth = w;\r\n this._lastHeight = h;\r\n this._lastPointerID = pointerID;\r\n\r\n this._lastOriginalMouseEvent = e;\r\n };\r\n\r\n cursorComponentMod._pp_updateMousePos = function _pp_updateMousePos(clientX, clientY, w, h) {\r\n // Get direction in normalized device coordinate space from mouse position \r\n let left = clientX / w;\r\n let top = clientY / h;\r\n this._direction.vec3_set(left * 2 - 1, -top * 2 + 1, -1.0);\r\n\r\n this.updateDirection();\r\n };\r\n\r\n cursorComponentMod.pp_setViewComponent = function pp_setViewComponent(viewComponent) {\r\n this._viewComponent = viewComponent;\r\n\r\n // If this object also has a view component, we will enable inverse-projected mouse clicks,\r\n // otherwise just use the objects transformation\r\n if (this._viewComponent != null) {\r\n this._viewComponent.projectionMatrix.mat4_invert(this._projectionMatrix);\r\n\r\n if (!this._myViewEventListenersRegistered) {\r\n this._myViewEventListenersRegistered = true;\r\n\r\n this._myWindowResizeEventListener = () => {\r\n let bounds = document.body.getBoundingClientRect();\r\n this._screenSize[0] = bounds.width;\r\n this._screenSize[1] = bounds.height;\r\n };\r\n this._myWindowResizeEventListener();\r\n window.addEventListener(\"resize\", this._myWindowResizeEventListener);\r\n\r\n let onClick = this.onClick.bind(this);\r\n Globals.getCanvas(this.engine).addEventListener(\"click\", onClick);\r\n let onPointerDown = this.onPointerDown.bind(this);\r\n Globals.getCanvas(this.engine).addEventListener(\"pointerdown\", onPointerDown);\r\n let onPointerMove = this.onPointerMove.bind(this);\r\n Globals.getCanvas(this.engine).addEventListener(\"pointermove\", onPointerMove);\r\n let onPointerUp = this.onPointerUp.bind(this);\r\n Globals.getCanvas(this.engine).addEventListener(\"pointerup\", onPointerUp);\r\n let onPointerLeave = this._pp_onPointerLeave.bind(this);\r\n Globals.getCanvas(this.engine).addEventListener(\"pointerleave\", onPointerLeave);\r\n\r\n let onViewportResize = this._onViewportResize.bind(this);\r\n this.engine.onResize.add(onViewportResize);\r\n\r\n this._onDeactivateCallbacks.push(() => {\r\n Globals.getCanvas(this.engine).removeEventListener(\"click\", onClick);\r\n Globals.getCanvas(this.engine).removeEventListener(\"pointerdown\", onPointerDown);\r\n Globals.getCanvas(this.engine).removeEventListener(\"pointermove\", onPointerMove);\r\n Globals.getCanvas(this.engine).removeEventListener(\"pointerup\", onPointerUp);\r\n Globals.getCanvas(this.engine).removeEventListener(\"pointerleave\", onPointerLeave);\r\n\r\n this.engine.onResize.remove(onViewportResize);\r\n\r\n window.removeEventListener(\"resize\", this._myWindowResizeEventListener);\r\n\r\n this._myViewEventListenersRegistered = false;\r\n });\r\n }\r\n }\r\n\r\n this._viewComponentBackup = this._viewComponent;\r\n };\r\n\r\n cursorComponentMod._pp_onPointerLeave = function _pp_onPointerLeave(e) {\r\n if (this._pointerID == null || this._pointerID == e.pointerId || this.isHeadset) {\r\n this._pointerLeaveToProcess = true;\r\n this._pointerLeaveMouseEvent = e;\r\n }\r\n };\r\n\r\n cursorComponentMod._pp_processPointerLeave = function _pp_processPointerLeave() {\r\n if (this._pointerLeaveToProcess) {\r\n this._pointerID = null;\r\n\r\n this._lastPointerID = null;\r\n\r\n this._lastClientX = null;\r\n this._lastClientY = null;\r\n this._lastWidth = null;\r\n this._lastHeight = null;\r\n\r\n this._lastOriginalMouseEvent = this._pointerLeaveMouseEvent;\r\n\r\n this._pointerLeaveToProcess = false;\r\n this._pointerLeaveMouseEvent = null;\r\n\r\n if (this.hoveringObject != null) {\r\n this._pp_hoverBehaviour(null, null, null, this._lastOriginalMouseEvent, true); // Trigger Unhover\r\n }\r\n\r\n this._isDown = false;\r\n this._lastIsDown = false;\r\n this._isRealDown = false;\r\n\r\n this._isDownForUpWithDown = false;\r\n this._isUpWithNoDown = false;\r\n }\r\n };\r\n\r\n cursorComponentMod._pp_isDownToProcess = function _pp_isDownToProcess() {\r\n return this._isDown != this._lastIsDown && this._isDown;\r\n };\r\n\r\n cursorComponentMod._pp_isUpToProcess = function _pp_isUpToProcess() {\r\n return this._isDown != this._lastIsDown && !this._isDown;\r\n };\r\n\r\n cursorComponentMod._pp_isMoving = function () {\r\n let hitLocationLocalToTarget = vec3_create();\r\n return function _pp_isMoving(hitLocation) {\r\n let moving = false;\r\n\r\n hitLocationLocalToTarget = this.hoveringObject.pp_convertPositionWorldToLocal(hitLocation, hitLocationLocalToTarget);\r\n\r\n if (!hitLocationLocalToTarget.vec_equals(this._prevHitLocationLocalToTarget, 0.0001)) {\r\n moving = true;\r\n }\r\n\r\n return moving;\r\n };\r\n }();\r\n\r\n cursorComponentMod._pp_isAR = function _pp_isAR() {\r\n let firstInputSource = XRUtils.getSession(this.engine).inputSources[0];\r\n return this.input != null && firstInputSource.handedness == \"none\" && firstInputSource.gamepad != null;\r\n };\r\n\r\n cursorComponentMod._pp_updateCursorStyle = function _pp_updateCursorStyle() {\r\n if (this.styleCursor) {\r\n if (this.hoveringObjectTarget != null && !this.hoveringObjectTarget.isSurface) {\r\n document.body.style.cursor = \"pointer\";\r\n } else if (document.body.style.cursor == \"pointer\") {\r\n document.body.style.cursor = \"default\";\r\n }\r\n }\r\n };\r\n\r\n\r\n\r\n PluginUtils.injectOwnProperties(cursorComponentMod, Cursor.prototype, false, true, true);\r\n}", "import { Emitter } from \"@wonderlandengine/api\";\r\nimport { CursorTarget } from \"@wonderlandengine/components\";\r\nimport { PluginUtils } from \"../../../utils/plugin_utils.js\";\r\n\r\nimport \"./cursor_target_component_type_extension.js\";\r\n\r\nexport function initCursorTargetComponentMod(): void {\r\n _initCursorTargetComponentModPrototype();\r\n}\r\n\r\nfunction _initCursorTargetComponentModPrototype(): void {\r\n\r\n const cursorTargetComponentMod: Record = {\r\n\r\n // New Functions \r\n\r\n init(this: CursorTarget): void {\r\n this.onSingleClick = new Emitter();\r\n this.onDoubleClick = new Emitter();\r\n this.onTripleClick = new Emitter();\r\n\r\n this.onDownOnHover = new Emitter();\r\n\r\n this.onUpWithDown = new Emitter();\r\n this.onUpWithNoDown = new Emitter();\r\n\r\n this.isSurface = false;\r\n },\r\n\r\n start(): void { },\r\n update(dt: number): void { },\r\n onActivate(): void { },\r\n onDeactivate(): void { },\r\n onDestroy(): void { },\r\n };\r\n\r\n\r\n\r\n PluginUtils.injectOwnProperties(cursorTargetComponentMod, CursorTarget.prototype, false, true, true);\r\n}", "import { MouseLookComponent } from \"@wonderlandengine/components\";\r\nimport { Timer } from \"../../../../cauldron/cauldron/timer.js\";\r\nimport { Globals } from \"../../../../pp/globals.js\";\r\nimport { vec3_create } from \"../../../js/extensions/array/vec_create_extension.js\";\r\nimport { PluginUtils } from \"../../../utils/plugin_utils.js\";\r\n\r\nexport function initMouseLookComponentMod() {\r\n _initMouseLookComponentModPrototype();\r\n}\r\n\r\nfunction _initMouseLookComponentModPrototype() {\r\n\r\n let mouseLookComponentMod = {};\r\n\r\n // Modified Functions\r\n\r\n mouseLookComponentMod.init = function init() {\r\n this.pointerId = null;\r\n this.prevMoveEvent = null;\r\n\r\n this.resetMovingDelay = 0.15;\r\n this.resetMovingTimer = new Timer(this.resetMovingDelay, false);\r\n this.isMoving = false;\r\n this.mouseDown = false;\r\n\r\n this.pointerMoveListener = this._onMove.bind(this);\r\n\r\n this.contextMenuListener = function (event) {\r\n if (this.active) {\r\n event.preventDefault();\r\n }\r\n }.bind(this);\r\n\r\n this.pointerDown = function (event) {\r\n if (this.active) {\r\n if (this.pointerId != null) return;\r\n\r\n if (!this.mouseDown) {\r\n if (event.button == this.mouseButtonIndex) {\r\n this.pointerId = event.pointerId;\r\n this.mouseDown = true;\r\n // Commenting cursor style change for now since it messes with Cursor Component cursor style, which is more important to have,\r\n // since it provides a more important feedback, while here is mostly just a visual thing\r\n //document.body.style.cursor = \"grabbing\"; \r\n if (event.button == 1) {\r\n event.preventDefault(); // Prevent scrolling\r\n return false;\r\n }\r\n }\r\n }\r\n }\r\n }.bind(this);\r\n\r\n this.pointerUp = function (event) {\r\n if (this.active) {\r\n if (event.pointerId != this.pointerId) return;\r\n\r\n if (this.mouseDown) {\r\n if (event.button == this.mouseButtonIndex) {\r\n this.mouseDown = false;\r\n //document.body.style.cursor = \"default\";\r\n }\r\n }\r\n }\r\n }.bind(this);\r\n\r\n this.pointerLeave = function (event) {\r\n if (this.active) {\r\n if (event.pointerId != this.pointerId) return;\r\n\r\n this.pointerId = null;\r\n this.prevMoveEvent = null;\r\n\r\n if (this.mouseDown) {\r\n this.mouseDown = false;\r\n //document.body.style.cursor = \"default\";\r\n }\r\n }\r\n }.bind(this);\r\n };\r\n\r\n // New Functions\r\n\r\n mouseLookComponentMod.start = function start() { };\r\n\r\n mouseLookComponentMod.onActivate = function onActivate() {\r\n document.body.addEventListener(\"pointermove\", this.pointerMoveListener);\r\n\r\n if (this.requireMouseDown) {\r\n if (this.mouseButtonIndex == 2) {\r\n Globals.getCanvas(this.engine).addEventListener(\"contextmenu\", this.contextMenuListener, false);\r\n }\r\n\r\n Globals.getCanvas(this.engine).addEventListener(\"pointerdown\", this.pointerDown);\r\n\r\n document.body.addEventListener(\"pointerup\", this.pointerUp);\r\n }\r\n\r\n document.body.addEventListener(\"pointerleave\", this.pointerLeave);\r\n };\r\n\r\n mouseLookComponentMod.onDeactivate = function onDeactivate() {\r\n if (this.mouseDown) {\r\n //document.body.style.cursor = \"default\";\r\n }\r\n\r\n this.isMoving = false;\r\n this.mouseDown = false;\r\n\r\n this.pointerId = null;\r\n this.prevMoveEvent = null;\r\n\r\n document.body.removeEventListener(\"pointermove\", this.pointerMoveListener);\r\n Globals.getCanvas(this.engine).removeEventListener(\"contextmenu\", this.contextMenuListener);\r\n Globals.getCanvas(this.engine).removeEventListener(\"pointerdown\", this.pointerDown);\r\n document.body.removeEventListener(\"pointerup\", this.pointerUp);\r\n document.body.removeEventListener(\"pointerleave\", this.pointerLeave);\r\n };\r\n\r\n mouseLookComponentMod.update = function update(dt) {\r\n if (this.resetMovingTimer.isRunning()) {\r\n this.resetMovingTimer.update(dt);\r\n if (this.resetMovingTimer.isDone()) {\r\n this.resetMovingTimer.reset();\r\n this.isMoving = false;\r\n }\r\n }\r\n\r\n if (!this.isMoving) {\r\n if (!this.requireMouseDown || !this.mouseDown) {\r\n this.pointerId = null;\r\n }\r\n\r\n this.prevMoveEvent = null;\r\n }\r\n };\r\n\r\n mouseLookComponentMod._onMove = function () {\r\n let viewForward = vec3_create();\r\n let viewUp = vec3_create();\r\n\r\n let referenceUp = vec3_create();\r\n let referenceUpNegate = vec3_create();\r\n let referenceRight = vec3_create();\r\n\r\n let newUp = vec3_create();\r\n return function _onMove(event) {\r\n if (this.active) {\r\n if (this.pointerId != null && event.pointerId != this.pointerId) return;\r\n\r\n if (this.mouseDown || !this.requireMouseDown) {\r\n\r\n viewForward = this.object.pp_getBackward(viewForward); // The view \"real\" forward is actually the backward\r\n viewUp = this.object.pp_getUp(viewUp);\r\n\r\n referenceUp.vec3_set(0, 1, 0);\r\n if (this.object.pp_getParent() != null) {\r\n referenceUp = this.object.pp_getParent().pp_getUp(referenceUp);\r\n }\r\n\r\n referenceRight = viewForward.vec3_cross(referenceUp, referenceRight);\r\n\r\n let minAngle = 1;\r\n if (viewForward.vec3_angle(referenceUp) < minAngle) {\r\n referenceRight = viewUp.vec3_negate(referenceRight).vec3_cross(referenceUp, referenceRight);\r\n } else if (viewForward.vec3_angle(referenceUp.vec3_negate(referenceUpNegate)) < minAngle) {\r\n referenceRight = viewUp.vec3_cross(referenceUp, referenceRight);\r\n } else if (!viewUp.vec3_isConcordant(referenceUp)) {\r\n referenceRight.vec3_negate(referenceRight);\r\n }\r\n referenceRight.vec3_normalize(referenceRight);\r\n\r\n let movementX = event.movementX;\r\n let movementY = event.movementY;\r\n\r\n if (movementX == null || movementY == null) {\r\n if (this.prevMoveEvent != null) {\r\n movementX = event.pageX - this.prevMoveEvent.pageX;\r\n movementY = event.pageY - this.prevMoveEvent.pageY;\r\n } else {\r\n movementX = 0;\r\n movementY = 0;\r\n }\r\n }\r\n\r\n this.rotationX = -this.sensitity * movementX;\r\n this.rotationY = -this.sensitity * movementY;\r\n\r\n this.object.pp_rotateAxis(this.rotationY, referenceRight);\r\n\r\n let maxVerticalAngle = 89 - 0.001;\r\n newUp = this.object.pp_getUp(newUp);\r\n let angleWithUp = Math.pp_angleClamp(newUp.vec3_angleSigned(referenceUp, referenceRight));\r\n if (Math.abs(angleWithUp) > maxVerticalAngle) {\r\n let fixAngle = (Math.abs(angleWithUp) - maxVerticalAngle) * Math.pp_sign(angleWithUp);\r\n this.object.pp_rotateAxis(fixAngle, referenceRight);\r\n }\r\n\r\n this.object.pp_rotateAxis(this.rotationX, referenceUp);\r\n\r\n this.prevMoveEvent = event;\r\n this.pointerId = event.pointerId;\r\n\r\n this.resetMovingTimer.start(this.resetMovingDelay);\r\n this.isMoving = true;\r\n }\r\n }\r\n };\r\n }();\r\n\r\n\r\n\r\n PluginUtils.injectOwnProperties(mouseLookComponentMod, MouseLookComponent.prototype, false, true, true);\r\n}", "import { initCauldronMods } from \"./cauldron_mods.js\";\r\nimport { initCursorComponentMod } from \"./cursor_component_mod.js\";\r\nimport { initCursorTargetComponentMod } from \"./cursor_target_component_mod.js\";\r\nimport { initMouseLookComponentMod } from \"./mouse_look_component_mod.js\";\r\n\r\n/**\r\n * TS import preserver\r\n * \r\n * This is only needed to make it so the import is not removed, since it makes the type extensions available to the Typescript \r\n */\r\nimport \"./cauldron_mods.js\";\r\nimport \"./cursor_component_mod.js\";\r\nimport \"./cursor_target_component_mod.js\";\r\nimport \"./mouse_look_component_mod.js\";\r\n\r\nexport function initComponentMods(): void {\r\n initCursorComponentMod();\r\n initCursorTargetComponentMod();\r\n initMouseLookComponentMod();\r\n\r\n initCauldronMods();\r\n}", "import { initComponentMods } from \"./components/init_component_mods.js\";\r\n\r\n/**\r\n * TS import preserver\r\n * \r\n * This is only needed to make it so the import is not removed, since it makes the type extensions available to the Typescript \r\n */\r\nimport \"./components/init_component_mods.js\";\r\n\r\nexport function initWLMods(): void {\r\n initComponentMods();\r\n}", "import { initWLExtensions } from \"./extensions/init_wl_extentions.js\";\r\nimport { initWLMods } from \"./mods/init_wl_mods.js\";\r\n\r\n/**\r\n * TS import preserver\r\n * \r\n * This is only needed to make it so the import is not removed, since it makes the type extensions available to the Typescript \r\n */\r\nimport \"./extensions/init_wl_extentions.js\";\r\nimport \"./mods/init_wl_mods.js\";\r\n\r\nexport function initWLPlugins(): void {\r\n initWLExtensions();\r\n initWLMods();\r\n}", "import { initJSPlugins } from \"./js/init_js_plugins.js\";\r\nimport { initWLPlugins } from \"./wl/init_wl_plugins.js\";\r\n\r\n/**\r\n * TS import preserver\r\n * \r\n * This is only needed to make it so the import is not removed, since it makes the type extensions available to the Typescript \r\n */\r\nimport \"./js/init_js_plugins.js\";\r\nimport \"./wl/init_wl_plugins.js\";\r\n\r\nexport function initPlugins(): void {\r\n initJSPlugins();\r\n initWLPlugins();\r\n}", "export const PP_VERSION = \"0.7.3\";", "import { WonderlandEngine } from \"@wonderlandengine/api\";\r\nimport { registerWLComponents } from \"../cauldron/wl/register_wl_components.js\";\r\nimport { ComponentUtils } from \"../cauldron/wl/utils/component_utils.js\";\r\nimport { initPlugins } from \"../plugin/init_plugins.js\";\r\nimport { Globals } from \"./globals.js\";\r\nimport { PP_VERSION } from \"./pp_version.js\";\r\nimport { registerPPComponents } from \"./register_pp_components.js\";\r\n\r\n/**\r\n * TS import preserver\r\n * \r\n * This is only needed to make it so the import is not removed, since it makes the type extensions available to the Typescript \r\n */\r\nimport \"../plugin/init_plugins.js\";\r\n\r\nexport function initPP(engine: WonderlandEngine): void {\r\n console.log(\"PP version: \" + PP_VERSION);\r\n\r\n Globals.setMainEngine(engine);\r\n\r\n ComponentUtils.setWLComponentDefaultCloneCallbacks(engine);\r\n\r\n registerWLComponents(engine);\r\n registerPPComponents(engine);\r\n\r\n initPlugins();\r\n}", "import { Component, Property } from \"@wonderlandengine/api\";\r\nimport * as PPAPI from \"../../index.js\";\r\n\r\nexport class AddPPToWindowComponent extends Component {\r\n static TypeName = \"pp-add-pp-to-window\";\r\n static Properties = {\r\n _myAdd: Property.bool(true)\r\n };\r\n\r\n init() {\r\n this._myPP = null;\r\n if (this._myAdd) {\r\n this._myPP = {};\r\n this._addProperties(PPAPI);\r\n\r\n window.PP = this._myPP;\r\n }\r\n }\r\n\r\n _addProperties(object) {\r\n let propertyNames = Object.getOwnPropertyNames(object);\r\n for (let propertyName of propertyNames) {\r\n if (object[propertyName] != undefined) {\r\n this._myPP[propertyName] = object[propertyName];\r\n }\r\n }\r\n }\r\n\r\n onActivate() {\r\n if (this._myPP != null) {\r\n window.PP = this._myPP;\r\n }\r\n }\r\n\r\n onDeactivate() {\r\n if (this._myPP != null) {\r\n delete window.PP;\r\n }\r\n }\r\n}", "import { Howler } from \"howler\";\r\n\r\nexport function isPlaybackBlocked() {\r\n let blocked = false;\r\n\r\n if (Howler != null && Howler.state != \"running\") {\r\n blocked = true;\r\n }\r\n\r\n return blocked;\r\n}\r\n\r\nexport let AudioUtils = {\r\n isPlaybackBlocked\r\n};", "import { AudioPlayer } from \"../audio_player.js\";\r\n\r\nexport class HowlerAudioPlayer extends AudioPlayer {\r\n\r\n constructor(howl, audioSetup = null) {\r\n super(audioSetup, howl);\r\n\r\n if (audioSetup == null) {\r\n this._myAudioSetup.myAudioFilePath = this._myAudio._src;\r\n\r\n this._myAudioSetup.myLoop = this._myAudio._loop;\r\n this._myAudioSetup.myAutoPlay = this._myAudio._autoplay;\r\n\r\n this._myAudioSetup.myVolume = this._myAudio._volume;\r\n this._myAudioSetup.myRate = this._myAudio._rate;\r\n\r\n this._myAudioSetup.myPool = this._myAudio._pool;\r\n this._myAudioSetup.myPreload = this._myAudio._preload;\r\n\r\n this._myAudioSetup.myPosition = (this._myAudio._pos != null) ? this._myAudio._pos.vec3_clone() : null;\r\n this._myAudioSetup.mySpatial = this._myAudio._pos != null;\r\n this._myAudioSetup.myReferenceDistance = this._myAudio._pannerAttr.refDistance;\r\n } else {\r\n this._myAudioSetup.myAudioFilePath = this._myAudio._src;\r\n\r\n this._myAudio.loop(this._myAudioSetup.myLoop);\r\n this._myAudio._autoplay = this._myAudioSetup.myAutoPlay;\r\n\r\n this._myAudio.volume(this._myAudioSetup.myVolume);\r\n this._myAudio.rate(this._myAudioSetup.myRate);\r\n\r\n this._myAudio._pool = this._myAudioSetup.myPool;\r\n this._myAudio._preload = this._myAudioSetup.myPreload;\r\n\r\n this.updatePosition(this._myAudioSetup.myPosition);\r\n\r\n this._myAudio._pannerAttr.refDistance = this._myAudioSetup.myReferenceDistance;\r\n\r\n if (this._myAudioSetup.myAutoPlay) {\r\n this._myAudio.play();\r\n }\r\n }\r\n\r\n this._addListeners();\r\n }\r\n}", "import { Component } from \"@wonderlandengine/api\";\r\nimport { Howler } from \"howler\";\r\n\r\nexport class MuteEverythingComponent extends Component {\r\n static TypeName = \"pp-mute-everything\";\r\n\r\n start() {\r\n Howler.mute(true);\r\n }\r\n}", "import { Component } from \"@wonderlandengine/api\";\r\nimport { Howler } from \"howler\";\r\nimport { vec3_create } from \"../../plugin/js/extensions/array/vec_create_extension.js\";\r\n\r\nexport class SpatialAudioListenerComponent extends Component {\r\n static TypeName = \"pp-spatial-audio-listener\";\r\n\r\n init() {\r\n this._myOrigin = vec3_create();\r\n this._myForward = vec3_create();\r\n this._myUp = vec3_create();\r\n }\r\n\r\n start() {\r\n this._updateAudioListener();\r\n }\r\n\r\n update(dt) {\r\n this._updateAudioListener();\r\n }\r\n\r\n _updateAudioListener() {\r\n this.object.pp_getPosition(this._myOrigin);\r\n this.object.pp_getForward(this._myForward);\r\n this.object.pp_getUp(this._myUp);\r\n\r\n Howler.pos(this._myOrigin[0], this._myOrigin[1], this._myOrigin[2]);\r\n Howler.orientation(this._myForward[0], this._myForward[1], this._myForward[2],\r\n this._myUp[0], this._myUp[1], this._myUp[2]);\r\n }\r\n}", "import { Component, PhysXComponent, Property, Shape } from \"@wonderlandengine/api\";\r\nimport { vec3_create } from \"../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Globals } from \"../../pp/globals.js\";\r\nimport { Timer } from \"../cauldron/timer.js\";\r\nimport { PhysicsCollisionCollector } from \"../physics/physics_collision_collector.js\";\r\nimport { RaycastParams, RaycastResults } from \"../physics/physics_raycast_params.js\";\r\nimport { PhysicsUtils } from \"../physics/physics_utils.js\";\r\n\r\n// Adjust the gravity to a low value like -0.05 to have better results, since the dynamic objects will move slowly instead of quickly falling far away\r\nexport class BenchmarkMaxPhysXComponent extends Component {\r\n static TypeName = \"pp-benchmark-max-physx\";\r\n static Properties = {\r\n _myStaticDomeSize: Property.float(40),\r\n _myStaticPhysXCount: Property.int(1000),\r\n _myDynamicDomeSize: Property.float(80),\r\n _myDynamicPhysXCount: Property.int(250),\r\n _myKinematicDomeSize: Property.float(120),\r\n _myKinematicPhysXCount: Property.int(250),\r\n _myRaycastCount: Property.int(100),\r\n _myVisualizeRaycast: Property.bool(false),\r\n _myVisualizeRaycastDelay: Property.float(0.5),\r\n\r\n // You can use this to test with convex mesh, \r\n // but u first need to add a physx with a convex mesh to the scene and read the shapeData index on the component to set it as _myShapeIndex\r\n _myUseConvexMesh: Property.bool(false),\r\n _myShapeIndex: Property.int(0),\r\n _myShapeScaleMultiplier: Property.float(1), // Used to adjust the scale of the convex mesh if too big or small based on how u imported it\r\n\r\n _myLogEnabled: Property.bool(true),\r\n _myClearConsoleBeforeLog: Property.bool(true)\r\n };\r\n\r\n start() {\r\n this._myActive = false;\r\n\r\n if (Globals.isDebugEnabled(this.engine)) {\r\n this._myActive = true;\r\n }\r\n\r\n this._myStarted = false;\r\n this._myPreStartTimer = new Timer(1);\r\n }\r\n\r\n _start() {\r\n this._myParentObject = this.object.pp_addChild();\r\n\r\n this._myRaycastParams = new RaycastParams(Globals.getPhysics(this.engine));\r\n this._myRaycastResults = new RaycastResults();\r\n\r\n this._myStaticPhysXObjects = [];\r\n this._myStaticPhysXComponents = [];\r\n this._myStaticPhysXCollectors = [];\r\n this._myDynamicPhysXObjects = [];\r\n this._myDynamicPhysXComponents = [];\r\n this._myDynamicPhysXCollectors = [];\r\n this._myKinematicPhysXObjects = [];\r\n this._myKinematicPhysXComponents = [];\r\n this._myKinematicPhysXCollectors = [];\r\n\r\n this._spawnDome(true, false);\r\n this._spawnDome(false, false);\r\n this._spawnDome(false, true);\r\n\r\n this._myStartTimer = new Timer(1);\r\n this._myTimer = new Timer(0);\r\n this._myDebugTimer = new Timer(this._myVisualizeRaycastDelay);\r\n this._myLogEnabledTimer = new Timer(1);\r\n this._myFPSHistory = [];\r\n for (let i = 0; i < 7; i++) {\r\n this._myFPSHistory.push(0);\r\n }\r\n\r\n this._myAddVelocityDelay = 10;\r\n\r\n this._myTranslateVec3 = vec3_create();\r\n this._myRotateVec3 = vec3_create();\r\n\r\n this._myStarted = true;\r\n }\r\n\r\n update(dt) {\r\n if (!this._myActive || !Globals.isDebugEnabled(this.engine)) return;\r\n\r\n if (!this._myStarted) {\r\n this._myPreStartTimer.update(dt);\r\n if (this._myPreStartTimer.isDone()) {\r\n this._start();\r\n }\r\n } else {\r\n this._myStartTimer.update(dt);\r\n if (this._myStartTimer.isDone()) {\r\n this._myTimer.update(dt);\r\n this._myDebugTimer.update(dt);\r\n this._myLogEnabledTimer.update(dt);\r\n if (this._myTimer.isDone()) {\r\n this._myTimer.start();\r\n\r\n let debugEnabled = false;\r\n if (this._myDebugTimer.isDone()) {\r\n this._myDebugTimer.start();\r\n debugEnabled = true;\r\n }\r\n\r\n debugEnabled = debugEnabled && this._myVisualizeRaycast;\r\n this._raycastTest(debugEnabled);\r\n }\r\n\r\n this._myFPSHistory.pop();\r\n this._myFPSHistory.unshift(Math.round(1 / dt));\r\n\r\n if (this._myLogEnabled) {\r\n if (this._myLogEnabledTimer.isDone()) {\r\n this._myLogEnabledTimer.start();\r\n if (this._myClearConsoleBeforeLog) {\r\n console.clear();\r\n }\r\n console.log(\"Static PhysX Dome Size:\", this._myStaticPhysXObjects.length);\r\n console.log(\"Dynamic PhysX Dome Size:\", this._myDynamicPhysXObjects.length);\r\n console.log(\"Kinematic PhysX Dome Size:\", this._myKinematicPhysXObjects.length);\r\n\r\n let staticCollisions = 0;\r\n for (let collector of this._myStaticPhysXCollectors) {\r\n staticCollisions += collector.getCollisions().length;\r\n }\r\n\r\n let dynamicCollisions = 0;\r\n for (let collector of this._myDynamicPhysXCollectors) {\r\n dynamicCollisions += collector.getCollisions().length;\r\n }\r\n\r\n let kinematicCollisions = 0;\r\n for (let collector of this._myKinematicPhysXCollectors) {\r\n kinematicCollisions += collector.getCollisions().length;\r\n }\r\n\r\n // Every collision is considered twice since it is caught by 2 physX\r\n let totalCollisions = (staticCollisions + dynamicCollisions + kinematicCollisions) / 2;\r\n\r\n console.log(\"Current Collisions Count:\", totalCollisions);\r\n console.log(\"Raycast Count:\", this._myRaycastCount);\r\n console.log(\"FPS History:\");\r\n let fpsString = \"\";\r\n for (let fps of this._myFPSHistory) {\r\n fpsString = fpsString.concat(fps, \"\\n\");\r\n }\r\n console.log(fpsString);\r\n }\r\n }\r\n }\r\n\r\n if (this._myAddVelocityDelay > 0) {\r\n this._myAddVelocityDelay--;\r\n if (this._myAddVelocityDelay == 0) {\r\n for (let physX of this._myDynamicPhysXComponents) {\r\n physX.kinematic = false;\r\n let strength = 50;\r\n physX.linearVelocity = [Math.pp_random(-strength, strength), Math.pp_random(-strength, strength), Math.pp_random(-strength, strength)];\r\n physX.angularVelocity = [Math.pp_random(-strength, strength), Math.pp_random(-strength, strength), Math.pp_random(-strength, strength)];\r\n }\r\n }\r\n }\r\n\r\n for (let physX of this._myKinematicPhysXObjects) {\r\n let strength = 5 * dt;\r\n this._myTranslateVec3.vec3_set(Math.pp_random(-strength, strength), Math.pp_random(-strength, strength), Math.pp_random(-strength, strength));\r\n physX.pp_translate(this._myTranslateVec3);\r\n\r\n let rotateStrength = 50 * dt;\r\n this._myRotateVec3.vec3_set(Math.pp_random(-rotateStrength, rotateStrength), Math.pp_random(-rotateStrength, rotateStrength), Math.pp_random(-rotateStrength, rotateStrength));\r\n physX.pp_rotate(this._myRotateVec3);\r\n }\r\n }\r\n }\r\n\r\n _raycastTest(debugEnabled) {\r\n let raycastCount = this._myRaycastCount;\r\n\r\n let distance = 10000;\r\n\r\n for (let i = 0; i < raycastCount; i++) {\r\n let origin = [Math.pp_random(1, 2) * Math.pp_randomSign(), Math.pp_random(1, 2) * Math.pp_randomSign(), Math.pp_random(1, 2) * Math.pp_randomSign()];\r\n let direction = [Math.pp_random(-1, 1), Math.pp_random(-1, 1), Math.pp_random(-1, 1)];\r\n direction.vec3_normalize(direction);\r\n\r\n this._myRaycastParams.myOrigin.vec3_copy(origin);\r\n this._myRaycastParams.myDirection.vec3_copy(direction);\r\n this._myRaycastParams.myDistance = distance;\r\n this._myRaycastParams.myBlockLayerFlags.setAllFlagsActive();\r\n\r\n let raycastResults = PhysicsUtils.raycast(this._myRaycastParams, this._myRaycastResults);\r\n\r\n if (debugEnabled && Globals.isDebugEnabled(this.engine)) {\r\n Globals.getDebugVisualManager(this.engine).drawRaycast(this._myDebugTimer.getDuration(), raycastResults, true, 5, 0.015);\r\n }\r\n }\r\n }\r\n\r\n _spawnDome(staticDome, dynamicDome) {\r\n let maxCount = this._myStaticPhysXCount;\r\n let physXList = this._myStaticPhysXObjects;\r\n let cloves = Math.ceil(Math.sqrt(this._myStaticPhysXCount));\r\n if (!staticDome) {\r\n if (dynamicDome) {\r\n cloves = Math.ceil(Math.sqrt(this._myDynamicPhysXCount));\r\n maxCount = this._myDynamicPhysXCount;\r\n physXList = this._myDynamicPhysXObjects;\r\n } else {\r\n cloves = Math.ceil(Math.sqrt(this._myKinematicPhysXCount));\r\n maxCount = this._myKinematicPhysXCount;\r\n physXList = this._myKinematicPhysXObjects;\r\n }\r\n }\r\n\r\n let angleForClove = Math.PI * 2 / cloves;\r\n\r\n let minDistance = Math.max(0, this._myStaticDomeSize - 20);\r\n let maxDistance = this._myStaticDomeSize + 20;\r\n\r\n if (!staticDome) {\r\n if (dynamicDome) {\r\n minDistance = Math.max(0, this._myDynamicDomeSize - 20);\r\n maxDistance = this._myDynamicDomeSize + 20;\r\n } else {\r\n minDistance = Math.max(0, this._myKinematicDomeSize - 20);\r\n maxDistance = this._myKinematicDomeSize + 20;\r\n }\r\n }\r\n\r\n let minExtraRotation = 0;\r\n let maxExtraRotation = Math.pp_toRadians(10);\r\n\r\n let upDirection = vec3_create(0, 1, 0);\r\n let horizontalDirection = vec3_create(0, 0, -1);\r\n\r\n for (let i = 0; i < cloves / 2; i++) {\r\n let verticalDirection = vec3_create(0, 1, 0);\r\n\r\n let rotationAxis = vec3_create();\r\n horizontalDirection.vec3_cross(verticalDirection, rotationAxis);\r\n rotationAxis.vec3_normalize(rotationAxis);\r\n\r\n for (let j = 0; j < cloves; j++) {\r\n if (physXList.length < maxCount) {\r\n let distance = Math.random() * (maxDistance - minDistance) + minDistance;\r\n let extraAxisRotation = (Math.random() * 2 - 1) * (maxExtraRotation - minExtraRotation) + minExtraRotation;\r\n let extraUpRotation = (Math.random() * 2 - 1) * (maxExtraRotation - minExtraRotation) + minExtraRotation;\r\n let physXDirection = verticalDirection.pp_clone();\r\n\r\n physXDirection.vec3_rotateAxisRadians(extraAxisRotation, rotationAxis, physXDirection);\r\n physXDirection.vec3_rotateAxisRadians(extraUpRotation, upDirection, physXDirection);\r\n\r\n physXDirection.vec3_scale(distance, physXDirection);\r\n\r\n this._addPhysX(physXDirection, staticDome, dynamicDome);\r\n }\r\n\r\n verticalDirection.vec3_rotateAxisRadians(angleForClove / 2, rotationAxis, verticalDirection);\r\n\r\n if (physXList.length < maxCount) {\r\n let distance = Math.random() * (maxDistance - minDistance) + minDistance;\r\n let extraAxisRotation = (Math.random() * 2 - 1) * (maxExtraRotation - minExtraRotation) + minExtraRotation;\r\n let extraUpRotation = (Math.random() * 2 - 1) * (maxExtraRotation - minExtraRotation) + minExtraRotation;\r\n let physXDirection = verticalDirection.pp_clone();\r\n\r\n physXDirection.vec3_rotateAxisRadians(extraAxisRotation, rotationAxis, physXDirection);\r\n physXDirection.vec3_rotateAxisRadians(extraUpRotation, upDirection, physXDirection);\r\n\r\n physXDirection.vec3_scale(distance, physXDirection);\r\n\r\n this._addPhysX(physXDirection, staticDome, dynamicDome);\r\n }\r\n\r\n verticalDirection.vec3_rotateAxisRadians(angleForClove / 2, rotationAxis, verticalDirection);\r\n\r\n }\r\n\r\n horizontalDirection.vec3_rotateAxisRadians(angleForClove, upDirection, horizontalDirection);\r\n }\r\n }\r\n\r\n _addPhysX(physXDirection, staticDome, dynamicDome) {\r\n let position = physXDirection;\r\n let scale = Math.pp_random(1, 10);\r\n let shape = Math.pp_randomPick(Shape.Sphere, Shape.Box);\r\n if (this._myUseConvexMesh) {\r\n shape = Shape.ConvexMesh;\r\n scale *= this._myShapeScaleMultiplier;\r\n }\r\n\r\n let physX = this._myParentObject.pp_addChild();\r\n physX.pp_setPosition(position);\r\n\r\n let physXComponent = physX.pp_addComponent(PhysXComponent, {\r\n \"shape\": shape,\r\n \"shapeData\": { index: this._myShapeIndex },\r\n \"extents\": vec3_create(scale, scale, scale),\r\n \"static\": staticDome,\r\n \"kinematic\": !dynamicDome,\r\n \"mass\": 1\r\n });\r\n\r\n if (staticDome) {\r\n this._myStaticPhysXObjects.push(physX);\r\n this._myStaticPhysXComponents.push(physXComponent);\r\n this._myStaticPhysXCollectors.push(new PhysicsCollisionCollector(physXComponent));\r\n } else if (dynamicDome) {\r\n this._myDynamicPhysXObjects.push(physX);\r\n this._myDynamicPhysXComponents.push(physXComponent);\r\n this._myDynamicPhysXCollectors.push(new PhysicsCollisionCollector(physXComponent));\r\n } else {\r\n this._myKinematicPhysXObjects.push(physX);\r\n this._myKinematicPhysXComponents.push(physXComponent);\r\n this._myKinematicPhysXCollectors.push(new PhysicsCollisionCollector(physXComponent));\r\n }\r\n }\r\n\r\n onActivate() {\r\n if (this._myStaticPhysXCollectors != null) {\r\n for (let collector of this._myStaticPhysXCollectors) {\r\n collector.setActive(true);\r\n }\r\n }\r\n\r\n if (this._myDynamicPhysXCollectors != null) {\r\n for (let collector of this._myDynamicPhysXCollectors) {\r\n collector.setActive(true);\r\n }\r\n }\r\n\r\n if (this._myKinematicPhysXCollectors != null) {\r\n for (let collector of this._myKinematicPhysXCollectors) {\r\n collector.setActive(true);\r\n }\r\n }\r\n }\r\n\r\n onDeactivate() {\r\n if (this._myStaticPhysXCollectors != null) {\r\n for (let collector of this._myStaticPhysXCollectors) {\r\n collector.setActive(false);\r\n }\r\n }\r\n\r\n if (this._myDynamicPhysXCollectors != null) {\r\n for (let collector of this._myDynamicPhysXCollectors) {\r\n collector.setActive(false);\r\n }\r\n }\r\n\r\n if (this._myKinematicPhysXCollectors != null) {\r\n for (let collector of this._myKinematicPhysXCollectors) {\r\n collector.setActive(false);\r\n }\r\n }\r\n }\r\n\r\n onDestroy() {\r\n if (this._myStaticPhysXCollectors != null) {\r\n for (let collector of this._myStaticPhysXCollectors) {\r\n collector.destroy();\r\n }\r\n }\r\n\r\n if (this._myDynamicPhysXCollectors != null) {\r\n for (let collector of this._myDynamicPhysXCollectors) {\r\n collector.destroy();\r\n }\r\n }\r\n\r\n if (this._myKinematicPhysXCollectors != null) {\r\n for (let collector of this._myKinematicPhysXCollectors) {\r\n collector.destroy();\r\n }\r\n }\r\n }\r\n}", "import { CollisionEventType, Emitter, Object3D, PhysXComponent } from \"@wonderlandengine/api\";\r\nimport { Timer } from \"../cauldron/timer.js\";\r\n\r\nexport class PhysicsCollisionCollector {\r\n\r\n private readonly _myPhysXComponent: PhysXComponent;\r\n\r\n private _myActive: boolean = false;\r\n\r\n private _myCollisionCallbackID: number | null = null;\r\n\r\n private _myCollisionEmitter: Emitter<[PhysXComponent, PhysXComponent, CollisionEventType]> = new Emitter();\r\n private _myCollisionStartEmitter: Emitter<[PhysXComponent, PhysXComponent, CollisionEventType]> = new Emitter();\r\n private _myCollisionEndEmitter: Emitter<[PhysXComponent, PhysXComponent, CollisionEventType]> = new Emitter();\r\n\r\n private readonly _myCollisions: PhysXComponent[] = [];\r\n private _myCollisionsStarted: PhysXComponent[] = [];\r\n private _myCollisionsEnded: PhysXComponent[] = [];\r\n private _myCollisionsStartedToProcess: PhysXComponent[] = [];\r\n private _myCollisionsEndedToProcess: PhysXComponent[] = [];\r\n\r\n // This separation is needed so it's possible to return the physx component list without having to build it every time\r\n // Beside, this is only needed due to trigger not detecting a collision end if the physX component they are colliding with goes inactive or is destroyed\r\n private readonly _myCollisionObjects: Object3D[] = [];\r\n private _myCollisionObjectsStarted: Object3D[] = [];\r\n private _myCollisionObjectsEnded: Object3D[] = [];\r\n private _myCollisionObjectsStartedToProcess: Object3D[] = [];\r\n private _myCollisionObjectsEndedToProcess: Object3D[] = [];\r\n\r\n private _myUpdateActive: boolean = false;\r\n private _myCollisionStartEndProcessingActive: boolean = true;\r\n\r\n private readonly _myTriggerDesyncFixDelay: Timer = new Timer(0.1);\r\n\r\n private _myLogEnabled: boolean = false;\r\n\r\n private _myDestroyed: boolean = false;\r\n\r\n constructor(physXComponent: PhysXComponent) {\r\n this._myPhysXComponent = physXComponent;\r\n\r\n this.setActive(true);\r\n }\r\n\r\n public getPhysXComponent(): PhysXComponent {\r\n return this._myPhysXComponent;\r\n }\r\n\r\n public getCollisions(): Readonly {\r\n return this._myCollisions;\r\n }\r\n\r\n public getCollisionsStarted(): Readonly {\r\n return this._myCollisionsStarted;\r\n }\r\n\r\n public getCollisionsEnded(): Readonly {\r\n return this._myCollisionsEnded;\r\n }\r\n\r\n public isActive(): boolean {\r\n return this._myActive;\r\n }\r\n\r\n public setActive(active: boolean): void {\r\n if (this._myActive != active) {\r\n this._myActive = active;\r\n\r\n this._myCollisions.pp_clear();\r\n this._myCollisionObjects.pp_clear();\r\n\r\n this._myCollisionsStarted.pp_clear();\r\n this._myCollisionObjectsStarted.pp_clear();\r\n this._myCollisionsEnded.pp_clear();\r\n this._myCollisionObjectsEnded.pp_clear();\r\n\r\n this._myCollisionsStartedToProcess.pp_clear();\r\n this._myCollisionObjectsStartedToProcess.pp_clear();\r\n this._myCollisionsEndedToProcess.pp_clear();\r\n this._myCollisionObjectsEndedToProcess.pp_clear();\r\n\r\n if (this._myActive) {\r\n this._myCollisionCallbackID = this._myPhysXComponent.onCollision(this._onCollision.bind(this));\r\n } else if (this._myCollisionCallbackID != null && !this._myPhysXComponent.isDestroyed) {\r\n this._myPhysXComponent.removeCollisionCallback(this._myCollisionCallbackID);\r\n this._myCollisionCallbackID = null;\r\n }\r\n }\r\n }\r\n\r\n /** `update` is not mandatory, use it only if u want to access collisions start and end or if the phsyX is a trigger */\r\n public update(dt: number): void {\r\n if (!this._myActive) {\r\n return;\r\n }\r\n\r\n this._myUpdateActive = true;\r\n\r\n if (this._myCollisionStartEndProcessingActive) {\r\n const prevCollisionsStartToProcess = this._myCollisionsStartedToProcess;\r\n this._myCollisionsStartedToProcess = this._myCollisionsStarted;\r\n this._myCollisionsStartedToProcess.pp_clear();\r\n this._myCollisionsStarted = prevCollisionsStartToProcess;\r\n\r\n const prevCollisionObjectsStartToProcess = this._myCollisionObjectsStartedToProcess;\r\n this._myCollisionObjectsStartedToProcess = this._myCollisionObjectsStarted;\r\n this._myCollisionObjectsStartedToProcess.pp_clear();\r\n this._myCollisionObjectsStarted = prevCollisionObjectsStartToProcess;\r\n\r\n const prevCollisionsEndToProcess = this._myCollisionsEndedToProcess;\r\n this._myCollisionsEndedToProcess = this._myCollisionsEnded;\r\n this._myCollisionsEndedToProcess.pp_clear();\r\n this._myCollisionsEnded = prevCollisionsEndToProcess;\r\n\r\n const prevCollisionObjectsEndToProcess = this._myCollisionObjectsEndedToProcess;\r\n this._myCollisionObjectsEndedToProcess = this._myCollisionObjectsEnded;\r\n this._myCollisionObjectsEndedToProcess.pp_clear();\r\n this._myCollisionObjectsEnded = prevCollisionObjectsEndToProcess;\r\n }\r\n\r\n if (this._myPhysXComponent.trigger) {\r\n this._triggerDesyncFix(dt);\r\n }\r\n }\r\n\r\n /** Set to `true` only if u are going to actually update this object and don't want to \r\n lose any collision start or end events prior to updating the first time after activation, \r\n since on update this flag is automatically set to `true` */\r\n public setUpdateActive(active: boolean): void {\r\n this._myUpdateActive = active;\r\n }\r\n\r\n /** If this is set to `false` you won't be able to get the collision that just started or ended, but just the current colliding ones \r\n Keep in mind that you also need to update the collector for this to work */\r\n public setCollisionStartEndProcessingActive(active: boolean): void {\r\n this._myCollisionStartEndProcessingActive = active;\r\n }\r\n\r\n public isLogEnabled(): boolean {\r\n return this._myLogEnabled;\r\n }\r\n\r\n public setLogEnabled(enabled: boolean): void {\r\n this._myLogEnabled = enabled;\r\n }\r\n\r\n public registerCollisionEventListener(id: unknown, listener: (currentPhysX: PhysXComponent, otherPhysX: PhysXComponent, collisionType: CollisionEventType) => void): void {\r\n this._myCollisionEmitter.add(listener, { id: id });\r\n }\r\n\r\n public unregisterCollisionEventListener(id: unknown): void {\r\n this._myCollisionEmitter.remove(id);\r\n }\r\n\r\n public registerCollisionStartEventListener(id: unknown, listener: (currentPhysX: PhysXComponent, otherPhysX: PhysXComponent, collisionType: CollisionEventType) => void): void {\r\n this._myCollisionStartEmitter.add(listener, { id: id });\r\n }\r\n\r\n public unregisterCollisionStartEventListener(id: unknown): void {\r\n this._myCollisionStartEmitter.remove(id);\r\n }\r\n\r\n public registerCollisionEndEventListener(id: unknown, listener: (currentPhysX: PhysXComponent, otherPhysX: PhysXComponent, collisionType: CollisionEventType) => void): void {\r\n this._myCollisionEndEmitter.add(listener, { id: id });\r\n }\r\n\r\n public unregisterCollisionEndEventListener(id: unknown): void {\r\n this._myCollisionEndEmitter.remove(id);\r\n }\r\n\r\n private _onCollision(type: CollisionEventType, physXComponent: PhysXComponent): void {\r\n let collisionValid = this._areLayerFlagsMatching(physXComponent);\r\n\r\n if (collisionValid) {\r\n if (type == CollisionEventType.Touch || type == CollisionEventType.TriggerTouch) {\r\n collisionValid = this._onCollisionStart(type, physXComponent);\r\n } else if (type == CollisionEventType.TouchLost || type == CollisionEventType.TriggerTouchLost) {\r\n collisionValid = this._onCollisionEnd(type, physXComponent, physXComponent.object);\r\n }\r\n\r\n if (collisionValid) {\r\n this._myCollisionEmitter.notify(this._myPhysXComponent, physXComponent, type);\r\n }\r\n }\r\n }\r\n\r\n private _onCollisionStart(type: CollisionEventType, physXComponent: PhysXComponent): boolean {\r\n let componentFound = false;\r\n for (const physXComponentToCheck of this._myCollisions) {\r\n if (physXComponentToCheck == physXComponent) {\r\n componentFound = true;\r\n break;\r\n }\r\n }\r\n\r\n if (this._myLogEnabled && componentFound) {\r\n console.error(\"Collision Start on PhysX component already collected\");\r\n }\r\n\r\n if (!componentFound) {\r\n this._myCollisions.push(physXComponent);\r\n this._myCollisionObjects.push(physXComponent.object);\r\n\r\n if (this._myUpdateActive && this._myCollisionStartEndProcessingActive) {\r\n this._myCollisionsStartedToProcess.push(physXComponent);\r\n this._myCollisionObjectsStartedToProcess.push(physXComponent.object);\r\n\r\n const indexesToRemove = this._myCollisionsEndedToProcess.pp_findAllIndexes(function (physXComponentToCheck: PhysXComponent) {\r\n return physXComponentToCheck == physXComponent;\r\n });\r\n\r\n for (let i = indexesToRemove.length - 1; i >= 0; i--) {\r\n this._myCollisionsEndedToProcess.pp_removeIndex(indexesToRemove[i]);\r\n this._myCollisionObjectsEndedToProcess.pp_removeIndex(indexesToRemove[i]);\r\n }\r\n }\r\n\r\n if (this._myLogEnabled) {\r\n console.log(\"Collision Start - Object ID: \" + physXComponent.object.pp_getID());\r\n }\r\n\r\n this._myCollisionStartEmitter.notify(this._myPhysXComponent, physXComponent, type);\r\n\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n\r\n private _onCollisionEnd(type: CollisionEventType, physXComponent: PhysXComponent, physXObject: Object3D): boolean {\r\n let componentFound = false;\r\n for (const physXComponentToCheck of this._myCollisions) {\r\n if (physXComponentToCheck == physXComponent) {\r\n componentFound = true;\r\n break;\r\n }\r\n }\r\n\r\n if (this._myLogEnabled && !componentFound) {\r\n console.error(\"Collision End on physX component not collected - Object ID: \" + physXObject.pp_getID());\r\n }\r\n\r\n if (componentFound) {\r\n const indexesToRemove = this._myCollisions.pp_findAllIndexes(function (physXComponentToCheck: PhysXComponent) {\r\n return physXComponentToCheck == physXComponent;\r\n });\r\n\r\n for (let i = indexesToRemove.length - 1; i >= 0; i--) {\r\n this._myCollisions.pp_removeIndex(indexesToRemove[i]);\r\n this._myCollisionObjects.pp_removeIndex(indexesToRemove[i]);\r\n }\r\n\r\n if (this._myUpdateActive && this._myCollisionStartEndProcessingActive) {\r\n this._myCollisionsEndedToProcess.push(physXComponent);\r\n this._myCollisionObjectsEndedToProcess.push(physXObject);\r\n\r\n const indexesToRemove = this._myCollisionsStartedToProcess.pp_findAllIndexes(function (physXComponentToCheck: PhysXComponent) {\r\n return physXComponentToCheck == physXComponent;\r\n });\r\n\r\n for (let i = indexesToRemove.length - 1; i >= 0; i--) {\r\n this._myCollisionsStartedToProcess.pp_removeIndex(indexesToRemove[i]);\r\n this._myCollisionObjectsStartedToProcess.pp_removeIndex(indexesToRemove[i]);\r\n }\r\n }\r\n\r\n if (this._myLogEnabled) {\r\n console.log(\"Collision End - Object ID: \" + physXObject.pp_getID());\r\n }\r\n\r\n this._myCollisionEndEmitter.notify(this._myPhysXComponent, physXComponent, type);\r\n\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n\r\n private _areLayerFlagsMatching(physXComponent: PhysXComponent): boolean {\r\n if (!this._myPhysXComponent.trigger) {\r\n return true;\r\n }\r\n\r\n return (this._myPhysXComponent.groupsMask & physXComponent.groupsMask) > 0;\r\n }\r\n\r\n private static readonly _triggerDesyncFixSV =\r\n {\r\n findAllCallback(object: Readonly) {\r\n const physXComponent = object.pp_getComponentSelf(PhysXComponent);\r\n return physXComponent == null || !physXComponent.active;\r\n }\r\n };\r\n private _triggerDesyncFix(dt: number): void {\r\n this._myTriggerDesyncFixDelay.update(dt);\r\n if (this._myTriggerDesyncFixDelay.isDone()) {\r\n this._myTriggerDesyncFixDelay.start();\r\n\r\n if (this._myCollisionObjects.length > 0) {\r\n const findAllCallback = PhysicsCollisionCollector._triggerDesyncFixSV.findAllCallback;\r\n let collisionsToEndIndexes = null;\r\n\r\n if (!this._myPhysXComponent.active) {\r\n collisionsToEndIndexes = [];\r\n for (let i = 0; i < this._myCollisionObjects.length; i++) {\r\n collisionsToEndIndexes.push(i);\r\n }\r\n } else {\r\n collisionsToEndIndexes = this._myCollisionObjects.pp_findAllIndexes(findAllCallback);\r\n }\r\n\r\n if (collisionsToEndIndexes.length > 0) {\r\n const physXComponentsToEnd: [Object3D, PhysXComponent][] = [];\r\n for (let i = 0; i < collisionsToEndIndexes.length; i++) {\r\n physXComponentsToEnd.push([this._myCollisionObjects[collisionsToEndIndexes[i]], this._myCollisions[collisionsToEndIndexes[i]]]);\r\n }\r\n\r\n for (const physXComponentToEnd of physXComponentsToEnd) {\r\n if (this._myLogEnabled) {\r\n console.log(\"Trigger Desync Fix - Object ID: \" + physXComponentToEnd[0].pp_getID());\r\n }\r\n\r\n if (this._onCollisionEnd(CollisionEventType.TriggerTouchLost, physXComponentToEnd[1], physXComponentToEnd[0])) {\r\n this._myCollisionEmitter.notify(this._myPhysXComponent, physXComponentToEnd[1], CollisionEventType.TriggerTouchLost);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n public destroy(): void {\r\n this._myDestroyed = true;\r\n\r\n this.setActive(false);\r\n }\r\n\r\n public isDestroyed(): boolean {\r\n return this._myDestroyed;\r\n }\r\n}", "import { Alignment, Component, MeshComponent, Property, TextComponent, VerticalAlignment } from \"@wonderlandengine/api\";\r\nimport { vec2_create, vec3_create, vec4_create } from \"../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Globals } from \"../../pp/globals.js\";\r\nimport { Timer } from \"../cauldron/timer.js\";\r\nimport { ObjectPool, ObjectPoolParams } from \"../object_pool/object_pool.js\";\r\nimport { XRUtils } from \"../utils/xr_utils.js\";\r\nimport { MeshCreationParams, MeshCreationTriangleParams, MeshCreationVertexParams, MeshUtils } from \"../wl/utils/mesh_utils.js\";\r\nimport { ObjectCloneParams } from \"../wl/utils/object_utils.js\";\r\n\r\nexport class BenchmarkMaxVisibleTrianglesComponent extends Component {\r\n static TypeName = \"pp-benchmark-max-visible-triangles\";\r\n static Properties = {\r\n _myTargetFrameRate: Property.int(-1), // -1 means it will auto detect it at start\r\n _myTargetFrameRateThreshold: Property.int(3),\r\n _myStartPlaneCount: Property.int(1),\r\n _myPlaneTriangles: Property.int(100),\r\n _mySecondsBeforeDoubling: Property.float(0.5), // Higher gives a better frame rate evaluation\r\n _myDTHistoryToIgnorePercentage: Property.float(0.25),\r\n _myCloneMaterial: Property.bool(false),\r\n _myCloneMesh: Property.bool(false),\r\n\r\n _myLogEnabled: Property.bool(true),\r\n\r\n _myStartOnXRStart: Property.bool(false),\r\n _myDisplayInFrontOfPlayer: Property.bool(true),\r\n _myDisplayInFrontOfPlayerDistance: Property.float(10),\r\n\r\n _myPlaneMaterial: Property.material(),\r\n _myBackgroundMaterial: Property.material(),\r\n _myTextMaterial: Property.material(null)\r\n };\r\n\r\n _start() {\r\n if (this._myPlaneMaterial == null) {\r\n this._myPlaneMaterial = Globals.getDefaultMaterials(this.engine).myPhongOpaque.clone();\r\n this._myPlaneMaterial.diffuseColor = vec4_create(0.95, 0.95, 0.95, 1);\r\n this._myPlaneMaterial.ambientColor = vec4_create(0, 0, 0, 1);\r\n this._myPlaneMaterial.ambientFactor = 0.5;\r\n }\r\n\r\n if (this._myBackgroundMaterial == null) {\r\n this._myBackgroundMaterial = Globals.getDefaultMaterials(this.engine).myPhongOpaque.clone();\r\n this._myBackgroundMaterial.diffuseColor = vec4_create(0.25, 0.25, 0.25, 1);\r\n this._myBackgroundMaterial.ambientColor = vec4_create(0, 0, 0, 1);\r\n this._myBackgroundMaterial.ambientFactor = 0.5;\r\n }\r\n\r\n if (this._myTextMaterial == null) {\r\n this._myTextMaterial = Globals.getDefaultMaterials(this.engine).myText.clone();\r\n }\r\n\r\n this._myLagColor = vec4_create(0.6, 0, 0, 1);\r\n this._myNormalColor = vec4_create(0.25, 0.25, 0.25, 1);\r\n\r\n this._myRealTrianglesAmount = 0;\r\n\r\n let parent = this.object;\r\n if (this._myDisplayInFrontOfPlayer) {\r\n parent = Globals.getPlayerObjects(this.engine).myHead.pp_addChild();\r\n parent.pp_rotateAxis(180, vec3_create(0, 1, 0));\r\n parent.pp_translateLocal(vec3_create(0, 0, this._myDisplayInFrontOfPlayerDistance));\r\n }\r\n\r\n this._myTrianglesObject = parent.pp_addChild();\r\n\r\n this._myBackgroundObject = this._myTrianglesObject.pp_addChild();\r\n {\r\n let meshComponent = this._myBackgroundObject.pp_addComponent(MeshComponent);\r\n meshComponent.mesh = MeshUtils.createPlane(this.engine);\r\n meshComponent.material = this._myBackgroundMaterial.clone();\r\n }\r\n\r\n this._myPlaneObject = this._myTrianglesObject.pp_addChild();\r\n {\r\n let meshComponent = this._myPlaneObject.pp_addComponent(MeshComponent);\r\n meshComponent.mesh = this._createPlaneMesh(this._myPlaneTriangles);\r\n this._myRealTrianglesAmount = meshComponent.mesh.indexData.length / 3;\r\n meshComponent.material = this._myPlaneMaterial.clone();\r\n }\r\n\r\n let poolParams = new ObjectPoolParams();\r\n if (!this._myCloneMesh) {\r\n poolParams.myInitialPoolSize = 30000;\r\n } else {\r\n if (this._myRealTrianglesAmount <= 4) {\r\n poolParams.myInitialPoolSize = 15000;\r\n } else if (this._myRealTrianglesAmount <= 8) {\r\n poolParams.myInitialPoolSize = 10000;\r\n } else if (this._myRealTrianglesAmount <= 64) {\r\n poolParams.myInitialPoolSize = 7500;\r\n } else {\r\n poolParams.myInitialPoolSize = 5000;\r\n }\r\n }\r\n poolParams.myPercentageToAddWhenEmpty = 0;\r\n poolParams.myAmountToAddWhenEmpty = 10000;\r\n poolParams.myCloneParams = new ObjectCloneParams();\r\n poolParams.myCloneParams.myComponentDeepCloneParams.setDeepCloneComponentVariable(MeshComponent.TypeName, \"material\", this._myCloneMaterial);\r\n poolParams.myCloneParams.myComponentDeepCloneParams.setDeepCloneComponentVariable(MeshComponent.TypeName, \"mesh\", this._myCloneMesh);\r\n\r\n this._myPoolID = this.type + \"_\" + Math.pp_randomUUID();\r\n Globals.getObjectPoolManager(this.engine).addPool(this._myPoolID, new ObjectPool(this._myPlaneObject, poolParams));\r\n\r\n this._myBackgroundObject.pp_setActive(false);\r\n this._myPlaneObject.pp_setActive(false);\r\n\r\n this._myTextsObject = this._myTrianglesObject.pp_addChild();\r\n //this._myTextsObject.pp_addComponent(EasyTransformComponent);\r\n\r\n this._myTriangleTextObject = this._myTextsObject.pp_addChild();\r\n //this._myTriangleTextObject.pp_addComponent(EasyTransformComponent, { _myLocal: true });\r\n\r\n this._myTriangleTextComponent = this._myTriangleTextObject.pp_addComponent(TextComponent);\r\n\r\n this._myTriangleTextComponent.alignment = Alignment.Left;\r\n this._myTriangleTextComponent.verticalAlignment = VerticalAlignment.Line;\r\n this._myTriangleTextComponent.material = this._myTextMaterial.clone();\r\n this._myTriangleTextComponent.material.color = this._myNormalColor;\r\n this._myTriangleTextComponent.text = \" \";\r\n //this._myTriangleTextComponent.text = \"Triangles: 9999999\";\r\n\r\n this._myPlaneTextObject = this._myTextsObject.pp_addChild();\r\n\r\n this._myPlaneTextComponent = this._myPlaneTextObject.pp_addComponent(TextComponent);\r\n //this._myPlaneTextObject.pp_addComponent(EasyTransformComponent, { _myLocal: true });\r\n\r\n this._myPlaneTextComponent.alignment = Alignment.Left;\r\n this._myPlaneTextComponent.verticalAlignment = VerticalAlignment.Line;\r\n this._myPlaneTextComponent.material = this._myTextMaterial.clone();\r\n this._myPlaneTextComponent.material.color = this._myNormalColor;\r\n this._myPlaneTextComponent.text = \" \";\r\n //this._myPlaneTextComponent.text = \"Planes: 9999999\";\r\n\r\n this._myFPSTextObject = this._myTextsObject.pp_addChild();\r\n\r\n this._myFPSTextComponent = this._myFPSTextObject.pp_addComponent(TextComponent);\r\n //this._myFPSTextObject.pp_addComponent(EasyTransformComponent, { _myLocal: true });\r\n\r\n this._myFPSTextComponent.alignment = Alignment.Left;\r\n this._myFPSTextComponent.verticalAlignment = VerticalAlignment.Line;\r\n this._myFPSTextComponent.material = this._myTextMaterial.clone();\r\n this._myFPSTextComponent.material.color = this._myNormalColor;\r\n this._myFPSTextComponent.text = \" \";\r\n //this._myFPSTextComponent.text = \"FPS: 99.99\";\r\n\r\n this._myDoneTextObject = this._myTrianglesObject.pp_addChild();\r\n\r\n this._myDoneTextComponent = this._myDoneTextObject.pp_addComponent(TextComponent);\r\n //this._myDoneTextObject.pp_addComponent(EasyTransformComponent, { _myLocal: true });\r\n\r\n this._myDoneTextComponent.alignment = Alignment.Center;\r\n this._myDoneTextComponent.verticalAlignment = VerticalAlignment.Line;\r\n this._myDoneTextComponent.material = this._myTextMaterial.clone();\r\n this._myDoneTextComponent.material.color = this._myNormalColor;\r\n this._myDoneTextComponent.text = \" \";\r\n //this._myDoneTextComponent.text = \"End\";\r\n\r\n this._myTextsObject.pp_setPositionLocal(vec3_create(0, 4.3, 0));\r\n this._myTextsObject.pp_setScale(2.75);\r\n\r\n this._myTriangleTextObject.pp_setPositionLocal(vec3_create(-1.4, 0, 0));\r\n this._myPlaneTextObject.pp_setPositionLocal(vec3_create(0.55, 0, 0));\r\n this._myFPSTextObject.pp_setPositionLocal(vec3_create(-0.315, 0, 0));\r\n this._myDoneTextObject.pp_setPositionLocal(vec3_create(0, -4.6, 0));\r\n this._myDoneTextObject.pp_setScale(4);\r\n\r\n this._myBackgroundSize = 4;\r\n this._myBackgroundObject.pp_setActive(true);\r\n this._myBackgroundObject.pp_setScale(this._myBackgroundSize + 0.1);\r\n this._myBackgroundObject.pp_translateLocal(vec3_create(0, 0, -0.001));\r\n\r\n this._myDoubleTimer = new Timer(this._mySecondsBeforeDoubling);\r\n this._myDone = false;\r\n\r\n this._myCurrentPlanes = this._myStartPlaneCount;\r\n\r\n this._myDTHistory = [];\r\n\r\n this._myUpperLimit = -1;\r\n this._myLowerLimit = 0;\r\n\r\n this._myPlanes = [];\r\n this._mySkipNextFrames = 0;\r\n this._myMaxWaitFrames = 0;\r\n\r\n this._myMaxPlanesReached = false;\r\n\r\n this._myFirstTime = true;\r\n }\r\n\r\n _update(dt) {\r\n // Skip lag frames after the new set of plane has been shown, wait for it to be stable\r\n {\r\n if (dt < 0.00001) {\r\n return;\r\n }\r\n\r\n if (dt > 0.5 && this._myMaxWaitFrames > 0) {\r\n this._myMaxWaitFrames--;\r\n return;\r\n }\r\n\r\n this._myMaxWaitFrames = 10;\r\n\r\n if (this._mySkipNextFrames > 0) {\r\n this._mySkipNextFrames--;\r\n return;\r\n }\r\n }\r\n\r\n if (!this._myDone) {\r\n this._myDoubleTimer.update(dt);\r\n\r\n this._myDTHistory.push(dt);\r\n\r\n if (this._myDoubleTimer.isDone()) {\r\n this._myDoubleTimer.start();\r\n\r\n let frameRate = this._computeAverageFrameRate(false);\r\n\r\n if (this._myFirstTime) {\r\n this._myFirstTime = false;\r\n } else {\r\n\r\n // If there is not lag, the current plane count is a good lower limit, otherwise the current count is now a upper threshold, we have to search below it\r\n let lagging = false;\r\n if (frameRate < this._myStableFrameRate - this._myTargetFrameRateThreshold) {\r\n this._myUpperLimit = this._myCurrentPlanes;\r\n\r\n lagging = true;\r\n\r\n if (this._myUpperLimit == 1) {\r\n this._myLowerLimit = 1;\r\n }\r\n } else {\r\n this._myLowerLimit = this._myCurrentPlanes;\r\n if (this._myUpperLimit > 0) {\r\n this._myUpperLimit = Math.max(this._myUpperLimit, this._myLowerLimit);\r\n }\r\n }\r\n\r\n this._myTriangleTextComponent.text = \"Triangles: \" + this._myCurrentPlanes * this._myRealTrianglesAmount;\r\n this._myPlaneTextComponent.text = \"Planes: \" + this._myCurrentPlanes;\r\n this._myFPSTextComponent.text = \"FPS: \" + frameRate + \" / \" + this._myStableFrameRate;\r\n\r\n if (lagging) {\r\n this._myTriangleTextComponent.material.color = this._myLagColor;\r\n this._myPlaneTextComponent.material.color = this._myLagColor;\r\n this._myFPSTextComponent.material.color = this._myLagColor;\r\n } else {\r\n this._myTriangleTextComponent.material.color = this._myNormalColor;\r\n this._myPlaneTextComponent.material.color = this._myNormalColor;\r\n this._myFPSTextComponent.material.color = this._myNormalColor;\r\n }\r\n\r\n let reset = false;\r\n\r\n // Check if the binary search is completed\r\n if ((this._myUpperLimit > 0 &&\r\n (!lagging && (this._myUpperLimit - this._myLowerLimit) <= Math.max(2, 1000 / this._myRealTrianglesAmount)) ||\r\n (lagging && (this._myUpperLimit - this._myLowerLimit) <= 1)) ||\r\n (!lagging && this._myMaxPlanesReached)) {\r\n if (frameRate < this._myStableFrameRate - this._myTargetFrameRateThreshold) {\r\n // Going a bit back with the binary search, maybe the lower limit was not lower after all cause of a bad assumption of average FPS\r\n this._myLowerLimit = Math.max(1, Math.floor(this._myUpperLimit / 2.5));\r\n this._myUpperLimit = 0;\r\n reset = true;\r\n\r\n if (this._myLogEnabled) {\r\n // Reset\r\n console.log(\"Rst - Triangles:\", this._myCurrentPlanes * this._myRealTrianglesAmount, \"- Planes:\", this._myCurrentPlanes, \"- Frame Rate:\", frameRate);\r\n }\r\n } else {\r\n if (this._myMaxPlanesReached) {\r\n if (this._myLogEnabled) {\r\n console.log(\"Aborted - Max Planes Reached\");\r\n\r\n this._myDoneTextComponent.text = \"Aborted - Max Planes Reached\";\r\n }\r\n } else {\r\n this._displayPlanes(this._myLowerLimit);\r\n\r\n if (this._myLogEnabled) {\r\n console.log(\"\\nEnd - Triangles:\", this._myLowerLimit * this._myRealTrianglesAmount, \"- Planes:\", this._myLowerLimit, \"- Frame Rate:\", frameRate);\r\n console.log(\"Plane Triangles (Adjusted):\", this._myRealTrianglesAmount);\r\n console.log(\"Target Frame Rate:\", this._myStableFrameRate, \"- Threshold: \", (this._myStableFrameRate - this._myTargetFrameRateThreshold));\r\n }\r\n\r\n this._myTriangleTextComponent.text = \"Triangles: \" + this._myLowerLimit * this._myRealTrianglesAmount;\r\n this._myPlaneTextComponent.text = \"Planes: \" + this._myLowerLimit;\r\n this._myFPSTextComponent.text = \"FPS: \" + frameRate + \" / \" + this._myStableFrameRate;\r\n\r\n this._myDoneTextComponent.text = \"End\";\r\n }\r\n this._myDone = true;\r\n }\r\n }\r\n\r\n if (lagging && !reset) {\r\n if (this._myLogEnabled) {\r\n console.log(\"Lag - Triangles:\", this._myCurrentPlanes * this._myRealTrianglesAmount, \"- Planes:\", this._myCurrentPlanes, \"- Frame Rate:\", frameRate);\r\n }\r\n }\r\n\r\n if (!this._myDone) {\r\n // Sort of binary search, if there is no upper limit yet, just double\r\n if (this._myUpperLimit > 0) {\r\n this._myCurrentPlanes = Math.floor((this._myUpperLimit + this._myLowerLimit) / 2);\r\n this._myCurrentPlanes = Math.max(this._myCurrentPlanes, 1);\r\n } else if (!reset) {\r\n this._myCurrentPlanes = this._myLowerLimit * 2;\r\n } else {\r\n this._myCurrentPlanes = this._myLowerLimit;\r\n }\r\n\r\n if (this._myCurrentPlanes > 50000) {\r\n this._myCurrentPlanes = 50000;\r\n this._myMaxPlanesReached = true;\r\n } else {\r\n this._myMaxPlanesReached = false;\r\n }\r\n }\r\n }\r\n\r\n if (!this._myDone) {\r\n this._displayPlanes(this._myCurrentPlanes);\r\n this._myElapsedTime = 0;\r\n this._myFrameCount = 0;\r\n\r\n this._mySkipNextFrames = 30;\r\n }\r\n }\r\n }\r\n }\r\n\r\n _displayPlanes(count) {\r\n while (this._myPlanes.length > count) {\r\n let plane = this._myPlanes.pop();\r\n Globals.getObjectPoolManager(this.engine).release(this._myPoolID, plane);\r\n }\r\n\r\n while (this._myPlanes.length < count) {\r\n let plane = Globals.getObjectPoolManager(this.engine).get(this._myPoolID);\r\n this._myPlanes.push(plane);\r\n }\r\n\r\n let gridSize = 1;\r\n while (gridSize * gridSize < count) {\r\n gridSize++;\r\n }\r\n\r\n let spaceBetween = 0.01;\r\n let totalSpaceBetween = spaceBetween * (gridSize - 1);\r\n let planeSize = (this._myBackgroundSize * 2 - totalSpaceBetween) / (gridSize * 2);\r\n\r\n let currentCount = count;\r\n\r\n for (let i = 0; i < gridSize && currentCount > 0; i++) {\r\n for (let j = 0; j < gridSize && currentCount > 0; j++) {\r\n let plane = this._myPlanes[currentCount - 1];\r\n plane.pp_setScale(planeSize);\r\n\r\n let position = [-this._myBackgroundSize + planeSize + j * planeSize * 2 + j * spaceBetween, this._myBackgroundSize - planeSize - i * planeSize * 2 - i * spaceBetween, 0];\r\n\r\n plane.pp_setPositionLocal(position);\r\n plane.pp_setActive(true);\r\n\r\n currentCount--;\r\n }\r\n }\r\n }\r\n\r\n start() {\r\n this._myActive = false;\r\n\r\n if (Globals.isDebugEnabled(this.engine)) {\r\n this._myActive = true;\r\n }\r\n\r\n this._myStartTimer = new Timer(2);\r\n this._mySessionStarted = false;\r\n\r\n this._myDTHistory = [];\r\n\r\n this._myFramesToSkip = 10;\r\n }\r\n\r\n update(dt) {\r\n if (!this._myActive || !Globals.isDebugEnabled(this.engine)) return;\r\n\r\n if (this._myFramesToSkip == 0) {\r\n if (this._mySessionStarted || !this._myStartOnXRStart) {\r\n if (this._myStartTimer.isRunning()) {\r\n this._myStartTimer.update(dt);\r\n\r\n this._myDTHistory.push(dt);\r\n\r\n if (this._myStartTimer.isDone()) {\r\n this._myStableFrameRate = this._computeAverageFrameRate(true);\r\n if (this._myTargetFrameRate > 0) {\r\n this._myStableFrameRate = this._myTargetFrameRate;\r\n }\r\n\r\n if (this._myLogEnabled) {\r\n console.log(\"\\nPlane Triangles (Adjusted):\", this._myRealTrianglesAmount);\r\n console.log(\"Target Frame Rate:\", this._myStableFrameRate, \"- Threshold: \", (this._myStableFrameRate - this._myTargetFrameRateThreshold));\r\n console.log(\"\");\r\n }\r\n\r\n this._start();\r\n }\r\n } else {\r\n this._update(dt);\r\n }\r\n } else {\r\n this._mySessionStarted = XRUtils.getSession(this.engine) != null;\r\n }\r\n } else {\r\n this._myFramesToSkip--;\r\n }\r\n }\r\n\r\n _computeAverageFrameRate(firstCompute) {\r\n let frameRate = 0;\r\n\r\n this._myDTHistory.sort((a, b) => a - b);\r\n let elementsToRemove = Math.floor(this._myDTHistory.length * Math.min(0.9, this._myDTHistoryToIgnorePercentage * (firstCompute ? 2 : 1)));\r\n for (let i = 0; i < elementsToRemove && this._myDTHistory.length > 1; i++) {\r\n this._myDTHistory.pop();\r\n }\r\n\r\n let averageDT = 0;\r\n for (let dt of this._myDTHistory) {\r\n averageDT += dt;\r\n }\r\n averageDT /= this._myDTHistory.length;\r\n frameRate = Math.round(1 / averageDT);\r\n\r\n this._myDTHistory = [];\r\n\r\n return frameRate;\r\n }\r\n\r\n _createPlaneMesh(trianglesAmount) {\r\n let squaresAmount = Math.ceil(trianglesAmount / 2);\r\n\r\n let row = 1;\r\n let column = 1;\r\n\r\n let closestSqrt = 1;\r\n while (closestSqrt * closestSqrt < squaresAmount) {\r\n closestSqrt++;\r\n }\r\n\r\n row = closestSqrt;\r\n column = closestSqrt;\r\n\r\n while (row > 1 && column > 1 && row * column > squaresAmount && ((row - 1) * column >= squaresAmount)) {\r\n row--;\r\n }\r\n\r\n let meshCreationParams = new MeshCreationParams(this.engine);\r\n\r\n for (let i = 0; i < row + 1; i++) {\r\n for (let j = 0; j < column + 1; j++) {\r\n\r\n let x = (2 / column) * j;\r\n let y = (2 / row) * i;\r\n\r\n let vertexCreationParams = new MeshCreationVertexParams();\r\n\r\n vertexCreationParams.myPosition = vec3_create();\r\n vertexCreationParams.myPosition[0] = x - 1;\r\n vertexCreationParams.myPosition[1] = y - 1;\r\n vertexCreationParams.myPosition[2] = 0;\r\n\r\n vertexCreationParams.myTextureCoordinates = vec2_create();\r\n vertexCreationParams.myTextureCoordinates[0] = x / 2;\r\n vertexCreationParams.myTextureCoordinates[1] = y / 2;\r\n\r\n vertexCreationParams.myNormal = vec3_create();\r\n vertexCreationParams.myNormal[0] = 0;\r\n vertexCreationParams.myNormal[1] = 0;\r\n vertexCreationParams.myNormal[2] = 1;\r\n\r\n meshCreationParams.myVertexes.push(vertexCreationParams);\r\n }\r\n }\r\n\r\n for (let i = 0; i < row; i++) {\r\n for (let j = 0; j < column; j++) {\r\n let firstTriangle = new MeshCreationTriangleParams();\r\n firstTriangle.myIndexes[0] = (i * (column + 1)) + j;\r\n firstTriangle.myIndexes[1] = (i * (column + 1)) + j + 1;\r\n firstTriangle.myIndexes[2] = ((i + 1) * (column + 1)) + j;\r\n\r\n let secondTriangle = new MeshCreationTriangleParams();\r\n secondTriangle.myIndexes[0] = ((i + 1) * (column + 1)) + j;\r\n secondTriangle.myIndexes[1] = (i * (column + 1)) + j + 1;\r\n secondTriangle.myIndexes[2] = ((i + 1) * (column + 1)) + j + 1;\r\n\r\n meshCreationParams.myTriangles.push(firstTriangle);\r\n meshCreationParams.myTriangles.push(secondTriangle);\r\n }\r\n }\r\n\r\n let mesh = MeshUtils.create(meshCreationParams);\r\n\r\n return mesh;\r\n }\r\n\r\n onDeactivate() {\r\n Globals.getObjectPoolManager(this.engine)?.releaseAll(this._myPoolID);\r\n }\r\n\r\n onDestroy() {\r\n Globals.getObjectPoolManager(this.engine)?.destroyPool(this._myPoolID);\r\n }\r\n}", "import { Component, PhysXComponent, Property } from \"@wonderlandengine/api\";\r\n\r\nexport class AdjustHierarchyPhysXScaleComponent extends Component {\r\n static TypeName = \"pp-adjust-hierarchy-physx-scale\";\r\n static Properties = {\r\n _myWhen: Property.enum([\"Init\", \"Start\", \"First Update\"], \"Start\")\r\n };\r\n\r\n init() {\r\n if (this.active && this._myWhen == 0) {\r\n this._adjustScale();\r\n }\r\n }\r\n\r\n start() {\r\n if (this._myWhen == 1) {\r\n this._adjustScale();\r\n }\r\n this._myFirst = true;\r\n }\r\n\r\n update(dt) {\r\n if (this._myWhen == 2 && this._myFirst) {\r\n this._myFirst = false;\r\n this._adjustScale();\r\n }\r\n }\r\n\r\n _adjustScale() {\r\n let scale = this.object.pp_getScale();\r\n let physXComponents = this.object.pp_getComponents(PhysXComponent);\r\n for (let physX of physXComponents) {\r\n physX.extents[0] = physX.extents[0] * scale[0];\r\n physX.extents[1] = physX.extents[1] * scale[1];\r\n physX.extents[2] = physX.extents[2] * scale[2];\r\n\r\n if (physX.active) {\r\n physX.active = false;\r\n physX.active = true;\r\n }\r\n }\r\n }\r\n}", "import { Component, Object3D, property } from \"@wonderlandengine/api\";\r\nimport { XRUtils } from \"../../utils/xr_utils.js\";\r\n\r\nexport class ResetLocalTransformComponent extends Component {\r\n public static override TypeName = \"pp-reset-local-transform\";\r\n\r\n @property.enum([\"Self\", \"Children\", \"Descendants\", \"Hierarchy\"], \"Self\")\r\n private _myResetLocalTransformOn!: number;\r\n\r\n @property.enum([\"Init\", \"Start\", \"First Update\", \"Enter XR\", \"Exit XR\", \"First Enter XR\", \"First Exit XR\"], \"Init\")\r\n private _myResetLocalTransformWhen!: number;\r\n\r\n private _myFirstUpdate: boolean = true;\r\n private _myFirstXRStart: boolean = true;\r\n private _myFirstXREnd: boolean = true;\r\n\r\n public override init(): void {\r\n if (this.active && this._myResetLocalTransformWhen == 0) {\r\n this._resetLocalTransform();\r\n }\r\n }\r\n\r\n public override start(): void {\r\n if (this._myResetLocalTransformWhen == 1) {\r\n this._resetLocalTransform();\r\n }\r\n }\r\n\r\n public override update(dt: number): void {\r\n if (this._myResetLocalTransformWhen == 2 && this._myFirstUpdate) {\r\n this._resetLocalTransform();\r\n }\r\n\r\n this._myFirstUpdate = false;\r\n }\r\n\r\n private _onXRSessionStart(): void {\r\n if (this._myResetLocalTransformWhen == 3 || (this._myResetLocalTransformWhen == 5 && this._myFirstXRStart)) {\r\n this._resetLocalTransform();\r\n }\r\n\r\n this._myFirstXRStart = false;\r\n }\r\n\r\n private _onXRSessionEnd(): void {\r\n if (this._myResetLocalTransformWhen == 4 || (this._myResetLocalTransformWhen == 6 && this._myFirstXREnd)) {\r\n this._resetLocalTransform();\r\n }\r\n\r\n this._myFirstXREnd = false;\r\n }\r\n\r\n private _resetLocalTransform(): void {\r\n let objects: Object3D[] = [];\r\n if (this._myResetLocalTransformOn == 0) {\r\n objects = [this.object.pp_getSelf()];\r\n } else if (this._myResetLocalTransformOn == 1) {\r\n objects = this.object.pp_getChildren();\r\n } else if (this._myResetLocalTransformOn == 2) {\r\n objects = this.object.pp_getDescendants();\r\n } else {\r\n objects = this.object.pp_getHierarchy();\r\n }\r\n\r\n for (const object of objects) {\r\n object.pp_resetTransformLocal();\r\n }\r\n }\r\n\r\n public override onActivate(): void {\r\n if (this._myResetLocalTransformWhen == 3 || this._myResetLocalTransformWhen == 5) {\r\n XRUtils.registerSessionStartEventListener(this, this._onXRSessionStart.bind(this), true, true, this.engine);\r\n }\r\n\r\n if (this._myResetLocalTransformWhen == 4 || this._myResetLocalTransformWhen == 6) {\r\n XRUtils.registerSessionEndEventListener(this, this._onXRSessionEnd.bind(this), this.engine);\r\n }\r\n }\r\n\r\n public override onDeactivate(): void {\r\n XRUtils.unregisterSessionStartEndEventListeners(this, this.engine);\r\n }\r\n}", "import { Component, Property } from \"@wonderlandengine/api\";\r\nimport { XRUtils } from \"../../utils/xr_utils.js\";\r\n\r\nexport class SetActiveComponent extends Component {\r\n static TypeName = \"pp-set-active\";\r\n static Properties = {\r\n _myActive: Property.bool(true),\r\n _mySetActiveOn: Property.enum([\"Self\", \"Children\", \"Descendants\", \"Hierarchy\"], \"Hierarchy\"),\r\n _mySetActiveWhen: Property.enum([\"Init\", \"Start\", \"First Update\", \"Enter XR\", \"Exit XR\", \"First Enter XR\", \"First Exit XR\"], \"Init\")\r\n };\r\n\r\n init() {\r\n if (this.active && this._mySetActiveWhen == 0) {\r\n this._setActive();\r\n }\r\n }\r\n\r\n start() {\r\n if (this._mySetActiveWhen == 1) {\r\n this._setActive();\r\n }\r\n\r\n this._myFirstUpdate = true;\r\n this._myFirstXRStart = true;\r\n this._myFirstXREnd = true;\r\n\r\n this._myActivateOnNextUpdate = false;\r\n }\r\n\r\n update(dt) {\r\n if (this._myActivateOnNextUpdate) {\r\n this._onActivate();\r\n\r\n this._myActivateOnNextUpdate = false;\r\n }\r\n\r\n if (this._mySetActiveWhen == 2 && this._myFirstUpdate) {\r\n this._setActive();\r\n }\r\n\r\n this._myFirstUpdate = false;\r\n }\r\n\r\n _onXRSessionStart() {\r\n if (this._mySetActiveWhen == 3 || (this._mySetActiveWhen == 5 && this._myFirstXRStart)) {\r\n this._setActive();\r\n }\r\n\r\n this._myFirstXRStart = false;\r\n }\r\n\r\n _onXRSessionEnd() {\r\n if (this._mySetActiveWhen == 4 || (this._mySetActiveWhen == 6 && this._myFirstXREnd)) {\r\n this._setActive();\r\n }\r\n\r\n this._myFirstXREnd = false;\r\n }\r\n\r\n _setActive() {\r\n if (this._mySetActiveOn == 0) {\r\n this.object.pp_setActiveSelf(this._myActive);\r\n } else if (this._mySetActiveOn == 1) {\r\n this.object.pp_setActiveChildren(this._myActive);\r\n } else if (this._mySetActiveOn == 2) {\r\n this.object.pp_setActiveDescendants(this._myActive);\r\n } else {\r\n this.object.pp_setActive(this._myActive);\r\n }\r\n }\r\n\r\n onActivate() {\r\n this._myActivateOnNextUpdate = true;\r\n }\r\n\r\n _onActivate() {\r\n if (this._mySetActiveWhen == 3 || this._mySetActiveWhen == 5) {\r\n XRUtils.registerSessionStartEventListener(this, this._onXRSessionStart.bind(this), true, true, this.engine);\r\n } else if (this._mySetActiveWhen == 4 || this._mySetActiveWhen == 6) {\r\n XRUtils.registerSessionEndEventListener(this, this._onXRSessionEnd.bind(this), this.engine);\r\n }\r\n }\r\n\r\n onDeactivate() {\r\n XRUtils.unregisterSessionStartEndEventListeners(this, this.engine);\r\n }\r\n}", "import { Component, LogLevel, property } from \"@wonderlandengine/api\";\r\n\r\nexport class SetEngineLogLevelComponent extends Component {\r\n public static override TypeName = \"pp-set-engine-log-level\";\r\n\r\n @property.bool(true)\r\n private _myInfoEnabled!: boolean;\r\n\r\n @property.bool(true)\r\n private _myWarnEnabled!: boolean;\r\n\r\n @property.bool(true)\r\n private _myErrorEnabled!: boolean;\r\n\r\n public override init(): void {\r\n const logLevelsToDisable = [];\r\n\r\n if (!this._myInfoEnabled) {\r\n logLevelsToDisable.push(LogLevel.Info);\r\n }\r\n\r\n if (!this._myWarnEnabled) {\r\n logLevelsToDisable.push(LogLevel.Warn);\r\n }\r\n\r\n if (!this._myErrorEnabled) {\r\n logLevelsToDisable.push(LogLevel.Error);\r\n }\r\n\r\n if (logLevelsToDisable.length > 0) {\r\n this.engine.log.levels.disable(...logLevelsToDisable);\r\n }\r\n }\r\n}", "import { Component, property } from \"@wonderlandengine/api\";\r\nimport { XRUtils } from \"../../utils/xr_utils.js\";\r\n\r\nenum _ButtonBehaviorWhenNotAvailable {\r\n NONE = \"none\",\r\n DISABLE = \"disable\",\r\n HIDE = \"hide\"\r\n}\r\n\r\n/** The buttons must first be enabled from the Wonderland Engine editor -> Project Settings / VR & AR */\r\nexport class ShowXRButtonsComponent extends Component {\r\n public static override TypeName = \"pp-show-xr-buttons\";\r\n\r\n @property.bool(true)\r\n private readonly _myShowVRButton!: boolean;\r\n @property.enum(Object.values(_ButtonBehaviorWhenNotAvailable), _ButtonBehaviorWhenNotAvailable.DISABLE)\r\n private readonly _myVRButtonBehaviorWhenNotAvailable!: number;\r\n\r\n @property.bool(true)\r\n private readonly _myShowARButton!: boolean;\r\n @property.enum(Object.values(_ButtonBehaviorWhenNotAvailable), _ButtonBehaviorWhenNotAvailable.DISABLE)\r\n private readonly _myARButtonBehaviorWhenNotAvailable!: number;\r\n\r\n private _myXRButtonsContainer: HTMLElement | null = null;\r\n private _myVRButton: HTMLElement | null = null;\r\n private _myARButton: HTMLElement | null = null;\r\n\r\n private _myFirstUpdate: boolean = false;\r\n\r\n private _myVRButtonVisibilityUpdated: boolean = false;\r\n private _myVRButtonUsabilityUpdated: boolean = false;\r\n private _myVRButtonDisabledOpacityUpdated: boolean = false;\r\n\r\n private _myARButtonVisibilityUpdated: boolean = false;\r\n private _myARButtonUsabilityUpdated: boolean = false;\r\n private _myARButtonDisabledOpacityUpdated: boolean = false;\r\n\r\n public override init(): void {\r\n this._myXRButtonsContainer = document.getElementById(\"xr-buttons-container\");\r\n\r\n this._myVRButton = document.getElementById(\"vr-button\");\r\n this._myARButton = document.getElementById(\"ar-button\");\r\n }\r\n\r\n public override update(dt: number): void {\r\n if (!this._myFirstUpdate) {\r\n this._myFirstUpdate = true;\r\n\r\n if (this._myXRButtonsContainer != null) {\r\n if (this._myShowVRButton || this._myShowARButton) {\r\n this._myXRButtonsContainer.style.setProperty(\"display\", \"flex\");\r\n } else {\r\n this._myXRButtonsContainer.style.setProperty(\"display\", \"none\");\r\n }\r\n }\r\n\r\n if (this._myVRButton != null) {\r\n if (this._myShowVRButton) {\r\n this._myVRButton.style.setProperty(\"display\", \"block\");\r\n } else {\r\n this._myVRButton.style.setProperty(\"display\", \"none\");\r\n }\r\n }\r\n\r\n if (this._myARButton != null) {\r\n if (this._myShowARButton) {\r\n this._myARButton.style.setProperty(\"display\", \"block\");\r\n } else {\r\n this._myARButton.style.setProperty(\"display\", \"none\");\r\n }\r\n }\r\n } else {\r\n this._updateXRButtons(dt);\r\n }\r\n }\r\n\r\n private _updateXRButtons(dt: number): void {\r\n if (this._myShowVRButton) {\r\n if (!this._myVRButtonUsabilityUpdated) {\r\n if (this._myVRButton != null) {\r\n if (!this._myVRButtonVisibilityUpdated) {\r\n this._myVRButton.style.setProperty(\"transform\", \"scale(1)\");\r\n this._myVRButtonVisibilityUpdated = true;\r\n }\r\n\r\n if (!this._myVRButtonUsabilityUpdated) {\r\n if (XRUtils.isVRSupported(this.engine)) {\r\n this._myVRButton.style.setProperty(\"opacity\", \"1\");\r\n this._myVRButton.style.setProperty(\"pointer-events\", \"all\");\r\n\r\n this._myVRButtonUsabilityUpdated = true;\r\n } else if (!this._myVRButtonDisabledOpacityUpdated) {\r\n switch (this._myVRButtonBehaviorWhenNotAvailable) {\r\n case 0:\r\n this._myVRButton.style.setProperty(\"opacity\", \"1\");\r\n this._myVRButton.style.setProperty(\"pointer-events\", \"all\");\r\n break;\r\n case 1:\r\n this._myVRButton.style.setProperty(\"opacity\", \"0.5\");\r\n break;\r\n case 2:\r\n this._myVRButton.style.setProperty(\"display\", \"none\");\r\n break;\r\n }\r\n\r\n this._myVRButtonDisabledOpacityUpdated = true;\r\n }\r\n }\r\n } else {\r\n this._myVRButtonUsabilityUpdated = true;\r\n }\r\n }\r\n }\r\n\r\n if (this._myShowARButton) {\r\n if (!this._myARButtonUsabilityUpdated) {\r\n if (this._myARButton != null) {\r\n if (!this._myARButtonVisibilityUpdated) {\r\n this._myARButton.style.setProperty(\"transform\", \"scale(1)\");\r\n this._myARButtonVisibilityUpdated = true;\r\n }\r\n\r\n if (!this._myARButtonUsabilityUpdated) {\r\n if (XRUtils.isARSupported(this.engine)) {\r\n this._myARButton.style.setProperty(\"opacity\", \"1\");\r\n this._myARButton.style.setProperty(\"pointer-events\", \"all\");\r\n\r\n this._myARButtonUsabilityUpdated = true;\r\n } else if (!this._myARButtonDisabledOpacityUpdated) {\r\n switch (this._myARButtonBehaviorWhenNotAvailable) {\r\n case 0:\r\n this._myARButton.style.setProperty(\"opacity\", \"1\");\r\n this._myARButton.style.setProperty(\"pointer-events\", \"all\");\r\n break;\r\n case 1:\r\n this._myARButton.style.setProperty(\"opacity\", \"0.5\");\r\n break;\r\n case 2:\r\n this._myARButton.style.setProperty(\"display\", \"none\");\r\n break;\r\n }\r\n\r\n this._myARButtonDisabledOpacityUpdated = true;\r\n }\r\n }\r\n } else {\r\n this._myARButtonUsabilityUpdated = true;\r\n }\r\n }\r\n }\r\n }\r\n\r\n public override onActivate(): void {\r\n XRUtils.registerSessionStartEndEventListeners(this, this._onXRSessionStart.bind(this), this._onXRSessionEnd.bind(this), true, false, this.engine);\r\n }\r\n\r\n public override onDeactivate(): void {\r\n XRUtils.unregisterSessionStartEndEventListeners(this, this.engine);\r\n }\r\n\r\n private _onXRSessionStart(): void {\r\n if (this._myXRButtonsContainer != null) {\r\n this._myXRButtonsContainer.style.setProperty(\"display\", \"none\");\r\n }\r\n }\r\n\r\n private _onXRSessionEnd(): void {\r\n if (this._myXRButtonsContainer != null && (this._myShowVRButton || this._myShowARButton)) {\r\n this._myXRButtonsContainer.style.setProperty(\"display\", \"flex\");\r\n }\r\n }\r\n}", "\r\n\r\nimport { Emitter } from \"@wonderlandengine/api\";\r\nimport { State } from \"./state.js\";\r\nimport { Transition } from \"./transition.js\";\r\n\r\nexport class StateData {\r\n public myID: unknown;\r\n public myState: State;\r\n\r\n constructor(stateID: unknown, state: State) {\r\n this.myID = stateID;\r\n this.myState = state;\r\n }\r\n}\r\n\r\nexport class TransitionData {\r\n public myID: unknown;\r\n\r\n public myFromStateData: Readonly;\r\n public myToStateData: Readonly;\r\n\r\n public myTransition: Transition;\r\n\r\n public mySkipStateFunction: SkipStateFunction;\r\n\r\n constructor(transitionID: unknown, fromStateData: Readonly, toStateData: Readonly, transition: Transition, skipStateFunction: SkipStateFunction) {\r\n this.myID = transitionID;\r\n this.myFromStateData = fromStateData;\r\n this.myToStateData = toStateData;\r\n this.myTransition = transition;\r\n this.mySkipStateFunction = skipStateFunction;\r\n }\r\n}\r\n\r\nexport class PendingPerform {\r\n public myID: unknown;\r\n public myTransitionArgs: unknown[];\r\n\r\n constructor(transitionID: unknown, ...args: unknown[]) {\r\n this.myID = transitionID;\r\n this.myTransitionArgs = args;\r\n }\r\n}\r\n\r\nexport enum PerformMode {\r\n IMMEDIATE = 0,\r\n DELAYED = 1\r\n}\r\n\r\nexport enum PerformDelayedMode {\r\n QUEUE = 0,\r\n KEEP_FIRST = 1,\r\n KEEP_LAST = 2\r\n}\r\n\r\nexport enum SkipStateFunction {\r\n NONE = 0,\r\n END = 1,\r\n START = 2,\r\n BOTH = 3\r\n}\r\n\r\n/**\r\n * You can also use plain functions for state/transition if u want to do something simple and quick\r\n * \r\n * Signatures:\r\n * function stateUpdate(dt, fsm, stateData)\r\n * function init(fsm, stateData)\r\n * function transition(fsm, transitionData)\r\n*/\r\nexport class FSM {\r\n\r\n private _myCurrentStateData: Readonly | null = null;\r\n\r\n private readonly _myStatesData: Map> = new Map();\r\n private readonly _myTransitionsData: Map>> = new Map();\r\n\r\n private _myLogEnabled: boolean = false;\r\n private _myLogShowDelayedInfo: boolean = false;\r\n private _myLogFSMName: string = \"FSM\";\r\n\r\n private _myPerformMode: PerformMode;\r\n private _myPerformDelayedMode: PerformDelayedMode;\r\n private readonly _myPendingPerforms: PendingPerform[] = [];\r\n private _myCurrentlyPerformedTransitionData: Readonly | null = null;\r\n\r\n private readonly _myInitEmitter: Emitter<[FSM, Readonly, ...unknown[]]> = new Emitter();\r\n private readonly _myInitIDEmitters: Map, ...unknown[]]>> = new Map();\r\n private readonly _myTransitionEmitter: Emitter<[FSM, Readonly, PerformMode, ...unknown[]]> = new Emitter();\r\n private readonly _myTransitionIDEmitters: [unknown, unknown, unknown, Emitter<[FSM, Readonly, PerformMode, ...unknown[]]>][] = [];\r\n\r\n constructor(performMode = PerformMode.IMMEDIATE, performDelayedMode = PerformDelayedMode.QUEUE) {\r\n this._myPerformMode = performMode;\r\n this._myPerformDelayedMode = performDelayedMode;\r\n }\r\n\r\n public addState(stateID: unknown, state?: State): void;\r\n public addState(stateID: unknown,\r\n stateUpdateCallback?: ((dt: number, fsm: FSM, stateData: Readonly, ...args: any[]) => void),\r\n stateStartCallback?: ((fsm: FSM, transitionData: Readonly, ...args: any[]) => void),\r\n stateEndCallback?: ((fsm: FSM, transitionData: Readonly, ...args: any[]) => void),\r\n stateInitCallback?: ((fsm: FSM, stateData: Readonly, ...args: any[]) => void)): void;\r\n public addState(stateID: unknown,\r\n state?: State | ((dt: number, fsm: FSM, stateData: Readonly, ...args: unknown[]) => void),\r\n stateStartCallback?: ((fsm: FSM, transitionData: Readonly, ...args: unknown[]) => void),\r\n stateEndCallback?: ((fsm: FSM, transitionData: Readonly, ...args: unknown[]) => void),\r\n stateInitCallback?: ((fsm: FSM, stateData: Readonly, ...args: unknown[]) => void)): void {\r\n let adjustedState: State | null = null;\r\n if (state == null || typeof state == \"function\") {\r\n adjustedState = {};\r\n\r\n if (state != null) {\r\n adjustedState.update = function update(dt: number, fsm: FSM, stateData: Readonly, ...args: unknown[]): void { return state(dt, fsm, stateData, ...args); };\r\n }\r\n\r\n if (stateStartCallback != null) {\r\n adjustedState.start = function start(fsm: FSM, transitionData: Readonly, ...args: unknown[]): void { return stateStartCallback(fsm, transitionData, ...args); };\r\n }\r\n\r\n if (stateEndCallback != null) {\r\n adjustedState.end = function end(fsm: FSM, transitionData: Readonly, ...args: unknown[]): void { return stateEndCallback(fsm, transitionData, ...args); };\r\n }\r\n\r\n if (stateInitCallback != null) {\r\n adjustedState.init = function init(fsm: FSM, stateData: Readonly, ...args: unknown[]): void { return stateInitCallback(fsm, stateData, ...args); };\r\n }\r\n\r\n adjustedState.clone = function clone() {\r\n const clonedState: State = {};\r\n clonedState.update = this.update;\r\n clonedState.clone = this.clone;\r\n return clonedState;\r\n };\r\n } else {\r\n adjustedState = state;\r\n }\r\n\r\n const stateData = new StateData(stateID, adjustedState);\r\n this._myStatesData.set(stateID, stateData);\r\n this._myTransitionsData.set(stateID, new Map());\r\n }\r\n\r\n public addTransition(fromStateID: unknown, toStateID: unknown, transitionID: unknown, transition?: Transition, skipStateFunction?: SkipStateFunction): void;\r\n public addTransition(fromStateID: unknown, toStateID: unknown, transitionID: unknown, transitionPerformCallback?: ((fsm: FSM, transitionData: Readonly, ...args: any[]) => void), skipStateFunction?: SkipStateFunction): void;\r\n public addTransition(fromStateID: unknown, toStateID: unknown, transitionID: unknown, transition?: Transition | ((fsm: FSM, transitionData: Readonly, ...args: unknown[]) => void), skipStateFunction: SkipStateFunction = SkipStateFunction.NONE): void {\r\n let adjustedTransition: Transition | null = null;\r\n if (transition == null || typeof transition == \"function\") {\r\n adjustedTransition = {};\r\n\r\n if (transition != null) {\r\n adjustedTransition.perform = function perform(fsm: FSM, transitionData: Readonly, ...args: unknown[]): void { return transition(fsm, transitionData, ...args); };\r\n }\r\n\r\n adjustedTransition.clone = function clone() {\r\n const clonedTransition: Transition = {};\r\n clonedTransition.perform = this.perform;\r\n clonedTransition.clone = this.clone;\r\n return clonedTransition;\r\n };\r\n } else {\r\n adjustedTransition = transition;\r\n }\r\n\r\n if (this.hasState(fromStateID) && this.hasState(toStateID)) {\r\n const transitionsDataFromState = this._getTransitionsDataFromState(fromStateID)!;\r\n\r\n const transitionData = new TransitionData(transitionID, this.getStateData(fromStateID)!, this.getStateData(toStateID)!, adjustedTransition, skipStateFunction);\r\n transitionsDataFromState.set(transitionID, transitionData);\r\n } else {\r\n if (!this.hasState(fromStateID) && !this.hasState(toStateID)) {\r\n console.error(\"Can't add transition:\", transitionID, \"- from state not found:\", fromStateID, \"- to state not found:\", toStateID);\r\n } else if (!this.hasState(fromStateID)) {\r\n console.error(\"Can't add transition:\", transitionID, \"- from state not found:\", fromStateID);\r\n } else if (!this.hasState(toStateID)) {\r\n console.error(\"Can't add transition:\", transitionID, \"- to state not found:\", toStateID);\r\n }\r\n }\r\n }\r\n\r\n public init(stateID: unknown, transition?: Transition): void;\r\n public init(stateID: unknown, transitionPerformInitCallback?: ((fsm: FSM, stateData: Readonly, ...args: unknown[]) => void), ...args: unknown[]): void;\r\n public init(stateID: unknown, transition?: Transition | ((fsm: FSM, stateData: Readonly, ...args: unknown[]) => void), ...args: unknown[]): void {\r\n let adjustedInitTransition: Transition | null = null;\r\n if (transition == null || typeof transition == \"function\") {\r\n adjustedInitTransition = {};\r\n\r\n if (transition != null) {\r\n adjustedInitTransition.performInit = function performInit(fsm: FSM, stateData: Readonly, ...args: unknown[]): void { return transition(fsm, stateData, ...args); };\r\n }\r\n } else {\r\n adjustedInitTransition = transition;\r\n }\r\n\r\n if (this.hasState(stateID)) {\r\n const stateData = this._myStatesData.get(stateID)!;\r\n\r\n if (this._myLogEnabled) {\r\n console.log(this._myLogFSMName, \"- Init:\", stateID);\r\n }\r\n\r\n if (adjustedInitTransition != null && adjustedInitTransition.performInit != null) {\r\n adjustedInitTransition.performInit(this, stateData, ...args);\r\n } else if (stateData.myState != null && stateData.myState.init != null) {\r\n stateData.myState.init(this, stateData, ...args);\r\n }\r\n\r\n this._myCurrentStateData = stateData;\r\n\r\n this._myInitEmitter.notify(this, stateData, ...args);\r\n\r\n if (this._myInitIDEmitters.size > 0) {\r\n const emitter = this._myInitIDEmitters.get(stateID);\r\n if (emitter != null) {\r\n emitter.notify(this, stateData, ...args);\r\n }\r\n }\r\n } else if (this._myLogEnabled) {\r\n console.warn(this._myLogFSMName, \"- Init state not found:\", stateID);\r\n }\r\n }\r\n\r\n public update(dt: number, ...args: unknown[]): void {\r\n if (this._myPendingPerforms.length > 0) {\r\n for (let i = 0; i < this._myPendingPerforms.length; i++) {\r\n this._perform(this._myPendingPerforms[i].myID, PerformMode.DELAYED, ...this._myPendingPerforms[i].myTransitionArgs);\r\n }\r\n\r\n this._myPendingPerforms.pp_clear();\r\n }\r\n\r\n if (this._myCurrentStateData != null && this._myCurrentStateData.myState != null && this._myCurrentStateData.myState.update != null) {\r\n this._myCurrentStateData.myState.update(dt, this, this._myCurrentStateData, ...args);\r\n }\r\n }\r\n\r\n public perform(transitionID: unknown, ...args: unknown[]): void {\r\n if (this._myPerformMode == PerformMode.DELAYED) {\r\n this.performDelayed(transitionID, ...args);\r\n } else {\r\n this.performImmediate(transitionID, ...args);\r\n }\r\n }\r\n\r\n public performDelayed(transitionID: unknown, ...args: unknown[]): boolean {\r\n let performDelayed = false;\r\n\r\n switch (this._myPerformDelayedMode) {\r\n case PerformDelayedMode.QUEUE:\r\n this._myPendingPerforms.push(new PendingPerform(transitionID, ...args));\r\n performDelayed = true;\r\n break;\r\n case PerformDelayedMode.KEEP_FIRST:\r\n if (!this.hasPendingPerforms()) {\r\n this._myPendingPerforms.push(new PendingPerform(transitionID, ...args));\r\n performDelayed = true;\r\n }\r\n break;\r\n case PerformDelayedMode.KEEP_LAST:\r\n this.resetPendingPerforms();\r\n this._myPendingPerforms.push(new PendingPerform(transitionID, ...args));\r\n performDelayed = true;\r\n break;\r\n }\r\n\r\n return performDelayed;\r\n }\r\n\r\n public performImmediate(transitionID: unknown, ...args: unknown[]): boolean {\r\n return this._perform(transitionID, PerformMode.IMMEDIATE, ...args);\r\n }\r\n\r\n public canPerform(transitionID: unknown): boolean {\r\n if (this._myCurrentStateData == null) {\r\n return false;\r\n }\r\n\r\n return this.hasTransitionFromState(this._myCurrentStateData.myID, transitionID);\r\n }\r\n\r\n public canGoTo(stateID: unknown, transitionID?: unknown): boolean {\r\n if (this._myCurrentStateData == null) {\r\n return false;\r\n }\r\n\r\n return this.hasTransitionFromStateToState(this._myCurrentStateData.myID, stateID, transitionID);\r\n }\r\n\r\n public isInState(stateID: unknown): boolean {\r\n return this._myCurrentStateData != null && this._myCurrentStateData.myID == stateID;\r\n }\r\n\r\n public isPerformingTransition(): boolean {\r\n return this._myCurrentlyPerformedTransitionData != null;\r\n }\r\n\r\n public getCurrentlyPerformingTransitionData(): Readonly | null {\r\n return this._myCurrentlyPerformedTransitionData;\r\n }\r\n\r\n public hasBeenInit(): boolean {\r\n return this._myCurrentStateData != null;\r\n }\r\n\r\n public reset(): void {\r\n this.resetCurrentState();\r\n this.resetPendingPerforms();\r\n }\r\n\r\n public resetCurrentState(): void {\r\n this._myCurrentStateData = null;\r\n }\r\n\r\n public resetPendingPerforms(): void {\r\n this._myPendingPerforms.pp_clear();\r\n }\r\n\r\n public getCurrentStateData(): Readonly | null {\r\n return this._myCurrentStateData;\r\n }\r\n\r\n public getCurrentTransitionsData(): Readonly[] {\r\n if (this._myCurrentStateData == null) {\r\n return [];\r\n }\r\n\r\n return this.getTransitionsDataFromState(this._myCurrentStateData.myID);\r\n }\r\n\r\n public getCurrentTransitionsDataToState(stateID: unknown): Readonly[] {\r\n if (this._myCurrentStateData == null) {\r\n return [];\r\n }\r\n\r\n return this.getTransitionsDataFromStateToState(this._myCurrentStateData.myID, stateID);\r\n }\r\n\r\n public getStateData(stateID: unknown): Readonly | null {\r\n const stateData = this._myStatesData.get(stateID);\r\n return stateData != null ? stateData : null;\r\n }\r\n\r\n public getStatesData(): Readonly[] {\r\n return Array.from(this._myStatesData.values());\r\n }\r\n\r\n public getTransitionsData(): Readonly[] {\r\n const transitionsData = [];\r\n\r\n for (const transitionsDataFromState of this._myTransitionsData.values()) {\r\n for (const transitionData of transitionsDataFromState.values()) {\r\n transitionsData.push(transitionData);\r\n }\r\n }\r\n\r\n return transitionsData;\r\n }\r\n\r\n public getTransitionsDataFromState(fromStateID: unknown): Readonly[] {\r\n const transitionsDataFromState = this._getTransitionsDataFromState(fromStateID);\r\n if (transitionsDataFromState == null) {\r\n return [];\r\n }\r\n\r\n return Array.from(transitionsDataFromState.values());\r\n }\r\n\r\n public getTransitionsDataFromStateToState(fromStateID: unknown, toStateID: unknown): Readonly[] {\r\n const transitionsDataFromState = this._getTransitionsDataFromState(fromStateID);\r\n if (transitionsDataFromState == null) {\r\n return [];\r\n }\r\n\r\n const transitionsDataToState = [];\r\n for (const transitionData of transitionsDataFromState.values()) {\r\n if (transitionData.myToStateData.myID == toStateID) {\r\n transitionsDataToState.push(transitionData);\r\n }\r\n }\r\n\r\n return transitionsDataToState;\r\n }\r\n\r\n public removeState(stateID: unknown): boolean {\r\n if (this.hasState(stateID)) {\r\n this._myStatesData.delete(stateID);\r\n this._myTransitionsData.delete(stateID);\r\n\r\n for (const transitionsDataFromState of this._myTransitionsData.values()) {\r\n const toDelete = [];\r\n for (const [transitionID, transitionData] of transitionsDataFromState.entries()) {\r\n if (transitionData.myToStateData.myID == stateID) {\r\n toDelete.push(transitionID);\r\n }\r\n }\r\n\r\n for (const transitionID of toDelete) {\r\n transitionsDataFromState.delete(transitionID);\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n public removeTransitionFromState(fromStateID: unknown, transitionID: unknown): boolean {\r\n const transitionsDataFromState = this._getTransitionsDataFromState(fromStateID);\r\n if (transitionsDataFromState != null) {\r\n return transitionsDataFromState.delete(transitionID);\r\n }\r\n\r\n return false;\r\n }\r\n\r\n public hasState(stateID: unknown): boolean {\r\n return this._myStatesData.has(stateID);\r\n }\r\n\r\n public hasTransitionFromState(fromStateID: unknown, transitionID: unknown): boolean {\r\n const transitionsData = this.getTransitionsDataFromState(fromStateID);\r\n\r\n const transitionIndex = transitionsData.findIndex(function (transition) {\r\n return transition.myID == transitionID;\r\n });\r\n\r\n return transitionIndex >= 0;\r\n }\r\n\r\n public hasTransitionFromStateToState(fromStateID: unknown, toStateID: unknown, transitionID?: unknown): boolean {\r\n const transitionsData = this.getTransitionsDataFromStateToState(fromStateID, toStateID);\r\n\r\n let hasTransition = false;\r\n if (transitionID != null) {\r\n const transitionIndex = transitionsData.findIndex(function (transition) {\r\n return transition.myID == transitionID;\r\n });\r\n\r\n hasTransition = transitionIndex >= 0;\r\n } else {\r\n hasTransition = transitionsData.length > 0;\r\n }\r\n\r\n return hasTransition;\r\n }\r\n\r\n public setPerformMode(performMode: PerformMode): void {\r\n this._myPerformMode = performMode;\r\n }\r\n\r\n public getPerformMode(): PerformMode {\r\n return this._myPerformMode;\r\n }\r\n\r\n public setPerformDelayedMode(performDelayedMode: PerformDelayedMode): void {\r\n this._myPerformDelayedMode = performDelayedMode;\r\n }\r\n\r\n public getPerformDelayedMode(): PerformDelayedMode {\r\n return this._myPerformDelayedMode;\r\n }\r\n\r\n public hasPendingPerforms(): boolean {\r\n return this._myPendingPerforms.length > 0;\r\n }\r\n\r\n public getPendingPerforms(): Readonly {\r\n return this._myPendingPerforms;\r\n }\r\n\r\n public clone(deepClone: boolean = false): FSM | null {\r\n if (!this.isCloneable(deepClone)) {\r\n return null;\r\n }\r\n\r\n const cloneFSM = new FSM();\r\n\r\n cloneFSM._myLogEnabled = this._myLogEnabled;\r\n cloneFSM._myLogShowDelayedInfo = this._myLogShowDelayedInfo;\r\n cloneFSM._myLogFSMName = this._myLogFSMName;\r\n\r\n cloneFSM._myPerformMode = this._myPerformMode;\r\n cloneFSM._myPerformDelayedMode = this._myPerformDelayedMode;\r\n (cloneFSM._myPendingPerforms as PendingPerform[]) = this._myPendingPerforms.pp_clone();\r\n\r\n for (const stateData of this._myStatesData.values()) {\r\n let clonedStateData = null;\r\n\r\n if (deepClone) {\r\n clonedStateData = new StateData(stateData.myID, stateData.myState.clone!());\r\n } else {\r\n clonedStateData = new StateData(stateData.myID, stateData.myState);\r\n }\r\n\r\n cloneFSM._myStatesData.set(clonedStateData.myID, clonedStateData);\r\n }\r\n\r\n for (const [stateID, transitionsDataFromState] of this._myTransitionsData.entries()) {\r\n const clonedTransitionsDataFromState = new Map();\r\n cloneFSM._myTransitionsData.set(stateID, clonedTransitionsDataFromState);\r\n\r\n for (const transitonData of transitionsDataFromState.values()) {\r\n let clonedTransitionData = null;\r\n\r\n const fromState = cloneFSM.getStateData(transitonData.myFromStateData.myID)!;\r\n const toState = cloneFSM.getStateData(transitonData.myToStateData.myID)!;\r\n\r\n if (deepClone) {\r\n clonedTransitionData = new TransitionData(transitonData.myID, fromState, toState, transitonData.myTransition.clone!(), transitonData.mySkipStateFunction);\r\n } else {\r\n clonedTransitionData = new TransitionData(transitonData.myID, fromState, toState, transitonData.myTransition, transitonData.mySkipStateFunction);\r\n }\r\n\r\n clonedTransitionsDataFromState.set(clonedTransitionData.myID, clonedTransitionData);\r\n }\r\n }\r\n\r\n if (this._myCurrentStateData != null) {\r\n cloneFSM._myCurrentStateData = cloneFSM.getStateData(this._myCurrentStateData.myID);\r\n }\r\n\r\n return cloneFSM;\r\n }\r\n\r\n public isCloneable(deepClone: boolean = false): boolean {\r\n if (!deepClone) {\r\n return true;\r\n }\r\n\r\n let deepCloneable = true;\r\n\r\n for (const stateData of this._myStatesData.values()) {\r\n deepCloneable = deepCloneable && stateData.myState.clone != null;\r\n }\r\n\r\n for (const transitionsData of this._myTransitionsData.values()) {\r\n for (const transitionsDataFromState of transitionsData.values()) {\r\n deepCloneable = deepCloneable && transitionsDataFromState.myTransition.clone != null;\r\n }\r\n }\r\n\r\n return deepCloneable;\r\n }\r\n\r\n public setLogEnabled(active: boolean, fsmName?: string, showDelayedInfo: boolean = false): void {\r\n this._myLogEnabled = active;\r\n this._myLogShowDelayedInfo = showDelayedInfo;\r\n if (fsmName != null) {\r\n this._myLogFSMName = \"FSM: \".concat(fsmName);\r\n }\r\n }\r\n\r\n public registerInitEventListener(listenerID: unknown, listener: (fsm: FSM, stateData: Readonly, ...args: unknown[]) => void): void {\r\n this._myInitEmitter.add(listener, { id: listenerID });\r\n }\r\n\r\n public unregisterInitEventListener(listenerID: unknown): void {\r\n this._myInitEmitter.remove(listenerID);\r\n }\r\n\r\n public registerInitIDEventListener(stateID: unknown, listenerID: unknown, listener: (fsm: FSM, stateData: Readonly, ...args: unknown[]) => void): void {\r\n let stateIDEmitter = this._myInitIDEmitters.get(stateID);\r\n if (stateIDEmitter == null) {\r\n this._myInitIDEmitters.set(stateID, new Emitter());\r\n stateIDEmitter = this._myInitIDEmitters.get(stateID);\r\n }\r\n\r\n stateIDEmitter!.add(listener, { id: listenerID });\r\n }\r\n\r\n public unregisterInitIDEventListener(stateID: unknown, listenerID: unknown): void {\r\n const stateIDEmitter = this._myInitIDEmitters.get(stateID);\r\n if (stateIDEmitter != null) {\r\n stateIDEmitter.remove(listenerID);\r\n\r\n if (stateIDEmitter.isEmpty) {\r\n this._myInitIDEmitters.delete(stateID);\r\n }\r\n }\r\n }\r\n\r\n public registerTransitionEventListener(listenerID: unknown, listener: (fsm: FSM, transitionData: Readonly, performMode: PerformMode, ...args: unknown[]) => void): void {\r\n this._myTransitionEmitter.add(listener, { id: listenerID });\r\n }\r\n\r\n public unregisterTransitionEventListener(listenerID: unknown): void {\r\n this._myTransitionEmitter.remove(listenerID);\r\n }\r\n\r\n /** The fsm IDs can be `null`, that means that the listener is called whenever only the valid IDs match\r\n This let you register to all the transitions with a specific ID and from of a specific state but to every state (`toStateID == null`) */\r\n public registerTransitionIDEventListener(fromStateID: unknown, toStateID: unknown, transitionID: unknown, listenerID: unknown, listener: (fsm: FSM, transitionData: Readonly, performMode: PerformMode, ...args: unknown[]) => void): void {\r\n let internalTransitionIDEmitter: Emitter<[FSM, Readonly, PerformMode, ...unknown[]]> | null = null;\r\n for (const value of this._myTransitionIDEmitters) {\r\n if (value[0] == fromStateID && value[1] == toStateID && value[2] == transitionID) {\r\n internalTransitionIDEmitter = value[3];\r\n break;\r\n }\r\n }\r\n\r\n if (internalTransitionIDEmitter == null) {\r\n const transitionIDEmitter: [unknown, unknown, unknown, Emitter<[FSM, Readonly, PerformMode, ...unknown[]]>] = [\r\n fromStateID,\r\n toStateID,\r\n transitionID,\r\n new Emitter()\r\n ];\r\n\r\n internalTransitionIDEmitter = transitionIDEmitter[3];\r\n\r\n this._myTransitionIDEmitters.push(transitionIDEmitter);\r\n }\r\n\r\n internalTransitionIDEmitter!.add(listener, { id: listenerID });\r\n }\r\n\r\n public unregisterTransitionIDEventListener(fromStateID: unknown, toStateID: unknown, transitionID: unknown, listenerID: unknown): void {\r\n let internalTransitionIDEmitter: Emitter<[FSM, Readonly, PerformMode, ...unknown[]]> | null = null;\r\n for (const value of this._myTransitionIDEmitters) {\r\n if (value[0] == fromStateID && value[1] == toStateID && value[2] == transitionID) {\r\n internalTransitionIDEmitter = value[3];\r\n break;\r\n }\r\n }\r\n\r\n if (internalTransitionIDEmitter != null) {\r\n internalTransitionIDEmitter.remove(listenerID);\r\n\r\n if (internalTransitionIDEmitter.isEmpty) {\r\n this._myTransitionIDEmitters.pp_remove(element => element[0] == fromStateID && element[1] == toStateID && element[2] == transitionID);\r\n }\r\n }\r\n }\r\n\r\n private _perform(transitionID: unknown, performMode: PerformMode, ...args: unknown[]): boolean {\r\n if (this.isPerformingTransition()) {\r\n const currentlyPerformingTransitionData = this.getCurrentlyPerformingTransitionData()!;\r\n const consoleArguments = [this._myLogFSMName, \"- Trying to perform:\", transitionID];\r\n if (this._myLogShowDelayedInfo) {\r\n consoleArguments.push(performMode == PerformMode.DELAYED ? \"- Delayed\" : \"- Immediate\");\r\n }\r\n consoleArguments.push(\"- But another transition is currently being performed -\", currentlyPerformingTransitionData.myID);\r\n console.warn(...consoleArguments);\r\n\r\n return false;\r\n }\r\n\r\n if (this._myCurrentStateData != null) {\r\n if (this.canPerform(transitionID)) {\r\n const transitionsData = this._myTransitionsData.get(this._myCurrentStateData.myID)!;\r\n const transitionDataToPerform = transitionsData.get(transitionID)!;\r\n\r\n this._myCurrentlyPerformedTransitionData = transitionDataToPerform;\r\n\r\n const fromStateData = this._myCurrentStateData;\r\n const toStateData = this._myStatesData.get(transitionDataToPerform.myToStateData.myID)!;\r\n\r\n if (this._myLogEnabled) {\r\n const consoleArguments = [this._myLogFSMName, \"- From:\", fromStateData.myID, \"- To:\", toStateData.myID, \"- With:\", transitionID];\r\n if (this._myLogShowDelayedInfo) {\r\n consoleArguments.push(performMode == PerformMode.DELAYED ? \"- Delayed\" : \"- Immediate\");\r\n }\r\n console.log(...consoleArguments);\r\n }\r\n\r\n if (transitionDataToPerform.mySkipStateFunction != SkipStateFunction.END && transitionDataToPerform.mySkipStateFunction != SkipStateFunction.BOTH &&\r\n fromStateData.myState != null && fromStateData.myState.end != null) {\r\n fromStateData.myState.end(this, transitionDataToPerform, ...args);\r\n }\r\n\r\n if (transitionDataToPerform.myTransition != null && transitionDataToPerform.myTransition.perform != null) {\r\n transitionDataToPerform.myTransition.perform(this, transitionDataToPerform, ...args);\r\n }\r\n\r\n if (transitionDataToPerform.mySkipStateFunction != SkipStateFunction.START && transitionDataToPerform.mySkipStateFunction != SkipStateFunction.BOTH &&\r\n toStateData.myState != null && toStateData.myState.start != null) {\r\n toStateData.myState.start(this, transitionDataToPerform, ...args);\r\n }\r\n\r\n this._myCurrentStateData = transitionDataToPerform.myToStateData;\r\n\r\n this._myTransitionEmitter.notify(this, transitionDataToPerform, performMode, ...args);\r\n\r\n if (this._myTransitionIDEmitters.length > 0) {\r\n const internalTransitionIDEmitters = [];\r\n for (const value of this._myTransitionIDEmitters) {\r\n if ((value[0] == null || value[0] == fromStateData.myID) &&\r\n (value[1] == null || value[1] == toStateData.myID) &&\r\n (value[2] == null || value[2] == transitionDataToPerform.myID)) {\r\n internalTransitionIDEmitters.push(value[3]);\r\n }\r\n }\r\n\r\n for (const emitter of internalTransitionIDEmitters) {\r\n emitter.notify(this, transitionDataToPerform, performMode, ...args);\r\n }\r\n }\r\n\r\n this._myCurrentlyPerformedTransitionData = null;\r\n\r\n return true;\r\n } else if (this._myLogEnabled) {\r\n const consoleArguments = [this._myLogFSMName, \"- No Transition:\", transitionID, \"- From:\", this._myCurrentStateData.myID];\r\n if (this._myLogShowDelayedInfo) {\r\n consoleArguments.push(performMode == PerformMode.DELAYED ? \"- Delayed\" : \"- Immediate\");\r\n }\r\n console.warn(...consoleArguments);\r\n }\r\n } else if (this._myLogEnabled) {\r\n const consoleArguments = [this._myLogFSMName, \"- FSM not initialized yet\"];\r\n if (this._myLogShowDelayedInfo) {\r\n consoleArguments.push(performMode == PerformMode.DELAYED ? \"- Delayed\" : \"- Immediate\");\r\n }\r\n console.warn(...consoleArguments);\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private _getTransitionsDataFromState(fromStateID: unknown): Map> | null {\r\n const transitionsData = this._myTransitionsData.get(fromStateID);\r\n return transitionsData != null ? transitionsData : null;\r\n }\r\n}", "import { FSM, StateData, TransitionData } from \"../../fsm.js\";\r\n\r\nexport abstract class BaseConditionState {\r\n\r\n private _myConditionCallback: () => boolean;\r\n\r\n private _myTransitionToPerformOnEnd: unknown;\r\n private _myTransitionArgs: unknown[];\r\n\r\n constructor(conditionCallback: () => boolean, transitionToPerformOnEnd: unknown, ...transitionArgs: unknown[]) {\r\n this._myConditionCallback = conditionCallback;\r\n\r\n this._myTransitionToPerformOnEnd = transitionToPerformOnEnd;\r\n this._myTransitionArgs = transitionArgs;\r\n }\r\n\r\n public setTransitionToPerformOnEnd(transitionToPerformOnEnd: unknown, ...transitionArgs: unknown[]): void {\r\n this._myTransitionToPerformOnEnd = transitionToPerformOnEnd;\r\n this._myTransitionArgs = transitionArgs;\r\n }\r\n\r\n protected _setConditionCallback(conditionCallback: () => boolean): void {\r\n this._myConditionCallback = conditionCallback;\r\n }\r\n\r\n protected _update(dt: number, fsm: FSM): void {\r\n if (this._myConditionCallback()) {\r\n if (this._myTransitionToPerformOnEnd != null) {\r\n fsm.perform(this._myTransitionToPerformOnEnd, ...this._myTransitionArgs);\r\n }\r\n }\r\n }\r\n\r\n protected _start(fsm: FSM, transitionData: Readonly, conditionCallback?: () => boolean, transitionToPerformOnEnd?: unknown, ...transitionArgs: unknown[]): void {\r\n if (conditionCallback != null) {\r\n this._myConditionCallback = conditionCallback;\r\n }\r\n\r\n if (transitionToPerformOnEnd != null) {\r\n this._myTransitionToPerformOnEnd = transitionToPerformOnEnd;\r\n this._myTransitionArgs = transitionArgs;\r\n }\r\n }\r\n\r\n protected _init(fsm: FSM, stateData: Readonly, conditionCallback?: () => boolean, transitionToPerformOnEnd?: unknown, ...transitionArgs: unknown[]): void {\r\n if (conditionCallback != null) {\r\n this._myConditionCallback = conditionCallback;\r\n }\r\n\r\n if (transitionToPerformOnEnd != null) {\r\n this._myTransitionToPerformOnEnd = transitionToPerformOnEnd;\r\n this._myTransitionArgs = transitionArgs;\r\n }\r\n }\r\n}", "import { FSM, StateData, TransitionData } from \"../../fsm.js\";\r\nimport { State } from \"../../state.js\";\r\nimport { BaseConditionState } from \"./base_condition_state.js\";\r\n\r\nexport class ConditionState extends BaseConditionState implements State {\r\n\r\n constructor(conditionCallback: () => boolean, transitionToPerformOnEnd: unknown, ...transitionArgs: unknown[]) {\r\n super(conditionCallback, transitionToPerformOnEnd, ...transitionArgs);\r\n }\r\n\r\n public setConditionCallback(conditionCallback: () => boolean): void {\r\n super._setConditionCallback(conditionCallback);\r\n }\r\n\r\n public update(dt: number, fsm: FSM): void {\r\n this._update(dt, fsm);\r\n }\r\n\r\n public start(fsm: FSM, transitionData: Readonly, conditionCallback?: () => boolean, transitionToPerformOnEnd?: unknown, ...transitionArgs: unknown[]): void {\r\n this._start(fsm, transitionData, conditionCallback, transitionToPerformOnEnd, ...transitionArgs);\r\n }\r\n\r\n public init(fsm: FSM, stateData: Readonly, conditionCallback?: () => boolean, transitionToPerformOnEnd?: unknown, ...transitionArgs: unknown[]): void {\r\n this._init(fsm, stateData, conditionCallback, transitionToPerformOnEnd, ...transitionArgs);\r\n }\r\n}", "import { Timer } from \"../../../cauldron/timer.js\";\r\nimport { FSM, StateData, TransitionData } from \"../../fsm.js\";\r\nimport { State } from \"../../state.js\";\r\nimport { BaseConditionState } from \"./base_condition_state.js\";\r\n\r\nexport class TimerState extends BaseConditionState implements State {\r\n\r\n private readonly _myTimer: Timer;\r\n\r\n constructor(duration: number = 0, transitionToPerformOnEnd: unknown, ...transitionArgs: unknown[]) {\r\n super(() => this._myTimer.isDone(), transitionToPerformOnEnd, ...transitionArgs);\r\n\r\n this._myTimer = new Timer(duration, false);\r\n }\r\n\r\n public setDuration(duration: number): void {\r\n this._myTimer.setDuration(duration);\r\n }\r\n\r\n public onEnd(listener: () => void, id?: unknown): void {\r\n this._myTimer.onEnd(listener, id);\r\n }\r\n\r\n public unregisterOnEnd(id?: unknown): void {\r\n this._myTimer.unregisterOnEnd(id);\r\n }\r\n\r\n public update(dt: number, fsm: FSM): void {\r\n this._myTimer.update(dt);\r\n\r\n super._update(dt, fsm);\r\n }\r\n\r\n public start(fsm: FSM, transitionData: Readonly, duration?: number, transitionToPerformOnEnd?: unknown, ...transitionArgs: unknown[]): void {\r\n this._myTimer.start(duration);\r\n\r\n super._start(fsm, transitionData, undefined, transitionToPerformOnEnd, ...transitionArgs);\r\n }\r\n\r\n public init(fsm: FSM, stateData: Readonly, duration?: number, transitionToPerformOnEnd?: unknown, ...transitionArgs: unknown[]): void {\r\n this._myTimer.start(duration);\r\n\r\n super._init(fsm, stateData, undefined, transitionToPerformOnEnd, ...transitionArgs);\r\n }\r\n}", "import { FSM, StateData, TransitionData } from \"../../fsm.js\";\r\nimport { State } from \"../../state.js\";\r\nimport { BaseConditionState } from \"./base_condition_state.js\";\r\n\r\nexport class FramesCountdownState extends BaseConditionState implements State {\r\n\r\n private _myFramesCountdown: number;\r\n private _myCurrentFramesCountdown: number;\r\n\r\n constructor(framesCountdown: number = 0, transitionToPerformOnEnd: unknown, ...transitionArgs: unknown[]) {\r\n super(() => this._myCurrentFramesCountdown <= 0, transitionToPerformOnEnd, ...transitionArgs);\r\n\r\n this._myFramesCountdown = framesCountdown;\r\n this._myCurrentFramesCountdown = this._myFramesCountdown;\r\n }\r\n\r\n public setFramesCountdown(framesCountdown: number): void {\r\n this._myFramesCountdown = framesCountdown;\r\n this._myCurrentFramesCountdown = this._myFramesCountdown;\r\n }\r\n\r\n public update(dt: number, fsm: FSM): void {\r\n if (this._myCurrentFramesCountdown > 0) {\r\n this._myCurrentFramesCountdown--;\r\n }\r\n\r\n super._update(dt, fsm);\r\n }\r\n\r\n public start(fsm: FSM, transitionData: Readonly, duration?: number, transitionToPerformOnEnd?: unknown, ...transitionArgs: unknown[]): void {\r\n this._myCurrentFramesCountdown = this._myFramesCountdown;\r\n\r\n super._start(fsm, transitionData, undefined, transitionToPerformOnEnd, ...transitionArgs);\r\n }\r\n\r\n public init(fsm: FSM, stateData: Readonly, duration?: number, transitionToPerformOnEnd?: unknown, ...transitionArgs: unknown[]): void {\r\n this._myCurrentFramesCountdown = this._myFramesCountdown;\r\n\r\n super._init(fsm, stateData, undefined, transitionToPerformOnEnd, ...transitionArgs);\r\n }\r\n}", "import { Timer } from \"../../../cauldron/timer.js\";\r\nimport { FSM, StateData, TransitionData } from \"../../fsm.js\";\r\nimport { State } from \"../../state.js\";\r\nimport { BaseConditionState } from \"./base_condition_state.js\";\r\n\r\nexport class DelayState extends BaseConditionState implements State {\r\n\r\n private readonly _myTimer: Timer;\r\n\r\n private _myFramesCountdown: number;\r\n private _myCurrentFramesCountdown: number;\r\n\r\n private _myUpdateTimerAfterFramesCountdown: boolean;\r\n\r\n constructor(duration: number = 0, framesCountdown: number = 0, updateTimerAfterFramesCountdown: boolean = true, transitionToPerformOnEnd: unknown, ...transitionArgs: unknown[]) {\r\n super(() => this._myCurrentFramesCountdown <= 0 && this._myTimer.isDone(), transitionToPerformOnEnd, ...transitionArgs);\r\n\r\n this._myTimer = new Timer(duration, false);\r\n\r\n this._myFramesCountdown = framesCountdown;\r\n this._myCurrentFramesCountdown = this._myFramesCountdown;\r\n\r\n this._myUpdateTimerAfterFramesCountdown = updateTimerAfterFramesCountdown;\r\n }\r\n\r\n public setUpdateTimerAfterFramesCountdown(updateTimerAfterFramesCountdown: boolean): void {\r\n this._myUpdateTimerAfterFramesCountdown = updateTimerAfterFramesCountdown;\r\n }\r\n\r\n public setDuration(duration: number): void {\r\n this._myTimer.setDuration(duration);\r\n }\r\n\r\n public setFramesCountdown(framesCountdown: number): void {\r\n this._myFramesCountdown = framesCountdown;\r\n this._myCurrentFramesCountdown = this._myFramesCountdown;\r\n }\r\n\r\n public update(dt: number, fsm: FSM): void {\r\n if (this._myCurrentFramesCountdown > 0) {\r\n this._myCurrentFramesCountdown--;\r\n }\r\n\r\n if (!this._myUpdateTimerAfterFramesCountdown || this._myCurrentFramesCountdown <= 0) {\r\n this._myTimer.update(dt);\r\n }\r\n\r\n super._update(dt, fsm);\r\n }\r\n\r\n public start(fsm: FSM, transitionData: Readonly, duration?: number, transitionToPerformOnEnd?: unknown, ...transitionArgs: unknown[]): void {\r\n this._myTimer.start(duration);\r\n this._myCurrentFramesCountdown = this._myFramesCountdown;\r\n\r\n super._start(fsm, transitionData, undefined, transitionToPerformOnEnd, ...transitionArgs);\r\n }\r\n\r\n public init(fsm: FSM, stateData: Readonly, duration?: number, transitionToPerformOnEnd?: unknown, ...transitionArgs: unknown[]): void {\r\n this._myTimer.start(duration);\r\n this._myCurrentFramesCountdown = this._myFramesCountdown;\r\n\r\n super._init(fsm, stateData, undefined, transitionToPerformOnEnd, ...transitionArgs);\r\n }\r\n}", "import { FSM, StateData, TransitionData } from \"../../fsm.js\";\r\nimport { State } from \"../../state.js\";\r\n\r\n/**\r\n * This state calls the `branchCallback` function every `update` and if it returns a value different from `null` \r\n * will perform a transition using that value as `transitionID`\r\n * \r\n * If you want to also forward args for the transition, you have you to return the transition as an array \r\n * where the first item is the `transitionID` and the second one are the arguments: `[transitionID, [argument1, argument2, ...]]`\r\n */\r\nexport class BranchState implements State {\r\n\r\n private _myBranchCallback: () => unknown | [unknown, unknown[]];\r\n\r\n constructor(branchCallback: () => unknown | [unknown, unknown[]]) {\r\n this._myBranchCallback = branchCallback;\r\n }\r\n\r\n public setBranchCallback(branchCallback: () => unknown | [unknown, unknown[]]): void {\r\n this._myBranchCallback = branchCallback;\r\n }\r\n\r\n public update(dt: number, fsm: FSM): void {\r\n const branchResult = this._myBranchCallback();\r\n if (branchResult != null) {\r\n if (Array.isArray(branchResult) && branchResult.length == 2) {\r\n fsm.perform(branchResult[0], ...branchResult[1]);\r\n } else {\r\n fsm.perform(branchResult);\r\n }\r\n }\r\n }\r\n\r\n public start(fsm: FSM, transitionData: Readonly, branchCallback?: () => unknown | [unknown, unknown[]]): void {\r\n if (branchCallback != null) {\r\n this._myBranchCallback = branchCallback;\r\n }\r\n }\r\n\r\n public init(fsm: FSM, stateData: Readonly, branchCallback?: () => boolean): void {\r\n if (branchCallback != null) {\r\n this._myBranchCallback = branchCallback;\r\n }\r\n }\r\n}", "import { Vector4 } from \"../type_definitions/array_type_definitions.js\";\r\nimport { Vec4Utils } from \"./array/vec4_utils.js\";\r\n\r\nexport enum ColorModel {\r\n RGB,\r\n HSV\r\n}\r\n\r\n/** `rgb` is in the `[0, 1]` space, alpha is not changed */\r\nexport function rgbToHSV(rgb: Readonly): T;\r\nexport function rgbToHSV(rgb: Readonly, out: T): T;\r\nexport function rgbToHSV(rgb: Readonly, out: T | U = Vec4Utils.clone(rgb)): T | U {\r\n const r = rgb[0];\r\n const g = rgb[1];\r\n const b = rgb[2];\r\n\r\n const max = Math.max(r, g, b);\r\n const min = Math.min(r, g, b);\r\n\r\n const d = max - min;\r\n\r\n let h = 0;\r\n const s = (max == 0 ? 0 : d / max);\r\n const v = max;\r\n\r\n switch (max) {\r\n case min:\r\n h = 0;\r\n break;\r\n case r:\r\n h = (g - b) + d * (g < b ? 6 : 0); h /= 6 * d;\r\n break;\r\n case g:\r\n h = (b - r) + d * 2; h /= 6 * d;\r\n break;\r\n case b:\r\n h = (r - g) + d * 4; h /= 6 * d;\r\n break;\r\n }\r\n\r\n out[0] = h;\r\n out[1] = s;\r\n out[2] = v;\r\n out[3] = rgb[3];\r\n\r\n return out;\r\n}\r\n\r\n/** alpha is not changed */\r\nexport function hsvToRGB(hsv: Readonly): T;\r\nexport function hsvToRGB(hsv: Readonly, out: T): T;\r\nexport function hsvToRGB(hsv: Readonly, out: T | U = Vec4Utils.clone(hsv)): T | U {\r\n const h = hsv[0];\r\n const s = hsv[1];\r\n const v = hsv[2];\r\n\r\n const i = Math.floor(h * 6);\r\n const f = h * 6 - i;\r\n const p = v * (1 - s);\r\n const q = v * (1 - f * s);\r\n const t = v * (1 - (1 - f) * s);\r\n\r\n let r = 0;\r\n let g = 0;\r\n let b = 0;\r\n\r\n switch (i % 6) {\r\n case 0:\r\n r = v;\r\n g = t;\r\n b = p;\r\n break;\r\n case 1:\r\n r = q;\r\n g = v;\r\n b = p;\r\n break;\r\n case 2:\r\n r = p;\r\n g = v;\r\n b = t;\r\n break;\r\n case 3:\r\n r = p;\r\n g = q;\r\n b = v;\r\n break;\r\n case 4:\r\n r = t;\r\n g = p;\r\n b = v;\r\n break;\r\n case 5:\r\n r = v;\r\n g = p;\r\n b = q;\r\n break;\r\n }\r\n\r\n out[0] = r;\r\n out[1] = g;\r\n out[2] = b;\r\n out[3] = hsv[3];\r\n\r\n return out;\r\n}\r\n\r\nexport function colorNormalizedToInt(color: Readonly): T;\r\nexport function colorNormalizedToInt(color: Readonly, out: T): T;\r\nexport function colorNormalizedToInt(color: Readonly, out: T | U = Vec4Utils.clone(color)): T | U {\r\n for (let i = 0; i < out.length; i++) {\r\n out[i] = Math.round(color[i] * 255);\r\n out[i] = Math.pp_clamp(out[i], 0, 255);\r\n }\r\n\r\n return out;\r\n}\r\n\r\nexport function colorIntToNormalized(color: Readonly): T;\r\nexport function colorIntToNormalized(color: Readonly, out: T): T;\r\nexport function colorIntToNormalized(color: Readonly, out: T | U = Vec4Utils.clone(color)): T | U {\r\n for (let i = 0; i < out.length; i++) {\r\n out[i] = color[i] / 255;\r\n out[i] = Math.pp_clamp(out[i], 0, 1);\r\n }\r\n\r\n return out;\r\n}\r\n\r\nexport const ColorUtils = {\r\n rgbToHSV,\r\n hsvToRGB,\r\n colorNormalizedToInt,\r\n colorIntToNormalized\r\n} as const;", "let _myAnalyticsEnabled: boolean = false;\r\n\r\nlet _mySendDataCallback: ((...args: unknown[]) => void) | null = null;\r\n\r\nconst _myEventsSentOnce: string[] = [];\r\n\r\nlet _myDataLogEnabled: boolean = false;\r\nlet _myEventsLogEnabled: boolean = false;\r\n\r\nlet _myErrorsLogEnabled: boolean = false;\r\n\r\nexport function setAnalyticsEnabled(enabled: boolean): void {\r\n _myAnalyticsEnabled = enabled;\r\n}\r\n\r\nexport function isAnalyticsEnabled(): boolean {\r\n return _myAnalyticsEnabled;\r\n}\r\n\r\nexport function setSendDataCallback(callback: ((...args: unknown[]) => void) | null): void {\r\n _mySendDataCallback = callback;\r\n}\r\n\r\nexport function sendData(...args: unknown[]): boolean {\r\n let dataSent = false;\r\n\r\n try {\r\n if (_myAnalyticsEnabled) {\r\n if (_myDataLogEnabled) {\r\n console.log(\"Analytics Data: \" + args);\r\n }\r\n\r\n if (_mySendDataCallback != null) {\r\n _mySendDataCallback(...args);\r\n\r\n dataSent = true;\r\n } else if (_myErrorsLogEnabled) {\r\n console.error(\"You need to set the send data callback\");\r\n }\r\n }\r\n } catch (error) {\r\n if (_myErrorsLogEnabled) {\r\n console.error(error);\r\n }\r\n\r\n dataSent = false;\r\n }\r\n\r\n return dataSent;\r\n}\r\n\r\nexport function sendEvent(eventName: string, params?: Record): boolean {\r\n let eventSent = false;\r\n\r\n try {\r\n if (_myAnalyticsEnabled) {\r\n if (_myEventsLogEnabled) {\r\n if (params != null) {\r\n console.log(\"Analytics Event: \" + eventName + \" - Params:\", params);\r\n } else {\r\n console.log(\"Analytics Event: \" + eventName);\r\n }\r\n }\r\n\r\n if (_mySendDataCallback != null) {\r\n if (params != null) {\r\n _mySendDataCallback(\"event\", eventName, params);\r\n } else {\r\n _mySendDataCallback(\"event\", eventName);\r\n }\r\n\r\n eventSent = true;\r\n } else if (_myErrorsLogEnabled) {\r\n console.error(\"Analytics Error: You need to set the send data callback\");\r\n } else {\r\n console.warn(\"Analytics Error: You need to set the send data callback\");\r\n }\r\n }\r\n } catch (error) {\r\n if (_myErrorsLogEnabled) {\r\n console.error(error);\r\n }\r\n\r\n eventSent = false;\r\n }\r\n\r\n return eventSent;\r\n}\r\n\r\nexport function sendEventOnce(eventName: string, params?: Record): boolean {\r\n let eventSent = false;\r\n\r\n if (_myAnalyticsEnabled) {\r\n if (!AnalyticsUtils.hasEventAlreadyBeenSent(eventName)) {\r\n eventSent = AnalyticsUtils.sendEvent(eventName, params);\r\n\r\n if (eventSent) {\r\n _myEventsSentOnce.pp_pushUnique(eventName);\r\n }\r\n }\r\n }\r\n\r\n return eventSent;\r\n}\r\n\r\nexport function sendEventWithValue(eventName: string, value: number): boolean {\r\n return AnalyticsUtils.sendEvent(eventName, { \"value\": value });\r\n}\r\n\r\nexport function sendEventOnceWithValue(eventName: string, value: number): boolean {\r\n return AnalyticsUtils.sendEventOnce(eventName, { \"value\": value });\r\n}\r\n\r\nexport function clearEventSentOnceState(eventName: string): void {\r\n _myEventsSentOnce.pp_removeEqual(eventName);\r\n}\r\n\r\nexport function clearAllEventsSentOnceState(): void {\r\n _myEventsSentOnce.pp_clear();\r\n}\r\n\r\nexport function hasEventAlreadyBeenSent(eventName: string): boolean {\r\n return _myEventsSentOnce.pp_hasEqual(eventName);\r\n}\r\n\r\nexport function getEventsAlreadyBeenSent(): string[] {\r\n return _myEventsSentOnce;\r\n}\r\n\r\nexport function setDataLogEnabled(enabled: boolean): void {\r\n _myDataLogEnabled = enabled;\r\n}\r\n\r\nexport function isDataLogEnabled(): boolean {\r\n return _myDataLogEnabled;\r\n}\r\n\r\nexport function setEventsLogEnabled(enabled: boolean): void {\r\n _myEventsLogEnabled = enabled;\r\n}\r\n\r\nexport function isEventsLogEnabled(): boolean {\r\n return _myEventsLogEnabled;\r\n}\r\n\r\nexport function setErrorsLogEnabled(enabled: boolean): void {\r\n _myErrorsLogEnabled = enabled;\r\n}\r\n\r\nexport function isErrorsLogEnabled(): boolean {\r\n return _myErrorsLogEnabled;\r\n}\r\n\r\nexport const AnalyticsUtils = {\r\n setAnalyticsEnabled,\r\n isAnalyticsEnabled,\r\n setSendDataCallback,\r\n sendData,\r\n sendEvent,\r\n sendEventOnce,\r\n sendEventWithValue,\r\n sendEventOnceWithValue,\r\n clearEventSentOnceState,\r\n clearAllEventsSentOnceState,\r\n hasEventAlreadyBeenSent,\r\n getEventsAlreadyBeenSent,\r\n setDataLogEnabled,\r\n isDataLogEnabled,\r\n setEventsLogEnabled,\r\n isEventsLogEnabled,\r\n setErrorsLogEnabled,\r\n isErrorsLogEnabled\r\n} as const;", "import { Material, MeshComponent, Object3D, TextComponent } from \"@wonderlandengine/api\";\r\nimport { vec4_create } from \"../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Vector4 } from \"../../type_definitions/array_type_definitions.js\";\r\nimport { FlatMaterial, PhongMaterial } from \"../type_definitions/material_type_definitions.js\";\r\n\r\nexport const setAlpha = function () {\r\n const color = vec4_create();\r\n return function setAlpha(material: Material, alpha: number): void {\r\n const flatMaterial = material as FlatMaterial;\r\n if (flatMaterial.color != null) {\r\n color.vec4_copy(flatMaterial.color);\r\n color[3] = alpha;\r\n flatMaterial.color = color;\r\n }\r\n\r\n const phongMaterial = material as PhongMaterial;\r\n if (phongMaterial.diffuseColor != null) {\r\n color.vec4_copy(phongMaterial.diffuseColor);\r\n color[3] = alpha;\r\n phongMaterial.diffuseColor = color;\r\n }\r\n\r\n if (phongMaterial.ambientColor != null) {\r\n color.vec4_copy(phongMaterial.ambientColor);\r\n color[3] = alpha;\r\n phongMaterial.ambientColor = color;\r\n }\r\n };\r\n}();\r\n\r\nexport function setObjectAlpha(object: Readonly, alpha: number): void {\r\n const meshComponents = object.pp_getComponents(MeshComponent);\r\n for (const meshComponent of meshComponents) {\r\n if (meshComponent.material != null) {\r\n MaterialUtils.setAlpha(meshComponent.material, alpha);\r\n }\r\n }\r\n\r\n const textComponents = object.pp_getComponents(TextComponent);\r\n for (const textComponent of textComponents) {\r\n if (textComponent.material != null) {\r\n MaterialUtils.setAlpha(textComponent.material, alpha);\r\n }\r\n }\r\n}\r\n\r\nexport function setObjectMaterial(object: Readonly, material: Material, cloneMaterial: boolean = false): void {\r\n const meshComponents = object.pp_getComponents(MeshComponent);\r\n for (const meshComponent of meshComponents) {\r\n if (cloneMaterial) {\r\n meshComponent.material = material.clone();\r\n } else {\r\n meshComponent.material = material;\r\n }\r\n }\r\n\r\n const textComponents = object.pp_getComponents(TextComponent);\r\n for (const textComponent of textComponents) {\r\n if (cloneMaterial) {\r\n textComponent.material = material.clone();\r\n } else {\r\n textComponent.material = material;\r\n }\r\n }\r\n}\r\n\r\nexport function setObjectClonedMaterials(object: Readonly): void {\r\n const meshComponents = object.pp_getComponents(MeshComponent);\r\n for (const meshComponent of meshComponents) {\r\n if (meshComponent.material != null) {\r\n meshComponent.material = meshComponent.material.clone();\r\n }\r\n }\r\n\r\n const textComponents = object.pp_getComponents(TextComponent);\r\n for (const textComponent of textComponents) {\r\n if (textComponent.material != null) {\r\n textComponent.material = textComponent.material.clone();\r\n }\r\n }\r\n}\r\n\r\nexport function setObjectSpecularColor(object: Readonly, color: Readonly): void {\r\n const meshComponents = object.pp_getComponents(MeshComponent);\r\n for (const meshComponent of meshComponents) {\r\n if (meshComponent.material != null) {\r\n const phongMaterial = meshComponent.material as PhongMaterial;\r\n if (phongMaterial.specularColor != null) {\r\n phongMaterial.specularColor = color;\r\n }\r\n }\r\n }\r\n\r\n const textComponents = object.pp_getComponents(TextComponent);\r\n for (const textComponent of textComponents) {\r\n if (textComponent.material != null) {\r\n const phongMaterial = textComponent.material as PhongMaterial;\r\n if (phongMaterial.specularColor != null) {\r\n phongMaterial.specularColor = color;\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport function setObjectFogColor(object: Readonly, color: Readonly): void {\r\n const meshComponents = object.pp_getComponents(MeshComponent);\r\n for (const meshComponent of meshComponents) {\r\n if (meshComponent.material != null) {\r\n const phongMaterial = meshComponent.material as PhongMaterial;\r\n if (phongMaterial.fogColor != null) {\r\n phongMaterial.fogColor = color;\r\n }\r\n }\r\n }\r\n\r\n const textComponents = object.pp_getComponents(TextComponent);\r\n for (const textComponent of textComponents) {\r\n if (textComponent.material != null) {\r\n const phongMaterial = textComponent.material as PhongMaterial;\r\n if (phongMaterial.fogColor != null) {\r\n phongMaterial.fogColor = color;\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport const MaterialUtils = {\r\n setAlpha,\r\n setObjectAlpha,\r\n setObjectMaterial,\r\n setObjectClonedMaterials,\r\n setObjectSpecularColor,\r\n setObjectFogColor\r\n} as const;", "import { TextComponent } from \"@wonderlandengine/api\";\r\n\r\nexport function setClonedMaterials(object) {\r\n let textComponents = object.pp_getComponents(TextComponent);\r\n\r\n for (let textComponent of textComponents) {\r\n if (textComponent.material != null) {\r\n textComponent.material = textComponent.material.clone();\r\n }\r\n }\r\n}\r\n\r\nexport let TextUtils = {\r\n setClonedMaterials\r\n};", "import { Component, Property } from \"@wonderlandengine/api\";\r\nimport { VisualTransform, VisualTransformParams } from \"../../cauldron/visual/elements/visual_transform.js\";\r\nimport { Globals } from \"../../pp/globals.js\";\r\n\r\nexport class DebugTransformComponent extends Component {\r\n static TypeName = \"pp-debug-transform\";\r\n static Properties = {\r\n _myLength: Property.float(0.1),\r\n _myThickness: Property.float(0.005)\r\n };\r\n\r\n start() {\r\n this._myStarted = false;\r\n }\r\n\r\n update(dt) {\r\n if (Globals.isDebugEnabled(this.engine)) {\r\n if (!this._myStarted) {\r\n this._myDebugVisualTransform = null;\r\n\r\n this._myDebugTransformParams = new VisualTransformParams(this.engine);\r\n this._myDebugTransformParams.myLength = this._myLength;\r\n this._myDebugTransformParams.myThickness = this._myThickness;\r\n\r\n this._myDebugVisualTransform = new VisualTransform(this._myDebugTransformParams);\r\n this._myDebugVisualTransform.setVisible(Globals.isDebugEnabled(this.engine));\r\n\r\n this._myStarted = true;\r\n } else {\r\n this.object.pp_getTransform(this._myDebugTransformParams.myTransform);\r\n this._myDebugVisualTransform.paramsUpdated();\r\n this._myDebugVisualTransform.setVisible(true);\r\n }\r\n }\r\n }\r\n\r\n onDeactivate() {\r\n if (this._myStarted) {\r\n this._myDebugVisualTransform.setVisible(false);\r\n }\r\n }\r\n\r\n onDestroy() {\r\n if (this._myStarted) {\r\n this._myDebugVisualTransform.destroy();\r\n }\r\n }\r\n}", "import { Alignment, Component, Property, VerticalAlignment } from \"@wonderlandengine/api\";\r\nimport { Timer } from \"../../cauldron/cauldron/timer.js\";\r\nimport { vec3_create, vec4_create } from \"../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Globals } from \"../../pp/globals.js\";\r\n\r\nexport class ShowFPSComponent extends Component {\r\n static TypeName = \"pp-show-fps\";\r\n static Properties = {\r\n _myRefreshSeconds: Property.float(0.25),\r\n _myScreenPositionX: Property.float(1),\r\n _myScreenPositionY: Property.float(-1),\r\n _myScreenPositionZ: Property.float(1),\r\n _myScale: Property.float(1.5),\r\n _myTextMaterial: Property.material()\r\n };\r\n\r\n start() {\r\n this._myColor = vec4_create(1, 1, 1, 1);\r\n if (this._myTextMaterial != null) {\r\n this._myColor.vec4_copy(this._myTextMaterial.color);\r\n }\r\n\r\n this._myScreenPosition = vec3_create(this._myScreenPositionX, this._myScreenPositionY, this._myScreenPositionZ);\r\n\r\n this._myCurrentFPS = 0;\r\n\r\n this._myTimer = new Timer(this._myRefreshSeconds);\r\n this._myTotalDT = 0;\r\n this._myFrames = 0;\r\n }\r\n\r\n update(dt) {\r\n if (Globals.isDebugEnabled(this.engine) && Globals.getDebugVisualManager(this.engine) != null) {\r\n this._myTotalDT += dt;\r\n this._myFrames++;\r\n\r\n this._myTimer.update(dt);\r\n if (this._myTimer.isDone()) {\r\n this._myTimer.start();\r\n\r\n this._myCurrentFPS = Math.round(this._myFrames / this._myTotalDT);\r\n\r\n this._myTotalDT = 0;\r\n this._myFrames = 0;\r\n }\r\n\r\n Globals.getDebugVisualManager(this.engine).drawUIText(0, this._myCurrentFPS.toFixed(0), this._myScreenPosition, this._myScale, this._myColor, Alignment.Right, VerticalAlignment.Bottom);\r\n }\r\n }\r\n}", "import { Component, property } from \"@wonderlandengine/api\";\r\nimport { Handedness } from \"../../input/cauldron/input_types.js\";\r\nimport { InputUtils } from \"../../input/cauldron/input_utils.js\";\r\nimport { GamepadButtonID } from \"../../input/gamepad/gamepad_buttons.js\";\r\nimport { Globals } from \"../../pp/globals.js\";\r\n\r\nexport class ToggleActiveOnButtonPressComponent extends Component {\r\n public static override TypeName = \"toggle-active-on-button-press\";\r\n\r\n @property.enum([\"Left\", \"Right\"], \"Left\")\r\n private _myHandedness!: number;\r\n\r\n @property.enum([\"Select\", \"Squeeze\", \"Thumstick\", \"Top Button\", \"Bottom Button\"], \"Bottom Button\")\r\n private _myButton!: number;\r\n\r\n @property.int(2)\r\n private _myMultiplePressCount!: number;\r\n\r\n private _myHandednessType!: Handedness;\r\n private _myButtonID!: GamepadButtonID;\r\n\r\n private _myActive: boolean = false;\r\n\r\n public override start(): void {\r\n this._myHandednessType = InputUtils.getHandednessByIndex(this._myHandedness)!;\r\n switch (this._myButton) {\r\n case 0:\r\n this._myButtonID = GamepadButtonID.SELECT;\r\n break;\r\n case 1:\r\n this._myButtonID = GamepadButtonID.SQUEEZE;\r\n break;\r\n case 2:\r\n this._myButtonID = GamepadButtonID.THUMBSTICK;\r\n break;\r\n case 3:\r\n this._myButtonID = GamepadButtonID.TOP_BUTTON;\r\n break;\r\n case 4:\r\n this._myButtonID = GamepadButtonID.BOTTOM_BUTTON;\r\n break;\r\n }\r\n\r\n const components = this.object.pp_getComponents();\r\n for (const component of components) {\r\n if (component.active) {\r\n this._myActive = true;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n public override update(dt: number): void {\r\n if (Globals.isDebugEnabled() && Globals.getGamepad(this._myHandednessType)!.getButtonInfo(this._myButtonID).isPressEnd(this._myMultiplePressCount > 0 ? this._myMultiplePressCount : null)) {\r\n this.object.pp_setActive(!this._myActive);\r\n this.active = true;\r\n\r\n this._myActive = !this._myActive;\r\n }\r\n }\r\n}\r\n", "// #TODO Add getter/setter accessors overwrite\r\n// #TODO If both a class and the parent class are in the list, they should be overwritten in parent first order\r\n// #TODO How to overwrite class and objects from modules?\r\n// #TODO Some functions, like glMatrix.vec3.copy, are defined as getter, how to overwrite them?\r\n\r\nimport { JSUtils } from \"../../cauldron/utils/js_utils.js\";\r\nimport { Globals } from \"../../pp/globals.js\";\r\n\r\nexport class DebugFunctionsOverwriterParams {\r\n\r\n constructor(engine = Globals.getMainEngine()) {\r\n this.myObjectsByReference = []; // You can specify to count the call on a specific object instance\r\n this.myObjectsByPath = []; // If you want you can specify the instance by path, but it means it must be reachable from window\r\n\r\n this.myClassesByReference = []; // By Reference means by using a reference to the class, like doing Timer, but also let ref = Timer and use ref\r\n this.myClassesByPath = []; // By Path means by using the full class path, like \"Timer\", this is requiredneeded if u want to count the constructor\r\n\r\n // You can also count the call to a specific function, but it must be reachable from window, no reference way\r\n // It's mostly for global functions, which could be tracked anyway using window as object reference\r\n this.myFunctionsByPath = [];\r\n\r\n this.myExcludeConstructors = false; // Constructor calls count can be a problem for some classes (like Array)\r\n this.myExcludeJSObjectFunctions = false;\r\n\r\n this.myFunctionNamesToInclude = []; // Empty means every function is included, can be a regex (. must be escaped with \\\\.)\r\n this.myFunctionNamesToExclude = []; // Empty means no function is excluded, can be a regex (. must be escaped with \\\\.)\r\n\r\n // These can be used if u want to have a bit more control on function name filtering\r\n this.myFunctionPathsToInclude = []; // Empty means every function is included, can be a regex (. must be escaped with \\\\.)\r\n this.myFunctionPathsToExclude = []; // Empty means no function is excluded, can be a regex (. must be escaped with \\\\.)\r\n\r\n this.myObjectAddObjectDescendantsDepthLevel = 0; // You can specify if you want to also count the OBJECT descendants of the objects you have specified\r\n this.myObjectAddClassDescendantsDepthLevel = 0; // You can specify if you want to also count the CLASS descendants of the objects you have specified\r\n // The depth level specify how deep in the hierarchy, level 0 means no recursion, 1 only children, 2 also grand children, and so on\r\n // -1 to select all the hierarchy\r\n\r\n // These filters are only useful if u are doing recursion\r\n this.myObjectNamesToInclude = []; // Empty means every object is included, can be a regex (. must be escaped with \\\\.)\r\n this.myObjectNamesToExclude = []; // Empty means no object is excluded, can be a regex (. must be escaped with \\\\.)\r\n\r\n this.myClassNamesToInclude = []; // Empty means every class is included, can be a regex (. must be escaped with \\\\.)\r\n this.myClassNamesToExclude = []; // Empty means no class is excluded, can be a regex (. must be escaped with \\\\.)\r\n\r\n this.myObjectPathsToInclude = []; // Empty means every object is included, can be a regex (. must be escaped with \\\\.)\r\n this.myObjectPathsToExclude = []; // Empty means no object is excluded, can be a regex (. must be escaped with \\\\.)\r\n\r\n this.myClassPathsToInclude = []; // Empty means every class is included, can be a regex (. must be escaped with \\\\.)\r\n this.myClassPathsToExclude = []; // Empty means no class is excluded, can be a regex (. must be escaped with \\\\.)\r\n\r\n // Tricks\r\n // - you can specify an object/class/function as a pair [object, \"name\"] instead of just object\r\n // and the name, if not null, will be used as path instead of the default one\r\n // WARNING: this means that there is a specific case, an array of 2 elements with a string, which can't be tracked if you don't put it inside an array like above\r\n\r\n this.myLogEnabled = false;\r\n\r\n this.myEngine = engine;\r\n }\r\n}\r\n\r\nexport class DebugFunctionsOverwriter {\r\n\r\n constructor(params = new DebugFunctionsOverwriterParams()) {\r\n this._myParams = params;\r\n\r\n this._myPropertiesAlreadyOverwritten = new Map();\r\n }\r\n\r\n overwriteFunctions() {\r\n let classesAndParents = this._getReferencesAndParents(this._myParams.myClassesByReference, this._myParams.myClassesByPath, true);\r\n let objectsAndParents = this._getReferencesAndParents(this._myParams.myObjectsByReference, this._myParams.myObjectsByPath, false);\r\n let functionsAndParents = this._getReferencesAndParents([], this._myParams.myFunctionsByPath, false);\r\n\r\n this._objectAddDescendants(objectsAndParents, classesAndParents);\r\n\r\n for (let referenceAndParent of classesAndParents) {\r\n let reference = referenceAndParent[0];\r\n let referenceParent = referenceAndParent[1];\r\n let referenceName = referenceAndParent[2];\r\n let referencePath = referenceAndParent[3];\r\n let referenceNameForFilter = referenceAndParent[4];\r\n\r\n this._overwriteReferenceFunctions(reference, referenceParent, referenceName, referencePath, referenceNameForFilter, true);\r\n }\r\n\r\n for (let referenceAndParent of objectsAndParents) {\r\n let reference = referenceAndParent[0];\r\n let referenceParent = referenceAndParent[1];\r\n let referenceName = referenceAndParent[2];\r\n let referencePath = referenceAndParent[3];\r\n let referenceNameForFilter = referenceAndParent[4];\r\n\r\n this._overwriteReferenceFunctions(reference, referenceParent, referenceName, referencePath, referenceNameForFilter, false);\r\n }\r\n\r\n for (let referenceAndParent of functionsAndParents) {\r\n let referenceParent = referenceAndParent[1];\r\n let referenceName = referenceAndParent[2];\r\n let referencePath = referenceAndParent[3];\r\n\r\n this._overwriteFunction(referenceParent, referenceName, null, null, referencePath, false, true);\r\n }\r\n }\r\n\r\n // Hooks\r\n\r\n _getOverwrittenFunction(reference, propertyName, referencePath, isClass, isFunction) {\r\n return JSUtils.getObjectProperty(reference, propertyName);\r\n }\r\n\r\n _getOverwrittenConstructor(reference, propertyName, referencePath, isClass, isFunction) {\r\n return JSUtils.getObjectProperty(reference, propertyName);\r\n }\r\n\r\n _onOverwriteSuccess(reference, propertyName, referenceParentForConstructor, referenceNameForConstructor, referencePath, isClass, isFunction, isConstructor) {\r\n\r\n }\r\n\r\n _onOverwriteFailure(reference, propertyName, referenceParentForConstructor, referenceNameForConstructor, referencePath, isClass, isFunction, isConstructor) {\r\n\r\n }\r\n\r\n // Hooks end\r\n\r\n _overwriteReferenceFunctions(reference, referenceParent, referenceName, referencePath, referenceNameForFilter, isClass) {\r\n let includePathList = this._myParams.myObjectPathsToInclude;\r\n let excludePathList = this._myParams.myObjectPathsToExclude;\r\n let includeNameList = this._myParams.myObjectNamesToInclude;\r\n let excludeNameList = this._myParams.myObjectNamesToExclude;\r\n if (isClass) {\r\n includePathList = this._myParams.myClassPathsToInclude;\r\n excludePathList = this._myParams.myClassPathsToExclude;\r\n includeNameList = this._myParams.myClassNamesToInclude;\r\n excludeNameList = this._myParams.myClassNamesToExclude;\r\n }\r\n\r\n let validReferencePath = this._filterName(referencePath, includePathList, excludePathList);\r\n let validReferenceName = this._filterName(referenceNameForFilter, includeNameList, excludeNameList);\r\n if (validReferencePath && validReferenceName) {\r\n let propertyNames = JSUtils.getObjectPropertyNames(reference);\r\n if (propertyNames.pp_hasEqual(\"constructor\")) {\r\n propertyNames.unshift(\"constructor\"); // Be sure it's added first to spot bugs, not important that it appears twice in the list\r\n }\r\n\r\n for (let propertyName of propertyNames) {\r\n let overwriteTargetReference = null;\r\n\r\n let referenceParentForConstructor = null;\r\n let referenceNameForConstructor = null;\r\n\r\n if (isClass) {\r\n let fixedReference = reference;\r\n\r\n if (referenceParent != null) {\r\n let ownReferenceDescriptor = Object.getOwnPropertyDescriptor(referenceParent, referenceName);\r\n if (ownReferenceDescriptor != null && ownReferenceDescriptor.value != null) {\r\n fixedReference = ownReferenceDescriptor.value;\r\n }\r\n }\r\n\r\n overwriteTargetReference = fixedReference.prototype;\r\n if (overwriteTargetReference == null) {\r\n overwriteTargetReference = fixedReference;\r\n } else {\r\n try {\r\n let referenceProperty = JSUtils.getObjectProperty(overwriteTargetReference, propertyName);\r\n if (referenceProperty == null) {\r\n overwriteTargetReference = fixedReference;\r\n }\r\n } catch (error) {\r\n overwriteTargetReference = fixedReference;\r\n }\r\n }\r\n\r\n referenceParentForConstructor = referenceParent;\r\n referenceNameForConstructor = referenceName;\r\n } else {\r\n overwriteTargetReference = reference;\r\n }\r\n\r\n this._overwriteFunction(overwriteTargetReference, propertyName, referenceParentForConstructor, referenceNameForConstructor, referencePath, isClass, false);\r\n\r\n }\r\n }\r\n }\r\n\r\n _overwriteFunction(reference, propertyName, referenceParentForConstructor, referenceNameForConstructor, referencePath, isClass, isFunction) {\r\n try {\r\n let propertyCountedAlready = this._myPropertiesAlreadyOverwritten.get(propertyName) != null && this._myPropertiesAlreadyOverwritten.get(propertyName).pp_hasEqual(reference);\r\n if (!propertyCountedAlready) {\r\n if (JSUtils.isFunctionByName(reference, propertyName) || (propertyName == \"constructor\" && JSUtils.isClassByName(reference, propertyName))) {\r\n if (!this._myParams.myExcludeJSObjectFunctions || !this._isJSObjectFunction(propertyName)) {\r\n let validFunctionName = this._filterName(propertyName, this._myParams.myFunctionNamesToInclude, this._myParams.myFunctionNamesToExclude);\r\n let validFunctionPath = this._filterName((referencePath != null ? referencePath + \".\" : \"\") + propertyName, this._myParams.myFunctionPathsToInclude, this._myParams.myFunctionPathsToExclude);\r\n if (validFunctionName && validFunctionPath) {\r\n if (!this._myPropertiesAlreadyOverwritten.has(propertyName)) {\r\n this._myPropertiesAlreadyOverwritten.set(propertyName, []);\r\n }\r\n\r\n let overwriteSuccess = false;\r\n let isConstructor = false;\r\n if (propertyName != \"constructor\") {\r\n try {\r\n let newFunction = this._getOverwrittenFunction(reference, propertyName, referencePath, isClass, isFunction);\r\n if (newFunction != JSUtils.getObjectProperty(reference, propertyName)) {\r\n overwriteSuccess = JSUtils.overwriteObjectProperty(newFunction, reference, propertyName, false, true, this._myParams.myLogEnabled);\r\n } else {\r\n overwriteSuccess = true;\r\n }\r\n } catch (error) {\r\n overwriteSuccess = false;\r\n\r\n if (this._myParams.myLogEnabled) {\r\n console.error(error);\r\n }\r\n }\r\n } else if (!this._myParams.myExcludeConstructors && isClass && referenceParentForConstructor != null) {\r\n let referenceForConstructor = JSUtils.getObjectProperty(referenceParentForConstructor, referenceNameForConstructor);\r\n if (referenceForConstructor != null && referenceForConstructor.prototype != null) {\r\n isConstructor = true;\r\n\r\n try {\r\n let newConstructor = this._getOverwrittenConstructor(referenceParentForConstructor, referenceNameForConstructor, referencePath, isClass, isFunction);\r\n if (newConstructor != referenceForConstructor) {\r\n overwriteSuccess = JSUtils.overwriteObjectProperty(newConstructor, referenceParentForConstructor, referenceNameForConstructor, false, true, this._myParams.myLogEnabled);\r\n if (overwriteSuccess) {\r\n overwriteSuccess = JSUtils.overwriteObjectProperty(newConstructor, referenceForConstructor.prototype, propertyName, false, true, this._myParams.myLogEnabled);\r\n }\r\n } else {\r\n overwriteSuccess = true;\r\n }\r\n } catch (error) {\r\n overwriteSuccess = false;\r\n\r\n if (this._myParams.myLogEnabled) {\r\n console.error(error);\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (overwriteSuccess) {\r\n this._myPropertiesAlreadyOverwritten.get(propertyName).push(reference);\r\n this._onOverwriteSuccess(reference, propertyName, referenceParentForConstructor, referenceNameForConstructor, referencePath, isClass, isFunction, isConstructor);\r\n } else {\r\n this._onOverwriteFailure(reference, propertyName, referenceParentForConstructor, referenceNameForConstructor, referencePath, isClass, isFunction, isConstructor);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n } catch (error) {\r\n if (this._myParams.myLogEnabled) {\r\n console.error(error);\r\n }\r\n }\r\n }\r\n\r\n _getReferencesAndParents(byReferenceList, byPathList, isClass) {\r\n let referenceAndParents = [];\r\n\r\n let equalCallback = (first, second) => first[0] == second[0];\r\n\r\n for (let pathPair of byPathList) {\r\n let path = pathPair;\r\n let referenceName = \"\";\r\n let referencePath = pathPair;\r\n let referenceNameForFilter = \"\";\r\n\r\n if (pathPair != null && Array.isArray(pathPair) && pathPair.length != null && pathPair.length == 2 && typeof pathPair[1] == \"string\") {\r\n path = pathPair[0];\r\n referencePath = pathPair[1];\r\n }\r\n\r\n referenceName = JSUtils.getObjectNameFromPath(path);\r\n referenceNameForFilter = JSUtils.getObjectNameFromPath(referencePath);\r\n\r\n let reference = JSUtils.getObjectFromPath(path, window);\r\n let referenceParent = JSUtils.getObjectParentFromPath(path, window);\r\n\r\n if (reference != null) {\r\n referenceAndParents.pp_pushUnique([reference, referenceParent, referenceName, referencePath, referenceNameForFilter], equalCallback);\r\n }\r\n }\r\n\r\n for (let referencePair of byReferenceList) {\r\n let reference = referencePair;\r\n let referenceName = \"\";\r\n let referencePath = \"\";\r\n let referenceNameForFilter = \"\";\r\n\r\n if (referencePair != null && referencePair.length != null && referencePair.length == 2 && typeof referencePair[1] == \"string\") {\r\n reference = referencePair[0];\r\n referencePath = referencePair[1];\r\n referenceNameForFilter = JSUtils.getObjectNameFromPath(referencePath);\r\n } else {\r\n referencePath = isClass ? reference.name : null;\r\n referenceNameForFilter = isClass ? reference.name : null;\r\n }\r\n\r\n if (isClass) {\r\n referenceName = reference.name;\r\n } else {\r\n referenceName = JSUtils.getObjectNameFromPath(referencePath);\r\n }\r\n\r\n if (reference != null) {\r\n referenceAndParents.pp_pushUnique([reference, null, referenceName, referencePath, referenceNameForFilter], equalCallback);\r\n }\r\n }\r\n\r\n return referenceAndParents;\r\n }\r\n\r\n _objectAddDescendants(objectsAndParents, classesAndParents) {\r\n let equalCallback = (first, second) => first[0] == second[0];\r\n\r\n let objectsToVisit = [];\r\n for (let objectAndParent of objectsAndParents) {\r\n objectsToVisit.pp_pushUnique([objectAndParent[0], 0, objectAndParent[3]], equalCallback);\r\n }\r\n\r\n while (objectsToVisit.length > 0) {\r\n let objectToVisit = objectsToVisit.shift();\r\n\r\n let object = objectToVisit[0];\r\n let objectLevel = objectToVisit[1];\r\n let objectPath = objectToVisit[2];\r\n\r\n if ((\r\n objectLevel + 1 <= this._myParams.myObjectAddObjectDescendantsDepthLevel || this._myParams.myObjectAddObjectDescendantsDepthLevel == -1) ||\r\n objectLevel + 1 <= this._myParams.myObjectAddClassDescendantsDepthLevel || this._myParams.myObjectAddClassDescendantsDepthLevel == -1) {\r\n\r\n let propertyNames = null;\r\n try {\r\n propertyNames = JSUtils.getObjectPropertyNames(object);\r\n } catch (error) {\r\n continue;\r\n }\r\n\r\n for (let propertyName of propertyNames) {\r\n let objectProperty = null;\r\n\r\n try {\r\n objectProperty = JSUtils.getObjectProperty(object, propertyName);\r\n if (objectProperty == null) {\r\n continue;\r\n }\r\n } catch (error) {\r\n continue;\r\n }\r\n\r\n let currentPath = \"\";\r\n let currentName = \"\";\r\n if (objectPath != null) {\r\n currentName = propertyName;\r\n currentPath = objectPath + \".\" + currentName;\r\n } else {\r\n currentName = propertyName;\r\n currentPath = currentName;\r\n }\r\n\r\n let isClass = JSUtils.isClassByName(object, propertyName);\r\n let isObject = JSUtils.isObjectByName(object, propertyName);\r\n\r\n let includePathList = this._myParams.myObjectPathsToInclude;\r\n let excludePathList = this._myParams.myObjectPathsToExclude;\r\n let includeNameList = this._myParams.myObjectNamesToInclude;\r\n let excludeNameList = this._myParams.myObjectNamesToExclude;\r\n if (isClass) {\r\n includePathList = this._myParams.myClassPathsToInclude;\r\n excludePathList = this._myParams.myClassPathsToExclude;\r\n includeNameList = this._myParams.myClassNamesToInclude;\r\n excludeNameList = this._myParams.myClassNamesToExclude;\r\n }\r\n\r\n let validReferencePath = this._filterName(currentPath, includePathList, excludePathList);\r\n let validReferenceName = this._filterName(propertyName, includeNameList, excludeNameList);\r\n if (validReferencePath && validReferenceName) {\r\n if (isObject && (objectLevel + 1 <= this._myParams.myObjectAddObjectDescendantsDepthLevel || this._myParams.myObjectAddObjectDescendantsDepthLevel == -1)) {\r\n objectsAndParents.pp_pushUnique([objectProperty, object, propertyName, currentPath, currentName], equalCallback);\r\n }\r\n\r\n if (isClass && propertyName != \"constructor\" && (objectLevel + 1 <= this._myParams.myObjectAddClassDescendantsDepthLevel || this._myParams.myObjectAddClassDescendantsDepthLevel == -1)) {\r\n classesAndParents.pp_pushUnique([objectProperty, object, propertyName, currentPath, currentName], equalCallback);\r\n }\r\n\r\n if (isObject) {\r\n objectsToVisit.pp_pushUnique([objectProperty, objectLevel + 1, currentPath], equalCallback);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n _filterName(name, includeList, excludeList) {\r\n let validName = includeList.length == 0;\r\n for (let includeName of includeList) {\r\n if (name.match(includeName) != null) {\r\n validName = true;\r\n break;\r\n }\r\n }\r\n\r\n if (validName) {\r\n for (let excludeName of excludeList) {\r\n if (name.match(excludeName) != null) {\r\n validName = false;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return validName;\r\n }\r\n\r\n _isJSObjectFunction(propertyName) {\r\n // Implemented outside class definition\r\n }\r\n}\r\n\r\n\r\n\r\n// IMPLEMENTATION\r\n\r\nDebugFunctionsOverwriter.prototype._isJSObjectFunction = function () {\r\n let jsObjectFunctions = [\r\n \"__defineGetter__\", \"__defineSetter__\", \"hasOwnProperty\", \"__lookupGetter__\", \"__lookupSetter__\", \"isPrototypeOf\",\r\n \"propertyIsEnumerable\", \"toString\", \"valueOf\", \"__proto__\", \"toLocaleString\", \"arguments\", \"caller\", \"apply\", \"bind\", \"call\", \"callee\"];\r\n return function _isJSObjectFunction(propertyName) {\r\n return jsObjectFunctions.pp_hasEqual(propertyName);\r\n };\r\n}();", "import { JSUtils } from \"../../../cauldron/utils/js_utils.js\";\r\nimport { DebugFunctionsOverwriter, DebugFunctionsOverwriterParams } from \"../debug_functions_overwriter.js\";\r\n\r\nexport class DebugFunctionsPerformanceAnalyzerParams extends DebugFunctionsOverwriterParams {\r\n\r\n constructor() {\r\n super();\r\n\r\n this.myExecutionTimeAnalysisEnabled = true;\r\n\r\n this.myAddPathPrefixToFunctionID = true;\r\n // This works at best when the object/class is specified as path\r\n // since with reference it's not possible to get the full path or get the variable name of the reference\r\n\r\n this.myFilterDebugFunctionsPerformanceAnalyzerClasses = true;\r\n }\r\n}\r\n\r\nexport class DebugFunctionPerformanceAnalysisResults {\r\n\r\n constructor() {\r\n this.myReference = null;\r\n this.myName = \"\";\r\n this.myPath = \"\";\r\n this.myID = \"\";\r\n\r\n this.myCallsCount = 0;\r\n this.myTotalExecutionTime = 0;\r\n this.myTotalExecutionTimePercentage = 0;\r\n this.myAverageExecutionTime = 0;\r\n this.myTimeElapsedSinceLastReset = 0;\r\n\r\n this._myTotalExecutionTimeInternal = 0;\r\n }\r\n\r\n reset() {\r\n this.myCallsCount = 0;\r\n this.myTotalExecutionTime = 0;\r\n this.myTotalExecutionTimePercentage = 0;\r\n this.myAverageExecutionTime = 0;\r\n this.myTimeElapsedSinceLastReset = 0;\r\n\r\n this._myTotalExecutionTimeInternal = 0;\r\n }\r\n\r\n max(other) {\r\n this.myCallsCount = Math.max(this.myCallsCount, other.myCallsCount);\r\n this.myTotalExecutionTime = Math.max(this.myTotalExecutionTime, other.myTotalExecutionTime);\r\n this.myTotalExecutionTimePercentage = Math.max(this.myTotalExecutionTimePercentage, other.myTotalExecutionTimePercentage);\r\n this.myAverageExecutionTime = Math.max(this.myAverageExecutionTime, other.myAverageExecutionTime);\r\n }\r\n\r\n copy(other) {\r\n this.myReference = other.myReference;\r\n this.myName = other.myName;\r\n this.myPath = other.myPath;\r\n this.myID = other.myID;\r\n\r\n this.myCallsCount = other.myCallsCount;\r\n this.myTotalExecutionTime = other.myTotalExecutionTime;\r\n this.myTotalExecutionTimePercentage = other.myTotalExecutionTimePercentage;\r\n this.myAverageExecutionTime = other.myAverageExecutionTime;\r\n this.myTimeElapsedSinceLastReset = other.myTimeElapsedSinceLastReset;\r\n\r\n this._myTotalExecutionTimeInternal = other._myTotalExecutionTimeInternal;\r\n }\r\n}\r\n\r\nexport let DebugFunctionsPerformanceAnalyzerSortOrder = {\r\n NONE: 0,\r\n CALLS_COUNT: 1,\r\n TOTAL_EXECUTION_TIME: 2,\r\n AVERAGE_EXECUTION_TIME: 3\r\n};\r\n\r\nexport class DebugFunctionsPerformanceAnalyzer extends DebugFunctionsOverwriter {\r\n\r\n constructor(params = new DebugFunctionsPerformanceAnalyzerParams()) {\r\n super(params);\r\n\r\n this._myFunctionPerformanceAnalysisResults = new Map();\r\n this._myFunctionPerformanceAnalysisMaxResults = new Map();\r\n\r\n this._myResultsAlreadyAdded = false;\r\n\r\n this._myExecutionTimes = {\r\n myOverheadExecutionTimeSinceLastReset: 0,\r\n myLastFunctionExecutionTime: 0,\r\n myOriginalFunctionOverheadExecutionTimes: []\r\n };\r\n this._myTimeOfLastReset = window.performance.now();\r\n this._myMaxTimeElapsedSinceLastReset = 0;\r\n\r\n let originalPush = Array.prototype[\"push\"];\r\n let originalPop = Array.prototype[\"pop\"];\r\n this._myExecutionTimes.myOriginalFunctionOverheadExecutionTimes.push = function () { return originalPush.bind(this)(...arguments); };\r\n this._myExecutionTimes.myOriginalFunctionOverheadExecutionTimes.pop = function () { return originalPop.bind(this)(...arguments); };\r\n }\r\n\r\n overwriteFunctions() {\r\n super.overwriteFunctions();\r\n\r\n this.resetResults();\r\n this.resetMaxResults();\r\n }\r\n\r\n getTimeElapsedSinceLastReset() {\r\n return window.performance.now() - this._myTimeOfLastReset - this._myExecutionTimes.myOverheadExecutionTimeSinceLastReset;\r\n }\r\n\r\n getMaxTimeElapsedSinceLastReset() {\r\n this._myMaxTimeElapsedSinceLastReset = Math.max(this._myMaxTimeElapsedSinceLastReset, this.getTimeElapsedSinceLastReset());\r\n return this._myMaxTimeElapsedSinceLastReset;\r\n }\r\n\r\n resetResults() {\r\n this._updateDerivatesResults();\r\n this._updateMaxResults();\r\n\r\n for (let property of this._myFunctionPerformanceAnalysisResults.keys()) {\r\n this._myFunctionPerformanceAnalysisResults.get(property).reset();\r\n }\r\n\r\n this._myExecutionTimes.myOverheadExecutionTimeSinceLastReset = 0;\r\n\r\n this._myTimeOfLastReset = window.performance.now();\r\n }\r\n\r\n resetMaxResults() {\r\n this._myMaxTimeElapsedSinceLastReset = 0;\r\n for (let property of this._myFunctionPerformanceAnalysisMaxResults.keys()) {\r\n this._myFunctionPerformanceAnalysisMaxResults.get(property).reset();\r\n }\r\n }\r\n\r\n getResults(sortOrder = DebugFunctionsPerformanceAnalyzerSortOrder.NONE) {\r\n this._updateDerivatesResults();\r\n this._updateMaxResults();\r\n\r\n let results = this._myFunctionPerformanceAnalysisResults;\r\n results = this._sortResults(results, sortOrder);\r\n return results;\r\n }\r\n\r\n getMaxResults(sortOrder = DebugFunctionsPerformanceAnalyzerSortOrder.NONE) {\r\n this._updateDerivatesResults();\r\n this._updateMaxResults();\r\n\r\n let results = this._myFunctionPerformanceAnalysisMaxResults;\r\n results = this._sortResults(results, sortOrder);\r\n return results;\r\n }\r\n\r\n _getOverwrittenFunction(reference, propertyName, referencePath, isClass, isFunction) {\r\n return this._getOverwrittenFunctionInternal(reference, propertyName, referencePath, isClass, isFunction, false);\r\n }\r\n\r\n _getOverwrittenConstructor(reference, propertyName, referencePath, isClass, isFunction) {\r\n return this._getOverwrittenFunctionInternal(reference, propertyName, referencePath, isClass, isFunction, true);\r\n }\r\n\r\n _onOverwriteSuccess(reference, propertyName, referenceParentForConstructor, referenceNameForConstructor, referencePath, isClass, isFunction, isConstructor) {\r\n this._myResultsAlreadyAdded = false;\r\n }\r\n\r\n _onOverwriteFailure(reference, propertyName, referenceParentForConstructor, referenceNameForConstructor, referencePath, isClass, isFunction, isConstructor) {\r\n if (this._myResultsAlreadyAdded) {\r\n let propertyID = this._getPropertyID(propertyName, referencePath, isFunction, isConstructor);\r\n this._myFunctionPerformanceAnalysisResults.delete(propertyID);\r\n }\r\n }\r\n\r\n _sortResults(results, sortOrder) {\r\n let sortedResults = results;\r\n\r\n if (sortOrder != DebugFunctionsPerformanceAnalyzerSortOrder.NONE) {\r\n sortedResults = new Map([...results.entries()].sort(function (first, second) {\r\n let sortResult = 0;\r\n\r\n if (sortOrder == DebugFunctionsPerformanceAnalyzerSortOrder.CALLS_COUNT) {\r\n sortResult = -(first[1].myCallsCount - second[1].myCallsCount);\r\n if (sortResult == 0) {\r\n sortResult = -(first[1].myTotalExecutionTime - second[1].myTotalExecutionTime);\r\n if (sortResult == 0) {\r\n sortResult = -(first[1].myAverageExecutionTime - second[1].myAverageExecutionTime);\r\n }\r\n }\r\n } else if (sortOrder == DebugFunctionsPerformanceAnalyzerSortOrder.TOTAL_EXECUTION_TIME) {\r\n sortResult = -(first[1].myTotalExecutionTime - second[1].myTotalExecutionTime);\r\n if (sortResult == 0) {\r\n sortResult = -(first[1].myAverageExecutionTime - second[1].myAverageExecutionTime);\r\n if (sortResult == 0) {\r\n sortResult = -(first[1].myCallsCount - second[1].myCallsCount);\r\n }\r\n }\r\n } else {\r\n sortResult = -(first[1].myAverageExecutionTime - second[1].myAverageExecutionTime);\r\n if (sortResult == 0) {\r\n sortResult = -(first[1].myTotalExecutionTime - second[1].myTotalExecutionTime);\r\n if (sortResult == 0) {\r\n sortResult = -(first[1].myCallsCount - second[1].myCallsCount);\r\n }\r\n }\r\n }\r\n\r\n return sortResult;\r\n }));\r\n }\r\n\r\n return sortedResults;\r\n }\r\n\r\n _getPropertyID(propertyName, referencePath, isFunction, isConstructor) {\r\n let id = isConstructor ? \"constructor\" : propertyName;\r\n\r\n if (referencePath != null && this._myParams.myAddPathPrefixToFunctionID) {\r\n if (!isFunction) {\r\n id = referencePath + \".\" + id;\r\n } else {\r\n id = referencePath;\r\n }\r\n }\r\n\r\n return id;\r\n }\r\n\r\n _updateDerivatesResults() {\r\n let timeElapsedSinceLastReset = this.getTimeElapsedSinceLastReset();\r\n let beforeTime = window.performance.now();\r\n\r\n for (let property of this._myFunctionPerformanceAnalysisResults.keys()) {\r\n let results = this._myFunctionPerformanceAnalysisResults.get(property);\r\n\r\n if (timeElapsedSinceLastReset != 0) {\r\n results.myTotalExecutionTimePercentage = results.myTotalExecutionTime / timeElapsedSinceLastReset;\r\n } else {\r\n if (results.myCallsCount != 0) {\r\n results.myTotalExecutionTimePercentage = 1;\r\n } else {\r\n results.myTotalExecutionTimePercentage = 0;\r\n }\r\n }\r\n\r\n if (results.myCallsCount != 0) {\r\n results.myAverageExecutionTime = results.myTotalExecutionTime / results.myCallsCount;\r\n } else {\r\n results.myAverageExecutionTime = 0;\r\n }\r\n\r\n results.myTimeElapsedSinceLastReset = timeElapsedSinceLastReset;\r\n }\r\n\r\n this._myExecutionTimes.myOverheadExecutionTimeSinceLastReset += window.performance.now() - beforeTime;\r\n }\r\n\r\n _updateMaxResults() {\r\n let beforeTime = window.performance.now();\r\n\r\n this._myMaxTimeElapsedSinceLastReset = Math.max(this._myMaxTimeElapsedSinceLastReset, this.getTimeElapsedSinceLastReset());\r\n\r\n for (let property of this._myFunctionPerformanceAnalysisResults.keys()) {\r\n if (this._myFunctionPerformanceAnalysisMaxResults.has(property)) {\r\n this._myFunctionPerformanceAnalysisMaxResults.get(property).max(this._myFunctionPerformanceAnalysisResults.get(property));\r\n } else {\r\n let maxResults = new DebugFunctionPerformanceAnalysisResults();\r\n maxResults.copy(this._myFunctionPerformanceAnalysisResults.get(property));\r\n this._myFunctionPerformanceAnalysisMaxResults.set(property, maxResults);\r\n }\r\n }\r\n\r\n this._myExecutionTimes.myOverheadExecutionTimeSinceLastReset += window.performance.now() - beforeTime;\r\n }\r\n\r\n _getOverwrittenFunctionInternal(reference, propertyName, referencePath, isClass, isFunction, isConstructor) {\r\n let newFunction = JSUtils.getObjectProperty(reference, propertyName);\r\n\r\n if (!this._myParams.myFilterDebugFunctionsPerformanceAnalyzerClasses || !this._isPerformanceAnalyzer(reference, propertyName, isClass)) {\r\n if (propertyName != \"_myPerformanceAnalyzerOriginalFunction\") {\r\n let propertyID = this._getPropertyID(propertyName, referencePath, isFunction, isConstructor);\r\n\r\n this._myResultsAlreadyAdded = this._myFunctionPerformanceAnalysisResults.has(propertyID);\r\n let analysisResults = new DebugFunctionPerformanceAnalysisResults();\r\n\r\n analysisResults.myReference = reference;\r\n analysisResults.myName = propertyName;\r\n analysisResults.myPath = referencePath;\r\n analysisResults.myID = referencePath;\r\n\r\n this._myFunctionPerformanceAnalysisResults.set(propertyID, analysisResults);\r\n\r\n try {\r\n let functionPerformanceAnalysisResults = this._myFunctionPerformanceAnalysisResults.get(propertyID);\r\n let executionTimes = this._myExecutionTimes;\r\n\r\n let originalFunction = reference[propertyName];\r\n let functionCallOverhead = 0.000175; // ms taken by an analyzed function that is empty\r\n let overheadError = 0.00035; // ms to add to adjust a bit for window.performance.now() max precision which is 0.0005\r\n\r\n let executionTimeAnalysisEnabled = this._myParams.myExecutionTimeAnalysisEnabled;\r\n\r\n if (!isConstructor) {\r\n newFunction = function () {\r\n let startTime = window.performance.now();\r\n\r\n let errorToThrow = null;\r\n let returnValue = undefined;\r\n let boundOriginalFunction = null;\r\n let startOriginalFunctionTime = 0;\r\n let endOriginalFunctionTime = 0;\r\n let originalFunctionOverheadExecutionTime = 0;\r\n let executionTimeToAdjust = 0;\r\n let executionTime = 0;\r\n let beforeOverhead = 0;\r\n let inBetweenOverhead = 0;\r\n\r\n if (executionTimeAnalysisEnabled) {\r\n executionTimes.myOriginalFunctionOverheadExecutionTimes.push(0);\r\n\r\n startOriginalFunctionTime = window.performance.now();\r\n endOriginalFunctionTime = window.performance.now();\r\n\r\n try {\r\n boundOriginalFunction = originalFunction.bind(this);\r\n startOriginalFunctionTime = window.performance.now();\r\n returnValue = boundOriginalFunction(...arguments);\r\n endOriginalFunctionTime = window.performance.now();\r\n } catch (error) {\r\n endOriginalFunctionTime = window.performance.now();\r\n errorToThrow = error;\r\n }\r\n } else {\r\n try {\r\n boundOriginalFunction = originalFunction.bind(this);\r\n returnValue = boundOriginalFunction(...arguments);\r\n } catch (error) {\r\n errorToThrow = error;\r\n }\r\n }\r\n\r\n functionPerformanceAnalysisResults.myCallsCount += 1;\r\n\r\n if (executionTimeAnalysisEnabled) {\r\n originalFunctionOverheadExecutionTime = executionTimes.myOriginalFunctionOverheadExecutionTimes.pop();\r\n\r\n executionTimeToAdjust = endOriginalFunctionTime - startOriginalFunctionTime - originalFunctionOverheadExecutionTime;\r\n executionTime = executionTimeToAdjust - functionCallOverhead;\r\n if (originalFunction._myPerformanceAnalyzerHasBeenOverwritten) {\r\n executionTime = executionTimes.myLastFunctionExecutionTime;\r\n }\r\n\r\n functionPerformanceAnalysisResults._myTotalExecutionTimeInternal += executionTime;\r\n functionPerformanceAnalysisResults.myTotalExecutionTime = Math.max(0, functionPerformanceAnalysisResults._myTotalExecutionTimeInternal);\r\n\r\n executionTimes.myLastFunctionExecutionTime = executionTime;\r\n\r\n beforeOverhead = startOriginalFunctionTime - startTime;\r\n inBetweenOverhead = beforeOverhead - endOriginalFunctionTime - overheadError;\r\n if (executionTimes.myOriginalFunctionOverheadExecutionTimes.length > 0) {\r\n executionTimes.myOriginalFunctionOverheadExecutionTimes[executionTimes.myOriginalFunctionOverheadExecutionTimes.length - 1] +=\r\n inBetweenOverhead + originalFunctionOverheadExecutionTime + overheadError * 2.75;\r\n executionTimes.myOriginalFunctionOverheadExecutionTimes[executionTimes.myOriginalFunctionOverheadExecutionTimes.length - 1] +=\r\n window.performance.now();\r\n }\r\n\r\n executionTimes.myOverheadExecutionTimeSinceLastReset += inBetweenOverhead;\r\n executionTimes.myOverheadExecutionTimeSinceLastReset += window.performance.now();\r\n }\r\n\r\n if (errorToThrow != null) {\r\n throw errorToThrow;\r\n }\r\n\r\n return returnValue;\r\n };\r\n } else {\r\n newFunction = function () {\r\n let startTime = window.performance.now();\r\n\r\n let errorToThrow = null;\r\n let returnValue = undefined;\r\n let startOriginalFunctionTime = 0;\r\n let endOriginalFunctionTime = 0;\r\n let originalFunctionOverheadExecutionTime = 0;\r\n let executionTimeToAdjust = 0;\r\n let executionTime = 0;\r\n let beforeOverhead = 0;\r\n let inBetweenOverhead = 0;\r\n\r\n if (executionTimeAnalysisEnabled) {\r\n executionTimes.myOriginalFunctionOverheadExecutionTimes.push(0);\r\n\r\n startOriginalFunctionTime = window.performance.now();\r\n endOriginalFunctionTime = window.performance.now();\r\n\r\n try {\r\n startOriginalFunctionTime = window.performance.now();\r\n returnValue = new originalFunction(...arguments);\r\n endOriginalFunctionTime = window.performance.now();\r\n } catch (error) {\r\n endOriginalFunctionTime = window.performance.now();\r\n errorToThrow = error;\r\n }\r\n } else {\r\n try {\r\n returnValue = new originalFunction(...arguments);\r\n } catch (error) {\r\n errorToThrow = error;\r\n }\r\n }\r\n\r\n functionPerformanceAnalysisResults.myCallsCount += 1;\r\n\r\n if (executionTimeAnalysisEnabled) {\r\n originalFunctionOverheadExecutionTime = executionTimes.myOriginalFunctionOverheadExecutionTimes.pop();\r\n\r\n executionTimeToAdjust = endOriginalFunctionTime - startOriginalFunctionTime - originalFunctionOverheadExecutionTime;\r\n executionTime = executionTimeToAdjust - functionCallOverhead;\r\n if (originalFunction._myPerformanceAnalyzerHasBeenOverwritten) {\r\n executionTime = executionTimes.myLastFunctionExecutionTime;\r\n }\r\n\r\n functionPerformanceAnalysisResults._myTotalExecutionTimeInternal += executionTime;\r\n functionPerformanceAnalysisResults.myTotalExecutionTime = Math.max(0, functionPerformanceAnalysisResults._myTotalExecutionTimeInternal);\r\n\r\n executionTimes.myLastFunctionExecutionTime = executionTime;\r\n\r\n beforeOverhead = startOriginalFunctionTime - startTime;\r\n inBetweenOverhead = beforeOverhead - endOriginalFunctionTime - overheadError;\r\n if (executionTimes.myOriginalFunctionOverheadExecutionTimes.length > 0) {\r\n executionTimes.myOriginalFunctionOverheadExecutionTimes[executionTimes.myOriginalFunctionOverheadExecutionTimes.length - 1] +=\r\n inBetweenOverhead + originalFunctionOverheadExecutionTime + overheadError * 2.75;\r\n executionTimes.myOriginalFunctionOverheadExecutionTimes[executionTimes.myOriginalFunctionOverheadExecutionTimes.length - 1] +=\r\n window.performance.now();\r\n }\r\n\r\n executionTimes.myOverheadExecutionTimeSinceLastReset += inBetweenOverhead;\r\n executionTimes.myOverheadExecutionTimeSinceLastReset += window.performance.now();\r\n }\r\n\r\n if (errorToThrow != null) {\r\n throw errorToThrow;\r\n }\r\n\r\n return returnValue;\r\n };\r\n }\r\n\r\n if (newFunction != null) {\r\n Object.defineProperty(newFunction, \"_myPerformanceAnalyzerHasBeenOverwritten\", {\r\n value: true,\r\n enumerable: false,\r\n configurable: false,\r\n writable: false\r\n });\r\n\r\n Object.defineProperty(newFunction, \"_myPerformanceAnalyzerOriginalFunction\", {\r\n value: originalFunction,\r\n enumerable: false,\r\n configurable: false,\r\n writable: false\r\n });\r\n }\r\n } catch (error) {\r\n if (this._myParams.myLogEnabled) {\r\n console.error(\"Function:\", propertyName, \"of:\", reference, \"can't be overwritten.\\nError:\", error);\r\n }\r\n }\r\n }\r\n }\r\n\r\n return newFunction;\r\n }\r\n\r\n _isPerformanceAnalyzer(reference, propertyName, isClass) {\r\n let isPerformanceAnalyzer = false;\r\n\r\n if (isClass) {\r\n if (reference == DebugFunctionsPerformanceAnalyzer.prototype || reference == DebugFunctionPerformanceAnalysisResults.prototype) {\r\n isPerformanceAnalyzer = true;\r\n }\r\n }\r\n\r\n return isPerformanceAnalyzer;\r\n }\r\n}", "import { Timer } from \"../../../cauldron/cauldron/timer.js\";\r\nimport { DebugFunctionsPerformanceAnalyzerSortOrder } from \"./debug_functions_performance_analyzer.js\";\r\n\r\nexport class DebugFunctionsPerformanceAnalysisResultsLoggerParams {\r\n\r\n constructor() {\r\n this.myPerformanceAnalyzer = null;\r\n\r\n this.myLogTitle = \"Functions Performance Analysis Results\";\r\n this.mySecondsBetweenLogs = 1;\r\n this.myLogFunction = \"log\";\r\n\r\n this.myFormatLog = true;\r\n this.myFormatLogIndentationCharacter = \"-\";\r\n\r\n this.myLogMaxResults = false;\r\n\r\n this.myLogSortOrder = DebugFunctionsPerformanceAnalyzerSortOrder.NONE;\r\n\r\n this.myLogMaxAmountOfFunctions = null;\r\n\r\n this.myLogFunctionsWithCallsCountAbove = null;\r\n this.myLogFunctionsWithTotalExecutionTimePercentageAbove = null;\r\n\r\n this.myLogCallsCountResults = false;\r\n this.myLogTotalExecutionTimeResults = false;\r\n this.myLogTotalExecutionTimePercentageResults = false;\r\n this.myLogAverageExecutionTimeResults = false;\r\n\r\n this.myClearConsoleBeforeLog = false;\r\n }\r\n}\r\n\r\nexport class DebugFunctionsPerformanceAnalysisResultsLogger {\r\n\r\n constructor(params) {\r\n this._myParams = params;\r\n\r\n this._myLogTimer = new Timer(this._myParams.mySecondsBetweenLogs);\r\n\r\n this._myMaxNameLength = 0;\r\n this._myMaxCallsCountLength = 0;\r\n this._myMaxTotalExecutionTimeLength = 0;\r\n this._myMaxTotalExecutionTimePercentageLength = 0;\r\n this._myMaxAverageExecutionTimeLength = 0;\r\n }\r\n\r\n update(dt) {\r\n if (this._myParams.myPerformanceAnalyzer == null) {\r\n return;\r\n }\r\n\r\n this._myLogTimer.update(dt);\r\n if (this._myLogTimer.isDone()) {\r\n this._myLogTimer.start();\r\n\r\n let timeSinceLastReset = this._myParams.myPerformanceAnalyzer.getTimeElapsedSinceLastReset();\r\n if (this._myParams.myLogMaxResults) {\r\n timeSinceLastReset = this._myParams.myPerformanceAnalyzer.getMaxTimeElapsedSinceLastReset();\r\n }\r\n\r\n let analysisResults = null;\r\n if (!this._myParams.myLogMaxResults) {\r\n analysisResults = this._myParams.myPerformanceAnalyzer.getResults(this._myParams.myLogSortOrder);\r\n } else {\r\n analysisResults = this._myParams.myPerformanceAnalyzer.getMaxResults(this._myParams.myLogSortOrder);\r\n }\r\n\r\n if (this._myParams.myLogFunctionsWithCallsCountAbove != null) {\r\n let analysisResultsClone = new Map(analysisResults);\r\n analysisResults = new Map();\r\n let keys = [...analysisResultsClone.keys()];\r\n for (let i = 0; i < keys.length; i++) {\r\n let results = analysisResultsClone.get(keys[i]);\r\n if (results.myCallsCount > this._myParams.myLogFunctionsWithCallsCountAbove) {\r\n analysisResults.set(keys[i], results);\r\n }\r\n }\r\n }\r\n\r\n if (this._myParams.myLogFunctionsWithTotalExecutionTimePercentageAbove != null) {\r\n let analysisResultsClone = new Map(analysisResults);\r\n analysisResults = new Map();\r\n let keys = [...analysisResultsClone.keys()];\r\n for (let i = 0; i < keys.length; i++) {\r\n let results = analysisResultsClone.get(keys[i]);\r\n if (results.myTotalExecutionTimePercentage * 100 > this._myParams.myLogFunctionsWithTotalExecutionTimePercentageAbove) {\r\n analysisResults.set(keys[i], results);\r\n }\r\n }\r\n }\r\n\r\n if (this._myParams.myLogMaxAmountOfFunctions != null) {\r\n let analysisResultsClone = new Map(analysisResults);\r\n analysisResults = new Map();\r\n let keys = [...analysisResultsClone.keys()];\r\n for (let i = 0; i < this._myParams.myLogMaxAmountOfFunctions && i < keys.length; i++) {\r\n let counter = analysisResultsClone.get(keys[i]);\r\n analysisResults.set(keys[i], counter);\r\n }\r\n }\r\n\r\n if (this._myParams.myClearConsoleBeforeLog) {\r\n console.clear();\r\n }\r\n\r\n let analysisResultsToLog = new Map();\r\n for (let key of analysisResults.keys()) {\r\n let currentResults = analysisResults.get(key);\r\n\r\n let resultsToLog = {};\r\n if (this._myParams.myLogCallsCountResults) {\r\n resultsToLog.myCallsCount = currentResults.myCallsCount;\r\n }\r\n\r\n if (this._myParams.myLogTotalExecutionTimeResults) {\r\n resultsToLog.myTotalExecutionTime = currentResults.myTotalExecutionTime;\r\n }\r\n\r\n if (this._myParams.myLogTotalExecutionTimePercentageResults) {\r\n resultsToLog.myTotalExecutionTimePercentage = currentResults.myTotalExecutionTimePercentage;\r\n }\r\n\r\n if (this._myParams.myLogAverageExecutionTimeResults) {\r\n resultsToLog.myAverageExecutionTime = currentResults.myAverageExecutionTime;\r\n }\r\n\r\n analysisResultsToLog.set(key, resultsToLog);\r\n }\r\n\r\n let resultsText = \"\";\r\n\r\n for (let entry of analysisResults.entries()) {\r\n let name = entry[0];\r\n let results = entry[1];\r\n\r\n this._myMaxNameLength = Math.max(this._myMaxNameLength, name.length);\r\n\r\n this._myMaxCallsCountLength = Math.max(this._myMaxCallsCountLength, results.myCallsCount.toFixed(0).length);\r\n this._myMaxTotalExecutionTimeLength = Math.max(this._myMaxTotalExecutionTimeLength, results.myTotalExecutionTime.toFixed(5).length);\r\n this._myMaxTotalExecutionTimePercentageLength = Math.max(this._myMaxTotalExecutionTimePercentageLength, (results.myTotalExecutionTimePercentage * 100).toFixed(2).length);\r\n this._myMaxAverageExecutionTimeLength = Math.max(this._myMaxAverageExecutionTimeLength, results.myAverageExecutionTime.toFixed(5).length);\r\n }\r\n\r\n for (let entry of analysisResults.entries()) {\r\n let name = entry[0];\r\n let results = entry[1];\r\n\r\n let parametersToLog = 0;\r\n if (this._myParams.myLogCallsCountResults) {\r\n parametersToLog++;\r\n }\r\n\r\n if (this._myParams.myLogTotalExecutionTimeResults) {\r\n parametersToLog++;\r\n }\r\n\r\n if (this._myParams.myLogTotalExecutionTimePercentageResults) {\r\n parametersToLog++;\r\n }\r\n\r\n if (this._myParams.myLogAverageExecutionTimeResults) {\r\n parametersToLog++;\r\n }\r\n\r\n let textOrdered = [];\r\n\r\n let callsCountText = ((parametersToLog > 1) ? \"Calls Count: \" : \"\");\r\n if (this._myParams.myFormatLog) {\r\n for (let i = 0; i < this._myMaxCallsCountLength - results.myCallsCount.toFixed(0).length; i++) {\r\n callsCountText += \" \";\r\n }\r\n }\r\n callsCountText += results.myCallsCount.toFixed(0);\r\n\r\n let totalExecutionTimeText = ((parametersToLog > 1) ? \"Total Time: \" : \"\");\r\n if (this._myParams.myFormatLog) {\r\n for (let i = 0; i < this._myMaxTotalExecutionTimeLength - results.myTotalExecutionTime.toFixed(5).length; i++) {\r\n totalExecutionTimeText += \" \";\r\n }\r\n }\r\n totalExecutionTimeText += results.myTotalExecutionTime.toFixed(5) + \"ms\";\r\n\r\n let totalExecutionTimePercentageText = ((parametersToLog > 1) ? \"Total Time: \" : \"\");\r\n if (this._myParams.myFormatLog) {\r\n for (let i = 0; i < this._myMaxTotalExecutionTimePercentageLength - (results.myTotalExecutionTimePercentage * 100).toFixed(2).length; i++) {\r\n totalExecutionTimePercentageText += \" \";\r\n }\r\n }\r\n totalExecutionTimePercentageText += (results.myTotalExecutionTimePercentage * 100).toFixed(2) + \"%\";\r\n\r\n let averageExecutionTimeText = ((parametersToLog > 1) ? \"Average Time: \" : \"\");\r\n if (this._myParams.myFormatLog) {\r\n for (let i = 0; i < this._myMaxAverageExecutionTimeLength - results.myAverageExecutionTime.toFixed(5).length; i++) {\r\n averageExecutionTimeText += \" \";\r\n }\r\n }\r\n averageExecutionTimeText += results.myAverageExecutionTime.toFixed(5) + \"ms\";\r\n\r\n if (!this._myParams.myLogCallsCountResults) {\r\n callsCountText = null;\r\n }\r\n\r\n if (!this._myParams.myLogTotalExecutionTimeResults) {\r\n totalExecutionTimeText = null;\r\n }\r\n\r\n if (!this._myParams.myLogTotalExecutionTimePercentageResults) {\r\n totalExecutionTimePercentageText = null;\r\n }\r\n\r\n if (!this._myParams.myLogAverageExecutionTimeResults) {\r\n averageExecutionTimeText = null;\r\n }\r\n\r\n switch (this._myParams.myLogSortOrder) {\r\n case DebugFunctionsPerformanceAnalyzerSortOrder.CALLS_COUNT:\r\n textOrdered.push(callsCountText);\r\n textOrdered.push(totalExecutionTimeText);\r\n textOrdered.push(totalExecutionTimePercentageText);\r\n textOrdered.push(averageExecutionTimeText);\r\n break;\r\n case DebugFunctionsPerformanceAnalyzerSortOrder.TOTAL_EXECUTION_TIME:\r\n textOrdered.push(totalExecutionTimeText);\r\n textOrdered.push(totalExecutionTimePercentageText);\r\n textOrdered.push(averageExecutionTimeText);\r\n textOrdered.push(callsCountText);\r\n break;\r\n case DebugFunctionsPerformanceAnalyzerSortOrder.AVERAGE_EXECUTION_TIME:\r\n textOrdered.push(averageExecutionTimeText);\r\n textOrdered.push(totalExecutionTimeText);\r\n textOrdered.push(totalExecutionTimePercentageText);\r\n textOrdered.push(callsCountText);\r\n break;\r\n default:\r\n textOrdered.push(callsCountText);\r\n textOrdered.push(totalExecutionTimeText);\r\n textOrdered.push(totalExecutionTimePercentageText);\r\n textOrdered.push(averageExecutionTimeText);\r\n }\r\n\r\n resultsText += \"\\n\";\r\n if (this._myParams.myFormatLog) {\r\n let nameIndented = name + \" \";\r\n while (nameIndented.length < this._myMaxNameLength + 1) {\r\n nameIndented += this._myParams.myFormatLogIndentationCharacter;\r\n }\r\n nameIndented += this._myParams.myFormatLogIndentationCharacter + \" \";\r\n resultsText += nameIndented;\r\n } else {\r\n resultsText += name + \" - \";\r\n }\r\n\r\n let avoidFirst = true;\r\n for (let text of textOrdered) {\r\n if (text != null) {\r\n if (avoidFirst) {\r\n avoidFirst = false;\r\n } else {\r\n resultsText += \" - \";\r\n }\r\n\r\n resultsText += text;\r\n }\r\n }\r\n }\r\n\r\n if ((this._myParams.myLogTotalExecutionTimeResults || this._myParams.myLogTotalExecutionTimePercentageResults || this._myParams.myLogAverageExecutionTimeResults)) {\r\n console[this._myParams.myLogFunction](\"\\n\" + this._myParams.myLogTitle, \"\\n\\nTotal Time:\", timeSinceLastReset.toFixed(5), \"ms\\n\", resultsText);\r\n } else {\r\n console[this._myParams.myLogFunction](\"\\n\" + this._myParams.myLogTitle, \"\\n\", resultsText);\r\n }\r\n }\r\n }\r\n}", "import { Component, Property } from \"@wonderlandengine/api\";\r\nimport { Timer } from \"../../../../cauldron/cauldron/timer.js\";\r\nimport { GamepadButtonID } from \"../../../../input/gamepad/gamepad_buttons.js\";\r\nimport { Globals } from \"../../../../pp/globals.js\";\r\nimport { DebugFunctionsPerformanceAnalysisResultsLogger, DebugFunctionsPerformanceAnalysisResultsLoggerParams } from \"../debug_functions_performance_analysis_results_logger.js\";\r\nimport { DebugFunctionsPerformanceAnalyzer, DebugFunctionsPerformanceAnalyzerParams } from \"../debug_functions_performance_analyzer.js\";\r\n\r\nexport class DebugFunctionsPerformanceAnalyzerComponent extends Component {\r\n static TypeName = \"pp-debug-functions-performance-analyzer\";\r\n static Properties = {\r\n _myObjectsByPath: Property.string(\"\"),\r\n _myClassesByPath: Property.string(\"\"),\r\n _myFunctionsByPath: Property.string(\"\"),\r\n _myDelayStart: Property.float(0.0),\r\n _myLogTitle: Property.string(\"Functions Performance Analysis Results\"),\r\n _myLogFunction: Property.enum([\"Log\", \"Error\", \"Warn\", \"Debug\"], \"Error\"),\r\n _mySecondsBetweenLogs: Property.float(1.0),\r\n _myLogMaxResults: Property.bool(false),\r\n _myLogSortOrder: Property.enum([\"None\", \"Calls Count\", \"Total Execution Time\", \"Average Execution Time\"], \"Calls Count\"),\r\n _myLogCallsCountResults: Property.bool(true),\r\n _myLogTotalExecutionTimeResults: Property.bool(false),\r\n _myLogTotalExecutionTimePercentageResults: Property.bool(false),\r\n _myLogAverageExecutionTimeResults: Property.bool(false),\r\n _myLogMaxAmountOfFunctions: Property.int(-1),\r\n _myLogFunctionsWithCallsCountAbove: Property.int(0),\r\n _myLogFunctionsWithTotalExecutionTimePercentageAbove: Property.float(-1),\r\n _myFunctionPathsToInclude: Property.string(\"\"),\r\n _myFunctionPathsToExclude: Property.string(\"\"),\r\n _myExcludeConstructors: Property.bool(false),\r\n _myExcludeJSObjectFunctions: Property.bool(true),\r\n _myAddPathPrefixToFunctionID: Property.bool(true),\r\n _myObjectAddObjectDescendantsDepthLevel: Property.int(0),\r\n _myObjectAddClassDescendantsDepthLevel: Property.int(0),\r\n _myClearConsoleBeforeLog: Property.bool(false),\r\n _myResetMaxResultsShortcutEnabled: Property.bool(false),\r\n _myClassesByReference: Property.enum([\"Code Driven\"], \"Code Driven\"),\r\n _myObjectsByReference: Property.enum([\"Code Driven\"], \"Code Driven\")\r\n };\r\n\r\n init() {\r\n this._myActive = false;\r\n\r\n if (Globals.isDebugEnabled(this.engine)) {\r\n this._init();\r\n }\r\n }\r\n\r\n _init() {\r\n this._myActive = true;\r\n\r\n this._myFunctionsPerformanceAnalyzer = null;\r\n this._myFunctionsPerformanceAnalysisResultsLogger = null;\r\n\r\n this._mySkipFirstUpdate = true;\r\n this._myStartTimer = new Timer(this._myDelayStart);\r\n if (this._myDelayStart == 0) {\r\n this._myStartTimer.end();\r\n this._mySkipFirstUpdate = false;\r\n this._start();\r\n }\r\n }\r\n\r\n start() {\r\n if (!this._myActive && Globals.isDebugEnabled(this.engine)) {\r\n this._init();\r\n }\r\n }\r\n\r\n update(dt) {\r\n if (!Globals.isDebugEnabled(this.engine)) return;\r\n\r\n if (this._myActive) {\r\n if (this._mySkipFirstUpdate) {\r\n this._mySkipFirstUpdate = false;\r\n return;\r\n }\r\n\r\n if (this._myStartTimer.isRunning()) {\r\n this._myStartTimer.update(dt);\r\n if (this._myStartTimer.isDone()) {\r\n this._start();\r\n }\r\n } else {\r\n this._myFunctionsPerformanceAnalysisResultsLogger.update(dt);\r\n this._myFunctionsPerformanceAnalyzer.resetResults();\r\n }\r\n\r\n if (this._myResetMaxResultsShortcutEnabled) {\r\n if (Globals.getLeftGamepad(this.engine).getButtonInfo(GamepadButtonID.SELECT).isPressEnd(3)) {\r\n this._myFunctionsPerformanceAnalyzer.resetMaxResults();\r\n }\r\n }\r\n }\r\n }\r\n\r\n _start() {\r\n let functionsPerformanceAnalyzerParams = new DebugFunctionsPerformanceAnalyzerParams(this.engine);\r\n\r\n if (this._myObjectsByPath.length > 0) {\r\n let toIncludeList = [...this._myObjectsByPath.split(\",\")];\r\n for (let i = 0; i < toIncludeList.length; i++) {\r\n toIncludeList[i] = toIncludeList[i].trim();\r\n }\r\n functionsPerformanceAnalyzerParams.myObjectsByPath.push(...toIncludeList);\r\n }\r\n\r\n if (this._myClassesByPath.length > 0) {\r\n let toIncludeList = [...this._myClassesByPath.split(\",\")];\r\n for (let i = 0; i < toIncludeList.length; i++) {\r\n toIncludeList[i] = toIncludeList[i].trim();\r\n }\r\n functionsPerformanceAnalyzerParams.myClassesByPath.push(...toIncludeList);\r\n }\r\n\r\n if (this._myFunctionsByPath.length > 0) {\r\n let toIncludeList = [...this._myFunctionsByPath.split(\",\")];\r\n for (let i = 0; i < toIncludeList.length; i++) {\r\n toIncludeList[i] = toIncludeList[i].trim();\r\n }\r\n functionsPerformanceAnalyzerParams.myFunctionsByPath.push(...toIncludeList);\r\n }\r\n\r\n functionsPerformanceAnalyzerParams.myExcludeConstructors = this._myExcludeConstructors;\r\n functionsPerformanceAnalyzerParams.myExcludeJSObjectFunctions = this._myExcludeJSObjectFunctions;\r\n functionsPerformanceAnalyzerParams.myAddPathPrefixToFunctionID = this._myAddPathPrefixToFunctionID;\r\n\r\n if (this._myFunctionPathsToInclude.length > 0) {\r\n let toIncludeList = [...this._myFunctionPathsToInclude.split(\",\")];\r\n for (let i = 0; i < toIncludeList.length; i++) {\r\n toIncludeList[i] = toIncludeList[i].trim();\r\n }\r\n functionsPerformanceAnalyzerParams.myFunctionPathsToInclude.push(...toIncludeList);\r\n }\r\n\r\n if (this._myFunctionPathsToExclude.length > 0) {\r\n let toExcludeList = [...this._myFunctionPathsToExclude.split(\",\")];\r\n for (let i = 0; i < toExcludeList.length; i++) {\r\n toExcludeList[i] = toExcludeList[i].trim();\r\n }\r\n functionsPerformanceAnalyzerParams.myFunctionPathsToExclude.push(...toExcludeList);\r\n }\r\n\r\n functionsPerformanceAnalyzerParams.myObjectAddObjectDescendantsDepthLevel = this._myObjectAddObjectDescendantsDepthLevel;\r\n functionsPerformanceAnalyzerParams.myObjectAddClassDescendantsDepthLevel = this._myObjectAddClassDescendantsDepthLevel;\r\n\r\n functionsPerformanceAnalyzerParams.myExecutionTimeAnalysisEnabled = this._myLogTotalExecutionTimeResults || this._myLogTotalExecutionTimePercentageResults || this._myLogAverageExecutionTimeResults;\r\n\r\n functionsPerformanceAnalyzerParams.myClassesByReference = (this._myClassesByReference != 0) ? this._myClassesByReference : [];\r\n functionsPerformanceAnalyzerParams.myObjectsByReference = (this._myObjectsByReference != 0) ? this._myObjectsByReference : [];\r\n\r\n this._myFunctionsPerformanceAnalyzer = new DebugFunctionsPerformanceAnalyzer(functionsPerformanceAnalyzerParams);\r\n this._myFunctionsPerformanceAnalyzer.overwriteFunctions();\r\n\r\n let functionsPerformanceAnalysisResultsLoggerParams = new DebugFunctionsPerformanceAnalysisResultsLoggerParams();\r\n functionsPerformanceAnalysisResultsLoggerParams.myPerformanceAnalyzer = this._myFunctionsPerformanceAnalyzer;\r\n functionsPerformanceAnalysisResultsLoggerParams.myLogTitle = this._myLogTitle;\r\n\r\n functionsPerformanceAnalysisResultsLoggerParams.mySecondsBetweenLogs = this._mySecondsBetweenLogs;\r\n functionsPerformanceAnalysisResultsLoggerParams.myLogFunction = [\"log\", \"error\", \"warn\", \"debug\"][this._myLogFunction];\r\n functionsPerformanceAnalysisResultsLoggerParams.myLogMaxAmountOfFunctions = (this._myLogMaxAmountOfFunctions >= 0) ? this._myLogMaxAmountOfFunctions : null;\r\n functionsPerformanceAnalysisResultsLoggerParams.myLogFunctionsWithCallsCountAbove = (this._myLogFunctionsWithCallsCountAbove >= 0) ? this._myLogFunctionsWithCallsCountAbove : null;\r\n functionsPerformanceAnalysisResultsLoggerParams.myLogFunctionsWithTotalExecutionTimePercentageAbove = (this._myLogFunctionsWithTotalExecutionTimePercentageAbove >= 0) ? this._myLogFunctionsWithTotalExecutionTimePercentageAbove : null;\r\n functionsPerformanceAnalysisResultsLoggerParams.myLogMaxResults = this._myLogMaxResults;\r\n functionsPerformanceAnalysisResultsLoggerParams.myClearConsoleBeforeLog = this._myClearConsoleBeforeLog;\r\n\r\n functionsPerformanceAnalysisResultsLoggerParams.myLogSortOrder = this._myLogSortOrder;\r\n\r\n functionsPerformanceAnalysisResultsLoggerParams.myLogCallsCountResults = this._myLogCallsCountResults;\r\n functionsPerformanceAnalysisResultsLoggerParams.myLogTotalExecutionTimeResults = this._myLogTotalExecutionTimeResults;\r\n functionsPerformanceAnalysisResultsLoggerParams.myLogTotalExecutionTimePercentageResults = this._myLogTotalExecutionTimePercentageResults;\r\n functionsPerformanceAnalysisResultsLoggerParams.myLogAverageExecutionTimeResults = this._myLogAverageExecutionTimeResults;\r\n\r\n this._myFunctionsPerformanceAnalysisResultsLogger = new DebugFunctionsPerformanceAnalysisResultsLogger(functionsPerformanceAnalysisResultsLoggerParams);\r\n }\r\n}", "import { Component, Property } from \"@wonderlandengine/api\";\r\nimport { DebugFunctionsPerformanceAnalyzerComponent } from \"./debug_functions_performance_analyzer_component.js\";\r\n\r\nexport class DebugPPFunctionsPerformanceAnalyzerComponent extends Component {\r\n static TypeName = \"pp-debug-pp-functions-performance-analyzer\";\r\n static Properties = {\r\n _myDelayStart: Property.float(0.0),\r\n _myLogFunction: Property.enum([\"Log\", \"Error\", \"Warn\", \"Debug\"], \"Error\"),\r\n _mySecondsBetweenLogs: Property.float(1.0),\r\n _myLogMaxResults: Property.bool(false),\r\n _myLogSortOrder: Property.enum([\"None\", \"Calls Count\", \"Total Execution Time\", \"Average Execution Time\"], \"Calls Count\"),\r\n _myLogCallsCountResults: Property.bool(true),\r\n _myLogTotalExecutionTimeResults: Property.bool(false),\r\n _myLogTotalExecutionTimePercentageResults: Property.bool(false),\r\n _myLogAverageExecutionTimeResults: Property.bool(false),\r\n _myLogMaxAmountOfFunctions: Property.int(-1),\r\n _myLogFunctionsWithCallsCountAbove: Property.int(0),\r\n _myLogFunctionsWithTotalExecutionTimePercentageAbove: Property.float(-1),\r\n _myFunctionPathsToInclude: Property.string(\"\"),\r\n _myFunctionPathsToExclude: Property.string(\"\"),\r\n _myExcludeConstructors: Property.bool(false),\r\n _myClearConsoleBeforeLog: Property.bool(false),\r\n _myResetMaxResultsShortcutEnabled: Property.bool(false)\r\n };\r\n\r\n init() {\r\n this.object.pp_addComponent(DebugFunctionsPerformanceAnalyzerComponent, {\r\n _myObjectsByPath: \"PP\",\r\n _myDelayStart: this._myDelayStart,\r\n _myLogTitle: \"PP Functions Performance Analysis Results\",\r\n _myLogFunction: this._myLogFunction,\r\n _mySecondsBetweenLogs: this._mySecondsBetweenLogs,\r\n _myLogMaxResults: this._myLogMaxResults,\r\n _myLogSortOrder: this._myLogSortOrder,\r\n _myLogMaxAmountOfFunctions: this._myLogMaxAmountOfFunctions,\r\n _myLogFunctionsWithCallsCountAbove: this._myLogFunctionsWithCallsCountAbove,\r\n _myLogFunctionsWithTotalExecutionTimePercentageAbove: this._myLogFunctionsWithTotalExecutionTimePercentageAbove,\r\n _myLogCallsCountResults: this._myLogCallsCountResults,\r\n _myLogTotalExecutionTimeResults: this._myLogTotalExecutionTimeResults,\r\n _myLogTotalExecutionTimePercentageResults: this._myLogTotalExecutionTimePercentageResults,\r\n _myLogAverageExecutionTimeResults: this._myLogAverageExecutionTimeResults,\r\n _myFunctionPathsToInclude: this._myFunctionPathsToInclude,\r\n _myFunctionPathsToExclude: this._myFunctionPathsToExclude,\r\n _myExcludeConstructors: this._myExcludeConstructors,\r\n _myExcludeJSObjectFunctions: true,\r\n _myAddPathPrefixToFunctionID: true,\r\n _myObjectAddObjectDescendantsDepthLevel: 1,\r\n _myObjectAddClassDescendantsDepthLevel: 1,\r\n _myClearConsoleBeforeLog: this._myClearConsoleBeforeLog,\r\n _myResetMaxResultsShortcutEnabled: this._myResetMaxResultsShortcutEnabled\r\n });\r\n }\r\n}", "\r\nimport { Component, Property } from \"@wonderlandengine/api\";\r\nimport { DebugFunctionsPerformanceAnalyzerComponent } from \"./debug_functions_performance_analyzer_component.js\";\r\n\r\nexport class DebugArrayFunctionsPerformanceAnalyzerComponent extends Component {\r\n static TypeName = \"pp-debug-array-functions-performance-analyzer\";\r\n static Properties = {\r\n _myIncludeOnlyMainArrayTypes: Property.bool(true),\r\n _myIncludeOnlyArrayExtensionFunctions: Property.bool(false),\r\n _myDelayStart: Property.float(0.0),\r\n _myLogFunction: Property.enum([\"Log\", \"Error\", \"Warn\", \"Debug\"], \"Error\"),\r\n _mySecondsBetweenLogs: Property.float(1.0),\r\n _myLogMaxResults: Property.bool(false),\r\n _myLogSortOrder: Property.enum([\"None\", \"Calls Count\", \"Total Execution Time\", \"Average Execution Time\"], \"Calls Count\"),\r\n _myLogCallsCountResults: Property.bool(true),\r\n _myLogTotalExecutionTimeResults: Property.bool(false),\r\n _myLogTotalExecutionTimePercentageResults: Property.bool(false),\r\n _myLogAverageExecutionTimeResults: Property.bool(false),\r\n _myLogMaxAmountOfFunctions: Property.int(-1),\r\n _myLogFunctionsWithCallsCountAbove: Property.int(0),\r\n _myLogFunctionsWithTotalExecutionTimePercentageAbove: Property.float(-1),\r\n _myFunctionPathsToInclude: Property.string(\"\"),\r\n _myFunctionPathsToExclude: Property.string(\"\"),\r\n _myExcludeConstructors: Property.bool(false),\r\n _myClearConsoleBeforeLog: Property.bool(false),\r\n _myResetMaxResultsShortcutEnabled: Property.bool(false)\r\n };\r\n\r\n init() {\r\n let classesByPath = \"Array, Uint8ClampedArray, Uint8Array, Uint16Array, Uint32Array, Int8Array, Int16Array, Int32Array, Float32Array, Float64Array\";\r\n if (this._myIncludeOnlyMainArrayTypes) {\r\n classesByPath = \"Array, Uint8Array, Uint16Array, Float32Array\";\r\n }\r\n\r\n this.object.pp_addComponent(DebugFunctionsPerformanceAnalyzerComponent, {\r\n _myClassesByPath: classesByPath,\r\n _myDelayStart: this._myDelayStart,\r\n _myLogTitle: \"Array Functions Performance Analysis Results\",\r\n _myLogFunction: this._myLogFunction,\r\n _mySecondsBetweenLogs: this._mySecondsBetweenLogs,\r\n _myLogMaxResults: this._myLogMaxResults,\r\n _myLogSortOrder: this._myLogSortOrder,\r\n _myLogMaxAmountOfFunctions: this._myLogMaxAmountOfFunctions,\r\n _myLogFunctionsWithCallsCountAbove: this._myLogFunctionsWithCallsCountAbove,\r\n _myLogFunctionsWithTotalExecutionTimePercentageAbove: this._myLogFunctionsWithTotalExecutionTimePercentageAbove,\r\n _myLogCallsCountResults: this._myLogCallsCountResults,\r\n _myLogTotalExecutionTimeResults: this._myLogTotalExecutionTimeResults,\r\n _myLogTotalExecutionTimePercentageResults: this._myLogTotalExecutionTimePercentageResults,\r\n _myLogAverageExecutionTimeResults: this._myLogAverageExecutionTimeResults,\r\n _myFunctionPathsToInclude: this._myFunctionPathsToInclude + (this._myFunctionPathsToInclude.length > 0 && this._myIncludeOnlyArrayExtensionFunctions ? \", \" : \"\") + (this._myIncludeOnlyArrayExtensionFunctions ? \"pp_, vec_, vec2_, vec3_, vec4_, quat_, quat2_, mat3_, mat4_, _pp_, _vec_, _quat_\" : \"\"),\r\n _myFunctionPathsToExclude: this._myFunctionPathsToExclude,\r\n _myExcludeConstructors: this._myExcludeConstructors,\r\n _myExcludeJSObjectFunctions: true,\r\n _myAddPathPrefixToFunctionID: true,\r\n _myClearConsoleBeforeLog: this._myClearConsoleBeforeLog,\r\n _myResetMaxResultsShortcutEnabled: this._myResetMaxResultsShortcutEnabled\r\n });\r\n }\r\n}", "import { Component, Property } from \"@wonderlandengine/api\";\r\nimport { Mat3Utils } from \"../../../../cauldron/utils/array/mat3_utils.js\";\r\nimport { Mat4Utils } from \"../../../../cauldron/utils/array/mat4_utils.js\";\r\nimport { Quat2Utils } from \"../../../../cauldron/utils/array/quat2_utils.js\";\r\nimport { QuatUtils } from \"../../../../cauldron/utils/array/quat_utils.js\";\r\nimport { Vec2Utils } from \"../../../../cauldron/utils/array/vec2_utils.js\";\r\nimport { Vec3Utils } from \"../../../../cauldron/utils/array/vec3_utils.js\";\r\nimport { Vec4Utils } from \"../../../../cauldron/utils/array/vec4_utils.js\";\r\nimport { DebugFunctionsPerformanceAnalyzerComponent } from \"./debug_functions_performance_analyzer_component.js\";\r\n\r\nexport class DebugPPArrayCreationPerformanceAnalyzerComponent extends Component {\r\n static TypeName = \"pp-debug-pp-array-creation-performance-analyzer\";\r\n static Properties = {\r\n _myDelayStart: Property.float(0.0),\r\n _myLogFunction: Property.enum([\"Log\", \"Error\", \"Warn\", \"Debug\"], \"Error\"),\r\n _mySecondsBetweenLogs: Property.float(1.0),\r\n _myLogMaxResults: Property.bool(false),\r\n _myLogSortOrder: Property.enum([\"None\", \"Calls Count\", \"Total Execution Time\", \"Average Execution Time\"], \"Calls Count\"),\r\n _myLogCallsCountResults: Property.bool(true),\r\n _myLogTotalExecutionTimeResults: Property.bool(false),\r\n _myLogTotalExecutionTimePercentageResults: Property.bool(false),\r\n _myLogAverageExecutionTimeResults: Property.bool(false),\r\n _myLogMaxAmountOfFunctions: Property.int(-1),\r\n _myLogFunctionsWithCallsCountAbove: Property.int(0),\r\n _myLogFunctionsWithTotalExecutionTimePercentageAbove: Property.float(-1),\r\n _myClearConsoleBeforeLog: Property.bool(false),\r\n _myResetMaxResultsShortcutEnabled: Property.bool(false)\r\n };\r\n\r\n init() {\r\n this.object.pp_addComponent(DebugFunctionsPerformanceAnalyzerComponent, {\r\n _myObjectsByReference: [\r\n [Vec2Utils, \"Vec2Utils\"],\r\n [Vec3Utils, \"Vec3Utils\"],\r\n [Vec4Utils, \"Vec4Utils\"],\r\n [QuatUtils, \"QuatUtils\"],\r\n [Quat2Utils, \"Quat2Utils\"],\r\n [Mat3Utils, \"Mat3Utils\"],\r\n [Mat4Utils, \"Mat4Utils\"]\r\n ],\r\n _myDelayStart: this._myDelayStart,\r\n _myLogTitle: \"PP Array Creation Performance Analysis Results\",\r\n _myLogFunction: this._myLogFunction,\r\n _mySecondsBetweenLogs: this._mySecondsBetweenLogs,\r\n _myLogMaxResults: this._myLogMaxResults,\r\n _myLogSortOrder: this._myLogSortOrder,\r\n _myLogMaxAmountOfFunctions: this._myLogMaxAmountOfFunctions,\r\n _myLogFunctionsWithCallsCountAbove: this._myLogFunctionsWithCallsCountAbove,\r\n _myLogFunctionsWithTotalExecutionTimePercentageAbove: this._myLogFunctionsWithTotalExecutionTimePercentageAbove,\r\n _myLogCallsCountResults: this._myLogCallsCountResults,\r\n _myLogTotalExecutionTimeResults: this._myLogTotalExecutionTimeResults,\r\n _myLogTotalExecutionTimePercentageResults: this._myLogTotalExecutionTimePercentageResults,\r\n _myLogAverageExecutionTimeResults: this._myLogAverageExecutionTimeResults,\r\n _myFunctionPathsToInclude: \"create\",\r\n _myExcludeConstructors: true,\r\n _myExcludeJSObjectFunctions: true,\r\n _myAddPathPrefixToFunctionID: true,\r\n _myClearConsoleBeforeLog: this._myClearConsoleBeforeLog,\r\n _myResetMaxResultsShortcutEnabled: this._myResetMaxResultsShortcutEnabled\r\n });\r\n }\r\n}", "import { Component, Property } from \"@wonderlandengine/api\";\r\nimport { DebugFunctionsPerformanceAnalyzerComponent } from \"./debug_functions_performance_analyzer_component.js\";\r\n\r\nexport class DebugWLFunctionsPerformanceAnalyzerComponent extends Component {\r\n static TypeName = \"pp-debug-wl-functions-performance-analyzer\";\r\n static Properties = {\r\n _myDelayStart: Property.float(0.0),\r\n _myLogFunction: Property.enum([\"Log\", \"Error\", \"Warn\", \"Debug\"], \"Error\"),\r\n _mySecondsBetweenLogs: Property.float(1.0),\r\n _myLogMaxResults: Property.bool(false),\r\n _myLogSortOrder: Property.enum([\"None\", \"Calls Count\", \"Total Execution Time\", \"Average Execution Time\"], \"Calls Count\"),\r\n _myLogCallsCountResults: Property.bool(true),\r\n _myLogTotalExecutionTimeResults: Property.bool(false),\r\n _myLogTotalExecutionTimePercentageResults: Property.bool(false),\r\n _myLogAverageExecutionTimeResults: Property.bool(false),\r\n _myLogMaxAmountOfFunctions: Property.int(-1),\r\n _myLogFunctionsWithCallsCountAbove: Property.int(0),\r\n _myLogFunctionsWithTotalExecutionTimePercentageAbove: Property.float(-1),\r\n _myFunctionPathsToInclude: Property.string(\"\"),\r\n _myFunctionPathsToExclude: Property.string(\"\"),\r\n _myExcludeConstructors: Property.bool(false),\r\n _myClearConsoleBeforeLog: Property.bool(false),\r\n _myResetMaxResultsShortcutEnabled: Property.bool(false)\r\n };\r\n\r\n init() {\r\n this.object.pp_addComponent(DebugFunctionsPerformanceAnalyzerComponent, {\r\n _myObjectsByPath: \"WL\",\r\n _myDelayStart: this._myDelayStart,\r\n _myLogTitle: \"WL Functions Performance Analysis Results\",\r\n _myLogFunction: this._myLogFunction,\r\n _mySecondsBetweenLogs: this._mySecondsBetweenLogs,\r\n _myLogMaxResults: this._myLogMaxResults,\r\n _myLogSortOrder: this._myLogSortOrder,\r\n _myLogMaxAmountOfFunctions: this._myLogMaxAmountOfFunctions,\r\n _myLogFunctionsWithCallsCountAbove: this._myLogFunctionsWithCallsCountAbove,\r\n _myLogFunctionsWithTotalExecutionTimePercentageAbove: this._myLogFunctionsWithTotalExecutionTimePercentageAbove,\r\n _myLogCallsCountResults: this._myLogCallsCountResults,\r\n _myLogTotalExecutionTimeResults: this._myLogTotalExecutionTimeResults,\r\n _myLogTotalExecutionTimePercentageResults: this._myLogTotalExecutionTimePercentageResults,\r\n _myLogAverageExecutionTimeResults: this._myLogAverageExecutionTimeResults,\r\n _myFunctionPathsToInclude: this._myFunctionPathsToInclude,\r\n _myFunctionPathsToExclude: this._myFunctionPathsToExclude,\r\n _myExcludeConstructors: this._myExcludeConstructors,\r\n _myExcludeJSObjectFunctions: true,\r\n _myAddPathPrefixToFunctionID: true,\r\n _myObjectAddObjectDescendantsDepthLevel: 1,\r\n _myObjectAddClassDescendantsDepthLevel: 1,\r\n _myClearConsoleBeforeLog: this._myClearConsoleBeforeLog,\r\n _myResetMaxResultsShortcutEnabled: this._myResetMaxResultsShortcutEnabled\r\n });\r\n }\r\n}", "import { AnimationComponent, CollisionComponent, Component, InputComponent, LightComponent, MeshComponent, PhysXComponent, Property, TextComponent, ViewComponent } from \"@wonderlandengine/api\";\r\nimport { Timer } from \"../../../../cauldron/cauldron/timer.js\";\r\nimport { ComponentUtils } from \"../../../../cauldron/wl/utils/component_utils.js\";\r\nimport { DebugFunctionsPerformanceAnalyzerComponent } from \"./debug_functions_performance_analyzer_component.js\";\r\n\r\nexport class DebugWLComponentsFunctionsPerformanceAnalyzerComponent extends Component {\r\n static TypeName = \"pp-debug-wl-components-functions-performance-analyzer\";\r\n static Properties = {\r\n _myAnalyzeComponentTypes: Property.bool(true),\r\n _myAnalyzeComponentInstances: Property.bool(false),\r\n _myComponentInstanceID: Property.enum([\"Object ID\", \"Object Name\", \"Object ID - Object Name\"], \"Object ID - Object Name\"),\r\n _myDelayStart: Property.float(0.0),\r\n _myLogFunction: Property.enum([\"Log\", \"Error\", \"Warn\", \"Debug\"], \"Error\"),\r\n _mySecondsBetweenLogs: Property.float(1.0),\r\n _myLogMaxResults: Property.bool(false),\r\n _myLogSortOrder: Property.enum([\"None\", \"Calls Count\", \"Total Execution Time\", \"Average Execution Time\"], \"Calls Count\"),\r\n _myLogCallsCountResults: Property.bool(true),\r\n _myLogTotalExecutionTimeResults: Property.bool(false),\r\n _myLogTotalExecutionTimePercentageResults: Property.bool(false),\r\n _myLogAverageExecutionTimeResults: Property.bool(false),\r\n _myLogMaxAmountOfFunctions: Property.int(-1),\r\n _myLogFunctionsWithCallsCountAbove: Property.int(0),\r\n _myLogFunctionsWithTotalExecutionTimePercentageAbove: Property.float(-1),\r\n _myFunctionPathsToInclude: Property.string(\"\"),\r\n _myFunctionPathsToExclude: Property.string(\"\"),\r\n _myExcludeConstructors: Property.bool(false),\r\n _myClearConsoleBeforeLog: Property.bool(false),\r\n _myResetMaxResultsShortcutEnabled: Property.bool(false)\r\n };\r\n\r\n init() {\r\n this._myStartTimer = new Timer(this._myDelayStart);\r\n if (this._myDelayStart == 0) {\r\n this._myStartTimer.end();\r\n this._start();\r\n }\r\n }\r\n\r\n update(dt) {\r\n if (this._myStartTimer.isRunning()) {\r\n this._myStartTimer.update(dt);\r\n if (this._myStartTimer.isDone()) {\r\n this._start();\r\n }\r\n }\r\n }\r\n\r\n _start() {\r\n\r\n let objectsByReference = [];\r\n let classesByReference = [];\r\n\r\n if (this._myAnalyzeComponentInstances) {\r\n this._addComponentInstanceReferences(objectsByReference);\r\n }\r\n\r\n if (this._myAnalyzeComponentTypes) {\r\n this._addComponentTypeReferences(classesByReference);\r\n }\r\n\r\n this._myAnalyzerComponent = this.object.pp_addComponent(DebugFunctionsPerformanceAnalyzerComponent, {\r\n _myObjectsByReference: objectsByReference,\r\n _myClassesByReference: classesByReference,\r\n _myDelayStart: 0,\r\n _myLogTitle: \"WL Components Performance Analysis Results\",\r\n _myLogFunction: this._myLogFunction,\r\n _mySecondsBetweenLogs: this._mySecondsBetweenLogs,\r\n _myLogMaxResults: this._myLogMaxResults,\r\n _myLogSortOrder: this._myLogSortOrder,\r\n _myLogMaxAmountOfFunctions: this._myLogMaxAmountOfFunctions,\r\n _myLogFunctionsWithCallsCountAbove: this._myLogFunctionsWithCallsCountAbove,\r\n _myLogFunctionsWithTotalExecutionTimePercentageAbove: this._myLogFunctionsWithTotalExecutionTimePercentageAbove,\r\n _myLogCallsCountResults: this._myLogCallsCountResults,\r\n _myLogTotalExecutionTimeResults: this._myLogTotalExecutionTimeResults,\r\n _myLogTotalExecutionTimePercentageResults: this._myLogTotalExecutionTimePercentageResults,\r\n _myLogAverageExecutionTimeResults: this._myLogAverageExecutionTimeResults,\r\n _myFunctionPathsToInclude: this._myFunctionPathsToInclude,\r\n _myFunctionPathsToExclude: this._myFunctionPathsToExclude,\r\n _myExcludeConstructors: this._myExcludeConstructors,\r\n _myExcludeJSObjectFunctions: true,\r\n _myAddPathPrefixToFunctionID: true,\r\n _myObjectAddClassDescendantsDepthLevel: 0,\r\n _myClearConsoleBeforeLog: this._myClearConsoleBeforeLog,\r\n _myResetMaxResultsShortcutEnabled: this._myResetMaxResultsShortcutEnabled\r\n });\r\n }\r\n\r\n _addComponentTypeReferences(classesByReference) {\r\n let nativeComponentClasses = [\r\n AnimationComponent,\r\n CollisionComponent,\r\n InputComponent,\r\n LightComponent,\r\n MeshComponent,\r\n PhysXComponent,\r\n TextComponent,\r\n ViewComponent\r\n ];\r\n\r\n for (let nativeComponentClass of nativeComponentClasses) {\r\n classesByReference.push([nativeComponentClass.prototype, \"{\\\"\" + nativeComponentClass.TypeName + \"\\\"}\"]);\r\n }\r\n\r\n for (let componentClass of ComponentUtils.getJavascriptComponentClassesByIndex(this.engine)) {\r\n classesByReference.push([componentClass.prototype, \"{\\\"\" + componentClass.TypeName + \"\\\"}\"]);\r\n }\r\n }\r\n\r\n _addComponentInstanceReferences(objectsByReference) {\r\n // #TODO add native components\r\n\r\n for (let componentInstance of ComponentUtils.getJavascriptComponentInstances(false, this.engine)) {\r\n let id = \"\";\r\n\r\n switch (this._myComponentInstanceID) {\r\n case 0:\r\n id = componentInstance.object.pp_getID();\r\n break;\r\n case 1:\r\n id = componentInstance.object.pp_getName();\r\n break;\r\n case 2:\r\n id = componentInstance.object.pp_getID();\r\n if (componentInstance.object.pp_getName().length > 0) {\r\n id = id + \" - \" + componentInstance.object.pp_getName();\r\n }\r\n break;\r\n }\r\n\r\n objectsByReference.push([componentInstance,\r\n \"{\\\"\" + componentInstance.type + \"\\\"}[\" + id + \"]\"]);\r\n }\r\n }\r\n}", "import { quat_create, vec3_create } from \"../../../plugin/js/extensions/array/vec_create_extension.js\";\r\n\r\nexport class Direction2DTo3DConverterParams {\r\n\r\n constructor() {\r\n this.myStartFlyingForward = false;\r\n this.myStartFlyingRight = false;\r\n\r\n this.myAutoUpdateFlyForward = false;\r\n this.myAutoUpdateFlyRight = false;\r\n\r\n this.myResetFlyForwardWhenZero = false;\r\n this.myResetFlyRightWhenZero = false;\r\n\r\n this.myMinAngleToFlyForwardUp = 90;\r\n this.myMinAngleToFlyForwardDown = 90;\r\n this.myMinAngleToFlyRightUp = 90;\r\n this.myMinAngleToFlyRightDown = 90;\r\n\r\n // Settings when flying is not active, used to adjust the directions and flat them\r\n this.myAdjustForwardWhenCloseToUp = true;\r\n this.myAdjustRightWhenCloseToUp = true;\r\n this.myAdjustForwardWhenCloseToUpAngleThreshold = 10;\r\n this.myAdjustRightWhenCloseToUpAngleThreshold = 10;\r\n\r\n this.myInvertForwardWhenUpsideDown = false;\r\n this.myInvertRightWhenUpsideDown = false;\r\n\r\n this.myAdjustLastValidFlatForwardOverConversionReferenceRotation = true;\r\n this.myAdjustLastValidFlatRightOverConversionReferenceRotation = true;\r\n }\r\n}\r\n\r\nexport class Direction2DTo3DConverter {\r\n\r\n constructor(params = new Direction2DTo3DConverterParams()) {\r\n this._myParams = params;\r\n\r\n this._myFlyingForward = this._myParams.myStartFlyingForward;\r\n this._myFlyingRight = this._myParams.myStartFlyingRight;\r\n\r\n this._myLastConvertRotationQuat = quat_create();\r\n this._myLastConvertRotationQuatValid = false;\r\n\r\n this._myLastValidFlatForward = vec3_create();\r\n this._myLastValidFlatRight = vec3_create();\r\n }\r\n\r\n // @direction3DUp can be used to flat the direction if the @conversionTransform is not aligned with it\r\n // It's also needed to specify the fly axis, if different from the @conversionTransform up\r\n // If @direction3DUp is null, @conversionTransform up is used\r\n convert(direction2D, conversionTransform, direction3DUp = null, outDirection3D = vec3_create()) {\r\n return this.convertTransform(direction2D, conversionTransform, direction3DUp, outDirection3D);\r\n }\r\n\r\n isFlying() {\r\n return this._myFlyingForward || this._myFlyingRight;\r\n }\r\n\r\n isFlyingForward() {\r\n return this._myFlyingForward;\r\n }\r\n\r\n isFlyingRight() {\r\n return this._myFlyingRight;\r\n }\r\n\r\n startFlying() {\r\n this._myFlyingForward = true;\r\n this._myFlyingRight = true;\r\n }\r\n\r\n startFlyingForward() {\r\n this._myFlyingForward = true;\r\n }\r\n\r\n startFlyingRight() {\r\n this._myFlyingRight = true;\r\n }\r\n\r\n stopFlying() {\r\n this._myFlyingForward = false;\r\n this._myFlyingRight = false;\r\n }\r\n\r\n stopFlyingForward() {\r\n this._myFlyingForward = false;\r\n }\r\n\r\n stopFlyingRight() {\r\n this._myFlyingRight = false;\r\n }\r\n\r\n resetFly() {\r\n this.resetFlyForward();\r\n this.resetFlyRight();\r\n }\r\n\r\n resetFlyForward() {\r\n if (this._myParams.myStartFlyingForward) {\r\n this.startFlyingForward();\r\n } else {\r\n this.stopFlyingForward();\r\n }\r\n }\r\n\r\n resetFlyRight() {\r\n if (this._myParams.myStartFlyingRight) {\r\n this.startFlyingRight();\r\n } else {\r\n this.stopFlyingRight();\r\n }\r\n }\r\n\r\n resetLastValidFlatDirections() {\r\n this._myLastValidFlatForward.vec3_zero();\r\n this._myLastValidFlatRight.vec3_zero();\r\n }\r\n\r\n resetLastValidFlatForward() {\r\n this._myLastValidFlatForward.vec3_zero();\r\n }\r\n\r\n resetLastValidFlatRight() {\r\n this._myLastValidFlatRight.vec3_zero();\r\n }\r\n\r\n resetLastConvertTransform() {\r\n this._myLastConvertRotationQuatValid = false;\r\n this._myLastConvertRotationQuat.quat_identity();\r\n }\r\n\r\n // Convert Alternatives\r\n\r\n // If @direction3DUp is null, vec3_create(0, 1, 0) is used\r\n // Does not work properly if @conversionForward is aligned with @direction3DUp\r\n convertForward(direction2D, conversionForward, direction3DUp = null, outDirection3D = vec3_create()) {\r\n // Implemented outside class definition\r\n }\r\n\r\n // @direction3DUp can be used to flat the direction if the @conversionTransform is not aligned with it\r\n // It's also needed to specify the fly axis, if different from the @conversionTransform up\r\n // If @direction3DUp is null, conversionTransform up is used\r\n convertTransform(direction2D, conversionTransform, direction3DUp = null, outDirection3D = vec3_create()) {\r\n return this.convertTransformMatrix(direction2D, conversionTransform, direction3DUp, outDirection3D);\r\n }\r\n\r\n convertTransformMatrix(direction2D, conversionTransformMatrix, direction3DUp = null, outDirection3D = vec3_create()) {\r\n // Implemented outside class definition\r\n }\r\n\r\n convertTransformQuat(direction2D, conversionTransformQuat, direction3DUp = null, outDirection3D = vec3_create()) {\r\n // Implemented outside class definition\r\n }\r\n\r\n convertRotationQuat(direction2D, conversionRotationQuat, direction3DUp = null, outDirection3D = vec3_create()) {\r\n // Implemented outside class definition\r\n }\r\n}\r\n\r\nDirection2DTo3DConverter.prototype.convertForward = function () {\r\n let rotationQuat = quat_create();\r\n return function convertForward(direction2D, conversionForward, direction3DUp = null, outDirection3D = vec3_create()) {\r\n rotationQuat.quat_identity();\r\n rotationQuat.quat_setForward(conversionForward, direction3DUp);\r\n return this.convertRotationQuat(direction2D, rotationQuat, direction3DUp, outDirection3D);\r\n };\r\n}();\r\n\r\nDirection2DTo3DConverter.prototype.convertTransformMatrix = function () {\r\n let rotationQuat = quat_create();\r\n return function convertTransformMatrix(direction2D, conversionTransformMatrix, direction3DUp = null, outDirection3D = vec3_create()) {\r\n rotationQuat = conversionTransformMatrix.mat4_getRotationQuat(rotationQuat);\r\n return this.convertRotationQuat(direction2D, rotationQuat, direction3DUp, outDirection3D);\r\n };\r\n}();\r\n\r\nDirection2DTo3DConverter.prototype.convertTransformQuat = function () {\r\n let rotationQuat = quat_create();\r\n return function convertTransformQuat(direction2D, conversionTransformQuat, direction3DUp = null, outDirection3D = vec3_create()) {\r\n rotationQuat = conversionTransformQuat.quat2_getRotationQuat(rotationQuat);\r\n return this.convertRotationQuat(direction2D, rotationQuat, direction3DUp, outDirection3D);\r\n };\r\n}();\r\n\r\nDirection2DTo3DConverter.prototype.convertRotationQuat = function () {\r\n let forward = vec3_create();\r\n let right = vec3_create();\r\n let up = vec3_create();\r\n let direction3DUpNegate = vec3_create();\r\n let forwardScaled = vec3_create();\r\n let rightScaled = vec3_create();\r\n let rotationToNewConvertPivoted = quat_create();\r\n return function convertRotationQuat(direction2D, conversionRotationQuat, direction3DUp = null, outDirection3D = vec3_create()) {\r\n outDirection3D.vec3_zero();\r\n\r\n if (this._myParams.myAdjustLastValidFlatForwardOverConversionReferenceRotation || this._myParams.myAdjustLastValidFlatRightOverConversionReferenceRotation) {\r\n if (direction3DUp != null) {\r\n if (this._myLastConvertRotationQuatValid) {\r\n rotationToNewConvertPivoted = this._myLastConvertRotationQuat.quat_rotationToQuat(conversionRotationQuat, rotationToNewConvertPivoted).\r\n quat_rotationAroundAxisQuat(direction3DUp, rotationToNewConvertPivoted);\r\n if (Math.pp_angleClamp(rotationToNewConvertPivoted.quat_getAngle(), true) > Math.PP_EPSILON_DEGREES) {\r\n if (this._myParams.myAdjustLastValidFlatForwardOverConversionReferenceRotation) {\r\n this._myLastValidFlatForward.vec3_rotateQuat(rotationToNewConvertPivoted, this._myLastValidFlatForward);\r\n }\r\n\r\n if (this._myParams.myAdjustLastValidFlatRightOverConversionReferenceRotation) {\r\n this._myLastValidFlatRight.vec3_rotateQuat(rotationToNewConvertPivoted, this._myLastValidFlatRight);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (direction2D.vec2_isZero()) {\r\n let resetFlyForward = this._myParams.myAutoUpdateFlyForward && this._myParams.myResetFlyForwardWhenZero;\r\n if (resetFlyForward) {\r\n this.resetFlyForward();\r\n }\r\n\r\n let resetFlyRight = this._myParams.myAutoUpdateFlyRight && this._myParams.myResetFlyRightWhenZero;\r\n if (resetFlyRight) {\r\n this.resetFlyRight();\r\n }\r\n } else {\r\n\r\n forward = conversionRotationQuat.quat_getForward(forward);\r\n right = conversionRotationQuat.quat_getRight(right);\r\n up = conversionRotationQuat.quat_getUp(up);\r\n\r\n if (direction3DUp != null) {\r\n let upsideDown = !direction3DUp.vec3_isConcordant(up);\r\n\r\n direction3DUpNegate = direction3DUp.vec3_negate(direction3DUpNegate);\r\n\r\n // Check if it is flying based on the convert transform orientation \r\n if (this._myParams.myAutoUpdateFlyForward) {\r\n let angleForwardWithDirectionUp = forward.vec3_angle(direction3DUp);\r\n this._myFlyingForward = this._myFlyingForward ||\r\n (angleForwardWithDirectionUp < 90 - this._myParams.myMinAngleToFlyForwardUp || angleForwardWithDirectionUp > 90 + this._myParams.myMinAngleToFlyForwardDown);\r\n }\r\n\r\n if (this._myParams.myAutoUpdateFlyRight) {\r\n let angleRightWithDirectionUp = right.vec3_angle(direction3DUp);\r\n this._myFlyingRight = this._myFlyingRight ||\r\n (angleRightWithDirectionUp < 90 - this._myParams.myMinAngleToFlyRightUp || angleRightWithDirectionUp > 90 + this._myParams.myMinAngleToFlyRightDown);\r\n }\r\n\r\n // Remove the component to prevent flying, if needed\r\n if (!this._myFlyingForward) {\r\n // If the forward is too similar to the up (or down) take the last valid forward\r\n if (this._myParams.myAdjustForwardWhenCloseToUp && !this._myLastValidFlatForward.vec3_isZero(Math.PP_EPSILON) &&\r\n (forward.vec3_angle(direction3DUp) < this._myParams.myAdjustForwardWhenCloseToUpAngleThreshold ||\r\n forward.vec3_angle(direction3DUpNegate) < this._myParams.myAdjustForwardWhenCloseToUpAngleThreshold)) {\r\n forward.pp_copy(this._myLastValidFlatForward);\r\n } else if (upsideDown && this._myParams.myInvertForwardWhenUpsideDown) {\r\n forward.vec3_negate(forward);\r\n }\r\n\r\n forward = forward.vec3_removeComponentAlongAxis(direction3DUp, forward);\r\n forward.vec3_normalize(forward);\r\n\r\n\r\n if (forward.vec3_isZero(Math.PP_EPSILON)) {\r\n if (!this._myLastValidFlatForward.vec3_isZero(Math.PP_EPSILON)) {\r\n forward.pp_copy(this._myLastValidFlatForward);\r\n } else {\r\n forward.vec3_set(0, 0, 1);\r\n }\r\n }\r\n }\r\n\r\n if (!this._myFlyingRight) {\r\n // If the right is too similar to the up (or down) take the last valid right\r\n if (this._myParams.myAdjustRightWhenCloseToUp && !this._myLastValidFlatRight.vec3_isZero(Math.PP_EPSILON) &&\r\n (right.vec3_angle(direction3DUp) < this._myParams.myAdjustRightWhenCloseToUpAngleThreshold ||\r\n right.vec3_angle(direction3DUpNegate) < this._myParams.myAdjustRightWhenCloseToUpAngleThreshold)) {\r\n right.pp_copy(this._myLastValidFlatRight);\r\n } else if (upsideDown && this._myParams.myInvertRightWhenUpsideDown) {\r\n right.vec3_negate(right);\r\n }\r\n\r\n right = right.vec3_removeComponentAlongAxis(direction3DUp, right);\r\n right.vec3_normalize(right);\r\n\r\n if (right.vec3_isZero(Math.PP_EPSILON)) {\r\n if (!this._myLastValidFlatRight.vec3_isZero(Math.PP_EPSILON)) {\r\n right.pp_copy(this._myLastValidFlatRight);\r\n } else {\r\n right.vec3_set(-1, 0, 0);\r\n }\r\n }\r\n }\r\n\r\n // Update last valid\r\n if ((forward.vec3_angle(direction3DUp) >= this._myParams.myAdjustForwardWhenCloseToUpAngleThreshold && forward.vec3_angle(direction3DUpNegate) >= this._myParams.myAdjustForwardWhenCloseToUpAngleThreshold) ||\r\n (direction2D[1] != 0 && this._myLastValidFlatForward.vec3_isZero(Math.PP_EPSILON))) {\r\n this._myLastValidFlatForward = forward.vec3_removeComponentAlongAxis(direction3DUp, this._myLastValidFlatForward);\r\n this._myLastValidFlatForward.vec3_normalize(this._myLastValidFlatForward);\r\n }\r\n\r\n if ((right.vec3_angle(direction3DUp) >= this._myParams.myAdjustRightWhenCloseToUpAngleThreshold && right.vec3_angle(direction3DUpNegate) >= this._myParams.myAdjustRightWhenCloseToUpAngleThreshold) ||\r\n (direction2D[0] != 0 && this._myLastValidFlatRight.vec3_isZero(Math.PP_EPSILON))) {\r\n this._myLastValidFlatRight = right.vec3_removeComponentAlongAxis(direction3DUp, this._myLastValidFlatRight);\r\n this._myLastValidFlatRight.vec3_normalize(this._myLastValidFlatRight);\r\n }\r\n }\r\n\r\n // Compute direction 3D\r\n outDirection3D = right.vec3_scale(direction2D[0], rightScaled).vec3_add(forward.vec3_scale(direction2D[1], forwardScaled), outDirection3D);\r\n\r\n if (direction3DUp != null && !this._myFlyingForward && !this._myFlyingRight) {\r\n outDirection3D = outDirection3D.vec3_removeComponentAlongAxis(direction3DUp, outDirection3D);\r\n }\r\n\r\n outDirection3D.vec3_normalize(outDirection3D);\r\n }\r\n\r\n this._myLastConvertRotationQuat.quat_copy(conversionRotationQuat);\r\n this._myLastConvertRotationQuatValid = true;\r\n\r\n return outDirection3D;\r\n };\r\n}();", "import { EasingFunction } from \"../../../cauldron/utils/math_utils.js\";\r\n\r\n/** You can just put `fromValue` if u want a value that doesn't actually change -> `new NumberOverFactor(0)` */\r\nexport class NumberOverFactor {\r\n\r\n private readonly _myFromValue: number;\r\n private readonly _myToValue: number;\r\n\r\n private readonly _myFromFactor: number;\r\n private readonly _myToFactor: number;\r\n\r\n private readonly _myEasingFunction: EasingFunction;\r\n\r\n /** `Math.round` / `Math.floor` / `Math.ceil` can be used */\r\n private readonly _myRoundingFunction: ((valueToRound: number, fromValue: number, toValue: number) => number) | null;\r\n\r\n constructor(fromValue: number, toValue: number = fromValue, fromFactor: number = 0, toFactor: number = 0, easingFunction: EasingFunction = EasingFunction.linear, roundingFunction: ((valueToRound: number, fromValue: number, toValue: number) => number) | null = null) {\r\n this._myFromValue = fromValue;\r\n this._myToValue = toValue;\r\n\r\n this._myFromFactor = fromFactor;\r\n this._myToFactor = toFactor;\r\n\r\n this._myEasingFunction = easingFunction;\r\n\r\n this._myRoundingFunction = roundingFunction;\r\n }\r\n\r\n public get(factor: number): number {\r\n const interpolationFactor = this._myEasingFunction(Math.pp_mapToRange(factor, this._myFromFactor, this._myToFactor, 0, 1));\r\n let currentValue = Math.pp_lerp(this._myFromValue, this._myToValue, interpolationFactor);\r\n\r\n if (this._myRoundingFunction != null) {\r\n currentValue = this._myRoundingFunction(currentValue, this._myFromValue, this._myToValue);\r\n }\r\n\r\n return currentValue;\r\n }\r\n\r\n public getAverage(factor: number): number {\r\n return this.get(factor);\r\n }\r\n\r\n public getRange(factor: number): [number, number] {\r\n const currentValue = this.get(factor);\r\n return [currentValue, currentValue];\r\n }\r\n\r\n public getMax(factor: number): number {\r\n return this.get(factor);\r\n }\r\n\r\n public getMin(factor: number): number {\r\n return this.get(factor);\r\n }\r\n\r\n public isInside(value: number, factor: number): boolean {\r\n const currentValue = this.get(factor);\r\n\r\n return currentValue == value;\r\n }\r\n\r\n public isInsideAngleRange(value: number, factor: number): boolean {\r\n return this.isInsideAngleRangeDegrees(value, factor);\r\n }\r\n\r\n public isInsideAngleRangeDegrees(value: number, factor: number): boolean {\r\n const currentValue = this.get(factor);\r\n\r\n const clampedValue = Math.pp_angleClampDegrees(value);\r\n const clampedCurrentValue = Math.pp_angleClampDegrees(currentValue);\r\n\r\n return clampedValue == clampedCurrentValue;\r\n }\r\n\r\n public isInsideAngleRangeRadians(value: number, factor: number): boolean {\r\n const currentValue = this.get(factor);\r\n\r\n const clampedValue = Math.pp_angleClampRadians(value);\r\n const clampedCurrentValue = Math.pp_angleClampRadians(currentValue);\r\n\r\n return clampedValue == clampedCurrentValue;\r\n }\r\n}\r\n\r\nexport class IntOverFactor extends NumberOverFactor {\r\n\r\n constructor(fromValue: number, toValue: number = fromValue, fromFactor: number = 0, toFactor: number = 0, easingFunction: EasingFunction = EasingFunction.linear, roundingFunction: ((valueToRound: number, fromValue: number, toValue: number) => number) | null = null) {\r\n if (roundingFunction == null) {\r\n roundingFunction = function (valueToRound: number, fromValue: number, toValue: number): number {\r\n let roundedValue = null;\r\n\r\n const useFloor = fromValue <= toValue;\r\n if (useFloor) {\r\n roundedValue = Math.floor(valueToRound);\r\n } else {\r\n roundedValue = Math.ceil(valueToRound);\r\n }\r\n\r\n return roundedValue;\r\n };\r\n }\r\n\r\n super(fromValue, toValue, fromFactor, toFactor, easingFunction, roundingFunction);\r\n }\r\n}\r\n\r\n/** You can just put `fromRange` if u want a range that doesn't actually change -> `new NumberOverFactor([1, 25])` */\r\nexport class NumberRangeOverFactor {\r\n\r\n private readonly _myRangeStartOverFactor: NumberOverFactor;\r\n private readonly _myRangeEndOverFactor: NumberOverFactor;\r\n\r\n private readonly _myRoundingFunction: ((valueToRound: number, fromValue: number, toValue: number) => number) | null; // Math.round/floor/ceil can be used\r\n\r\n constructor(fromRange: Readonly<[number, number]>, toRange: Readonly<[number, number]> = fromRange, fromFactor: number = 0, toFactor: number = 0, easingFunction = EasingFunction.linear, roundingFunction: ((valueToRound: number, fromValue: number, toValue: number) => number) | null = null) {\r\n\r\n this._myRangeStartOverFactor = new NumberOverFactor(fromRange[0], toRange[0], fromFactor, toFactor, easingFunction, roundingFunction);\r\n this._myRangeEndOverFactor = new NumberOverFactor(fromRange[1], toRange[1], fromFactor, toFactor, easingFunction, roundingFunction);\r\n\r\n this._myRoundingFunction = roundingFunction;\r\n }\r\n\r\n public get(factor: number): number {\r\n const rangeStart = this._myRangeStartOverFactor.get(factor);\r\n const rangeEnd = this._myRangeEndOverFactor.get(factor);\r\n\r\n let randomValue = null;\r\n\r\n if (this._myRoundingFunction) {\r\n randomValue = Math.pp_randomInt(rangeStart, rangeEnd);\r\n } else {\r\n randomValue = Math.pp_random(rangeStart, rangeEnd);\r\n }\r\n\r\n return randomValue;\r\n }\r\n\r\n public getAverage(factor: number): number {\r\n const rangeStart = this._myRangeStartOverFactor.get(factor);\r\n const rangeEnd = this._myRangeEndOverFactor.get(factor);\r\n\r\n let averageValue = (rangeStart + rangeEnd) / 2;\r\n if (this._myRoundingFunction) {\r\n averageValue = this._myRoundingFunction(averageValue, rangeStart, rangeEnd);\r\n }\r\n\r\n return averageValue;\r\n }\r\n\r\n public getRange(factor: number): [number, number] {\r\n const rangeStart = this._myRangeStartOverFactor.get(factor);\r\n const rangeEnd = this._myRangeEndOverFactor.get(factor);\r\n\r\n return [rangeStart, rangeEnd];\r\n }\r\n\r\n public getMax(factor: number): number {\r\n const rangeStart = this._myRangeStartOverFactor.get(factor);\r\n const rangeEnd = this._myRangeEndOverFactor.get(factor);\r\n\r\n return Math.max(rangeStart, rangeEnd);\r\n }\r\n\r\n public getMin(factor: number): number {\r\n const rangeStart = this._myRangeStartOverFactor.get(factor);\r\n const rangeEnd = this._myRangeEndOverFactor.get(factor);\r\n\r\n return Math.min(rangeStart, rangeEnd);\r\n }\r\n\r\n public isInside(value: number, factor: number): boolean {\r\n const rangeStart = this._myRangeStartOverFactor.get(factor);\r\n const rangeEnd = this._myRangeEndOverFactor.get(factor);\r\n\r\n const min = Math.min(rangeStart, rangeEnd);\r\n const max = Math.max(rangeStart, rangeEnd);\r\n\r\n return value >= min && value <= max;\r\n }\r\n\r\n public isInsideAngleRange(value: number, factor: number): boolean {\r\n return this.isInsideAngleRangeDegrees(value, factor);\r\n }\r\n\r\n public isInsideAngleRangeDegrees(value: number, factor: number): boolean {\r\n const rangeStart = this._myRangeStartOverFactor.get(factor);\r\n const rangeEnd = this._myRangeEndOverFactor.get(factor);\r\n\r\n return Math.pp_isInsideAngleRangeDegrees(value, rangeStart, rangeEnd);\r\n }\r\n\r\n public isInsideAngleRangeRadians(value: number, factor: number): boolean {\r\n const rangeStart = this._myRangeStartOverFactor.get(factor);\r\n const rangeEnd = this._myRangeEndOverFactor.get(factor);\r\n\r\n return Math.pp_isInsideAngleRangeRadians(value, rangeStart, rangeEnd);\r\n }\r\n}\r\n\r\nexport class IntRangeOverFactor extends NumberRangeOverFactor {\r\n\r\n constructor(fromRange: Readonly<[number, number]>, toRange: Readonly<[number, number]> = fromRange, fromFactor: number = 0, toFactor: number = 0, easingFunction = EasingFunction.linear, roundingFunction: ((valueToRound: number, fromValue: number, toValue: number) => number) | null = null) {\r\n if (roundingFunction == null) {\r\n roundingFunction = function (valueToRound: number, fromValue: number, toValue: number): number {\r\n let roundedValue = null;\r\n\r\n const useFloor = fromValue <= toValue;\r\n if (useFloor) {\r\n roundedValue = Math.floor(valueToRound);\r\n } else {\r\n roundedValue = Math.ceil(valueToRound);\r\n }\r\n\r\n return roundedValue;\r\n };\r\n }\r\n\r\n super(fromRange, toRange, fromFactor, toFactor, easingFunction, roundingFunction);\r\n }\r\n}", "import { Timer } from \"../../../cauldron/cauldron/timer.js\";\r\nimport { EasingFunction, MathUtils } from \"../../../cauldron/utils/math_utils.js\";\r\n\r\nexport class AnimatedNumberParams {\r\n public myInitialValue: number = 0;\r\n\r\n public myAnimationSeconds: number = 0;\r\n public myAnimationEasingFunction: EasingFunction = EasingFunction.easeInOut;\r\n\r\n /** \r\n * If this value is not `null` it will be used as reference for the `myAnimationSeconds` time, which \r\n * will then be considered as the time to reach `myReferenceTargetValue` from `myInitialValue`\r\n * \r\n * This means that when a new target value is specified, the time to reach it will automatically be computed \r\n * based on this value, while if this value is `null` it will always take the same time (specified with `myAnimationSeconds`) \r\n * no matter how far or close the target value is from the current value\r\n */\r\n public myReferenceTargetValue: number | null = null;\r\n\r\n /**\r\n * When setting a new target value, if the animated number still has to reach the old target, do not restart\r\n * the animation towards the new target from the start of the easing curve, but continue from the current point,\r\n * but take the new computed time as the time to reach the end of the easing curve.\r\n * This make it so the \"velocity\" of the number is kept even when the target changes.\r\n * \r\n * This settings is applid only if {@link myReferenceTargetValue} is specified\r\n */\r\n public myKeepAnimationEasingProgressOnTargetUpdate: boolean = true;\r\n\r\n /** `Math.round` / `Math.floor` / `Math.ceil` can be used */\r\n public myRoundingFunction: ((valueToRound: number) => number) | null = null;\r\n}\r\n\r\nexport class AnimatedNumber {\r\n private readonly _myParams: AnimatedNumberParams;\r\n\r\n private _myCurrentValue: number = 0;\r\n private _myStartValue: number = 0;\r\n private _myTargetValue: number = 0;\r\n\r\n private readonly _myAnimationTimer: Timer = new Timer(0, false);\r\n\r\n private readonly _myEasingFunction: (valueToEase: number) => number = this._easingFunction.bind(this);\r\n private _myEasingStartValueToUse: number = 0;\r\n private _myEasingNextStartValueToUse: number = 0;\r\n\r\n constructor(params: Readonly) {\r\n this._myParams = params;\r\n\r\n this._myCurrentValue = this._myParams.myInitialValue;\r\n this._myStartValue = this._myParams.myInitialValue;\r\n this._myTargetValue = this._myParams.myInitialValue;\r\n\r\n this._myAnimationTimer.reset(this._myParams.myAnimationSeconds);\r\n }\r\n\r\n public update(dt: number): void {\r\n if (this._myAnimationTimer.isRunning()) {\r\n this._myAnimationTimer.update(dt);\r\n\r\n const animationPercentage = this._myAnimationTimer.getPercentage();\r\n this._myCurrentValue = MathUtils.interpolate(this._myStartValue, this._myTargetValue!, animationPercentage, this._myEasingFunction);\r\n }\r\n }\r\n\r\n public getParams(): AnimatedNumberParams {\r\n return this._myParams;\r\n }\r\n\r\n public getCurrentValue(): number {\r\n return this._myCurrentValue;\r\n }\r\n\r\n public getStartValue(): number {\r\n return this._myStartValue;\r\n }\r\n\r\n public getTargetValue(): number {\r\n return this._myTargetValue;\r\n }\r\n\r\n public setTargetValue(targetValue: number, forceSet: boolean = false): void {\r\n if (this._myTargetValue == targetValue && !forceSet) return;\r\n\r\n this._myTargetValue = targetValue;\r\n\r\n if (this._myParams.myReferenceTargetValue == null) {\r\n this._myStartValue = this._myCurrentValue;\r\n\r\n this._myAnimationTimer.start(this._myParams.myAnimationSeconds);\r\n } else {\r\n const distanceFromInitialToReference = Math.abs(this._myParams.myReferenceTargetValue - this._myParams.myInitialValue);\r\n const distanceFromCurrentToTarget = Math.abs(this._myTargetValue - this._myCurrentValue);\r\n\r\n const secondsToReachTarget = (distanceFromCurrentToTarget / distanceFromInitialToReference) * this._myParams.myAnimationSeconds;\r\n\r\n this._myStartValue = this._myCurrentValue;\r\n\r\n if (this._myAnimationTimer.isRunning() && this._myParams.myKeepAnimationEasingProgressOnTargetUpdate) {\r\n this._myEasingStartValueToUse = this._myEasingNextStartValueToUse;\r\n } else {\r\n this._myEasingStartValueToUse = 0;\r\n }\r\n\r\n this._myAnimationTimer.start(secondsToReachTarget);\r\n }\r\n }\r\n\r\n public end(): void {\r\n this._myAnimationTimer.end();\r\n this._myCurrentValue = MathUtils.interpolate(this._myStartValue, this._myTargetValue!, 1, this._myEasingFunction);\r\n }\r\n\r\n public isDone(): boolean {\r\n return this._myAnimationTimer.isDone();\r\n }\r\n\r\n private _easingFunction(valueToEase: number): number {\r\n const adjustedValueToEase = MathUtils.mapToRange(valueToEase, 0, 1, this._myEasingStartValueToUse, 1);\r\n this._myEasingNextStartValueToUse = adjustedValueToEase;\r\n const easedValue = this._myParams.myAnimationEasingFunction(adjustedValueToEase);\r\n return MathUtils.mapToRange(easedValue, this._myParams.myAnimationEasingFunction(this._myEasingStartValueToUse), 1, 0, 1);\r\n }\r\n}", "import { Component, MeshComponent, Object3D, property, TextComponent, WonderlandEngine } from \"@wonderlandengine/api\";\r\nimport { Cursor, CursorTarget } from \"@wonderlandengine/components\";\r\nimport { AudioPlayer } from \"../../../../audio/audio_player.js\";\r\nimport { AudioSetup } from \"../../../../audio/audio_setup.js\";\r\nimport { Timer } from \"../../../../cauldron/cauldron/timer.js\";\r\nimport { FSM, SkipStateFunction, TransitionData } from \"../../../../cauldron/fsm/fsm.js\";\r\nimport { Vector3, Vector4 } from \"../../../../cauldron/type_definitions/array_type_definitions.js\";\r\nimport { ColorUtils } from \"../../../../cauldron/utils/color_utils.js\";\r\nimport { MathUtils } from \"../../../../cauldron/utils/math_utils.js\";\r\nimport { FlatMaterial, PhongMaterial } from \"../../../../cauldron/wl/type_definitions/material_type_definitions.js\";\r\nimport { InputUtils } from \"../../../../input/cauldron/input_utils.js\";\r\nimport { vec3_create, vec4_create } from \"../../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Globals } from \"../../../../pp/globals.js\";\r\nimport { AnimatedNumber, AnimatedNumberParams } from \"../animated_number.js\";\r\n\r\n/** {@link CursorButtonState.UP} is fundamentally a {@link CursorButtonState.HOVER} but after the button has been pressed */\r\nenum CursorButtonState {\r\n UNHOVER,\r\n HOVER,\r\n DOWN,\r\n UP\r\n}\r\n\r\n/** You can return `true` to prevent the default behavior of the cursor button to be performed after the action has been handled */\r\nexport interface CursorButtonActionsHandler {\r\n\r\n onUpdate?(dt: number, cursorButtonComponent: CursorButtonComponent, cursorState: CursorButtonState): boolean;\r\n\r\n /**\r\n * @param isSecondaryCursor `true` if the event is triggered but this is not the main cursor, which means the button is not actually changing the state \r\n * so you might want to perform limited logic, like only making the gamepad pulse and \r\n * play a sound to give the cursor feel but without changing the button state\r\n * \r\n * @param isHoverFromDown `true` in the special case the button is pressed, another cursor enter the button, and the first cursor unhover\r\n * without releasing down. \r\n * In this special case the button should go back to hover, but you might just want to perform limited logic based on the fact \r\n * that is not hovering from unhover but it's a special case\r\n */\r\n onHover?(cursorButtonComponent: CursorButtonComponent, cursorComponent: Cursor, isSecondaryCursor: boolean, isHoverFromDown: boolean): boolean;\r\n\r\n /**\r\n * @param isSecondaryCursor `true` if the event is triggered but this is not the main cursor, which means the button is not actually changing the state \r\n * so you might want to perform limited logic, like only making the gamepad pulse and \r\n * play a sound to give the cursor feel but without changing the button state\r\n */\r\n onDown?(cursorButtonComponent: CursorButtonComponent, cursorComponent: Cursor, isSecondaryCursor: boolean): boolean;\r\n\r\n /**\r\n * @param isSecondaryCursor `true` if the event is triggered but this is not the main cursor, which means the button is not actually changing the state \r\n * so you might want to perform limited logic, like only making the gamepad pulse and \r\n * play a sound to give the cursor feel but without changing the button state\r\n */\r\n onUp?(cursorButtonComponent: CursorButtonComponent, cursorComponent: Cursor, isSecondaryCursor: boolean): boolean;\r\n\r\n /**\r\n * @param isSecondaryCursor `true` if the event is triggered but this is not the main cursor, which means the button is not actually changing the state \r\n * so you might want to perform limited logic, like only making the gamepad pulse and \r\n * play a sound to give the cursor feel but without changing the button state\r\n */\r\n onUnhover?(cursorButtonComponent: CursorButtonComponent, cursorComponent: Cursor, isSecondaryCursor: boolean): boolean;\r\n\r\n /** \r\n * Used to instantly reset to a complete unhover state, used for example when the button is deactivated \r\n * Usually, if something is done {@link onUnhover}, it should also be done here, but instantly instead of starting it here\r\n * and continue it in the {@link onUpdate} callback\r\n */\r\n onInstantUnhover?(cursorButtonComponent: CursorButtonComponent): boolean;\r\n}\r\n\r\nexport class CursorButtonComponent extends Component {\r\n public static override TypeName = \"pp-cursor-button\";\r\n\r\n /** This can be either a name of a component that is found on the same object of the cursor button, \r\n or the name of an handler added through `CursorButtonComponent.addButtonActionHandler` */\r\n @property.string(\"\")\r\n private readonly _myButtonActionsHandlerNames!: string;\r\n\r\n\r\n\r\n @property.float(0.075)\r\n private readonly _myScaleOffsetOnHover!: number;\r\n\r\n @property.float(-0.075)\r\n private readonly _myScaleOffsetOnDown!: number;\r\n\r\n @property.float(0.075)\r\n private readonly _myScaleOffsetOnUp!: number;\r\n\r\n\r\n\r\n @property.float(0.1)\r\n private readonly _myPulseIntensityOnHover!: number;\r\n\r\n @property.float(0)\r\n private readonly _myPulseIntensityOnDown!: number;\r\n\r\n @property.float(0.1)\r\n private readonly _myPulseIntensityOnUp!: number;\r\n\r\n @property.float(0)\r\n private readonly _myPulseIntensityOnUnhover!: number;\r\n\r\n\r\n\r\n @property.float(-0.1)\r\n private readonly _myColorBrigthnessOffsetOnHover!: number;\r\n\r\n @property.float(0)\r\n private readonly _myColorBrigthnessOffsetOnDown!: number;\r\n\r\n @property.float(-0.1)\r\n private readonly _myColorBrigthnessOffsetOnUp!: number;\r\n\r\n\r\n\r\n @property.bool(true)\r\n private readonly _myUseSpatialAudio!: boolean;\r\n\r\n @property.float(1.5)\r\n private readonly _mySpatialAudioReferenceDistance!: number;\r\n\r\n @property.string(\"\")\r\n private readonly _mySFXOnHover!: string;\r\n\r\n @property.string(\"\")\r\n private readonly _mySFXOnDown!: string;\r\n\r\n @property.string(\"\")\r\n private readonly _mySFXOnUp!: string;\r\n\r\n @property.string(\"\")\r\n private readonly _mySFXOnUnhover!: string;\r\n\r\n\r\n\r\n /** Even if you barely interact with the button, it will keep staying in this state for the specified amount */\r\n @property.float(0)\r\n private readonly _myMinHoverSecond!: number;\r\n\r\n /** Even if you barely interact with the button, it will keep staying in this state for the specified amount */\r\n @property.float(0.15)\r\n private readonly _myMinDownSecond!: number;\r\n\r\n /** Even if you barely interact with the button, it will keep staying in this state for the specified amount */\r\n @property.float(0)\r\n private readonly _myMinUpSecond!: number;\r\n\r\n /** Even if you barely interact with the button, it will keep staying in this state for the specified amount */\r\n @property.float(0)\r\n private readonly _myMinUnhoverSecond!: number;\r\n\r\n\r\n\r\n @property.bool(true)\r\n private readonly _myPerformDefaultSecondaryCursorFeedbackOnHover!: number;\r\n\r\n @property.bool(true)\r\n private readonly _myPerformDefaultSecondaryCursorFeedbackOnDown!: number;\r\n\r\n @property.bool(true)\r\n private readonly _myPerformDefaultSecondaryCursorFeedbackOnUp!: number;\r\n\r\n @property.bool(true)\r\n private readonly _myPerformDefaultSecondaryCursorFeedbackOnUnhover!: number;\r\n\r\n\r\n\r\n @property.bool(false)\r\n private readonly _myUpCursorIsMainOnlyIfLastDown!: boolean;\r\n\r\n @property.bool(false)\r\n private readonly _myUpWithSecondaryCursorIsMain!: boolean;\r\n\r\n\r\n\r\n private readonly _myCursorButtonComponentID: string = \"cursor_button_component\" + MathUtils.randomUUID();\r\n\r\n private readonly _myCursorTarget: CursorTarget | null = null;\r\n\r\n private readonly _myButtonActionsHandlers: Map = new Map();\r\n\r\n private readonly _myFSM: FSM = new FSM();\r\n private readonly _myKeepCurrentStateTimer: Timer = new Timer(0);\r\n\r\n private readonly _myTransitionQueue: [string, Cursor, boolean, boolean | null, () => void][] = [];\r\n private _myApplyQueuedTransitions: boolean = false;\r\n\r\n private _myHoverCursors: Cursor[] = [];\r\n private _myMainDownCursor: Cursor | null = null;\r\n private _myDownCursors: Cursor[] = [];\r\n\r\n private readonly _myOriginalScaleLocal: Vector3 = vec3_create();\r\n private readonly _myAnimatedScale!: AnimatedNumber;\r\n\r\n private readonly _myAnimatedColorBrightnessOffset!: AnimatedNumber;\r\n\r\n private _myFlatMaterialOriginalColors: [FlatMaterial, Vector4][] = [];\r\n private _myPhongMaterialOriginalColors: [PhongMaterial, Vector4][] = [];\r\n\r\n private _myOnHoverAudioPlayer: AudioPlayer | null = null;\r\n private _myOnDownAudioPlayer: AudioPlayer | null = null;\r\n private _myOnUpAudioPlayer: AudioPlayer | null = null;\r\n private _myOnUnhoverAudioPlayer: AudioPlayer | null = null;\r\n\r\n private _myFirstUpdate: boolean = true;\r\n\r\n private static readonly _myCursorButtonActionHandlers: Map, Map> = new Map();\r\n\r\n /** Used to add handlers for every cursor buttons that can be indexes with a string */\r\n public static addButtonActionHandler(id: string, buttonActionHandler: Readonly, engine = Globals.getMainEngine()!): void {\r\n if (!CursorButtonComponent._myCursorButtonActionHandlers.has(engine)) {\r\n CursorButtonComponent._myCursorButtonActionHandlers.set(engine, new Map());\r\n }\r\n\r\n CursorButtonComponent._myCursorButtonActionHandlers.get(engine)!.set(id, buttonActionHandler);\r\n }\r\n\r\n public static removeButtonActionHandler(id: string, engine = Globals.getMainEngine()!): void {\r\n if (CursorButtonComponent._myCursorButtonActionHandlers.has(engine)) {\r\n CursorButtonComponent._myCursorButtonActionHandlers.get(engine)!.delete(id);\r\n }\r\n }\r\n\r\n public static getButtonActionHandler(id: string, engine = Globals.getMainEngine()!): CursorButtonActionsHandler | null {\r\n const buttonActionHandler = CursorButtonComponent._myCursorButtonActionHandlers.get(engine)?.get(id);\r\n return buttonActionHandler != null ? buttonActionHandler : null;\r\n }\r\n\r\n /** Used to add handlers for this specific instance of cursor button */\r\n public addButtonActionHandler(id: unknown, buttonActionHandler: Readonly): void {\r\n this._myButtonActionsHandlers.set(id, buttonActionHandler);\r\n }\r\n\r\n public removeButtonActionHandler(id: unknown): void {\r\n this._myButtonActionsHandlers.delete(id);\r\n }\r\n\r\n public getButtonActionHandler(id: unknown): CursorButtonActionsHandler | null {\r\n const buttonActionHandler = this._myButtonActionsHandlers.get(id);\r\n return buttonActionHandler != null ? buttonActionHandler : null;\r\n }\r\n\r\n public getCurrentState(): CursorButtonState {\r\n let currentState = CursorButtonState.UNHOVER;\r\n\r\n const currentFSMState = this._myFSM.getCurrentStateData()!.myID;\r\n switch (currentFSMState) {\r\n case \"unhover\":\r\n currentState = CursorButtonState.UNHOVER;\r\n break;\r\n case \"hover\":\r\n currentState = CursorButtonState.HOVER;\r\n break;\r\n case \"down\":\r\n currentState = CursorButtonState.DOWN;\r\n break;\r\n case \"up_with_down\":\r\n currentState = CursorButtonState.UP;\r\n break;\r\n }\r\n\r\n return currentState;\r\n }\r\n\r\n public override start(): void {\r\n const buttonActionsHandlerNames = [...this._myButtonActionsHandlerNames.split(\",\")];\r\n for (let i = 0; i < buttonActionsHandlerNames.length; i++) {\r\n buttonActionsHandlerNames[i] = buttonActionsHandlerNames[i].trim();\r\n }\r\n\r\n for (const buttonActionsHandlerName of buttonActionsHandlerNames) {\r\n const buttonActionHandlerComponent = this.object.pp_getComponent(buttonActionsHandlerName) as CursorButtonActionsHandler;\r\n if (buttonActionHandlerComponent != null) {\r\n this._myButtonActionsHandlers.set(buttonActionsHandlerName, buttonActionHandlerComponent);\r\n } else {\r\n const buttonActionHandlerStatic = CursorButtonComponent.getButtonActionHandler(buttonActionsHandlerName, this.engine);\r\n if (buttonActionHandlerStatic != null) {\r\n this._myButtonActionsHandlers.set(buttonActionsHandlerName, buttonActionHandlerStatic);\r\n }\r\n }\r\n }\r\n\r\n this._myKeepCurrentStateTimer.end();\r\n\r\n this._myFSM.setLogEnabled(false, \"Cursor Button\");\r\n\r\n this._myFSM.addState(\"unhover\", { start: this._onUnhoverStart.bind(this) });\r\n this._myFSM.addState(\"hover\", { start: this._onHoverStart.bind(this) });\r\n this._myFSM.addState(\"down\", { start: this._onDownStart.bind(this) });\r\n this._myFSM.addState(\"up_with_down\", { start: this._onUpWithDownStart.bind(this) });\r\n\r\n this._myFSM.addTransition(\"unhover\", \"hover\", \"hover\");\r\n this._myFSM.addTransition(\"hover\", \"down\", \"down\");\r\n this._myFSM.addTransition(\"down\", \"up_with_down\", \"up_with_down\");\r\n this._myFSM.addTransition(\"down\", \"hover\", \"hover\");\r\n this._myFSM.addTransition(\"up_with_down\", \"unhover\", \"unhover\");\r\n this._myFSM.addTransition(\"up_with_down\", \"down\", \"down\");\r\n\r\n this._myFSM.addTransition(\"hover\", \"unhover\", \"unhover\");\r\n this._myFSM.addTransition(\"down\", \"unhover\", \"unhover\");\r\n\r\n this._myFSM.addTransition(\"hover\", \"unhover\", \"instant_unhover\", this._onInstantUnhover.bind(this), SkipStateFunction.BOTH);\r\n this._myFSM.addTransition(\"up_with_down\", \"unhover\", \"instant_unhover\", this._onInstantUnhover.bind(this), SkipStateFunction.BOTH);\r\n this._myFSM.addTransition(\"down\", \"unhover\", \"instant_unhover\", this._onInstantUnhover.bind(this), SkipStateFunction.BOTH);\r\n this._myFSM.addTransition(\"unhover\", \"unhover\", \"instant_unhover\", this._onInstantUnhover.bind(this), SkipStateFunction.BOTH);\r\n\r\n this._myFSM.init(\"unhover\");\r\n }\r\n\r\n private _start(): void {\r\n this._setupVisualsAndSFXs();\r\n\r\n (this._myCursorTarget as (CursorTarget | null)) = this.object.pp_getComponent(CursorTarget);\r\n this.onActivate();\r\n }\r\n\r\n private static readonly _updateSV =\r\n {\r\n buttonScale: vec3_create(),\r\n hsvColor: vec4_create(),\r\n rgbColor: vec4_create()\r\n };\r\n public override update(dt: number): void {\r\n if (this._myFirstUpdate) {\r\n this._start();\r\n this._myFirstUpdate = false;\r\n }\r\n\r\n this._myFSM.update(dt);\r\n\r\n if (this._myKeepCurrentStateTimer.isRunning()) {\r\n this._myKeepCurrentStateTimer.update(dt);\r\n if (this._myKeepCurrentStateTimer.isDone()) {\r\n this._myApplyQueuedTransitions = true;\r\n }\r\n }\r\n\r\n if (this._myApplyQueuedTransitions) {\r\n this._myApplyQueuedTransitions = false;\r\n\r\n while (this._myTransitionQueue.length > 0) {\r\n const transitionToApply = this._myTransitionQueue.shift()!;\r\n\r\n if (this._myFSM.canPerform(transitionToApply[0])) {\r\n if (transitionToApply[3] != null) {\r\n this._myFSM.perform(transitionToApply[0], transitionToApply[1], transitionToApply[2], transitionToApply[3]);\r\n } else {\r\n this._myFSM.perform(transitionToApply[0], transitionToApply[1], transitionToApply[2]);\r\n }\r\n } else {\r\n transitionToApply[4]();\r\n }\r\n\r\n if (this._myKeepCurrentStateTimer.isRunning()) {\r\n break;\r\n }\r\n }\r\n }\r\n\r\n let skipDefault = false;\r\n for (const buttonActionsHandler of this._myButtonActionsHandlers.values()) {\r\n if (buttonActionsHandler.onUpdate != null) {\r\n skipDefault ||= buttonActionsHandler.onUpdate(dt, this, this.getCurrentState());\r\n }\r\n }\r\n\r\n if (!skipDefault) {\r\n if (!this._myAnimatedScale.isDone()) {\r\n this._myAnimatedScale.update(dt);\r\n\r\n const buttonScale = CursorButtonComponent._updateSV.buttonScale;\r\n this.object.pp_setScaleLocal(this._myOriginalScaleLocal.vec3_scale(this._myAnimatedScale.getCurrentValue(), buttonScale));\r\n }\r\n\r\n if (!this._myAnimatedColorBrightnessOffset.isDone()) {\r\n this._myAnimatedColorBrightnessOffset.update(dt);\r\n\r\n const colorBrightnessOffsetCurrentValue = this._myAnimatedColorBrightnessOffset.getCurrentValue();\r\n\r\n const hsvColor = CursorButtonComponent._updateSV.hsvColor;\r\n const rgbColor = CursorButtonComponent._updateSV.rgbColor;\r\n\r\n for (const [material, originalColor] of this._myPhongMaterialOriginalColors) {\r\n ColorUtils.rgbToHSV(originalColor, hsvColor);\r\n hsvColor[2] = MathUtils.clamp(hsvColor[2] + colorBrightnessOffsetCurrentValue, 0, 1);\r\n material.diffuseColor = ColorUtils.hsvToRGB(hsvColor, rgbColor);\r\n }\r\n\r\n for (const [material, originalColor] of this._myFlatMaterialOriginalColors) {\r\n ColorUtils.rgbToHSV(originalColor, hsvColor);\r\n hsvColor[2] = MathUtils.clamp(hsvColor[2] + colorBrightnessOffsetCurrentValue, 0, 1);\r\n material.color = ColorUtils.hsvToRGB(hsvColor, rgbColor);\r\n }\r\n }\r\n }\r\n }\r\n\r\n private _onUnhover(targetObject: Object3D, cursorComponent: Cursor): void {\r\n this._myHoverCursors.pp_removeEqual(cursorComponent);\r\n const cursorWasDown = this._myDownCursors.pp_removeEqual(cursorComponent);\r\n\r\n const isMainCursorDown = (this._myDownCursors.length == 0 && cursorWasDown) || (this._myMainDownCursor == cursorComponent && !this._myUpCursorIsMainOnlyIfLastDown && !this._myUpWithSecondaryCursorIsMain);\r\n\r\n if (isMainCursorDown) {\r\n this._myMainDownCursor = null;\r\n\r\n if (this._myHoverCursors.length > 0) {\r\n this._addToTransitionQueue(\"hover\", cursorComponent, false, true, this._onHoverStart.bind(this, null, null, cursorComponent, true, true));\r\n } else {\r\n this._addToTransitionQueue(\"unhover\", cursorComponent, false, null, this._onUnhoverStart.bind(this, null, null, cursorComponent, true));\r\n }\r\n } else {\r\n if (this._myMainDownCursor == cursorComponent) {\r\n this._myMainDownCursor = this._myDownCursors[0];\r\n }\r\n\r\n const isSecondaryCursor = this._myHoverCursors.length > 0;\r\n\r\n this._addToTransitionQueue(\"unhover\", cursorComponent, isSecondaryCursor, null, this._onUnhoverStart.bind(this, null, null, cursorComponent, true));\r\n }\r\n }\r\n\r\n private _onHover(targetObject: Object3D, cursorComponent: Cursor): void {\r\n const isSecondaryCursor = this._myHoverCursors.length > 0;\r\n\r\n this._myHoverCursors.pp_pushUnique(cursorComponent);\r\n\r\n this._addToTransitionQueue(\"hover\", cursorComponent, isSecondaryCursor, false, this._onHoverStart.bind(this, null, null, cursorComponent, true, false));\r\n }\r\n\r\n private _onDown(targetObject: Object3D, cursorComponent: Cursor): void {\r\n const isSecondaryCursor = this._myMainDownCursor != null && this._myMainDownCursor != cursorComponent;\r\n\r\n if (this._myMainDownCursor == null) {\r\n this._myMainDownCursor = cursorComponent;\r\n }\r\n\r\n this._myDownCursors.pp_pushUnique(cursorComponent);\r\n\r\n this._addToTransitionQueue(\"down\", cursorComponent, isSecondaryCursor, null, this._onDownStart.bind(this, null, null, cursorComponent, true));\r\n }\r\n\r\n private onUpWithDown(targetObject: Object3D, cursorComponent: Cursor): void {\r\n this._myDownCursors.pp_removeEqual(cursorComponent);\r\n\r\n const isSecondaryCursor = !this._myUpWithSecondaryCursorIsMain && (\r\n (!this._myUpCursorIsMainOnlyIfLastDown && this._myMainDownCursor != cursorComponent) ||\r\n (this._myUpCursorIsMainOnlyIfLastDown && this._myDownCursors.length > 0));\r\n\r\n if (!isSecondaryCursor) {\r\n this._myMainDownCursor = null;\r\n } else if (this._myMainDownCursor == cursorComponent) {\r\n this._myMainDownCursor = this._myDownCursors[0];\r\n }\r\n\r\n this._addToTransitionQueue(\"up_with_down\", cursorComponent, isSecondaryCursor, null, this._onUpWithDownStart.bind(this, null, null, cursorComponent, true));\r\n }\r\n\r\n private _addToTransitionQueue(transitionToPerform: string, cursorComponent: Cursor, isSecondaryCursor: boolean, isHoverFromDown: boolean | null, startCallback: () => void): void {\r\n if (!isSecondaryCursor) {\r\n if (!this._myKeepCurrentStateTimer.isDone()) {\r\n const index = this._myTransitionQueue.pp_findIndex((elementToCheck: [string, Cursor, boolean, boolean | null, () => void]) => {\r\n return elementToCheck[0] == transitionToPerform && elementToCheck[1] == cursorComponent && elementToCheck[2] == isSecondaryCursor && elementToCheck[3] == isHoverFromDown;\r\n });\r\n\r\n if (index == -1) {\r\n this._myTransitionQueue.push([transitionToPerform, cursorComponent, isSecondaryCursor, isHoverFromDown, startCallback]);\r\n } else {\r\n this._myTransitionQueue.splice(index + 1);\r\n }\r\n } else if (this._myFSM.canPerform(transitionToPerform)) {\r\n this._myFSM.perform(transitionToPerform, cursorComponent, isSecondaryCursor, isHoverFromDown);\r\n } else {\r\n startCallback();\r\n }\r\n } else {\r\n startCallback();\r\n }\r\n }\r\n\r\n private _onInstantUnhover(fsm: FSM | null, transitionData: Readonly | null): void {\r\n let skipDefault = false;\r\n for (const buttonActionsHandler of this._myButtonActionsHandlers.values()) {\r\n if (buttonActionsHandler.onInstantUnhover != null) {\r\n skipDefault ||= buttonActionsHandler.onInstantUnhover(this);\r\n }\r\n }\r\n\r\n if (skipDefault) {\r\n return;\r\n }\r\n\r\n {\r\n this._myAnimatedScale.setTargetValue(1);\r\n this._myAnimatedScale.end();\r\n\r\n this.object.pp_setScaleLocal(this._myOriginalScaleLocal.vec3_scale(this._myAnimatedScale.getCurrentValue()));\r\n }\r\n\r\n {\r\n this._myAnimatedColorBrightnessOffset.setTargetValue(0);\r\n this._myAnimatedColorBrightnessOffset.end();\r\n\r\n const colorBrightnessOffsetCurrentValue = this._myAnimatedColorBrightnessOffset.getCurrentValue();\r\n\r\n for (const [material, originalColor] of this._myPhongMaterialOriginalColors) {\r\n const hsvColor = ColorUtils.rgbToHSV(originalColor);\r\n hsvColor[2] = MathUtils.clamp(hsvColor[2] + colorBrightnessOffsetCurrentValue, 0, 1);\r\n material.diffuseColor = ColorUtils.hsvToRGB(hsvColor);\r\n }\r\n\r\n for (const [material, originalColor] of this._myFlatMaterialOriginalColors) {\r\n const hsvColor = ColorUtils.rgbToHSV(originalColor);\r\n hsvColor[2] = MathUtils.clamp(hsvColor[2] + colorBrightnessOffsetCurrentValue, 0, 1);\r\n material.color = ColorUtils.hsvToRGB(hsvColor);\r\n }\r\n }\r\n }\r\n\r\n private _onUnhoverStart(fsm: FSM | null, transitionData: Readonly | null, cursorComponent: Cursor, isSecondaryCursor: boolean): void {\r\n if (!isSecondaryCursor) {\r\n this._myKeepCurrentStateTimer.start(this._myMinUnhoverSecond);\r\n this._myKeepCurrentStateTimer.update(0); // Instantly end the timer if the duration is 0\r\n }\r\n\r\n let skipDefault = false;\r\n for (const buttonActionsHandler of this._myButtonActionsHandlers.values()) {\r\n if (buttonActionsHandler.onUnhover != null) {\r\n skipDefault ||= buttonActionsHandler.onUnhover(this, cursorComponent, isSecondaryCursor);\r\n }\r\n }\r\n\r\n if (skipDefault) {\r\n return;\r\n }\r\n\r\n if (!isSecondaryCursor) {\r\n if (this._myScaleOffsetOnHover != 0 || this._myScaleOffsetOnDown != 0 || this._myScaleOffsetOnUp != 0) {\r\n this._myAnimatedScale.setTargetValue(1);\r\n }\r\n }\r\n\r\n if (!isSecondaryCursor || this._myPerformDefaultSecondaryCursorFeedbackOnUnhover) {\r\n if (this._myPulseIntensityOnUnhover != 0) {\r\n const handedness = InputUtils.getHandednessByString(cursorComponent.handedness as string);\r\n if (handedness != null) {\r\n Globals.getGamepads()![handedness].pulse(this._myPulseIntensityOnUnhover, 0.085);\r\n }\r\n }\r\n }\r\n\r\n if (!isSecondaryCursor) {\r\n if (this._myColorBrigthnessOffsetOnHover != 0 || this._myColorBrigthnessOffsetOnDown != 0 || this._myColorBrigthnessOffsetOnUp != 0) {\r\n this._myAnimatedColorBrightnessOffset.setTargetValue(0);\r\n }\r\n }\r\n\r\n if (!isSecondaryCursor || this._myPerformDefaultSecondaryCursorFeedbackOnUnhover) {\r\n if (this._myOnUnhoverAudioPlayer != null) {\r\n this._myOnUnhoverAudioPlayer.setPosition(this.object.pp_getPosition());\r\n this._myOnUnhoverAudioPlayer.play();\r\n }\r\n }\r\n }\r\n\r\n private _onHoverStart(fsm: FSM | null, transitionData: Readonly | null, cursorComponent: Cursor, isSecondaryCursor: boolean, isHoverFromDown: boolean): void {\r\n if (!isSecondaryCursor) {\r\n this._myKeepCurrentStateTimer.start(this._myMinHoverSecond);\r\n this._myKeepCurrentStateTimer.update(0); // Instantly end the timer if the duration is 0\r\n }\r\n\r\n let skipDefault = false;\r\n for (const buttonActionsHandler of this._myButtonActionsHandlers.values()) {\r\n if (buttonActionsHandler.onHover != null) {\r\n skipDefault ||= buttonActionsHandler.onHover(this, cursorComponent, isSecondaryCursor, isHoverFromDown);\r\n }\r\n }\r\n\r\n if (skipDefault) {\r\n return;\r\n }\r\n\r\n if (!isSecondaryCursor) {\r\n if (this._myScaleOffsetOnHover != 0 || this._myScaleOffsetOnDown != 0 || this._myScaleOffsetOnUp != 0) {\r\n this._myAnimatedScale.setTargetValue(1 + this._myScaleOffsetOnHover);\r\n }\r\n }\r\n\r\n if (!isSecondaryCursor || this._myPerformDefaultSecondaryCursorFeedbackOnHover) {\r\n if (this._myPulseIntensityOnHover != 0) {\r\n const handedness = InputUtils.getHandednessByString(cursorComponent.handedness as string);\r\n if (handedness != null) {\r\n Globals.getGamepads()![handedness].pulse(this._myPulseIntensityOnHover, 0.085);\r\n }\r\n }\r\n }\r\n\r\n if (!isSecondaryCursor) {\r\n if (this._myColorBrigthnessOffsetOnHover != 0 || this._myColorBrigthnessOffsetOnDown != 0 || this._myColorBrigthnessOffsetOnUp != 0) {\r\n this._myAnimatedColorBrightnessOffset.setTargetValue(this._myColorBrigthnessOffsetOnHover);\r\n }\r\n }\r\n\r\n if (!isSecondaryCursor || this._myPerformDefaultSecondaryCursorFeedbackOnHover) {\r\n if (this._myOnHoverAudioPlayer != null) {\r\n this._myOnHoverAudioPlayer.setPosition(this.object.pp_getPosition());\r\n this._myOnHoverAudioPlayer.play();\r\n }\r\n }\r\n }\r\n\r\n private _onDownStart(fsm: FSM | null, transitionData: Readonly | null, cursorComponent: Cursor, isSecondaryCursor: boolean): void {\r\n if (!isSecondaryCursor) {\r\n this._myKeepCurrentStateTimer.start(this._myMinDownSecond);\r\n this._myKeepCurrentStateTimer.update(0); // Instantly end the timer if the duration is 0\r\n }\r\n\r\n let skipDefault = false;\r\n for (const buttonActionsHandler of this._myButtonActionsHandlers.values()) {\r\n if (buttonActionsHandler.onDown != null) {\r\n skipDefault ||= buttonActionsHandler.onDown(this, cursorComponent, isSecondaryCursor);\r\n }\r\n }\r\n\r\n if (skipDefault) {\r\n return;\r\n }\r\n\r\n if (!isSecondaryCursor) {\r\n if (this._myScaleOffsetOnHover != 0 || this._myScaleOffsetOnDown != 0 || this._myScaleOffsetOnUp != 0) {\r\n this._myAnimatedScale.setTargetValue(1 + this._myScaleOffsetOnDown);\r\n }\r\n }\r\n\r\n if (!isSecondaryCursor || this._myPerformDefaultSecondaryCursorFeedbackOnDown) {\r\n if (this._myPulseIntensityOnDown != 0) {\r\n const handedness = InputUtils.getHandednessByString(cursorComponent.handedness as string);\r\n if (handedness != null) {\r\n Globals.getGamepads()![handedness].pulse(this._myPulseIntensityOnDown, 0.085);\r\n }\r\n }\r\n }\r\n\r\n if (!isSecondaryCursor) {\r\n if (this._myColorBrigthnessOffsetOnHover != 0 || this._myColorBrigthnessOffsetOnDown != 0 || this._myColorBrigthnessOffsetOnUp != 0) {\r\n this._myAnimatedColorBrightnessOffset.setTargetValue(this._myColorBrigthnessOffsetOnDown);\r\n }\r\n }\r\n\r\n if (!isSecondaryCursor || this._myPerformDefaultSecondaryCursorFeedbackOnDown) {\r\n if (this._myOnDownAudioPlayer != null) {\r\n this._myOnDownAudioPlayer.setPosition(this.object.pp_getPosition());\r\n this._myOnDownAudioPlayer.play();\r\n }\r\n }\r\n }\r\n\r\n private _onUpWithDownStart(fsm: FSM | null, transitionData: Readonly | null, cursorComponent: Cursor, isSecondaryCursor: boolean): void {\r\n if (!isSecondaryCursor) {\r\n this._myKeepCurrentStateTimer.start(this._myMinUpSecond);\r\n this._myKeepCurrentStateTimer.update(0); // Instantly end the timer if the duration is 0\r\n }\r\n\r\n let skipDefault = false;\r\n for (const buttonActionsHandler of this._myButtonActionsHandlers.values()) {\r\n if (buttonActionsHandler.onUp != null) {\r\n skipDefault ||= buttonActionsHandler.onUp(this, cursorComponent, isSecondaryCursor);\r\n }\r\n }\r\n\r\n if (skipDefault) {\r\n return;\r\n }\r\n\r\n if (!isSecondaryCursor) {\r\n if (this._myScaleOffsetOnHover != 0 || this._myScaleOffsetOnDown != 0 || this._myScaleOffsetOnUp != 0) {\r\n this._myAnimatedScale.setTargetValue(1 + this._myScaleOffsetOnUp);\r\n }\r\n }\r\n\r\n if (!isSecondaryCursor || this._myPerformDefaultSecondaryCursorFeedbackOnUp) {\r\n if (this._myPulseIntensityOnUp != 0) {\r\n const handedness = InputUtils.getHandednessByString(cursorComponent.handedness as string);\r\n if (handedness != null) {\r\n Globals.getGamepads()![handedness].pulse(this._myPulseIntensityOnUp, 0.085);\r\n }\r\n }\r\n }\r\n\r\n if (!isSecondaryCursor) {\r\n if (this._myColorBrigthnessOffsetOnHover != 0 || this._myColorBrigthnessOffsetOnDown != 0 || this._myColorBrigthnessOffsetOnUp != 0) {\r\n this._myAnimatedColorBrightnessOffset.setTargetValue(this._myColorBrigthnessOffsetOnUp);\r\n }\r\n }\r\n\r\n if (!isSecondaryCursor || this._myPerformDefaultSecondaryCursorFeedbackOnUp) {\r\n if (this._myOnUpAudioPlayer != null) {\r\n this._myOnUpAudioPlayer.setPosition(this.object.pp_getPosition());\r\n this._myOnUpAudioPlayer.play();\r\n }\r\n }\r\n }\r\n\r\n private _setupVisualsAndSFXs(): void {\r\n this.object.pp_getScaleLocal(this._myOriginalScaleLocal);\r\n\r\n const animatedScaleParams = new AnimatedNumberParams();\r\n animatedScaleParams.myInitialValue = this._myOriginalScaleLocal[0];\r\n animatedScaleParams.myAnimationSeconds = 0.25;\r\n (this._myAnimatedScale as AnimatedNumber) = new AnimatedNumber(animatedScaleParams);\r\n\r\n const animatedColorBrightnessOffsetParams = new AnimatedNumberParams();\r\n animatedColorBrightnessOffsetParams.myInitialValue = 0;\r\n animatedColorBrightnessOffsetParams.myAnimationSeconds = 0.25;\r\n (this._myAnimatedColorBrightnessOffset as AnimatedNumber) = new AnimatedNumber(animatedColorBrightnessOffsetParams);\r\n\r\n const meshComponents = this.object.pp_getComponents(MeshComponent);\r\n for (const meshComponent of meshComponents) {\r\n meshComponent.material = meshComponent.material?.clone();\r\n\r\n const phongMaterial = meshComponent.material as PhongMaterial;\r\n if (phongMaterial.diffuseColor != null) {\r\n this._myPhongMaterialOriginalColors.push([phongMaterial, phongMaterial.diffuseColor.vec4_clone()]);\r\n } else {\r\n const flatMaterial = meshComponent.material as FlatMaterial;\r\n if (flatMaterial.color != null) {\r\n this._myFlatMaterialOriginalColors.push([flatMaterial, flatMaterial.color.vec4_clone()]);\r\n }\r\n }\r\n }\r\n\r\n const textComponents = this.object.pp_getComponents(TextComponent);\r\n for (const textComponent of textComponents) {\r\n textComponent.material = textComponent.material?.clone();\r\n\r\n const flatMaterial = textComponent.material as FlatMaterial;\r\n if (flatMaterial.color != null) {\r\n this._myFlatMaterialOriginalColors.push([flatMaterial, flatMaterial.color.vec4_clone()]);\r\n }\r\n }\r\n\r\n const audioManager = Globals.getAudioManager(this.engine)!;\r\n if (this._mySFXOnHover.length > 0) {\r\n const audioSetup = new AudioSetup(this._mySFXOnHover);\r\n audioSetup.mySpatial = this._myUseSpatialAudio;\r\n audioSetup.myReferenceDistance = this._mySpatialAudioReferenceDistance;\r\n\r\n const audioID = this._myCursorButtonComponentID + \"_on_hover\";\r\n audioManager.addAudioSetup(audioID, audioSetup);\r\n\r\n this._myOnHoverAudioPlayer = audioManager.createAudioPlayer(audioID);\r\n }\r\n\r\n if (this._mySFXOnDown.length > 0) {\r\n const audioSetup = new AudioSetup(this._mySFXOnDown);\r\n audioSetup.mySpatial = this._myUseSpatialAudio;\r\n audioSetup.myReferenceDistance = this._mySpatialAudioReferenceDistance;\r\n\r\n const audioID = this._myCursorButtonComponentID + \"_on_down\";\r\n audioManager.addAudioSetup(audioID, audioSetup);\r\n\r\n this._myOnDownAudioPlayer = audioManager.createAudioPlayer(audioID);\r\n }\r\n\r\n if (this._mySFXOnUp.length > 0) {\r\n const audioSetup = new AudioSetup(this._mySFXOnUp);\r\n audioSetup.mySpatial = this._myUseSpatialAudio;\r\n audioSetup.myReferenceDistance = this._mySpatialAudioReferenceDistance;\r\n\r\n const audioID = this._myCursorButtonComponentID + \"_on_up\";\r\n audioManager.addAudioSetup(audioID, audioSetup);\r\n\r\n this._myOnUpAudioPlayer = audioManager.createAudioPlayer(audioID);\r\n }\r\n\r\n if (this._mySFXOnUnhover.length > 0) {\r\n const audioSetup = new AudioSetup(this._mySFXOnUnhover);\r\n audioSetup.mySpatial = this._myUseSpatialAudio;\r\n audioSetup.myReferenceDistance = this._mySpatialAudioReferenceDistance;\r\n\r\n const audioID = this._myCursorButtonComponentID + \"_on_unhover\";\r\n audioManager.addAudioSetup(audioID, audioSetup);\r\n\r\n this._myOnUnhoverAudioPlayer = audioManager.createAudioPlayer(audioID);\r\n }\r\n }\r\n\r\n public override onActivate(): void {\r\n if (this._myCursorTarget != null) {\r\n this._myCursorTarget.onUnhover.add(this._onUnhover.bind(this), { id: this });\r\n this._myCursorTarget.onHover.add(this._onHover.bind(this), { id: this });\r\n this._myCursorTarget.onDown.add(this._onDown.bind(this), { id: this });\r\n this._myCursorTarget.onUpWithDown.add(this.onUpWithDown.bind(this), { id: this });\r\n }\r\n }\r\n\r\n public override onDeactivate(): void {\r\n if (this._myCursorTarget != null) {\r\n this._myCursorTarget.onUnhover.remove(this);\r\n this._myCursorTarget.onHover.remove(this);\r\n this._myCursorTarget.onDown.remove(this);\r\n this._myCursorTarget.onUpWithDown.remove(this);\r\n\r\n this._myKeepCurrentStateTimer.end();\r\n this._myTransitionQueue.pp_clear();\r\n this._myApplyQueuedTransitions = false;\r\n\r\n this._myHoverCursors.pp_clear();\r\n this._myMainDownCursor = null;\r\n this._myDownCursors.pp_clear();\r\n\r\n this._myFSM.perform(\"instant_unhover\");\r\n }\r\n }\r\n}", "import { Component, Property } from \"@wonderlandengine/api\";\r\nimport { Timer } from \"../../../../cauldron/cauldron/timer.js\";\r\nimport { EasingFunction, MathUtils } from \"../../../../cauldron/utils/math_utils.js\";\r\nimport { ComponentUtils } from \"../../../../cauldron/wl/utils/component_utils.js\";\r\nimport { vec3_create } from \"../../../../plugin/js/extensions/array/vec_create_extension.js\";\r\n\r\nexport class ScaleOnSpawnComponent extends Component {\r\n static TypeName = \"pp-scale-on-spawn\";\r\n static Properties = {\r\n _myStartDelay: Property.float(0.0),\r\n _myScaleDuration: Property.float(0.0)\r\n };\r\n\r\n init() {\r\n this._myTargetScale = vec3_create(1, 1, 1);\r\n }\r\n\r\n start() {\r\n this.object.pp_setScale(MathUtils.EPSILON);\r\n\r\n this._myDelayTimer = new Timer(this._myStartDelay);\r\n this._myScaleDurationTimer = new Timer(this._myScaleDuration);\r\n }\r\n\r\n update(dt) {\r\n if (this._myDelayTimer.isRunning()) {\r\n this._myDelayTimer.update(dt);\r\n } else if (this._myScaleDurationTimer.isRunning()) {\r\n this._myScaleDurationTimer.update(dt);\r\n\r\n this.object.pp_setScale(this._myTargetScale.vec3_scale(EasingFunction.easeOut(this._myScaleDurationTimer.getPercentage())));\r\n }\r\n }\r\n\r\n onActivate() {\r\n this.start();\r\n }\r\n\r\n pp_clone(targetObject) {\r\n let clonedComponent = ComponentUtils.cloneDefault(this, targetObject);\r\n\r\n return clonedComponent;\r\n }\r\n}", "import { Component, Emitter, PhysXComponent, Property } from \"@wonderlandengine/api\";\r\nimport { ComponentUtils } from \"../../cauldron/wl/utils/component_utils.js\";\r\nimport { vec3_create } from \"../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Globals } from \"../../pp/globals.js\";\r\n\r\nexport class GrabbableComponent extends Component {\r\n static TypeName = \"pp-grabbable\";\r\n static Properties = {\r\n _myThrowLinearVelocityMultiplier: Property.float(1),\r\n _myThrowAngularVelocityMultiplier: Property.float(1),\r\n _myKinematicValueOnRelease: Property.enum([\"True\", \"False\", \"Own\"], \"False\"),\r\n _myParentOnRelease: Property.enum([\"Scene\", \"Own\"], \"Own\")\r\n };\r\n\r\n init() {\r\n this._myGrabbed = false;\r\n\r\n this._myGrabber = null;\r\n\r\n this._myOldParent = null;\r\n this._myPhysX = null;\r\n this._myOldKinematicValue = null;\r\n\r\n this._myGrabEmitter = new Emitter(); // Signature: listener(grabber, grabbable)\r\n this._myThrowEmitter = new Emitter(); // Signature: listener(grabber, grabbable)\r\n this._myReleaseEmitter = new Emitter(); // Signature: listener(grabber, grabbable, isThrow)\r\n\r\n this._mySceneParent = null;\r\n }\r\n\r\n start() {\r\n this._myOldParent = this.object.pp_getParent();\r\n this._myPhysX = this.object.pp_getComponent(PhysXComponent);\r\n }\r\n\r\n update(dt) {\r\n this._mySceneParent = Globals.getSceneObjects(this.engine)?.myDynamics ?? null;\r\n }\r\n\r\n onActivate() {\r\n this._mySceneParent = Globals.getSceneObjects(this.engine)?.myDynamics ?? null;\r\n }\r\n\r\n onDeactivate() {\r\n this.release();\r\n }\r\n\r\n grab(grabber) {\r\n if (!this.isGrabbed()) {\r\n this._myOldKinematicValue = this._myPhysX.kinematic;\r\n }\r\n\r\n this.release();\r\n\r\n this._myPhysX.kinematic = true;\r\n\r\n this._myOldParent = this.object.pp_getParent();\r\n this.object.pp_setParent(grabber);\r\n\r\n this._myGrabbed = true;\r\n\r\n this._myGrabEmitter.notify(grabber, this);\r\n }\r\n\r\n throw(linearVelocity, angularVelocity) {\r\n if (this._myGrabbed) {\r\n let grabber = this._myGrabber;\r\n\r\n this._release();\r\n\r\n // #TODO For now kinematic is not updated instantly, add the if as soon as it is\r\n //if (!this._myPhysX.kinematic) {\r\n this._myPhysX.linearVelocity = linearVelocity.vec3_scale(this._myThrowLinearVelocityMultiplier);\r\n this._myPhysX.angularVelocity = angularVelocity.vec3_scale(this._myThrowAngularVelocityMultiplier);\r\n //}\r\n\r\n this._myThrowEmitter.notify(grabber, this);\r\n this._myReleaseEmitter.notify(grabber, this, true);\r\n }\r\n }\r\n\r\n release() {\r\n if (this._myGrabbed) {\r\n let grabber = this._myGrabber;\r\n\r\n this._release();\r\n\r\n this._myReleaseEmitter.notify(grabber, this, false);\r\n }\r\n }\r\n\r\n getLinearVelocity() {\r\n return this._myPhysX.linearVelocity.vec3_clone();\r\n }\r\n\r\n getAngularVelocity() {\r\n return this.getAngularVelocityDegrees();\r\n }\r\n\r\n getAngularVelocityDegrees() {\r\n let angularVelocityDegrees = vec3_create();\r\n\r\n this._myPhysX.angularVelocity.vec3_toDegrees(angularVelocityDegrees);\r\n\r\n return angularVelocityDegrees;\r\n }\r\n\r\n getAngularVelocityRadians() {\r\n return this._myPhysX.angularVelocity.vec3_clone();\r\n }\r\n\r\n isGrabbed() {\r\n return this._myGrabbed;\r\n }\r\n\r\n getGrabber() {\r\n return this._myGrabber;\r\n }\r\n\r\n registerGrabEventListener(id, listener) {\r\n this._myGrabEmitter.add(listener, { id: id });\r\n }\r\n\r\n unregisterGrabEventListener(id) {\r\n this._myGrabEmitter.remove(id);\r\n }\r\n\r\n registerThrowEventListener(id, listener) {\r\n this._myThrowEmitter.add(listener, { id: id });\r\n }\r\n\r\n unregisterThrowEventListener(id) {\r\n this._myThrowEmitter.remove(id);\r\n }\r\n\r\n registerReleaseEventListener(id, listener) {\r\n this._myReleaseEmitter.add(listener, { id: id });\r\n }\r\n\r\n unregisterReleaseEventListener(id) {\r\n this._myReleaseEmitter.remove(id);\r\n }\r\n\r\n _release() {\r\n if (this._myParentOnRelease == 0) {\r\n this.object.pp_setParent(this._mySceneParent);\r\n } else {\r\n this.object.pp_setParent(this._myOldParent);\r\n }\r\n\r\n this._myGrabbed = false;\r\n this._myGrabber = null;\r\n\r\n if (this._myKinematicValueOnRelease == 0) {\r\n this._myPhysX.kinematic = true;\r\n } else if (this._myKinematicValueOnRelease == 1) {\r\n this._myPhysX.kinematic = false;\r\n } else if (this._myOldKinematicValue != null) {\r\n this._myPhysX.kinematic = this._myOldKinematicValue;\r\n }\r\n\r\n if (this._myPhysX.kinematic) {\r\n this._myPhysX.linearVelocity = vec3_create();\r\n this._myPhysX.angularVelocity = vec3_create();\r\n }\r\n }\r\n\r\n pp_clone(targetObject) {\r\n let clonedComponent = ComponentUtils.cloneDefault(this, targetObject);\r\n\r\n return clonedComponent;\r\n }\r\n\r\n pp_clonePostProcess(clonedComponent) {\r\n clonedComponent.start();\r\n }\r\n}", "import { Component, Emitter, PhysXComponent, Property } from \"@wonderlandengine/api\";\r\nimport { PhysicsCollisionCollector } from \"../../cauldron/physics/physics_collision_collector.js\";\r\nimport { EasingFunction } from \"../../cauldron/utils/math_utils.js\";\r\nimport { HandednessIndex, InputSourceType } from \"../../input/cauldron/input_types.js\";\r\nimport { InputUtils } from \"../../input/cauldron/input_utils.js\";\r\nimport { GamepadButtonID } from \"../../input/gamepad/gamepad_buttons.js\";\r\nimport { vec3_create, vec4_create } from \"../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Globals } from \"../../pp/globals.js\";\r\nimport { GrabbableComponent } from \"./grabbable_component.js\";\r\n\r\nexport class GrabberHandComponent extends Component {\r\n static TypeName = \"pp-grabber-hand\";\r\n static Properties = {\r\n _myHandedness: Property.enum([\"Left\", \"Right\"], \"Left\"),\r\n _myGrabButton: Property.enum([\"Select\", \"Squeeze\", \"Both\", \"Both Exclusive\"], \"Squeeze\"), // @\"Both Exclusive\" means u can use both buttons but you have to use the same button you grabbed with to throw\r\n _mySnapGrabbableToOrigin: Property.bool(false),\r\n _myMaxNumberOfObjects: Property.int(1), // How many objects you can grab at the same time\r\n\r\n // ADVANCED SETTINGS\r\n _myThrowVelocitySource: Property.enum([\"Hand\", \"Grabbable\"], \"Hand\"),\r\n _myThrowLinearVelocityMultiplier: Property.float(1), // Multiply the overall throw speed, so slow throws will be multiplied too\r\n _myThrowMaxLinearSpeed: Property.float(15),\r\n _myThrowAngularVelocityMultiplier: Property.float(0.5),\r\n _myThrowMaxAngularSpeed: Property.float(1080), // @Degrees\r\n _myThrowLinearVelocityBoost: Property.float(1.75), // This boost is applied from 0% to 100% based on how fast you throw, so slow throws are not affected\r\n _myThrowLinearVelocityBoostMinSpeedThreshold: Property.float(0.6), // 0% boost is applied if plain throw speed is under this value\r\n _myThrowLinearVelocityBoostMaxSpeedThreshold: Property.float(2.5), // 100% boost is applied if plain throw speed is over this value\r\n };\r\n\r\n init() {\r\n this._myGrabbables = [];\r\n\r\n this._myGamepad = null;\r\n\r\n this._myActiveGrabButton = null;\r\n\r\n this._myPrevInputSourceType = null;\r\n\r\n this._myLinearVelocityHistorySize = 5;\r\n this._myLinearVelocityHistorySpeedAverageSamplesFromStart = 1;\r\n this._myLinearVelocityHistoryDirectionAverageSamplesFromStart = 3;\r\n this._myLinearVelocityHistoryDirectionAverageSkipFromStart = 0;\r\n\r\n this._myHandLinearVelocityHistory = new Array(this._myLinearVelocityHistorySize);\r\n this._myHandLinearVelocityHistory.fill(vec3_create());\r\n\r\n this._myAngularVelocityHistorySize = 1;\r\n this._myHandAngularVelocityHistory = new Array(this._myAngularVelocityHistorySize);\r\n this._myHandAngularVelocityHistory.fill(vec3_create());\r\n\r\n this._myThrowMaxAngularSpeedRadians = Math.pp_toRadians(this._myThrowMaxAngularSpeed);\r\n\r\n this._myGrabEmitter = new Emitter(); // Signature: listener(grabber, grabbable)\r\n this._myThrowEmitter = new Emitter(); // Signature: listener(grabber, grabbable)\r\n\r\n this._myDebugEnabled = false;\r\n }\r\n\r\n start() {\r\n if (this._myHandedness == HandednessIndex.LEFT) {\r\n this._myGamepad = Globals.getLeftGamepad(this.engine);\r\n } else {\r\n this._myGamepad = Globals.getRightGamepad(this.engine);\r\n }\r\n\r\n this._myPhysX = this.object.pp_getComponent(PhysXComponent);\r\n this._myCollisionsCollector = new PhysicsCollisionCollector(this._myPhysX);\r\n }\r\n\r\n update(dt) {\r\n this._myCollisionsCollector.update(dt);\r\n\r\n let currentInputSourceType = null;\r\n if (this._myGamepad.getHandPose() != null) {\r\n currentInputSourceType = this._myGamepad.getHandPose().getInputSourceType();\r\n }\r\n\r\n if (this._myPrevInputSourceType != currentInputSourceType) {\r\n this.throw();\r\n }\r\n this._myPrevInputSourceType = currentInputSourceType;\r\n\r\n if (this._myGrabButton != 1 || currentInputSourceType == InputSourceType.TRACKED_HAND) {\r\n if (this._myGamepad.getButtonInfo(GamepadButtonID.SELECT).isPressStart()) {\r\n this._grab(GamepadButtonID.SELECT);\r\n } else if (this._myGamepad.getButtonInfo(GamepadButtonID.SELECT).isPressEnd()) {\r\n this._throw(GamepadButtonID.SELECT);\r\n }\r\n }\r\n\r\n if (this._myGrabButton != 0) {\r\n if (this._myGamepad.getButtonInfo(GamepadButtonID.SQUEEZE).isPressStart()) {\r\n this._grab(GamepadButtonID.SQUEEZE);\r\n } else if (this._myGamepad.getButtonInfo(GamepadButtonID.SQUEEZE).isPressEnd()) {\r\n this._throw(GamepadButtonID.SQUEEZE);\r\n }\r\n }\r\n\r\n this._updateLinearVelocityHistory();\r\n this._updateAngularVelocityHistory();\r\n }\r\n\r\n grab(grabButton = null) {\r\n this._grab(grabButton);\r\n }\r\n\r\n throw(throwButton = null) {\r\n this._throw(throwButton);\r\n }\r\n\r\n getGamepad() {\r\n return this._myGamepad;\r\n }\r\n\r\n getHandedness() {\r\n return InputUtils.getHandednessByIndex(this._myHandedness);\r\n }\r\n\r\n registerGrabEventListener(id, listener) {\r\n this._myGrabEmitter.add(listener, { id: id });\r\n }\r\n\r\n unregisterGrabEventListener(id) {\r\n this._myGrabEmitter.remove(id);\r\n }\r\n\r\n registerThrowEventListener(id, listener) {\r\n this._myThrowEmitter.add(listener, { id: id });\r\n }\r\n\r\n unregisterThrowEventListener(id) {\r\n this._myThrowEmitter.remove(id);\r\n }\r\n\r\n onActivate() {\r\n this._myCollisionsCollector.setActive(true);\r\n }\r\n\r\n onDeactivate() {\r\n this.throw();\r\n\r\n this._myHandLinearVelocityHistory = new Array(this._myLinearVelocityHistorySize);\r\n this._myHandLinearVelocityHistory.fill(vec3_create());\r\n\r\n this._myHandAngularVelocityHistory = new Array(this._myAngularVelocityHistorySize);\r\n this._myHandAngularVelocityHistory.fill(vec3_create());\r\n\r\n this._myCollisionsCollector.setActive(false);\r\n }\r\n\r\n _grab(grabButton) {\r\n if (this._myGrabbables.length >= this._myMaxNumberOfObjects) {\r\n return;\r\n }\r\n\r\n if (this._myGrabButton == 2 || this._myActiveGrabButton == null || this._myActiveGrabButton == grabButton || grabButton == null) {\r\n let grabbablesToGrab = [];\r\n\r\n let collisions = this._myCollisionsCollector.getCollisions();\r\n for (let i = 0; i < collisions.length; i++) {\r\n let grabbable = collisions[i].object.pp_getComponent(GrabbableComponent);\r\n if (grabbable && grabbable.active) {\r\n grabbablesToGrab.push(grabbable);\r\n }\r\n }\r\n\r\n let grabberPosition = this.object.pp_getPosition();\r\n grabbablesToGrab.sort(function (first, second) {\r\n let firstPosition = first.object.pp_getPosition();\r\n let secondPosition = second.object.pp_getPosition();\r\n\r\n let firstDistance = firstPosition.vec3_distance(grabberPosition);\r\n let secondDistance = secondPosition.vec3_distance(grabberPosition);\r\n\r\n return Math.pp_sign(firstDistance - secondDistance, 0);\r\n });\r\n\r\n for (let grabbableToGrab of grabbablesToGrab) {\r\n if (!this._isAlreadyGrabbed(grabbableToGrab)) {\r\n let grabbableData = new _GrabberHandComponentGrabbableData(grabbableToGrab, this._myThrowVelocitySource == 1, this._myLinearVelocityHistorySize, this._myAngularVelocityHistorySize);\r\n this._myGrabbables.push(grabbableData);\r\n grabbableToGrab.grab(this.object);\r\n grabbableToGrab.registerReleaseEventListener(this, this._onRelease.bind(this));\r\n\r\n if (this._mySnapGrabbableToOrigin) {\r\n grabbableToGrab.object.pp_resetPositionLocal();\r\n }\r\n\r\n this._myGrabEmitter.notify(this, grabbableToGrab);\r\n }\r\n\r\n if (this._myGrabbables.length >= this._myMaxNumberOfObjects) {\r\n break;\r\n }\r\n }\r\n\r\n if (this._myGrabbables.length > 0) {\r\n if (this._myActiveGrabButton == null) {\r\n this._myActiveGrabButton = grabButton;\r\n }\r\n }\r\n }\r\n }\r\n\r\n _throw(throwButton) {\r\n if (this._myGrabButton == 2 || this._myActiveGrabButton == null || this._myActiveGrabButton == throwButton || throwButton == null) {\r\n if (this._myGrabbables.length > 0) {\r\n let linearVelocity = null;\r\n let angularVelocity = null;\r\n\r\n if (this._myThrowVelocitySource == 0) {\r\n linearVelocity = this._computeReleaseLinearVelocity(this._myHandLinearVelocityHistory);\r\n angularVelocity = this._computeReleaseAngularVelocity(this._myHandAngularVelocityHistory);\r\n }\r\n\r\n for (let grabbableData of this._myGrabbables) {\r\n let grabbable = grabbableData.getGrabbable();\r\n\r\n grabbable.unregisterReleaseEventListener(this);\r\n\r\n if (this._myThrowVelocitySource == 1) {\r\n linearVelocity = this._computeReleaseLinearVelocity(grabbableData.getLinearVelocityHistory());\r\n angularVelocity = this._computeReleaseAngularVelocity(grabbableData.getAngularVelocityHistory());\r\n }\r\n\r\n grabbable.throw(linearVelocity, angularVelocity);\r\n\r\n this._myThrowEmitter.notify(this, grabbable);\r\n }\r\n\r\n this._myGrabbables = [];\r\n }\r\n\r\n this._myActiveGrabButton = null;\r\n }\r\n }\r\n\r\n _onRelease(grabber, grabbable) {\r\n grabbable.unregisterReleaseEventListener(this);\r\n this._myGrabbables.pp_remove(element => element.getGrabbable() == grabbable);\r\n\r\n if (this._myGrabbables.length <= 0) {\r\n this._myActiveGrabButton = null;\r\n }\r\n }\r\n\r\n _updateLinearVelocityHistory() {\r\n const velocityToReuse = this._myHandLinearVelocityHistory.pop();\r\n\r\n let handPose = this._myGamepad.getHandPose();\r\n if (handPose != null) {\r\n this._myHandLinearVelocityHistory.unshift(handPose.getLinearVelocity(velocityToReuse));\r\n } else {\r\n velocityToReuse.vec3_zero();\r\n this._myHandLinearVelocityHistory.unshift(velocityToReuse);\r\n }\r\n\r\n for (let grabbable of this._myGrabbables) {\r\n grabbable.updateLinearVelocityHistory();\r\n }\r\n }\r\n\r\n _updateAngularVelocityHistory() {\r\n const velocityToReuse = this._myHandAngularVelocityHistory.pop();\r\n\r\n let handPose = this._myGamepad.getHandPose();\r\n if (handPose != null) {\r\n this._myHandAngularVelocityHistory.unshift(handPose.getAngularVelocityRadians(velocityToReuse));\r\n } else {\r\n velocityToReuse.vec3_zero();\r\n this._myHandAngularVelocityHistory.unshift(velocityToReuse);\r\n }\r\n\r\n for (let grabbable of this._myGrabbables) {\r\n grabbable.updateAngularVelocityHistory();\r\n }\r\n }\r\n\r\n _computeReleaseLinearVelocity(linearVelocityHistory) {\r\n // Speed\r\n let speed = linearVelocityHistory[0].vec3_length();\r\n for (let i = 1; i < this._myLinearVelocityHistorySpeedAverageSamplesFromStart; i++) {\r\n speed += linearVelocityHistory[i].vec3_length();\r\n }\r\n speed /= this._myLinearVelocityHistorySpeedAverageSamplesFromStart;\r\n\r\n // This way I give an increasing and smooth boost to the throw so that when u want to perform a weak throw, the value is not changed, but if u put more speed\r\n // it will be boosted to make it easier and still feel good and natural (value does not increase suddenly)\r\n let speedEaseMultiplier = Math.pp_mapToRange(speed, this._myThrowLinearVelocityBoostMinSpeedThreshold, this._myThrowLinearVelocityBoostMaxSpeedThreshold, 0, 1);\r\n speedEaseMultiplier = EasingFunction.easeIn(speedEaseMultiplier);\r\n\r\n // Add the boost to the speed\r\n let extraSpeed = speed * (speedEaseMultiplier * this._myThrowLinearVelocityBoost);\r\n speed += extraSpeed;\r\n speed *= this._myThrowLinearVelocityMultiplier;\r\n speed = Math.pp_clamp(speed, 0, this._myThrowMaxLinearSpeed);\r\n\r\n if (this._myDebugEnabled && Globals.isDebugEnabled(this.engine)) {\r\n this._debugDirectionLines(linearVelocityHistory);\r\n }\r\n\r\n // Direction\r\n let directionCurrentWeight = this._myLinearVelocityHistoryDirectionAverageSamplesFromStart;\r\n let lastDirectionIndex = this._myLinearVelocityHistoryDirectionAverageSkipFromStart + this._myLinearVelocityHistoryDirectionAverageSamplesFromStart;\r\n let direction = vec3_create();\r\n for (let i = this._myLinearVelocityHistoryDirectionAverageSkipFromStart; i < lastDirectionIndex; i++) {\r\n let currentDirection = linearVelocityHistory[i];\r\n currentDirection.vec3_scale(directionCurrentWeight, currentDirection);\r\n direction.vec3_add(currentDirection, direction);\r\n\r\n directionCurrentWeight--;\r\n }\r\n direction.vec3_normalize(direction);\r\n\r\n direction.vec3_scale(speed, direction);\r\n\r\n return direction;\r\n }\r\n\r\n _computeReleaseAngularVelocity(angularVelocityHistory) {\r\n let angularVelocity = angularVelocityHistory[0];\r\n\r\n // Speed\r\n let speed = angularVelocity.vec3_length();\r\n\r\n speed = Math.pp_clamp(speed * this._myThrowAngularVelocityMultiplier, 0, this._myThrowMaxAngularSpeedRadians);\r\n\r\n // Direction\r\n let direction = angularVelocity.vec3_clone();\r\n direction.vec3_normalize(direction);\r\n\r\n direction.vec3_scale(speed, direction);\r\n\r\n return direction;\r\n }\r\n\r\n _debugDirectionLines(linearVelocityHistory) {\r\n for (let j = this._myLinearVelocityHistoryDirectionAverageSkipFromStart + this._myLinearVelocityHistoryDirectionAverageSamplesFromStart; j > this._myLinearVelocityHistoryDirectionAverageSkipFromStart; j--) {\r\n\r\n let directionCurrentWeight = j - this._myLinearVelocityHistoryDirectionAverageSkipFromStart;\r\n let lastDirectionIndex = j - this._myLinearVelocityHistoryDirectionAverageSkipFromStart;\r\n let direction = vec3_create();\r\n for (let i = this._myLinearVelocityHistoryDirectionAverageSkipFromStart; i < lastDirectionIndex; i++) {\r\n let currentDirection = linearVelocityHistory[i].pp_clone();\r\n currentDirection.vec3_scale(directionCurrentWeight, currentDirection);\r\n direction.vec3_add(currentDirection, direction);\r\n\r\n directionCurrentWeight--;\r\n }\r\n direction.vec3_normalize(direction);\r\n\r\n let color = 1 / j;\r\n\r\n Globals.getDebugVisualManager(this.engine).drawLine(5, this.object.pp_getPosition(), direction, 0.2, vec4_create(color, color, color, 1));\r\n }\r\n }\r\n\r\n _isAlreadyGrabbed(grabbable) {\r\n let found = this._myGrabbables.pp_find(element => element.getGrabbable() == grabbable);\r\n return found != null;\r\n }\r\n\r\n onDestroy() {\r\n this._myCollisionsCollector.destroy();\r\n }\r\n}\r\n\r\nclass _GrabberHandComponentGrabbableData {\r\n\r\n constructor(grabbable, useGrabbableAsVelocitySource, linearVelocityHistorySize, angularVelocityHistorySize) {\r\n this._myGrabbable = grabbable;\r\n this._myUseGrabbableAsVelocitySource = useGrabbableAsVelocitySource;\r\n\r\n if (this._myUseGrabbableAsVelocitySource) {\r\n this._myLinearVelocityHistory = new Array(linearVelocityHistorySize);\r\n this._myLinearVelocityHistory.fill(vec3_create());\r\n\r\n this._myAngularVelocityHistory = new Array(angularVelocityHistorySize);\r\n this._myAngularVelocityHistory.fill(vec3_create());\r\n }\r\n }\r\n\r\n getGrabbable() {\r\n return this._myGrabbable;\r\n }\r\n\r\n getLinearVelocityHistory() {\r\n return this._myLinearVelocityHistory;\r\n }\r\n\r\n getAngularVelocityHistory() {\r\n return this._myAngularVelocityHistory;\r\n }\r\n\r\n updateLinearVelocityHistory() {\r\n if (this._myUseGrabbableAsVelocitySource) {\r\n this._myLinearVelocityHistory.unshift(this._myGrabbable.getLinearVelocity());\r\n this._myLinearVelocityHistory.pop();\r\n }\r\n }\r\n\r\n updateAngularVelocityHistory() {\r\n if (this._myUseGrabbableAsVelocitySource) {\r\n this._myAngularVelocityHistory.unshift(this._myGrabbable.getAngularVelocityRadians());\r\n this._myAngularVelocityHistory.pop();\r\n }\r\n }\r\n}", "let _myDummyServer = null;\r\nlet _myUseDummyServerOnSDKMissing = false;\r\nlet _myUseDummyServerOnError = false;\r\n\r\nexport let CAError = {\r\n NONE: 0,\r\n CA_SDK_MISSING: 1,\r\n DUMMY_NOT_INITIALIZED: 2,\r\n GET_LEADERBOARD_FAILED: 3,\r\n SUBMIT_SCORE_FAILED: 4,\r\n GET_USER_FAILED: 5,\r\n USER_NOT_LOGGED_IN: 6,\r\n USER_HAS_NO_SCORE: 7\r\n};\r\n\r\nexport function setUseDummyServerOnSDKMissing(useDummyServer) {\r\n _myUseDummyServerOnSDKMissing = useDummyServer;\r\n}\r\n\r\nexport function setUseDummyServerOnError(useDummyServer) {\r\n _myUseDummyServerOnError = useDummyServer;\r\n}\r\n\r\nexport function setDummyServer(dummyServer) {\r\n _myDummyServer = dummyServer;\r\n}\r\n\r\nexport function isUseDummyServerOnSDKMissing() {\r\n return _myUseDummyServerOnSDKMissing;\r\n}\r\n\r\nexport function isUseDummyServerOnError() {\r\n return _myUseDummyServerOnError;\r\n}\r\n\r\nexport function getDummyServer() {\r\n return _myDummyServer;\r\n}\r\n\r\nexport function isSDKAvailable() {\r\n return window.heyVR != null;\r\n}\r\n\r\nexport function getSDK() {\r\n return window.heyVR;\r\n}\r\n\r\nexport function getLeaderboard(leaderboardID, ascending, aroundPlayer, scoresAmount, onDoneCallback = null, onErrorCallback = null, useDummyServerOverride = null) {\r\n if (CAUtils.isSDKAvailable()) {\r\n try {\r\n _getLeaderboard(leaderboardID, ascending, aroundPlayer, scoresAmount).then(function (result) {\r\n if (result.leaderboard != null) {\r\n if (!aroundPlayer) {\r\n if (onDoneCallback != null) {\r\n onDoneCallback(result.leaderboard);\r\n }\r\n } else {\r\n let userLeaderboard = result.leaderboard;\r\n CAUtils.getUser(\r\n function (user) {\r\n let userName = user.displayName;\r\n let userValid = false;\r\n for (let userLeaderboardEntry of userLeaderboard) {\r\n if (userLeaderboardEntry.displayName == userName) {\r\n userValid = true;\r\n break;\r\n }\r\n }\r\n if (userValid) {\r\n if (onDoneCallback != null) {\r\n onDoneCallback(userLeaderboard);\r\n }\r\n } else {\r\n if (_myDummyServer != null && _myDummyServer.getLeaderboard != null &&\r\n (_myUseDummyServerOnError && useDummyServerOverride == null) || (useDummyServerOverride != null && useDummyServerOverride)) {\r\n CAUtils.getLeaderboardDummy(leaderboardID, ascending, aroundPlayer, scoresAmount, onDoneCallback, onErrorCallback, CAError.USER_HAS_NO_SCORE);\r\n } else if (onErrorCallback != null) {\r\n let error = {};\r\n error.reason = \"Searching for around player but the user has not submitted a score yet\";\r\n error.type = CAError.USER_HAS_NO_SCORE;\r\n onErrorCallback(error, null);\r\n }\r\n }\r\n },\r\n function (error, result) {\r\n if (_myDummyServer != null && _myDummyServer.getLeaderboard != null &&\r\n (_myUseDummyServerOnError && useDummyServerOverride == null) || (useDummyServerOverride != null && useDummyServerOverride)) {\r\n CAUtils.getLeaderboardDummy(leaderboardID, ascending, aroundPlayer, scoresAmount, onDoneCallback, onErrorCallback, error.type);\r\n } else if (onErrorCallback != null) {\r\n onErrorCallback(error, result);\r\n }\r\n },\r\n false);\r\n }\r\n } else {\r\n if (_myDummyServer != null && _myDummyServer.getLeaderboard != null &&\r\n (_myUseDummyServerOnError && useDummyServerOverride == null) || (useDummyServerOverride != null && useDummyServerOverride)) {\r\n CAUtils.getLeaderboardDummy(leaderboardID, ascending, aroundPlayer, scoresAmount, onDoneCallback, onErrorCallback, CAError.GET_LEADERBOARD_FAILED);\r\n } else if (onErrorCallback != null) {\r\n let error = {};\r\n error.reason = \"Get leaderboard failed\";\r\n error.type = CAError.GET_LEADERBOARD_FAILED;\r\n onErrorCallback(error, result);\r\n }\r\n }\r\n }).catch(function (result) {\r\n if (_myDummyServer != null && _myDummyServer.getLeaderboard != null &&\r\n (_myUseDummyServerOnError && useDummyServerOverride == null) || (useDummyServerOverride != null && useDummyServerOverride)) {\r\n CAUtils.getLeaderboardDummy(leaderboardID, ascending, aroundPlayer, scoresAmount, onDoneCallback, onErrorCallback, CAError.GET_LEADERBOARD_FAILED);\r\n } else if (onErrorCallback != null) {\r\n let error = {};\r\n error.reason = \"Get leaderboard failed\";\r\n error.type = CAError.GET_LEADERBOARD_FAILED;\r\n onErrorCallback(error, result);\r\n }\r\n });\r\n } catch (error) {\r\n if (_myDummyServer != null && _myDummyServer.getLeaderboard != null &&\r\n (_myUseDummyServerOnError && useDummyServerOverride == null) || (useDummyServerOverride != null && useDummyServerOverride)) {\r\n CAUtils.getLeaderboardDummy(leaderboardID, ascending, aroundPlayer, scoresAmount, onDoneCallback, onErrorCallback, CAError.GET_LEADERBOARD_FAILED);\r\n } else if (onErrorCallback != null) {\r\n let error = {};\r\n error.reason = \"Get leaderboard failed\";\r\n error.type = CAError.GET_LEADERBOARD_FAILED;\r\n onErrorCallback(error, null);\r\n }\r\n }\r\n } else {\r\n if (_myDummyServer != null && _myDummyServer.getLeaderboard != null &&\r\n (_myUseDummyServerOnSDKMissing && useDummyServerOverride == null) || (useDummyServerOverride != null && useDummyServerOverride)) {\r\n CAUtils.getLeaderboardDummy(leaderboardID, ascending, aroundPlayer, scoresAmount, onDoneCallback, onErrorCallback, CAError.CA_SDK_MISSING);\r\n } else if (onErrorCallback != null) {\r\n let error = {};\r\n error.reason = \"Construct Arcade SDK missing\";\r\n error.type = CAError.CA_SDK_MISSING;\r\n onErrorCallback(error, null);\r\n }\r\n }\r\n}\r\n\r\nexport function getLeaderboardDummy(leaderboardID, ascending, aroundPlayer, scoresAmount, onDoneCallback = null, onErrorCallback = null, caError = CAError.NONE) {\r\n if (_myDummyServer) {\r\n _myDummyServer.getLeaderboard(leaderboardID, ascending, aroundPlayer, scoresAmount, onDoneCallback, onErrorCallback, caError);\r\n } else {\r\n if (onErrorCallback != null) {\r\n let error = {};\r\n error.reason = \"Dummy server not initialized\";\r\n error.type = CAError.DUMMY_NOT_INITIALIZED;\r\n onErrorCallback(error, null);\r\n }\r\n }\r\n}\r\n\r\nexport function submitScore(leaderboardID, scoreToSubmit, onDoneCallback = null, onErrorCallback = null, useDummyServerOverride = null) {\r\n if (CAUtils.isSDKAvailable()) {\r\n try {\r\n _submitScore(leaderboardID, scoreToSubmit).then(function (result) {\r\n if (result.scoreSubmitted) {\r\n if (onDoneCallback != null) {\r\n onDoneCallback();\r\n }\r\n } else if (result.scoreSubmitted != null) {\r\n if (_myDummyServer != null && _myDummyServer.submitScore != null &&\r\n (_myUseDummyServerOnError && useDummyServerOverride == null) || (useDummyServerOverride != null && useDummyServerOverride)) {\r\n CAUtils.submitScoreDummy(leaderboardID, scoreToSubmit, onDoneCallback, onErrorCallback, CAError.USER_NOT_LOGGED_IN);\r\n } else if (onErrorCallback != null) {\r\n let error = {};\r\n error.reason = \"The score can't be submitted because the user is not logged in\";\r\n error.type = CAError.USER_NOT_LOGGED_IN;\r\n onErrorCallback(error, result);\r\n }\r\n } else {\r\n if (_myDummyServer != null && _myDummyServer.submitScore != null &&\r\n (_myUseDummyServerOnError && useDummyServerOverride == null) || (useDummyServerOverride != null && useDummyServerOverride)) {\r\n CAUtils.submitScoreDummy(leaderboardID, scoreToSubmit, onDoneCallback, onErrorCallback, CAError.SUBMIT_SCORE_FAILED);\r\n } else if (onErrorCallback != null) {\r\n let error = {};\r\n error.reason = \"Submit score failed\";\r\n error.type = CAError.SUBMIT_SCORE_FAILED;\r\n onErrorCallback(error, result);\r\n }\r\n }\r\n }).catch(function (result) {\r\n if (_myDummyServer != null && _myDummyServer.submitScore != null &&\r\n (_myUseDummyServerOnError && useDummyServerOverride == null) || (useDummyServerOverride != null && useDummyServerOverride)) {\r\n CAUtils.submitScoreDummy(leaderboardID, scoreToSubmit, onDoneCallback, onErrorCallback, CAError.SUBMIT_SCORE_FAILED);\r\n } else if (onErrorCallback != null) {\r\n let error = {};\r\n error.reason = \"Submit score failed\";\r\n error.type = CAError.SUBMIT_SCORE_FAILED;\r\n onErrorCallback(error, result);\r\n }\r\n });\r\n } catch (error) {\r\n if (_myDummyServer != null && _myDummyServer.submitScore != null &&\r\n (_myUseDummyServerOnError && useDummyServerOverride == null) || (useDummyServerOverride != null && useDummyServerOverride)) {\r\n CAUtils.submitScoreDummy(leaderboardID, scoreToSubmit, onDoneCallback, onErrorCallback, CAError.SUBMIT_SCORE_FAILED);\r\n } else if (onErrorCallback != null) {\r\n let error = {};\r\n error.reason = \"Submit score failed\";\r\n error.type = CAError.SUBMIT_SCORE_FAILED;\r\n onErrorCallback(error, null);\r\n }\r\n }\r\n } else {\r\n if (_myDummyServer != null && _myDummyServer.submitScore != null &&\r\n (_myUseDummyServerOnSDKMissing && useDummyServerOverride == null) || (useDummyServerOverride != null && useDummyServerOverride)) {\r\n CAUtils.submitScoreDummy(leaderboardID, scoreToSubmit, onDoneCallback, onErrorCallback, CAError.CA_SDK_MISSING);\r\n } else if (onErrorCallback != null) {\r\n let error = {};\r\n error.reason = \"Construct Arcade SDK missing\";\r\n error.type = CAError.CA_SDK_MISSING;\r\n onErrorCallback(error, null);\r\n }\r\n }\r\n}\r\n\r\nexport function submitScoreDummy(leaderboardID, scoreToSubmit, onDoneCallback = null, onErrorCallback = null, caError = CAError.NONE) {\r\n if (_myDummyServer) {\r\n _myDummyServer.submitScore(leaderboardID, scoreToSubmit, onDoneCallback, onErrorCallback, caError);\r\n } else {\r\n if (onErrorCallback != null) {\r\n let error = {};\r\n error.reason = \"Dummy server not initialized\";\r\n error.type = CAError.DUMMY_NOT_INITIALIZED;\r\n onErrorCallback(error, null);\r\n }\r\n }\r\n}\r\n\r\nexport function getUser(onDoneCallback = null, onErrorCallback = null, useDummyServerOverride = null) {\r\n if (CAUtils.isSDKAvailable()) {\r\n try {\r\n _getUser().then(function (result) {\r\n if (result.user != null && result.user.displayName != null) {\r\n if (onDoneCallback != null) {\r\n onDoneCallback(result.user);\r\n }\r\n } else if (result.user != null) {\r\n if (_myDummyServer != null && _myDummyServer.getUser != null &&\r\n (_myUseDummyServerOnError && useDummyServerOverride == null) || (useDummyServerOverride != null && useDummyServerOverride)) {\r\n CAUtils.getUserDummy(onDoneCallback, onErrorCallback, CAError.USER_NOT_LOGGED_IN);\r\n } else if (onErrorCallback != null) {\r\n let error = {};\r\n error.reason = \"User not logged in\";\r\n error.type = CAError.USER_NOT_LOGGED_IN;\r\n onErrorCallback(error, result);\r\n }\r\n } else {\r\n if (_myDummyServer != null && _myDummyServer.getUser != null &&\r\n (_myUseDummyServerOnError && useDummyServerOverride == null) || (useDummyServerOverride != null && useDummyServerOverride)) {\r\n CAUtils.getUserDummy(onDoneCallback, onErrorCallback, CAError.GET_USER_FAILED);\r\n } else if (onErrorCallback != null) {\r\n let error = {};\r\n error.reason = \"Get user failed\";\r\n error.type = CAError.GET_USER_FAILED;\r\n onErrorCallback(error, result);\r\n }\r\n }\r\n }).catch(function (result) {\r\n if (_myDummyServer != null && _myDummyServer.getUser != null &&\r\n (_myUseDummyServerOnError && useDummyServerOverride == null) || (useDummyServerOverride != null && useDummyServerOverride)) {\r\n CAUtils.getUserDummy(onDoneCallback, onErrorCallback, CAError.GET_USER_FAILED);\r\n } else if (onErrorCallback != null) {\r\n let error = {};\r\n error.reason = \"Get user failed\";\r\n error.type = CAError.GET_USER_FAILED;\r\n onErrorCallback(error, result);\r\n }\r\n });\r\n } catch (error) {\r\n if (_myDummyServer != null && _myDummyServer.getUser != null &&\r\n (_myUseDummyServerOnError && useDummyServerOverride == null) || (useDummyServerOverride != null && useDummyServerOverride)) {\r\n CAUtils.getUserDummy(onDoneCallback, onErrorCallback, CAError.GET_USER_FAILED);\r\n } else if (onErrorCallback != null) {\r\n let error = {};\r\n error.reason = \"Get user failed\";\r\n error.type = CAError.GET_USER_FAILED;\r\n onErrorCallback(error, null);\r\n }\r\n }\r\n } else {\r\n if (_myDummyServer != null && _myDummyServer.getUser != null &&\r\n (_myUseDummyServerOnSDKMissing && useDummyServerOverride == null) || (useDummyServerOverride != null && useDummyServerOverride)) {\r\n CAUtils.getUserDummy(onDoneCallback, onErrorCallback, CAError.CA_SDK_MISSING);\r\n } else if (onErrorCallback != null) {\r\n let error = {};\r\n error.reason = \"Construct Arcade SDK missing\";\r\n error.type = CAError.CA_SDK_MISSING;\r\n onErrorCallback(error, null);\r\n }\r\n }\r\n}\r\n\r\nexport function getUserDummy(onDoneCallback = null, onErrorCallback = null, caError = CAError.NONE) {\r\n if (_myDummyServer) {\r\n _myDummyServer.getUser(onDoneCallback, onErrorCallback, caError);\r\n } else {\r\n if (onErrorCallback != null) {\r\n let error = {};\r\n error.reason = \"Dummy server not initialized\";\r\n error.type = CAError.DUMMY_NOT_INITIALIZED;\r\n onErrorCallback(error, null);\r\n }\r\n }\r\n}\r\n\r\nexport let CAUtils = {\r\n setUseDummyServerOnSDKMissing,\r\n setUseDummyServerOnError,\r\n setDummyServer,\r\n isUseDummyServerOnSDKMissing,\r\n isUseDummyServerOnError,\r\n getDummyServer,\r\n isSDKAvailable,\r\n getSDK,\r\n getLeaderboard,\r\n getLeaderboardDummy,\r\n submitScore,\r\n submitScoreDummy,\r\n getUser,\r\n getUserDummy\r\n};\r\n\r\n\r\n\r\n\r\nfunction _getLeaderboard(leaderboardID, ascending, aroundPlayer, scoresAmount) {\r\n let heyVR = CAUtils.getSDK();\r\n\r\n if (aroundPlayer) {\r\n return heyVR.leaderboard.getMy(leaderboardID, scoresAmount).then(function (result) {\r\n let adjustedLeaderboard = [];\r\n for (let leaderboardEntry of result) {\r\n adjustedLeaderboard.push({ rank: leaderboardEntry.rank - 1, displayName: leaderboardEntry.user, score: leaderboardEntry.score });\r\n }\r\n return { leaderboard: adjustedLeaderboard };\r\n }).catch(function (error) {\r\n if (error != null && error.status != null && error.status.debug == \"err_unauthenticated\") {\r\n return { leaderboard: [] };\r\n } else {\r\n return { leaderboard: null };\r\n }\r\n });\r\n } else {\r\n return heyVR.leaderboard.get(leaderboardID, scoresAmount).then(function (result) {\r\n let adjustedLeaderboard = [];\r\n for (let leaderboardEntry of result) {\r\n adjustedLeaderboard.push({ rank: leaderboardEntry.rank - 1, displayName: leaderboardEntry.user, score: leaderboardEntry.score });\r\n }\r\n return { leaderboard: adjustedLeaderboard };\r\n }).catch(function () {\r\n return { leaderboard: null };\r\n });\r\n }\r\n}\r\n\r\nfunction _submitScore(leaderboardID, scoreToSubmit) {\r\n let heyVR = CAUtils.getSDK();\r\n return heyVR.leaderboard.postScore(leaderboardID, scoreToSubmit).then(function () {\r\n return { scoreSubmitted: true };\r\n }).catch(function (error) {\r\n if (error != null && error.status != null && error.status.debug == \"err_unauthenticated\") {\r\n return { scoreSubmitted: false };\r\n } else {\r\n return { scoreSubmitted: null };\r\n }\r\n });\r\n}\r\n\r\nfunction _getUser() {\r\n let heyVR = CAUtils.getSDK();\r\n return heyVR.user.getName().then(result => {\r\n return { user: { displayName: result } };\r\n }).catch(function (error) {\r\n if (error != null && error.status != null && error.status.debug == \"err_unauthenticated\") {\r\n return { user: { displayName: null } };\r\n } else {\r\n return { user: null };\r\n }\r\n });\r\n}", "import { CAError } from \"./ca_utils.js\";\r\n\r\nexport class CADummyServer {\r\n\r\n constructor() {\r\n\r\n }\r\n\r\n getLeaderboard(leaderboardID, ascending, aroundPlayer, scoresAmount, onDoneCallback = null, onErrorCallback = null, caError = CAError.NONE) {\r\n let leaderboard = null;\r\n\r\n if (caError != CAError.CA_SDK_MISSING) {\r\n if (aroundPlayer && (caError == CAError.USER_NOT_LOGGED_IN || caError == CAError.USER_HAS_NO_SCORE)) {\r\n leaderboard = [\r\n { rank: 0, displayName: \"Sign In\", score: 0 },\r\n { rank: 1, displayName: \"And\", score: 0 },\r\n { rank: 2, displayName: \"Play\", score: 0 },\r\n { rank: 3, displayName: \"On\", score: 0 },\r\n { rank: 4, displayName: \"HeyVR\", score: 0 },\r\n { rank: 5, displayName: \"To\", score: 0 },\r\n { rank: 6, displayName: \"Submit\", score: 0 },\r\n { rank: 7, displayName: \"Your\", score: 0 },\r\n { rank: 8, displayName: \"Own\", score: 0 },\r\n { rank: 9, displayName: \"Score\", score: 0 }\r\n ];\r\n } else {\r\n leaderboard = [\r\n { rank: 0, displayName: \"An\", score: 0 },\r\n { rank: 1, displayName: \"Error\", score: 0 },\r\n { rank: 2, displayName: \"Has\", score: 0 },\r\n { rank: 3, displayName: \"Occurred\", score: 0 },\r\n { rank: 4, displayName: \"While\", score: 0 },\r\n { rank: 5, displayName: \"Trying\", score: 0 },\r\n { rank: 6, displayName: \"To\", score: 0 },\r\n { rank: 7, displayName: \"Retrieve\", score: 0 },\r\n { rank: 8, displayName: \"The\", score: 0 },\r\n { rank: 9, displayName: \"Leaderboard\", score: 0 }\r\n ];\r\n }\r\n } else {\r\n if (aroundPlayer) {\r\n leaderboard = [\r\n { rank: 0, displayName: \"Sign In\", score: 0 },\r\n { rank: 1, displayName: \"And\", score: 0 },\r\n { rank: 2, displayName: \"Play\", score: 0 },\r\n { rank: 3, displayName: \"On\", score: 0 },\r\n { rank: 4, displayName: \"HeyVR\", score: 0 },\r\n { rank: 5, displayName: \"To\", score: 0 },\r\n { rank: 6, displayName: \"Submit\", score: 0 },\r\n { rank: 7, displayName: \"Your\", score: 0 },\r\n { rank: 8, displayName: \"Own\", score: 0 },\r\n { rank: 9, displayName: \"Score\", score: 0 }\r\n ];\r\n } else {\r\n leaderboard = [\r\n { rank: 0, displayName: \"The\", score: 0 },\r\n { rank: 1, displayName: \"Top 10\", score: 0 },\r\n { rank: 2, displayName: \"Leaderboard\", score: 0 },\r\n { rank: 3, displayName: \"Is\", score: 0 },\r\n { rank: 4, displayName: \"Available\", score: 0 },\r\n { rank: 5, displayName: \"Only\", score: 0 },\r\n { rank: 5, displayName: \"When\", score: 0 },\r\n { rank: 7, displayName: \"Playing\", score: 0 },\r\n { rank: 8, displayName: \"On\", score: 0 },\r\n { rank: 9, displayName: \"HeyVR\", score: 0 },\r\n ];\r\n }\r\n }\r\n\r\n while (leaderboard.length > scoresAmount) {\r\n leaderboard.pop();\r\n }\r\n\r\n if (onDoneCallback != null) {\r\n onDoneCallback(leaderboard);\r\n }\r\n }\r\n\r\n submitScore(leaderboardID, scoreToSubmit, onDoneCallback = null, onErrorCallback = null, caError = CAError.NONE) {\r\n if (onDoneCallback != null) {\r\n onDoneCallback();\r\n }\r\n }\r\n\r\n getUser(onDoneCallback = null, onErrorCallback = null, caError = CAError.NONE) {\r\n let user = {};\r\n user.displayName = \"Florian\";\r\n\r\n if (onDoneCallback != null) {\r\n onDoneCallback(user);\r\n }\r\n }\r\n}", "import { Component, Property, TextComponent } from \"@wonderlandengine/api\";\r\nimport { ComponentUtils } from \"../../../cauldron/wl/utils/component_utils.js\";\r\nimport { CADummyServer } from \"./ca_dummy_server.js\";\r\nimport { CAUtils } from \"./ca_utils.js\";\r\n\r\nexport class CADisplayLeaderboardComponent extends Component {\r\n static TypeName = \"pp-ca-display-leaderboard\";\r\n static Properties = {\r\n _myUsernamesTextObject: Property.object(),\r\n _myScoresTextObject: Property.object(),\r\n _myLeaderboardID: Property.string(\"\"),\r\n _myLocal: Property.bool(false),\r\n _myAscending: Property.bool(false),\r\n _myScoresAmount: Property.int(10),\r\n _myScoreFormat: Property.enum([\"Value\", \"Hours:Minutes:Seconds\", \"Minutes:Seconds\", \"Seconds\", \"Hours:Minutes\", \"Minutes\"], \"Value\"),\r\n _myPositionAndUsernameSeparator: Property.string(\" - \"),\r\n _myNumberOfLinesBetweenScores: Property.int(1),\r\n _myAddDefaultCADummyServer: Property.bool(false)\r\n };\r\n\r\n init() {\r\n this._myUsernamesTextComponent = null;\r\n this._myScoresTextComponent = null;\r\n\r\n this._myStarted = false;\r\n }\r\n\r\n start() {\r\n if (this._myAddDefaultCADummyServer) {\r\n CAUtils.setDummyServer(new CADummyServer());\r\n CAUtils.setUseDummyServerOnSDKMissing(true);\r\n CAUtils.setUseDummyServerOnError(true);\r\n }\r\n }\r\n\r\n update(dt) {\r\n if (!this._myStarted) {\r\n this._myStarted = true;\r\n\r\n if (this._myUsernamesTextObject != null) {\r\n this._myUsernamesTextComponent = this._myUsernamesTextObject.pp_getComponent(TextComponent);\r\n }\r\n\r\n if (this._myScoresTextObject != null) {\r\n this._myScoresTextComponent = this._myScoresTextObject.pp_getComponent(TextComponent);\r\n }\r\n\r\n this.updateLeaderboard();\r\n }\r\n }\r\n\r\n updateLeaderboard() {\r\n CAUtils.getLeaderboard(this._myLeaderboardID, this._myAscending, this._myLocal, this._myScoresAmount, this._onLeaderboardRetrieved.bind(this));\r\n }\r\n\r\n _onLeaderboardRetrieved(leaderboard) {\r\n if (this._myDestroyed) return;\r\n\r\n let namesText = \"\";\r\n let scoresText = \"\";\r\n\r\n let maxRankDigit = 0;\r\n for (let value of leaderboard) {\r\n let rank = value.rank + 1;\r\n if (rank.toFixed(0).length > maxRankDigit) {\r\n maxRankDigit = rank.toFixed(0).length;\r\n }\r\n }\r\n\r\n for (let value of leaderboard) {\r\n let rank = value.rank + 1;\r\n let fixedRank = rank.toFixed(0);\r\n while (fixedRank.length < maxRankDigit) {\r\n fixedRank = \"0\".concat(fixedRank);\r\n }\r\n\r\n let newlines = \"\\n\";\r\n for (let i = 0; i < this._myNumberOfLinesBetweenScores; i++) {\r\n newlines = newlines + \"\\n\";\r\n }\r\n\r\n namesText = namesText.concat(fixedRank, this._myPositionAndUsernameSeparator, value.displayName, newlines);\r\n\r\n let convertedScore = this._formatScore(value.score);\r\n scoresText = scoresText.concat(convertedScore, newlines);\r\n }\r\n\r\n if (this._myUsernamesTextComponent != null) {\r\n this._myUsernamesTextComponent.text = namesText;\r\n }\r\n\r\n if (this._myScoresTextComponent != null) {\r\n this._myScoresTextComponent.text = scoresText;\r\n }\r\n }\r\n\r\n _formatScore(score) {\r\n let convertedScore = score.toString();\r\n\r\n if (this._myScoreFormat == 1) {\r\n convertedScore = this._formatTime(score, true, true, true);\r\n } else if (this._myScoreFormat == 2) {\r\n convertedScore = this._formatTime(score, false, true, true);\r\n } else if (this._myScoreFormat == 3) {\r\n convertedScore = this._formatTime(score, false, false, true);\r\n } else if (this._myScoreFormat == 4) {\r\n convertedScore = this._formatTime(score, true, true, false);\r\n } else if (this._myScoreFormat == 5) {\r\n convertedScore = this._formatTime(score, false, true, false);\r\n }\r\n\r\n return convertedScore;\r\n }\r\n\r\n _formatTime(score, displayHours, displayMinutes, displaySeconds) {\r\n let time = Math.floor(score / 1000);\r\n\r\n let hours = 0;\r\n if (displayHours) {\r\n hours = Math.floor(time / 3600);\r\n time -= hours * 3600;\r\n }\r\n\r\n let minutes = 0;\r\n if (displayMinutes) {\r\n minutes = Math.floor(time / 60);\r\n time -= minutes * 60;\r\n }\r\n\r\n let seconds = 0;\r\n if (displaySeconds) {\r\n seconds = Math.floor(time);\r\n }\r\n\r\n let convertedTime = \"\";\r\n\r\n if (displaySeconds) {\r\n convertedTime = (seconds.toFixed(0).length < 2 && (displayMinutes || displayHours)) ? \"0\".concat(seconds.toFixed(0)) : seconds.toFixed(0);\r\n }\r\n\r\n if (displayMinutes) {\r\n convertedTime = ((minutes.toFixed(0).length < 2 && (displaySeconds || displayHours)) ? \"0\".concat(minutes.toFixed(0)) : minutes.toFixed(0)) + (displaySeconds ? \":\" + convertedTime : \"\");\r\n }\r\n\r\n if (displayHours) {\r\n convertedTime = ((hours.toFixed(0).length < 2 && (displaySeconds || displayMinutes)) ? \"0\".concat(hours.toFixed(0)) : hours.toFixed(0)) + (displayMinutes ? \":\" + convertedTime : \"\");\r\n }\r\n\r\n return convertedTime;\r\n }\r\n\r\n pp_clone(targetObject) {\r\n let clonedComponent = ComponentUtils.cloneDefault(this, targetObject);\r\n\r\n return clonedComponent;\r\n }\r\n}", "import { vec3_create } from \"../../../../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { CollisionCheckParams } from \"./collision_params.js\";\r\n\r\nexport function generate360TeleportParamsFromMovementParams(movementParams: Readonly, outTeleportParams = new CollisionCheckParams()): CollisionCheckParams {\r\n outTeleportParams.copy(movementParams);\r\n\r\n outTeleportParams.myHalfConeAngle = 180;\r\n outTeleportParams.myHalfConeSliceAmount = Math.round((outTeleportParams.myHalfConeAngle / movementParams.myHalfConeAngle) * movementParams.myHalfConeSliceAmount);\r\n\r\n outTeleportParams.myCheckHorizontalFixedForwardEnabled = true;\r\n outTeleportParams.myCheckHorizontalFixedForward = vec3_create(0, 0, 1);\r\n\r\n return outTeleportParams;\r\n}\r\n\r\nexport const CollisionCheckUtils = {\r\n generate360TeleportParamsFromMovementParams\r\n} as const;", "import { PhysicsLayerFlags } from \"../../../../cauldron/physics/physics_layer_flags.js\";\r\nimport { RaycastBlockColliderType } from \"../../../../cauldron/physics/physics_raycast_params.js\";\r\nimport { quat_create, vec3_create } from \"../../../../plugin/js/extensions/array/vec_create_extension.js\";\r\n\r\nexport class CharacterColliderSetup {\r\n\r\n constructor() {\r\n this.myHeight = 0;\r\n\r\n this.myHorizontalCheckParams = new CharacterColliderHorizontalCheckParams();\r\n this.myVerticalCheckParams = new CharacterColliderVerticalCheckParams();\r\n\r\n this.myWallSlideParams = new CharacterColliderWallSlideParams();\r\n\r\n this.myGroundParams = new CharacterColliderSurfaceParams();\r\n this.myCeilingParams = new CharacterColliderSurfaceParams();\r\n\r\n this.mySplitMovementParams = new CharacterColliderSplitMovementParams();\r\n\r\n this.myAdditionalParams = new CharacterColliderAdditionalParams();\r\n\r\n this.myDebugParams = new CharacterColliderDebugParams();\r\n }\r\n\r\n copy(other) {\r\n // Implemented outside class definition\r\n }\r\n}\r\n\r\nexport let CharacterColliderHorizontalPositionVerticalCheckDirection = {\r\n UPWARD: 0, // Gives less issues with a ground based movement, but may also collide a bit more, resulting in less sliding\r\n DOWNWARD: 1, // Gives less issues with a ceiling based movement (unusual), but may also collide a bit more, resulting in less sliding and more stuck in front of a wall\r\n BOTH: 2 // Check both directions, more expensive (2x checks) and better prevent collisions, sliding more, but is more expensive and gives more issues \r\n\r\n // _\r\n // The issues means that a small step at the end of a slope, maybe due to 2 rectangles, one for the floor and the other for the slope like this -> / \r\n // can create a small step if the floor rectangle is a bit above the end of the slope, this will make the character get stuck thinking it's a wall\r\n // BOTH do a more \"aggressive\" vertical check that makes the character get less stuck in other situations, but can get stuck in this one\r\n // The better solution is to properly create the level, and if possible combine the 2 rectangles by having the floor a little below the end of the slope (like this -> /-)\r\n // The step that is created \"on the other side\" in fact can easily be ignored thanks to the myHorizontalCheckFeetDistanceToIgnore param\r\n // If the level is properly created the best solution should be UPWARD\r\n // and also myHorizontalPositionVerticalCheckIgnoreHitsInsideCollision = false\r\n};\r\n\r\nexport class CharacterColliderHorizontalCheckParams {\r\n\r\n constructor() {\r\n this.myHorizontalCheckConeRadius = 0;\r\n this.myHorizontalCheckConeHalfAngle = 0;\r\n\r\n this.myHorizontalHeightCheckEnabled = false;\r\n\r\n this.myHorizontalCheckFeetDistanceToIgnore = 0;\r\n this.myHorizontalCheckHeadDistanceToIgnore = 0;\r\n // These distances can be used to make the character ignore small steps (like a stair step) so they can move on it\r\n // It also needs the surface pop out to be enabeld to then snap on the step\r\n\r\n this.myHorizontalCheckFixedForwardEnabled = false; // This is basically only useful if the cone angle is 180 degrees\r\n this.myHorizontalCheckFixedForward = vec3_create();\r\n\r\n this.myHorizontalMovementCheckEnabled = false;\r\n\r\n this.myHorizontalMovementCheckRadialSteps = 0;\r\n\r\n this.myHorizontalMovementCheckSplitMovementEnabled = false;\r\n this.myHorizontalMovementCheckSplitMovementMaxSteps = null;\r\n this.myHorizontalMovementCheckSplitMovementMaxStepLength = null;\r\n this.myHorizontalMovementCheckSplitMovementMinStepLength = null;\r\n\r\n this.myHorizontalMovementCheckGetBetterReferenceHit = false;\r\n // If the horizontal movement finds a hit it stops looking, but could end up having a bad reference collision hit\r\n // This makes it so it will check a better hit to use later for the slide\r\n\r\n this.myHorizontalMovementHorizontalRadialCheckEnabled = false;\r\n this.myHorizontalMovementHorizontalDiagonalOutwardCheckEnabled = false;\r\n this.myHorizontalMovementHorizontalDiagonalInwardCheckEnabled = false;\r\n this.myHorizontalMovementHorizontalStraightCheckEnabled = false;\r\n this.myHorizontalMovementHorizontalStraightCentralCheckEnabled = false;\r\n\r\n this.myHorizontalMovementHeightCheckSteps = 0;\r\n this.myHorizontalMovementHeightHorizontalCheckEnabled = false;\r\n this.myHorizontalMovementHeightVerticalCheckEnabled = false;\r\n\r\n this.myHorizontalMovementVerticalRadialDiagonalOutwardCheckEnabled = false;\r\n this.myHorizontalMovementVerticalRadialDiagonalInwardCheckEnabled = false;\r\n\r\n this.myHorizontalMovementVerticalDiagonalOutwardUpwardCheckEnabled = false;\r\n this.myHorizontalMovementVerticalDiagonalOutwardDownwardCheckEnabled = false;\r\n this.myHorizontalMovementVerticalDiagonalInwardUpwardCheckEnabled = false;\r\n this.myHorizontalMovementVerticalDiagonalInwardDownwardCheckEnabled = false;\r\n\r\n this.myHorizontalMovementVerticalStraightCheckEnabled = false;\r\n this.myHorizontalMovementVerticalStraightCentralCheckEnabled = false;\r\n this.myHorizontalMovementVerticalStraightDiagonalUpwardCheckEnabled = false;\r\n this.myHorizontalMovementVerticalStraightDiagonalUpwardCentralCheckEnabled = false;\r\n this.myHorizontalMovementVerticalStraightDiagonalDownwardCheckEnabled = false;\r\n this.myHorizontalMovementVerticalStraightDiagonalDownwardCentralCheckEnabled = false;\r\n\r\n this.myHorizontalPositionCheckEnabled = false;\r\n this.myHorizontalPositionCheckConeHalfSlices = 0;\r\n this.myHorizontalPositionHorizontalBorderCheckEnabled = false;\r\n this.myHorizontalPositionHorizontalRadialCheckEnabled = false;\r\n\r\n this.myHorizontalPositionHeightCheckSteps = 0;\r\n this.myHorizontalPositionHeightHorizontalCheckEnabled = false;\r\n this.myHorizontalPositionHeightVerticalCheckEnabled = false;\r\n\r\n this.myHorizontalPositionVerticalStraightCheckEnabled = false;\r\n this.myHorizontalPositionVerticalStraightCentralCheckEnabled = false;\r\n this.myHorizontalPositionVerticalRadialDiagonalOutwardCheckEnabled = false;\r\n this.myHorizontalPositionVerticalRadialDiagonalInwardCheckEnabled = false;\r\n this.myHorizontalPositionVerticalBorderDiagonalOutwardCheckEnabled = false;\r\n this.myHorizontalPositionVerticalBorderDiagonalInwardCheckEnabled = false;\r\n this.myHorizontalPositionVerticalRadialBorderDiagonalOutwardCheckEnabled = false;\r\n this.myHorizontalPositionVerticalRadialBorderDiagonalInwardCheckEnabled = false;\r\n\r\n this.myHorizontalPositionVerticalCheckGetFarthestHit = false; // Not very useful but already implemented so\r\n\r\n this.myHorizontalPositionVerticalCheckPerformHorizontalCheckOnHit = false;\r\n this.myHorizontalPositionVerticalCheckPerformHorizontalCheckOnHitKeepVerticalHitIfNoHorizontalHit = false;\r\n // If the horizontal check does not hit the vertical hit will be restored\r\n // The fact that the horizontal does not hit could be due to the fact that it thinks that the collision can be ignored\r\n // so restoring the vertical hit can be a bit safer (since u are actually colliding) but also can lead to false positive\r\n\r\n this.myHorizontalPositionVerticalCheckIgnoreHitsInsideCollision = false; // true gives less issues, but may also collide a bit more, resulting in less sliding\r\n this.myHorizontalPositionVerticalCheckDirection = CharacterColliderHorizontalPositionVerticalCheckDirection.UPWARD;\r\n\r\n this.myHorizontalCheckBlockLayerFlags = new PhysicsLayerFlags();\r\n this.myHorizontalCheckObjectsToIgnore = [];\r\n this.myHorizontalBlockColliderType = RaycastBlockColliderType.BOTH;\r\n }\r\n\r\n copy(other) {\r\n // Implemented outside class definition\r\n }\r\n}\r\n\r\nexport class CharacterColliderVerticalCheckParams {\r\n\r\n constructor() {\r\n this.myVerticalCheckCircumferenceRadius = 0;\r\n\r\n this.myVerticalCheckCircumferenceSlices = 0;\r\n this.myVerticalCheckCircumferenceCentralCheckEnabled = false;\r\n this.myVerticalCheckCircumferenceRadialSteps = 0;\r\n this.myVerticalCheckCircumferenceRotationPerRadialStep = 0;\r\n\r\n this.myVerticalCheckFixedForwardEnabled = false;\r\n this.myVerticalCheckFixedForward = vec3_create();\r\n\r\n this.myVerticalMovementCheckEnabled = false;\r\n this.myVerticalMovementCheckReductionEnabled = false;\r\n this.myVerticalMovementCheckPerformCheckOnBothSides = false;\r\n\r\n this.myVerticalPositionCheckEnabled = false;\r\n this.myVerticalPositionCheckPerformCheckOnBothSides = false;\r\n\r\n this.myVerticalCheckAllowHitsInsideCollisionIfOneValid = false;\r\n // If at least one vertical raycast is valid (no hit, outside collision) is it ok if the other checks are completely inside a collision\r\n // let you keep moving vertically if only partially inside a wall\r\n\r\n this.myVerticalCheckBlockLayerFlags = new PhysicsLayerFlags();\r\n this.myVerticalCheckObjectsToIgnore = [];\r\n this.myVerticalBlockColliderType = RaycastBlockColliderType.BOTH;\r\n }\r\n\r\n copy(other) {\r\n // Implemented outside class definition\r\n }\r\n}\r\n\r\nexport let CharacterColliderSlideFlickerPreventionMode = {\r\n NONE: 0,\r\n USE_PREVIOUS_RESULTS: 1, // Allow some flicker before stabilizing but avoid stopping for a 1 frame flicker only (false positive), is also less expensive\r\n COLLISION_ANGLE_ABOVE_90_DEGREES: 2, // Prevents most flicker apart those on almost flat surface, can have some false positive, always check when sliding into opposite direction\r\n COLLISION_ANGLE_ABOVE_90_DEGREES_OR_MOVEMENT_ANGLE_ABOVE_85_DEGREES: 3, // Less flicker than COLLISION_ANGLE_ABOVE_90_DEGREES but more false positive, always check when sliding into opposite direction\r\n ALWAYS: 4 // Less flicker than COLLISION_ANGLE_ABOVE_90_DEGREES_OR_MOVEMENT_ANGLE_ABOVE_85_DEGREES but more false positive\r\n};\r\n\r\nexport class CharacterColliderWallSlideParams {\r\n\r\n constructor() {\r\n this.myWallSlideEnabled = false;\r\n\r\n this.myWallSlideMaxAttempts = 0;\r\n\r\n this.myCheckBothWallSlideDirections = false;\r\n // Expensive, 2 times the checks since it basically check again on the other slide direction\r\n // This can fix some edge cases in which u can get stuck instead of sliding\r\n // It basically require that u also add flicker prevention\r\n\r\n this.myWallSlideFlickerPreventionMode = CharacterColliderSlideFlickerPreventionMode.NONE;\r\n\r\n this.myWallSlideFlickerPreventionCheckOnlyIfAlreadySliding = false;\r\n // This flag make it so the prevention is done only if it was already sliding\r\n // This can lead to a few frames of flicker if u go toward a corner directly, but allow the movement to be more fluid, avoiding getting stuck and false positive\r\n\r\n this.myWallSlideFlickerPreventionForceCheckCounter = 0;\r\n // If the collision think it needs to check for flicker, it will keep checking for the next X frames based on this value even if the condition are not met anymore\r\n // This help in catching the flicker when the direction is not changing every frame but every 2-3 for example\r\n // It's especially useful if combo-ed with CharacterColliderSlideFlickerPreventionMode.USE_PREVIOUS_RESULTS, making it a bit less fluid but also less flickering\r\n\r\n this.my90DegreesWallSlideAdjustDirectionSign = false;\r\n }\r\n\r\n copy(other) {\r\n // Implemented outside class definition\r\n }\r\n}\r\n\r\nexport class CharacterColliderSurfaceParams {\r\n\r\n constructor() {\r\n this.mySurfaceSnapMaxDistance = 0;\r\n this.mySurfacePopOutMaxDistance = 0;\r\n\r\n this.mySurfaceAngleToIgnore = 0;\r\n\r\n this.mySurfaceAngleToIgnoreWithSurfacePerceivedAngle = null;\r\n // Between this value and mySurfaceAngleToIgnore, use the perceived angle to see if u can actually ignore the surface\r\n // This basically means that on steep surface u could still go up by moving diagonally\r\n\r\n this.myHorizontalMovementSurfaceAngleToIgnoreMaxVerticalDistance = null;\r\n this.myHorizontalPositionSurfaceAngleToIgnoreMaxVerticalDistance = null;\r\n // If the collision with the surface is above this max value, even if the surface angle is ignorable do not ignore it\r\n\r\n this.myHorizontalMovementSurfaceAngleToIgnoreMaxHorizontalMovementLeft = null;\r\n // If the collision with the surface happens during the horizontal movement check, if the horizontal movement left (total movement to perform minus hit distance)\r\n // is above this value do not ignore it otherwise you would ignore a surface but are actually going too much inside it\r\n\r\n this.myCollectSurfaceInfo = false;\r\n\r\n this.myOnSurfaceMaxOutsideDistance = 0;\r\n this.myOnSurfaceMaxInsideDistance = 0;\r\n\r\n this.myBaseInsideCollisionCheckEnabled = false;\r\n this.myOnSurfaceIfBaseInsideCollision = false;\r\n\r\n this.myCollectSurfaceNormalMaxOutsideDistance = 0;\r\n this.myCollectSurfaceNormalMaxInsideDistance = 0;\r\n\r\n this.myCollectSurfaceDistanceOutsideDistance = 0;\r\n this.myCollectSurfaceDistanceInsideDistance = 0;\r\n\r\n this.myCollectSurfaceCollisionHitOutsideDistance = 0;\r\n this.myCollectSurfaceCollisionHitInsideDistance = 0;\r\n\r\n this.myHorizontalMovementAdjustVerticalMovementOverSurfacePerceivedAngleDownhill = false;\r\n this.myHorizontalMovementAdjustVerticalMovementOverSurfacePerceivedAngleUphill = false;\r\n // This make it so when a character moves horizontally on a slope it also add a vertical movement so that the movement is actually on the slope plane\r\n this.myHorizontalMovementAdjustVerticalMovementOverSurfacePerceivedAngleDownhillMaxSurfaceAngle = null;\r\n this.myHorizontalMovementAdjustVerticalMovementOverSurfacePerceivedAngleUphillMaxSurfaceAngle = null;\r\n this.myHorizontalMovementAdjustVerticalMovementOverSurfacePerceivedAngleDownhillMaxSurfacePerceivedAngle = null;\r\n this.myHorizontalMovementAdjustVerticalMovementOverSurfacePerceivedAngleUphillMaxSurfacePerceivedAngle = null;\r\n // This can be used to limit the adjustment so that on steep slopes u can bounce off, or anyway don't add a huge vertical movement due to a very steep slope\r\n\r\n this.myVerticalMovementAdjustHorizontalMovementOverSurfaceAngleDownhill = false;\r\n // This make it so when a character moves vertically on a slope (sort of sliding down the slope) it also add a horizontal movement so that the movement is actually on the slope plane\r\n this.myVerticalMovementAdjustHorizontalMovementOverSurfaceAngleDownhillMinSurfaceAngle = null;\r\n // This can be used to make it so the movement (and therefore the slide) only happens above a certain angle, like u want to slide down only on steep surfaces\r\n\r\n this.myMovementMustStayOnSurface = false;\r\n this.myMovementMustStayOnSurfaceHitMaxAngle = null;\r\n this.myMovementMustStayOnIgnorableSurfaceAngleDownhill = false;\r\n this.myMovementMustStayOnSurfaceAngleDownhill = null;\r\n\r\n this.myTeleportMustBeOnSurface = false;\r\n this.myTeleportMustBeOnIgnorableSurfaceAngle = false;\r\n this.myTeleportMustBeOnSurfaceAngle = null;\r\n\r\n this.myCheckTransformMustBeOnSurface = false;\r\n this.myCheckTransformMustBeOnIgnorableSurfaceAngle = false;\r\n this.myCheckTransformMustBeOnSurfaceAngle = null;\r\n\r\n this.myRecollectSurfaceInfoOnSurfaceCheckFailed = false;\r\n // Instead of copying the previous surface info on fail, regather them\r\n\r\n this.myHorizontalMovementAllowExitAttemptWhenOnNotIgnorableSurfacePerceivedAngle = false;\r\n // If u start on a not ignorable perceived angle (above angle to ignore) u normally can't even try to move uphill, this will let you try and see if with that movement\r\n // you could end up in a ignorable perceived angle position\r\n }\r\n\r\n copy(other) {\r\n // Implemented outside class definition\r\n }\r\n}\r\n\r\nexport class CharacterColliderSplitMovementParams {\r\n\r\n constructor() {\r\n this.mySplitMovementEnabled = false;\r\n\r\n this.mySplitMovementMaxSteps = null;\r\n this.mySplitMovementMaxStepLength = null;\r\n this.mySplitMovementMinStepLength = null;\r\n this.mySplitMovementLastStepCanBeLongerThanMaxStepLength = false;\r\n\r\n this.mySplitMovementStopOnHorizontalMovementFailed = false;\r\n this.mySplitMovementStopOnVerticalMovementFailed = false;\r\n this.mySplitMovementStopOnVerticalMovementReduced = false;\r\n\r\n this.mySplitMovementStopAndFailIfMovementWouldBeReduced = false;\r\n\r\n /*\r\n this will not be available until the bridge is removed with a new implementation that directly use the collider and results\r\n \r\n this.mySplitMovementStopOnCallback = null; // Signature: callback(paramsToBeDefined)\r\n */\r\n\r\n this.mySplitMovementStopReturnPreviousResults = false;\r\n }\r\n\r\n copy(other) {\r\n // Implemented outside class definition\r\n }\r\n}\r\n\r\nexport class CharacterColliderAdditionalParams {\r\n\r\n constructor() {\r\n this.myPositionOffsetLocal = vec3_create();\r\n this.myRotationOffsetLocalQuat = quat_create();\r\n\r\n /*\r\n these will not be available until the bridge is removed with a new implementation that directly use the collider and results\r\n\r\n this.myExtraMovementCheckCallback = null; // Signature: callback(paramsToBeDefined)\r\n this.myExtraTeleportCheckCallback = null; // Signature: callback(paramsToBeDefined)\r\n this.myExtraCheckTransformCheckCallback = null; // Signature: callback(paramsToBeDefined)\r\n */\r\n }\r\n\r\n copy(other) {\r\n // Implemented outside class definition\r\n }\r\n}\r\n\r\nexport class CharacterColliderDebugParams {\r\n\r\n constructor() {\r\n this.myVisualDebugEnabled = false;\r\n\r\n this.myVisualDebugMovementEnabled = false;\r\n\r\n this.myVisualDebugHorizontalMovementCheckEnabled = false;\r\n this.myVisualDebugHorizontalPositionCheckEnabled = false;\r\n\r\n this.myVisualDebugVerticalMovementCheckEnabled = false;\r\n this.myVisualDebugVerticalPositionCheckEnabled = false;\r\n\r\n this.myVisualDebugSlideEnabled = false;\r\n\r\n this.myVisualDebugGroundInfoEnabled = false;\r\n this.myVisualDebugCeilingInfoEnabled = false;\r\n\r\n this.myVisualDebugResultsEnabled = false;\r\n }\r\n\r\n copy(other) {\r\n // Implemented outside class definition\r\n }\r\n}\r\n\r\n\r\n\r\n// IMPLEMENTATION\r\n\r\nCharacterColliderSetup.prototype.copy = function copy(other) {\r\n this.myHeight = other.myHeight;\r\n\r\n this.myHorizontalCheckParams.copy(other.myHorizontalCheckParams);\r\n this.myVerticalCheckParams.copy(other.myVerticalCheckParams);\r\n\r\n this.myWallSlideParams.copy(other.myWallSlideParams);\r\n\r\n this.myGroundParams.copy(other.myGroundParams);\r\n this.myCeilingParams.copy(other.myCeilingParams);\r\n\r\n this.mySplitMovementParams.copy(other.mySplitMovementParams);\r\n\r\n this.myAdditionalParams.copy(other.myAdditionalParams);\r\n\r\n this.myDebugParams.copy(other.myDebugParams);\r\n};\r\n\r\nCharacterColliderHorizontalCheckParams.prototype.copy = function copy(other) {\r\n this.myHorizontalCheckConeRadius = other.myHorizontalCheckConeRadius;\r\n this.myHorizontalCheckConeHalfAngle = other.myHorizontalCheckConeHalfAngle;\r\n\r\n this.myHorizontalHeightCheckEnabled = other.myHorizontalHeightCheckEnabled;\r\n\r\n this.myHorizontalCheckFeetDistanceToIgnore = other.myHorizontalCheckFeetDistanceToIgnore;\r\n this.myHorizontalCheckHeadDistanceToIgnore = other.myHorizontalCheckHeadDistanceToIgnore;\r\n\r\n this.myHorizontalCheckFixedForwardEnabled = other.myHorizontalCheckFixedForwardEnabled;\r\n this.myHorizontalCheckFixedForward.vec3_copy(other.myHorizontalCheckFixedForward);\r\n\r\n this.myHorizontalMovementCheckEnabled = other.myHorizontalMovementCheckEnabled;\r\n\r\n this.myHorizontalMovementCheckRadialSteps = other.myHorizontalMovementCheckRadialSteps;\r\n\r\n this.myHorizontalMovementCheckSplitMovementEnabled = other.myHorizontalMovementCheckSplitMovementEnabled;\r\n this.myHorizontalMovementCheckSplitMovementMaxSteps = other.myHorizontalMovementCheckSplitMovementMaxSteps;\r\n this.myHorizontalMovementCheckSplitMovementMaxStepLength = other.myHorizontalMovementCheckSplitMovementMaxStepLength;\r\n this.myHorizontalMovementCheckSplitMovementMinStepLength = other.myHorizontalMovementCheckSplitMovementMinStepLength;\r\n\r\n this.myHorizontalMovementCheckGetBetterReferenceHit = other.myHorizontalMovementCheckGetBetterReferenceHit;\r\n\r\n this.myHorizontalMovementHorizontalRadialCheckEnabled = other.myHorizontalMovementHorizontalRadialCheckEnabled;\r\n this.myHorizontalMovementHorizontalDiagonalOutwardCheckEnabled = other.myHorizontalMovementHorizontalDiagonalOutwardCheckEnabled;\r\n this.myHorizontalMovementHorizontalDiagonalInwardCheckEnabled = other.myHorizontalMovementHorizontalDiagonalInwardCheckEnabled;\r\n this.myHorizontalMovementHorizontalStraightCheckEnabled = other.myHorizontalMovementHorizontalStraightCheckEnabled;\r\n this.myHorizontalMovementHorizontalStraightCentralCheckEnabled = other.myHorizontalMovementHorizontalStraightCentralCheckEnabled;\r\n\r\n this.myHorizontalMovementHeightCheckSteps = other.myHorizontalMovementHeightCheckSteps;\r\n this.myHorizontalMovementHeightVerticalCheckEnabled = other.myHorizontalMovementHeightVerticalCheckEnabled;\r\n this.myHorizontalMovementHeightHorizontalCheckEnabled = other.myHorizontalMovementHeightHorizontalCheckEnabled;\r\n\r\n this.myHorizontalMovementVerticalRadialDiagonalOutwardCheckEnabled = other.myHorizontalMovementVerticalRadialDiagonalOutwardCheckEnabled;\r\n this.myHorizontalMovementVerticalRadialDiagonalInwardCheckEnabled = other.myHorizontalMovementVerticalRadialDiagonalInwardCheckEnabled;\r\n\r\n this.myHorizontalMovementVerticalDiagonalOutwardUpwardCheckEnabled = other.myHorizontalMovementVerticalDiagonalOutwardUpwardCheckEnabled;\r\n this.myHorizontalMovementVerticalDiagonalOutwardDownwardCheckEnabled = other.myHorizontalMovementVerticalDiagonalOutwardDownwardCheckEnabled;\r\n this.myHorizontalMovementVerticalDiagonalInwardUpwardCheckEnabled = other.myHorizontalMovementVerticalDiagonalInwardUpwardCheckEnabled;\r\n this.myHorizontalMovementVerticalDiagonalInwardDownwardCheckEnabled = other.myHorizontalMovementVerticalDiagonalInwardDownwardCheckEnabled;\r\n\r\n this.myHorizontalMovementVerticalStraightCheckEnabled = other.myHorizontalMovementVerticalStraightCheckEnabled;\r\n this.myHorizontalMovementVerticalStraightCentralCheckEnabled = other.myHorizontalMovementVerticalStraightCentralCheckEnabled;\r\n this.myHorizontalMovementVerticalStraightDiagonalUpwardCheckEnabled = other.myHorizontalMovementVerticalStraightDiagonalUpwardCheckEnabled;\r\n this.myHorizontalMovementVerticalStraightDiagonalUpwardCentralCheckEnabled = other.myHorizontalMovementVerticalStraightDiagonalUpwardCentralCheckEnabled;\r\n this.myHorizontalMovementVerticalStraightDiagonalDownwardCheckEnabled = other.myHorizontalMovementVerticalStraightDiagonalDownwardCheckEnabled;\r\n this.myHorizontalMovementVerticalStraightDiagonalDownwardCentralCheckEnabled = other.myHorizontalMovementVerticalStraightDiagonalDownwardCentralCheckEnabled;\r\n\r\n this.myHorizontalPositionCheckEnabled = other.myHorizontalPositionCheckEnabled;\r\n this.myHorizontalPositionCheckConeHalfSlices = other.myHorizontalPositionCheckConeHalfSlices;\r\n this.myHorizontalPositionHorizontalBorderCheckEnabled = other.myHorizontalPositionHorizontalBorderCheckEnabled;\r\n this.myHorizontalPositionHorizontalRadialCheckEnabled = other.myHorizontalPositionHorizontalRadialCheckEnabled;\r\n\r\n this.myHorizontalPositionHeightCheckSteps = other.myHorizontalPositionHeightCheckSteps;\r\n this.myHorizontalPositionHeightHorizontalCheckEnabled = other.myHorizontalPositionHeightHorizontalCheckEnabled;\r\n this.myHorizontalPositionHeightVerticalCheckEnabled = other.myHorizontalPositionHeightVerticalCheckEnabled;\r\n\r\n this.myHorizontalPositionVerticalStraightCheckEnabled = other.myHorizontalPositionVerticalStraightCheckEnabled;\r\n this.myHorizontalPositionVerticalStraightCentralCheckEnabled = other.myHorizontalPositionVerticalStraightCentralCheckEnabled;\r\n this.myHorizontalPositionVerticalRadialDiagonalOutwardCheckEnabled = other.myHorizontalPositionVerticalRadialDiagonalOutwardCheckEnabled;\r\n this.myHorizontalPositionVerticalRadialDiagonalInwardCheckEnabled = other.myHorizontalPositionVerticalRadialDiagonalInwardCheckEnabled;\r\n this.myHorizontalPositionVerticalBorderDiagonalOutwardCheckEnabled = other.myHorizontalPositionVerticalBorderDiagonalOutwardCheckEnabled;\r\n this.myHorizontalPositionVerticalBorderDiagonalInwardCheckEnabled = other.myHorizontalPositionVerticalBorderDiagonalInwardCheckEnabled;\r\n this.myHorizontalPositionVerticalRadialBorderDiagonalOutwardCheckEnabled = other.myHorizontalPositionVerticalRadialBorderDiagonalOutwardCheckEnabled;\r\n this.myHorizontalPositionVerticalRadialBorderDiagonalInwardCheckEnabled = other.myHorizontalPositionVerticalRadialBorderDiagonalInwardCheckEnabled;\r\n\r\n this.myHorizontalPositionVerticalCheckGetFarthestHit = other.myHorizontalPositionVerticalCheckGetFarthestHit;\r\n\r\n this.myHorizontalPositionVerticalCheckPerformHorizontalCheckOnHit = other.myHorizontalPositionVerticalCheckPerformHorizontalCheckOnHit;\r\n this.myHorizontalPositionVerticalCheckPerformHorizontalCheckOnHitKeepVerticalHitIfNoHorizontalHit = other.myHorizontalPositionVerticalCheckPerformHorizontalCheckOnHitKeepVerticalHitIfNoHorizontalHit;\r\n\r\n this.myHorizontalPositionVerticalCheckIgnoreHitsInsideCollision = other.myHorizontalPositionVerticalCheckIgnoreHitsInsideCollision;\r\n this.myHorizontalPositionVerticalCheckDirection = other.myHorizontalPositionVerticalCheckDirection;\r\n\r\n this.myHorizontalCheckBlockLayerFlags.setMask(other.myHorizontalCheckBlockLayerFlags.getMask());\r\n this.myHorizontalCheckObjectsToIgnore.pp_copy(other.myHorizontalCheckObjectsToIgnore);\r\n this.myHorizontalBlockColliderType = other.myHorizontalBlockColliderType;\r\n};\r\n\r\nCharacterColliderVerticalCheckParams.prototype.copy = function copy(other) {\r\n this.myVerticalCheckCircumferenceRadius = other.myVerticalCheckCircumferenceRadius;\r\n\r\n this.myVerticalCheckCircumferenceSlices = other.myVerticalCheckCircumferenceSlices;\r\n this.myVerticalCheckCircumferenceCentralCheckEnabled = other.myVerticalCheckCircumferenceCentralCheckEnabled;\r\n this.myVerticalCheckCircumferenceRadialSteps = other.myVerticalCheckCircumferenceRadialSteps;\r\n this.myVerticalCheckCircumferenceRotationPerRadialStep = other.myVerticalCheckCircumferenceRotationPerRadialStep;\r\n\r\n this.myVerticalCheckFixedForwardEnabled = other.myVerticalCheckFixedForwardEnabled;\r\n this.myVerticalCheckFixedForward.vec3_copy(other.myVerticalCheckFixedForward);\r\n\r\n this.myVerticalMovementCheckEnabled = other.myVerticalMovementCheckEnabled;\r\n this.myVerticalMovementCheckReductionEnabled = other.myVerticalMovementCheckReductionEnabled;\r\n this.myVerticalMovementCheckPerformCheckOnBothSides = other.myVerticalMovementCheckPerformCheckOnBothSides;\r\n\r\n this.myVerticalPositionCheckEnabled = other.myVerticalPositionCheckEnabled;\r\n this.myVerticalPositionCheckPerformCheckOnBothSides = other.myVerticalPositionCheckPerformCheckOnBothSides;\r\n\r\n this.myVerticalCheckAllowHitsInsideCollisionIfOneValid = other.myVerticalCheckAllowHitsInsideCollisionIfOneValid;\r\n\r\n this.myVerticalCheckBlockLayerFlags.setMask(other.myVerticalCheckBlockLayerFlags.getMask());\r\n this.myVerticalCheckObjectsToIgnore.pp_copy(other.myVerticalCheckObjectsToIgnore);\r\n this.myVerticalBlockColliderType = other.myVerticalBlockColliderType;\r\n};\r\n\r\nCharacterColliderWallSlideParams.prototype.copy = function copy(other) {\r\n this.myWallSlideEnabled = other.myWallSlideEnabled;\r\n\r\n this.myWallSlideMaxAttempts = other.myWallSlideMaxAttempts;\r\n\r\n this.myCheckBothWallSlideDirections = other.myCheckBothWallSlideDirections;\r\n\r\n this.myWallSlideFlickerPreventionMode = other.myWallSlideFlickerPreventionMode;\r\n\r\n this.myWallSlideFlickerPreventionCheckOnlyIfAlreadySliding = other.myWallSlideFlickerPreventionCheckOnlyIfAlreadySliding;\r\n\r\n this.myWallSlideFlickerPreventionForceCheckCounter = other.myWallSlideFlickerPreventionForceCheckCounter;\r\n\r\n this.my90DegreesWallSlideAdjustDirectionSign = other.my90DegreesWallSlideAdjustDirectionSign;\r\n};\r\n\r\nCharacterColliderSurfaceParams.prototype.copy = function copy(other) {\r\n this.mySurfaceSnapMaxDistance = other.mySurfaceSnapMaxDistance;\r\n this.mySurfacePopOutMaxDistance = other.mySurfacePopOutMaxDistance;\r\n\r\n this.mySurfaceAngleToIgnore = other.mySurfaceAngleToIgnore;\r\n this.mySurfaceAngleToIgnoreWithSurfacePerceivedAngle = other.mySurfaceAngleToIgnoreWithSurfacePerceivedAngle;\r\n\r\n this.myHorizontalMovementSurfaceAngleToIgnoreMaxVerticalDistance = other.myHorizontalMovementSurfaceAngleToIgnoreMaxVerticalDistance;\r\n this.myHorizontalPositionSurfaceAngleToIgnoreMaxVerticalDistance = other.myHorizontalPositionSurfaceAngleToIgnoreMaxVerticalDistance;\r\n\r\n this.myHorizontalMovementSurfaceAngleToIgnoreMaxHorizontalMovementLeft = other.myHorizontalMovementSurfaceAngleToIgnoreMaxHorizontalMovementLeft;\r\n\r\n this.myCollectSurfaceInfo = other.myCollectSurfaceInfo;\r\n\r\n this.myOnSurfaceMaxOutsideDistance = other.myOnSurfaceMaxOutsideDistance;\r\n this.myOnSurfaceMaxInsideDistance = other.myOnSurfaceMaxInsideDistance;\r\n\r\n this.myBaseInsideCollisionCheckEnabled = other.myBaseInsideCollisionCheckEnabled;\r\n this.myOnSurfaceIfBaseInsideCollision = other.myOnSurfaceIfBaseInsideCollision;\r\n\r\n this.myCollectSurfaceNormalMaxOutsideDistance = other.myCollectSurfaceNormalMaxOutsideDistance;\r\n this.myCollectSurfaceNormalMaxInsideDistance = other.myCollectSurfaceNormalMaxInsideDistance;\r\n\r\n this.myCollectSurfaceDistanceOutsideDistance = other.myCollectSurfaceDistanceOutsideDistance;\r\n this.myCollectSurfaceDistanceInsideDistance = other.myCollectSurfaceDistanceInsideDistance;\r\n\r\n this.myCollectSurfaceCollisionHitOutsideDistance = other.myCollectSurfaceCollisionHitOutsideDistance;\r\n this.myCollectSurfaceCollisionHitInsideDistance = other.myCollectSurfaceCollisionHitInsideDistance;\r\n\r\n this.myHorizontalMovementAdjustVerticalMovementOverSurfacePerceivedAngleDownhill = other.myHorizontalMovementAdjustVerticalMovementOverSurfacePerceivedAngleDownhill;\r\n this.myHorizontalMovementAdjustVerticalMovementOverSurfacePerceivedAngleUphill = other.myHorizontalMovementAdjustVerticalMovementOverSurfacePerceivedAngleUphill;\r\n this.myHorizontalMovementAdjustVerticalMovementOverSurfacePerceivedAngleDownhillMaxSurfaceAngle = other.myHorizontalMovementAdjustVerticalMovementOverSurfacePerceivedAngleDownhillMaxSurfaceAngle;\r\n this.myHorizontalMovementAdjustVerticalMovementOverSurfacePerceivedAngleUphillMaxSurfaceAngle = other.myHorizontalMovementAdjustVerticalMovementOverSurfacePerceivedAngleUphillMaxSurfaceAngle;\r\n this.myHorizontalMovementAdjustVerticalMovementOverSurfacePerceivedAngleDownhillMaxSurfacePerceivedAngle = other.myHorizontalMovementAdjustVerticalMovementOverSurfacePerceivedAngleDownhillMaxSurfacePerceivedAngle;\r\n this.myHorizontalMovementAdjustVerticalMovementOverSurfacePerceivedAngleUphillMaxSurfacePerceivedAngle = other.myHorizontalMovementAdjustVerticalMovementOverSurfacePerceivedAngleUphillMaxSurfacePerceivedAngle;\r\n\r\n this.myVerticalMovementAdjustHorizontalMovementOverSurfaceAngleDownhill = other.myVerticalMovementAdjustHorizontalMovementOverSurfaceAngleDownhill;\r\n this.myVerticalMovementAdjustHorizontalMovementOverSurfaceAngleDownhillMinSurfaceAngle = other.myVerticalMovementAdjustHorizontalMovementOverSurfaceAngleDownhillMinSurfaceAngle;\r\n\r\n this.myMovementMustStayOnSurface = other.myMovementMustStayOnSurface;\r\n this.myMovementMustStayOnSurfaceHitMaxAngle = other.myMovementMustStayOnSurfaceHitMaxAngle;\r\n this.myMovementMustStayOnIgnorableSurfaceAngleDownhill = other.myMovementMustStayOnIgnorableSurfaceAngleDownhill;\r\n this.myMovementMustStayOnSurfaceAngleDownhill = other.myMovementMustStayOnSurfaceAngleDownhill;\r\n\r\n this.myTeleportMustBeOnSurface = other.myTeleportMustBeOnSurface;\r\n this.myTeleportMustBeOnIgnorableSurfaceAngle = other.myTeleportMustBeOnIgnorableSurfaceAngle;\r\n this.myTeleportMustBeOnSurfaceAngle = other.myTeleportMustBeOnSurfaceAngle;\r\n\r\n this.myCheckTransformMustBeOnSurface = other.myCheckTransformMustBeOnSurface;\r\n this.myCheckTransformMustBeOnIgnorableSurfaceAngle = other.myCheckTransformMustBeOnIgnorableSurfaceAngle;\r\n this.myCheckTransformMustBeOnSurfaceAngle = other.myCheckTransformMustBeOnSurfaceAngle;\r\n\r\n this.myRecollectSurfaceInfoOnSurfaceCheckFailed = other.myRecollectSurfaceInfoOnSurfaceCheckFailed;\r\n\r\n this.myHorizontalMovementAllowExitAttemptWhenOnNotIgnorableSurfacePerceivedAngle = other.myHorizontalMovementAllowExitAttemptWhenOnNotIgnorableSurfacePerceivedAngle;\r\n};\r\n\r\nCharacterColliderSplitMovementParams.prototype.copy = function copy(other) {\r\n this.mySplitMovementEnabled = other.mySplitMovementEnabled;\r\n\r\n this.mySplitMovementMaxSteps = other.mySplitMovementMaxSteps;\r\n this.mySplitMovementMaxStepLength = other.mySplitMovementMaxStepLength;\r\n this.mySplitMovementMinStepLength = other.mySplitMovementMinStepLength;\r\n this.mySplitMovementLastStepCanBeLongerThanMaxStepLength = other.mySplitMovementLastStepCanBeLongerThanMaxStepLength;\r\n\r\n this.mySplitMovementStopOnHorizontalMovementFailed = other.mySplitMovementStopOnHorizontalMovementFailed;\r\n this.mySplitMovementStopOnVerticalMovementFailed = other.mySplitMovementStopOnVerticalMovementFailed;\r\n this.mySplitMovementStopOnVerticalMovementReduced = other.mySplitMovementStopOnVerticalMovementReduced;\r\n\r\n this.mySplitMovementStopAndFailIfMovementWouldBeReduced = other.mySplitMovementStopAndFailIfMovementWouldBeReduced;\r\n\r\n /*\r\n this.mySplitMovementStopOnCallback = other.mySplitMovementStopOnCallback;\r\n */\r\n\r\n this.mySplitMovementStopReturnPreviousResults = other.mySplitMovementStopReturnPreviousResults;\r\n};\r\n\r\nCharacterColliderAdditionalParams.prototype.copy = function copy(other) {\r\n this.myPositionOffsetLocal.vec3_copy(other.myPositionOffsetLocal);\r\n this.myRotationOffsetLocalQuat.quat_copy(other.myRotationOffsetLocalQuat);\r\n\r\n /*\r\n this.myExtraMovementCheckCallback = other.myExtraMovementCheckCallback;\r\n this.myExtraTeleportCheckCallback = other.myExtraTeleportCheckCallback;\r\n this.myExtraCheckTransformCheckCallback = other.myExtraCheckTransformCheckCallback;\r\n */\r\n};\r\n\r\nCharacterColliderDebugParams.prototype.copy = function copy(other) {\r\n this.myVisualDebugEnabled = other.myVisualDebugEnabled;\r\n\r\n this.myVisualDebugMovementEnabled = other.myVisualDebugMovementEnabled;\r\n\r\n this.myVisualDebugHorizontalMovementCheckEnabled = other.myVisualDebugHorizontalMovementCheckEnabled;\r\n this.myVisualDebugHorizontalPositionCheckEnabled = other.myVisualDebugHorizontalPositionCheckEnabled;\r\n\r\n this.myVisualDebugVerticalMovementCheckEnabled = other.myVisualDebugVerticalMovementCheckEnabled;\r\n this.myVisualDebugVerticalPositionCheckEnabled = other.myVisualDebugVerticalPositionCheckEnabled;\r\n\r\n this.myVisualDebugSlideEnabled = other.myVisualDebugSlideEnabled;\r\n\r\n this.myVisualDebugGroundInfoEnabled = other.myVisualDebugGroundInfoEnabled;\r\n this.myVisualDebugCeilingInfoEnabled = other.myVisualDebugCeilingInfoEnabled;\r\n\r\n this.myVisualDebugResultsEnabled = other.myVisualDebugResultsEnabled;\r\n};", "import { vec3_create } from \"../../../plugin/js/extensions/array/vec_create_extension.js\";\r\n\r\nexport function computeGroundPerceivedAngle(surfaceNormal, direction, up) {\r\n return this.computeSurfacePerceivedAngle(surfaceNormal, direction, up, true);\r\n}\r\n\r\nexport function computeCeilingPerceivedAngle(surfaceNormal, direction, up) {\r\n return this.computeSurfacePerceivedAngle(surfaceNormal, direction, up, false);\r\n}\r\n\r\nexport let computeSurfacePerceivedAngle = function () {\r\n let directionOnSurface = vec3_create();\r\n let verticalDirection = vec3_create();\r\n return function computeSurfacePerceivedAngle(surfaceNormal, direction, up, ground) {\r\n let surfacePerceivedAngle = 0;\r\n\r\n verticalDirection.vec3_copy(up);\r\n if (!ground) {\r\n verticalDirection.vec3_negate(verticalDirection);\r\n }\r\n\r\n let surfaceAngle = surfaceNormal.vec3_angle(verticalDirection);\r\n if (surfaceAngle <= Math.PP_EPSILON_DEGREES) {\r\n surfaceAngle = 0;\r\n } else if (surfaceAngle >= 180 - Math.PP_EPSILON_DEGREES) {\r\n surfaceAngle = 180;\r\n }\r\n\r\n directionOnSurface = direction.vec3_projectOnPlaneAlongAxis(surfaceNormal, up, directionOnSurface);\r\n surfacePerceivedAngle = directionOnSurface.vec3_angle(direction);\r\n\r\n let fartherOnUp = directionOnSurface.vec3_isFartherAlongAxis(direction, up);\r\n if ((!fartherOnUp && ground) || (fartherOnUp && !ground)) {\r\n surfacePerceivedAngle *= -1;\r\n }\r\n\r\n if (Math.abs(surfacePerceivedAngle) >= surfaceAngle) {\r\n if (surfaceAngle != 0 && surfaceAngle != 180) {\r\n surfacePerceivedAngle = surfaceAngle * Math.pp_sign(surfacePerceivedAngle);\r\n } else {\r\n surfacePerceivedAngle = surfaceAngle;\r\n }\r\n }\r\n\r\n return surfacePerceivedAngle;\r\n };\r\n}();\r\n\r\nexport let CharacterControllerUtils = {\r\n computeGroundPerceivedAngle,\r\n computeCeilingPerceivedAngle,\r\n computeSurfacePerceivedAngle\r\n};", "import { Object3D } from \"@wonderlandengine/api\";\r\nimport { PhysicsLayerFlags } from \"../../../../cauldron/physics/physics_layer_flags.js\";\r\nimport { CharacterColliderSetup, CharacterColliderSlideFlickerPreventionMode } from \"./character_collider_setup.js\";\r\n\r\nexport enum CharacterColliderSetupSimplifiedCreationAccuracyLevel {\r\n VERY_LOW = 0,\r\n LOW = 1,\r\n MEDIUM = 2,\r\n HIGH = 3,\r\n VERY_HIGH = 4\r\n};\r\n\r\nexport class CharacterColliderSetupSimplifiedCreationParams {\r\n\r\n public myHeight: number = 0;\r\n public myRadius: number = 0;\r\n public myFeetRadius: number | null = null;\r\n\r\n public myAccuracyLevel: CharacterColliderSetupSimplifiedCreationAccuracyLevel = CharacterColliderSetupSimplifiedCreationAccuracyLevel.VERY_LOW;\r\n\r\n public myIsPlayer: boolean = false;\r\n\r\n /**\r\n * If you enable this, you might also want to disable {@link myCheckCeilings}, \r\n * since it doesn't make much sense to check for ceilings when not checking the height\r\n */\r\n public myCheckOnlyFeet: boolean = false;\r\n\r\n /**\r\n * If you enable this, you might also want to disable {@link myCheckOnlyFeet}, \r\n * since it doesn't make much sense to check for ceilings without also checking the height\r\n */\r\n public myCheckCeilings: boolean = false;\r\n\r\n public myMaxMovementSteps: number | null = null;\r\n\r\n public myShouldSlideAlongWall: boolean = false;\r\n\r\n\r\n\r\n public myCollectGroundInfo: boolean = false;\r\n public myMaxDistanceToSnapOnGround: number = 0;\r\n public myMaxDistanceToPopOutGround: number = 0;\r\n public myMaxWalkableGroundAngle: number = 0;\r\n public myMaxWalkableGroundStepHeight: number = 0;\r\n\r\n /**\r\n * Normally, the ground params are used for the ceiling too, but this needs to be a different setting, \r\n * since allowing walkable steps on ceiling might create issues with view occlusion for the player (especially with a high value) \r\n * since you can go more under some low ceiling making the occlusion head collide with it\r\n * \r\n * Settings it to zero is safer, but means that the ceilings physx must be more flat, because it's easier that a small ceiling bump now blocks you\r\n */\r\n public myMaxWalkableCeilingStepHeight: number = 0;\r\n\r\n public myShouldNotFallFromEdges: boolean = false;\r\n\r\n\r\n\r\n public myHorizontalCheckBlockLayerFlags: PhysicsLayerFlags = new PhysicsLayerFlags();\r\n public myHorizontalCheckObjectsToIgnore: Object3D[] = [];\r\n\r\n public myVerticalCheckBlockLayerFlags: PhysicsLayerFlags = new PhysicsLayerFlags();\r\n public myVerticalCheckObjectsToIgnore: Object3D[] = [];\r\n\r\n public myHorizontalCheckDebugEnabled: boolean = false;\r\n public myVerticalCheckDebugEnabled: boolean = false;\r\n}\r\n\r\nexport function createSimplified(simplifiedCreationParams: Readonly, outCharacterColliderSetup: CharacterColliderSetup = new CharacterColliderSetup()): CharacterColliderSetup {\r\n outCharacterColliderSetup.myHeight = simplifiedCreationParams.myHeight;\r\n outCharacterColliderSetup.myHorizontalCheckParams.myHorizontalCheckConeRadius = simplifiedCreationParams.myRadius;\r\n outCharacterColliderSetup.myVerticalCheckParams.myVerticalCheckCircumferenceRadius = simplifiedCreationParams.myFeetRadius ?? simplifiedCreationParams.myRadius / 2;\r\n\r\n outCharacterColliderSetup.myVerticalCheckParams.myVerticalCheckFixedForwardEnabled = true;\r\n outCharacterColliderSetup.myVerticalCheckParams.myVerticalCheckFixedForward.vec3_set(0, 0, 1);\r\n\r\n if (!simplifiedCreationParams.myCheckOnlyFeet) {\r\n outCharacterColliderSetup.myHorizontalCheckParams.myHorizontalHeightCheckEnabled = true;\r\n outCharacterColliderSetup.myVerticalCheckParams.myVerticalPositionCheckEnabled = true;\r\n }\r\n\r\n outCharacterColliderSetup.myWallSlideParams.myWallSlideEnabled = simplifiedCreationParams.myShouldSlideAlongWall;\r\n\r\n\r\n\r\n outCharacterColliderSetup.myHorizontalCheckParams.myHorizontalCheckFeetDistanceToIgnore = simplifiedCreationParams.myMaxWalkableGroundStepHeight;\r\n\r\n outCharacterColliderSetup.myGroundParams.mySurfaceSnapMaxDistance = simplifiedCreationParams.myMaxDistanceToSnapOnGround;\r\n outCharacterColliderSetup.myGroundParams.mySurfacePopOutMaxDistance = Math.max(simplifiedCreationParams.myMaxDistanceToPopOutGround, outCharacterColliderSetup.myHorizontalCheckParams.myHorizontalCheckFeetDistanceToIgnore);\r\n\r\n outCharacterColliderSetup.myGroundParams.myHorizontalMovementSurfaceAngleToIgnoreMaxHorizontalMovementLeft = simplifiedCreationParams.myRadius * 0.75;\r\n\r\n outCharacterColliderSetup.myGroundParams.myCollectSurfaceInfo = simplifiedCreationParams.myCollectGroundInfo || simplifiedCreationParams.myMaxWalkableGroundAngle > 0;\r\n outCharacterColliderSetup.myGroundParams.mySurfaceAngleToIgnore = simplifiedCreationParams.myMaxWalkableGroundAngle;\r\n\r\n outCharacterColliderSetup.myGroundParams.myOnSurfaceMaxOutsideDistance = 0.001;\r\n outCharacterColliderSetup.myGroundParams.myOnSurfaceMaxInsideDistance = 0.001;\r\n\r\n outCharacterColliderSetup.myGroundParams.myCollectSurfaceNormalMaxOutsideDistance = (simplifiedCreationParams.myRadius > 0.1) ? 0.1 : 0.01;\r\n outCharacterColliderSetup.myGroundParams.myCollectSurfaceNormalMaxInsideDistance = outCharacterColliderSetup.myGroundParams.myCollectSurfaceNormalMaxOutsideDistance;\r\n outCharacterColliderSetup.myGroundParams.myCollectSurfaceDistanceOutsideDistance = outCharacterColliderSetup.myGroundParams.myCollectSurfaceNormalMaxOutsideDistance;\r\n outCharacterColliderSetup.myGroundParams.myCollectSurfaceDistanceInsideDistance = outCharacterColliderSetup.myGroundParams.myCollectSurfaceNormalMaxInsideDistance;\r\n outCharacterColliderSetup.myGroundParams.myCollectSurfaceCollisionHitOutsideDistance = outCharacterColliderSetup.myGroundParams.myCollectSurfaceNormalMaxOutsideDistance;\r\n outCharacterColliderSetup.myGroundParams.myCollectSurfaceCollisionHitInsideDistance = outCharacterColliderSetup.myGroundParams.myCollectSurfaceNormalMaxInsideDistance;\r\n\r\n outCharacterColliderSetup.myGroundParams.myHorizontalMovementAdjustVerticalMovementOverSurfacePerceivedAngleDownhill = true;\r\n outCharacterColliderSetup.myGroundParams.myHorizontalMovementAdjustVerticalMovementOverSurfacePerceivedAngleUphill = true;\r\n\r\n if (simplifiedCreationParams.myShouldNotFallFromEdges) {\r\n outCharacterColliderSetup.myGroundParams.myMovementMustStayOnSurface = true;\r\n outCharacterColliderSetup.myGroundParams.myMovementMustStayOnSurfaceAngleDownhill = Math.max(60, outCharacterColliderSetup.myGroundParams.mySurfaceAngleToIgnore);\r\n }\r\n\r\n\r\n outCharacterColliderSetup.myHorizontalCheckParams.myHorizontalCheckHeadDistanceToIgnore = simplifiedCreationParams.myMaxWalkableCeilingStepHeight;\r\n\r\n if (simplifiedCreationParams.myCheckCeilings) {\r\n outCharacterColliderSetup.myCeilingParams.mySurfacePopOutMaxDistance = Math.max(simplifiedCreationParams.myMaxDistanceToPopOutGround, outCharacterColliderSetup.myHorizontalCheckParams.myHorizontalCheckHeadDistanceToIgnore);\r\n\r\n outCharacterColliderSetup.myCeilingParams.myHorizontalMovementSurfaceAngleToIgnoreMaxHorizontalMovementLeft = outCharacterColliderSetup.myGroundParams.myHorizontalMovementSurfaceAngleToIgnoreMaxHorizontalMovementLeft;\r\n\r\n outCharacterColliderSetup.myCeilingParams.myCollectSurfaceInfo = outCharacterColliderSetup.myGroundParams.myCollectSurfaceInfo;\r\n outCharacterColliderSetup.myCeilingParams.mySurfaceAngleToIgnore = outCharacterColliderSetup.myGroundParams.mySurfaceAngleToIgnore;\r\n\r\n outCharacterColliderSetup.myCeilingParams.myOnSurfaceMaxOutsideDistance = outCharacterColliderSetup.myGroundParams.myOnSurfaceMaxOutsideDistance;\r\n outCharacterColliderSetup.myCeilingParams.myOnSurfaceMaxInsideDistance = outCharacterColliderSetup.myGroundParams.myOnSurfaceMaxInsideDistance;\r\n\r\n outCharacterColliderSetup.myCeilingParams.myCollectSurfaceNormalMaxOutsideDistance = outCharacterColliderSetup.myGroundParams.myCollectSurfaceNormalMaxOutsideDistance;\r\n outCharacterColliderSetup.myCeilingParams.myCollectSurfaceNormalMaxInsideDistance = outCharacterColliderSetup.myGroundParams.myCollectSurfaceNormalMaxInsideDistance;\r\n outCharacterColliderSetup.myCeilingParams.myCollectSurfaceDistanceOutsideDistance = outCharacterColliderSetup.myGroundParams.myCollectSurfaceDistanceOutsideDistance;\r\n outCharacterColliderSetup.myCeilingParams.myCollectSurfaceDistanceInsideDistance = outCharacterColliderSetup.myGroundParams.myCollectSurfaceDistanceInsideDistance;\r\n outCharacterColliderSetup.myCeilingParams.myCollectSurfaceCollisionHitOutsideDistance = outCharacterColliderSetup.myGroundParams.myCollectSurfaceCollisionHitOutsideDistance;\r\n outCharacterColliderSetup.myCeilingParams.myCollectSurfaceCollisionHitInsideDistance = outCharacterColliderSetup.myGroundParams.myCollectSurfaceCollisionHitInsideDistance;\r\n\r\n outCharacterColliderSetup.myCeilingParams.myHorizontalMovementAdjustVerticalMovementOverSurfacePerceivedAngleUphill = outCharacterColliderSetup.myGroundParams.myHorizontalMovementAdjustVerticalMovementOverSurfacePerceivedAngleUphill;\r\n }\r\n\r\n\r\n\r\n outCharacterColliderSetup.myHorizontalCheckParams.myHorizontalCheckBlockLayerFlags.copy(simplifiedCreationParams.myHorizontalCheckBlockLayerFlags);\r\n outCharacterColliderSetup.myHorizontalCheckParams.myHorizontalCheckObjectsToIgnore.pp_copy(simplifiedCreationParams.myHorizontalCheckObjectsToIgnore);\r\n\r\n outCharacterColliderSetup.myVerticalCheckParams.myVerticalCheckBlockLayerFlags.copy(simplifiedCreationParams.myVerticalCheckBlockLayerFlags);\r\n outCharacterColliderSetup.myVerticalCheckParams.myVerticalCheckObjectsToIgnore.pp_copy(simplifiedCreationParams.myVerticalCheckObjectsToIgnore);\r\n\r\n\r\n\r\n if (simplifiedCreationParams.myHorizontalCheckDebugEnabled) {\r\n outCharacterColliderSetup.myDebugParams.myVisualDebugEnabled = true;\r\n outCharacterColliderSetup.myDebugParams.myVisualDebugHorizontalMovementCheckEnabled = true;\r\n outCharacterColliderSetup.myDebugParams.myVisualDebugHorizontalPositionCheckEnabled = true;\r\n outCharacterColliderSetup.myDebugParams.myVisualDebugSlideEnabled = true;\r\n }\r\n\r\n if (simplifiedCreationParams.myVerticalCheckDebugEnabled) {\r\n outCharacterColliderSetup.myDebugParams.myVisualDebugEnabled = true;\r\n outCharacterColliderSetup.myDebugParams.myVisualDebugVerticalMovementCheckEnabled = true;\r\n outCharacterColliderSetup.myDebugParams.myVisualDebugVerticalPositionCheckEnabled = true;\r\n }\r\n\r\n\r\n\r\n // ACCURACY\r\n\r\n if (simplifiedCreationParams.myAccuracyLevel >= CharacterColliderSetupSimplifiedCreationAccuracyLevel.VERY_LOW) {\r\n outCharacterColliderSetup.myHorizontalCheckParams.myHorizontalCheckConeHalfAngle = 60;\r\n\r\n outCharacterColliderSetup.myHorizontalCheckParams.myHorizontalMovementHeightVerticalCheckEnabled = true;\r\n outCharacterColliderSetup.myHorizontalCheckParams.myHorizontalPositionHeightVerticalCheckEnabled = true;\r\n\r\n // Enable based on speed?\r\n outCharacterColliderSetup.myHorizontalCheckParams.myHorizontalMovementCheckEnabled = false;\r\n\r\n outCharacterColliderSetup.myHorizontalCheckParams.myHorizontalPositionCheckEnabled = true;\r\n outCharacterColliderSetup.myHorizontalCheckParams.myHorizontalPositionCheckConeHalfSlices = 1;\r\n outCharacterColliderSetup.myHorizontalCheckParams.myHorizontalPositionHeightCheckSteps = 1;\r\n outCharacterColliderSetup.myHorizontalCheckParams.myHorizontalPositionHorizontalRadialCheckEnabled = true;\r\n outCharacterColliderSetup.myHorizontalCheckParams.myHorizontalPositionVerticalStraightCheckEnabled = true;\r\n\r\n\r\n\r\n outCharacterColliderSetup.myVerticalCheckParams.myVerticalCheckCircumferenceSlices = 4;\r\n outCharacterColliderSetup.myVerticalCheckParams.myVerticalCheckCircumferenceCentralCheckEnabled = true;\r\n outCharacterColliderSetup.myVerticalCheckParams.myVerticalCheckCircumferenceRadialSteps = 1;\r\n\r\n outCharacterColliderSetup.myVerticalCheckParams.myVerticalMovementCheckEnabled = true;\r\n outCharacterColliderSetup.myVerticalCheckParams.myVerticalMovementCheckReductionEnabled = true;\r\n\r\n outCharacterColliderSetup.myVerticalCheckParams.myVerticalCheckAllowHitsInsideCollisionIfOneValid = true;\r\n\r\n if (simplifiedCreationParams.myIsPlayer) {\r\n outCharacterColliderSetup.myWallSlideParams.myWallSlideMaxAttempts = 2;\r\n outCharacterColliderSetup.myWallSlideParams.my90DegreesWallSlideAdjustDirectionSign = true;\r\n }\r\n }\r\n\r\n if (simplifiedCreationParams.myAccuracyLevel >= CharacterColliderSetupSimplifiedCreationAccuracyLevel.LOW) {\r\n outCharacterColliderSetup.myHorizontalCheckParams.myHorizontalMovementCheckEnabled = true;\r\n outCharacterColliderSetup.myHorizontalCheckParams.myHorizontalMovementCheckRadialSteps = 1;\r\n outCharacterColliderSetup.myHorizontalCheckParams.myHorizontalMovementHeightCheckSteps = 1;\r\n outCharacterColliderSetup.myHorizontalCheckParams.myHorizontalMovementHorizontalStraightCentralCheckEnabled = true;\r\n outCharacterColliderSetup.myHorizontalCheckParams.myHorizontalMovementVerticalStraightDiagonalUpwardCentralCheckEnabled = true;\r\n\r\n\r\n\r\n outCharacterColliderSetup.myVerticalCheckParams.myVerticalCheckCircumferenceRadialSteps = 2;\r\n outCharacterColliderSetup.myVerticalCheckParams.myVerticalCheckCircumferenceRotationPerRadialStep = 180 / outCharacterColliderSetup.myVerticalCheckParams.myVerticalCheckCircumferenceSlices;\r\n\r\n\r\n\r\n outCharacterColliderSetup.myWallSlideParams.myWallSlideMaxAttempts = 2;\r\n outCharacterColliderSetup.myWallSlideParams.myCheckBothWallSlideDirections = false;\r\n outCharacterColliderSetup.myWallSlideParams.myWallSlideFlickerPreventionMode = CharacterColliderSlideFlickerPreventionMode.NONE;\r\n outCharacterColliderSetup.myWallSlideParams.myWallSlideFlickerPreventionCheckOnlyIfAlreadySliding = false;\r\n outCharacterColliderSetup.myWallSlideParams.myWallSlideFlickerPreventionForceCheckCounter = 0;\r\n outCharacterColliderSetup.myWallSlideParams.my90DegreesWallSlideAdjustDirectionSign = false;\r\n }\r\n\r\n if (simplifiedCreationParams.myAccuracyLevel >= CharacterColliderSetupSimplifiedCreationAccuracyLevel.MEDIUM) {\r\n outCharacterColliderSetup.myHorizontalCheckParams.myHorizontalMovementHeightHorizontalCheckEnabled = true;\r\n outCharacterColliderSetup.myHorizontalCheckParams.myHorizontalMovementHorizontalDiagonalOutwardCheckEnabled = true;\r\n outCharacterColliderSetup.myHorizontalCheckParams.myHorizontalMovementVerticalDiagonalOutwardUpwardCheckEnabled = true;\r\n\r\n outCharacterColliderSetup.myHorizontalCheckParams.myHorizontalPositionCheckConeHalfSlices = 2;\r\n outCharacterColliderSetup.myHorizontalCheckParams.myHorizontalPositionHeightHorizontalCheckEnabled = true;\r\n outCharacterColliderSetup.myHorizontalCheckParams.myHorizontalPositionHorizontalBorderCheckEnabled = true;\r\n\r\n\r\n\r\n outCharacterColliderSetup.myVerticalCheckParams.myVerticalMovementCheckPerformCheckOnBothSides = true;\r\n outCharacterColliderSetup.myVerticalCheckParams.myVerticalPositionCheckPerformCheckOnBothSides = true;\r\n\r\n outCharacterColliderSetup.myVerticalCheckParams.myVerticalCheckCircumferenceSlices = 6;\r\n outCharacterColliderSetup.myVerticalCheckParams.myVerticalCheckCircumferenceRadialSteps = 2;\r\n outCharacterColliderSetup.myVerticalCheckParams.myVerticalCheckCircumferenceRotationPerRadialStep = 180 / outCharacterColliderSetup.myVerticalCheckParams.myVerticalCheckCircumferenceSlices;\r\n\r\n\r\n\r\n outCharacterColliderSetup.myWallSlideParams.myWallSlideMaxAttempts = 3;\r\n outCharacterColliderSetup.myWallSlideParams.my90DegreesWallSlideAdjustDirectionSign = true;\r\n\r\n if (simplifiedCreationParams.myIsPlayer) {\r\n outCharacterColliderSetup.myWallSlideParams.myWallSlideFlickerPreventionMode = CharacterColliderSlideFlickerPreventionMode.USE_PREVIOUS_RESULTS;\r\n outCharacterColliderSetup.myWallSlideParams.myWallSlideFlickerPreventionCheckOnlyIfAlreadySliding = true;\r\n outCharacterColliderSetup.myWallSlideParams.myWallSlideFlickerPreventionForceCheckCounter = 4;\r\n }\r\n\r\n\r\n\r\n outCharacterColliderSetup.mySplitMovementParams.mySplitMovementEnabled = true;\r\n outCharacterColliderSetup.mySplitMovementParams.mySplitMovementMaxSteps = simplifiedCreationParams.myMaxMovementSteps;\r\n\r\n const safeRadius = simplifiedCreationParams.myRadius * 0.75;\r\n outCharacterColliderSetup.mySplitMovementParams.mySplitMovementMaxStepLength = safeRadius;\r\n outCharacterColliderSetup.mySplitMovementParams.mySplitMovementMinStepLength = safeRadius;\r\n }\r\n\r\n if (simplifiedCreationParams.myAccuracyLevel >= CharacterColliderSetupSimplifiedCreationAccuracyLevel.HIGH) {\r\n if (outCharacterColliderSetup.myWallSlideParams.myWallSlideEnabled) {\r\n outCharacterColliderSetup.myHorizontalCheckParams.myHorizontalMovementCheckGetBetterReferenceHit = true;\r\n\r\n outCharacterColliderSetup.myHorizontalCheckParams.myHorizontalPositionVerticalCheckPerformHorizontalCheckOnHit = true;\r\n outCharacterColliderSetup.myHorizontalCheckParams.myHorizontalPositionVerticalCheckPerformHorizontalCheckOnHitKeepVerticalHitIfNoHorizontalHit = true;\r\n }\r\n\r\n outCharacterColliderSetup.myHorizontalCheckParams.myHorizontalMovementHorizontalDiagonalInwardCheckEnabled = true;\r\n outCharacterColliderSetup.myHorizontalCheckParams.myHorizontalMovementHorizontalStraightCheckEnabled = true;\r\n outCharacterColliderSetup.myHorizontalCheckParams.myHorizontalMovementHorizontalStraightCentralCheckEnabled = false;\r\n\r\n outCharacterColliderSetup.myHorizontalCheckParams.myHorizontalMovementVerticalDiagonalInwardUpwardCheckEnabled = true;\r\n outCharacterColliderSetup.myHorizontalCheckParams.myHorizontalMovementVerticalStraightDiagonalUpwardCheckEnabled = true;\r\n outCharacterColliderSetup.myHorizontalCheckParams.myHorizontalMovementVerticalStraightDiagonalUpwardCentralCheckEnabled = false;\r\n\r\n\r\n\r\n outCharacterColliderSetup.myVerticalCheckParams.myVerticalCheckCircumferenceSlices = 8;\r\n outCharacterColliderSetup.myVerticalCheckParams.myVerticalCheckCircumferenceRadialSteps = 2;\r\n outCharacterColliderSetup.myVerticalCheckParams.myVerticalCheckCircumferenceRotationPerRadialStep = 180 / outCharacterColliderSetup.myVerticalCheckParams.myVerticalCheckCircumferenceSlices;\r\n\r\n\r\n\r\n outCharacterColliderSetup.myWallSlideParams.myWallSlideMaxAttempts = 4;\r\n\r\n if (simplifiedCreationParams.myIsPlayer) {\r\n outCharacterColliderSetup.myWallSlideParams.myCheckBothWallSlideDirections = true;\r\n }\r\n\r\n\r\n\r\n outCharacterColliderSetup.myGroundParams.myBaseInsideCollisionCheckEnabled = true;\r\n\r\n if (simplifiedCreationParams.myCheckCeilings) {\r\n outCharacterColliderSetup.myCeilingParams.myBaseInsideCollisionCheckEnabled = true;\r\n }\r\n }\r\n\r\n if (simplifiedCreationParams.myAccuracyLevel >= CharacterColliderSetupSimplifiedCreationAccuracyLevel.VERY_HIGH) {\r\n outCharacterColliderSetup.myHorizontalCheckParams.myHorizontalMovementHeightCheckSteps = 2;\r\n\r\n outCharacterColliderSetup.myHorizontalCheckParams.myHorizontalMovementHorizontalRadialCheckEnabled = true;\r\n outCharacterColliderSetup.myHorizontalCheckParams.myHorizontalMovementVerticalDiagonalOutwardDownwardCheckEnabled = true;\r\n outCharacterColliderSetup.myHorizontalCheckParams.myHorizontalMovementVerticalDiagonalInwardDownwardCheckEnabled = true;\r\n\r\n outCharacterColliderSetup.myHorizontalCheckParams.myHorizontalMovementVerticalStraightCheckEnabled = true;\r\n outCharacterColliderSetup.myHorizontalCheckParams.myHorizontalMovementVerticalStraightCentralCheckEnabled = false;\r\n outCharacterColliderSetup.myHorizontalCheckParams.myHorizontalMovementVerticalStraightDiagonalDownwardCheckEnabled = true;\r\n outCharacterColliderSetup.myHorizontalCheckParams.myHorizontalMovementVerticalStraightDiagonalDownwardCentralCheckEnabled = false;\r\n\r\n outCharacterColliderSetup.myHorizontalCheckParams.myHorizontalPositionHeightCheckSteps = 2;\r\n\r\n outCharacterColliderSetup.myHorizontalCheckParams.myHorizontalPositionVerticalRadialDiagonalOutwardCheckEnabled = true;\r\n outCharacterColliderSetup.myHorizontalCheckParams.myHorizontalPositionVerticalBorderDiagonalOutwardCheckEnabled = true;\r\n\r\n outCharacterColliderSetup.myHorizontalCheckParams.myHorizontalPositionVerticalCheckPerformHorizontalCheckOnHit = true;\r\n outCharacterColliderSetup.myHorizontalCheckParams.myHorizontalPositionVerticalCheckPerformHorizontalCheckOnHitKeepVerticalHitIfNoHorizontalHit = true;\r\n\r\n\r\n\r\n outCharacterColliderSetup.myGroundParams.myRecollectSurfaceInfoOnSurfaceCheckFailed = true;\r\n\r\n if (simplifiedCreationParams.myCheckCeilings) {\r\n outCharacterColliderSetup.myCeilingParams.myRecollectSurfaceInfoOnSurfaceCheckFailed = outCharacterColliderSetup.myGroundParams.myRecollectSurfaceInfoOnSurfaceCheckFailed;\r\n }\r\n }\r\n\r\n return outCharacterColliderSetup;\r\n}\r\n\r\nexport function createTeleportColliderSetupFromMovementColliderSetup(movementColliderSetup: Readonly, outTeleportColliderSetup: CharacterColliderSetup = new CharacterColliderSetup()): CharacterColliderSetup {\r\n outTeleportColliderSetup.copy(movementColliderSetup);\r\n\r\n outTeleportColliderSetup.myHorizontalCheckParams.myHorizontalCheckConeHalfAngle = 180;\r\n outTeleportColliderSetup.myHorizontalCheckParams.myHorizontalPositionCheckConeHalfSlices =\r\n Math.round((outTeleportColliderSetup.myHorizontalCheckParams.myHorizontalCheckConeHalfAngle / movementColliderSetup.myHorizontalCheckParams.myHorizontalCheckConeHalfAngle)\r\n * movementColliderSetup.myHorizontalCheckParams.myHorizontalPositionCheckConeHalfSlices);\r\n\r\n outTeleportColliderSetup.myHorizontalCheckParams.myHorizontalCheckFixedForwardEnabled = true;\r\n outTeleportColliderSetup.myHorizontalCheckParams.myHorizontalCheckFixedForward.vec3_set(0, 0, 1);\r\n\r\n return outTeleportColliderSetup;\r\n}\r\n\r\nexport const CharacterColliderSetupUtils = {\r\n createSimplified,\r\n createTeleportColliderSetupFromMovementColliderSetup\r\n} as const;", "import { Object3D, WonderlandEngine } from \"@wonderlandengine/api\";\r\nimport { Timer } from \"../../../../../cauldron/cauldron/timer.js\";\r\nimport { Quaternion, Quaternion2, Vector3 } from \"../../../../../cauldron/type_definitions/array_type_definitions.js\";\r\nimport { Quat2Utils } from \"../../../../../cauldron/utils/array/quat2_utils.js\";\r\nimport { XRUtils } from \"../../../../../cauldron/utils/xr_utils.js\";\r\nimport { mat4_create, quat2_create, quat_create, vec3_create, vec4_create } from \"../../../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Globals } from \"../../../../../pp/globals.js\";\r\n\r\nexport enum NonVRReferenceSpaceMode {\r\n NO_FLOOR = 0,\r\n FLOOR = 1,\r\n NO_FLOOR_THEN_KEEP_VR = 2,\r\n FLOOR_THEN_KEEP_VR = 3\r\n}\r\n\r\nexport class PlayerHeadManagerParams {\r\n\r\n public mySessionChangeResyncEnabled: boolean = false;\r\n\r\n public myBlurEndResyncEnabled: boolean = false;\r\n public myBlurEndResyncRotation: boolean = false;\r\n\r\n public myResetTransformOnViewResetEnabled: boolean = true;\r\n\r\n public myNextEnterSessionResyncHeight: boolean = false;\r\n public myEnterSessionResyncHeight: boolean = false;\r\n\r\n\r\n\r\n public myExitSessionResyncHeight: boolean = false;\r\n public myExitSessionResyncVerticalAngle: boolean = false;\r\n\r\n /** For now right tilt is removed even if this setting is `false`, if the vertical angle has to be adjusted */\r\n public myExitSessionRemoveRightTilt: boolean = false;\r\n\r\n public myExitSessionAdjustMaxVerticalAngle: boolean = false;\r\n public myExitSessionMaxVerticalAngle: number = 0;\r\n public myExitSessionResetNonVRTransformLocal: boolean = true;\r\n\r\n\r\n\r\n public myNonVRFloorBasedMode: NonVRReferenceSpaceMode = NonVRReferenceSpaceMode.FLOOR_THEN_KEEP_VR;\r\n\r\n\r\n\r\n public myDefaultHeightNonVR: number = 0;\r\n public myDefaultHeightVRWithoutFloor: number = 0;\r\n\r\n /** `null` means just keep the detected one */\r\n public myDefaultHeightVRWithFloor: number | null = null;\r\n\r\n /** Can be used to always add a bit of height, for example to compensate the fact \r\n that the default height is actually the eye height and you may want to also add a forehead offset */\r\n public myForeheadExtraHeight: number = 0;\r\n\r\n\r\n\r\n public myFeetRotationKeepUp: boolean = true;\r\n\r\n public myDebugEnabled: boolean = false;\r\n\r\n public readonly myEngine: Readonly;\r\n\r\n constructor(engine: Readonly = Globals.getMainEngine()!) {\r\n this.myEngine = engine;\r\n }\r\n}\r\n\r\n// #TODO Could be seen as the generic player body manager (maybe with hands and stuff also)\r\nexport class PlayerHeadManager {\r\n\r\n private readonly _myParams: PlayerHeadManagerParams;\r\n\r\n private _myCurrentHead: Object3D;\r\n private readonly _myCurrentHeadTransformLocalQuat: Quaternion2 = quat2_create();\r\n\r\n\r\n private _mySessionChangeResyncHeadTransform: Readonly | null = null;\r\n\r\n /** Needed because VR head takes some frames to get the tracked position */\r\n private _myDelaySessionChangeResyncCounter: number = 0;\r\n\r\n\r\n private _myBlurRecoverHeadTransform: Readonly | null = null;\r\n private _myDelayBlurEndResyncCounter: number = 0;\r\n private readonly _myDelayBlurEndResyncTimer = new Timer(5, false);\r\n\r\n private _myVisibilityHidden: boolean = false;\r\n private _myVisibilityChangeEventListener: ((event: XRSessionEvent) => any) | null = null;\r\n\r\n private _mySessionActive: boolean = false;\r\n private _mySessionBlurred: boolean = false;\r\n\r\n private _myIsSyncedDelayCounter: number = 0;\r\n\r\n private _myViewResetThisFrame: boolean = false;\r\n private _myViewResetEventListener: ((event: XRReferenceSpaceEvent) => any) | null = null;\r\n\r\n private _myHeightNonVR: number = 0;\r\n private _myHeightNonVROnEnterSession: number = 0;\r\n private _myHeightVRWithoutFloor: number | null = null;\r\n private _myHeightVRWithFloor: number | null = null;\r\n private _myHeightOffsetWithFloor: number = 0;\r\n private _myHeightOffsetWithoutFloor: number = 0;\r\n private _myNextEnterSessionSetHeightVRWithFloor: boolean = false;\r\n private _myNextEnterSessionSetHeightVRWithoutFloor: boolean = false;\r\n private _myDelayNextEnterSessionSetHeightVRCounter: number = 0;\r\n\r\n private _myLastReferenceSpaceIsFloorBased: boolean | null = null;\r\n\r\n private _myActive: boolean = true;\r\n\r\n private _myDestroyed: boolean = false;\r\n\r\n private static readonly _myResyncCounterFrames = 3;\r\n private static readonly _myIsSyncedDelayCounterFrames = 1;\r\n\r\n constructor(params: PlayerHeadManagerParams = new PlayerHeadManagerParams()) {\r\n this._myParams = params;\r\n\r\n this._myCurrentHead = Globals.getPlayerObjects(this._myParams.myEngine)!.myHead!;\r\n }\r\n\r\n public start(): void {\r\n this._setHeightHeadNonVR(this._myParams.myDefaultHeightNonVR);\r\n this._setHeightHeadVRWithoutFloor(this._myParams.myDefaultHeightVRWithoutFloor);\r\n this._setHeightHeadVRWithFloor(this._myParams.myDefaultHeightVRWithFloor);\r\n\r\n this._updateHeightOffset();\r\n\r\n this._setCameraNonXRHeight(this._myHeightNonVR);\r\n\r\n this._myActive = false;\r\n this.setActive(true);\r\n }\r\n\r\n public setActive(active: boolean): void {\r\n if (this._myActive != active) {\r\n this._myActive = active;\r\n\r\n if (this._myActive) {\r\n XRUtils.registerSessionStartEndEventListeners(this, this._onXRSessionStart.bind(this), this._onXRSessionEnd.bind(this), true, true, this._myParams.myEngine);\r\n } else {\r\n if (this._myViewResetEventListener != null) {\r\n XRUtils.getReferenceSpace(this._myParams.myEngine)?.removeEventListener?.(\"reset\", this._myViewResetEventListener);\r\n }\r\n\r\n if (this._myVisibilityChangeEventListener != null) {\r\n XRUtils.getSession(this._myParams.myEngine)?.removeEventListener?.(\"visibilitychange\", this._myVisibilityChangeEventListener);\r\n }\r\n\r\n XRUtils.unregisterSessionStartEndEventListeners(this, this._myParams.myEngine);\r\n\r\n this._onXRSessionEnd();\r\n }\r\n\r\n this.cancelSync();\r\n }\r\n }\r\n\r\n public getParams(): PlayerHeadManagerParams {\r\n return this._myParams;\r\n }\r\n\r\n public getPlayer(): Object3D {\r\n return Globals.getPlayerObjects(this._myParams.myEngine)!.myPlayer!;\r\n }\r\n\r\n public getHead(): Object3D {\r\n return this._myCurrentHead;\r\n }\r\n\r\n public getHeightHead(): number {\r\n return this.getHeightEyes() + this._myParams.myForeheadExtraHeight;\r\n }\r\n\r\n private static readonly _getHeightEyesSV =\r\n {\r\n headPosition: vec3_create()\r\n };\r\n public getHeightEyes(): number {\r\n const headPosition = PlayerHeadManager._getHeightEyesSV.headPosition;\r\n this._myCurrentHead.pp_getPosition(headPosition);\r\n const eyesHeight = this._getPositionEyesHeight(headPosition);\r\n\r\n return eyesHeight;\r\n }\r\n\r\n private static readonly _getTransformFeetQuatSV =\r\n {\r\n feetPosition: vec3_create(),\r\n feetRotationQuat: quat_create()\r\n };\r\n public getTransformFeetQuat(): Quaternion2;\r\n public getTransformFeetQuat(outTransformQuat: T): T;\r\n public getTransformFeetQuat(outTransformQuat: Quaternion2 | T = quat2_create()): Quaternion2 | T {\r\n const feetPosition = PlayerHeadManager._getTransformFeetQuatSV.feetPosition;\r\n const feetRotationQuat = PlayerHeadManager._getTransformFeetQuatSV.feetRotationQuat;\r\n outTransformQuat.quat2_setPositionRotationQuat(this.getPositionFeet(feetPosition), this.getRotationFeetQuat(feetRotationQuat));\r\n return outTransformQuat;\r\n }\r\n\r\n public getTransformHeadQuat(): Quaternion2;\r\n public getTransformHeadQuat(outTransformQuat: T): T;\r\n public getTransformHeadQuat(outTransformQuat: Quaternion2 | T = quat2_create()): Quaternion2 | T {\r\n return this.getHead().pp_getTransformQuat(outTransformQuat);\r\n }\r\n\r\n private static readonly _getPositionFeetSV =\r\n {\r\n headPosition: vec3_create(),\r\n playerUp: vec3_create()\r\n };\r\n public getPositionFeet(): Vector3;\r\n public getPositionFeet(outPosition: T): T;\r\n public getPositionFeet(outPosition: Vector3 | T = vec3_create()): Vector3 | T {\r\n const headPosition = PlayerHeadManager._getPositionFeetSV.headPosition;\r\n this._myCurrentHead.pp_getPosition(headPosition);\r\n const headHeight = this._getPositionEyesHeight(headPosition);\r\n\r\n const playerUp = PlayerHeadManager._getPositionFeetSV.playerUp;\r\n this.getPlayer().pp_getUp(playerUp);\r\n outPosition = headPosition.vec3_sub(playerUp.vec3_scale(headHeight, outPosition), outPosition);\r\n\r\n return outPosition;\r\n }\r\n\r\n public getPositionHead(): Vector3;\r\n public getPositionHead(outPosition: T): T;\r\n public getPositionHead(outPosition: Vector3 | T = vec3_create()): Vector3 | T {\r\n return this._myCurrentHead.pp_getPosition(outPosition);\r\n }\r\n\r\n private static readonly _getRotationFeetQuatSV =\r\n {\r\n playerUp: vec3_create(),\r\n headForward: vec3_create()\r\n };\r\n public getRotationFeetQuat(): Quaternion;\r\n public getRotationFeetQuat(outRotationQuat: T): T;\r\n public getRotationFeetQuat(outRotationQuat: Quaternion | T = quat_create()): Quaternion | T {\r\n const playerUp = PlayerHeadManager._getRotationFeetQuatSV.playerUp;\r\n const headForward = PlayerHeadManager._getRotationFeetQuatSV.headForward;\r\n this.getPlayer().pp_getUp(playerUp);\r\n this._myCurrentHead.pp_getForward(headForward);\r\n\r\n // Feet are considered to always be flat on the player up\r\n const angleWithUp = headForward.vec3_angle(playerUp);\r\n const mingAngle = 10;\r\n if (angleWithUp < mingAngle) {\r\n this._myCurrentHead.pp_getDown(headForward);\r\n } else if (angleWithUp > 180 - mingAngle) {\r\n this._myCurrentHead.pp_getUp(headForward);\r\n }\r\n\r\n headForward.vec3_removeComponentAlongAxis(playerUp, headForward);\r\n headForward.vec3_normalize(headForward);\r\n\r\n outRotationQuat.quat_setUp(playerUp, headForward);\r\n return outRotationQuat;\r\n }\r\n\r\n public getRotationHeadQuat(): Quaternion;\r\n public getRotationHeadQuat(outRotationQuat: T): T;\r\n public getRotationHeadQuat(outRotationQuat: Quaternion | T = quat_create()): Quaternion | T {\r\n return this.getHead().pp_getRotationQuat(outRotationQuat);\r\n }\r\n\r\n public isSynced(ignoreSessionBlurredState: boolean = false): boolean {\r\n return this._myIsSyncedDelayCounter == 0 && this._myDelaySessionChangeResyncCounter == 0 && this._myDelayNextEnterSessionSetHeightVRCounter == 0 && this._myDelayBlurEndResyncCounter == 0 && !this._myDelayBlurEndResyncTimer.isRunning() && (ignoreSessionBlurredState || !this._mySessionBlurred);\r\n }\r\n\r\n public setHeightHead(height: number, setOnlyForActiveOne: boolean = true): void {\r\n this._setHeightHead(height, height, height, setOnlyForActiveOne);\r\n }\r\n\r\n public setHeightHeadNonVR(height: number): void {\r\n this._setHeightHeadNonVR(height);\r\n\r\n if (!this._mySessionActive) {\r\n this._updateHeightOffset();\r\n this._setCameraNonXRHeight(this._myHeightNonVR);\r\n }\r\n }\r\n\r\n public setHeightHeadVRWithoutFloor(height: number): void {\r\n this._setHeightHeadVRWithoutFloor(height);\r\n\r\n if (this._mySessionActive) {\r\n this._updateHeightOffset();\r\n }\r\n }\r\n\r\n public setHeightHeadVRWithFloor(height = null): void {\r\n this._setHeightHeadVRWithFloor(height);\r\n\r\n if (this._mySessionActive) {\r\n this._updateHeightOffset();\r\n }\r\n }\r\n\r\n public resetHeightHeadToDefault(resetOnlyForActiveOne: boolean = true): void {\r\n this._setHeightHead(this._myHeightNonVR, this._myHeightVRWithoutFloor, this._myHeightVRWithFloor, resetOnlyForActiveOne);\r\n }\r\n\r\n public resetHeightHeadVRWithFloor(): void {\r\n this.setHeightHeadVRWithFloor(null);\r\n }\r\n\r\n public getDefaultHeightHeadNonVR(): number {\r\n return this._myHeightNonVR;\r\n }\r\n\r\n public getDefaultHeightHeadVRWithoutFloor(): number | null {\r\n return this._myHeightVRWithoutFloor;\r\n }\r\n\r\n public getDefaultHeightHeadVRWithFloor(): number | null {\r\n return this._myHeightVRWithFloor;\r\n }\r\n\r\n public getForeheadExtraHeight(): number {\r\n return this._myParams.myForeheadExtraHeight;\r\n }\r\n\r\n public setForeheadExtraHeight(foreheadExtraHeight: number, keepSameHeight: boolean = false, keepSameHeightOnlyForActiveOne: boolean = true): void {\r\n this._myParams.myForeheadExtraHeight = foreheadExtraHeight;\r\n\r\n if (keepSameHeight && (!keepSameHeightOnlyForActiveOne || !this._mySessionActive)) {\r\n this._setHeightHeadNonVR(this._myHeightNonVR);\r\n } else {\r\n this._myHeightNonVR = Math.max(this._myHeightNonVR + (foreheadExtraHeight - this._myParams.myForeheadExtraHeight), this._myParams.myForeheadExtraHeight);\r\n this._myHeightNonVROnEnterSession = Math.max(this._myHeightNonVROnEnterSession + (foreheadExtraHeight - this._myParams.myForeheadExtraHeight), this._myParams.myForeheadExtraHeight);\r\n }\r\n\r\n if (keepSameHeight && (!keepSameHeightOnlyForActiveOne || this._mySessionActive)) {\r\n this._setHeightHeadVRWithoutFloor(this._myHeightVRWithoutFloor);\r\n this._setHeightHeadVRWithFloor(this._myHeightVRWithFloor);\r\n } else {\r\n if (this._myHeightVRWithoutFloor != null) {\r\n this._myHeightVRWithoutFloor = Math.max(this._myHeightVRWithoutFloor + (foreheadExtraHeight - this._myParams.myForeheadExtraHeight), this._myParams.myForeheadExtraHeight);\r\n }\r\n\r\n if (this._myHeightVRWithFloor != null) {\r\n this._myHeightVRWithFloor = Math.max(this._myHeightVRWithFloor + (foreheadExtraHeight - this._myParams.myForeheadExtraHeight), this._myParams.myForeheadExtraHeight);\r\n }\r\n }\r\n\r\n if (keepSameHeight) {\r\n this._updateHeightOffset();\r\n\r\n if (!this._mySessionActive) {\r\n this._setCameraNonXRHeight(this._myHeightNonVR);\r\n }\r\n }\r\n }\r\n\r\n public moveFeet(movement: Readonly): void {\r\n this.getPlayer().pp_translate(movement);\r\n }\r\n\r\n public moveHead(movement: Readonly): void {\r\n this.moveFeet(movement);\r\n }\r\n\r\n private static readonly _teleportPositionHeadSV =\r\n {\r\n currentHeadPosition: vec3_create(),\r\n teleportMovementToPerform: vec3_create()\r\n };\r\n public teleportPositionHead(teleportPosition: Readonly): void {\r\n const currentHeadPosition = PlayerHeadManager._teleportPositionHeadSV.currentHeadPosition;\r\n const teleportMovementToPerform = PlayerHeadManager._teleportPositionHeadSV.teleportMovementToPerform;\r\n this._myCurrentHead.pp_getPosition(currentHeadPosition);\r\n teleportPosition.vec3_sub(currentHeadPosition, teleportMovementToPerform);\r\n this.moveFeet(teleportMovementToPerform);\r\n }\r\n\r\n private static readonly _teleportPositionFeetSV =\r\n {\r\n currentFeetPosition: vec3_create(),\r\n teleportMovementToPerform: vec3_create()\r\n };\r\n public teleportPositionFeet(teleportPosition: Readonly): void {\r\n const currentFeetPosition = PlayerHeadManager._teleportPositionFeetSV.currentFeetPosition;\r\n const teleportMovementToPerform = PlayerHeadManager._teleportPositionFeetSV.teleportMovementToPerform;\r\n this.getPositionFeet(currentFeetPosition);\r\n teleportPosition.vec3_sub(currentFeetPosition, teleportMovementToPerform);\r\n this.moveFeet(teleportMovementToPerform);\r\n }\r\n\r\n private static readonly _teleportPlayerToHeadTransformQuatSV =\r\n {\r\n headPosition: vec3_create(),\r\n playerUp: vec3_create(),\r\n flatCurrentPlayerPosition: vec3_create(),\r\n flatNewPlayerPosition: vec3_create(),\r\n teleportMovement: vec3_create(),\r\n playerForward: vec3_create(),\r\n headForward: vec3_create(),\r\n referenceSpaceForward: vec3_create(),\r\n referenceSpaceForwardNegated: vec3_create(),\r\n rotationToPerform: quat_create()\r\n };\r\n public teleportPlayerToHeadTransformQuat(headTransformQuat: Readonly): void {\r\n const headPosition = PlayerHeadManager._teleportPlayerToHeadTransformQuatSV.headPosition;\r\n headTransformQuat.quat2_getPosition(headPosition);\r\n\r\n const playerUp = PlayerHeadManager._teleportPlayerToHeadTransformQuatSV.playerUp;\r\n const flatCurrentPlayerPosition = PlayerHeadManager._teleportPlayerToHeadTransformQuatSV.flatCurrentPlayerPosition;\r\n const flatNewPlayerPosition = PlayerHeadManager._teleportPlayerToHeadTransformQuatSV.flatNewPlayerPosition;\r\n this.getPlayer().pp_getUp(playerUp);\r\n this.getPlayer().pp_getPosition(flatCurrentPlayerPosition).vec3_removeComponentAlongAxis(playerUp, flatCurrentPlayerPosition);\r\n headPosition.vec3_removeComponentAlongAxis(playerUp, flatNewPlayerPosition);\r\n\r\n const teleportMovement = PlayerHeadManager._teleportPlayerToHeadTransformQuatSV.teleportMovement;\r\n flatNewPlayerPosition.vec3_sub(flatCurrentPlayerPosition, teleportMovement);\r\n this.getPlayer().pp_translate(teleportMovement);\r\n\r\n const playerForward = PlayerHeadManager._teleportPlayerToHeadTransformQuatSV.playerForward;\r\n const headForward = PlayerHeadManager._teleportPlayerToHeadTransformQuatSV.headForward;\r\n this.getPlayer().pp_getForward(playerForward);\r\n headTransformQuat.quat2_getForward(headForward);\r\n\r\n const rotationToPerform = PlayerHeadManager._teleportPlayerToHeadTransformQuatSV.rotationToPerform;\r\n playerForward.vec3_rotationToPivotedQuat(headForward, playerUp, rotationToPerform);\r\n\r\n this.getPlayer().pp_rotateQuat(rotationToPerform);\r\n\r\n // Adjust player rotation based on the reference space rotation, which should not actually be touched,\r\n // but just in case\r\n\r\n this.getPlayer().pp_getForward(playerForward);\r\n\r\n const referenceSpaceForward = PlayerHeadManager._teleportPlayerToHeadTransformQuatSV.referenceSpaceForward;\r\n const referenceSpaceForwardNegated = PlayerHeadManager._teleportPlayerToHeadTransformQuatSV.referenceSpaceForwardNegated;\r\n Globals.getPlayerObjects(this._myParams.myEngine)!.myReferenceSpace!.pp_getForward(referenceSpaceForward);\r\n referenceSpaceForward.vec3_negate(referenceSpaceForwardNegated);\r\n\r\n referenceSpaceForwardNegated.vec3_rotationToPivotedQuat(playerForward, playerUp, rotationToPerform);\r\n\r\n this.getPlayer().pp_rotateQuat(rotationToPerform);\r\n }\r\n\r\n private static readonly _rotateFeetQuatSV =\r\n {\r\n playerUp: vec3_create(),\r\n rotationAxis: vec3_create(),\r\n currentHeadPosition: vec3_create(),\r\n currentFeetRotation: quat_create(),\r\n newFeetRotation: quat_create(),\r\n fixedNewFeetRotation: quat_create(),\r\n newFeetForward: vec3_create(),\r\n fixedRotation: quat_create(),\r\n newHeadPosition: vec3_create(),\r\n headAdjustmentMovement: vec3_create()\r\n };\r\n public rotateFeetQuat(rotationQuat: Readonly, keepUpOverride: boolean | null = null): void {\r\n const angle = rotationQuat.quat_getAngleRadians();\r\n if (angle <= 0.00001) {\r\n return;\r\n }\r\n\r\n const currentHeadPosition = PlayerHeadManager._rotateFeetQuatSV.currentHeadPosition;\r\n const playerUp = PlayerHeadManager._rotateFeetQuatSV.playerUp;\r\n const rotationAxis = PlayerHeadManager._rotateFeetQuatSV.rotationAxis;\r\n this._myCurrentHead.pp_getPosition(currentHeadPosition);\r\n this.getPlayer().pp_getUp(playerUp);\r\n rotationQuat.quat_getAxis(rotationAxis);\r\n\r\n const fixedRotation = PlayerHeadManager._rotateFeetQuatSV.fixedRotation;\r\n if (!rotationAxis.vec3_isOnAxis(playerUp) &&\r\n ((keepUpOverride == null && this._myParams.myFeetRotationKeepUp) || (keepUpOverride))) {\r\n const currentFeetRotation = PlayerHeadManager._rotateFeetQuatSV.currentFeetRotation;\r\n this.getRotationFeetQuat(currentFeetRotation);\r\n\r\n const newFeetRotation = PlayerHeadManager._rotateFeetQuatSV.newFeetRotation;\r\n const newFeetForward = PlayerHeadManager._rotateFeetQuatSV.newFeetForward;\r\n currentFeetRotation.quat_rotateQuat(rotationQuat, newFeetRotation);\r\n newFeetRotation.quat_getForward(newFeetForward);\r\n\r\n const fixedNewFeetRotation = PlayerHeadManager._rotateFeetQuatSV.fixedNewFeetRotation;\r\n fixedNewFeetRotation.quat_copy(newFeetRotation);\r\n fixedNewFeetRotation.quat_setUp(playerUp, newFeetForward);\r\n\r\n currentFeetRotation.quat_rotationToQuat(fixedNewFeetRotation, fixedRotation);\r\n } else {\r\n fixedRotation.quat_copy(rotationQuat);\r\n }\r\n\r\n this.getPlayer().pp_rotateAroundQuat(fixedRotation, currentHeadPosition);\r\n\r\n const newHeadPosition = PlayerHeadManager._rotateFeetQuatSV.newHeadPosition;\r\n this._myCurrentHead.pp_getPosition(newHeadPosition);\r\n\r\n const headAdjustmentMovement = PlayerHeadManager._rotateFeetQuatSV.headAdjustmentMovement;\r\n currentHeadPosition.vec3_sub(newHeadPosition, headAdjustmentMovement);\r\n if (headAdjustmentMovement.vec3_length() > 0.00001) {\r\n this.moveFeet(headAdjustmentMovement);\r\n }\r\n }\r\n\r\n private static readonly _rotateHeadQuatSV =\r\n {\r\n newHeadRotation: quat_create(),\r\n newHeadUp: vec3_create()\r\n };\r\n // #TODO Rotate feet with this and then rotate head freely if possible\r\n public rotateHeadQuat(rotationQuat: Readonly): void {\r\n if (this.canRotateHead()) {\r\n this._myCurrentHead.pp_rotateQuat(rotationQuat);\r\n const newHeadRotation = PlayerHeadManager._rotateHeadQuatSV.newHeadRotation;\r\n this._myCurrentHead.pp_getRotationQuat(newHeadRotation);\r\n\r\n Globals.getPlayerObjects(this._myParams.myEngine)!.myHead!.pp_setRotationQuat(newHeadRotation);\r\n\r\n if (!this._mySessionActive) {\r\n const newHeadUp = PlayerHeadManager._rotateHeadQuatSV.newHeadUp;\r\n newHeadRotation.quat_rotateAxisRadians(Math.PI, newHeadRotation.quat_getUp(newHeadUp), newHeadRotation);\r\n Globals.getPlayerObjects(this._myParams.myEngine)!.myCameraNonXR!.pp_setRotationQuat(newHeadRotation);\r\n }\r\n }\r\n }\r\n\r\n public canRotateFeet(): boolean {\r\n return true;\r\n }\r\n\r\n public canRotateHead(): boolean {\r\n return !this._mySessionActive;\r\n }\r\n\r\n private static readonly _setRotationFeetQuatSV =\r\n {\r\n currentRotationQuat: quat_create(),\r\n rotationQuatToRotate: quat_create()\r\n };\r\n public setRotationFeetQuat(rotationQuat: Readonly, keepUpOverride: boolean | null = null): void {\r\n const currentRotationQuat = PlayerHeadManager._setRotationFeetQuatSV.currentRotationQuat;\r\n const rotationQuatToRotate = PlayerHeadManager._setRotationFeetQuatSV.rotationQuatToRotate;\r\n this.getRotationFeetQuat(currentRotationQuat);\r\n currentRotationQuat.quat_rotationToQuat(rotationQuat, rotationQuatToRotate);\r\n this.rotateFeetQuat(rotationQuatToRotate, keepUpOverride);\r\n }\r\n\r\n private static readonly _setRotationHeadQuatSV =\r\n {\r\n currentRotationQuat: quat_create(),\r\n rotationQuatToRotate: quat_create()\r\n };\r\n public setRotationHeadQuat(rotationQuat: Readonly): void {\r\n const currentRotationQuat = PlayerHeadManager._setRotationHeadQuatSV.currentRotationQuat;\r\n const rotationQuatToRotate = PlayerHeadManager._setRotationHeadQuatSV.rotationQuatToRotate;\r\n this.getRotationHeadQuat(currentRotationQuat);\r\n currentRotationQuat.quat_rotationToQuat(rotationQuat, rotationQuatToRotate);\r\n this.rotateHeadQuat(rotationQuatToRotate);\r\n }\r\n\r\n private static readonly _lookAtFeetSV =\r\n {\r\n direction: vec3_create(),\r\n feetPosition: vec3_create()\r\n };\r\n public lookAtFeet(position: Readonly, up?: Readonly, keepUpOverride: boolean | null = null): void {\r\n const feetPosition = PlayerHeadManager._lookAtFeetSV.feetPosition;\r\n const direction = PlayerHeadManager._lookAtFeetSV.direction;\r\n this.getPositionFeet(feetPosition);\r\n position.vec3_sub(feetPosition, direction).vec3_normalize(direction);\r\n\r\n this.lookToFeet(direction, up, keepUpOverride);\r\n }\r\n\r\n private static readonly _lookToFeetSV =\r\n {\r\n feetRotation: quat_create()\r\n };\r\n public lookToFeet(direction: Readonly, up?: Readonly, keepUpOverride: boolean | null = null): void {\r\n const feetRotation = PlayerHeadManager._lookToFeetSV.feetRotation;\r\n this.getRotationFeetQuat(feetRotation);\r\n feetRotation.quat_setForward(direction, up);\r\n this.setRotationFeetQuat(feetRotation, keepUpOverride);\r\n }\r\n\r\n private static readonly _lookAtHeadSV =\r\n {\r\n direction: vec3_create(),\r\n headPosition: vec3_create()\r\n };\r\n public lookAtHead(position: Readonly, up?: Readonly): void {\r\n const headPosition = PlayerHeadManager._lookAtHeadSV.headPosition;\r\n const direction = PlayerHeadManager._lookAtHeadSV.direction;\r\n this.getPositionHead(headPosition);\r\n position.vec3_sub(headPosition, direction).vec3_normalize(direction);\r\n\r\n this.lookToHead(direction, up);\r\n }\r\n\r\n private static readonly _lookToHeadSV =\r\n {\r\n headRotation: quat_create()\r\n };\r\n public lookToHead(direction: Readonly, up?: Readonly): void {\r\n const headRotation = PlayerHeadManager._lookToHeadSV.headRotation;\r\n this.getRotationHeadQuat(headRotation);\r\n headRotation.quat_setForward(direction, up);\r\n this.setRotationHeadQuat(headRotation);\r\n }\r\n\r\n public resetCameraNonXR(): void {\r\n Globals.getPlayerObjects(this._myParams.myEngine)!.myCameraNonXR!.pp_resetTransformLocal();\r\n this._setCameraNonXRHeight(this._myHeightNonVR);\r\n }\r\n\r\n public cancelSync(): void {\r\n this._myIsSyncedDelayCounter = 0;\r\n this._myDelaySessionChangeResyncCounter = 0;\r\n this._myDelayBlurEndResyncCounter = 0;\r\n this._myDelayBlurEndResyncTimer.reset();\r\n\r\n this._mySessionChangeResyncHeadTransform = null;\r\n this._myBlurRecoverHeadTransform = null;\r\n }\r\n\r\n public cancelNextEnterSessionSetHeight(): void {\r\n this._myDelayNextEnterSessionSetHeightVRCounter--;\r\n this._myNextEnterSessionSetHeightVRWithFloor = false;\r\n this._myNextEnterSessionSetHeightVRWithoutFloor = false;\r\n }\r\n\r\n public update(dt: number): void {\r\n if (!this._myActive) return;\r\n\r\n this._myViewResetThisFrame = false;\r\n\r\n if (this._myIsSyncedDelayCounter != 0) {\r\n this._myIsSyncedDelayCounter--;\r\n this._myIsSyncedDelayCounter = Math.max(0, this._myIsSyncedDelayCounter);\r\n }\r\n\r\n if (this._myDelaySessionChangeResyncCounter > 0) {\r\n this._myDelaySessionChangeResyncCounter--;\r\n if (this._myDelaySessionChangeResyncCounter == 0) {\r\n this._sessionChangeResync();\r\n this._myIsSyncedDelayCounter = PlayerHeadManager._myIsSyncedDelayCounterFrames;\r\n }\r\n }\r\n\r\n if (this._myDelayBlurEndResyncCounter > 0 && !this._myDelayBlurEndResyncTimer.isRunning()) {\r\n this._myDelayBlurEndResyncCounter--;\r\n if (this._myDelayBlurEndResyncCounter == 0) {\r\n this._blurEndResync();\r\n this._myIsSyncedDelayCounter = PlayerHeadManager._myIsSyncedDelayCounterFrames;\r\n }\r\n }\r\n\r\n // Not really used since visibility hidden end is not considered a special case anymore\r\n if (this._myDelayBlurEndResyncTimer.isRunning()) {\r\n if (this._myDelayBlurEndResyncCounter > 0) {\r\n this._myDelayBlurEndResyncCounter--;\r\n } else {\r\n this._myDelayBlurEndResyncTimer.update(dt);\r\n if (this._myDelayBlurEndResyncTimer.isDone()) {\r\n this._blurEndResync();\r\n this._myIsSyncedDelayCounter = PlayerHeadManager._myIsSyncedDelayCounterFrames;\r\n }\r\n }\r\n }\r\n\r\n if (this._myDelayNextEnterSessionSetHeightVRCounter > 0) {\r\n this._myDelayNextEnterSessionSetHeightVRCounter--;\r\n if (this._myDelayNextEnterSessionSetHeightVRCounter == 0) {\r\n if (this._mySessionActive) {\r\n const isFloor = XRUtils.isReferenceSpaceFloorBased(this._myParams.myEngine);\r\n if (isFloor && this._myNextEnterSessionSetHeightVRWithFloor) {\r\n const currentHeadPosition = this._myCurrentHead.pp_getPosition();\r\n\r\n const floorHeight = this._myHeightVRWithFloor! - this._myParams.myForeheadExtraHeight;\r\n const currentEyeHeight = this._getPositionEyesHeight(currentHeadPosition);\r\n\r\n this._myHeightOffsetWithFloor = this._myHeightOffsetWithFloor + (floorHeight - currentEyeHeight);\r\n\r\n this._updateHeightOffset();\r\n\r\n this._myNextEnterSessionSetHeightVRWithFloor = false;\r\n } else if (!isFloor && this._myNextEnterSessionSetHeightVRWithoutFloor) {\r\n const currentHeadPosition = this._myCurrentHead.pp_getPosition();\r\n\r\n const floorHeight = this._myHeightVRWithoutFloor! - this._myParams.myForeheadExtraHeight;\r\n const currentEyeHeight = this._getPositionEyesHeight(currentHeadPosition);\r\n\r\n this._myHeightOffsetWithoutFloor = this._myHeightOffsetWithoutFloor + (floorHeight - currentEyeHeight);\r\n\r\n this._updateHeightOffset();\r\n\r\n this._myNextEnterSessionSetHeightVRWithoutFloor = false;\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (this.isSynced()) {\r\n this._myCurrentHead.pp_getTransformLocalQuat(this._myCurrentHeadTransformLocalQuat);\r\n }\r\n\r\n if (this._myParams.myDebugEnabled && Globals.isDebugEnabled(this._myParams.myEngine)) {\r\n this._debugUpdate(dt);\r\n }\r\n }\r\n\r\n private _setHeightHead(heightNonVR: number, heightVRWithoutFloor: number | null, heightVRWithFloor: number | null, setOnlyForActiveOne: boolean = true): void {\r\n if (!setOnlyForActiveOne || !this._mySessionActive) {\r\n this._setHeightHeadNonVR(heightNonVR);\r\n }\r\n\r\n if (!setOnlyForActiveOne || this._mySessionActive) {\r\n this._setHeightHeadVRWithoutFloor(heightVRWithoutFloor);\r\n this._setHeightHeadVRWithFloor(heightVRWithFloor);\r\n }\r\n\r\n this._updateHeightOffset();\r\n\r\n if (!this._mySessionActive) {\r\n this._setCameraNonXRHeight(this._myHeightNonVR);\r\n }\r\n }\r\n\r\n private _setHeightHeadNonVR(height: number): void {\r\n this._myHeightNonVR = Math.max(height, this._myParams.myForeheadExtraHeight);\r\n this._myHeightNonVROnEnterSession = this._myHeightNonVR;\r\n }\r\n\r\n private _setHeightHeadVRWithoutFloor(heightWithoutFloor: number | null): void {\r\n if (heightWithoutFloor != null) {\r\n this._myHeightVRWithoutFloor = Math.max(heightWithoutFloor, this._myParams.myForeheadExtraHeight);\r\n this._myNextEnterSessionSetHeightVRWithoutFloor = false;\r\n\r\n if (this._mySessionActive) {\r\n this._myHeightOffsetWithoutFloor = this._myHeightOffsetWithoutFloor + (this._myHeightVRWithoutFloor - this.getHeightHead());\r\n } else {\r\n this._myNextEnterSessionSetHeightVRWithoutFloor = true;\r\n }\r\n } else {\r\n this._myHeightVRWithoutFloor = null;\r\n this._myHeightOffsetWithoutFloor = 0;\r\n }\r\n }\r\n\r\n private _setHeightHeadVRWithFloor(heightWithFloor: number | null): void {\r\n if (heightWithFloor != null) {\r\n this._myHeightVRWithFloor = Math.max(heightWithFloor, this._myParams.myForeheadExtraHeight);\r\n this._myNextEnterSessionSetHeightVRWithFloor = false;\r\n\r\n if (this._mySessionActive) {\r\n this._myHeightOffsetWithFloor = this._myHeightOffsetWithFloor + (this._myHeightVRWithFloor - this.getHeightHead());\r\n } else {\r\n this._myNextEnterSessionSetHeightVRWithFloor = true;\r\n }\r\n } else {\r\n this._myHeightVRWithFloor = null;\r\n this._myHeightOffsetWithFloor = 0;\r\n }\r\n }\r\n\r\n private _shouldNonVRUseVRWithFloor(): boolean {\r\n return (this._myLastReferenceSpaceIsFloorBased == null && this._myParams.myNonVRFloorBasedMode == NonVRReferenceSpaceMode.FLOOR_THEN_KEEP_VR) ||\r\n (this._myLastReferenceSpaceIsFloorBased != null && this._myLastReferenceSpaceIsFloorBased &&\r\n (this._myParams.myNonVRFloorBasedMode == NonVRReferenceSpaceMode.NO_FLOOR_THEN_KEEP_VR || this._myParams.myNonVRFloorBasedMode == NonVRReferenceSpaceMode.FLOOR_THEN_KEEP_VR));\r\n }\r\n\r\n private _shouldNonVRUseVRWithoutFloor(): boolean {\r\n return (this._myLastReferenceSpaceIsFloorBased == null && this._myParams.myNonVRFloorBasedMode == NonVRReferenceSpaceMode.NO_FLOOR_THEN_KEEP_VR) ||\r\n (this._myLastReferenceSpaceIsFloorBased != null && !this._myLastReferenceSpaceIsFloorBased &&\r\n (this._myParams.myNonVRFloorBasedMode == NonVRReferenceSpaceMode.NO_FLOOR_THEN_KEEP_VR || this._myParams.myNonVRFloorBasedMode == NonVRReferenceSpaceMode.FLOOR_THEN_KEEP_VR));\r\n }\r\n\r\n private static readonly _setCameraNonXRHeightSV =\r\n {\r\n cameraNonVRPosition: vec3_create(),\r\n cameraNonVRPositionLocalToPlayer: vec3_create(),\r\n adjustedCameraNonVRPosition: vec3_create(),\r\n playerTranform: mat4_create()\r\n };\r\n private _setCameraNonXRHeight(height: number): void {\r\n const eyeHeight = height - this._myParams.myForeheadExtraHeight;\r\n\r\n const cameraNonVRPosition = PlayerHeadManager._setCameraNonXRHeightSV.cameraNonVRPosition;\r\n const cameraNonVRPositionLocalToPlayer = PlayerHeadManager._setCameraNonXRHeightSV.cameraNonVRPositionLocalToPlayer;\r\n const adjustedCameraNonVRPosition = PlayerHeadManager._setCameraNonXRHeightSV.adjustedCameraNonVRPosition;\r\n const playerTranform = PlayerHeadManager._setCameraNonXRHeightSV.playerTranform;\r\n\r\n Globals.getPlayerObjects(this._myParams.myEngine)!.myCameraNonXR!.pp_getPosition(cameraNonVRPosition);\r\n\r\n cameraNonVRPosition.vec3_convertPositionToLocal(this.getPlayer().pp_getTransform(playerTranform), cameraNonVRPositionLocalToPlayer);\r\n cameraNonVRPositionLocalToPlayer.vec3_set(cameraNonVRPositionLocalToPlayer[0], eyeHeight, cameraNonVRPositionLocalToPlayer[2]);\r\n cameraNonVRPositionLocalToPlayer.vec3_convertPositionToWorld(this.getPlayer().pp_getTransform(playerTranform), adjustedCameraNonVRPosition);\r\n\r\n Globals.getPlayerObjects(this._myParams.myEngine)!.myCameraNonXR!.pp_setPosition(adjustedCameraNonVRPosition);\r\n }\r\n\r\n private static readonly _getPositionEyesHeightSV =\r\n {\r\n playerPosition: vec3_create(),\r\n playerUp: vec3_create(),\r\n heightVector: vec3_create()\r\n };\r\n private _getPositionEyesHeight(position: Readonly): number {\r\n const playerPosition = PlayerHeadManager._getPositionEyesHeightSV.playerPosition;\r\n const playerUp = PlayerHeadManager._getPositionEyesHeightSV.playerUp;\r\n this.getPlayer().pp_getPosition(playerPosition);\r\n this.getPlayer().pp_getUp(playerUp);\r\n\r\n const heightVector = PlayerHeadManager._getPositionEyesHeightSV.heightVector;\r\n position.vec3_sub(playerPosition, heightVector).vec3_componentAlongAxis(playerUp, heightVector);\r\n let height = heightVector.vec3_length();\r\n if (!playerUp.vec3_isConcordant(heightVector)) {\r\n height = -height;\r\n }\r\n\r\n return height;\r\n }\r\n\r\n // #TODO What happens if the player go in the blurred state before the scene has loaded?\r\n private _onXRSessionStart(manualCall: boolean, session: XRSession): void {\r\n const nonVRCurrentEyesHeight = this._getPositionEyesHeight(Globals.getPlayerObjects(this._myParams.myEngine)!.myCameraNonXR!.pp_getPosition());\r\n this._myHeightNonVROnEnterSession = nonVRCurrentEyesHeight + this._myParams.myForeheadExtraHeight;\r\n\r\n this._myBlurRecoverHeadTransform = null;\r\n this._myVisibilityHidden = false;\r\n\r\n this._myDelaySessionChangeResyncCounter = 0;\r\n this._myDelayBlurEndResyncCounter = 0;\r\n this._myDelayBlurEndResyncTimer.reset();\r\n this._myDelayNextEnterSessionSetHeightVRCounter = 0;\r\n\r\n const referenceSpace = XRUtils.getReferenceSpace(this._myParams.myEngine)!;\r\n\r\n if (referenceSpace.addEventListener != null) {\r\n this._myViewResetEventListener = this._onViewReset.bind(this);\r\n referenceSpace.addEventListener(\"reset\", this._myViewResetEventListener);\r\n }\r\n\r\n this._myLastReferenceSpaceIsFloorBased = XRUtils.isReferenceSpaceFloorBased(this._myParams.myEngine);\r\n\r\n this._myVisibilityChangeEventListener = function (this: PlayerHeadManager, event: XRSessionEvent) {\r\n if (event.session.visibilityState != \"visible\") {\r\n if (!this._mySessionBlurred) {\r\n this._onXRSessionBlurStart(event.session);\r\n }\r\n\r\n this._myVisibilityHidden = session.visibilityState == \"hidden\";\r\n } else {\r\n if (this._mySessionBlurred) {\r\n this._onXRSessionBlurEnd(event.session);\r\n }\r\n\r\n this._myVisibilityHidden = false;\r\n }\r\n }.bind(this);\r\n\r\n session.addEventListener(\"visibilitychange\", this._myVisibilityChangeEventListener);\r\n\r\n if (this._myParams.mySessionChangeResyncEnabled && !manualCall && this._myActive) {\r\n if (this._myDelaySessionChangeResyncCounter == 0) {\r\n this._mySessionChangeResyncHeadTransform = this._getHeadTransformFromLocal(this._myCurrentHeadTransformLocalQuat);\r\n }\r\n\r\n this._myDelaySessionChangeResyncCounter = PlayerHeadManager._myResyncCounterFrames;\r\n } else {\r\n this._myDelaySessionChangeResyncCounter = 0;\r\n this._mySessionChangeResyncHeadTransform = null;\r\n }\r\n\r\n if (this._myActive) {\r\n if (this._myNextEnterSessionSetHeightVRWithFloor || this._myNextEnterSessionSetHeightVRWithoutFloor) {\r\n this._myDelayNextEnterSessionSetHeightVRCounter = PlayerHeadManager._myResyncCounterFrames;\r\n }\r\n } else {\r\n this._myNextEnterSessionSetHeightVRWithFloor = false;\r\n this._myNextEnterSessionSetHeightVRWithoutFloor = false;\r\n }\r\n\r\n this._mySessionActive = true;\r\n this._mySessionBlurred = false;\r\n\r\n if (this._myActive) {\r\n this._updateHeightOffset();\r\n }\r\n }\r\n\r\n private _onXRSessionEnd(): void {\r\n if (this._myParams.mySessionChangeResyncEnabled && this._myActive) {\r\n if (this._myDelaySessionChangeResyncCounter == 0) {\r\n let previousHeadTransform = this._getHeadTransformFromLocal(this._myCurrentHeadTransformLocalQuat);\r\n\r\n if (this._myBlurRecoverHeadTransform != null) {\r\n previousHeadTransform = this._myBlurRecoverHeadTransform;\r\n }\r\n\r\n this._mySessionChangeResyncHeadTransform = previousHeadTransform;\r\n }\r\n\r\n this._myDelaySessionChangeResyncCounter = PlayerHeadManager._myResyncCounterFrames;\r\n } else {\r\n this._myDelaySessionChangeResyncCounter = 0;\r\n this._mySessionChangeResyncHeadTransform = null;\r\n }\r\n\r\n this._myDelayNextEnterSessionSetHeightVRCounter = 0;\r\n\r\n this._myVisibilityChangeEventListener = null;\r\n this._myViewResetEventListener = null;\r\n\r\n this._myBlurRecoverHeadTransform = null;\r\n this._myVisibilityHidden = false;\r\n\r\n this._myDelayBlurEndResyncCounter = 0;\r\n this._myDelayBlurEndResyncTimer.reset();\r\n\r\n this._mySessionActive = false;\r\n this._mySessionBlurred = false;\r\n\r\n if (this._myActive) {\r\n this._updateHeightOffset();\r\n\r\n if (this._myParams.myExitSessionResetNonVRTransformLocal) {\r\n this.resetCameraNonXR();\r\n } else {\r\n this._setCameraNonXRHeight(this._myHeightNonVROnEnterSession);\r\n }\r\n }\r\n }\r\n\r\n private _onXRSessionBlurStart(session: XRSession): void {\r\n if (this._myActive) {\r\n if (this._myParams.myBlurEndResyncEnabled && this._myBlurRecoverHeadTransform == null && this._mySessionActive) {\r\n if (this._myDelaySessionChangeResyncCounter > 0) {\r\n this._myBlurRecoverHeadTransform = this._mySessionChangeResyncHeadTransform;\r\n } else {\r\n this._myBlurRecoverHeadTransform = this._getHeadTransformFromLocal(this._myCurrentHeadTransformLocalQuat);\r\n }\r\n } else if (!this._mySessionActive || !this._myParams.myBlurEndResyncEnabled) {\r\n this._myBlurRecoverHeadTransform = null;\r\n }\r\n }\r\n\r\n this._myDelayBlurEndResyncCounter = 0;\r\n\r\n this._mySessionBlurred = true;\r\n }\r\n\r\n private _onXRSessionBlurEnd(session: XRSession): void {\r\n if (this._myActive) {\r\n if (this._myDelaySessionChangeResyncCounter == 0) {\r\n if (this._myParams.myBlurEndResyncEnabled && this._myBlurRecoverHeadTransform != null && this._mySessionActive) {\r\n this._myDelayBlurEndResyncCounter = PlayerHeadManager._myResyncCounterFrames;\r\n if (this._myVisibilityHidden) {\r\n //this._myDelayBlurEndResyncTimer.start();\r\n\r\n // This was added because on the end of hidden u can have the resync delay cause of the guardian resync\r\n // but I just decided to skip this since it's not reliable and the guardian resync can happen in other cases\r\n // with no notification anyway\r\n }\r\n } else {\r\n this._myBlurRecoverHeadTransform = null;\r\n this._myDelayBlurEndResyncCounter = 0;\r\n }\r\n } else {\r\n this._myDelaySessionChangeResyncCounter = PlayerHeadManager._myResyncCounterFrames;\r\n this._myBlurRecoverHeadTransform = null;\r\n }\r\n }\r\n\r\n this._mySessionBlurred = false;\r\n }\r\n\r\n private static readonly _onViewResetSV =\r\n {\r\n identityTransformQuat: Quat2Utils.identity(quat2_create()),\r\n prevHeadPosition: vec3_create(),\r\n resetHeadPosition: vec3_create()\r\n };\r\n private _onViewReset(): void {\r\n if (this._myActive) {\r\n if (!this._myViewResetThisFrame && this._myParams.myResetTransformOnViewResetEnabled && this._mySessionActive && this.isSynced()) {\r\n this._myViewResetThisFrame = true;\r\n const previousHeadTransformQuat = this._getHeadTransformFromLocal(this._myCurrentHeadTransformLocalQuat);\r\n this.teleportPlayerToHeadTransformQuat(previousHeadTransformQuat);\r\n\r\n const isFloor = XRUtils.isReferenceSpaceFloorBased(this._myParams.myEngine);\r\n if (!isFloor) {\r\n const identityTransformQuat = PlayerHeadManager._onViewResetSV.identityTransformQuat;\r\n const resetHeadTransformQuat = this._getHeadTransformFromLocal(identityTransformQuat);\r\n\r\n const prevHeadPosition = PlayerHeadManager._onViewResetSV.prevHeadPosition;\r\n const resetHeadPosition = PlayerHeadManager._onViewResetSV.resetHeadPosition;\r\n const prevHeadHeight = this._getPositionEyesHeight(previousHeadTransformQuat.quat2_getPosition(prevHeadPosition));\r\n const currentHeadHeight = this._getPositionEyesHeight(resetHeadTransformQuat.quat2_getPosition(resetHeadPosition));\r\n\r\n this._myHeightOffsetWithoutFloor = this._myHeightOffsetWithoutFloor + (prevHeadHeight - currentHeadHeight);\r\n this._updateHeightOffset();\r\n }\r\n }\r\n }\r\n }\r\n\r\n private static readonly _blurEndResyncSV =\r\n {\r\n playerUp: vec3_create(),\r\n currentHeadPosition: vec3_create(),\r\n recoverHeadPosition: vec3_create(),\r\n flatCurrentHeadPosition: vec3_create(),\r\n flatRecoverHeadPosition: vec3_create(),\r\n recoverMovement: vec3_create(),\r\n recoverHeadForward: vec3_create(),\r\n currentHeadForward: vec3_create(),\r\n rotationToPerform: quat_create()\r\n };\r\n private _blurEndResync(): void {\r\n if (this._myBlurRecoverHeadTransform != null) {\r\n if (this._mySessionChangeResyncHeadTransform != null) {\r\n this._myBlurRecoverHeadTransform = null;\r\n this._sessionChangeResync();\r\n } else {\r\n const playerUp = PlayerHeadManager._blurEndResyncSV.playerUp;\r\n this.getPlayer().pp_getUp(playerUp);\r\n\r\n const currentHeadPosition = PlayerHeadManager._blurEndResyncSV.currentHeadPosition;\r\n const recoverHeadPosition = PlayerHeadManager._blurEndResyncSV.recoverHeadPosition;\r\n this._myCurrentHead.pp_getPosition(currentHeadPosition);\r\n this._myBlurRecoverHeadTransform.quat2_getPosition(recoverHeadPosition);\r\n\r\n const flatCurrentHeadPosition = PlayerHeadManager._blurEndResyncSV.flatCurrentHeadPosition;\r\n const flatRecoverHeadPosition = PlayerHeadManager._blurEndResyncSV.flatRecoverHeadPosition;\r\n currentHeadPosition.vec3_removeComponentAlongAxis(playerUp, flatCurrentHeadPosition);\r\n recoverHeadPosition.vec3_removeComponentAlongAxis(playerUp, flatRecoverHeadPosition);\r\n\r\n const recoverMovement = PlayerHeadManager._blurEndResyncSV.recoverMovement;\r\n flatRecoverHeadPosition.vec3_sub(flatCurrentHeadPosition, recoverMovement);\r\n this.moveFeet(recoverMovement);\r\n\r\n const recoverHeadForward = PlayerHeadManager._blurEndResyncSV.recoverHeadForward;\r\n const currentHeadForward = PlayerHeadManager._blurEndResyncSV.currentHeadForward;\r\n const rotationToPerform = PlayerHeadManager._blurEndResyncSV.rotationToPerform;\r\n this._myBlurRecoverHeadTransform.quat2_getForward(recoverHeadForward);\r\n this._myCurrentHead.pp_getForward(currentHeadForward);\r\n currentHeadForward.vec3_rotationToPivotedQuat(recoverHeadForward, playerUp, rotationToPerform);\r\n\r\n if (this._myParams.myBlurEndResyncRotation) {\r\n this.rotateFeetQuat(rotationToPerform);\r\n }\r\n\r\n this._myBlurRecoverHeadTransform = null;\r\n }\r\n }\r\n }\r\n\r\n private static readonly _sessionChangeResyncSV =\r\n {\r\n currentHeadPosition: vec3_create(),\r\n resyncHeadPosition: vec3_create(),\r\n resyncHeadRotation: quat_create(),\r\n playerUp: vec3_create(),\r\n flatCurrentHeadPosition: vec3_create(),\r\n flatResyncHeadPosition: vec3_create(),\r\n resyncMovement: vec3_create(),\r\n resyncHeadForward: vec3_create(),\r\n resyncHeadUp: vec3_create(),\r\n resyncHeadRight: vec3_create(),\r\n playerPosition: vec3_create(),\r\n newPlayerPosition: vec3_create(),\r\n fixedHeadRight: vec3_create(),\r\n fixedHeadLeft: vec3_create(),\r\n fixedHeadUp: vec3_create(),\r\n fixedHeadForward: vec3_create(),\r\n fixedHeadRotation: quat_create()\r\n };\r\n private _sessionChangeResync(): void {\r\n if (this._myBlurRecoverHeadTransform == null && this._mySessionChangeResyncHeadTransform != null) {\r\n if (this._mySessionActive) {\r\n const currentHeadPosition = PlayerHeadManager._sessionChangeResyncSV.currentHeadPosition;\r\n const resyncHeadPosition = PlayerHeadManager._sessionChangeResyncSV.resyncHeadPosition;\r\n const resyncHeadRotation = PlayerHeadManager._sessionChangeResyncSV.resyncHeadRotation;\r\n this._myCurrentHead.pp_getPosition(currentHeadPosition);\r\n this._mySessionChangeResyncHeadTransform.quat2_getPosition(resyncHeadPosition);\r\n this._mySessionChangeResyncHeadTransform.quat2_getRotationQuat(resyncHeadRotation);\r\n\r\n const playerUp = PlayerHeadManager._sessionChangeResyncSV.playerUp;\r\n this.getPlayer().pp_getUp(playerUp);\r\n\r\n const flatCurrentHeadPosition = PlayerHeadManager._sessionChangeResyncSV.flatCurrentHeadPosition;\r\n const flatResyncHeadPosition = PlayerHeadManager._sessionChangeResyncSV.flatResyncHeadPosition;\r\n currentHeadPosition.vec3_removeComponentAlongAxis(playerUp, flatCurrentHeadPosition);\r\n resyncHeadPosition.vec3_removeComponentAlongAxis(playerUp, flatResyncHeadPosition);\r\n\r\n const resyncMovement = PlayerHeadManager._sessionChangeResyncSV.resyncMovement;\r\n flatResyncHeadPosition.vec3_sub(flatCurrentHeadPosition, resyncMovement);\r\n this.moveFeet(resyncMovement);\r\n\r\n if (this._myParams.myEnterSessionResyncHeight || this._myParams.myNextEnterSessionResyncHeight) {\r\n this._myParams.myNextEnterSessionResyncHeight = false;\r\n const resyncHeadHeight = this._getPositionEyesHeight(resyncHeadPosition);\r\n const currentHeadHeight = this._getPositionEyesHeight(currentHeadPosition);\r\n\r\n this._myHeightVRWithoutFloor = resyncHeadHeight + this._myParams.myForeheadExtraHeight;\r\n this._myHeightVRWithFloor = resyncHeadHeight + this._myParams.myForeheadExtraHeight;\r\n this._myHeightOffsetWithFloor = this._myHeightOffsetWithFloor + (resyncHeadHeight - currentHeadHeight);\r\n this._myHeightOffsetWithoutFloor = this._myHeightOffsetWithoutFloor + (resyncHeadHeight - currentHeadHeight);\r\n\r\n this._updateHeightOffset();\r\n\r\n this._myNextEnterSessionSetHeightVRWithFloor = false;\r\n this._myNextEnterSessionSetHeightVRWithoutFloor = false;\r\n }\r\n\r\n this._resyncHeadRotationForward(resyncHeadRotation);\r\n } else {\r\n const playerUp = PlayerHeadManager._sessionChangeResyncSV.playerUp;\r\n this.getPlayer().pp_getUp(playerUp);\r\n\r\n const resyncHeadPosition = PlayerHeadManager._sessionChangeResyncSV.resyncHeadPosition;\r\n const flatResyncHeadPosition = PlayerHeadManager._sessionChangeResyncSV.flatResyncHeadPosition;\r\n this._mySessionChangeResyncHeadTransform.quat2_getPosition(resyncHeadPosition);\r\n resyncHeadPosition.vec3_removeComponentAlongAxis(playerUp, flatResyncHeadPosition);\r\n\r\n const playerPosition = PlayerHeadManager._sessionChangeResyncSV.playerPosition;\r\n const newPlayerPosition = PlayerHeadManager._sessionChangeResyncSV.newPlayerPosition;\r\n this.getPlayer().pp_getPosition(playerPosition);\r\n flatResyncHeadPosition.vec3_add(playerPosition.vec3_componentAlongAxis(playerUp, newPlayerPosition), newPlayerPosition);\r\n\r\n this.getPlayer().pp_setPosition(newPlayerPosition);\r\n Globals.getPlayerObjects(this._myParams.myEngine)!.myCameraNonXR!.pp_resetPositionLocal();\r\n\r\n if (this._myParams.myExitSessionResyncHeight) {\r\n const resyncHeadHeight = this._getPositionEyesHeight(resyncHeadPosition);\r\n this._myHeightNonVR = resyncHeadHeight + this._myParams.myForeheadExtraHeight;\r\n }\r\n\r\n this._updateHeightOffset();\r\n\r\n if (this._myParams.myExitSessionResyncHeight || this._myParams.myExitSessionResetNonVRTransformLocal) {\r\n this._setCameraNonXRHeight(this._myHeightNonVR);\r\n } else {\r\n this._setCameraNonXRHeight(this._myHeightNonVROnEnterSession);\r\n }\r\n\r\n const resyncHeadRotation = PlayerHeadManager._sessionChangeResyncSV.resyncHeadRotation;\r\n this._mySessionChangeResyncHeadTransform.quat2_getRotationQuat(resyncHeadRotation);\r\n\r\n if (this._myParams.myExitSessionRemoveRightTilt ||\r\n this._myParams.myExitSessionAdjustMaxVerticalAngle || !this._myParams.myExitSessionResyncVerticalAngle) {\r\n const resyncHeadForward = PlayerHeadManager._sessionChangeResyncSV.resyncHeadForward;\r\n const resyncHeadUp = PlayerHeadManager._sessionChangeResyncSV.resyncHeadUp;\r\n resyncHeadRotation.quat_getForward(resyncHeadForward);\r\n resyncHeadRotation.quat_getUp(resyncHeadUp);\r\n\r\n const fixedHeadRight = PlayerHeadManager._sessionChangeResyncSV.fixedHeadRight;\r\n resyncHeadForward.vec3_cross(playerUp, fixedHeadRight);\r\n fixedHeadRight.vec3_normalize(fixedHeadRight);\r\n\r\n if (!resyncHeadUp.vec3_isConcordant(playerUp)) {\r\n const angleForwardUp = resyncHeadForward.vec3_angle(playerUp);\r\n const negateAngle = 45;\r\n if (angleForwardUp > (180 - negateAngle) || angleForwardUp < negateAngle) {\r\n // This way I get a good fixed result for both head upside down and head rotated on forward\r\n // When the head is looking down and a bit backward (more than 135 degrees), I want the forward to actually\r\n // be the opposite because it's like u rotate back the head up and look forward again\r\n fixedHeadRight.vec3_negate(fixedHeadRight);\r\n }\r\n }\r\n\r\n if (fixedHeadRight.vec3_isZero(0.000001)) {\r\n resyncHeadRotation.quat_getRight(fixedHeadRight);\r\n }\r\n\r\n const fixedHeadUp = PlayerHeadManager._sessionChangeResyncSV.fixedHeadUp;\r\n const fixedHeadForward = PlayerHeadManager._sessionChangeResyncSV.fixedHeadForward;\r\n fixedHeadRight.vec3_cross(resyncHeadForward, fixedHeadUp);\r\n fixedHeadUp.vec3_normalize(fixedHeadUp);\r\n fixedHeadUp.vec3_cross(fixedHeadRight, fixedHeadForward);\r\n fixedHeadForward.vec3_normalize(fixedHeadForward);\r\n\r\n const fixedHeadRotation = PlayerHeadManager._sessionChangeResyncSV.fixedHeadRotation;\r\n const fixedHeadLeft = PlayerHeadManager._sessionChangeResyncSV.fixedHeadLeft;\r\n fixedHeadRotation.quat_fromAxes(fixedHeadRight.vec3_negate(fixedHeadLeft), fixedHeadUp, fixedHeadForward);\r\n resyncHeadRotation.quat_copy(fixedHeadRotation);\r\n }\r\n\r\n if (this._myParams.myExitSessionAdjustMaxVerticalAngle || !this._myParams.myExitSessionResyncVerticalAngle) {\r\n const resyncHeadUp = PlayerHeadManager._sessionChangeResyncSV.resyncHeadUp;\r\n const resyncHeadRight = PlayerHeadManager._sessionChangeResyncSV.resyncHeadRight;\r\n resyncHeadRotation.quat_getUp(resyncHeadUp);\r\n resyncHeadRotation.quat_getRight(resyncHeadRight);\r\n\r\n let maxVerticalAngle = Math.max(0, this._myParams.myExitSessionMaxVerticalAngle - 0.0001);\r\n if (!this._myParams.myExitSessionResyncVerticalAngle) {\r\n maxVerticalAngle = 0;\r\n }\r\n\r\n const angleWithUp = Math.pp_angleClamp(resyncHeadUp.vec3_angleSigned(playerUp, resyncHeadRight));\r\n if (Math.abs(angleWithUp) > maxVerticalAngle) {\r\n const fixAngle = (Math.abs(angleWithUp) - maxVerticalAngle) * Math.pp_sign(angleWithUp);\r\n resyncHeadRotation.quat_rotateAxis(fixAngle, resyncHeadRight, resyncHeadRotation);\r\n }\r\n }\r\n\r\n this.setRotationHeadQuat(resyncHeadRotation);\r\n }\r\n\r\n this._mySessionChangeResyncHeadTransform = null;\r\n }\r\n }\r\n\r\n private static readonly _setReferenceSpaceHeightOffsetSV =\r\n {\r\n referenceSpacePosition: vec3_create(),\r\n referenceSpacePositionLocalToPlayer: vec3_create(),\r\n adjustedReferenceSpacePosition: vec3_create(),\r\n playerTransform: mat4_create()\r\n };\r\n private _setReferenceSpaceHeightOffset(offset: number, amountToRemove: number): void {\r\n if (offset != null) {\r\n const referenceSpacePosition = PlayerHeadManager._setReferenceSpaceHeightOffsetSV.referenceSpacePosition;\r\n const referenceSpacePositionLocalToPlayer = PlayerHeadManager._setReferenceSpaceHeightOffsetSV.referenceSpacePositionLocalToPlayer;\r\n const playerTransform = PlayerHeadManager._setReferenceSpaceHeightOffsetSV.playerTransform;\r\n Globals.getPlayerObjects(this._myParams.myEngine)!.myReferenceSpace!.pp_getPosition(referenceSpacePosition);\r\n referenceSpacePosition.vec3_convertPositionToLocal(this.getPlayer().pp_getTransform(playerTransform), referenceSpacePositionLocalToPlayer);\r\n referenceSpacePositionLocalToPlayer.vec3_set(referenceSpacePositionLocalToPlayer[0], offset - amountToRemove, referenceSpacePositionLocalToPlayer[2]);\r\n\r\n const adjustedReferenceSpacePosition = PlayerHeadManager._setReferenceSpaceHeightOffsetSV.adjustedReferenceSpacePosition;\r\n referenceSpacePositionLocalToPlayer.vec3_convertPositionToWorld(this.getPlayer().pp_getTransform(playerTransform), adjustedReferenceSpacePosition);\r\n Globals.getPlayerObjects(this._myParams.myEngine)!.myReferenceSpace!.pp_setPosition(adjustedReferenceSpacePosition);\r\n }\r\n }\r\n\r\n private _updateHeightOffset(): void {\r\n if (this._mySessionActive) {\r\n if (XRUtils.isReferenceSpaceFloorBased(this._myParams.myEngine)) {\r\n this._setReferenceSpaceHeightOffset(this._myHeightOffsetWithFloor, 0);\r\n } else {\r\n this._setReferenceSpaceHeightOffset(this._myHeightOffsetWithoutFloor, 0);\r\n }\r\n } else {\r\n if (this._shouldNonVRUseVRWithFloor()) {\r\n this._setReferenceSpaceHeightOffset(this._myHeightOffsetWithFloor, 0);\r\n } else if (this._shouldNonVRUseVRWithoutFloor()) {\r\n this._setReferenceSpaceHeightOffset(this._myHeightOffsetWithoutFloor, 0);\r\n } else if (this._myParams.myNonVRFloorBasedMode == NonVRReferenceSpaceMode.FLOOR) {\r\n this._setReferenceSpaceHeightOffset(0, 0);\r\n } else {\r\n this._setReferenceSpaceHeightOffset(this._myHeightNonVR, this._myParams.myForeheadExtraHeight);\r\n }\r\n }\r\n }\r\n\r\n private _getHeadTransformFromLocal(transformLocal: Readonly): Quaternion2 {\r\n return this._myCurrentHead.pp_convertTransformLocalToWorldQuat(transformLocal);\r\n }\r\n\r\n private static readonly _resyncHeadRotationForwardSV =\r\n {\r\n playerUp: vec3_create(),\r\n resyncHeadForward: vec3_create(),\r\n resyncHeadUp: vec3_create(),\r\n fixedResyncHeadRotation: quat_create()\r\n };\r\n private _resyncHeadRotationForward(resyncHeadRotation: Readonly): void {\r\n const playerUp = PlayerHeadManager._resyncHeadRotationForwardSV.playerUp;\r\n const resyncHeadForward = PlayerHeadManager._resyncHeadRotationForwardSV.resyncHeadForward;\r\n const resyncHeadUp = PlayerHeadManager._resyncHeadRotationForwardSV.resyncHeadUp;\r\n this.getPlayer().pp_getUp(playerUp);\r\n resyncHeadRotation.quat_getForward(resyncHeadForward);\r\n resyncHeadRotation.quat_getUp(resyncHeadUp);\r\n\r\n const fixedResyncHeadRotation = PlayerHeadManager._resyncHeadRotationForwardSV.fixedResyncHeadRotation;\r\n fixedResyncHeadRotation.quat_copy(resyncHeadRotation);\r\n fixedResyncHeadRotation.quat_setUp(playerUp, resyncHeadForward);\r\n\r\n if (!resyncHeadUp.vec3_isConcordant(playerUp)) {\r\n // If it was upside down, it's like it has to rotate the neck back up,so the forward is actually on the opposite side\r\n fixedResyncHeadRotation.quat_rotateAxis(180, playerUp, fixedResyncHeadRotation);\r\n }\r\n\r\n this.setRotationFeetQuat(fixedResyncHeadRotation);\r\n }\r\n\r\n private _debugUpdate(dt: number): void {\r\n Globals.getDebugVisualManager(this._myParams.myEngine)!.drawLineEnd(0, this.getPositionFeet(), this.getPositionHead(), vec4_create(1, 0, 0, 1), 0.01);\r\n\r\n console.error(this.getHeightEyes());\r\n }\r\n\r\n public destroy(): void {\r\n this._myDestroyed = true;\r\n\r\n this.setActive(false);\r\n }\r\n\r\n public isDestroyed(): boolean {\r\n return this._myDestroyed;\r\n }\r\n}", "import { Object3D, WonderlandEngine } from \"@wonderlandengine/api\";\r\nimport { PhysicsLayerFlags } from \"../../../../../cauldron/physics/physics_layer_flags.js\";\r\nimport { RaycastBlockColliderType } from \"../../../../../cauldron/physics/physics_raycast_params.js\";\r\nimport { Quaternion, Quaternion2, Vector3 } from \"../../../../../cauldron/type_definitions/array_type_definitions.js\";\r\nimport { XRUtils } from \"../../../../../cauldron/utils/xr_utils.js\";\r\nimport { quat2_create, quat_create, vec3_create, vec4_create } from \"../../../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Globals } from \"../../../../../pp/globals.js\";\r\nimport { CollisionCheckBridge } from \"../../../character_controller/collision/collision_check_bridge.js\";\r\nimport { CollisionCheckUtils } from \"../../../character_controller/collision/legacy/collision_check/collision_check_utils.js\";\r\nimport { CollisionCheckParams, CollisionRuntimeParams } from \"../../../character_controller/collision/legacy/collision_check/collision_params.js\";\r\nimport { PlayerHeadManager } from \"./player_head_manager.js\";\r\nimport { PlayerLocomotionTeleport } from \"./teleport/player_locomotion_teleport.js\";\r\n\r\nexport enum PlayerTransformManagerSyncFlag {\r\n BODY_COLLIDING = 0,\r\n HEAD_COLLIDING = 1,\r\n FAR = 2,\r\n FLOATING = 3,\r\n HEIGHT_COLLIDING = 4\r\n}\r\n\r\nexport class PlayerTransformManagerParams {\r\n\r\n public myPlayerHeadManager!: PlayerHeadManager;\r\n\r\n public myMovementCollisionCheckParams!: CollisionCheckParams;\r\n\r\n /** Can be left `null` and will be generated from the `myMovementCollisionCheckParams` */\r\n public myTeleportCollisionCheckParams: CollisionCheckParams | null = null;\r\n public myTeleportCollisionCheckParamsCopyFromMovement: boolean = false;\r\n public myTeleportCollisionCheckParamsCheck360: boolean = false;\r\n public myTeleportCollisionCheckParamsGroundAngleToIgnore: number | null = null;\r\n\r\n\r\n\r\n /** \r\n * This make it so if the valid position after syncing with real has some snapping, the real position too will also adjust to it \r\n * For example, with this off, if you move in real life over ramps the real life height will not change to avoid motion sickness,\r\n * but if you prefer to also go up and down, you need to enable this\r\n */\r\n public myApplyRealToValidAdjustmentsToRealPositionToo: boolean = false;\r\n\r\n /**\r\n * Does not prevent (for now at least) from colliding if you stand up and your head goes inside the ceiling, in that case the height\r\n * is not adjusted to prevent that and the view will be occluded\r\n */\r\n public myPreventRealFromColliding: boolean = false;\r\n\r\n public myAlwaysSyncPositionWithReal: boolean = false;\r\n public myAlwaysSyncHeadPositionWithReal: boolean = false;\r\n\r\n public myIgnoreUpwardMovementToRealIfValidOnGround: boolean = false;\r\n\r\n /**\r\n * If the real position is far, body will be considered colliding \r\n * If the body is colliding, the floating check is skipped\r\n */\r\n public readonly mySyncEnabledFlagMap: Map = new Map();\r\n public readonly mySyncPositionFlagMap: Map = new Map();\r\n public readonly mySyncPositionHeadFlagMap: Map = new Map();\r\n public readonly mySyncRotationFlagMap: Map = new Map();\r\n public readonly mySyncHeightFlagMap: Map = new Map();\r\n\r\n\r\n\r\n /** Used to make the character fall if it's leaning too much */\r\n public myIsLeaningValidAboveDistance: boolean = false;\r\n public myLeaningValidDistance: number = 0;\r\n\r\n /** Settings for both hop and lean */\r\n\r\n /**\r\n * With {@link myRealMovementAllowVerticalAdjustments} enabled these \"ValidIfVerticalMovement\" flags does not work properly,\r\n * since the adjustments can add vertical movement just due to snaps\r\n */\r\n public myIsFloatingValidIfVerticalMovement: boolean = false;\r\n public myIsFloatingValidIfVerticalMovementAndRealOnGround: boolean = false; // #TODO This is more an override\r\n public myIsFloatingValidIfRealOnGround: boolean = false;\r\n public myIsFloatingValidIfSteepGround: boolean = false;\r\n public myIsFloatingValidIfVerticalMovementAndSteepGround: boolean = false;\r\n\r\n public myFloatingSplitCheckEnabled: boolean = false;\r\n public myFloatingSplitCheckMinLength: number | null = null;\r\n public myFloatingSplitCheckMaxLength: number | null = null;\r\n public myFloatingSplitCheckStepEqualLength: boolean = false;\r\n public myFloatingSplitCheckStepEqualLengthMinLength: number = 0;\r\n\r\n\r\n /**\r\n * Can be useful if using the exact height is giving you issues like too close too ceilings, or view occluded too easily\r\n */\r\n public myExtraHeight: number = 0;\r\n\r\n public myMaxDistanceFromRealToSyncEnabled: boolean = false;\r\n\r\n /**\r\n * Max distance to resync valid with real \r\n * If your real position is farther the body will be considered as colliding\r\n */\r\n public myMaxDistanceFromRealToSync: number = 0;\r\n\r\n public myMaxDistanceFromHeadRealToSyncEnabled: boolean = false;\r\n\r\n /**\r\n * Max distance to resync valid head with real head \r\n * If you real head is farther the head will be considered as colliding\r\n * Vertically, the max distance can be higher if the current height is higher\r\n * Since the head might have been reset to feet\r\n */\r\n public myMaxDistanceFromHeadRealToSync: number = 0;\r\n\r\n /**\r\n * If this is enabled, the head will do this max amount of steps to reach the real head, but every step might be longer\r\n * than the safe max step \r\n * This means that the movement to reach the real head might not be as precise and can allow clipping through objects,\r\n * but it will be more performant\r\n * \r\n * Even though the max distance from the head can be already used to limit the amount of steps, when the head is reset\r\n * to feet, it's allowed to perform the whole height movement, even if above the max distance \r\n * If this adjustment movement is too heavy, this can limit it, even though might cause the valid head to move to invalid places\r\n */\r\n public myMaxHeadToRealHeadSteps: number | null = null;\r\n\r\n\r\n\r\n public myHeadRadius: number = 0;\r\n public myHeadHeight: number = 0;\r\n public readonly myHeadCollisionBlockLayerFlags: PhysicsLayerFlags = new PhysicsLayerFlags();\r\n public myHeadCollisionObjectsToIgnore: Readonly[] = [];\r\n public myHeadCollisionBlockColliderType: RaycastBlockColliderType = RaycastBlockColliderType.BOTH;\r\n\r\n /**\r\n * Can be used if when resetting to feet there might be dynamic objects which you would like to exclude for this reset check, \r\n * but you might still to normally avoid, for example for object you can grab and therefore put close to the head, which are not a big deal \r\n * and you can accept being able to see inside them when resetting the head, but not for normal movements\r\n */\r\n public myHeadCollisionBlockLayerFlagsForResetToFeet: PhysicsLayerFlags | null = null;\r\n\r\n\r\n\r\n public myRotateOnlyIfSynced: boolean = false;\r\n public myResetRealResetRotationIfUpChanged: boolean = false;\r\n\r\n\r\n\r\n /**\r\n * This make it so the head must be able to reach from the feet to the real head, sort of \r\n * like you were teleported in a space squashed to your feet and then have to get up \r\n * It can be used to prevent being able to see through the floor, since when the head is reset to the real one \r\n * if the real one is on the other side of the above floor there would be no collision \r\n * The risk is that, if you have objects close to your feet, your head could get stuck on them while trying to \"get up\" \r\n * and the view could be obscured thinking you have those objects in your view\r\n */\r\n public myResetHeadToFeetInsteadOfReal: boolean = false;\r\n\r\n /** This other flag is to fix the above issue, doing the \"squash and get up\" only if the head is not reachable normally \r\n The above issue can still happen but should be more rare, only if you teleport to a place where there could be garbage stuff */\r\n public myResetHeadToFeetInsteadOfRealOnlyIfRealNotReachable: boolean = false;\r\n\r\n public myResetHeadToFeetMoveTowardReal: boolean = false;\r\n\r\n /* Can be used to specify that the head should reset a bit above the actual feet level, so to avoid small objects that could very frequently \r\n happen to be close to the floor */\r\n public myResetHeadToFeetUpOffset: number = 0;\r\n\r\n public myResetHeadToFeetGroudnAngleIgnoreEnabled: boolean = false;\r\n\r\n public myResetHeadToRealMinDistance: number = 0;\r\n\r\n\r\n\r\n\r\n // #TODO Set valid if head synced (head manager) (not sure what I meant with this?)\r\n\r\n /** This true means that the real movement should also snap on ground or fix the vertical to pop from it \r\n You may want this if u want that while real moving u can also climb stairs */\r\n public myRealMovementAllowVerticalAdjustments: boolean = false;\r\n\r\n // #TODO Real movement apply vertical snap or not (other option to apply gravity) \r\n // (gravity inside this class?) only when movement is applied not for head only)\r\n\r\n public myUpdatePositionValid: boolean = false;\r\n public myUpdatePositionHeadValid: boolean = false;\r\n public myUpdateRealPositionValid: boolean = false;\r\n public myUpdateRealPositionHeadValid: boolean = false;\r\n\r\n public myMinHeight: number | null = null;\r\n public myMaxHeight: number | null = null;\r\n\r\n\r\n\r\n /** \r\n * These and the callbacks does not makes much sense \r\n * The colliding things are made to not sync the real position, but if the height is below and the body is not colliding \r\n * There is not reason not to resync, even if u put the real back on the valid the height will stay the same \r\n * If someone puts the head in the ground, there is no way for me to resync and make the head pop out sadly \r\n * In this case u either accept that u can move without seeing, or stop moving until the obscure is on\r\n */\r\n\r\n /** Could be ignored and added with the custom check callback if u want it */\r\n public myIsBodyCollidingWhenHeightBelowValue: number | null = null;\r\n\r\n /** Could be ignored and added with the custom check callback if u want it */\r\n public myIsBodyCollidingWhenHeightAboveValue: number | null = null;\r\n\r\n\r\n public myIsBodyCollidingExtraCheckCallback: ((playerTransformManager: PlayerTransformManager) => boolean) | null = null;\r\n public myIsLeaningExtraCheckCallback: ((playerTransformManager: PlayerTransformManager) => boolean) | null = null;\r\n public myIsHoppingExtraCheckCallback: ((playerTransformManager: PlayerTransformManager) => boolean) | null = null;\r\n public myIsFarExtraCheckCallback: ((playerTransformManager: PlayerTransformManager) => boolean) | null = null;\r\n\r\n\r\n\r\n public myAllowUpdateValidToRealWhenBlurred: boolean = false;\r\n\r\n public myResetToValidOnEnterSession: boolean = false;\r\n public myResetToValidOnExitSession: boolean = false;\r\n public myResetToValidOnSessionHiddenEnd: boolean = false;\r\n\r\n public myAlwaysResetRealPositionNonVR: boolean = false;\r\n public myAlwaysResetRealRotationNonVR: boolean = false;\r\n public myAlwaysResetRealHeightNonVR: boolean = false;\r\n\r\n public myAlwaysResetRealPositionVR: boolean = false;\r\n public myAlwaysResetRealRotationVR: boolean = false;\r\n public myAlwaysResetRealHeightVR: boolean = false;\r\n\r\n public myNeverResetRealPositionNonVR: boolean = false;\r\n public myNeverResetRealRotationNonVR: boolean = false;\r\n public myNeverResetRealHeightNonVR: boolean = false;\r\n\r\n public myResetRealHeightNonVROnExitSession: boolean = false;\r\n\r\n public myNeverResetRealPositionVR: boolean = false;\r\n public myNeverResetRealRotationVR: boolean = false;\r\n public myNeverResetRealHeightVR: boolean = false;\r\n\r\n public myResetRealOnMove: boolean = false;\r\n public myResetRealOnTeleport: boolean = false;\r\n\r\n public mySyncPositionDisabled: boolean = false;\r\n\r\n public myDebugEnabled: boolean = false;\r\n\r\n public readonly myEngine: Readonly;\r\n\r\n constructor(engine: Readonly = Globals.getMainEngine()!) {\r\n this.myEngine = engine;\r\n }\r\n}\r\n\r\n// #TODO Sliding info, surface info, update\r\nexport class PlayerTransformManager {\r\n\r\n private readonly _myParams: PlayerTransformManagerParams;\r\n\r\n private readonly _myRealMovementCollisionCheckParams!: CollisionCheckParams;\r\n private readonly _myHeadCollisionCheckParams !: CollisionCheckParams;\r\n\r\n private readonly _myCollisionRuntimeParams = new CollisionRuntimeParams();\r\n\r\n private _myPlayerLocomotionTeleport: PlayerLocomotionTeleport | null = null;\r\n\r\n private readonly _myValidPosition: Vector3 = vec3_create();\r\n private readonly _myValidRotationQuat: Quaternion = quat_create();\r\n private _myValidHeight: number = 0;\r\n private readonly _myValidPositionHead: Vector3 = vec3_create();\r\n private readonly _myValidPositionHeadBackupForResetToFeet: Vector3 = vec3_create();\r\n\r\n private _myIsBodyColliding: boolean = false;\r\n private _myIsHeadColliding: boolean = false;\r\n private _myIsLeaning: boolean = false;\r\n private _myIsHopping: boolean = false;\r\n private _myIsFar: boolean = false;\r\n private _myIsHeightColliding: boolean = false;\r\n\r\n private readonly _myLastValidMovementDirection: Vector3 = vec3_create();\r\n private _myIsPositionValid: boolean = false;\r\n private _myIsPositionHeadValid: boolean = false;\r\n private _myIsRealPositionValid: boolean = false;\r\n private _myIsRealPositionHeadValid: boolean = false;\r\n\r\n private _myResetRealOnHeadSynced: boolean = false;\r\n\r\n private _myResetHeadToFeetDirty: boolean = false;\r\n private _myResetHeadToFeetOnNextUpdateValidToReal: boolean = false;\r\n\r\n private _myVisibilityChangeEventListener: ((event: XRSessionEvent) => any) | null = null;\r\n\r\n private _mySessionHasBeenHidden: boolean = false;\r\n\r\n private _myActive: boolean = true;\r\n\r\n private _myDestroyed: boolean = false;\r\n\r\n constructor(params: PlayerTransformManagerParams) {\r\n this._myParams = params;\r\n\r\n this._generateRealMovementParamsFromMovementParams();\r\n\r\n if (this._myParams.myTeleportCollisionCheckParamsCopyFromMovement) {\r\n this._generateTeleportParamsFromMovementParams();\r\n }\r\n\r\n this._setupHeadCollisionCheckParams();\r\n }\r\n\r\n public start(): void {\r\n this.resetToReal(true, true, true, true, false, true);\r\n\r\n this._myActive = false;\r\n this.setActive(true);\r\n }\r\n\r\n public getParams(): PlayerTransformManagerParams {\r\n return this._myParams;\r\n }\r\n\r\n public setActive(active: boolean): void {\r\n if (this._myActive != active) {\r\n this._myActive = active;\r\n\r\n if (this._myActive) {\r\n XRUtils.registerSessionStartEndEventListeners(this, this._onXRSessionStart.bind(this), this._onXRSessionEnd.bind(this), true, true, this._myParams.myEngine);\r\n } else {\r\n if (this._myVisibilityChangeEventListener != null) {\r\n XRUtils.getSession(this._myParams.myEngine)?.removeEventListener(\"visibilitychange\", this._myVisibilityChangeEventListener);\r\n }\r\n\r\n XRUtils.unregisterSessionStartEndEventListeners(this, this._myParams.myEngine);\r\n }\r\n }\r\n }\r\n\r\n // #TODO update should be before to check the new valid transform and if the head new transform is fine\r\n // then update movements, so that they will use the proper transform\r\n // pre/post update?\r\n // For sliding if previous frame no horizontal movement then reset sliding on pre update\r\n // In generale capire come fare per risolvere i problemi quando c'è un move solo verticale che sputtana i dati dello sliding precedente\r\n // che servono per far slidare bene anche dopo, magari un flag per dire non aggiornare le cose relative al movimento orizzontale\r\n // o un move check solo verticale\r\n public update(dt: number): void {\r\n if (!this._myActive) return;\r\n\r\n // #TODO This should update ground and ceiling info but not sliding info \r\n\r\n if (this._myResetRealOnHeadSynced) {\r\n if (this.getPlayerHeadManager().isSynced()) {\r\n this._myResetRealOnHeadSynced = false;\r\n if (XRUtils.isSessionActive(this._myParams.myEngine)) {\r\n this.resetReal(\r\n !this._myParams.myNeverResetRealPositionVR,\r\n !this._myParams.myNeverResetRealRotationVR,\r\n !this._myParams.myNeverResetRealHeightVR,\r\n true,\r\n true);\r\n } else {\r\n this.resetReal(\r\n !this._myParams.myNeverResetRealPositionNonVR,\r\n !this._myParams.myNeverResetRealRotationNonVR,\r\n !this._myParams.myNeverResetRealHeightNonVR && this._myParams.myResetRealHeightNonVROnExitSession,\r\n true,\r\n true);\r\n }\r\n }\r\n }\r\n\r\n this._updateValidToReal(dt);\r\n this._updatePositionsValid(dt);\r\n\r\n this._updateCollisionHeight();\r\n\r\n if (this._myParams.myDebugEnabled && Globals.isDebugEnabled(this._myParams.myEngine)) {\r\n this._debugUpdate(dt);\r\n }\r\n }\r\n\r\n // #TODO Collision runtime will copy the result, so that u can use that for later reference like if it was sliding\r\n // Maybe there should be a way to sum all the things happened for proper movement in a summary runtime\r\n // or maybe the move should be done once per frame, or at least in theory\r\n // Move should move the valid transform, but also move the player object so that they head, even is colliding is dragged with it\r\n // Also teleport, should get the difference from previous and move the player object, this will keep the relative position head-to-valid\r\n private static readonly _moveSV =\r\n {\r\n fixedMovement: vec3_create(),\r\n transformQuat: quat2_create(),\r\n transformUp: vec3_create(),\r\n fixedVerticalMovement: vec3_create()\r\n };\r\n public move(movement: Readonly, forceMove: boolean = false, useHighestHeight: boolean = false, outCollisionRuntimeParams: CollisionRuntimeParams | null = null): void {\r\n if (this._myPlayerLocomotionTeleport != null) {\r\n this._myPlayerLocomotionTeleport.cancelTeleport();\r\n }\r\n\r\n this.checkMovement(movement, undefined, undefined, useHighestHeight, this._myCollisionRuntimeParams);\r\n\r\n if (outCollisionRuntimeParams != null) {\r\n outCollisionRuntimeParams.copy(this._myCollisionRuntimeParams);\r\n }\r\n\r\n const fixedMovement = PlayerTransformManager._moveSV.fixedMovement;\r\n if (!forceMove) {\r\n fixedMovement.vec3_copy(this._myCollisionRuntimeParams.myFixedMovement);\r\n } else {\r\n fixedMovement.vec3_copy(movement);\r\n }\r\n\r\n if (!fixedMovement.vec3_isZero(0.00001)) {\r\n this._myValidPosition.vec3_add(fixedMovement, this._myValidPosition);\r\n this.getPlayerHeadManager().moveFeet(fixedMovement);\r\n\r\n const fixedVerticalMovement = PlayerTransformManager._moveSV.fixedVerticalMovement;\r\n const transformQuat = PlayerTransformManager._moveSV.transformQuat;\r\n const transformUp = PlayerTransformManager._moveSV.transformUp;\r\n this.getTransformQuat(transformQuat);\r\n transformQuat.quat2_getUp(transformUp);\r\n if (fixedMovement.vec3_removeComponentAlongAxis(transformUp, fixedVerticalMovement).vec3_length() > 0.0001) {\r\n fixedMovement.vec3_normalize(this._myLastValidMovementDirection);\r\n }\r\n }\r\n\r\n // This make reset happens even for gravity, maybe u should do it manually\r\n if (this._myParams.myResetRealOnMove) {\r\n if (!this.isSynced()) {\r\n if (XRUtils.isSessionActive(this._myParams.myEngine)) {\r\n this.resetReal(\r\n !this._myParams.myNeverResetRealPositionVR,\r\n !this._myParams.myNeverResetRealRotationVR,\r\n !this._myParams.myNeverResetRealHeightVR,\r\n true);\r\n } else {\r\n this.resetReal(\r\n !this._myParams.myNeverResetRealPositionNonVR,\r\n !this._myParams.myNeverResetRealRotationNonVR,\r\n !this._myParams.myNeverResetRealHeightNonVR,\r\n true);\r\n }\r\n }\r\n }\r\n\r\n // #TODO Add move callback\r\n }\r\n\r\n private static readonly _checkMovementSV =\r\n {\r\n currentTransformQuat: quat2_create()\r\n };\r\n public checkMovement(movement: Readonly, currentTransformQuat?: Readonly, collisionCheckParams?: Readonly, useHighestHeight: boolean = false, outCollisionRuntimeParams?: CollisionRuntimeParams): CollisionRuntimeParams {\r\n this._updateCollisionHeight(useHighestHeight);\r\n\r\n if (currentTransformQuat == null) {\r\n currentTransformQuat = PlayerTransformManager._checkMovementSV.currentTransformQuat;\r\n this.getTransformQuat(currentTransformQuat);\r\n }\r\n\r\n if (collisionCheckParams == null) {\r\n collisionCheckParams = this._myParams.myMovementCollisionCheckParams;\r\n }\r\n\r\n if (outCollisionRuntimeParams == null) {\r\n outCollisionRuntimeParams = new CollisionRuntimeParams();\r\n outCollisionRuntimeParams.copy(this._myCollisionRuntimeParams);\r\n }\r\n\r\n CollisionCheckBridge.getCollisionCheck(this._myParams.myEngine as any).move(movement, currentTransformQuat, collisionCheckParams, outCollisionRuntimeParams);\r\n\r\n this._updateCollisionHeight();\r\n\r\n return outCollisionRuntimeParams;\r\n }\r\n\r\n private static readonly _teleportPositionSV =\r\n {\r\n teleportTransformQuat: quat2_create()\r\n };\r\n public teleportPosition(teleportPosition: Readonly, forceTeleport: boolean = false, forceTeleportSkipCollisionCheck: boolean = false, useHighestHeight: boolean = false, outCollisionRuntimeParams: CollisionRuntimeParams | null = null): void {\r\n const teleportTransformQuat = PlayerTransformManager._teleportPositionSV.teleportTransformQuat;\r\n this.getTransformQuat(teleportTransformQuat);\r\n teleportTransformQuat.quat2_setPosition(teleportPosition);\r\n this.teleportTransformQuat(teleportTransformQuat, forceTeleport, forceTeleportSkipCollisionCheck, useHighestHeight, outCollisionRuntimeParams);\r\n }\r\n\r\n private static readonly _teleportPositionRotationQuatSV =\r\n {\r\n teleportTransformQuat: quat2_create()\r\n };\r\n public teleportPositionRotationQuat(teleportPosition: Readonly, rotationQuat: Quaternion, forceTeleport: boolean = false, forceTeleportSkipCollisionCheck: boolean = false, useHighestHeight: boolean = false, outCollisionRuntimeParams: CollisionRuntimeParams | null = null): void {\r\n const teleportTransformQuat = PlayerTransformManager._teleportPositionRotationQuatSV.teleportTransformQuat;\r\n this.getTransformQuat(teleportTransformQuat);\r\n teleportTransformQuat.quat2_setPositionRotationQuat(teleportPosition, rotationQuat);\r\n this.teleportTransformQuat(teleportTransformQuat, forceTeleport, forceTeleportSkipCollisionCheck, useHighestHeight, outCollisionRuntimeParams);\r\n }\r\n\r\n private static readonly _teleportTransformQuatSV =\r\n {\r\n currentPosition: vec3_create(),\r\n teleportPosition: vec3_create(),\r\n teleportRotation: quat_create(),\r\n fixedMovement: vec3_create(),\r\n transformQuat: quat2_create(),\r\n transformUp: vec3_create(),\r\n flatTeleportForward: vec3_create()\r\n };\r\n public teleportTransformQuat(teleportTransformQuat: Readonly, forceTeleport: boolean = false, forceTeleportSkipCollisionCheck: boolean = false, useHighestHeight: boolean = false, outCollisionRuntimeParams: CollisionRuntimeParams | null = null): void {\r\n if (this._myPlayerLocomotionTeleport != null) {\r\n this._myPlayerLocomotionTeleport.cancelTeleport();\r\n }\r\n\r\n if (!forceTeleport || !forceTeleportSkipCollisionCheck) {\r\n this.checkTeleportToTransformQuat(teleportTransformQuat, undefined, undefined, useHighestHeight, this._myCollisionRuntimeParams);\r\n }\r\n\r\n if (outCollisionRuntimeParams != null) {\r\n outCollisionRuntimeParams.copy(this._myCollisionRuntimeParams);\r\n }\r\n\r\n const currentPosition = PlayerTransformManager._teleportTransformQuatSV.currentPosition;\r\n const teleportPosition = PlayerTransformManager._teleportTransformQuatSV.teleportPosition;\r\n const teleportRotation = PlayerTransformManager._teleportTransformQuatSV.teleportRotation;\r\n this.getPosition(currentPosition);\r\n teleportTransformQuat.quat2_getPosition(teleportPosition);\r\n teleportTransformQuat.quat2_getRotationQuat(teleportRotation);\r\n\r\n const fixedMovement = PlayerTransformManager._teleportTransformQuatSV.fixedMovement;\r\n fixedMovement.vec3_zero();\r\n if (!forceTeleport) {\r\n if (!this._myCollisionRuntimeParams.myTeleportCanceled) {\r\n this._myCollisionRuntimeParams.myFixedTeleportPosition.vec3_sub(currentPosition, fixedMovement);\r\n }\r\n } else {\r\n teleportPosition.vec3_sub(currentPosition, fixedMovement);\r\n }\r\n\r\n if (!this._myCollisionRuntimeParams.myTeleportCanceled || forceTeleport) {\r\n this._myValidRotationQuat.quat_copy(teleportRotation);\r\n this.getPlayerHeadManager().setRotationFeetQuat(teleportRotation);\r\n }\r\n\r\n if (!fixedMovement.vec3_isZero(0.00001)) {\r\n this._myValidPosition.vec3_add(fixedMovement, this._myValidPosition);\r\n this.getPlayerHeadManager().moveFeet(fixedMovement);\r\n\r\n const transformQuat = PlayerTransformManager._teleportTransformQuatSV.transformQuat;\r\n const transformUp = PlayerTransformManager._teleportTransformQuatSV.transformUp;\r\n const flatTeleportForward = PlayerTransformManager._teleportTransformQuatSV.flatTeleportForward;\r\n this.getTransformQuat(transformQuat);\r\n transformQuat.quat2_getUp(transformUp);\r\n if (this._myCollisionRuntimeParams.myTeleportForward.vec3_removeComponentAlongAxis(transformUp, flatTeleportForward).vec3_length() > 0.0001) {\r\n flatTeleportForward.vec3_normalize(this._myLastValidMovementDirection);\r\n }\r\n }\r\n\r\n if (this._myParams.myResetRealOnTeleport) {\r\n if (!this.isSynced()) {\r\n if (XRUtils.isSessionActive(this._myParams.myEngine)) {\r\n this.resetReal(\r\n !this._myParams.myNeverResetRealPositionVR,\r\n !this._myParams.myNeverResetRealRotationVR,\r\n !this._myParams.myNeverResetRealHeightVR,\r\n true);\r\n } else {\r\n this.resetReal(\r\n !this._myParams.myNeverResetRealPositionNonVR,\r\n !this._myParams.myNeverResetRealRotationNonVR,\r\n !this._myParams.myNeverResetRealHeightNonVR,\r\n true);\r\n }\r\n }\r\n }\r\n\r\n // #TODO Add teleport callback\r\n }\r\n\r\n private static readonly _checkTeleportToTransformQuatSV =\r\n {\r\n currentTransformQuat: quat2_create(),\r\n currentPosition: vec3_create(),\r\n teleportPosition: vec3_create(),\r\n teleportRotation: quat_create(),\r\n rotatedTransformQuat: quat2_create()\r\n };\r\n public checkTeleportToTransformQuat(teleportTransformQuat: Readonly, currentTransformQuat?: Readonly, collisionCheckParams?: Readonly, useHighestHeight: boolean = false, outCollisionRuntimeParams?: CollisionRuntimeParams): CollisionRuntimeParams {\r\n this._updateCollisionHeight(useHighestHeight);\r\n\r\n if (currentTransformQuat == null) {\r\n currentTransformQuat = PlayerTransformManager._checkTeleportToTransformQuatSV.currentTransformQuat;\r\n this.getTransformQuat(currentTransformQuat);\r\n }\r\n\r\n const currentPosition = PlayerTransformManager._checkTeleportToTransformQuatSV.currentPosition;\r\n const teleportPosition = PlayerTransformManager._checkTeleportToTransformQuatSV.teleportPosition;\r\n const teleportRotation = PlayerTransformManager._checkTeleportToTransformQuatSV.teleportRotation;\r\n const rotatedTransformQuat = PlayerTransformManager._checkTeleportToTransformQuatSV.rotatedTransformQuat;\r\n currentTransformQuat.quat2_getPosition(currentPosition);\r\n teleportTransformQuat.quat2_getPosition(teleportPosition);\r\n teleportTransformQuat.quat2_getRotationQuat(teleportRotation);\r\n rotatedTransformQuat.quat2_setPositionRotationQuat(currentPosition, teleportRotation);\r\n\r\n if (collisionCheckParams == null) {\r\n collisionCheckParams = this._myParams.myTeleportCollisionCheckParams!;\r\n }\r\n\r\n if (outCollisionRuntimeParams == null) {\r\n outCollisionRuntimeParams = new CollisionRuntimeParams();\r\n outCollisionRuntimeParams.copy(this._myCollisionRuntimeParams);\r\n }\r\n\r\n CollisionCheckBridge.getCollisionCheck(this._myParams.myEngine as any).teleport(teleportPosition, rotatedTransformQuat, collisionCheckParams, outCollisionRuntimeParams);\r\n\r\n this._updateCollisionHeight();\r\n\r\n return outCollisionRuntimeParams;\r\n }\r\n\r\n public checkTransformQuat(transformQuat: Readonly, collisionCheckParams?: Readonly, outCollisionRuntimeParams?: CollisionRuntimeParams): CollisionRuntimeParams {\r\n if (collisionCheckParams == null) {\r\n collisionCheckParams = this._myParams.myMovementCollisionCheckParams;\r\n }\r\n\r\n if (outCollisionRuntimeParams == null) {\r\n outCollisionRuntimeParams = new CollisionRuntimeParams();\r\n outCollisionRuntimeParams.copy(this._myCollisionRuntimeParams);\r\n }\r\n\r\n CollisionCheckBridge.getCollisionCheck(this._myParams.myEngine as any).positionCheck(true, transformQuat, collisionCheckParams, outCollisionRuntimeParams);\r\n\r\n return outCollisionRuntimeParams;\r\n }\r\n\r\n /** Quick way to force teleport to a position and reset the real to this */\r\n public forceTeleportAndReset(teleportPosition: Readonly, teleportRotationQuat: Readonly, forceTeleportSkipCollisionCheck: boolean = false): void {\r\n this.teleportPositionRotationQuat(teleportPosition, teleportRotationQuat, true, forceTeleportSkipCollisionCheck);\r\n\r\n this.resetReal(true, true, undefined, undefined, undefined, true);\r\n }\r\n\r\n public rotateQuat(rotationQuat: Readonly): void {\r\n this._myValidRotationQuat.quat_rotateQuat(rotationQuat, this._myValidRotationQuat);\r\n this.getPlayerHeadManager().rotateFeetQuat(rotationQuat);\r\n }\r\n\r\n private static readonly _setRotationQuatSV =\r\n {\r\n rotationToPerform: quat_create()\r\n };\r\n public setRotationQuat(rotationQuat: Readonly): void {\r\n const rotationToPerform = PlayerTransformManager._setRotationQuatSV.rotationToPerform;\r\n this._myValidRotationQuat.quat_rotationToQuat(rotationQuat, rotationToPerform);\r\n this.rotateQuat(rotationToPerform);\r\n }\r\n\r\n private static readonly _setHeightSV =\r\n {\r\n transformQuat: quat_create(),\r\n transformUp: vec3_create(),\r\n rotationQuat: quat_create(),\r\n horizontalDirection: vec3_create(),\r\n collisionRuntimeParams: new CollisionRuntimeParams()\r\n };\r\n public setHeight(height: number, forceSet: boolean = false): void {\r\n const fixedHeight = Math.pp_clamp(height, this._myParams.myMinHeight ?? undefined, this._myParams.myMaxHeight ?? undefined);\r\n const previousHeight = this.getHeight();\r\n\r\n this._myValidHeight = fixedHeight;\r\n this._updateCollisionHeight();\r\n\r\n const transformQuat = PlayerTransformManager._setHeightSV.transformQuat;\r\n const transformUp = PlayerTransformManager._setHeightSV.transformUp;\r\n const rotationQuat = PlayerTransformManager._setHeightSV.rotationQuat;\r\n const horizontalDirection = PlayerTransformManager._setHeightSV.horizontalDirection;\r\n this.getTransformQuat(transformQuat);\r\n transformQuat.quat2_getUp(transformUp);\r\n transformQuat.quat2_getRotationQuat(rotationQuat);\r\n this._myLastValidMovementDirection.vec3_removeComponentAlongAxis(transformUp, horizontalDirection);\r\n\r\n if (!horizontalDirection.vec3_isZero(0.00001)) {\r\n horizontalDirection.vec3_normalize(horizontalDirection);\r\n rotationQuat.quat_setUp(transformUp, horizontalDirection);\r\n transformQuat.quat2_setRotationQuat(rotationQuat);\r\n }\r\n\r\n const collisionRuntimeParams = PlayerTransformManager._setHeightSV.collisionRuntimeParams;\r\n collisionRuntimeParams.copy(this._myCollisionRuntimeParams);\r\n const debugBackup = this._myParams.myMovementCollisionCheckParams.myDebugEnabled;\r\n this._myParams.myMovementCollisionCheckParams.myDebugEnabled = false;\r\n CollisionCheckBridge.getCollisionCheck(this._myParams.myEngine as any).positionCheck(true, transformQuat, this._myParams.myMovementCollisionCheckParams, collisionRuntimeParams);\r\n this._myParams.myMovementCollisionCheckParams.myDebugEnabled = debugBackup;\r\n\r\n if (collisionRuntimeParams.myIsPositionOk || forceSet) {\r\n this.getPlayerHeadManager().setHeightHead(this.getHeight(), true);\r\n } else {\r\n this._myValidHeight = previousHeight;\r\n }\r\n\r\n this._updateCollisionHeight();\r\n }\r\n\r\n public getPlayer(): Object3D {\r\n return this._myParams.myPlayerHeadManager.getPlayer();\r\n }\r\n\r\n public getHead(): Object3D {\r\n return this._myParams.myPlayerHeadManager.getHead();\r\n }\r\n\r\n public getTransformQuat(): Quaternion2;\r\n public getTransformQuat(outTransformQuat: T): T;\r\n public getTransformQuat(outTransformQuat: Quaternion2 | T = quat2_create()): Quaternion2 | T {\r\n return outTransformQuat.quat2_setPositionRotationQuat(this.getPosition(this._myValidPosition), this.getRotationQuat(this._myValidRotationQuat));\r\n }\r\n\r\n public getPosition(): Vector3;\r\n public getPosition(outPosition: T): T;\r\n public getPosition(outPosition: Vector3 | T = vec3_create()): Vector3 | T {\r\n return outPosition.vec3_copy(this._myValidPosition);\r\n }\r\n\r\n public getRotationQuat(): Quaternion;\r\n public getRotationQuat(outRotationQuat: T): T;\r\n public getRotationQuat(outRotationQuat: Quaternion | T = quat_create()): Quaternion | T {\r\n return outRotationQuat.quat_copy(this._myValidRotationQuat);\r\n }\r\n\r\n public getPositionHead(): Vector3;\r\n public getPositionHead(outPosition: T): T;\r\n public getPositionHead(outPosition: Vector3 | T = vec3_create()): Vector3 | T {\r\n return outPosition.vec3_copy(this._myValidPositionHead);\r\n }\r\n\r\n public getTransformHeadQuat(): Quaternion2;\r\n public getTransformHeadQuat(outTransformQuat: T): T;\r\n public getTransformHeadQuat(outTransformQuat: Quaternion2 | T = quat2_create()): Quaternion2 | T {\r\n return outTransformQuat.quat2_setPositionRotationQuat(this.getPositionHead(this._myValidPositionHead), this.getRotationQuat(this._myValidRotationQuat));\r\n }\r\n\r\n public getHeight(): number {\r\n return this._myValidHeight;\r\n }\r\n\r\n public getTransformRealQuat(outTransformQuat: Quaternion2 = quat2_create()): Quaternion2 {\r\n return this.getPlayerHeadManager().getTransformFeetQuat(outTransformQuat);\r\n }\r\n\r\n public getPositionReal(): Vector3;\r\n public getPositionReal(outPosition: T): T;\r\n public getPositionReal(outPosition: Vector3 | T = vec3_create()): Vector3 | T {\r\n return this.getPlayerHeadManager().getPositionFeet(outPosition);\r\n }\r\n\r\n public getRotationRealQuat(): Quaternion;\r\n public getRotationRealQuat(outRotationQuat: T): T;\r\n public getRotationRealQuat(outRotationQuat: Quaternion | T = quat_create()): Quaternion | T {\r\n return this.getPlayerHeadManager().getRotationFeetQuat(outRotationQuat);\r\n }\r\n\r\n public getPositionHeadReal(): Vector3;\r\n public getPositionHeadReal(outPosition: T): T;\r\n public getPositionHeadReal(outPosition: Vector3 | T = vec3_create()): Vector3 | T {\r\n return this.getPlayerHeadManager().getPositionHead(outPosition);\r\n }\r\n\r\n public getTransformHeadRealQuat(): Quaternion2;\r\n public getTransformHeadRealQuat(outTransformQuat: T): T;\r\n public getTransformHeadRealQuat(outTransformQuat: Quaternion2 | T = quat2_create()): Quaternion2 | T {\r\n return this.getPlayerHeadManager().getTransformHeadQuat(outTransformQuat);\r\n }\r\n\r\n public getHeightReal(): number {\r\n return this._myParams.myPlayerHeadManager.getHeightHead();\r\n }\r\n\r\n public isSynced(syncFlagMap: Map | null = null): boolean {\r\n const isBodyColliding = this.isBodyColliding() && (syncFlagMap == null || syncFlagMap.get(PlayerTransformManagerSyncFlag.BODY_COLLIDING));\r\n const isHeadColliding = this.isHeadColliding() && (syncFlagMap == null || syncFlagMap.get(PlayerTransformManagerSyncFlag.HEAD_COLLIDING));\r\n const isFar = this.isFar() && (syncFlagMap == null || syncFlagMap.get(PlayerTransformManagerSyncFlag.FAR));\r\n const isFloating = this.isFloating() && (syncFlagMap == null || syncFlagMap.get(PlayerTransformManagerSyncFlag.FLOATING));\r\n const isHeightColliding = this.isHeightColliding() && (syncFlagMap == null || syncFlagMap.get(PlayerTransformManagerSyncFlag.HEIGHT_COLLIDING));\r\n return !isBodyColliding && !isHeadColliding && !isFar && !isFloating && !isHeightColliding;\r\n }\r\n\r\n private static readonly _resetRealSV =\r\n {\r\n realUp: vec3_create(),\r\n validUp: vec3_create(),\r\n position: vec3_create(),\r\n rotationQuat: quat_create(),\r\n\r\n positionHeadReal: vec3_create(),\r\n validPositionHeadBackupForResetToFeet: vec3_create()\r\n };\r\n public resetReal(resetPosition = true, resetRotation = false, resetHeight = false, resetHeadToReal = true, updateValidToReal = false, ignoreResetHeadMinDistance = false): void {\r\n const playerHeadManager = this.getPlayerHeadManager();\r\n\r\n const position = PlayerTransformManager._resetRealSV.position;\r\n if (resetPosition) {\r\n playerHeadManager.teleportPositionFeet(this.getPosition(position));\r\n }\r\n\r\n const realUp = PlayerTransformManager._resetRealSV.realUp;\r\n const rotationQuat = PlayerTransformManager._resetRealSV.rotationQuat;\r\n const validUp = PlayerTransformManager._resetRealSV.validUp;\r\n this.getPlayerHeadManager().getRotationFeetQuat(rotationQuat).quat_getUp(realUp);\r\n this.getRotationQuat(rotationQuat).quat_getUp(validUp);\r\n\r\n if (resetRotation || (realUp.vec3_angle(validUp) > Math.PP_EPSILON_DEGREES && this._myParams.myResetRealResetRotationIfUpChanged)) {\r\n playerHeadManager.setRotationFeetQuat(this.getRotationQuat(rotationQuat), false);\r\n }\r\n\r\n if (resetHeight) {\r\n playerHeadManager.setHeightHead(this.getHeight(), true);\r\n }\r\n\r\n if (resetHeadToReal) {\r\n const positionHeadReal = PlayerTransformManager._resetRealSV.positionHeadReal;\r\n this.getPositionHeadReal(positionHeadReal);\r\n const distanceToRealHead = this._myValidPositionHead.vec3_distance(positionHeadReal);\r\n if (ignoreResetHeadMinDistance || distanceToRealHead >= this._myParams.myResetHeadToRealMinDistance) {\r\n if (this._myParams.myResetHeadToFeetInsteadOfRealOnlyIfRealNotReachable) {\r\n this._myResetHeadToFeetOnNextUpdateValidToReal = true;\r\n const validPositionHeadBackupForResetToFeet = PlayerTransformManager._resetRealSV.validPositionHeadBackupForResetToFeet;\r\n validPositionHeadBackupForResetToFeet.vec3_copy(this._myValidPositionHead);\r\n this.resetHeadToFeet();\r\n this._myValidPositionHeadBackupForResetToFeet.vec3_copy(validPositionHeadBackupForResetToFeet);\r\n } else if (this._myParams.myResetHeadToFeetInsteadOfReal) {\r\n this.resetHeadToFeet();\r\n } else {\r\n this.resetHeadToReal();\r\n }\r\n }\r\n }\r\n\r\n if (updateValidToReal) {\r\n this._updateValidToReal(0);\r\n }\r\n }\r\n\r\n public updateValidToReal(): void {\r\n this._updateValidToReal(0);\r\n }\r\n\r\n public updateValidHeadToRealHead(): void {\r\n this._updateValidHeadToRealHead(0);\r\n }\r\n\r\n public updateValidHeadToRealHeadIfNeeded(): void {\r\n if (this._myResetHeadToFeetDirty) {\r\n this._updateValidHeadToRealHead(0);\r\n }\r\n }\r\n\r\n public resetToReal(resetPosition = true, resetRotation = true, resetHeight = true, resetPositionHead = true, updateValidToReal = false, resetToPlayerInsteadOfHead = false): void {\r\n if (resetPosition) {\r\n if (resetToPlayerInsteadOfHead) {\r\n this.getPlayerHeadManager().getPlayer().pp_getPosition(this._myValidPosition);\r\n } else {\r\n this.getPositionReal(this._myValidPosition);\r\n }\r\n }\r\n\r\n if (resetPositionHead) {\r\n if (!this._myParams.myAlwaysSyncPositionWithReal) {\r\n this.getPositionHeadReal(this._myValidPositionHead);\r\n this._myValidPositionHeadBackupForResetToFeet.vec3_copy(this._myValidPositionHead);\r\n\r\n this._myResetHeadToFeetOnNextUpdateValidToReal = false;\r\n this._myResetHeadToFeetDirty = false;\r\n }\r\n }\r\n\r\n if (resetRotation) {\r\n if (resetToPlayerInsteadOfHead) {\r\n this.getPlayerHeadManager().getPlayer().pp_getRotationQuat(this._myValidRotationQuat);\r\n } else {\r\n this.getRotationRealQuat(this._myValidRotationQuat);\r\n }\r\n }\r\n\r\n if (resetHeight) {\r\n this._myValidHeight = Math.pp_clamp(this.getHeightReal(), this._myParams.myMinHeight ?? undefined, this._myParams.myMaxHeight ?? undefined);\r\n }\r\n\r\n if (updateValidToReal) {\r\n this._updateValidToReal(0);\r\n }\r\n }\r\n\r\n public resetHeadToReal(): void {\r\n if (!this._myParams.myAlwaysSyncPositionWithReal) {\r\n this.getPositionHeadReal(this._myValidPositionHead);\r\n this._myValidPositionHeadBackupForResetToFeet.vec3_copy(this._myValidPositionHead);\r\n\r\n this._myResetHeadToFeetOnNextUpdateValidToReal = false;\r\n this._myResetHeadToFeetDirty = false;\r\n }\r\n }\r\n\r\n private static readonly _resetHeadToFeetSV =\r\n {\r\n transformQuat: quat2_create(),\r\n headUp: vec3_create()\r\n };\r\n public resetHeadToFeet(): void {\r\n this.getPosition(this._myValidPositionHead);\r\n\r\n const transformQuat = PlayerTransformManager._resetHeadToFeetSV.transformQuat;\r\n const headUp = PlayerTransformManager._resetHeadToFeetSV.headUp;\r\n this.getTransformHeadQuat(transformQuat);\r\n transformQuat.quat2_getUp(headUp);\r\n this._myValidPositionHead.vec3_add(headUp.vec3_scale(this._myHeadCollisionCheckParams.myHeight / 2 + 0.00001 + this._myParams.myResetHeadToFeetUpOffset, headUp), this._myValidPositionHead);\r\n this._myValidPositionHeadBackupForResetToFeet.vec3_copy(this._myValidPositionHead);\r\n\r\n this._myResetHeadToFeetDirty = true;\r\n }\r\n\r\n public isBodyColliding(): boolean {\r\n return this._myIsBodyColliding;\r\n }\r\n\r\n public isHeadColliding(): boolean {\r\n return this._myIsHeadColliding;\r\n }\r\n\r\n public isFloating(): boolean {\r\n return this.isLeaning() || this.isHopping();\r\n }\r\n\r\n public isLeaning(): boolean {\r\n return this._myIsLeaning;\r\n }\r\n\r\n public isHopping(): boolean {\r\n return this._myIsHopping;\r\n }\r\n\r\n public isFar(): boolean {\r\n return this._myIsFar;\r\n }\r\n\r\n public isHeightColliding(): boolean {\r\n return this._myIsHeightColliding;\r\n }\r\n\r\n private static readonly _getDistanceToRealSV =\r\n {\r\n position: vec3_create(),\r\n realPosition: vec3_create()\r\n };\r\n public getDistanceToReal(): number {\r\n const realPosition = PlayerTransformManager._getDistanceToRealSV.realPosition;\r\n const position = PlayerTransformManager._getDistanceToRealSV.position;\r\n\r\n this.getPositionReal(realPosition);\r\n return realPosition.vec3_distance(this.getPosition(position));\r\n }\r\n\r\n private static readonly _getDistanceToRealHeadSV =\r\n {\r\n position: vec3_create(),\r\n realPosition: vec3_create()\r\n };\r\n public getDistanceToRealHead(): number {\r\n const realPosition = PlayerTransformManager._getDistanceToRealSV.realPosition;\r\n const position = PlayerTransformManager._getDistanceToRealSV.position;\r\n\r\n this.getPositionHeadReal(realPosition);\r\n return realPosition.vec3_distance(this.getPositionHead(position));\r\n }\r\n\r\n public getPlayerHeadManager(): PlayerHeadManager {\r\n return this._myParams.myPlayerHeadManager;\r\n }\r\n\r\n public getMovementCollisionCheckParams(): CollisionCheckParams {\r\n return this._myParams.myMovementCollisionCheckParams;\r\n }\r\n\r\n public getTeleportCollisionCheckParams(): CollisionCheckParams {\r\n return this._myParams.myTeleportCollisionCheckParams!;\r\n }\r\n\r\n public getHeadCollisionCheckParams(): CollisionCheckParams {\r\n return this._myHeadCollisionCheckParams!;\r\n }\r\n\r\n /**\r\n * This should be used anytime the movement `CollisionCheckParams` are updated,\r\n * so that the other `CollisionCheckParams` are synced with that (if needed)\r\n * \r\n * The head `CollisionCheckParams` are another set of params which are not synced automatically\r\n * If you want to apply some changes made to the movement params to the head ones too, for example\r\n * a new object to ignore, you need to also manually update them\r\n */\r\n public movementCollisionCheckParamsUpdated(): void {\r\n if (this._myParams.myTeleportCollisionCheckParamsCopyFromMovement) {\r\n this._generateTeleportParamsFromMovementParams();\r\n }\r\n\r\n this._generateRealMovementParamsFromMovementParams();\r\n }\r\n\r\n public getCollisionRuntimeParams(): CollisionRuntimeParams {\r\n return this._myCollisionRuntimeParams;\r\n }\r\n\r\n public isPositionValid(): boolean {\r\n return this._myIsPositionValid;\r\n }\r\n\r\n public isPositionHeadValid(): boolean {\r\n return this._myIsPositionHeadValid;\r\n }\r\n\r\n public isPositionRealValid(): boolean {\r\n return this._myIsRealPositionValid;\r\n }\r\n\r\n public isPositionHeadRealValid(): boolean {\r\n return this._myIsRealPositionHeadValid;\r\n }\r\n\r\n public setPlayerLocomotionTeleport(playerLocomotionTeleport: PlayerLocomotionTeleport | null): void {\r\n this._myPlayerLocomotionTeleport = playerLocomotionTeleport;\r\n }\r\n\r\n private _updateCollisionHeight(useHighestHeight: boolean = false): void {\r\n const validHeight = this.getHeight();\r\n const realHeight = this.getHeightReal();\r\n\r\n const highestHeight = Math.max(validHeight, realHeight);\r\n\r\n this._myParams.myMovementCollisionCheckParams.myHeight = (useHighestHeight ? highestHeight : validHeight) + this._myParams.myExtraHeight;\r\n this._myParams.myTeleportCollisionCheckParams!.myHeight = this._myParams.myMovementCollisionCheckParams.myHeight;\r\n\r\n this._myRealMovementCollisionCheckParams.myHeight = Math.max(realHeight, this._myParams.myMinHeight ?? -Number.MAX_VALUE) + this._myParams.myExtraHeight;\r\n }\r\n\r\n private _setupHeadCollisionCheckParams(): void {\r\n (this._myHeadCollisionCheckParams as CollisionCheckParams) = new CollisionCheckParams();\r\n const params = this._myHeadCollisionCheckParams;\r\n\r\n params.myRadius = this._myParams.myHeadRadius;\r\n params.myDistanceFromFeetToIgnore = 0;\r\n params.myDistanceFromHeadToIgnore = 0;\r\n\r\n params.mySplitMovementEnabled = true;\r\n params.mySplitMovementMaxLengthEnabled = true;\r\n params.mySplitMovementMaxLength = params.myRadius * 0.75;\r\n params.mySplitMovementMinLengthEnabled = true;\r\n params.mySplitMovementMinLength = params.mySplitMovementMaxLength;\r\n\r\n if (this._myParams.myMaxHeadToRealHeadSteps != null) {\r\n params.mySplitMovementMaxStepsEnabled = true;\r\n params.mySplitMovementMaxSteps = this._myParams.myMaxHeadToRealHeadSteps;\r\n params.mySplitMovementMaxLengthLastStepCanBeLonger = true;\r\n }\r\n\r\n params.mySplitMovementStopWhenHorizontalMovementCanceled = true;\r\n params.mySplitMovementStopWhenVerticalMovementCanceled = true;\r\n params.mySplitMovementStopWhenVerticalMovementReduced = true;\r\n\r\n params.myHorizontalMovementCheckEnabled = true;\r\n params.myHorizontalMovementRadialStepAmount = 1;\r\n params.myHorizontalMovementCheckDiagonalOutward = true;\r\n params.myHorizontalMovementCheckDiagonalInward = true;\r\n params.myHorizontalMovementCheckVerticalDiagonalUpwardOutward = true;\r\n params.myHorizontalMovementCheckVerticalDiagonalUpwardInward = true;\r\n\r\n params.myHorizontalPositionCheckEnabled = true;\r\n params.myHalfConeAngle = 180;\r\n params.myHalfConeSliceAmount = 3;\r\n params.myCheckConeBorder = true;\r\n params.myCheckConeRay = true;\r\n params.myHorizontalPositionCheckVerticalIgnoreHitsInsideCollision = false;\r\n params.myHorizontalPositionCheckVerticalDirectionType = 0;\r\n\r\n params.myHeight = this._myParams.myHeadHeight;\r\n params.myPositionOffsetLocal.vec3_set(0, -params.myHeight / 2, 0);\r\n\r\n params.myCheckHeight = true;\r\n params.myCheckHeightVerticalMovement = true;\r\n params.myCheckHeightVerticalPosition = true;\r\n params.myHeightCheckStepAmountMovement = 2;\r\n params.myHeightCheckStepAmountPosition = 2;\r\n params.myCheckHeightTopMovement = true;\r\n params.myCheckHeightTopPosition = true;\r\n params.myCheckVerticalStraight = true;\r\n\r\n params.myCheckVerticalFixedForwardEnabled = true;\r\n params.myCheckVerticalFixedForward = vec3_create(0, 0, 1);\r\n\r\n params.myCheckHorizontalFixedForwardEnabled = true;\r\n params.myCheckHorizontalFixedForward = vec3_create(0, 0, 1);\r\n\r\n params.myVerticalMovementCheckEnabled = true;\r\n params.myVerticalPositionCheckEnabled = true;\r\n params.myCheckVerticalBothDirection = true;\r\n params.myCheckVerticalPositionBothDirection = true;\r\n\r\n params.myGroundCircumferenceAddCenter = true;\r\n params.myGroundCircumferenceSliceAmount = 6;\r\n params.myGroundCircumferenceStepAmount = 2;\r\n params.myGroundCircumferenceRotationPerStep = 30;\r\n params.myFeetRadius = params.myRadius;\r\n\r\n params.myHorizontalBlockLayerFlags.copy(this._myParams.myHeadCollisionBlockLayerFlags);\r\n params.myHorizontalObjectsToIgnore.pp_copy(this._myParams.myHeadCollisionObjectsToIgnore);\r\n params.myHorizontalBlockColliderType = this._myParams.myHeadCollisionBlockColliderType;\r\n params.myVerticalBlockLayerFlags.copy(this._myParams.myHeadCollisionBlockLayerFlags);\r\n params.myVerticalObjectsToIgnore.pp_copy(this._myParams.myHeadCollisionObjectsToIgnore);\r\n params.myVerticalBlockColliderType = this._myParams.myHeadCollisionBlockColliderType;\r\n\r\n params.mySlidingEnabled = false;\r\n\r\n params.mySnapOnGroundEnabled = false;\r\n params.mySnapOnCeilingEnabled = false;\r\n params.myGroundPopOutEnabled = false;\r\n params.myCeilingPopOutEnabled = false;\r\n params.myAdjustVerticalMovementWithGroundAngleDownhill = false;\r\n params.myAdjustVerticalMovementWithGroundAngleUphill = false;\r\n params.myAdjustVerticalMovementWithCeilingAngleDownhill = false;\r\n params.myAdjustVerticalMovementWithCeilingAngleUphill = false;\r\n params.myAdjustHorizontalMovementWithGroundAngleDownhill = false;\r\n params.myAdjustHorizontalMovementWithCeilingAngleDownhill = false;\r\n params.myVerticalMovementReduceEnabled = false;\r\n\r\n params.myDebugEnabled = false;\r\n\r\n params.myDebugHorizontalMovementEnabled = false;\r\n params.myDebugHorizontalPositionEnabled = false;\r\n params.myDebugVerticalMovementEnabled = false;\r\n params.myDebugVerticalPositionEnabled = false;\r\n params.myDebugSlidingEnabled = false;\r\n params.myDebugGroundInfoEnabled = false;\r\n params.myDebugCeilingInfoEnabled = false;\r\n params.myDebugRuntimeParamsEnabled = false;\r\n params.myDebugMovementEnabled = false;\r\n }\r\n\r\n private _generateTeleportParamsFromMovementParams(): void {\r\n if (this._myParams.myTeleportCollisionCheckParams == null) {\r\n this._myParams.myTeleportCollisionCheckParams = new CollisionCheckParams();\r\n }\r\n\r\n if (this._myParams.myTeleportCollisionCheckParamsCheck360) {\r\n this._myParams.myTeleportCollisionCheckParams = CollisionCheckUtils.generate360TeleportParamsFromMovementParams(this._myParams.myMovementCollisionCheckParams, this._myParams.myTeleportCollisionCheckParams);\r\n } else {\r\n this._myParams.myTeleportCollisionCheckParams.copy(this._myParams.myMovementCollisionCheckParams);\r\n }\r\n\r\n if (this._myParams.myTeleportCollisionCheckParamsGroundAngleToIgnore != null) {\r\n this._myParams.myTeleportCollisionCheckParams.myGroundAngleToIgnore = this._myParams.myTeleportCollisionCheckParamsGroundAngleToIgnore;\r\n }\r\n }\r\n\r\n private _generateRealMovementParamsFromMovementParams(): void {\r\n if (this._myRealMovementCollisionCheckParams == null) {\r\n (this._myRealMovementCollisionCheckParams as CollisionCheckParams) = new CollisionCheckParams();\r\n }\r\n\r\n const params = this._myRealMovementCollisionCheckParams;\r\n params.copy(this._myParams.myMovementCollisionCheckParams);\r\n\r\n params.mySplitMovementStopWhenHorizontalMovementCanceled = true;\r\n params.mySplitMovementStopWhenVerticalMovementCanceled = true;\r\n params._myInternalSplitMovementMaxStepsDisabled = true;\r\n\r\n params.mySlidingEnabled = false;\r\n\r\n if (!this._myParams.myRealMovementAllowVerticalAdjustments) {\r\n params.mySnapOnGroundEnabled = false;\r\n params.mySnapOnCeilingEnabled = false;\r\n params.myGroundPopOutEnabled = false;\r\n params.myCeilingPopOutEnabled = false;\r\n params.myAdjustVerticalMovementWithGroundAngleDownhill = false;\r\n params.myAdjustVerticalMovementWithGroundAngleUphill = false;\r\n params.myAdjustVerticalMovementWithCeilingAngleDownhill = false;\r\n params.myAdjustVerticalMovementWithCeilingAngleUphill = false;\r\n params.myAdjustHorizontalMovementWithGroundAngleDownhill = false;\r\n params.myAdjustHorizontalMovementWithCeilingAngleDownhill = false;\r\n params.myVerticalMovementReduceEnabled = false;\r\n }\r\n\r\n //params.myHorizontalMovementGroundAngleIgnoreHeight = 0.1 * 3;\r\n //params.myHorizontalMovementCeilingAngleIgnoreHeight = 0.1 * 3;\r\n\r\n params.myDebugEnabled = false;\r\n\r\n params.myDebugHorizontalMovementEnabled = false;\r\n params.myDebugHorizontalPositionEnabled = false;\r\n params.myDebugVerticalMovementEnabled = false;\r\n params.myDebugVerticalPositionEnabled = false;\r\n params.myDebugSlidingEnabled = false;\r\n params.myDebugGroundInfoEnabled = false;\r\n params.myDebugCeilingInfoEnabled = false;\r\n params.myDebugRuntimeParamsEnabled = false;\r\n params.myDebugMovementEnabled = false;\r\n }\r\n\r\n private _onXRSessionStart(manualCall: boolean, session: XRSession): void {\r\n if (!manualCall) {\r\n if (this._myActive) {\r\n if (this._myParams.myResetToValidOnEnterSession) {\r\n this._myResetRealOnHeadSynced = true;\r\n }\r\n }\r\n }\r\n\r\n this._myVisibilityChangeEventListener = function (this: PlayerTransformManager, event: XRSessionEvent) {\r\n if (event.session.visibilityState == \"hidden\") {\r\n this._mySessionHasBeenHidden = true;\r\n } else if (this._mySessionHasBeenHidden) {\r\n this._mySessionHasBeenHidden = false;\r\n\r\n if (this._myParams.myResetToValidOnSessionHiddenEnd) {\r\n this._myResetRealOnHeadSynced = true;\r\n }\r\n }\r\n }.bind(this);\r\n\r\n session.addEventListener(\"visibilitychange\", this._myVisibilityChangeEventListener);\r\n }\r\n\r\n private _onXRSessionEnd(): void {\r\n if (this._myActive) {\r\n if (this._myParams.myResetToValidOnExitSession) {\r\n this._myResetRealOnHeadSynced = true;\r\n }\r\n }\r\n\r\n this._myVisibilityChangeEventListener = null;\r\n }\r\n\r\n private static readonly _updatePositionsValidSV =\r\n {\r\n transformQuat: quat2_create(),\r\n collisionRuntimeParams: new CollisionRuntimeParams(),\r\n headCollisionRuntimeParams: new CollisionRuntimeParams(),\r\n transformUp: vec3_create(),\r\n horizontalDirection: vec3_create(),\r\n rotationQuat: quat_create()\r\n };\r\n private _updatePositionsValid(dt: number): void {\r\n this._updateCollisionHeight();\r\n\r\n if (this._myParams.myUpdatePositionValid) {\r\n const transformQuat = PlayerTransformManager._updatePositionsValidSV.transformQuat;\r\n const transformUp = PlayerTransformManager._updatePositionsValidSV.transformUp;\r\n const rotationQuat = PlayerTransformManager._updatePositionsValidSV.rotationQuat;\r\n const horizontalDirection = PlayerTransformManager._updatePositionsValidSV.horizontalDirection;\r\n this.getTransformQuat(transformQuat);\r\n transformQuat.quat2_getUp(transformUp);\r\n transformQuat.quat2_getRotationQuat(rotationQuat);\r\n this._myLastValidMovementDirection.vec3_removeComponentAlongAxis(transformUp, horizontalDirection);\r\n\r\n if (!horizontalDirection.vec3_isZero(0.00001)) {\r\n horizontalDirection.vec3_normalize(horizontalDirection);\r\n rotationQuat.quat_setUp(transformUp, horizontalDirection);\r\n transformQuat.quat2_setRotationQuat(rotationQuat);\r\n }\r\n\r\n const collisionRuntimeParams = PlayerTransformManager._updatePositionsValidSV.collisionRuntimeParams;\r\n collisionRuntimeParams.copy(this._myCollisionRuntimeParams);\r\n const debugBackup = this._myParams.myMovementCollisionCheckParams.myDebugEnabled;\r\n this._myParams.myMovementCollisionCheckParams.myDebugEnabled = false;\r\n CollisionCheckBridge.getCollisionCheck(this._myParams.myEngine as any).positionCheck(true, transformQuat, this._myParams.myMovementCollisionCheckParams, collisionRuntimeParams);\r\n this._myParams.myMovementCollisionCheckParams.myDebugEnabled = debugBackup;\r\n this._myIsPositionValid = collisionRuntimeParams.myIsPositionOk;\r\n } else {\r\n this._myIsPositionValid = true;\r\n }\r\n\r\n if (this._myParams.myUpdatePositionHeadValid) {\r\n const transformQuat = PlayerTransformManager._updatePositionsValidSV.transformQuat;\r\n this.getTransformHeadQuat(transformQuat);\r\n\r\n const headCollisionRuntimeParams = PlayerTransformManager._updatePositionsValidSV.headCollisionRuntimeParams;\r\n headCollisionRuntimeParams.reset();\r\n const debugBackup = this._myHeadCollisionCheckParams.myDebugEnabled;\r\n this._myHeadCollisionCheckParams.myDebugEnabled = false;\r\n CollisionCheckBridge.getCollisionCheck(this._myParams.myEngine as any).positionCheck(true, transformQuat, this._myHeadCollisionCheckParams, headCollisionRuntimeParams);\r\n this._myHeadCollisionCheckParams.myDebugEnabled = debugBackup;\r\n this._myIsPositionHeadValid = headCollisionRuntimeParams.myIsPositionOk;\r\n } else {\r\n this._myIsPositionHeadValid = true;\r\n }\r\n\r\n if (this._myParams.myUpdateRealPositionValid) {\r\n const transformQuat = PlayerTransformManager._updatePositionsValidSV.transformQuat;\r\n const transformUp = PlayerTransformManager._updatePositionsValidSV.transformUp;\r\n const rotationQuat = PlayerTransformManager._updatePositionsValidSV.rotationQuat;\r\n const horizontalDirection = PlayerTransformManager._updatePositionsValidSV.horizontalDirection;\r\n this.getTransformRealQuat(transformQuat);\r\n transformQuat.quat2_getUp(transformUp);\r\n transformQuat.quat2_getRotationQuat(rotationQuat);\r\n this._myLastValidMovementDirection.vec3_removeComponentAlongAxis(transformUp, horizontalDirection);\r\n\r\n if (!horizontalDirection.vec3_isZero(0.00001)) {\r\n horizontalDirection.vec3_normalize(horizontalDirection);\r\n rotationQuat.quat_setUp(transformUp, horizontalDirection);\r\n transformQuat.quat2_setRotationQuat(rotationQuat);\r\n }\r\n\r\n const collisionRuntimeParams = PlayerTransformManager._updatePositionsValidSV.collisionRuntimeParams;\r\n collisionRuntimeParams.copy(this._myCollisionRuntimeParams);\r\n const debugBackup = this._myParams.myMovementCollisionCheckParams.myDebugEnabled;\r\n this._myParams.myMovementCollisionCheckParams.myDebugEnabled = false;\r\n CollisionCheckBridge.getCollisionCheck(this._myParams.myEngine as any).positionCheck(true, transformQuat, this._myParams.myMovementCollisionCheckParams, collisionRuntimeParams);\r\n this._myIsRealPositionValid = collisionRuntimeParams.myIsPositionOk;\r\n this._myParams.myMovementCollisionCheckParams.myDebugEnabled = debugBackup;\r\n } else {\r\n this._myIsRealPositionValid = true;\r\n }\r\n\r\n if (this._myParams.myUpdateRealPositionHeadValid) {\r\n const transformQuat = PlayerTransformManager._updatePositionsValidSV.transformQuat;\r\n this.getTransformHeadRealQuat(transformQuat);\r\n\r\n const headCollisionRuntimeParams = PlayerTransformManager._updatePositionsValidSV.headCollisionRuntimeParams;\r\n headCollisionRuntimeParams.reset();\r\n const debugBackup = this._myHeadCollisionCheckParams.myDebugEnabled;\r\n this._myHeadCollisionCheckParams.myDebugEnabled = false;\r\n CollisionCheckBridge.getCollisionCheck(this._myParams.myEngine as any).positionCheck(true, transformQuat, this._myHeadCollisionCheckParams, headCollisionRuntimeParams);\r\n this._myHeadCollisionCheckParams.myDebugEnabled = debugBackup;\r\n this._myIsRealPositionHeadValid = headCollisionRuntimeParams.myIsPositionOk;\r\n } else {\r\n this._myIsRealPositionHeadValid = true;\r\n }\r\n }\r\n\r\n private static readonly _updateValidToRealSV =\r\n {\r\n movementToCheck: vec3_create(),\r\n position: vec3_create(),\r\n positionReal: vec3_create(),\r\n transformQuat: quat2_create(),\r\n collisionRuntimeParams: new CollisionRuntimeParams(),\r\n\r\n newValidMovementDirection: vec3_create(),\r\n newValidVerticalMovementDirection: vec3_create(),\r\n newPosition: vec3_create(),\r\n movementStep: vec3_create(),\r\n currentMovementStep: vec3_create(),\r\n transformUp: vec3_create(),\r\n verticalMovement: vec3_create(),\r\n movementChecked: vec3_create(),\r\n newFeetPosition: vec3_create(),\r\n floatingTransformQuat: quat2_create(),\r\n rotationQuat: quat_create(),\r\n horizontalDirection: vec3_create()\r\n };\r\n private _updateValidToReal(dt: number): void {\r\n // If the head is not synced, only do the check to see if head is colliding, but do not actually change the valid position\r\n const isHeadSynced = this.getPlayerHeadManager().isSynced(this._myParams.myAllowUpdateValidToRealWhenBlurred);\r\n\r\n this._updateCollisionHeight();\r\n\r\n const position = PlayerTransformManager._updateValidToRealSV.position;\r\n const positionReal = PlayerTransformManager._updateValidToRealSV.positionReal;\r\n const movementToCheck = PlayerTransformManager._updateValidToRealSV.movementToCheck;\r\n this.getPositionReal(positionReal).vec3_sub(this.getPosition(position), movementToCheck);\r\n\r\n this._myIsFar = false;\r\n // Far\r\n if (this._myParams.mySyncEnabledFlagMap.get(PlayerTransformManagerSyncFlag.FAR)) {\r\n if (this._myParams.myMaxDistanceFromRealToSyncEnabled && movementToCheck.vec3_length() > this._myParams.myMaxDistanceFromRealToSync) {\r\n this._myIsFar = true;\r\n } else if (this._myParams.myIsFarExtraCheckCallback != null && this._myParams.myIsFarExtraCheckCallback(this)) {\r\n this._myIsFar = true;\r\n }\r\n }\r\n\r\n const collisionRuntimeParams = PlayerTransformManager._updateValidToRealSV.collisionRuntimeParams;\r\n const transformQuat = PlayerTransformManager._updateValidToRealSV.transformQuat;\r\n const newPosition = PlayerTransformManager._updateValidToRealSV.newPosition;\r\n const transformUp = PlayerTransformManager._updateValidToRealSV.transformUp;\r\n this.getTransformQuat(transformQuat);\r\n newPosition.vec3_copy(positionReal);\r\n transformQuat.quat2_getUp(transformUp);\r\n\r\n this._myIsBodyColliding = false;\r\n // Body Colliding\r\n if (!this._myIsFar && this._myParams.mySyncEnabledFlagMap.get(PlayerTransformManagerSyncFlag.BODY_COLLIDING)) {\r\n const realHeight = this.getHeightReal();\r\n if (Math.pp_clamp(realHeight, this._myParams.myIsBodyCollidingWhenHeightBelowValue ?? undefined, this._myParams.myIsBodyCollidingWhenHeightAboveValue ?? undefined) != realHeight) {\r\n this._myIsBodyColliding = true;\r\n } else {\r\n collisionRuntimeParams.copy(this._myCollisionRuntimeParams);\r\n\r\n // #TODO Temp as long as surface infos are not updated every time the position changes\r\n // This is needed to understand if snapping should occur (and possibly other stuff I can't remember)\r\n CollisionCheckBridge.getCollisionCheck(this._myParams.myEngine as any).updateSurfaceInfo(transformQuat, this._myParams.myMovementCollisionCheckParams, collisionRuntimeParams);\r\n\r\n if (collisionRuntimeParams.myIsOnGround && this._myParams.myIgnoreUpwardMovementToRealIfValidOnGround) {\r\n const valueAlongUp = movementToCheck.vec3_valueAlongAxis(transformUp);\r\n if (valueAlongUp >= 0) {\r\n movementToCheck.vec3_removeComponentAlongAxis(transformUp, movementToCheck);\r\n }\r\n }\r\n\r\n CollisionCheckBridge.getCollisionCheck(this._myParams.myEngine as any).move(movementToCheck, transformQuat, this._myRealMovementCollisionCheckParams, collisionRuntimeParams);\r\n\r\n if (!collisionRuntimeParams.myHorizontalMovementCanceled && !collisionRuntimeParams.myVerticalMovementCanceled) {\r\n if (this._myParams.myIsBodyCollidingExtraCheckCallback != null && this._myParams.myIsBodyCollidingExtraCheckCallback(this)) {\r\n this._myIsBodyColliding = true;\r\n } else {\r\n this._myIsBodyColliding = false;\r\n newPosition.vec3_copy(collisionRuntimeParams.myNewPosition);\r\n movementToCheck.vec3_copy(collisionRuntimeParams.myFixedMovement);\r\n }\r\n } else {\r\n this._myIsBodyColliding = true;\r\n }\r\n }\r\n } else if (this._myIsFar) {\r\n this._myIsBodyColliding = true;\r\n }\r\n\r\n if (this._myParams.myAlwaysSyncPositionWithReal) {\r\n newPosition.vec3_copy(positionReal);\r\n }\r\n\r\n this._myIsLeaning = false;\r\n this._myIsHopping = false;\r\n // Floating \r\n if (!this._myIsBodyColliding && this._myParams.mySyncEnabledFlagMap.get(PlayerTransformManagerSyncFlag.FLOATING)) {\r\n collisionRuntimeParams.copy(this._myCollisionRuntimeParams);\r\n const floatingTransformQuat = PlayerTransformManager._updateValidToRealSV.floatingTransformQuat;\r\n floatingTransformQuat.quat2_setPositionRotationQuat(this._myValidPosition, this._myValidRotationQuat);\r\n CollisionCheckBridge.getCollisionCheck(this._myParams.myEngine as any).updateSurfaceInfo(floatingTransformQuat, this._myRealMovementCollisionCheckParams, collisionRuntimeParams);\r\n // #TODO Utilizzare on ground del body gia calcolato, ma ora non c'è quindi va bene così\r\n\r\n if (collisionRuntimeParams.myIsOnGround) {\r\n const verticalMovement = PlayerTransformManager._updateValidToRealSV.verticalMovement;\r\n movementToCheck.vec3_componentAlongAxis(transformUp, verticalMovement);\r\n const isVertical = !verticalMovement.vec3_isZero(0.00001);\r\n if (!isVertical || !this._myParams.myIsFloatingValidIfVerticalMovement) {\r\n let movementStepAmount = 1;\r\n const movementStep = PlayerTransformManager._updateValidToRealSV.movementStep;\r\n movementStep.vec3_copy(movementToCheck);\r\n if (!movementToCheck.vec3_isZero(0.00001) && this._myParams.myFloatingSplitCheckEnabled) {\r\n const minLength = this._myParams.myFloatingSplitCheckMinLength;\r\n const maxLength = this._myParams.myFloatingSplitCheckMaxLength;\r\n\r\n const movementLength = movementToCheck.vec3_length();\r\n const stepLength = Math.pp_clamp(movementLength, minLength ?? undefined, maxLength ?? undefined);\r\n\r\n movementStepAmount = Math.ceil(movementLength / stepLength);\r\n movementStep.vec3_normalize(movementStep).vec3_scale(stepLength, movementStep);\r\n\r\n movementStepAmount = Math.max(1, movementStepAmount);\r\n\r\n if (movementStepAmount == 1) {\r\n movementStep.vec3_copy(movementToCheck);\r\n }\r\n }\r\n\r\n const isOnValidGroundAngle = collisionRuntimeParams.myGroundAngle <= this._myRealMovementCollisionCheckParams.myGroundAngleToIgnore + 0.0001;\r\n\r\n const movementChecked = PlayerTransformManager._updateValidToRealSV.movementChecked;\r\n const newFeetPosition = PlayerTransformManager._updateValidToRealSV.newFeetPosition;\r\n movementChecked.vec3_zero();\r\n newFeetPosition.vec3_copy(this._myValidPosition);\r\n collisionRuntimeParams.copy(this._myCollisionRuntimeParams);\r\n\r\n let atLeastOneNotOnGround = false;\r\n let isOneOnGroundBetweenNoGround = false;\r\n let isLastOnGround = false;\r\n let isOneOnSteepGround = false;\r\n\r\n const isOnGroundIfInsideHitBackup = this._myRealMovementCollisionCheckParams.myIsOnGroundIfInsideHit;\r\n\r\n // Previously this was always apply to real, but I think it was needed just for the floating check\r\n // If it seems there are errors due to this, move back to have this always enabled\r\n //\r\n // If the position check was used, this would probably not be needed because snap could happen, but since it's more performance heavy\r\n // just the surface check is done\r\n this._myRealMovementCollisionCheckParams.myIsOnGroundIfInsideHit = true;\r\n\r\n const currentMovementStep = PlayerTransformManager._updateValidToRealSV.currentMovementStep;\r\n for (let i = 0; i < movementStepAmount; i++) {\r\n if (movementStepAmount == 1 || i != movementStepAmount - 1) {\r\n currentMovementStep.vec3_copy(movementStep);\r\n } else {\r\n movementToCheck.vec3_sub(movementChecked, currentMovementStep);\r\n }\r\n\r\n newFeetPosition.vec3_add(currentMovementStep, newFeetPosition);\r\n floatingTransformQuat.quat2_setPositionRotationQuat(newFeetPosition, this._myValidRotationQuat);\r\n collisionRuntimeParams.copy(this._myCollisionRuntimeParams);\r\n CollisionCheckBridge.getCollisionCheck(this._myParams.myEngine as any).updateSurfaceInfo(floatingTransformQuat, this._myRealMovementCollisionCheckParams, collisionRuntimeParams);\r\n movementChecked.vec3_add(currentMovementStep, movementChecked);\r\n\r\n if (!collisionRuntimeParams.myIsOnGround) {\r\n atLeastOneNotOnGround = true;\r\n } else {\r\n if (collisionRuntimeParams.myGroundAngle > this._myRealMovementCollisionCheckParams.myGroundAngleToIgnore + 0.0001) {\r\n isOneOnSteepGround = true;\r\n }\r\n\r\n if (atLeastOneNotOnGround) {\r\n isOneOnGroundBetweenNoGround = true;\r\n }\r\n\r\n if (i == movementStepAmount - 1) {\r\n isLastOnGround = true;\r\n }\r\n }\r\n }\r\n\r\n this._myRealMovementCollisionCheckParams.myIsOnGroundIfInsideHit = isOnGroundIfInsideHitBackup;\r\n\r\n const isFloatingOnSteepGroundFail = isOneOnSteepGround && isOnValidGroundAngle &&\r\n !this._myParams.myIsFloatingValidIfSteepGround && (!isVertical || !this._myParams.myIsFloatingValidIfVerticalMovementAndSteepGround);\r\n if (atLeastOneNotOnGround || isFloatingOnSteepGroundFail) {\r\n if (isOneOnGroundBetweenNoGround) {\r\n this._myIsHopping = true;\r\n } else {\r\n this._myIsLeaning = true;\r\n }\r\n } else {\r\n this._myIsLeaning = false;\r\n this._myIsHopping = false;\r\n\r\n if (this._myParams.myIsLeaningExtraCheckCallback != null && this._myParams.myIsLeaningExtraCheckCallback(this)) {\r\n this._myIsLeaning = true;\r\n } else if (this._myParams.myIsHoppingExtraCheckCallback != null && this._myParams.myIsHoppingExtraCheckCallback(this)) {\r\n this._myIsHopping = true;\r\n }\r\n }\r\n\r\n if (this._myIsLeaning) {\r\n const distance = movementToCheck.vec3_length();\r\n if (this._myParams.myIsLeaningValidAboveDistance && distance > this._myParams.myLeaningValidDistance) {\r\n this._myIsLeaning = false;\r\n }\r\n }\r\n\r\n if (this._myIsLeaning || this._myIsHopping) {\r\n if (isLastOnGround && this._myParams.myIsFloatingValidIfRealOnGround) {\r\n this._myIsLeaning = false;\r\n this._myIsHopping = false;\r\n } else if (isLastOnGround && isVertical && this._myParams.myIsFloatingValidIfVerticalMovementAndRealOnGround) {\r\n this._myIsLeaning = false;\r\n this._myIsHopping = false;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (isHeadSynced) {\r\n if ((this.isSynced(this._myParams.mySyncPositionFlagMap) || this._myParams.myAlwaysSyncPositionWithReal) && !this._myParams.mySyncPositionDisabled &&\r\n (this._myPlayerLocomotionTeleport == null || !this._myPlayerLocomotionTeleport.isTeleporting())) {\r\n const newValidMovementDirection = PlayerTransformManager._updateValidToRealSV.newValidMovementDirection;\r\n const newValidVerticalMovementDirection = PlayerTransformManager._updateValidToRealSV.newValidVerticalMovementDirection;\r\n newPosition.vec3_sub(this._myValidPosition, newValidMovementDirection);\r\n if (newValidMovementDirection.vec3_removeComponentAlongAxis(transformUp, newValidVerticalMovementDirection).vec3_length() > 0.0001) {\r\n newValidMovementDirection.vec3_normalize(this._myLastValidMovementDirection);\r\n }\r\n\r\n this._myValidPosition.vec3_copy(newPosition);\r\n\r\n // This might cause motion sickness\r\n if (this._myParams.myApplyRealToValidAdjustmentsToRealPositionToo) {\r\n this.resetReal(true, false, false, false, false, false);\r\n }\r\n }\r\n\r\n // For now I've not found a valid reason not to always sync rotation, it shouldn't case any trouble even if the new direction collides a bit\r\n if (this.isSynced(this._myParams.mySyncRotationFlagMap)) {\r\n this.getRotationRealQuat(this._myValidRotationQuat);\r\n }\r\n }\r\n\r\n const newHeight = Math.pp_clamp(this.getHeightReal(), this._myParams.myMinHeight ?? undefined, this._myParams.myMaxHeight ?? undefined);\r\n this._myIsHeightColliding = false;\r\n // Height Colliding \r\n if (this._myParams.mySyncEnabledFlagMap.get(PlayerTransformManagerSyncFlag.HEIGHT_COLLIDING)) {\r\n const transformQuat = PlayerTransformManager._updateValidToRealSV.transformQuat;\r\n const transformUp = PlayerTransformManager._updateValidToRealSV.transformUp;\r\n const rotationQuat = PlayerTransformManager._updateValidToRealSV.rotationQuat;\r\n const horizontalDirection = PlayerTransformManager._updateValidToRealSV.horizontalDirection;\r\n this.getTransformQuat(transformQuat);\r\n transformQuat.quat2_getUp(transformUp);\r\n transformQuat.quat2_getRotationQuat(rotationQuat);\r\n this._myLastValidMovementDirection.vec3_removeComponentAlongAxis(transformUp, horizontalDirection);\r\n\r\n if (!horizontalDirection.vec3_isZero(0.00001)) {\r\n horizontalDirection.vec3_normalize(horizontalDirection);\r\n rotationQuat.quat_setUp(transformUp, horizontalDirection);\r\n transformQuat.quat2_setRotationQuat(rotationQuat);\r\n }\r\n\r\n const collisionRuntimeParams = PlayerTransformManager._updateValidToRealSV.collisionRuntimeParams;\r\n collisionRuntimeParams.copy(this._myCollisionRuntimeParams);\r\n const debugBackup = this._myParams.myMovementCollisionCheckParams.myDebugEnabled;\r\n const heightBackup = this._myParams.myMovementCollisionCheckParams.myHeight;\r\n this._myParams.myMovementCollisionCheckParams.myHeight = newHeight + this._myParams.myExtraHeight;\r\n this._myParams.myMovementCollisionCheckParams.myDebugEnabled = false;\r\n CollisionCheckBridge.getCollisionCheck(this._myParams.myEngine as any).positionCheck(true, transformQuat, this._myParams.myMovementCollisionCheckParams, collisionRuntimeParams);\r\n this._myParams.myMovementCollisionCheckParams.myDebugEnabled = debugBackup;\r\n this._myParams.myMovementCollisionCheckParams.myHeight = heightBackup;\r\n\r\n this._myIsHeightColliding = !collisionRuntimeParams.myIsPositionOk;\r\n }\r\n\r\n if (isHeadSynced) {\r\n if (this.isSynced(this._myParams.mySyncHeightFlagMap)) {\r\n this._myValidHeight = newHeight;\r\n this._updateCollisionHeight();\r\n }\r\n\r\n if (this._myParams.myPreventRealFromColliding) {\r\n this.resetReal(true, false, false, false, false, false);\r\n }\r\n }\r\n\r\n this._updateValidHeadToRealHead(dt);\r\n }\r\n\r\n private static readonly _updateValidHeadToRealHeadSV =\r\n {\r\n movementToCheck: vec3_create(),\r\n horizontalMovementToCheck: vec3_create(),\r\n verticalMovementToCheck: vec3_create(),\r\n position: vec3_create(),\r\n positionReal: vec3_create(),\r\n transformQuat: quat2_create(),\r\n collisionRuntimeParams: new CollisionRuntimeParams(),\r\n\r\n bodyRotationQuat: quat_create(),\r\n bodyUp: vec3_create(),\r\n bodyPosition: vec3_create(),\r\n\r\n newPositionHead: vec3_create(),\r\n\r\n backupHorizontalBlockLayerFlags: new PhysicsLayerFlags(),\r\n backupVerticalBlockLayerFlags: new PhysicsLayerFlags()\r\n };\r\n private _updateValidHeadToRealHead(dt: number): void {\r\n // If the head is not synced, only do the check to see if head is colliding, but do not actually change the valid position\r\n const isHeadSynced = this.getPlayerHeadManager().isSynced(this._myParams.myAllowUpdateValidToRealWhenBlurred);\r\n\r\n this._myIsHeadColliding = false;\r\n\r\n const backupHorizontalBlockLayerFlags = PlayerTransformManager._updateValidHeadToRealHeadSV.backupHorizontalBlockLayerFlags;\r\n const backupVerticalBlockLayerFlags = PlayerTransformManager._updateValidHeadToRealHeadSV.backupVerticalBlockLayerFlags;\r\n backupHorizontalBlockLayerFlags.copy(this._myHeadCollisionCheckParams.myHorizontalBlockLayerFlags);\r\n backupVerticalBlockLayerFlags.copy(this._myHeadCollisionCheckParams.myVerticalBlockLayerFlags);\r\n\r\n const backupVerticalMovementReduceEnabled = this._myHeadCollisionCheckParams.myVerticalMovementReduceEnabled;\r\n\r\n const backupGroundAngleToIgnore = this._myHeadCollisionCheckParams.myGroundAngleToIgnore;\r\n const backupGroundAngleToIgnoreWithPerceivedAngle = this._myHeadCollisionCheckParams.myGroundAngleToIgnoreWithPerceivedAngle;\r\n const backupHorizontalMovementGroundAngleIgnoreHeight = this._myHeadCollisionCheckParams.myHorizontalMovementGroundAngleIgnoreHeight;\r\n const backupHorizontalPositionGroundAngleIgnoreHeight = this._myHeadCollisionCheckParams.myHorizontalPositionGroundAngleIgnoreHeight;\r\n const backupHorizontalMovementGroundAngleIgnoreMaxMovementLeft = this._myHeadCollisionCheckParams.myHorizontalMovementGroundAngleIgnoreMaxMovementLeft;\r\n\r\n let headReducedVerticalMovementFeetAdjustment = false;\r\n\r\n const newPositionHead = PlayerTransformManager._updateValidHeadToRealHeadSV.newPositionHead;\r\n const positionReal = PlayerTransformManager._updateValidHeadToRealHeadSV.positionReal;\r\n\r\n // Head Colliding\r\n let firstHeadCollidingCheckDone = false;\r\n do {\r\n if (isHeadSynced) {\r\n if (firstHeadCollidingCheckDone && this._myResetHeadToFeetOnNextUpdateValidToReal) {\r\n this._myResetHeadToFeetOnNextUpdateValidToReal = false;\r\n this.resetHeadToFeet();\r\n }\r\n }\r\n\r\n let resetHeadToFeetDirty = this._myResetHeadToFeetDirty;\r\n\r\n if (this._myResetHeadToFeetOnNextUpdateValidToReal) {\r\n this._myValidPositionHead.vec3_copy(this._myValidPositionHeadBackupForResetToFeet);\r\n\r\n if (isHeadSynced) {\r\n this._myResetHeadToFeetDirty = false;\r\n }\r\n\r\n resetHeadToFeetDirty = false;\r\n }\r\n\r\n if (resetHeadToFeetDirty) {\r\n if (this._myParams.myHeadCollisionBlockLayerFlagsForResetToFeet != null) {\r\n this._myHeadCollisionCheckParams.myHorizontalBlockLayerFlags.copy(this._myParams.myHeadCollisionBlockLayerFlagsForResetToFeet);\r\n this._myHeadCollisionCheckParams.myVerticalBlockLayerFlags.copy(this._myParams.myHeadCollisionBlockLayerFlagsForResetToFeet);\r\n }\r\n\r\n if (this._myParams.myResetHeadToFeetMoveTowardReal) {\r\n this._myHeadCollisionCheckParams.myVerticalMovementReduceEnabled = true;\r\n }\r\n\r\n if (this._myParams.myResetHeadToFeetGroudnAngleIgnoreEnabled) {\r\n this._myHeadCollisionCheckParams.myGroundAngleToIgnore = this._myParams.myMovementCollisionCheckParams.myGroundAngleToIgnore;\r\n this._myHeadCollisionCheckParams.myGroundAngleToIgnoreWithPerceivedAngle = this._myParams.myMovementCollisionCheckParams.myGroundAngleToIgnoreWithPerceivedAngle;\r\n\r\n this._myHeadCollisionCheckParams.myHorizontalMovementGroundAngleIgnoreHeight = this._myParams.myMovementCollisionCheckParams.myHorizontalMovementGroundAngleIgnoreHeight;\r\n this._myHeadCollisionCheckParams.myHorizontalPositionGroundAngleIgnoreHeight = this._myParams.myMovementCollisionCheckParams.myHorizontalPositionGroundAngleIgnoreHeight;\r\n\r\n this._myHeadCollisionCheckParams.myHorizontalMovementGroundAngleIgnoreMaxMovementLeft = this._myParams.myMovementCollisionCheckParams.myHorizontalMovementGroundAngleIgnoreMaxMovementLeft;\r\n }\r\n\r\n if (isHeadSynced) {\r\n this._myResetHeadToFeetDirty = false;\r\n }\r\n } else {\r\n this._myHeadCollisionCheckParams.myHorizontalBlockLayerFlags.copy(backupHorizontalBlockLayerFlags);\r\n this._myHeadCollisionCheckParams.myVerticalBlockLayerFlags.copy(backupVerticalBlockLayerFlags);\r\n this._myHeadCollisionCheckParams.myVerticalMovementReduceEnabled = backupVerticalMovementReduceEnabled;\r\n\r\n this._myHeadCollisionCheckParams.myGroundAngleToIgnore = backupGroundAngleToIgnore;\r\n this._myHeadCollisionCheckParams.myGroundAngleToIgnoreWithPerceivedAngle = backupGroundAngleToIgnoreWithPerceivedAngle;\r\n this._myHeadCollisionCheckParams.myHorizontalMovementGroundAngleIgnoreHeight = backupHorizontalMovementGroundAngleIgnoreHeight;\r\n this._myHeadCollisionCheckParams.myHorizontalPositionGroundAngleIgnoreHeight = backupHorizontalPositionGroundAngleIgnoreHeight;\r\n this._myHeadCollisionCheckParams.myHorizontalMovementGroundAngleIgnoreMaxMovementLeft = backupHorizontalMovementGroundAngleIgnoreMaxMovementLeft;\r\n }\r\n\r\n const position = PlayerTransformManager._updateValidHeadToRealHeadSV.position;\r\n const movementToCheck = PlayerTransformManager._updateValidHeadToRealHeadSV.movementToCheck;\r\n this.getPositionHeadReal(positionReal).vec3_sub(this.getPositionHead(position), movementToCheck);\r\n\r\n const collisionRuntimeParams = PlayerTransformManager._updateValidHeadToRealHeadSV.collisionRuntimeParams;\r\n collisionRuntimeParams.reset();\r\n\r\n const transformQuat = PlayerTransformManager._updateValidHeadToRealHeadSV.transformQuat;\r\n this.getTransformHeadQuat(transformQuat); // Get eyes transform\r\n newPositionHead.vec3_copy(positionReal);\r\n\r\n let isHeadFar = false;\r\n if (this._myParams.myMaxDistanceFromHeadRealToSyncEnabled) {\r\n isHeadFar = movementToCheck.vec3_length() > this._myParams.myMaxDistanceFromHeadRealToSync;\r\n if (isHeadFar) {\r\n const horizontalMovementToCheck = PlayerTransformManager._updateValidHeadToRealHeadSV.horizontalMovementToCheck;\r\n const verticalMovementToCheck = PlayerTransformManager._updateValidHeadToRealHeadSV.verticalMovementToCheck;\r\n const bodyRotationQuat = PlayerTransformManager._updateValidHeadToRealHeadSV.bodyRotationQuat;\r\n const bodyUp = PlayerTransformManager._updateValidHeadToRealHeadSV.bodyUp;\r\n\r\n this.getRotationQuat(bodyRotationQuat);\r\n bodyRotationQuat.quat_getUp(bodyUp);\r\n movementToCheck.vec3_componentAlongAxis(bodyUp, verticalMovementToCheck);\r\n movementToCheck.vec3_sub(verticalMovementToCheck, horizontalMovementToCheck);\r\n\r\n isHeadFar = horizontalMovementToCheck.vec3_length() > this._myParams.myMaxDistanceFromHeadRealToSync;\r\n if (!isHeadFar) {\r\n const bodyPosition = PlayerTransformManager._updateValidHeadToRealHeadSV.bodyPosition;\r\n this.getPosition(bodyPosition);\r\n\r\n const bodyUpValue = bodyPosition.vec3_valueAlongAxis(bodyUp);\r\n const headUpValue = position.vec3_valueAlongAxis(bodyUp);\r\n const headRealUpValue = positionReal.vec3_valueAlongAxis(bodyUp);\r\n\r\n const isHeadBetweenBodyAndHeadReal = headRealUpValue >= headUpValue && headRealUpValue >= bodyUpValue && headUpValue >= (bodyUpValue - 0.0001);\r\n\r\n if (!isHeadBetweenBodyAndHeadReal) {\r\n // It's not a movement to get from feet to head, because the valid head is not between the feet and the real head\r\n isHeadFar = true;\r\n } else {\r\n const heightToCheck = this.getPlayerHeadManager().getHeightEyes() + this._myHeadCollisionCheckParams.myRadius;\r\n const isHeadRealBelowHeight = (headRealUpValue - bodyUpValue) <= heightToCheck;\r\n\r\n if (!isHeadRealBelowHeight) {\r\n // It's not a movement to get from feet to head, because the real head is actually higher\r\n isHeadFar = true;\r\n } else {\r\n isHeadFar = false;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (!isHeadFar && this._myParams.mySyncEnabledFlagMap.get(PlayerTransformManagerSyncFlag.HEAD_COLLIDING)) {\r\n CollisionCheckBridge.getCollisionCheck(this._myParams.myEngine as any).move(movementToCheck, transformQuat, this._myHeadCollisionCheckParams, collisionRuntimeParams);\r\n\r\n if (!collisionRuntimeParams.myHorizontalMovementCanceled && !collisionRuntimeParams.myVerticalMovementCanceled) {\r\n if (!backupVerticalMovementReduceEnabled && collisionRuntimeParams.myHasReducedVerticalMovement) {\r\n this._myIsHeadColliding = true;\r\n headReducedVerticalMovementFeetAdjustment = true;\r\n } else {\r\n this._myIsHeadColliding = false;\r\n }\r\n\r\n newPositionHead.vec3_copy(collisionRuntimeParams.myNewPosition);\r\n } else {\r\n this._myIsHeadColliding = true;\r\n }\r\n } else if (isHeadFar) {\r\n this._myIsHeadColliding = true;\r\n }\r\n\r\n firstHeadCollidingCheckDone = true;\r\n } while (this._myIsHeadColliding && isHeadSynced && this._myResetHeadToFeetOnNextUpdateValidToReal);\r\n\r\n {\r\n this._myHeadCollisionCheckParams.myHorizontalBlockLayerFlags.copy(backupHorizontalBlockLayerFlags);\r\n this._myHeadCollisionCheckParams.myVerticalBlockLayerFlags.copy(backupVerticalBlockLayerFlags);\r\n this._myHeadCollisionCheckParams.myVerticalMovementReduceEnabled = backupVerticalMovementReduceEnabled;\r\n\r\n this._myHeadCollisionCheckParams.myGroundAngleToIgnore = backupGroundAngleToIgnore;\r\n this._myHeadCollisionCheckParams.myGroundAngleToIgnoreWithPerceivedAngle = backupGroundAngleToIgnoreWithPerceivedAngle;\r\n this._myHeadCollisionCheckParams.myHorizontalMovementGroundAngleIgnoreHeight = backupHorizontalMovementGroundAngleIgnoreHeight;\r\n this._myHeadCollisionCheckParams.myHorizontalPositionGroundAngleIgnoreHeight = backupHorizontalPositionGroundAngleIgnoreHeight;\r\n this._myHeadCollisionCheckParams.myHorizontalMovementGroundAngleIgnoreMaxMovementLeft = backupHorizontalMovementGroundAngleIgnoreMaxMovementLeft;\r\n }\r\n\r\n if (isHeadSynced) {\r\n this._myResetHeadToFeetOnNextUpdateValidToReal = false;\r\n this._myResetHeadToFeetDirty = false;\r\n }\r\n\r\n if (this._myParams.myAlwaysSyncHeadPositionWithReal) {\r\n newPositionHead.vec3_copy(positionReal);\r\n }\r\n\r\n const backupIsHeadColliding = this._myIsHeadColliding;\r\n if (headReducedVerticalMovementFeetAdjustment) {\r\n // This is to allow the sync of the head if this is the only think preventing it\r\n this._myIsHeadColliding = false;\r\n }\r\n\r\n if (isHeadSynced) {\r\n if (this.isSynced(this._myParams.mySyncPositionHeadFlagMap) || this._myParams.myAlwaysSyncHeadPositionWithReal\r\n || (this.isSynced(this._myParams.mySyncPositionFlagMap) && this._myParams.myAlwaysSyncPositionWithReal)) {\r\n this._myValidPositionHead.vec3_copy(newPositionHead);\r\n this._myValidPositionHeadBackupForResetToFeet.vec3_copy(this._myValidPositionHead);\r\n }\r\n }\r\n\r\n if (headReducedVerticalMovementFeetAdjustment) {\r\n // Restoring it to colliding after\r\n this._myIsHeadColliding = backupIsHeadColliding;\r\n }\r\n }\r\n\r\n private _debugUpdate(dt: number): void {\r\n Globals.getDebugVisualManager(this._myParams.myEngine)!.drawPoint(0, this._myValidPosition, vec4_create(1, 0, 0, 1), 0.05);\r\n Globals.getDebugVisualManager(this._myParams.myEngine)!.drawLineEnd(0, this._myValidPosition, this.getPositionReal(), vec4_create(1, 0, 0, 1), 0.05);\r\n Globals.getDebugVisualManager(this._myParams.myEngine)!.drawLine(0, this._myValidPosition, this._myValidRotationQuat.quat_getForward(), 0.15, vec4_create(0, 1, 0, 1), 0.025);\r\n\r\n Globals.getDebugVisualManager(this._myParams.myEngine)!.drawPoint(0, this._myValidPositionHead, vec4_create(1, 1, 0, 1), 0.05);\r\n }\r\n\r\n public destroy(): void {\r\n this._myDestroyed = true;\r\n\r\n this.setActive(false);\r\n }\r\n\r\n public isDestroyed(): boolean {\r\n return this._myDestroyed;\r\n }\r\n}", "import { XRUtils } from \"../../../../../cauldron/utils/xr_utils.js\";\r\nimport { Handedness } from \"../../../../../input/cauldron/input_types.js\";\r\nimport { GamepadAxesID } from \"../../../../../input/gamepad/gamepad_buttons.js\";\r\nimport { quat_create, vec3_create } from \"../../../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Globals } from \"../../../../../pp/globals.js\";\r\n\r\nexport class PlayerLocomotionRotateParams {\r\n\r\n constructor(engine = Globals.getMainEngine()) {\r\n this.myPlayerTransformManager = null;\r\n\r\n this.myHorizontalRotationEnabled = true;\r\n this.myVerticalRotationEnabled = true;\r\n\r\n this.myMaxRotationSpeed = 0;\r\n this.myIsSnapTurn = false;\r\n this.mySnapTurnOnlyVR = false;\r\n this.mySnapTurnAngle = 0;\r\n\r\n this.mySmoothSnapEnabled = false;\r\n this.mySmoothSnapSpeedDegrees = 0;\r\n\r\n this.myRotationMinStickIntensityThreshold = 0;\r\n this.mySnapTurnActivateThreshold = 0;\r\n this.mySnapTurnResetThreshold = 0;\r\n\r\n this.myClampVerticalAngle = true;\r\n this.myMaxVerticalAngle = 89;\r\n\r\n this.myHandedness = Handedness.RIGHT;\r\n\r\n this.myEngine = engine;\r\n }\r\n}\r\n\r\nexport class PlayerLocomotionRotate {\r\n\r\n constructor(params) {\r\n this._myParams = params;\r\n\r\n this._mySnapCharge = false;\r\n\r\n this._mySmoothSnapHorizontalRunning = false;\r\n this._mySmoothSnapHorizontalAngleToPerform = 0;\r\n\r\n this._mySmoothSnapVerticalRunning = false;\r\n this._mySmoothSnapVerticalAngleToPerform = 0;\r\n\r\n //Globals.getEasyTuneVariables(this._myParams.myEngine).add(new EasyTuneNumber(\"Teleport Smooth Speed\", this._myParams.mySmoothSnapSpeedDegrees, 10, 3, 0, undefined, undefined, this._myParams.myEngine));\r\n }\r\n\r\n start() {\r\n\r\n }\r\n\r\n stop() {\r\n this._mySmoothSnapHorizontalRunning = false;\r\n this._mySmoothSnapHorizontalAngleToPerform = 0;\r\n\r\n this._mySmoothSnapVerticalRunning = false;\r\n this._mySmoothSnapVerticalAngleToPerform = 0;\r\n }\r\n\r\n getParams() {\r\n return this._myParams;\r\n }\r\n\r\n update(dt) {\r\n //this._myParams.mySmoothSnapSpeedDegrees = Globals.getEasyTuneVariables(this._myParams.myEngine).get(\"Teleport Smooth Speed\");\r\n\r\n if (this._myParams.myHorizontalRotationEnabled) {\r\n this._rotateHeadHorizontally(dt);\r\n }\r\n\r\n if (this._myParams.myVerticalRotationEnabled && this._myParams.myPlayerTransformManager.getPlayerHeadManager().canRotateHead()) {\r\n this._rotateHeadVertically(dt);\r\n }\r\n }\r\n\r\n _rotateHeadHorizontally(dt) {\r\n // Implemented outside class definition\r\n }\r\n\r\n _rotateHeadVertically(dt) {\r\n // Implemented outside class definition\r\n }\r\n}\r\n\r\n\r\n\r\n// IMPLEMENTATION\r\n\r\nPlayerLocomotionRotate.prototype._rotateHeadHorizontally = function () {\r\n let playerRotationQuat = quat_create();\r\n let playerUp = vec3_create();\r\n let headRotation = quat_create();\r\n return function _rotateHeadHorizontally(dt) {\r\n playerUp = this._myParams.myPlayerTransformManager.getRotationQuat(playerRotationQuat).quat_getUp(playerUp);\r\n\r\n headRotation.quat_identity();\r\n\r\n let axes = Globals.getGamepads(this._myParams.myEngine)[this._myParams.myHandedness].getAxesInfo(GamepadAxesID.THUMBSTICK).getAxes();\r\n\r\n if (!this._myParams.myIsSnapTurn || (this._myParams.mySnapTurnOnlyVR && !XRUtils.isSessionActive(this._myParams.myEngine))) {\r\n if (Math.abs(axes[0]) > this._myParams.myRotationMinStickIntensityThreshold) {\r\n let rotationIntensity = -axes[0];\r\n let speed = Math.pp_lerp(0, this._myParams.myMaxRotationSpeed, Math.abs(rotationIntensity)) * Math.pp_sign(rotationIntensity);\r\n\r\n headRotation.quat_fromAxis(speed * dt, playerUp);\r\n }\r\n } else {\r\n if (!this._mySnapCharge) {\r\n if (Math.abs(axes.vec2_length()) < this._myParams.mySnapTurnResetThreshold) {\r\n this._mySnapCharge = true;\r\n }\r\n } else if (!this._mySmoothSnapHorizontalRunning) {\r\n if (Math.abs(axes[0]) > this._myParams.mySnapTurnActivateThreshold) {\r\n let angleToRotate = -Math.pp_sign(axes[0]) * this._myParams.mySnapTurnAngle;\r\n\r\n if (!this._myParams.mySmoothSnapEnabled) {\r\n headRotation.quat_fromAxis(angleToRotate, playerUp);\r\n } else {\r\n this._mySmoothSnapHorizontalRunning = true;\r\n this._mySmoothSnapHorizontalAngleToPerform = angleToRotate;\r\n }\r\n\r\n this._mySnapCharge = false;\r\n }\r\n }\r\n }\r\n\r\n if (this._mySmoothSnapHorizontalRunning) {\r\n let angleToRotate = Math.pp_sign(this._mySmoothSnapHorizontalAngleToPerform) * (this._myParams.mySmoothSnapSpeedDegrees * dt);\r\n if (Math.abs(angleToRotate) > Math.abs(this._mySmoothSnapHorizontalAngleToPerform) - Math.PP_EPSILON) {\r\n angleToRotate = this._mySmoothSnapHorizontalAngleToPerform;\r\n }\r\n\r\n headRotation.quat_fromAxis(angleToRotate, playerUp);\r\n this._mySmoothSnapHorizontalAngleToPerform -= angleToRotate;\r\n\r\n if (Math.abs(this._mySmoothSnapHorizontalAngleToPerform) < Math.PP_EPSILON) {\r\n this._mySmoothSnapHorizontalRunning = false;\r\n this._mySmoothSnapHorizontalAngleToPerform = 0;\r\n }\r\n }\r\n\r\n if (headRotation.quat_getAngle() > Math.PP_EPSILON_DEGREES) {\r\n this._myParams.myPlayerTransformManager.rotateQuat(headRotation);\r\n }\r\n };\r\n}();\r\n\r\nPlayerLocomotionRotate.prototype._rotateHeadVertically = function () {\r\n let headForward = vec3_create();\r\n let headUp = vec3_create();\r\n\r\n let playerRotationQuat = quat_create();\r\n let referenceUp = vec3_create();\r\n let referenceUpNegate = vec3_create();\r\n let referenceRight = vec3_create();\r\n let newUp = vec3_create();\r\n let headRotation = quat_create();\r\n return function _rotateHeadVertically(dt) {\r\n let head = this._myParams.myPlayerTransformManager.getPlayerHeadManager().getHead();\r\n\r\n headForward = head.pp_getForward(headForward);\r\n headUp = head.pp_getUp(headUp);\r\n\r\n referenceUp = this._myParams.myPlayerTransformManager.getRotationRealQuat(playerRotationQuat).quat_getUp(referenceUp);\r\n referenceUpNegate = referenceUp.vec3_negate(referenceUpNegate);\r\n referenceRight = headForward.vec3_cross(referenceUp, referenceRight);\r\n\r\n let minAngle = 1;\r\n if (headForward.vec3_angle(referenceUp) < minAngle) {\r\n referenceRight = headUp.vec3_negate(referenceRight).vec3_cross(referenceUp, referenceRight);\r\n } else if (headForward.vec3_angle(referenceUpNegate) < minAngle) {\r\n referenceRight = headUp.vec3_cross(referenceUp, referenceRight);\r\n } else if (!headUp.vec3_isConcordant(referenceUp)) {\r\n referenceRight.vec3_negate(referenceRight);\r\n }\r\n\r\n referenceRight.vec3_normalize(referenceRight);\r\n\r\n let axes = Globals.getGamepads(this._myParams.myEngine)[this._myParams.myHandedness].getAxesInfo(GamepadAxesID.THUMBSTICK).getAxes();\r\n let angleToRotate = 0;\r\n\r\n if (!this._myParams.myIsSnapTurn || (this._myParams.mySnapTurnOnlyVR && !XRUtils.isSessionActive(this._myParams.myEngine))) {\r\n if (Math.abs(axes[1]) > this._myParams.myRotationMinStickIntensityThreshold) {\r\n let rotationIntensity = axes[1];\r\n angleToRotate = Math.pp_lerp(0, this._myParams.myMaxRotationSpeed, Math.abs(rotationIntensity)) * Math.pp_sign(rotationIntensity) * dt;\r\n }\r\n } else {\r\n if (!this._mySnapCharge) {\r\n if (Math.abs(axes.vec2_length()) < this._myParams.mySnapTurnResetThreshold) {\r\n this._mySnapCharge = true;\r\n }\r\n } else if (!this._mySmoothSnapVerticalRunning) {\r\n if (Math.abs(axes[1]) > this._myParams.mySnapTurnActivateThreshold) {\r\n angleToRotate = Math.pp_sign(axes[1]) * this._myParams.mySnapTurnAngle;\r\n\r\n // Adjust rotation to closest snap step\r\n\r\n let angleWithUp = Math.pp_angleClamp(headUp.vec3_angleSigned(referenceUp, referenceRight));\r\n let snapStep = Math.round(angleWithUp / this._myParams.mySnapTurnAngle);\r\n\r\n let snapAngle = Math.pp_angleClamp(snapStep * this._myParams.mySnapTurnAngle);\r\n let angleToAlign = -Math.pp_angleDistanceSigned(angleWithUp, snapAngle);\r\n\r\n if (Math.abs(angleToAlign) > 1) {\r\n if (Math.pp_sign(angleToRotate) == Math.pp_sign(angleToAlign)) {\r\n angleToRotate = angleToAlign;\r\n } else {\r\n angleToRotate = (-Math.pp_sign(angleToAlign) * this._myParams.mySnapTurnAngle) + angleToAlign;\r\n }\r\n } else if (Math.abs(angleToAlign) > Math.PP_EPSILON_DEGREES) {\r\n angleToRotate += angleToAlign;\r\n }\r\n\r\n if (this._myParams.mySmoothSnapEnabled) {\r\n this._mySmoothSnapVerticalRunning = true;\r\n this._mySmoothSnapVerticalAngleToPerform = angleToRotate;\r\n }\r\n\r\n this._mySnapCharge = false;\r\n }\r\n }\r\n }\r\n\r\n if (this._mySmoothSnapVerticalRunning) {\r\n angleToRotate = Math.pp_sign(this._mySmoothSnapVerticalAngleToPerform) * (this._myParams.mySmoothSnapSpeedDegrees * dt);\r\n if (Math.abs(angleToRotate) > Math.abs(this._mySmoothSnapVerticalAngleToPerform) - Math.PP_EPSILON) {\r\n angleToRotate = this._mySmoothSnapVerticalAngleToPerform;\r\n }\r\n\r\n this._mySmoothSnapVerticalAngleToPerform -= angleToRotate;\r\n\r\n if (Math.abs(this._mySmoothSnapVerticalAngleToPerform) < Math.PP_EPSILON) {\r\n this._mySmoothSnapVerticalRunning = false;\r\n this._mySmoothSnapVerticalAngleToPerform = 0;\r\n }\r\n }\r\n\r\n if (angleToRotate != 0) {\r\n headRotation.quat_fromAxis(angleToRotate, referenceRight);\r\n this._myParams.myPlayerTransformManager.getPlayerHeadManager().rotateHeadQuat(headRotation);\r\n\r\n if (this._myParams.myClampVerticalAngle) {\r\n let maxVerticalAngle = Math.max(0, this._myParams.myMaxVerticalAngle - 0.0001);\r\n newUp = head.pp_getUp(newUp);\r\n let angleWithUp = Math.pp_angleClamp(newUp.vec3_angleSigned(referenceUp, referenceRight));\r\n if (Math.abs(angleWithUp) > maxVerticalAngle) {\r\n let fixAngle = (Math.abs(angleWithUp) - maxVerticalAngle) * Math.pp_sign(angleWithUp);\r\n headRotation.quat_fromAxis(fixAngle, referenceRight);\r\n this._myParams.myPlayerTransformManager.getPlayerHeadManager().rotateHeadQuat(headRotation);\r\n }\r\n }\r\n }\r\n };\r\n}();", "export class PlayerLocomotionMovementRuntimeParams {\r\n\r\n constructor() {\r\n this.myIsFlying = false;\r\n this.myGravitySpeed = 0;\r\n\r\n this.myIsTeleportDetecting = false;\r\n this.myIsTeleporting = false;\r\n this.myTeleportJustPerformed = false;\r\n }\r\n}\r\n\r\nexport class PlayerLocomotionMovement {\r\n\r\n constructor(locomotionRuntimeParams) {\r\n this._myLocomotionRuntimeParams = locomotionRuntimeParams;\r\n\r\n this._myActive = false;\r\n }\r\n\r\n getRuntimeParams() {\r\n return this._myLocomotionRuntimeParams;\r\n }\r\n\r\n start() {\r\n\r\n }\r\n\r\n stop() {\r\n\r\n }\r\n\r\n setActive(active) {\r\n this._myActive = active;\r\n }\r\n\r\n isActive() {\r\n return this._myActive;\r\n }\r\n\r\n canStop() {\r\n return true;\r\n }\r\n}", "import { Emitter, Material, Object3D, PhysXComponent, WonderlandEngine } from \"@wonderlandengine/api\";\r\nimport { FSM } from \"../../../../../cauldron/fsm/fsm.js\";\r\nimport { PhysicsLayerFlags } from \"../../../../../cauldron/physics/physics_layer_flags.js\";\r\nimport { EasingFunction, MathUtils } from \"../../../../../cauldron/utils/math_utils.js\";\r\nimport { XRUtils } from \"../../../../../cauldron/utils/xr_utils.js\";\r\nimport { Handedness } from \"../../../../../input/cauldron/input_types.js\";\r\nimport { InputUtils } from \"../../../../../input/cauldron/input_utils.js\";\r\nimport { GamepadUtils } from \"../../../../../input/gamepad/cauldron/gamepad_utils.js\";\r\nimport { Gamepad } from \"../../../../../input/gamepad/gamepad.js\";\r\nimport { GamepadButtonID } from \"../../../../../input/gamepad/gamepad_buttons.js\";\r\nimport { vec3_create } from \"../../../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Globals } from \"../../../../../pp/globals.js\";\r\nimport { CharacterColliderSetupSimplifiedCreationAccuracyLevel, CharacterColliderSetupSimplifiedCreationParams, CharacterColliderSetupUtils } from \"../../../character_controller/collision/character_collider_setup_utils.js\";\r\nimport { CollisionCheckBridge } from \"../../../character_controller/collision/collision_check_bridge.js\";\r\nimport { CollisionCheckParams } from \"../../../character_controller/collision/legacy/collision_check/collision_params.js\";\r\nimport { NonVRReferenceSpaceMode, PlayerHeadManager, PlayerHeadManagerParams } from \"./player_head_manager.js\";\r\nimport { PlayerLocomotionMovementRuntimeParams } from \"./player_locomotion_movement.js\";\r\nimport { PlayerLocomotionRotate, PlayerLocomotionRotateParams } from \"./player_locomotion_rotate.js\";\r\nimport { PlayerLocomotionSmooth, PlayerLocomotionSmoothParams } from \"./player_locomotion_smooth.js\";\r\nimport { PlayerObscureManager, PlayerObscureManagerParams } from \"./player_obscure_manager.js\";\r\nimport { PlayerTransformManager, PlayerTransformManagerParams, PlayerTransformManagerSyncFlag } from \"./player_transform_manager.js\";\r\nimport { PlayerLocomotionTeleport, PlayerLocomotionTeleportParams } from \"./teleport/player_locomotion_teleport.js\";\r\nimport { PlayerLocomotionTeleportTeleportType } from \"./teleport/player_locomotion_teleport_teleport_state.js\";\r\n\r\nexport enum PlayerLocomotionDirectionReferenceType {\r\n HEAD = 0,\r\n HAND = 1,\r\n CUSTOM_OBJECT = 2\r\n}\r\n\r\nexport enum PlayerLocomotionType {\r\n SMOOTH = 0,\r\n TELEPORT = 1\r\n}\r\n\r\nexport class PlayerLocomotionParams {\r\n\r\n public myDefaultLocomotionType: number = PlayerLocomotionType.SMOOTH;\r\n public myAlwaysSmoothForNonVR: boolean = false;\r\n\r\n /** Double press main hand thumbstick (default: left) to switch */\r\n public mySwitchLocomotionTypeShortcutEnabled: boolean = false;\r\n\r\n public myStartIdle: boolean = false;\r\n\r\n\r\n public myPhysicsBlockLayerFlags: Readonly = new PhysicsLayerFlags();\r\n\r\n\r\n public myDefaultHeight: number = 0;\r\n public myMinHeight: number = 0;\r\n public myCharacterRadius: number = 0;\r\n\r\n /** Set this to `null` to auto compute the feet radius based on {@link myCharacterRadius} */\r\n public myCharacterFeetRadius: number | null = null;\r\n\r\n public myForeheadExtraHeight: number = 0;\r\n\r\n\r\n public myMaxSpeed: number = 0;\r\n public myMaxRotationSpeed: number = 0;\r\n public mySpeedSlowDownPercentageOnWallSlid: number = 0;\r\n\r\n\r\n public myGravityAcceleration: number = 0;\r\n public myMaxGravitySpeed: number = 0;\r\n\r\n\r\n public myIsSnapTurn: boolean = false;\r\n public mySnapTurnOnlyVR: boolean = false;\r\n public mySnapTurnAngle: number = 0;\r\n public mySnapTurnSpeedDegrees: number = 0;\r\n\r\n\r\n public myFlyEnabled: boolean = false;\r\n public myStartFlying: boolean = false;\r\n public myFlyWithButtonsEnabled: boolean = false;\r\n public myFlyWithViewAngleEnabled: boolean = false;\r\n public myMinAngleToFlyUpNonVR: number = 0;\r\n public myMinAngleToFlyDownNonVR: number = 0;\r\n public myMinAngleToFlyUpVR: number = 0;\r\n public myMinAngleToFlyDownVR: number = 0;\r\n public myMinAngleToFlyRight: number = 0;\r\n\r\n\r\n public myMainHand: Handedness = Handedness.LEFT;\r\n public myDirectionInvertForwardWhenUpsideDown: boolean = false;\r\n public myVRDirectionReferenceType: PlayerLocomotionDirectionReferenceType = PlayerLocomotionDirectionReferenceType.HEAD;\r\n public myVRDirectionReferenceObject: Readonly | null = null;\r\n\r\n\r\n public myTeleportType: number = PlayerLocomotionTeleportTeleportType.INSTANT;\r\n public myTeleportMaxDistance: number = 0;\r\n public myTeleportMaxHeightDifference: number = 0;\r\n public myTeleportFloorLayerFlags: Readonly = new PhysicsLayerFlags();\r\n public myTeleportRotationOnUpEnabled: boolean = false;\r\n public myTeleportValidMaterial: Readonly | null = null;\r\n public myTeleportInvalidMaterial: Readonly | null = null;\r\n public myTeleportPositionObject: Readonly | null = null;\r\n public myTeleportPositionObjectRotateWithHead: boolean = false;\r\n public myTeleportParableStartReferenceObject: Readonly | null = null;\r\n\r\n\r\n public myResetRealOnStart: boolean = false;\r\n\r\n /**\r\n * #WARN With `_myResetRealOnStartFramesAmount` at `1` it can happen that you enter the session like 1 frame before the game load\r\n * and the head pose might have not been properly initialized yet in the WebXR API, so the reset real will not happen has expected \r\n * Since this is a sort of edge case (either u enter after the load, or you were already in for more than 2-3 frames), and that\r\n * setting this to more than `1` can cause a visible (even if very short) stutter after the load (due to resetting the head multiple times),\r\n * it's better to keep this value at `1` \r\n * A possible effect of the edge case is the view being obscured on start because it thinks you are colliding\r\n * \r\n * A value of `3` will make u sure that the head pose will be initialized and the reset real will happen as expected in any case \r\n * For example, if u have a total fade at start and nothing can be seen aside the clear color for at least, let's say, 10 frames, \r\n * you can set this to `3` safely, since there will be no visible stutter to be seen (beside the clear color)\r\n */\r\n public myResetRealOnStartFramesAmount: number = 0;\r\n\r\n /** Can fix some head through floor issues, when you can move your head completely to the other side of the floor \r\n If the floors are thick enough that this can't happen, you can leave this to false */\r\n public myResetHeadToFeetInsteadOfReal: boolean = false;\r\n\r\n public myResetHeadToRealMinDistance: number = 0;\r\n\r\n public myMaxHeadToRealHeadSteps: number | null = null;\r\n\r\n\r\n /** Valid means, for example, that the real player has not moved inside a wall by moving in the real space */\r\n public mySyncWithRealWorldPositionOnlyIfValid: boolean = false;\r\n\r\n /** Valid means, for example, that the real player has not moved inside a wall by moving in the real space */\r\n public mySyncWithRealHeightOnlyIfValid: boolean = false;\r\n\r\n public mySnapRealPositionToGround: boolean = false;\r\n public myPreventRealFromColliding: boolean = false;\r\n\r\n public myViewOcclusionInsideWallsEnabled: boolean = false;\r\n public myViewOcclusionLayerFlags: Readonly = new PhysicsLayerFlags();\r\n\r\n /**\r\n * To avoid occlusion issues when moving when touching a tilted ceiling (which is not commong anyway), \r\n * this value should be a bit lower than {@link myCharacterFeetRadius}\r\n * \r\n * If you have a high camera near value, you might need to increase this value, even though the view occlusion might become more aggressive\r\n */\r\n public myViewOcclusionHeadRadius: number = 0;\r\n\r\n /**\r\n * Half of this value should be a bit lower than {@link myForeheadExtraHeight} plus {@link myColliderExtraHeight}, otherwise view occlusion might \r\n * trigger simply when moving under a low ceiling\r\n * \r\n * If you have a high camera near value, you might need to increase this value, even though the view occlusion might become more aggressive\r\n */\r\n public myViewOcclusionHeadHeight: number = 0;\r\n\r\n public myViewOcclusionFadeOutSeconds: number = 0;\r\n public myViewOcclusionMaxRealHeadDistance: number = 0;\r\n\r\n public mySyncNonVRHeightWithVROnExitSession: boolean = false;\r\n public mySyncNonVRVerticalAngleWithVROnExitSession: boolean = false;\r\n\r\n\r\n public mySyncHeadWithRealAfterLocomotionUpdateIfNeeded: boolean = false;\r\n\r\n\r\n\r\n public myColliderAccuracy: number = CharacterColliderSetupSimplifiedCreationAccuracyLevel.VERY_LOW;\r\n\r\n /**\r\n * If you enable this, you might also want to disable {@link myColliderCheckCeilings}, \r\n * since it doesn't make much sense to check for ceilings when not checking the height\r\n */\r\n public myColliderCheckOnlyFeet: boolean = false;\r\n\r\n /**\r\n * If you enable this, you might also want to disable {@link myColliderCheckOnlyFeet}, \r\n * since it doesn't make much sense to check for ceilings without also checking the height\r\n */\r\n public myColliderCheckCeilings: boolean = false;\r\n\r\n public myColliderSlideAlongWall: boolean = false;\r\n public myColliderMaxWalkableGroundAngle: number = 0;\r\n\r\n /**\r\n * This is useful if you want the locomotion teleport feature to be able to go downhill\r\n * on surfaces steeper than {@link myColliderMaxWalkableGroundAngle}\r\n * \r\n * By default the locomotion teleport can't go up on surfaces steeper than {@link myColliderMaxWalkableGroundAngle} anyway,\r\n * no matter, the value of {@link myColliderMaxTeleportableGroundAngle}\r\n * \r\n * If you set this to a value bigger than {@link myColliderMaxWalkableGroundAngle} you will be able to teleport in any case on steeper surfaces,\r\n * so be careful if you want that, even though usually it's safe, since teleport positions, aside from the locomotion teleport ones, are predefined and\r\n * safe positions\r\n * \r\n * The idea is that with the locomotion smooth you can always go downhill but might no be able to climb back up due to the surface beeing steep,\r\n * this sort of replicates that for the locomotion, letting you teleport down on steep surfaces but not up\r\n */\r\n public myColliderMaxTeleportableGroundAngle: number | null = null;\r\n public myColliderSnapOnGround: boolean = false;\r\n public myColliderMaxDistanceToSnapOnGround: number = 0;\r\n public myColliderMaxDistanceToPopOutGround: number = 0;\r\n public myColliderMaxWalkableGroundStepHeight: number = 0;\r\n\r\n /**\r\n * Allowing walkable steps on ceiling might create issues with view occlusion for the player (especially with a high value) \r\n * since you can go more under some low ceiling making the occlusion head collide with it\r\n * \r\n * Settings it to zero is safer, but means that the ceilings physx must be more flat, because it's easier that a small ceiling bump now blocks you\r\n * \r\n * If you want this to be higher than 0, you might also want to increase {@link myColliderExtraHeight} by this value to avoid issue with view occlusion\r\n * It will need you to be further from ceiling to be able to move under them tho (since it will be like wearing a hat as tall as {@link myColliderExtraHeight})\r\n */\r\n public myColliderMaxWalkableCeilingStepHeight: number = 0;\r\n public myColliderPreventFallingFromEdges: boolean = false;\r\n public myColliderMaxMovementSteps: number | null = null;\r\n\r\n /**\r\n * Helps staying a little further from the ceiling\r\n * \r\n * If you need to increase {@link myViewOcclusionHeadRadius}, also increasing this can help preventing view occlusion happening when shouldn't\r\n */\r\n public myColliderExtraHeight: number = 0;\r\n\r\n\r\n\r\n /** Main hand (default: left) select + thumbstick press, auto switch to smooth */\r\n public myDebugFlyShortcutEnabled: boolean = false;\r\n\r\n public myDebugFlyMaxSpeedMultiplier: number = 0;\r\n\r\n /** Main hand (default: left) thumbstick pressed while moving */\r\n public myMoveThroughCollisionShortcutEnabled: boolean = false;\r\n\r\n /** Not main hand (default: right) thumbstick pressed while moving */\r\n public myMoveHeadShortcutEnabled: boolean = false;\r\n\r\n /** Main hand (default: left) select pressed while moving */\r\n public myTripleSpeedShortcutEnabled: boolean = false;\r\n\r\n\r\n public myDebugHorizontalEnabled: boolean = false;\r\n public myDebugVerticalEnabled: boolean = false;\r\n\r\n public myCollisionCheckDisabled: boolean = false;\r\n\r\n public myEngine: Readonly;\r\n\r\n\r\n\r\n constructor(engine: Readonly = Globals.getMainEngine()!) {\r\n this.myEngine = engine;\r\n }\r\n}\r\n\r\n\r\n// #TODO Add lerped snap on vertical over like half a second to avoid the \"snap effect\"\r\n// This could be done by detatching the actual vertical position of the player from the collision real one when a snap is detected above a certain threshold\r\n// with a timer, after which the vertical position is just copied, while during the detatching is lerped toward the collision vertical one\r\n\r\n/**\r\n * Tips \r\n * - Be sure that your colliders have faces on both sides of the mesh, this helps the collision check which otherise might be able to move through walls\r\n */\r\nexport class PlayerLocomotion {\r\n\r\n private readonly _myParams: PlayerLocomotionParams;\r\n\r\n private readonly _myPlayerHeadManager: PlayerHeadManager;\r\n private readonly _myPlayerTransformManager: PlayerTransformManager;\r\n private readonly _myPlayerLocomotionRotate: PlayerLocomotionRotate;\r\n private readonly _myPlayerLocomotionSmooth: PlayerLocomotionSmooth;\r\n private readonly _myPlayerLocomotionTeleport: PlayerLocomotionTeleport;\r\n private readonly _myPlayerObscureManager: PlayerObscureManager;\r\n\r\n private readonly _myLocomotionMovementFSM: FSM = new FSM();\r\n\r\n private _mySwitchToTeleportOnEnterSession: boolean = false;\r\n\r\n private _myActive: boolean = false;\r\n private _myStarted: boolean = false;\r\n private _myIdle: boolean = false;\r\n\r\n private _myResetRealOnStartCounter: number = 0;\r\n\r\n private readonly _myPreUpdateEmitter: Emitter<[number, PlayerLocomotion]> = new Emitter();\r\n private readonly _myPostUpdateEmitter: Emitter<[number, PlayerLocomotion]> = new Emitter();\r\n\r\n private _myDestroyed: boolean = false;\r\n\r\n constructor(params: PlayerLocomotionParams) {\r\n this._myParams = params;\r\n\r\n const collisionCheckParamsMovement = this._setupCollisionCheckParamsMovement();\r\n\r\n const movementRuntimeParams = new PlayerLocomotionMovementRuntimeParams();\r\n movementRuntimeParams.myIsFlying = this._myParams.myStartFlying;\r\n\r\n {\r\n const params = new PlayerHeadManagerParams(this._myParams.myEngine as any);\r\n\r\n params.mySessionChangeResyncEnabled = true;\r\n\r\n params.myBlurEndResyncEnabled = true;\r\n params.myBlurEndResyncRotation = false;\r\n\r\n params.myEnterSessionResyncHeight = false;\r\n params.myExitSessionResyncHeight = this._myParams.mySyncNonVRHeightWithVROnExitSession;\r\n params.myExitSessionResyncVerticalAngle = this._myParams.mySyncNonVRVerticalAngleWithVROnExitSession;\r\n params.myExitSessionRemoveRightTilt = true;\r\n params.myExitSessionAdjustMaxVerticalAngle = true;\r\n params.myExitSessionMaxVerticalAngle = 90;\r\n\r\n params.myNonVRFloorBasedMode = NonVRReferenceSpaceMode.FLOOR_THEN_KEEP_VR;\r\n\r\n params.myDefaultHeightNonVR = this._myParams.myDefaultHeight;\r\n params.myDefaultHeightVRWithoutFloor = this._myParams.myDefaultHeight;\r\n params.myForeheadExtraHeight = this._myParams.myForeheadExtraHeight;\r\n\r\n params.myFeetRotationKeepUp = true;\r\n\r\n params.myDebugEnabled = false;\r\n\r\n this._myPlayerHeadManager = new PlayerHeadManager(params);\r\n }\r\n\r\n {\r\n const params = new PlayerTransformManagerParams(this._myParams.myEngine);\r\n\r\n params.myPlayerHeadManager = this._myPlayerHeadManager;\r\n\r\n params.myMovementCollisionCheckParams = collisionCheckParamsMovement;\r\n params.myTeleportCollisionCheckParams = null;\r\n params.myTeleportCollisionCheckParamsCopyFromMovement = true;\r\n params.myTeleportCollisionCheckParamsCheck360 = true;\r\n params.myTeleportCollisionCheckParamsGroundAngleToIgnore = this._myParams.myColliderMaxTeleportableGroundAngle;\r\n\r\n params.mySyncEnabledFlagMap.set(PlayerTransformManagerSyncFlag.BODY_COLLIDING, true);\r\n params.mySyncEnabledFlagMap.set(PlayerTransformManagerSyncFlag.HEAD_COLLIDING, true);\r\n params.mySyncEnabledFlagMap.set(PlayerTransformManagerSyncFlag.FAR, true);\r\n params.mySyncEnabledFlagMap.set(PlayerTransformManagerSyncFlag.FLOATING, true);\r\n params.mySyncEnabledFlagMap.set(PlayerTransformManagerSyncFlag.HEIGHT_COLLIDING, true);\r\n\r\n params.mySyncPositionFlagMap.set(PlayerTransformManagerSyncFlag.BODY_COLLIDING, true);\r\n params.mySyncPositionFlagMap.set(PlayerTransformManagerSyncFlag.HEAD_COLLIDING, false);\r\n params.mySyncPositionFlagMap.set(PlayerTransformManagerSyncFlag.FAR, true);\r\n params.mySyncPositionFlagMap.set(PlayerTransformManagerSyncFlag.FLOATING, true);\r\n params.mySyncPositionFlagMap.set(PlayerTransformManagerSyncFlag.HEIGHT_COLLIDING, false);\r\n\r\n params.mySyncPositionHeadFlagMap.set(PlayerTransformManagerSyncFlag.BODY_COLLIDING, false);\r\n params.mySyncPositionHeadFlagMap.set(PlayerTransformManagerSyncFlag.HEAD_COLLIDING, true);\r\n params.mySyncPositionHeadFlagMap.set(PlayerTransformManagerSyncFlag.FAR, false);\r\n params.mySyncPositionHeadFlagMap.set(PlayerTransformManagerSyncFlag.FLOATING, false);\r\n params.mySyncPositionHeadFlagMap.set(PlayerTransformManagerSyncFlag.HEIGHT_COLLIDING, false);\r\n\r\n params.mySyncRotationFlagMap.set(PlayerTransformManagerSyncFlag.BODY_COLLIDING, false);\r\n params.mySyncRotationFlagMap.set(PlayerTransformManagerSyncFlag.HEAD_COLLIDING, false);\r\n params.mySyncRotationFlagMap.set(PlayerTransformManagerSyncFlag.FAR, false);\r\n params.mySyncRotationFlagMap.set(PlayerTransformManagerSyncFlag.FLOATING, false);\r\n params.mySyncRotationFlagMap.set(PlayerTransformManagerSyncFlag.HEIGHT_COLLIDING, false);\r\n\r\n params.mySyncHeightFlagMap.set(PlayerTransformManagerSyncFlag.BODY_COLLIDING, false);\r\n params.mySyncHeightFlagMap.set(PlayerTransformManagerSyncFlag.HEAD_COLLIDING, false);\r\n params.mySyncHeightFlagMap.set(PlayerTransformManagerSyncFlag.FAR, false);\r\n params.mySyncHeightFlagMap.set(PlayerTransformManagerSyncFlag.FLOATING, false);\r\n params.mySyncHeightFlagMap.set(PlayerTransformManagerSyncFlag.HEIGHT_COLLIDING, true);\r\n\r\n params.myHeadCollisionBlockLayerFlags.copy(this._myParams.myViewOcclusionLayerFlags);\r\n params.myHeadCollisionObjectsToIgnore.pp_copy(params.myMovementCollisionCheckParams.myHorizontalObjectsToIgnore as any);\r\n const objectsEqualCallback = (first: Readonly, second: Readonly): boolean => first == second;\r\n for (const objectToIgnore of params.myMovementCollisionCheckParams.myVerticalObjectsToIgnore) {\r\n params.myHeadCollisionObjectsToIgnore.pp_pushUnique(objectToIgnore, objectsEqualCallback);\r\n }\r\n\r\n // To avoid obscure issues when moving when touching a tilted ceiling (which is not commong anyway)\r\n // This would be better to be less or equal than the feet radius of the character\r\n params.myHeadRadius = this._myParams.myViewOcclusionHeadRadius;\r\n params.myHeadHeight = this._myParams.myViewOcclusionHeadHeight;\r\n params.myExtraHeight = this._myParams.myColliderExtraHeight;\r\n\r\n if (!this._myParams.mySyncWithRealWorldPositionOnlyIfValid) {\r\n params.mySyncEnabledFlagMap.set(PlayerTransformManagerSyncFlag.BODY_COLLIDING, false);\r\n params.mySyncEnabledFlagMap.set(PlayerTransformManagerSyncFlag.FAR, false);\r\n params.mySyncEnabledFlagMap.set(PlayerTransformManagerSyncFlag.FLOATING, false);\r\n\r\n params.myAlwaysSyncPositionWithReal = true;\r\n }\r\n\r\n if (!this._myParams.mySyncWithRealHeightOnlyIfValid) {\r\n params.mySyncEnabledFlagMap.set(PlayerTransformManagerSyncFlag.HEIGHT_COLLIDING, false);\r\n }\r\n\r\n if (!this._myParams.myViewOcclusionInsideWallsEnabled) {\r\n params.mySyncEnabledFlagMap.set(PlayerTransformManagerSyncFlag.HEAD_COLLIDING, false);\r\n params.myAlwaysSyncHeadPositionWithReal = true;\r\n } else {\r\n params.myUpdatePositionHeadValid = true;\r\n }\r\n\r\n params.myApplyRealToValidAdjustmentsToRealPositionToo = this._myParams.mySnapRealPositionToGround;\r\n params.myPreventRealFromColliding = this._myParams.myPreventRealFromColliding;\r\n\r\n params.myMaxDistanceFromRealToSyncEnabled = true;\r\n params.myMaxDistanceFromRealToSync = 0.5;\r\n params.myMaxDistanceFromHeadRealToSyncEnabled = true;\r\n params.myMaxDistanceFromHeadRealToSync = 0.75;\r\n if (params.myMovementCollisionCheckParams.mySplitMovementEnabled &&\r\n params.myMovementCollisionCheckParams.mySplitMovementMaxStepsEnabled &&\r\n params.myMovementCollisionCheckParams.mySplitMovementMaxLengthEnabled) {\r\n // A bit more of the max movement you can perform, so that the head always have space to move back to the real one\r\n params.myMaxDistanceFromHeadRealToSync = Math.max(params.myMaxDistanceFromHeadRealToSync, 1.1 * (params.myMovementCollisionCheckParams.mySplitMovementMaxSteps * params.myMovementCollisionCheckParams.mySplitMovementMaxLength));\r\n }\r\n\r\n params.myIsFloatingValidIfVerticalMovement = false;\r\n params.myIsFloatingValidIfVerticalMovementAndRealOnGround = false;\r\n params.myIsFloatingValidIfSteepGround = false;\r\n params.myIsFloatingValidIfVerticalMovementAndSteepGround = false;\r\n params.myIsFloatingValidIfRealOnGround = false;\r\n params.myFloatingSplitCheckEnabled = true;\r\n params.myFloatingSplitCheckMinLength = collisionCheckParamsMovement.myFeetRadius * 1.5;\r\n params.myFloatingSplitCheckMaxLength = params.myFloatingSplitCheckMinLength;\r\n\r\n params.myRealMovementAllowVerticalAdjustments = true;\r\n params.myIgnoreUpwardMovementToRealIfValidOnGround = true;\r\n\r\n params.myUpdateRealPositionValid = false;\r\n params.myUpdatePositionValid = false;\r\n\r\n params.myMinHeight = this._myParams.myMinHeight;\r\n\r\n params.myIsBodyCollidingWhenHeightBelowValue = null;\r\n params.myIsBodyCollidingWhenHeightAboveValue = null;\r\n\r\n params.myResetToValidOnEnterSession = true;\r\n params.myResetToValidOnExitSession = true;\r\n params.myResetToValidOnSessionHiddenEnd = true;\r\n\r\n params.myAlwaysResetRealPositionNonVR = true;\r\n params.myAlwaysResetRealRotationNonVR = true;\r\n params.myAlwaysResetRealHeightNonVR = true;\r\n\r\n params.myAlwaysResetRealPositionVR = false;\r\n params.myAlwaysResetRealRotationVR = false;\r\n params.myAlwaysResetRealHeightVR = false;\r\n\r\n params.myNeverResetRealPositionNonVR = false;\r\n params.myNeverResetRealRotationNonVR = true;\r\n params.myNeverResetRealHeightNonVR = false;\r\n\r\n params.myResetRealHeightNonVROnExitSession = this._myParams.mySyncNonVRHeightWithVROnExitSession;\r\n\r\n params.myResetHeadToFeetInsteadOfRealOnlyIfRealNotReachable = this._myParams.myResetHeadToFeetInsteadOfReal;\r\n params.myResetHeadToRealMinDistance = this._myParams.myResetHeadToRealMinDistance;\r\n params.myMaxHeadToRealHeadSteps = this._myParams.myMaxHeadToRealHeadSteps;\r\n\r\n params.myNeverResetRealPositionVR = false;\r\n params.myNeverResetRealRotationVR = false;\r\n params.myNeverResetRealHeightVR = true;\r\n\r\n params.myResetRealResetRotationIfUpChanged = true;\r\n params.myResetHeadToFeetMoveTowardReal = true;\r\n params.myResetHeadToFeetUpOffset = 0.25;\r\n\r\n params.myDebugEnabled = false;\r\n\r\n this._myPlayerTransformManager = new PlayerTransformManager(params);\r\n }\r\n\r\n {\r\n const params = new PlayerLocomotionRotateParams(this._myParams.myEngine as any);\r\n\r\n params.myPlayerTransformManager = this._myPlayerTransformManager;\r\n\r\n params.myMaxRotationSpeed = this._myParams.myMaxRotationSpeed;\r\n params.myIsSnapTurn = this._myParams.myIsSnapTurn;\r\n params.mySnapTurnOnlyVR = this._myParams.mySnapTurnOnlyVR;\r\n params.mySnapTurnAngle = this._myParams.mySnapTurnAngle;\r\n\r\n if (this._myParams.mySnapTurnSpeedDegrees > MathUtils.EPSILON) {\r\n params.mySmoothSnapEnabled = true;\r\n params.mySmoothSnapSpeedDegrees = this._myParams.mySnapTurnSpeedDegrees;\r\n } else {\r\n params.mySmoothSnapEnabled = false;\r\n }\r\n\r\n params.myRotationMinStickIntensityThreshold = 0.1;\r\n params.mySnapTurnActivateThreshold = 0.5;\r\n params.mySnapTurnResetThreshold = 0.4;\r\n\r\n params.myClampVerticalAngle = true;\r\n params.myMaxVerticalAngle = 89;\r\n\r\n params.myHandedness = InputUtils.getOppositeHandedness(this._myParams.myMainHand)!;\r\n\r\n this._myPlayerLocomotionRotate = new PlayerLocomotionRotate(params);\r\n }\r\n\r\n {\r\n {\r\n const params = new PlayerLocomotionSmoothParams(this._myParams.myEngine as any);\r\n\r\n params.myPlayerTransformManager = this._myPlayerTransformManager;\r\n\r\n params.myHandedness = this._myParams.myMainHand;\r\n\r\n params.myMaxSpeed = this._myParams.myMaxSpeed;\r\n params.mySpeedSlowDownPercentageOnWallSlid = this._myParams.mySpeedSlowDownPercentageOnWallSlid;\r\n\r\n params.myMovementMinStickIntensityThreshold = 0.1;\r\n\r\n params.myFlyEnabled = this._myParams.myFlyEnabled;\r\n params.myFlyWithButtonsEnabled = this._myParams.myFlyWithButtonsEnabled;\r\n params.myFlyWithViewAngleEnabled = this._myParams.myFlyWithViewAngleEnabled;\r\n params.myMinAngleToFlyUpNonVR = this._myParams.myMinAngleToFlyUpNonVR;\r\n params.myMinAngleToFlyDownNonVR = this._myParams.myMinAngleToFlyDownNonVR;\r\n params.myMinAngleToFlyUpVR = this._myParams.myMinAngleToFlyUpVR;\r\n params.myMinAngleToFlyDownVR = this._myParams.myMinAngleToFlyDownVR;\r\n params.myMinAngleToFlyRight = this._myParams.myMinAngleToFlyRight;\r\n\r\n params.myGravityAcceleration = this._myParams.myGravityAcceleration;\r\n params.myMaxGravitySpeed = this._myParams.myMaxGravitySpeed;\r\n\r\n params.myDirectionInvertForwardWhenUpsideDown = this._myParams.myDirectionInvertForwardWhenUpsideDown;\r\n params.myVRDirectionReferenceType = this._myParams.myVRDirectionReferenceType;\r\n params.myVRDirectionReferenceObject = this._myParams.myVRDirectionReferenceObject;\r\n\r\n params.myDebugFlyMaxSpeedMultiplier = this._myParams.myDebugFlyMaxSpeedMultiplier;\r\n params.myMoveThroughCollisionShortcutEnabled = this._myParams.myMoveThroughCollisionShortcutEnabled;\r\n params.myMoveHeadShortcutEnabled = this._myParams.myMoveHeadShortcutEnabled;\r\n params.myTripleSpeedShortcutEnabled = this._myParams.myTripleSpeedShortcutEnabled;\r\n\r\n this._myPlayerLocomotionSmooth = new PlayerLocomotionSmooth(params, movementRuntimeParams);\r\n }\r\n\r\n {\r\n const params = new PlayerLocomotionTeleportParams(this._myParams.myEngine as any);\r\n\r\n params.myPlayerTransformManager = this._myPlayerTransformManager;\r\n\r\n params.myHandedness = this._myParams.myMainHand;\r\n\r\n params.myDetectionParams.myMaxDistance = this._myParams.myTeleportMaxDistance;\r\n params.myDetectionParams.myMaxHeightDifference = this._myParams.myTeleportMaxHeightDifference;\r\n params.myDetectionParams.myGroundAngleToIgnoreUpward = collisionCheckParamsMovement.myGroundAngleToIgnore;\r\n params.myDetectionParams.myRotationOnUpEnabled = this._myParams.myTeleportRotationOnUpEnabled;\r\n params.myDetectionParams.myMustBeOnGround = true;\r\n params.myDetectionParams.myMustBeOnIgnorableGroundAngle = true;\r\n\r\n params.myDetectionParams.myTeleportBlockLayerFlags.copy(this._myParams.myPhysicsBlockLayerFlags);\r\n params.myDetectionParams.myTeleportFloorLayerFlags.copy(this._myParams.myTeleportFloorLayerFlags);\r\n\r\n params.myDetectionParams.myTeleportFeetPositionMustBeVisible = false;\r\n params.myDetectionParams.myTeleportHeadPositionMustBeVisible = false;\r\n params.myDetectionParams.myTeleportHeadOrFeetPositionMustBeVisible = true;\r\n\r\n params.myDetectionParams.myTeleportParableStartReferenceObject = this._myParams.myTeleportParableStartReferenceObject;\r\n\r\n params.myDetectionParams.myVisibilityBlockLayerFlags.copy(params.myDetectionParams.myTeleportBlockLayerFlags);\r\n\r\n params.myDetectionParams.myPlayerTransformManagerMustBeSyncedFlagMap.set(PlayerTransformManagerSyncFlag.HEAD_COLLIDING, false);\r\n\r\n params.myDetectionParams.myPositionRealMaxDistance = 0.4;\r\n params.myDetectionParams.myPositionHeadRealMaxDistance = this._myParams.myViewOcclusionMaxRealHeadDistance / 2;\r\n\r\n params.myDetectionParams.myPositionHeadMustBeValid = true;\r\n\r\n params.myTeleportParams.myTeleportType = this._myParams.myTeleportType;\r\n\r\n params.myVisualizerParams.myTeleportPositionObject = this._myParams.myTeleportPositionObject;\r\n params.myVisualizerParams.myTeleportValidMaterial = this._myParams.myTeleportValidMaterial;\r\n params.myVisualizerParams.myTeleportInvalidMaterial = this._myParams.myTeleportInvalidMaterial;\r\n params.myVisualizerParams.myTeleportPositionObjectRotateWithHead = this._myParams.myTeleportPositionObjectRotateWithHead;\r\n\r\n params.myPerformTeleportAsMovement = false;\r\n params.myTeleportAsMovementRemoveVerticalMovement = true;\r\n params.myTeleportAsMovementExtraVerticalMovementPerMeter = -2;\r\n\r\n params.myGravityAcceleration = this._myParams.myGravityAcceleration;\r\n params.myMaxGravitySpeed = this._myParams.myMaxGravitySpeed;\r\n\r\n params.myDebugEnabled = false;\r\n params.myDebugDetectEnabled = true;\r\n params.myDebugShowEnabled = true;\r\n params.myDebugVisibilityEnabled = false;\r\n\r\n this._myPlayerLocomotionTeleport = new PlayerLocomotionTeleport(params, movementRuntimeParams);\r\n }\r\n\r\n this._myPlayerTransformManager.setPlayerLocomotionTeleport(this._myPlayerLocomotionTeleport);\r\n\r\n {\r\n const params = new PlayerObscureManagerParams(this._myParams.myEngine as any);\r\n\r\n params.myPlayerTransformManager = this._myPlayerTransformManager;\r\n params.myPlayerLocomotionTeleport = this._myPlayerLocomotionTeleport;\r\n\r\n params.myEnabled = this._myParams.myViewOcclusionInsideWallsEnabled;\r\n\r\n params.myObscureObject = null;\r\n params.myObscureMaterial = null;\r\n params.myObscureRadius = 0.5;\r\n\r\n params.myObscureFadeOutSeconds = this._myParams.myViewOcclusionFadeOutSeconds;\r\n params.myObscureFadeInSeconds = 0.25;\r\n\r\n params.myObscureFadeEasingFunction = EasingFunction.linear;\r\n params.myObscureLevelRelativeDistanceEasingFunction = EasingFunction.linear;\r\n\r\n params.myObscureIfPositionHeadNotValid = true;\r\n\r\n params.myDistanceToStartObscureWhenBodyColliding = 0.75;\r\n params.myDistanceToStartObscureWhenHeadColliding = 0;\r\n params.myDistanceToStartObscureWhenFloating = 0.75;\r\n params.myDistanceToStartObscureWhenFar = 0.75;\r\n\r\n params.myRelativeDistanceToMaxObscureWhenBodyColliding = 0.5;\r\n params.myRelativeDistanceToMaxObscureWhenHeadColliding = this._myParams.myViewOcclusionMaxRealHeadDistance;\r\n params.myRelativeDistanceToMaxObscureWhenFloating = 0.5;\r\n params.myRelativeDistanceToMaxObscureWhenFar = 0.5;\r\n\r\n this._myPlayerObscureManager = new PlayerObscureManager(params);\r\n }\r\n\r\n }\r\n\r\n this._setupLocomotionMovementFSM();\r\n\r\n this._myResetRealOnStartCounter = this._myParams.myResetRealOnStartFramesAmount;\r\n }\r\n\r\n public start(): void {\r\n this._fixAlmostUp();\r\n\r\n this._myPlayerHeadManager.start();\r\n this._myPlayerTransformManager.start();\r\n\r\n this._myPlayerObscureManager.start();\r\n\r\n this._myPlayerLocomotionRotate.start();\r\n\r\n if (this._myParams.myDefaultLocomotionType == PlayerLocomotionType.SMOOTH) {\r\n this._myLocomotionMovementFSM.perform(\"startSmooth\");\r\n } else {\r\n this._myLocomotionMovementFSM.perform(\"startTeleport\");\r\n }\r\n\r\n if (this._myParams.myStartIdle) {\r\n this.setIdle(true);\r\n }\r\n\r\n this._myStarted = true;\r\n\r\n const currentActive = this._myActive;\r\n this._myActive = !this._myActive;\r\n this.setActive(currentActive);\r\n }\r\n\r\n /** #WARN Only a few params are actually used by this class after the setup phase, like @myCollisionCheckDisabled\r\n Params like @myMaxSpeed must be edited directly on the PlayerLocomotionSmooth object*/\r\n public getParams(): PlayerLocomotionParams {\r\n return this._myParams;\r\n }\r\n\r\n public setActive(active: boolean): void {\r\n if (this._myActive != active) {\r\n this._myActive = active;\r\n\r\n if (this._myStarted) {\r\n if (this._myActive) {\r\n this._myPlayerObscureManager.start();\r\n if (!this._myIdle) {\r\n this._myLocomotionMovementFSM.perform(\"resume\");\r\n }\r\n } else {\r\n this._myLocomotionMovementFSM.perform(\"idle\");\r\n this._myPlayerObscureManager.stop();\r\n }\r\n }\r\n }\r\n\r\n this._myPlayerHeadManager.setActive(this._myActive);\r\n this._myPlayerTransformManager.setActive(this._myActive);\r\n this._myPlayerObscureManager.setActive(this._myActive);\r\n this._myPlayerLocomotionSmooth.setActive(this._myActive);\r\n this._myPlayerLocomotionTeleport.setActive(this._myActive);\r\n }\r\n\r\n public isActive(): boolean {\r\n return this._myActive;\r\n }\r\n\r\n public isStarted(): boolean {\r\n return this._myStarted;\r\n }\r\n\r\n public canStop(): boolean {\r\n let canStop = false;\r\n\r\n if (this._myLocomotionMovementFSM.isInState(\"smooth\") && this._myPlayerLocomotionSmooth.canStop()) {\r\n canStop = true;\r\n } else if (this._myLocomotionMovementFSM.isInState(\"teleport\") && this._myPlayerLocomotionTeleport.canStop()) {\r\n canStop = true;\r\n }\r\n\r\n return canStop;\r\n }\r\n\r\n public isIdle(): boolean {\r\n return this._myIdle;\r\n }\r\n\r\n public setIdle(idle: boolean): void {\r\n if (this._myIdle != idle) {\r\n this._myIdle = idle;\r\n\r\n if (idle) {\r\n this._myLocomotionMovementFSM.perform(\"idle\");\r\n } else {\r\n this._myLocomotionMovementFSM.perform(\"resume\");\r\n }\r\n }\r\n }\r\n\r\n public getPlayerLocomotionSmooth(): PlayerLocomotionSmooth {\r\n return this._myPlayerLocomotionSmooth;\r\n }\r\n\r\n public getPlayerLocomotionTeleport(): PlayerLocomotionTeleport {\r\n return this._myPlayerLocomotionTeleport;\r\n }\r\n\r\n public getPlayerTransformManager(): PlayerTransformManager {\r\n return this._myPlayerTransformManager;\r\n }\r\n\r\n public getPlayerLocomotionRotate(): PlayerLocomotionRotate {\r\n return this._myPlayerLocomotionRotate;\r\n }\r\n\r\n public getPlayerHeadManager(): PlayerHeadManager {\r\n return this._myPlayerHeadManager;\r\n }\r\n\r\n public getPlayerObscureManager(): PlayerObscureManager {\r\n return this._myPlayerObscureManager;\r\n }\r\n\r\n public registerPreUpdateCallback(id: unknown, callback: (dt: number, playerLocomotion: PlayerLocomotion) => void): void {\r\n this._myPreUpdateEmitter.add(callback, { id: id });\r\n }\r\n\r\n public unregisterPreUpdateCallback(id: unknown): void {\r\n this._myPreUpdateEmitter.remove(id);\r\n }\r\n\r\n public registerPostUpdateCallback(id: unknown, callback: (dt: number, playerLocomotion: PlayerLocomotion) => void): void {\r\n this._myPostUpdateEmitter.add(callback, { id: id });\r\n }\r\n\r\n public unregisterPostUpdateCallback(id: unknown): void {\r\n this._myPostUpdateEmitter.remove(id);\r\n }\r\n\r\n public update(dt: number): void {\r\n if (!this._myActive) return;\r\n\r\n this._myPreUpdateEmitter.notify(dt, this);\r\n\r\n let collisionCheckEnabledBackup = false;\r\n let maxGravitySpeedBackup = 0;\r\n if (this._myParams.myCollisionCheckDisabled && Globals.isDebugEnabled(this._myParams.myEngine)) {\r\n collisionCheckEnabledBackup = CollisionCheckBridge.isCollisionCheckDisabled();\r\n maxGravitySpeedBackup = this.getPlayerLocomotionSmooth().getParams().myMaxGravitySpeed;\r\n CollisionCheckBridge.setCollisionCheckDisabled(true);\r\n this.getPlayerLocomotionSmooth().getParams().myMaxGravitySpeed = 0;\r\n }\r\n\r\n this._myPlayerHeadManager.update(dt);\r\n\r\n if (this._myParams.myResetRealOnStart && this._myResetRealOnStartCounter > 0) {\r\n this._myResetRealOnStartCounter--;\r\n\r\n this._myPlayerTransformManager.resetReal(true, true, undefined, undefined, undefined, true);\r\n this._myPlayerTransformManager.update(dt);\r\n } else {\r\n this._myPlayerTransformManager.update(dt);\r\n\r\n if (!this._myPlayerLocomotionSmooth.isDebugFlyEnabled() || !Globals.isDebugEnabled(this._myParams.myEngine)) {\r\n if (!this._myParams.myAlwaysSmoothForNonVR || XRUtils.isSessionActive(this._myParams.myEngine)) {\r\n if (this._myParams.mySwitchLocomotionTypeShortcutEnabled &&\r\n this._getMainHandGamepad().getButtonInfo(GamepadButtonID.THUMBSTICK).isPressEnd(2)) {\r\n if (this._myLocomotionMovementFSM.isInState(\"smooth\") && this._myPlayerLocomotionSmooth.canStop()) {\r\n this._myLocomotionMovementFSM.perform(\"next\");\r\n } else if (this._myLocomotionMovementFSM.isInState(\"teleport\") && this._myPlayerLocomotionTeleport.canStop()) {\r\n this._myLocomotionMovementFSM.perform(\"next\");\r\n }\r\n }\r\n }\r\n\r\n if (this._myParams.myAlwaysSmoothForNonVR && !XRUtils.isSessionActive(this._myParams.myEngine)) {\r\n if (this._myLocomotionMovementFSM.isInState(\"teleport\") && this._myPlayerLocomotionTeleport.canStop()) {\r\n this._mySwitchToTeleportOnEnterSession = true;\r\n this._myLocomotionMovementFSM.perform(\"next\");\r\n }\r\n } else if (this._mySwitchToTeleportOnEnterSession && XRUtils.isSessionActive(this._myParams.myEngine)) {\r\n if (this._myLocomotionMovementFSM.isInState(\"smooth\") && this._myPlayerLocomotionSmooth.canStop()) {\r\n this._mySwitchToTeleportOnEnterSession = false;\r\n this._myLocomotionMovementFSM.perform(\"next\");\r\n }\r\n }\r\n }\r\n\r\n if (this._myParams.myDebugFlyShortcutEnabled && Globals.isDebugEnabled(this._myParams.myEngine)) {\r\n if (GamepadUtils.areButtonsPressEnd([this._getMainHandGamepad(), GamepadButtonID.SELECT, GamepadButtonID.THUMBSTICK])) {\r\n if (this._myLocomotionMovementFSM.isInState(\"teleport\") && this._myPlayerLocomotionTeleport.canStop()) {\r\n this._myLocomotionMovementFSM.perform(\"next\");\r\n }\r\n\r\n if (this._myLocomotionMovementFSM.isInState(\"smooth\")) {\r\n this._myPlayerLocomotionSmooth.setDebugFlyEnabled(!this._myPlayerLocomotionSmooth.isDebugFlyEnabled());\r\n this._mySwitchToTeleportOnEnterSession = false;\r\n }\r\n }\r\n }\r\n\r\n if (this._myPlayerHeadManager.isSynced()) {\r\n if (!this._myIdle) {\r\n this._myPlayerLocomotionRotate.update(dt);\r\n this._myLocomotionMovementFSM.update(dt);\r\n }\r\n }\r\n }\r\n\r\n if (this._myParams.mySyncHeadWithRealAfterLocomotionUpdateIfNeeded) {\r\n this._myPlayerTransformManager.updateValidHeadToRealHeadIfNeeded();\r\n }\r\n\r\n this._myPlayerObscureManager.update(dt);\r\n\r\n if (this._myParams.myCollisionCheckDisabled && Globals.isDebugEnabled(this._myParams.myEngine)) {\r\n CollisionCheckBridge.setCollisionCheckDisabled(collisionCheckEnabledBackup);\r\n this.getPlayerLocomotionSmooth().getParams().myMaxGravitySpeed = maxGravitySpeedBackup;\r\n }\r\n\r\n this._myPostUpdateEmitter.notify(dt, this);\r\n }\r\n\r\n private _setupCollisionCheckParamsMovement(): CollisionCheckParams {\r\n const simplifiedParams = new CharacterColliderSetupSimplifiedCreationParams();\r\n\r\n simplifiedParams.myHeight = this._myParams.myDefaultHeight;\r\n simplifiedParams.myRadius = this._myParams.myCharacterRadius;\r\n simplifiedParams.myFeetRadius = this._myParams.myCharacterFeetRadius;\r\n\r\n simplifiedParams.myAccuracyLevel = this._myParams.myColliderAccuracy;\r\n\r\n simplifiedParams.myIsPlayer = true;\r\n\r\n simplifiedParams.myCheckOnlyFeet = this._myParams.myColliderCheckOnlyFeet;\r\n simplifiedParams.myCheckCeilings = this._myParams.myColliderCheckCeilings;\r\n\r\n simplifiedParams.myShouldSlideAlongWall = this._myParams.myColliderSlideAlongWall;\r\n\r\n simplifiedParams.myCollectGroundInfo = true;\r\n simplifiedParams.myMaxWalkableGroundAngle = this._myParams.myColliderMaxWalkableGroundAngle;\r\n simplifiedParams.myMaxDistanceToSnapOnGround = this._myParams.myColliderMaxDistanceToSnapOnGround;\r\n simplifiedParams.myMaxDistanceToPopOutGround = this._myParams.myColliderMaxDistanceToPopOutGround;\r\n simplifiedParams.myMaxWalkableGroundStepHeight = this._myParams.myColliderMaxWalkableGroundStepHeight;\r\n simplifiedParams.myMaxWalkableCeilingStepHeight = this._myParams.myColliderMaxWalkableCeilingStepHeight;\r\n simplifiedParams.myShouldNotFallFromEdges = this._myParams.myColliderPreventFallingFromEdges;\r\n simplifiedParams.myMaxMovementSteps = this._myParams.myColliderMaxMovementSteps;\r\n\r\n simplifiedParams.myHorizontalCheckBlockLayerFlags.copy(this._myParams.myPhysicsBlockLayerFlags);\r\n const physXComponents = Globals.getPlayerObjects(this._myParams.myEngine)!.myPlayer!.pp_getComponents(PhysXComponent);\r\n for (const physXComponent of physXComponents) {\r\n simplifiedParams.myHorizontalCheckObjectsToIgnore.pp_pushUnique(physXComponent.object, (first, second) => first == second);\r\n }\r\n simplifiedParams.myVerticalCheckBlockLayerFlags.copy(simplifiedParams.myHorizontalCheckBlockLayerFlags);\r\n simplifiedParams.myVerticalCheckObjectsToIgnore.pp_copy(simplifiedParams.myHorizontalCheckObjectsToIgnore);\r\n\r\n simplifiedParams.myHorizontalCheckDebugEnabled = this._myParams.myDebugHorizontalEnabled;\r\n simplifiedParams.myVerticalCheckDebugEnabled = this._myParams.myDebugVerticalEnabled;\r\n\r\n const colliderSetup = CharacterColliderSetupUtils.createSimplified(simplifiedParams);\r\n\r\n return CollisionCheckBridge.convertCharacterColliderSetupToCollisionCheckParams(colliderSetup);\r\n }\r\n\r\n private _fixAlmostUp(): void {\r\n // Get rotation on y and adjust if it's slightly tilted when it's almsot 0,1,0\r\n\r\n const defaultUp = vec3_create(0, 1, 0);\r\n const angleWithDefaultUp = (Globals.getPlayerObjects(this._myParams.myEngine)!.myPlayer!.pp_getUp()).vec3_angle(defaultUp);\r\n if (angleWithDefaultUp < 1) {\r\n const forward = Globals.getPlayerObjects(this._myParams.myEngine)!.myPlayer!.pp_getForward();\r\n const flatForward = forward.vec3_clone();\r\n flatForward[1] = 0;\r\n\r\n const defaultForward = vec3_create(0, 0, 1);\r\n const angleWithDefaultForward = defaultForward.vec3_angleSigned(flatForward, defaultUp);\r\n\r\n Globals.getPlayerObjects(this._myParams.myEngine)!.myPlayer!.pp_resetRotation();\r\n Globals.getPlayerObjects(this._myParams.myEngine)!.myPlayer!.pp_rotateAxis(angleWithDefaultForward, defaultUp);\r\n }\r\n }\r\n\r\n private _setupLocomotionMovementFSM(): void {\r\n //this._myLocomotionMovementFSM.setLogEnabled(true, \"Locomotion Movement\");\r\n\r\n this._myLocomotionMovementFSM.addState(\"init\");\r\n this._myLocomotionMovementFSM.addState(\"smooth\", (dt: number) => this._myPlayerLocomotionSmooth.update(dt));\r\n this._myLocomotionMovementFSM.addState(\"teleport\", (dt: number) => this._myPlayerLocomotionTeleport.update(dt));\r\n this._myLocomotionMovementFSM.addState(\"idleSmooth\");\r\n this._myLocomotionMovementFSM.addState(\"idleTeleport\");\r\n\r\n this._myLocomotionMovementFSM.addTransition(\"init\", \"smooth\", \"startSmooth\", function (this: PlayerLocomotion) {\r\n this._myPlayerLocomotionTeleport.stop();\r\n this._myPlayerLocomotionSmooth.start();\r\n }.bind(this));\r\n\r\n this._myLocomotionMovementFSM.addTransition(\"init\", \"teleport\", \"startTeleport\", function (this: PlayerLocomotion) {\r\n this._myPlayerLocomotionSmooth.stop();\r\n this._myPlayerLocomotionTeleport.start();\r\n }.bind(this));\r\n\r\n this._myLocomotionMovementFSM.addTransition(\"smooth\", \"teleport\", \"next\", function (this: PlayerLocomotion) {\r\n this._myPlayerLocomotionSmooth.stop();\r\n this._myPlayerLocomotionTeleport.start();\r\n }.bind(this));\r\n\r\n this._myLocomotionMovementFSM.addTransition(\"teleport\", \"smooth\", \"next\", function (this: PlayerLocomotion) {\r\n this._myPlayerLocomotionTeleport.stop();\r\n this._myPlayerLocomotionSmooth.start();\r\n }.bind(this));\r\n\r\n this._myLocomotionMovementFSM.addTransition(\"smooth\", \"idleSmooth\", \"idle\", function (this: PlayerLocomotion) {\r\n this._myPlayerLocomotionSmooth.stop();\r\n }.bind(this));\r\n\r\n this._myLocomotionMovementFSM.addTransition(\"teleport\", \"idleTeleport\", \"idle\", function (this: PlayerLocomotion) {\r\n this._myPlayerLocomotionTeleport.stop();\r\n }.bind(this));\r\n\r\n this._myLocomotionMovementFSM.addTransition(\"idleSmooth\", \"smooth\", \"resume\", function (this: PlayerLocomotion) {\r\n this._myPlayerLocomotionSmooth.start();\r\n }.bind(this));\r\n\r\n this._myLocomotionMovementFSM.addTransition(\"idleTeleport\", \"teleport\", \"resume\", function (this: PlayerLocomotion) {\r\n this._myPlayerLocomotionTeleport.start();\r\n }.bind(this));\r\n\r\n this._myLocomotionMovementFSM.init(\"init\");\r\n }\r\n\r\n private _getMainHandGamepad(): Gamepad {\r\n return Globals.getGamepads(this._myParams.myEngine)![this._myParams.myMainHand];\r\n }\r\n\r\n public destroy(): void {\r\n this._myDestroyed = true;\r\n\r\n this._myPlayerHeadManager.destroy();\r\n this._myPlayerLocomotionSmooth.destroy();\r\n this._myPlayerTransformManager.destroy();\r\n this._myPlayerObscureManager.destroy();\r\n this._myPlayerLocomotionTeleport.destroy();\r\n }\r\n\r\n public isDestroyed(): boolean {\r\n return this._myDestroyed;\r\n }\r\n}", "import { GamepadButtonID } from \"../gamepad_buttons.js\";\r\n\r\nlet _mySimultaneousPressMaxDelay = 0.15;\r\nlet _mySimultaneousTouchMaxDelay = 0.15;\r\n\r\nexport function setSimultaneousPressMaxDelay(simultaneousPressMaxDelay) {\r\n _mySimultaneousPressMaxDelay = simultaneousPressMaxDelay;\r\n}\r\n\r\nexport function setSimultaneousTouchMaxDelay(simultaneousTouchMaxDelay) {\r\n _mySimultaneousTouchMaxDelay = simultaneousTouchMaxDelay;\r\n}\r\n\r\nexport function getSimultaneousPressMaxDelay() {\r\n return _mySimultaneousPressMaxDelay;\r\n}\r\n\r\nexport function getSimultaneousTouchMaxDelay() {\r\n return _mySimultaneousTouchMaxDelay;\r\n}\r\n\r\n\r\n// gamepadButtonIDsList is a sequence of a gamepads and a list of buttonIDs like this ([gamepad1, squeeze, top, select], [gamepad2, bottom, squeeze, select], ...)\r\n// If the first parameter is a number it's used as multiplePressCount\r\n// If the buttonIDs list is empty for a given gamepad, it means that every button will be included\r\nexport function isAnyButtonPressStart(...gamepadButtonIDsList) {\r\n let multiplePressCount = null;\r\n let realGamepadButtonIDsList = gamepadButtonIDsList;\r\n if (!isNaN(gamepadButtonIDsList[0])) {\r\n multiplePressCount = gamepadButtonIDsList[0];\r\n realGamepadButtonIDsList = gamepadButtonIDsList.slice(1);\r\n }\r\n\r\n for (let gamepadButtonIDs of realGamepadButtonIDsList) {\r\n if (gamepadButtonIDs.length == 1) {\r\n for (let key in GamepadButtonID) {\r\n gamepadButtonIDs.push(GamepadButtonID[key]);\r\n }\r\n }\r\n }\r\n\r\n let atLeastOneButtonPressStart = false;\r\n for (let gamepadButtonIDs of realGamepadButtonIDsList) {\r\n let gamepad = gamepadButtonIDs[0];\r\n for (let i = 1; i < gamepadButtonIDs.length; i++) {\r\n let buttonID = gamepadButtonIDs[i];\r\n let button = gamepad.getButtonInfo(buttonID);\r\n\r\n if (button.isPressStart(multiplePressCount)) {\r\n atLeastOneButtonPressStart = true;\r\n break;\r\n }\r\n }\r\n\r\n if (atLeastOneButtonPressStart) {\r\n break;\r\n }\r\n }\r\n\r\n return atLeastOneButtonPressStart;\r\n}\r\n\r\n// gamepadButtonIDsList is a sequence of a gamepads and a list of buttonIDs like this ([gamepad1, squeeze, top, select], [gamepad2, bottom, squeeze, select], ...)\r\n// If the first parameter is a number it's used as multiplePressCount\r\n// If the buttonIDs list is empty for a given gamepad, it means that every button will be included\r\nexport function areButtonsPressStart(...gamepadButtonIDsList) {\r\n let multiplePressCount = null;\r\n let realGamepadButtonIDsList = gamepadButtonIDsList;\r\n if (!isNaN(gamepadButtonIDsList[0])) {\r\n multiplePressCount = gamepadButtonIDsList[0];\r\n realGamepadButtonIDsList = gamepadButtonIDsList.slice(1);\r\n }\r\n\r\n for (let gamepadButtonIDs of realGamepadButtonIDsList) {\r\n if (gamepadButtonIDs.length == 1) {\r\n for (let key in GamepadButtonID) {\r\n gamepadButtonIDs.push(GamepadButtonID[key]);\r\n }\r\n }\r\n }\r\n\r\n let areButtonPressedRecently = true;\r\n let atLeastOneButtonPressStart = false;\r\n for (let gamepadButtonIDs of realGamepadButtonIDsList) {\r\n let gamepad = gamepadButtonIDs[0];\r\n for (let i = 1; i < gamepadButtonIDs.length; i++) {\r\n let buttonID = gamepadButtonIDs[i];\r\n let button = gamepad.getButtonInfo(buttonID);\r\n\r\n if (!(button.myPressed && (multiplePressCount == null || button.myMultiplePressStartCount == multiplePressCount) && button.myTimePressed < _mySimultaneousPressMaxDelay)) {\r\n areButtonPressedRecently = false;\r\n break;\r\n }\r\n\r\n if (button.isPressStart(multiplePressCount)) {\r\n atLeastOneButtonPressStart = true;\r\n }\r\n }\r\n\r\n if (!areButtonPressedRecently) {\r\n break;\r\n }\r\n }\r\n\r\n return areButtonPressedRecently && atLeastOneButtonPressStart;\r\n}\r\n\r\nexport function isAnyButtonPressEnd(...gamepadButtonIDsList) {\r\n let multiplePressCount = null;\r\n let realGamepadButtonIDsList = gamepadButtonIDsList;\r\n if (!isNaN(gamepadButtonIDsList[0])) {\r\n multiplePressCount = gamepadButtonIDsList[0];\r\n realGamepadButtonIDsList = gamepadButtonIDsList.slice(1);\r\n }\r\n\r\n for (let gamepadButtonIDs of realGamepadButtonIDsList) {\r\n if (gamepadButtonIDs.length == 1) {\r\n for (let key in GamepadButtonID) {\r\n gamepadButtonIDs.push(GamepadButtonID[key]);\r\n }\r\n }\r\n }\r\n\r\n let atLeastOneButtonPressEnd = false;\r\n for (let gamepadButtonIDs of realGamepadButtonIDsList) {\r\n let gamepad = gamepadButtonIDs[0];\r\n for (let i = 1; i < gamepadButtonIDs.length; i++) {\r\n let buttonID = gamepadButtonIDs[i];\r\n let button = gamepad.getButtonInfo(buttonID);\r\n\r\n if (button.isPressEnd(multiplePressCount)) {\r\n atLeastOneButtonPressEnd = true;\r\n break;\r\n }\r\n }\r\n\r\n if (atLeastOneButtonPressEnd) {\r\n break;\r\n }\r\n }\r\n\r\n return atLeastOneButtonPressEnd;\r\n}\r\n\r\nexport function areButtonsPressEnd(...gamepadButtonIDsList) {\r\n let multiplePressCount = null;\r\n let realGamepadButtonIDsList = gamepadButtonIDsList;\r\n if (!isNaN(gamepadButtonIDsList[0])) {\r\n multiplePressCount = gamepadButtonIDsList[0];\r\n realGamepadButtonIDsList = gamepadButtonIDsList.slice(1);\r\n }\r\n\r\n for (let gamepadButtonIDs of realGamepadButtonIDsList) {\r\n if (gamepadButtonIDs.length == 1) {\r\n for (let key in GamepadButtonID) {\r\n gamepadButtonIDs.push(GamepadButtonID[key]);\r\n }\r\n }\r\n }\r\n\r\n let areButtonNotPressedRecently = true;\r\n let atLeastOneButtonPressEnd = false;\r\n for (let gamepadButtonIDs of realGamepadButtonIDsList) {\r\n let gamepad = gamepadButtonIDs[0];\r\n for (let i = 1; i < gamepadButtonIDs.length; i++) {\r\n let buttonID = gamepadButtonIDs[i];\r\n let button = gamepad.getButtonInfo(buttonID);\r\n\r\n if (!(!button.myPressed && (multiplePressCount == null || button.myMultiplePressEndCount == multiplePressCount) && button.myTimeNotPressed < _mySimultaneousPressMaxDelay)) {\r\n areButtonNotPressedRecently = false;\r\n break;\r\n }\r\n\r\n if (button.isPressEnd(multiplePressCount)) {\r\n atLeastOneButtonPressEnd = true;\r\n }\r\n }\r\n\r\n if (!areButtonNotPressedRecently) {\r\n break;\r\n }\r\n }\r\n\r\n return areButtonNotPressedRecently && atLeastOneButtonPressEnd;\r\n}\r\n\r\nexport function isAnyButtonTouchStart(...gamepadButtonIDsList) {\r\n let multiplePressCount = null;\r\n let realGamepadButtonIDsList = gamepadButtonIDsList;\r\n if (!isNaN(gamepadButtonIDsList[0])) {\r\n multiplePressCount = gamepadButtonIDsList[0];\r\n realGamepadButtonIDsList = gamepadButtonIDsList.slice(1);\r\n }\r\n\r\n for (let gamepadButtonIDs of realGamepadButtonIDsList) {\r\n if (gamepadButtonIDs.length == 1) {\r\n for (let key in GamepadButtonID) {\r\n gamepadButtonIDs.push(GamepadButtonID[key]);\r\n }\r\n }\r\n }\r\n\r\n let atLeastOneButtonTouchStart = false;\r\n for (let gamepadButtonIDs of realGamepadButtonIDsList) {\r\n let gamepad = gamepadButtonIDs[0];\r\n for (let i = 1; i < gamepadButtonIDs.length; i++) {\r\n let buttonID = gamepadButtonIDs[i];\r\n let button = gamepad.getButtonInfo(buttonID);\r\n\r\n if (button.isTouchStart(multiplePressCount)) {\r\n atLeastOneButtonTouchStart = true;\r\n break;\r\n }\r\n }\r\n\r\n if (atLeastOneButtonTouchStart) {\r\n break;\r\n }\r\n }\r\n\r\n return atLeastOneButtonTouchStart;\r\n}\r\n\r\nexport function areButtonsTouchStart(...gamepadButtonIDsList) {\r\n let multipleTouchCount = null;\r\n let realGamepadButtonIDsList = gamepadButtonIDsList;\r\n if (!isNaN(gamepadButtonIDsList[0])) {\r\n multipleTouchCount = gamepadButtonIDsList[0];\r\n realGamepadButtonIDsList = gamepadButtonIDsList.slice(1);\r\n }\r\n\r\n for (let gamepadButtonIDs of realGamepadButtonIDsList) {\r\n if (gamepadButtonIDs.length == 1) {\r\n for (let key in GamepadButtonID) {\r\n gamepadButtonIDs.push(GamepadButtonID[key]);\r\n }\r\n }\r\n }\r\n\r\n let areButtonTouchedRecently = true;\r\n let atLeastOneButtonTouchStart = false;\r\n for (let gamepadButtonIDs of realGamepadButtonIDsList) {\r\n let gamepad = gamepadButtonIDs[0];\r\n for (let i = 1; i < gamepadButtonIDs.length; i++) {\r\n let buttonID = gamepadButtonIDs[i];\r\n let button = gamepad.getButtonInfo(buttonID);\r\n\r\n if (!(button.myTouched && (multipleTouchCount == null || button.myMultipleTouchStartCount == multipleTouchCount) && button.myTimeTouched < _mySimultaneousTouchMaxDelay)) {\r\n areButtonTouchedRecently = false;\r\n break;\r\n }\r\n\r\n if (button.isTouchStart(multipleTouchCount)) {\r\n atLeastOneButtonTouchStart = true;\r\n }\r\n }\r\n\r\n if (!areButtonTouchedRecently) {\r\n break;\r\n }\r\n }\r\n\r\n return areButtonTouchedRecently && atLeastOneButtonTouchStart;\r\n}\r\n\r\nexport function isAnyButtonTouchEnd(...gamepadButtonIDsList) {\r\n let multiplePressCount = null;\r\n let realGamepadButtonIDsList = gamepadButtonIDsList;\r\n if (!isNaN(gamepadButtonIDsList[0])) {\r\n multiplePressCount = gamepadButtonIDsList[0];\r\n realGamepadButtonIDsList = gamepadButtonIDsList.slice(1);\r\n }\r\n\r\n for (let gamepadButtonIDs of realGamepadButtonIDsList) {\r\n if (gamepadButtonIDs.length == 1) {\r\n for (let key in GamepadButtonID) {\r\n gamepadButtonIDs.push(GamepadButtonID[key]);\r\n }\r\n }\r\n }\r\n\r\n let atLeastOneButtonTouchEnd = false;\r\n for (let gamepadButtonIDs of realGamepadButtonIDsList) {\r\n let gamepad = gamepadButtonIDs[0];\r\n for (let i = 1; i < gamepadButtonIDs.length; i++) {\r\n let buttonID = gamepadButtonIDs[i];\r\n let button = gamepad.getButtonInfo(buttonID);\r\n\r\n if (button.isTouchEnd(multiplePressCount)) {\r\n atLeastOneButtonTouchEnd = true;\r\n break;\r\n }\r\n }\r\n\r\n if (atLeastOneButtonTouchEnd) {\r\n break;\r\n }\r\n }\r\n\r\n return atLeastOneButtonTouchEnd;\r\n}\r\n\r\nexport function areButtonsTouchEnd(...gamepadButtonIDsList) {\r\n let multipleTouchCount = null;\r\n let realGamepadButtonIDsList = gamepadButtonIDsList;\r\n if (!isNaN(gamepadButtonIDsList[0])) {\r\n multipleTouchCount = gamepadButtonIDsList[0];\r\n realGamepadButtonIDsList = gamepadButtonIDsList.slice(1);\r\n }\r\n\r\n for (let gamepadButtonIDs of realGamepadButtonIDsList) {\r\n if (gamepadButtonIDs.length == 1) {\r\n for (let key in GamepadButtonID) {\r\n gamepadButtonIDs.push(GamepadButtonID[key]);\r\n }\r\n }\r\n }\r\n\r\n let areButtonNotTouchedRecently = true;\r\n let atLeastOneButtonTouchEnd = false;\r\n for (let gamepadButtonIDs of realGamepadButtonIDsList) {\r\n let gamepad = gamepadButtonIDs[0];\r\n for (let i = 1; i < gamepadButtonIDs.length; i++) {\r\n let buttonID = gamepadButtonIDs[i];\r\n let button = gamepad.getButtonInfo(buttonID);\r\n\r\n if (!(!button.myTouched && (multipleTouchCount == null || button.myMultipleTouchEndCount == multipleTouchCount) && button.myTimeNotTouched < _mySimultaneousTouchMaxDelay)) {\r\n areButtonNotTouchedRecently = false;\r\n break;\r\n }\r\n\r\n if (button.isTouchEnd(multipleTouchCount)) {\r\n atLeastOneButtonTouchEnd = true;\r\n }\r\n }\r\n\r\n if (!areButtonNotTouchedRecently) {\r\n break;\r\n }\r\n }\r\n\r\n return areButtonNotTouchedRecently && atLeastOneButtonTouchEnd;\r\n}\r\n\r\nexport let GamepadUtils = {\r\n setSimultaneousPressMaxDelay,\r\n setSimultaneousTouchMaxDelay,\r\n getSimultaneousPressMaxDelay,\r\n getSimultaneousTouchMaxDelay,\r\n isAnyButtonPressStart,\r\n areButtonsPressStart,\r\n isAnyButtonPressEnd,\r\n areButtonsPressEnd,\r\n isAnyButtonTouchStart,\r\n areButtonsTouchStart,\r\n isAnyButtonTouchEnd,\r\n areButtonsTouchEnd\r\n};", "// Even if this can be sued to generally fade, it should be called collision obscure to hint that is meant for collision obscuring\r\n\r\nimport { Timer } from \"../../../../../cauldron/cauldron/timer.js\";\r\nimport { FSM } from \"../../../../../cauldron/fsm/fsm.js\";\r\nimport { EasingFunction } from \"../../../../../cauldron/utils/math_utils.js\";\r\nimport { XRUtils } from \"../../../../../cauldron/utils/xr_utils.js\";\r\nimport { VisualMesh, VisualMeshParams } from \"../../../../../cauldron/visual/elements/visual_mesh.js\";\r\nimport { MaterialUtils } from \"../../../../../cauldron/wl/utils/material_utils.js\";\r\nimport { vec3_create, vec4_create } from \"../../../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Globals } from \"../../../../../pp/globals.js\";\r\n\r\n// Occlude\r\nexport class PlayerObscureManagerParams {\r\n\r\n constructor(engine = Globals.getMainEngine()) {\r\n this.myPlayerTransformManager = null;\r\n this.myPlayerLocomotionTeleport = null;\r\n\r\n this.myEnabled = true;\r\n\r\n this.myObscureObject = null;\r\n this.myObscureMaterial = null;\r\n this.myObscureRadius = 0;\r\n\r\n this.myObscureFadeOutSeconds = 0.1;\r\n this.myObscureFadeInSeconds = 0.1;\r\n\r\n this.myObscureFadeEasingFunction = EasingFunction.linear;\r\n\r\n this.myObscureIfPositionHeadNotValid = false;\r\n\r\n this.myDistanceToStartObscureWhenHeadColliding = 0;\r\n this.myDistanceToStartObscureWhenBodyColliding = 0;\r\n this.myDistanceToStartObscureWhenFloating = 0;\r\n this.myDistanceToStartObscureWhenFar = 0;\r\n\r\n this.myRelativeDistanceToMaxObscureWhenHeadColliding = 0; // Relative to the start distance, 1 means that in 1 meters after it started it will be completely obscured\r\n this.myRelativeDistanceToMaxObscureWhenBodyColliding = 0;\r\n this.myRelativeDistanceToMaxObscureWhenFloating = 0;\r\n this.myRelativeDistanceToMaxObscureWhenFar = 0;\r\n\r\n this.myObscureLevelRelativeDistanceEasingFunction = EasingFunction.linear;\r\n\r\n this.myDisableObscureWhileTeleporting = true;\r\n this.myDisableObscureWhileTeleportingDuration = null;\r\n\r\n this.myEngine = engine;\r\n }\r\n}\r\n\r\nexport class PlayerObscureManager {\r\n\r\n constructor(params) {\r\n this._myParams = params;\r\n\r\n this._myObscureMaterial = null;\r\n this._myObscureParentObject = null;\r\n\r\n this._myCurrentObscureLevel = 0;\r\n this._myTargetObscureLevel = 0;\r\n this._myLastTargetObscureLevel = null;\r\n this._myLastIsFadingIn = null;\r\n\r\n this._myInstantObscureFramesCount = 0;\r\n\r\n this._myFadeTimer = new Timer(0, false);\r\n\r\n this._myDisableObscureWhileTeleportingTimer = null;\r\n if (this._myParams.myDisableObscureWhileTeleportingDuration != null) {\r\n this._myDisableObscureWhileTeleportingTimer = new Timer(this._myParams.myDisableObscureWhileTeleportingDuration);\r\n } else {\r\n this._myDisableObscureWhileTeleportingTimer = new Timer(0, false);\r\n }\r\n\r\n this._myFSM = new FSM();\r\n //this._myFSM.setLogEnabled(true, \" Obscure\");\r\n\r\n this._myFSM.addState(\"init\");\r\n\r\n this._myFSM.addState(\"inactive\");\r\n this._myFSM.addState(\"idle\", this._idleUpdate.bind(this));\r\n this._myFSM.addState(\"fading\", this._fadingUpdate.bind(this));\r\n\r\n this._myFSM.addTransition(\"init\", \"inactive\", \"end\", this._setObscureLevel.bind(this, 0));\r\n\r\n this._myFSM.addTransition(\"inactive\", \"idle\", \"start\");\r\n\r\n this._myFSM.addTransition(\"idle\", \"fading\", \"fade\", this._startFading.bind(this));\r\n this._myFSM.addTransition(\"fading\", \"idle\", \"done\", this._fadingDone.bind(this));\r\n\r\n this._myFSM.addTransition(\"inactive\", \"inactive\", \"stop\", this._setObscureLevel.bind(this, 0));\r\n this._myFSM.addTransition(\"idle\", \"inactive\", \"stop\", this._setObscureLevel.bind(this, 0));\r\n this._myFSM.addTransition(\"fading\", \"inactive\", \"stop\", this._setObscureLevel.bind(this, 0));\r\n\r\n this._myFSM.init(\"init\");\r\n\r\n this._setupVisuals();\r\n\r\n this._myFSM.perform(\"end\");\r\n\r\n this._myActive = false;\r\n this.setActive(true);\r\n\r\n this._myDestroyed = false;\r\n }\r\n\r\n setActive(active) {\r\n if (this._myActive != active) {\r\n this._myActive = active;\r\n\r\n if (this._myActive) {\r\n XRUtils.registerSessionStartEndEventListeners(this, this._onXRSessionStart.bind(this), this._onXRSessionEnd.bind(this), false, false, this._myParams.myEngine);\r\n } else {\r\n XRUtils.unregisterSessionStartEndEventListeners(this, this._myParams.myEngine);\r\n\r\n this._setObscureLevel(0);\r\n }\r\n }\r\n }\r\n\r\n isActive() {\r\n return this._myActive;\r\n }\r\n\r\n start() {\r\n this._myFSM.perform(\"start\");\r\n }\r\n\r\n stop() {\r\n this._myFSM.perform(\"stop\");\r\n }\r\n\r\n getParams() {\r\n return this._myParams;\r\n }\r\n\r\n update(dt) {\r\n if (!this._myActive) return;\r\n\r\n if (!this._myParams.myPlayerLocomotionTeleport.isTeleporting()) {\r\n if (this._myParams.myDisableObscureWhileTeleportingDuration != null) {\r\n this._myDisableObscureWhileTeleportingTimer.start();\r\n } else {\r\n this._myDisableObscureWhileTeleportingTimer.reset();\r\n }\r\n } else {\r\n this._myDisableObscureWhileTeleportingTimer.update(dt);\r\n }\r\n\r\n this._myObscureParentObject.pp_resetTransformLocal();\r\n\r\n this._updateObscured();\r\n\r\n this._myFSM.update(dt);\r\n\r\n this._setObscureVisible(this.isObscured());\r\n\r\n if (this._myInstantObscureFramesCount > 0) {\r\n this._myInstantObscureFramesCount--;\r\n }\r\n }\r\n\r\n isStarted() {\r\n return !this._myFSM.isInState(\"inactive\");\r\n }\r\n\r\n isObscured() {\r\n return this._myCurrentObscureLevel > 0;\r\n }\r\n\r\n isFading() {\r\n return this._myFSM.isInState(\"fading\");\r\n }\r\n\r\n isFadingIn() {\r\n return this.isFading() && this._myCurrentObscureLevel > this._myTargetObscureLevel;\r\n }\r\n\r\n isFadingOut() {\r\n return this.isFading() && this._myCurrentObscureLevel <= this._myTargetObscureLevel;\r\n }\r\n\r\n getObscureLevel() {\r\n return this._myCurrentObscureLevel;\r\n }\r\n\r\n getTargetObscureLevel() {\r\n return this._myTargetObscureLevel;\r\n }\r\n\r\n getCurrentObscureLevel() {\r\n return this._myCurrentObscureLevel;\r\n }\r\n\r\n overrideObscureLevel(obscureLevel, instantFade = false) {\r\n if (!this._myActive) return;\r\n\r\n this._myObscureLevelOverride = obscureLevel;\r\n\r\n if (instantFade && this.isStarted()) {\r\n this._setObscureLevel(obscureLevel);\r\n }\r\n }\r\n\r\n resetObscureLevelOverride() {\r\n this._myObscureLevelOverride = null;\r\n }\r\n\r\n _idleUpdate(dt) {\r\n if (Math.abs(this._myTargetObscureLevel - this._myCurrentObscureLevel) > Math.PP_EPSILON) {\r\n if (this._myInstantObscureFramesCount > 0) {\r\n this._setObscureAlpha(this._myTargetObscureLevel);\r\n this._myCurrentObscureLevel = this._myTargetObscureLevel;\r\n } else {\r\n this._myFSM.perform(\"fade\");\r\n }\r\n }\r\n }\r\n\r\n _fadingUpdate(dt) {\r\n if (Math.abs(this._myTargetObscureLevel - this._myCurrentObscureLevel) <= Math.PP_EPSILON) {\r\n this._myFSM.perform(\"done\");\r\n return;\r\n }\r\n\r\n if (this._myLastTargetObscureLevel != this._myTargetObscureLevel) {\r\n this._refreshFadeTimer();\r\n this._myLastTargetObscureLevel = this._myTargetObscureLevel;\r\n }\r\n\r\n this._myFadeTimer.update(dt);\r\n\r\n if (this._myInstantObscureFramesCount > 0) {\r\n this._myFadeTimer.end();\r\n }\r\n\r\n let newObscureLevel = this._myParams.myObscureFadeEasingFunction(this._myFadeTimer.getPercentage());\r\n\r\n let isFadingIn = this._myCurrentObscureLevel > this._myTargetObscureLevel;\r\n if (!isFadingIn) {\r\n newObscureLevel = Math.min(newObscureLevel, this._myTargetObscureLevel);\r\n } else {\r\n newObscureLevel = Math.pp_clamp(1 - newObscureLevel, 0, 1);\r\n newObscureLevel = Math.max(newObscureLevel, this._myTargetObscureLevel);\r\n }\r\n\r\n this._setObscureAlpha(newObscureLevel);\r\n this._myCurrentObscureLevel = newObscureLevel;\r\n\r\n if (Math.abs(this._myTargetObscureLevel - this._myCurrentObscureLevel) <= Math.PP_EPSILON || this._myFadeTimer.isDone()) {\r\n this._myFSM.perform(\"done\");\r\n }\r\n }\r\n\r\n _startFading() {\r\n this._myLastTargetObscureLevel = null;\r\n this._myLastIsFadingIn = null;\r\n }\r\n\r\n _fadingDone() {\r\n this._setObscureLevel(this._myTargetObscureLevel);\r\n }\r\n\r\n _refreshFadeTimer() {\r\n let isFadingIn = this._myCurrentObscureLevel > this._myTargetObscureLevel;\r\n\r\n if (this._myLastIsFadingIn != isFadingIn) {\r\n this._setFadeTimerToObscureLevel(isFadingIn);\r\n }\r\n\r\n this._myLastIsFadingIn = isFadingIn;\r\n }\r\n\r\n _setFadeTimerToObscureLevel(isFadingIn) {\r\n let percentage = 0;\r\n let closestPercentage = 0;\r\n let steps = 1000;\r\n let increment = 1 / steps;\r\n\r\n while (percentage < 1) {\r\n if (Math.abs(this._myParams.myObscureFadeEasingFunction(percentage) - this._myCurrentObscureLevel) <\r\n Math.abs(this._myParams.myObscureFadeEasingFunction(closestPercentage) - this._myCurrentObscureLevel)) {\r\n closestPercentage = percentage;\r\n }\r\n\r\n percentage += increment;\r\n }\r\n\r\n if (Math.abs(this._myParams.myObscureFadeEasingFunction(1) - this._myCurrentObscureLevel) <\r\n Math.abs(this._myParams.myObscureFadeEasingFunction(closestPercentage) - this._myCurrentObscureLevel)) {\r\n closestPercentage = 1;\r\n }\r\n\r\n if (isFadingIn) {\r\n this._myFadeTimer.start(this._myParams.myObscureFadeInSeconds);\r\n this._myFadeTimer.setPercentage(Math.pp_clamp(1 - closestPercentage, 0, 1));\r\n } else {\r\n this._myFadeTimer.start(this._myParams.myObscureFadeOutSeconds);\r\n this._myFadeTimer.setPercentage(Math.pp_clamp(closestPercentage, 0, 1));\r\n }\r\n }\r\n\r\n _setObscureLevel(obscureLevel) {\r\n this._myTargetObscureLevel = obscureLevel;\r\n this._myCurrentObscureLevel = obscureLevel;\r\n this._setObscureAlpha(obscureLevel);\r\n this._setObscureVisible(this.isObscured());\r\n }\r\n\r\n _setObscureAlpha(alpha) {\r\n if (this._myParams.myObscureObject == null) {\r\n MaterialUtils.setAlpha(this._myObscureMaterial, alpha);\r\n } else {\r\n MaterialUtils.setObjectAlpha(this._myParams.myObscureObject, alpha);\r\n }\r\n }\r\n\r\n _updateObscured() {\r\n this._myTargetObscureLevel = 0;\r\n\r\n if (this._myParams.myEnabled) {\r\n if (this._myObscureLevelOverride != null) {\r\n this._myTargetObscureLevel = this._myObscureLevelOverride;\r\n } else if (!this._myParams.myPlayerLocomotionTeleport.isTeleporting() || !this._myParams.myDisableObscureWhileTeleporting || this._myDisableObscureWhileTeleportingTimer.isDone()) {\r\n // #TODO Check if VALID head is colliding, in that case use max obscure level\r\n // This prevent being able to see when resetting head to real even though real is colliding\r\n // For example if u stand up and go with the head in the ceiling and reset by moving\r\n // Add a setting for this though, since someone could prefer being able to see in this case,\r\n // so to be able to know where to move (since it might be resetting to this invalid position)\r\n if (!this._myParams.myPlayerTransformManager.isPositionHeadValid() && this._myParams.myObscureIfPositionHeadNotValid) {\r\n let targetObscureLevel = this._myParams.myObscureLevelRelativeDistanceEasingFunction(1);\r\n this._myTargetObscureLevel = Math.max(this._myTargetObscureLevel, targetObscureLevel);\r\n } else if (this._myParams.myPlayerTransformManager.isHeadColliding()) {\r\n let distance = this._myParams.myPlayerTransformManager.getDistanceToRealHead();\r\n let relativeDistance = distance - this._myParams.myDistanceToStartObscureWhenHeadColliding;\r\n if (relativeDistance >= 0) {\r\n let relativeDistancePercentage = Math.pp_clamp(relativeDistance / this._myParams.myRelativeDistanceToMaxObscureWhenHeadColliding, 0, 1);\r\n if (isNaN(relativeDistancePercentage)) {\r\n relativeDistancePercentage = 1;\r\n }\r\n let targetObscureLevel = this._myParams.myObscureLevelRelativeDistanceEasingFunction(relativeDistancePercentage);\r\n this._myTargetObscureLevel = Math.max(this._myTargetObscureLevel, targetObscureLevel);\r\n }\r\n }\r\n\r\n if (this._myParams.myPlayerTransformManager.isBodyColliding()) {\r\n let distance = this._myParams.myPlayerTransformManager.getDistanceToReal();\r\n let relativeDistance = distance - this._myParams.myDistanceToStartObscureWhenBodyColliding;\r\n if (relativeDistance >= 0) {\r\n let relativeDistancePercentage = Math.pp_clamp(relativeDistance / this._myParams.myRelativeDistanceToMaxObscureWhenBodyColliding, 0, 1);\r\n if (isNaN(relativeDistancePercentage)) {\r\n relativeDistancePercentage = 1;\r\n }\r\n let targetObscureLevel = this._myParams.myObscureLevelRelativeDistanceEasingFunction(relativeDistancePercentage);\r\n this._myTargetObscureLevel = Math.max(this._myTargetObscureLevel, targetObscureLevel);\r\n }\r\n }\r\n\r\n if (this._myParams.myPlayerTransformManager.isFloating()) {\r\n let distance = this._myParams.myPlayerTransformManager.getDistanceToReal();\r\n let relativeDistance = distance - this._myParams.myDistanceToStartObscureWhenFloating;\r\n if (relativeDistance >= 0) {\r\n let relativeDistancePercentage = Math.pp_clamp(relativeDistance / this._myParams.myRelativeDistanceToMaxObscureWhenFloating, 0, 1);\r\n if (isNaN(relativeDistancePercentage)) {\r\n relativeDistancePercentage = 1;\r\n }\r\n let targetObscureLevel = this._myParams.myObscureLevelRelativeDistanceEasingFunction(relativeDistancePercentage);\r\n this._myTargetObscureLevel = Math.max(this._myTargetObscureLevel, targetObscureLevel);\r\n }\r\n }\r\n\r\n if (this._myParams.myPlayerTransformManager.isFar()) {\r\n let distance = this._myParams.myPlayerTransformManager.getDistanceToReal();\r\n let relativeDistance = distance - this._myParams.myDistanceToStartObscureWhenFar;\r\n if (relativeDistance >= 0) {\r\n let relativeDistancePercentage = Math.pp_clamp(relativeDistance / this._myParams.myRelativeDistanceToMaxObscureWhenFar, 0, 1);\r\n if (isNaN(relativeDistancePercentage)) {\r\n relativeDistancePercentage = 1;\r\n }\r\n let targetObscureLevel = this._myParams.myObscureLevelRelativeDistanceEasingFunction(relativeDistancePercentage);\r\n this._myTargetObscureLevel = Math.max(this._myTargetObscureLevel, targetObscureLevel);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n _setupVisuals() {\r\n this._myObscureMaterial = null;\r\n if (this._myParams.myObscureMaterial != null) {\r\n this._myObscureMaterial = this._myParams.myObscureMaterial;\r\n } else {\r\n this._myObscureMaterial = Globals.getDefaultMaterials(this._myParams.myEngine).myFlatTransparentNoDepth.clone();\r\n this._myObscureMaterial.color = vec4_create(0, 0, 0, 1);\r\n }\r\n\r\n this._myObscureParentObject = Globals.getPlayerObjects(this._myParams.myEngine).myCauldron.pp_addChild();\r\n\r\n let obscureVisualParams = new VisualMeshParams(this._myParams.myEngine);\r\n obscureVisualParams.myMesh = Globals.getDefaultMeshes(this._myParams.myEngine).myInvertedSphere;\r\n obscureVisualParams.myMaterial = (this._myParams.myObscureMaterial != null) ? this._myParams.myObscureMaterial : this._myObscureMaterial;\r\n obscureVisualParams.myParent = this._myObscureParentObject;\r\n obscureVisualParams.myLocal = true;\r\n obscureVisualParams.myTransform.mat4_setScale(vec3_create(this._myParams.myObscureRadius, this._myParams.myObscureRadius, this._myParams.myObscureRadius));\r\n this._myObscureVisual = new VisualMesh(obscureVisualParams);\r\n\r\n if (this._myParams.myObscureObject != null) {\r\n this._myParams.myObscureObject.pp_setParent(this._myObscureParentObject, false);\r\n this._myParams.myObscureObject.pp_resetTransformLocal();\r\n }\r\n\r\n this._setObscureVisible(false);\r\n }\r\n\r\n _setObscureVisible(visible) {\r\n if (this._myParams.myObscureObject == null) {\r\n this._myObscureVisual.setVisible(visible);\r\n } else {\r\n this._myObscureVisual.setVisible(false);\r\n this._myParams.myObscureObject.pp_setActive(visible);\r\n }\r\n\r\n if (visible) {\r\n this._myObscureParentObject.pp_setParent(this._myParams.myPlayerTransformManager.getHead(), false);\r\n } else {\r\n this._myObscureParentObject.pp_setParent(Globals.getPlayerObjects(this._myParams.myEngine)?.myCauldron, false);\r\n }\r\n }\r\n\r\n _onXRSessionStart() {\r\n this._myInstantObscureFramesCount = 5;\r\n }\r\n\r\n _onXRSessionEnd() {\r\n this._myInstantObscureFramesCount = 5;\r\n }\r\n\r\n destroy() {\r\n this._myDestroyed = true;\r\n\r\n this._myObscureVisual.destroy();\r\n }\r\n\r\n isDestroyed() {\r\n return this._myDestroyed;\r\n }\r\n}", "import { PhysXComponent } from \"@wonderlandengine/api\";\r\nimport { PhysicsLayerFlags } from \"../../../../../../cauldron/physics/physics_layer_flags.js\";\r\nimport { RaycastBlockColliderType, RaycastParams, RaycastResults } from \"../../../../../../cauldron/physics/physics_raycast_params.js\";\r\nimport { PhysicsUtils } from \"../../../../../../cauldron/physics/physics_utils.js\";\r\nimport { XRUtils } from \"../../../../../../cauldron/utils/xr_utils.js\";\r\nimport { MouseButtonID } from \"../../../../../../input/cauldron/mouse.js\";\r\nimport { GamepadAxesID, GamepadButtonID } from \"../../../../../../input/gamepad/gamepad_buttons.js\";\r\nimport { quat2_create, quat_create, vec3_create, vec4_create } from \"../../../../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Globals } from \"../../../../../../pp/globals.js\";\r\nimport { CollisionRuntimeParams } from \"../../../../character_controller/collision/legacy/collision_check/collision_params.js\";\r\nimport { PlayerTransformManagerSyncFlag } from \"../player_transform_manager.js\";\r\nimport { PlayerLocomotionTeleportDetectionVisualizer } from \"./player_locomotion_teleport_detection_visualizer.js\";\r\nimport { PlayerLocomotionTeleportParable } from \"./player_locomotion_teleport_parable.js\";\r\nimport { PlayerLocomotionTeleportState } from \"./player_locomotion_teleport_state.js\";\r\n\r\nlet PlayerLocomotionTeleportDetectionTeleportHitValidResult = {\r\n VALID: 0,\r\n INVALID: 1,\r\n TOO_HIGH: 2\r\n};\r\n\r\nexport class PlayerLocomotionTeleportDetectionParams {\r\n\r\n constructor() {\r\n this.myMaxDistance = 0;\r\n this.myMaxHeightDifference = 0;\r\n\r\n // This can be used to make it so the teleport position is valid on a steeper angle when going downward by setting the higher value on the collision params\r\n // and then use this to specify that when going upward u want it to be less, basically to be able to teleprot down a cliff even on a steep ground\r\n // that would not let you go up\r\n this.myGroundAngleToIgnoreUpward = 0;\r\n\r\n this.myMustBeOnGround = false;\r\n this.myMustBeOnIgnorableGroundAngle = false;\r\n\r\n this.myTeleportBlockLayerFlags = new PhysicsLayerFlags();\r\n this.myTeleportBlockColliderType = RaycastBlockColliderType.BOTH;\r\n this.myTeleportFloorLayerFlags = new PhysicsLayerFlags();\r\n this.myTeleportFloorBlockColliderType = RaycastBlockColliderType.BOTH;\r\n\r\n this.myParableForwardMinAngleToBeValidUp = 30;\r\n this.myParableForwardMinAngleToBeValidDown = 0;\r\n\r\n this.myTeleportParableStartReferenceObject = null;\r\n\r\n // Used if reference is null\r\n this.myTeleportParableStartPositionOffset = vec3_create(0, -0.04, 0.08);\r\n this.myTeleportParableStartRotationOffset = vec3_create(30, 0, 0);\r\n\r\n this.myTeleportParableSpeed = 15;\r\n this.myTeleportParableGravity = -30;\r\n this.myTeleportParableStepLength = 0.25;\r\n\r\n this.myRotationOnUpMinStickIntensity = 0.5;\r\n this.myRotationOnUpEnabled = false;\r\n\r\n this.myTeleportFeetPositionMustBeVisible = false;\r\n this.myTeleportHeadPositionMustBeVisible = false;\r\n this.myTeleportHeadOrFeetPositionMustBeVisible = false; // Wins over previous parameters\r\n\r\n this.myVisibilityCheckRadius = 0.05;\r\n this.myVisibilityCheckFeetPositionVerticalOffset = 0.1;\r\n this.myVisibilityCheckDistanceFromHitThreshold = 0.1;\r\n this.myVisibilityCheckCircumferenceSliceAmount = 6;\r\n this.myVisibilityCheckCircumferenceStepAmount = 1;\r\n this.myVisibilityCheckCircumferenceRotationPerStep = 30;\r\n this.myVisibilityBlockLayerFlags = new PhysicsLayerFlags();\r\n this.myVisibilityBlockColliderType = RaycastBlockColliderType.BOTH;\r\n\r\n this.myPlayerTransformManagerMustBeSyncedFlagMap = new Map();\r\n this.myPlayerTransformManagerMustBeSyncedFlagMap.set(PlayerTransformManagerSyncFlag.BODY_COLLIDING, false);\r\n this.myPlayerTransformManagerMustBeSyncedFlagMap.set(PlayerTransformManagerSyncFlag.HEAD_COLLIDING, false);\r\n this.myPlayerTransformManagerMustBeSyncedFlagMap.set(PlayerTransformManagerSyncFlag.FAR, false);\r\n this.myPlayerTransformManagerMustBeSyncedFlagMap.set(PlayerTransformManagerSyncFlag.FLOATING, false);\r\n\r\n this.myPositionRealMaxDistance = null;\r\n this.myPositionHeadRealMaxDistance = null;\r\n\r\n this.myPositionHeadMustBeValid = false;\r\n }\r\n}\r\n\r\nexport class PlayerLocomotionTeleportDetectionRuntimeParams {\r\n\r\n constructor() {\r\n this.myTeleportDetectionValid = false;\r\n this.myTeleportPositionValid = false;\r\n this.myTeleportSurfaceNormal = vec3_create();\r\n this.myTeleportForward = vec3_create();\r\n\r\n this.myParable = new PlayerLocomotionTeleportParable();\r\n }\r\n}\r\n\r\nexport class PlayerLocomotionTeleportDetectionState extends PlayerLocomotionTeleportState {\r\n\r\n constructor(teleportParams, teleportRuntimeParams, locomotionRuntimeParams) {\r\n super(teleportParams, teleportRuntimeParams, locomotionRuntimeParams);\r\n\r\n this._myDetectionRuntimeParams = new PlayerLocomotionTeleportDetectionRuntimeParams();\r\n\r\n this._myVisualizer = new PlayerLocomotionTeleportDetectionVisualizer(this._myTeleportParams, this._myTeleportRuntimeParams, this._myDetectionRuntimeParams);\r\n\r\n this._myTeleportRotationOnUpQueue = [];\r\n for (let i = 0; i < 3; i++) {\r\n this._myTeleportRotationOnUpQueue.push(0);\r\n }\r\n\r\n //Globals.getEasyTuneVariables(this._myTeleportParams.myEngine).add(new EasyTuneNumber(\"Parable Steps\", this._myTeleportParams.myDetectionParams.myTeleportParableStepLength, 1, 3, 0.01, undefined, undefined, this._myTeleportParams.myEngine));\r\n //Globals.getEasyTuneVariables(this._myTeleportParams.myEngine).add(new EasyTuneNumber(\"Parable Gravity\", this._myTeleportParams.myDetectionParams.myTeleportParableGravity, 10, 3, undefined, undefined, undefined, this._myTeleportParams.myEngine));\r\n //Globals.getEasyTuneVariables(this._myTeleportParams.myEngine).add(new EasyTuneNumber(\"Parable Speed\", this._myTeleportParams.myDetectionParams.myTeleportParableSpeed, 10, 3, 0, undefined, undefined, this._myTeleportParams.myEngine));\r\n //Globals.getEasyTuneVariables(this._myTeleportParams.myEngine).add(new EasyTuneNumber(\"Teleport Max Distance\", this._myTeleportParams.myDetectionParams.myMaxDistance, 10, 3, 0, undefined, undefined, this._myTeleportParams.myEngine));\r\n\r\n this._myDestroyed = false;\r\n }\r\n\r\n start() {\r\n this._myLocomotionRuntimeParams.myIsTeleportDetecting = true;\r\n\r\n for (let i = 0; i < this._myTeleportRotationOnUpQueue.length; i++) {\r\n this._myTeleportRotationOnUpQueue[i] = 0;\r\n }\r\n\r\n this._myDetectionRuntimeParams.myTeleportPositionValid = false;\r\n\r\n this._myTeleportRuntimeParams.myTeleportPosition.vec3_zero();\r\n this._myTeleportRuntimeParams.myTeleportForward.vec3_zero();\r\n\r\n this._myDetectionRuntimeParams.myTeleportForward.vec3_zero();\r\n this._myDetectionRuntimeParams.myParable.setSpeed(this._myTeleportParams.myDetectionParams.myTeleportParableSpeed);\r\n this._myDetectionRuntimeParams.myParable.setGravity(this._myTeleportParams.myDetectionParams.myTeleportParableGravity);\r\n this._myDetectionRuntimeParams.myParable.setStepLength(this._myTeleportParams.myDetectionParams.myTeleportParableStepLength);\r\n\r\n this._myTeleportParams.myPlayerTransformManager.resetReal();\r\n\r\n this._myVisualizer.start();\r\n }\r\n\r\n end() {\r\n this._myLocomotionRuntimeParams.myIsTeleportDetecting = false;\r\n this._myVisualizer.end();\r\n }\r\n\r\n update(dt, fsm) {\r\n this._detectTeleportPosition();\r\n\r\n this._myVisualizer.update(dt);\r\n\r\n if (this._confirmTeleport()) {\r\n if (this._myDetectionRuntimeParams.myTeleportPositionValid) {\r\n fsm.perform(\"teleport\");\r\n } else {\r\n fsm.perform(\"cancel\");\r\n }\r\n } else if (this._cancelTeleport()) {\r\n fsm.perform(\"cancel\");\r\n }\r\n }\r\n\r\n _confirmTeleport() {\r\n let confirmTeleport = false;\r\n\r\n if (!XRUtils.isSessionActive(this._myTeleportParams.myEngine)) {\r\n if (Globals.getMouse(this._myTeleportParams.myEngine).isInsideView()) {\r\n confirmTeleport = Globals.getMouse(this._myTeleportParams.myEngine).isButtonPressEnd(MouseButtonID.MIDDLE);\r\n }\r\n } else {\r\n let axes = Globals.getGamepads(this._myTeleportParams.myEngine)[this._myTeleportParams.myHandedness].getAxesInfo(GamepadAxesID.THUMBSTICK).getAxes();\r\n if (axes.vec2_length() <= this._myTeleportParams.myStickIdleThreshold) {\r\n confirmTeleport = true;\r\n }\r\n }\r\n\r\n return confirmTeleport;\r\n }\r\n\r\n _cancelTeleport() {\r\n let cancelTeleport = false;\r\n\r\n if (!XRUtils.isSessionActive(this._myTeleportParams.myEngine)) {\r\n cancelTeleport = Globals.getMouse(this._myTeleportParams.myEngine).isButtonPressEnd(MouseButtonID.RIGHT) || !Globals.getMouse(this._myTeleportParams.myEngine).isInsideView();\r\n } else {\r\n cancelTeleport = Globals.getGamepads(this._myTeleportParams.myEngine)[this._myTeleportParams.myHandedness].getButtonInfo(GamepadButtonID.THUMBSTICK).isPressed();\r\n }\r\n\r\n return cancelTeleport;\r\n }\r\n\r\n _detectTeleportPosition() {\r\n //this._myDetectionRuntimeParams.myParable.setSpeed(Globals.getEasyTuneVariables(this._myTeleportParams.myEngine).get(\"Parable Speed\"));\r\n //this._myDetectionRuntimeParams.myParable.setGravity(Globals.getEasyTuneVariables(this._myTeleportParams.myEngine).get(\"Parable Gravity\"));\r\n //this._myDetectionRuntimeParams.myParable.setStepLength(Globals.getEasyTuneVariables(this._myTeleportParams.myEngine).get(\"Parable Steps\"));\r\n //this._myTeleportParams.myDetectionParams.myMaxDistance = Globals.getEasyTuneVariables(this._myTeleportParams.myEngine).get(\"Teleport Max Distance\");\r\n\r\n if (XRUtils.isSessionActive(this._myTeleportParams.myEngine)) {\r\n this._detectTeleportRotationVR();\r\n this._detectTeleportPositionVR();\r\n } else {\r\n this._detectTeleportPositionNonVR();\r\n }\r\n\r\n if (!this._myTeleportParams.myPlayerTransformManager.isSynced(this._myTeleportParams.myDetectionParams.myPlayerTransformManagerMustBeSyncedFlagMap)) {\r\n this._myDetectionRuntimeParams.myTeleportPositionValid = false;\r\n } else if (this._myTeleportParams.myDetectionParams.myPositionRealMaxDistance != null &&\r\n this._myTeleportParams.myPlayerTransformManager.getDistanceToReal() > this._myTeleportParams.myDetectionParams.myPositionRealMaxDistance) {\r\n this._myDetectionRuntimeParams.myTeleportPositionValid = false;\r\n } else if (this._myTeleportParams.myDetectionParams.myPositionHeadRealMaxDistance != null &&\r\n this._myTeleportParams.myPlayerTransformManager.getDistanceToRealHead() > this._myTeleportParams.myDetectionParams.myPositionHeadRealMaxDistance) {\r\n this._myDetectionRuntimeParams.myTeleportPositionValid = false;\r\n } else if (!this._myTeleportParams.myPlayerTransformManager.isPositionHeadValid() && this._myTeleportParams.myDetectionParams.myPositionHeadMustBeValid) {\r\n this._myDetectionRuntimeParams.myTeleportPositionValid = false;\r\n }\r\n }\r\n\r\n _isTeleportPositionValid(teleportPosition, teleportForward, checkTeleportCollisionRuntimeParams) {\r\n // Implemented outside class definition\r\n }\r\n\r\n _isTeleportHitValid(hit, teleportForward, checkTeleportCollisionRuntimeParams) {\r\n // Implemented outside class definition\r\n }\r\n\r\n _detectTeleportRotationVR(dt) {\r\n // Implemented outside class definition\r\n }\r\n\r\n destroy() {\r\n this._myDestroyed = true;\r\n\r\n this._myVisualizer.destroy();\r\n }\r\n\r\n isDestroyed() {\r\n return this._myDestroyed;\r\n }\r\n}\r\n\r\n\r\n\r\n// IMPLEMENTATION\r\n\r\nPlayerLocomotionTeleportDetectionState.prototype._detectTeleportPositionNonVR = function () {\r\n let mousePosition = vec3_create();\r\n let mouseDirection = vec3_create();\r\n\r\n let playerRotationQuat = quat_create();\r\n let playerUp = vec3_create();\r\n return function _detectTeleportPositionNonVR(dt) {\r\n this._myDetectionRuntimeParams.myTeleportPositionValid = false;\r\n this._myDetectionRuntimeParams.myTeleportDetectionValid = true;\r\n\r\n playerUp = this._myTeleportParams.myPlayerTransformManager.getRotationRealQuat(playerRotationQuat).quat_getUp(playerUp);\r\n\r\n Globals.getMouse(this._myTeleportParams.myEngine).getOriginWorld(mousePosition);\r\n Globals.getMouse(this._myTeleportParams.myEngine).getDirectionWorld(mouseDirection);\r\n\r\n this._detectTeleportPositionParable(mousePosition, mouseDirection, playerUp);\r\n };\r\n}();\r\n\r\nPlayerLocomotionTeleportDetectionState.prototype._detectTeleportPositionVR = function () {\r\n let teleportStartTransformLocal = quat2_create();\r\n let teleportStartTransformWorld = quat2_create();\r\n\r\n let teleportStartPosition = vec3_create();\r\n let teleportDirection = vec3_create();\r\n\r\n let playerRotationQuat = quat_create();\r\n let playerUp = vec3_create();\r\n let playerUpNegate = vec3_create();\r\n return function _detectTeleportPositionVR(dt) {\r\n this._myDetectionRuntimeParams.myTeleportPositionValid = false;\r\n this._myDetectionRuntimeParams.myTeleportDetectionValid = false;\r\n\r\n if (this._myTeleportParams.myDetectionParams.myTeleportParableStartReferenceObject == null) {\r\n let referenceObject = Globals.getPlayerObjects(this._myTeleportParams.myEngine).myHands[this._myTeleportParams.myHandedness];\r\n\r\n teleportStartTransformLocal.quat2_setPositionRotationDegrees(this._myTeleportParams.myDetectionParams.myTeleportParableStartPositionOffset, this._myTeleportParams.myDetectionParams.myTeleportParableStartRotationOffset);\r\n teleportStartTransformWorld = referenceObject.pp_convertTransformObjectToWorldQuat(teleportStartTransformLocal, teleportStartTransformWorld);\r\n } else {\r\n let referenceObject = this._myTeleportParams.myDetectionParams.myTeleportParableStartReferenceObject;\r\n\r\n referenceObject.pp_getTransformQuat(teleportStartTransformWorld);\r\n }\r\n\r\n teleportStartPosition = teleportStartTransformWorld.quat2_getPosition(teleportStartPosition);\r\n teleportDirection = teleportStartTransformWorld.quat2_getForward(teleportDirection);\r\n\r\n playerUp = this._myTeleportParams.myPlayerTransformManager.getRotationRealQuat(playerRotationQuat).quat_getUp(playerUp);\r\n playerUpNegate = playerUp.vec3_negate(playerUpNegate);\r\n\r\n if (teleportDirection.vec3_angle(playerUp) >= this._myTeleportParams.myDetectionParams.myParableForwardMinAngleToBeValidUp &&\r\n teleportDirection.vec3_angle(playerUpNegate) >= this._myTeleportParams.myDetectionParams.myParableForwardMinAngleToBeValidDown\r\n ) {\r\n this._myDetectionRuntimeParams.myTeleportDetectionValid = true;\r\n }\r\n\r\n if (this._myDetectionRuntimeParams.myTeleportDetectionValid) {\r\n this._detectTeleportPositionParable(teleportStartPosition, teleportDirection, playerUp);\r\n }\r\n };\r\n}();\r\n\r\nPlayerLocomotionTeleportDetectionState.prototype._detectTeleportRotationVR = function () {\r\n let axesVec3 = vec3_create();\r\n let axesForward = vec3_create(0, 0, 1);\r\n let axesUp = vec3_create(0, 1, 0);\r\n let playerUp = vec3_create();\r\n let teleportRotationQuat = quat_create();\r\n return function _detectTeleportRotationVR(dt) {\r\n if (this._myTeleportParams.myDetectionParams.myRotationOnUpEnabled) {\r\n let axes = Globals.getGamepads(this._myTeleportParams.myEngine)[this._myTeleportParams.myHandedness].getAxesInfo(GamepadAxesID.THUMBSTICK).getAxes();\r\n\r\n if (axes.vec2_length() > this._myTeleportParams.myDetectionParams.myRotationOnUpMinStickIntensity) {\r\n this._myTeleportParams.myPlayerTransformManager.getRotationRealQuat(teleportRotationQuat);\r\n teleportRotationQuat.quat_getUp(playerUp);\r\n\r\n if (this._myTeleportRotationOnUpQueue[0] != 0) {\r\n teleportRotationQuat.quat_rotateAxis(this._myTeleportRotationOnUpQueue[0], playerUp, teleportRotationQuat);\r\n teleportRotationQuat.quat2_getForward(this._myTeleportRuntimeParams.myTeleportForward);\r\n } else {\r\n this._myTeleportRuntimeParams.myTeleportForward.vec3_zero();\r\n }\r\n\r\n axesVec3.vec3_set(axes[0], 0, axes[1]);\r\n const currentRotationOnUp = axesVec3.vec3_angleSigned(axesForward, axesUp);\r\n\r\n for (let i = 0; i < this._myTeleportRotationOnUpQueue.length - 1; i++) {\r\n this._myTeleportRotationOnUpQueue[i] = this._myTeleportRotationOnUpQueue[i + 1];\r\n }\r\n\r\n this._myTeleportRotationOnUpQueue[this._myTeleportRotationOnUpQueue.length - 1] = currentRotationOnUp;\r\n\r\n if (currentRotationOnUp != 0) {\r\n this._myTeleportParams.myPlayerTransformManager.getRotationRealQuat(teleportRotationQuat);\r\n\r\n teleportRotationQuat.quat_rotateAxis(currentRotationOnUp, playerUp, teleportRotationQuat);\r\n teleportRotationQuat.quat2_getForward(this._myDetectionRuntimeParams.myTeleportForward);\r\n } else {\r\n this._myDetectionRuntimeParams.myTeleportForward.vec3_zero();\r\n }\r\n }\r\n }\r\n };\r\n}();\r\n\r\nPlayerLocomotionTeleportDetectionState.prototype._detectTeleportPositionParable = function () {\r\n let parablePosition = vec3_create();\r\n let prevParablePosition = vec3_create();\r\n let parableFinalPosition = vec3_create();\r\n\r\n let raycastParams = null;\r\n let raycastResult = new RaycastResults();\r\n\r\n let parableHitPosition = vec3_create();\r\n let parableHitNormal = vec3_create();\r\n\r\n let verticalHitOrigin = vec3_create();\r\n let verticalHitDirection = vec3_create();\r\n\r\n let flatTeleportHorizontalHitNormal = vec3_create();\r\n let flatParableHitNormal = vec3_create();\r\n let flatParableDirectionNegate = vec3_create();\r\n\r\n let teleportCollisionRuntimeParams = new CollisionRuntimeParams();\r\n\r\n let objectsEqualCallback = (first, second) => first == second;\r\n return function _detectTeleportPositionParable(startPosition, direction, up) {\r\n this._myDetectionRuntimeParams.myParable.setStartPosition(startPosition);\r\n this._myDetectionRuntimeParams.myParable.setForward(direction);\r\n this._myDetectionRuntimeParams.myParable.setUp(up);\r\n\r\n let currentPositionIndex = 1;\r\n let positionFlatDistance = 0;\r\n let positionParableDistance = 0;\r\n prevParablePosition = this._myDetectionRuntimeParams.myParable.getPosition(currentPositionIndex - 1, prevParablePosition);\r\n\r\n let teleportCollisionCheckParams = this._myTeleportParams.myPlayerTransformManager.getTeleportCollisionCheckParams();\r\n\r\n if (raycastParams == null) {\r\n raycastParams = new RaycastParams(this._myTeleportParams.myEngine);\r\n }\r\n\r\n raycastParams.myIgnoreHitsInsideCollision = true;\r\n raycastParams.myBlockLayerFlags.setMask(this._myTeleportParams.myDetectionParams.myTeleportBlockLayerFlags.getMask());\r\n raycastParams.myBlockColliderType = this._myTeleportParams.myDetectionParams.myTeleportBlockColliderType;\r\n raycastParams.myPhysics = Globals.getPhysics(this._myTeleportParams.myEngine);\r\n\r\n raycastParams.myObjectsToIgnore.pp_copy(teleportCollisionCheckParams.myHorizontalObjectsToIgnore);\r\n for (let objectToIgnore of teleportCollisionCheckParams.myVerticalObjectsToIgnore) {\r\n raycastParams.myObjectsToIgnore.pp_pushUnique(objectToIgnore, objectsEqualCallback);\r\n }\r\n\r\n let maxParableDistance = this._myTeleportParams.myDetectionParams.myMaxDistance * 2;\r\n\r\n do {\r\n parablePosition = this._myDetectionRuntimeParams.myParable.getPosition(currentPositionIndex, parablePosition);\r\n\r\n raycastParams.myOrigin.vec3_copy(prevParablePosition);\r\n raycastParams.myDirection = parablePosition.vec3_sub(prevParablePosition, raycastParams.myDirection);\r\n raycastParams.myDistance = raycastParams.myDirection.vec3_length();\r\n raycastParams.myDirection.vec3_normalize(raycastParams.myDirection);\r\n\r\n raycastResult = PhysicsUtils.raycast(raycastParams, raycastResult);\r\n\r\n if (this._myTeleportParams.myDebugEnabled && this._myTeleportParams.myDebugDetectEnabled && Globals.isDebugEnabled(this._myTeleportParams.myEngine)) {\r\n Globals.getDebugVisualManager(this._myTeleportParams.myEngine).drawRaycast(0, raycastResult);\r\n }\r\n\r\n prevParablePosition.vec3_copy(parablePosition);\r\n positionFlatDistance = parablePosition.vec3_sub(startPosition, parablePosition).vec3_removeComponentAlongAxis(up, parablePosition).vec3_length();\r\n positionParableDistance = this._myDetectionRuntimeParams.myParable.getDistance(currentPositionIndex);\r\n\r\n currentPositionIndex++;\r\n } while (\r\n positionFlatDistance <= this._myTeleportParams.myDetectionParams.myMaxDistance &&\r\n positionParableDistance <= maxParableDistance &&\r\n !raycastResult.isColliding());\r\n\r\n let maxParableDistanceOverFlatDistance = this._myDetectionRuntimeParams.myParable.getDistanceOverFlatDistance(this._myTeleportParams.myDetectionParams.myMaxDistance, maxParableDistance);\r\n\r\n let fixedPositionParableDistance = positionParableDistance;\r\n if (positionParableDistance > maxParableDistanceOverFlatDistance || positionParableDistance > maxParableDistance) {\r\n fixedPositionParableDistance = Math.min(maxParableDistanceOverFlatDistance, maxParableDistance);\r\n }\r\n\r\n this._myDetectionRuntimeParams.myParableDistance = fixedPositionParableDistance;\r\n\r\n let hitCollisionValid = false;\r\n\r\n let bottomCheckMaxLength = 100;\r\n\r\n if (raycastResult.isColliding()) {\r\n let hit = raycastResult.myHits.pp_first();\r\n\r\n let hitParableDistance = positionParableDistance - (raycastParams.myDistance - hit.myDistance);\r\n\r\n if (hitParableDistance <= fixedPositionParableDistance) {\r\n hitCollisionValid = true;\r\n\r\n this._myDetectionRuntimeParams.myParableDistance = hitParableDistance;\r\n\r\n teleportCollisionRuntimeParams.reset();\r\n this._myDetectionRuntimeParams.myTeleportPositionValid = this._isTeleportHitValid(hit, this._myTeleportRuntimeParams.myTeleportForward, teleportCollisionRuntimeParams) == PlayerLocomotionTeleportDetectionTeleportHitValidResult.VALID;\r\n\r\n this._myTeleportRuntimeParams.myTeleportPosition.vec3_copy(teleportCollisionRuntimeParams.myNewPosition);\r\n this._myDetectionRuntimeParams.myTeleportSurfaceNormal.vec3_copy(teleportCollisionRuntimeParams.myGroundNormal);\r\n\r\n parableHitPosition.vec3_copy(hit.myPosition);\r\n parableHitNormal.vec3_copy(hit.myNormal);\r\n\r\n if (!this._myDetectionRuntimeParams.myTeleportPositionValid && !this._myTeleportAsMovementFailed) {\r\n verticalHitOrigin = hit.myPosition.vec3_add(hit.myNormal.vec3_scale(0.01, verticalHitOrigin), verticalHitOrigin);\r\n verticalHitDirection = up.vec3_negate(verticalHitDirection);\r\n\r\n raycastParams.myOrigin.vec3_copy(verticalHitOrigin);\r\n raycastParams.myDirection.vec3_copy(verticalHitDirection);\r\n raycastParams.myDistance = bottomCheckMaxLength;\r\n\r\n raycastResult = PhysicsUtils.raycast(raycastParams, raycastResult);\r\n\r\n if (this._myTeleportParams.myDebugEnabled && this._myTeleportParams.myDebugDetectEnabled && Globals.isDebugEnabled(this._myTeleportParams.myEngine)) {\r\n Globals.getDebugVisualManager(this._myTeleportParams.myEngine).drawRaycast(0, raycastResult);\r\n }\r\n\r\n if (raycastResult.isColliding()) {\r\n let hit = raycastResult.myHits.pp_first();\r\n\r\n teleportCollisionRuntimeParams.reset();\r\n let teleportHitValidResult = this._isTeleportHitValid(hit, this._myTeleportRuntimeParams.myTeleportForward, teleportCollisionRuntimeParams);\r\n this._myDetectionRuntimeParams.myTeleportPositionValid = teleportHitValidResult == PlayerLocomotionTeleportDetectionTeleportHitValidResult.VALID;\r\n\r\n this._myTeleportRuntimeParams.myTeleportPosition.vec3_copy(teleportCollisionRuntimeParams.myNewPosition);\r\n this._myDetectionRuntimeParams.myTeleportSurfaceNormal.vec3_copy(teleportCollisionRuntimeParams.myGroundNormal);\r\n\r\n let teleportPositionIsTooHigh = teleportHitValidResult == PlayerLocomotionTeleportDetectionTeleportHitValidResult.TOO_HIGH;\r\n\r\n if (!teleportPositionIsTooHigh) {\r\n if (!this._myDetectionRuntimeParams.myTeleportPositionValid &&\r\n !this._myTeleportAsMovementFailed &&\r\n teleportCollisionRuntimeParams.myTeleportCanceled &&\r\n teleportCollisionRuntimeParams.myIsCollidingHorizontally) {\r\n flatTeleportHorizontalHitNormal = teleportCollisionRuntimeParams.myHorizontalCollisionHit.myNormal.vec3_removeComponentAlongAxis(up, flatTeleportHorizontalHitNormal);\r\n\r\n if (!flatTeleportHorizontalHitNormal.vec3_isZero(0.00001)) {\r\n flatTeleportHorizontalHitNormal.vec3_normalize(flatTeleportHorizontalHitNormal);\r\n\r\n let backwardStep = teleportCollisionCheckParams.myRadius * 1.1;\r\n raycastParams.myOrigin = verticalHitOrigin.vec3_add(flatTeleportHorizontalHitNormal.vec3_scale(backwardStep, raycastParams.myOrigin), raycastParams.myOrigin);\r\n raycastParams.myDirection.vec3_copy(verticalHitDirection);\r\n raycastParams.myDistance = bottomCheckMaxLength;\r\n\r\n raycastResult = PhysicsUtils.raycast(raycastParams, raycastResult);\r\n\r\n if (this._myTeleportParams.myDebugEnabled && this._myTeleportParams.myDebugDetectEnabled && Globals.isDebugEnabled(this._myTeleportParams.myEngine)) {\r\n Globals.getDebugVisualManager(this._myTeleportParams.myEngine).drawPoint(0, raycastParams.myOrigin, vec4_create(0, 0, 0, 1), 0.03);\r\n Globals.getDebugVisualManager(this._myTeleportParams.myEngine).drawRaycast(0, raycastResult);\r\n }\r\n\r\n if (raycastResult.isColliding()) {\r\n let hit = raycastResult.myHits.pp_first();\r\n\r\n teleportCollisionRuntimeParams.reset();\r\n this._myDetectionRuntimeParams.myTeleportPositionValid = this._isTeleportHitValid(hit, this._myTeleportRuntimeParams.myTeleportForward, teleportCollisionRuntimeParams) == PlayerLocomotionTeleportDetectionTeleportHitValidResult.VALID;\r\n\r\n this._myTeleportRuntimeParams.myTeleportPosition.vec3_copy(teleportCollisionRuntimeParams.myNewPosition);\r\n this._myDetectionRuntimeParams.myTeleportSurfaceNormal.vec3_copy(teleportCollisionRuntimeParams.myGroundNormal);\r\n }\r\n }\r\n } else {\r\n //console.error(\"2\", this._myDetectionRuntimeParams.myTeleportPositionValid, this._myTeleportAsMovementFailed);\r\n }\r\n\r\n if (!this._myDetectionRuntimeParams.myTeleportPositionValid && !this._myTeleportAsMovementFailed) {\r\n flatParableHitNormal = parableHitNormal.vec3_removeComponentAlongAxis(up, flatParableHitNormal);\r\n if (!flatParableHitNormal.vec3_isZero(0.00001)) {\r\n flatParableHitNormal.vec3_normalize(flatParableHitNormal);\r\n\r\n let backwardStep = teleportCollisionCheckParams.myRadius * 1.1;\r\n raycastParams.myOrigin = verticalHitOrigin.vec3_add(flatParableHitNormal.vec3_scale(backwardStep, raycastParams.myOrigin), raycastParams.myOrigin);\r\n raycastParams.myDirection.vec3_copy(verticalHitDirection);\r\n raycastParams.myDistance = bottomCheckMaxLength;\r\n\r\n raycastResult = PhysicsUtils.raycast(raycastParams, raycastResult);\r\n\r\n if (this._myTeleportParams.myDebugEnabled && this._myTeleportParams.myDebugDetectEnabled && Globals.isDebugEnabled(this._myTeleportParams.myEngine)) {\r\n Globals.getDebugVisualManager(this._myTeleportParams.myEngine).drawPoint(0, raycastParams.myOrigin, vec4_create(0, 0, 0, 1), 0.03);\r\n Globals.getDebugVisualManager(this._myTeleportParams.myEngine).drawRaycast(0, raycastResult);\r\n }\r\n\r\n if (raycastResult.isColliding()) {\r\n let hit = raycastResult.myHits.pp_first();\r\n\r\n teleportCollisionRuntimeParams.reset();\r\n this._myDetectionRuntimeParams.myTeleportPositionValid = this._isTeleportHitValid(hit, this._myTeleportRuntimeParams.myTeleportForward, teleportCollisionRuntimeParams) == PlayerLocomotionTeleportDetectionTeleportHitValidResult.VALID;\r\n\r\n this._myTeleportRuntimeParams.myTeleportPosition.vec3_copy(teleportCollisionRuntimeParams.myNewPosition);\r\n this._myDetectionRuntimeParams.myTeleportSurfaceNormal.vec3_copy(teleportCollisionRuntimeParams.myGroundNormal);\r\n }\r\n }\r\n } else {\r\n //console.error(\"3\", this._myDetectionRuntimeParams.myTeleportPositionValid, this._myTeleportAsMovementFailed);\r\n }\r\n\r\n if (!this._myDetectionRuntimeParams.myTeleportPositionValid && !this._myTeleportAsMovementFailed) {\r\n flatParableDirectionNegate = direction.vec3_negate(flatParableDirectionNegate).vec3_removeComponentAlongAxis(up, flatParableDirectionNegate).vec3_normalize(flatParableDirectionNegate);\r\n\r\n if (!flatParableDirectionNegate.vec3_isZero(0.00001)) {\r\n flatParableDirectionNegate.vec3_normalize(flatParableDirectionNegate);\r\n\r\n let backwardStep = teleportCollisionCheckParams.myRadius * 1.1;\r\n raycastParams.myOrigin = verticalHitOrigin.vec3_add(flatParableDirectionNegate.vec3_scale(backwardStep, raycastParams.myOrigin), raycastParams.myOrigin);\r\n raycastParams.myDirection.vec3_copy(verticalHitDirection);\r\n raycastParams.myDistance = bottomCheckMaxLength;\r\n\r\n raycastResult = PhysicsUtils.raycast(raycastParams, raycastResult);\r\n\r\n if (this._myTeleportParams.myDebugEnabled && this._myTeleportParams.myDebugDetectEnabled && Globals.isDebugEnabled(this._myTeleportParams.myEngine)) {\r\n Globals.getDebugVisualManager(this._myTeleportParams.myEngine).drawPoint(0, raycastParams.myOrigin, vec4_create(0, 0, 0, 1), 0.03);\r\n Globals.getDebugVisualManager(this._myTeleportParams.myEngine).drawRaycast(0, raycastResult);\r\n }\r\n\r\n if (raycastResult.isColliding()) {\r\n let hit = raycastResult.myHits.pp_first();\r\n\r\n teleportCollisionRuntimeParams.reset();\r\n this._myDetectionRuntimeParams.myTeleportPositionValid = this._isTeleportHitValid(hit, this._myTeleportRuntimeParams.myTeleportForward, teleportCollisionRuntimeParams) == PlayerLocomotionTeleportDetectionTeleportHitValidResult.VALID;\r\n\r\n this._myTeleportRuntimeParams.myTeleportPosition.vec3_copy(teleportCollisionRuntimeParams.myNewPosition);\r\n this._myDetectionRuntimeParams.myTeleportSurfaceNormal.vec3_copy(teleportCollisionRuntimeParams.myGroundNormal);\r\n }\r\n }\r\n } else {\r\n //console.error(\"4\", this._myDetectionRuntimeParams.myTeleportPositionValid, this._myTeleportAsMovementFailed);\r\n }\r\n }\r\n }\r\n } else {\r\n //console.error(\"1\", this._myDetectionRuntimeParams.myTeleportPositionValid, this._myTeleportAsMovementFailed);\r\n }\r\n }\r\n }\r\n\r\n //console.error(\"-\");\r\n\r\n if (!hitCollisionValid) {\r\n parableFinalPosition = this._myDetectionRuntimeParams.myParable.getPositionByDistance(this._myDetectionRuntimeParams.myParableDistance, parableFinalPosition);\r\n\r\n verticalHitOrigin.vec3_copy(parableFinalPosition);\r\n verticalHitDirection = up.vec3_negate(verticalHitDirection);\r\n\r\n raycastParams.myOrigin.vec3_copy(verticalHitOrigin);\r\n raycastParams.myDirection.vec3_copy(verticalHitDirection);\r\n raycastParams.myDistance = bottomCheckMaxLength;\r\n\r\n raycastResult = PhysicsUtils.raycast(raycastParams, raycastResult);\r\n\r\n if (this._myTeleportParams.myDebugEnabled && this._myTeleportParams.myDebugDetectEnabled && Globals.isDebugEnabled(this._myTeleportParams.myEngine)) {\r\n Globals.getDebugVisualManager(this._myTeleportParams.myEngine).drawRaycast(0, raycastResult);\r\n }\r\n\r\n if (raycastResult.isColliding()) {\r\n let hit = raycastResult.myHits.pp_first();\r\n\r\n teleportCollisionRuntimeParams.reset();\r\n let teleportHitValidResult = this._isTeleportHitValid(hit, this._myTeleportRuntimeParams.myTeleportForward, teleportCollisionRuntimeParams);\r\n this._myDetectionRuntimeParams.myTeleportPositionValid = teleportHitValidResult == PlayerLocomotionTeleportDetectionTeleportHitValidResult.VALID;\r\n\r\n this._myTeleportRuntimeParams.myTeleportPosition.vec3_copy(teleportCollisionRuntimeParams.myNewPosition);\r\n this._myDetectionRuntimeParams.myTeleportSurfaceNormal.vec3_copy(teleportCollisionRuntimeParams.myGroundNormal);\r\n\r\n let teleportPositionIsTooHigh = teleportHitValidResult == PlayerLocomotionTeleportDetectionTeleportHitValidResult.TOO_HIGH;\r\n\r\n if (!teleportPositionIsTooHigh) {\r\n if (!this._myDetectionRuntimeParams.myTeleportPositionValid &&\r\n !this._myTeleportAsMovementFailed &&\r\n teleportCollisionRuntimeParams.myTeleportCanceled &&\r\n teleportCollisionRuntimeParams.myIsCollidingHorizontally) {\r\n flatTeleportHorizontalHitNormal = teleportCollisionRuntimeParams.myHorizontalCollisionHit.myNormal.vec3_removeComponentAlongAxis(up, flatTeleportHorizontalHitNormal);\r\n\r\n if (!flatTeleportHorizontalHitNormal.vec3_isZero(0.00001)) {\r\n flatTeleportHorizontalHitNormal.vec3_normalize(flatTeleportHorizontalHitNormal);\r\n\r\n let backwardStep = teleportCollisionCheckParams.myRadius * 1.1;\r\n raycastParams.myOrigin = verticalHitOrigin.vec3_add(flatTeleportHorizontalHitNormal.vec3_scale(backwardStep, raycastParams.myOrigin), raycastParams.myOrigin);\r\n raycastParams.myDirection.vec3_copy(verticalHitDirection);\r\n raycastParams.myDistance = bottomCheckMaxLength;\r\n\r\n raycastResult = PhysicsUtils.raycast(raycastParams, raycastResult);\r\n\r\n if (this._myTeleportParams.myDebugEnabled && this._myTeleportParams.myDebugDetectEnabled && Globals.isDebugEnabled(this._myTeleportParams.myEngine)) {\r\n Globals.getDebugVisualManager(this._myTeleportParams.myEngine).drawPoint(0, raycastParams.myOrigin, vec4_create(0, 0, 0, 1), 0.03);\r\n Globals.getDebugVisualManager(this._myTeleportParams.myEngine).drawRaycast(0, raycastResult);\r\n }\r\n\r\n if (raycastResult.isColliding()) {\r\n let hit = raycastResult.myHits.pp_first();\r\n\r\n teleportCollisionRuntimeParams.reset();\r\n this._myDetectionRuntimeParams.myTeleportPositionValid = this._isTeleportHitValid(hit, this._myTeleportRuntimeParams.myTeleportForward, teleportCollisionRuntimeParams) == PlayerLocomotionTeleportDetectionTeleportHitValidResult.VALID;\r\n\r\n this._myTeleportRuntimeParams.myTeleportPosition.vec3_copy(teleportCollisionRuntimeParams.myNewPosition);\r\n this._myDetectionRuntimeParams.myTeleportSurfaceNormal.vec3_copy(teleportCollisionRuntimeParams.myGroundNormal);\r\n }\r\n }\r\n }\r\n\r\n if (!this._myDetectionRuntimeParams.myTeleportPositionValid && !this._myTeleportAsMovementFailed) {\r\n flatParableDirectionNegate = direction.vec3_negate(flatParableDirectionNegate).vec3_removeComponentAlongAxis(up, flatParableDirectionNegate).vec3_normalize(flatParableDirectionNegate);\r\n\r\n if (!flatParableDirectionNegate.vec3_isZero(0.00001)) {\r\n flatParableDirectionNegate.vec3_normalize(flatParableDirectionNegate);\r\n\r\n let backwardStep = teleportCollisionCheckParams.myRadius * 1.1;\r\n raycastParams.myOrigin = verticalHitOrigin.vec3_add(flatParableDirectionNegate.vec3_scale(backwardStep, raycastParams.myOrigin), raycastParams.myOrigin);\r\n raycastParams.myDirection.vec3_copy(verticalHitDirection);\r\n raycastParams.myDistance = bottomCheckMaxLength;\r\n\r\n raycastResult = PhysicsUtils.raycast(raycastParams, raycastResult);\r\n\r\n if (this._myTeleportParams.myDebugEnabled && this._myTeleportParams.myDebugDetectEnabled && Globals.isDebugEnabled(this._myTeleportParams.myEngine)) {\r\n Globals.getDebugVisualManager(this._myTeleportParams.myEngine).drawPoint(0, raycastParams.myOrigin, vec4_create(0, 0, 0, 1), 0.03);\r\n Globals.getDebugVisualManager(this._myTeleportParams.myEngine).drawRaycast(0, raycastResult);\r\n }\r\n\r\n if (raycastResult.isColliding()) {\r\n let hit = raycastResult.myHits.pp_first();\r\n\r\n teleportCollisionRuntimeParams.reset();\r\n this._myDetectionRuntimeParams.myTeleportPositionValid = this._isTeleportHitValid(hit, this._myTeleportRuntimeParams.myTeleportForward, teleportCollisionRuntimeParams) == PlayerLocomotionTeleportDetectionTeleportHitValidResult.VALID;\r\n\r\n this._myTeleportRuntimeParams.myTeleportPosition.vec3_copy(teleportCollisionRuntimeParams.myNewPosition);\r\n this._myDetectionRuntimeParams.myTeleportSurfaceNormal.vec3_copy(teleportCollisionRuntimeParams.myGroundNormal);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n };\r\n}();\r\n\r\nPlayerLocomotionTeleportDetectionState.prototype._isTeleportHitValid = function () {\r\n let playerRotationQuat = quat_create();\r\n let playerUp = vec3_create();\r\n return function _isTeleportHitValid(hit, teleportForward, checkTeleportCollisionRuntimeParams) {\r\n let isValid = PlayerLocomotionTeleportDetectionTeleportHitValidResult.INVALID;\r\n\r\n this._myTeleportAsMovementFailed = false;\r\n\r\n if (hit.isValid() && !hit.myInsideCollision) {\r\n playerUp = this._myTeleportParams.myPlayerTransformManager.getRotationRealQuat(playerRotationQuat).quat_getUp(playerUp);\r\n\r\n // #TODO is hitValidEvenWhenNotConcordant needed or was it a debug that should be removed?\r\n let hitValidEvenWhenNotConcordant = true;\r\n if (hit.myNormal.vec3_isConcordant(playerUp) || hitValidEvenWhenNotConcordant) {\r\n const physxComponent = hit.myObject.pp_getComponentSelf(PhysXComponent);\r\n if (physxComponent.groupsMask & this._myTeleportParams.myDetectionParams.myTeleportFloorLayerFlags.getMask() &&\r\n (this._myTeleportParams.myDetectionParams.myTeleportFloorBlockColliderType == RaycastBlockColliderType.BOTH ||\r\n (this._myTeleportParams.myDetectionParams.myTeleportFloorBlockColliderType == RaycastBlockColliderType.TRIGGER && physxComponent.trigger) ||\r\n (this._myTeleportParams.myDetectionParams.myTeleportFloorBlockColliderType == RaycastBlockColliderType.NORMAL && !physxComponent.trigger)\r\n )) {\r\n isValid = this._isTeleportPositionValid(hit.myPosition, teleportForward, checkTeleportCollisionRuntimeParams);\r\n }\r\n }\r\n }\r\n\r\n return isValid;\r\n };\r\n}();\r\n\r\nPlayerLocomotionTeleportDetectionState.prototype._isTeleportPositionValid = function () {\r\n let playerUp = vec3_create();\r\n let teleportRotationQuat = quat_create();\r\n let feetPosition = vec3_create();\r\n let differenceOnUpVector = vec3_create();\r\n let teleportCheckCollisionRuntimeParams = new CollisionRuntimeParams();\r\n return function _isTeleportPositionValid(teleportPosition, teleportForward, checkTeleportCollisionRuntimeParams) {\r\n let isValid = PlayerLocomotionTeleportDetectionTeleportHitValidResult.INVALID;\r\n\r\n let positionVisible = this._isTeleportPositionVisible(teleportPosition);\r\n\r\n if (positionVisible) {\r\n this._myTeleportParams.myPlayerTransformManager.getRotationRealQuat(teleportRotationQuat);\r\n teleportRotationQuat.quat_getUp(playerUp);\r\n\r\n if (!teleportForward.vec3_isZero(0.00001)) {\r\n teleportRotationQuat.quat_setUp(playerUp, teleportForward);\r\n }\r\n\r\n this._myTeleportParams.myPlayerTransformManager.getPosition(feetPosition);\r\n let differenceOnUp = teleportPosition.vec3_sub(feetPosition, differenceOnUpVector).vec3_componentAlongAxis(playerUp, differenceOnUpVector).vec3_length();\r\n\r\n if (differenceOnUp < this._myTeleportParams.myDetectionParams.myMaxHeightDifference + 0.00001) {\r\n let teleportCheckValid = false;\r\n teleportCheckCollisionRuntimeParams.copy(this._myTeleportParams.myPlayerTransformManager.getCollisionRuntimeParams());\r\n\r\n if (!this._myTeleportParams.myPerformTeleportAsMovement) {\r\n this._checkTeleport(teleportPosition, teleportRotationQuat, teleportCheckCollisionRuntimeParams, checkTeleportCollisionRuntimeParams);\r\n } else {\r\n this._checkTeleportAsMovement(teleportPosition, teleportRotationQuat, teleportCheckCollisionRuntimeParams, checkTeleportCollisionRuntimeParams);\r\n }\r\n\r\n if (!teleportCheckCollisionRuntimeParams.myTeleportCanceled) {\r\n teleportCheckValid = true;\r\n }\r\n\r\n let teleportCollisionCheckParams = this._myTeleportParams.myPlayerTransformManager.getTeleportCollisionCheckParams();\r\n if (teleportCheckValid &&\r\n (!this._myTeleportParams.myDetectionParams.myMustBeOnGround || teleportCheckCollisionRuntimeParams.myIsOnGround) &&\r\n (!this._myTeleportParams.myDetectionParams.myMustBeOnIgnorableGroundAngle ||\r\n (teleportCheckCollisionRuntimeParams.myGroundAngle < teleportCollisionCheckParams.myGroundAngleToIgnore + 0.0001))) {\r\n let groundAngleValid = true;\r\n let isTeleportingUpward = teleportCheckCollisionRuntimeParams.myNewPosition.vec3_isFartherAlongAxis(feetPosition, playerUp);\r\n if (isTeleportingUpward) {\r\n groundAngleValid = teleportCheckCollisionRuntimeParams.myGroundAngle < this._myTeleportParams.myDetectionParams.myGroundAngleToIgnoreUpward + 0.0001;\r\n }\r\n\r\n if (groundAngleValid) {\r\n isValid = PlayerLocomotionTeleportDetectionTeleportHitValidResult.VALID;\r\n }\r\n }\r\n } else {\r\n isValid = PlayerLocomotionTeleportDetectionTeleportHitValidResult.TOO_HIGH;\r\n }\r\n }\r\n\r\n return isValid;\r\n };\r\n}();\r\n\r\nPlayerLocomotionTeleportDetectionState.prototype._isTeleportPositionVisible = function () {\r\n let playerRotationQuat = quat_create();\r\n let playerUp = vec3_create();\r\n\r\n let offsetFeetTeleportPosition = vec3_create();\r\n let headTeleportPosition = vec3_create();\r\n return function _isTeleportPositionVisible(teleportPosition) {\r\n let isVisible = true;\r\n\r\n if (this._myTeleportParams.myDetectionParams.myTeleportFeetPositionMustBeVisible ||\r\n this._myTeleportParams.myDetectionParams.myTeleportHeadPositionMustBeVisible ||\r\n this._myTeleportParams.myDetectionParams.myTeleportHeadOrFeetPositionMustBeVisible) {\r\n\r\n playerUp = this._myTeleportParams.myPlayerTransformManager.getRotationRealQuat(playerRotationQuat).quat_getUp(playerUp);\r\n let isHeadVisible = false;\r\n let isFeetVisible = false;\r\n\r\n if (this._myTeleportParams.myDetectionParams.myTeleportHeadOrFeetPositionMustBeVisible ||\r\n this._myTeleportParams.myDetectionParams.myTeleportHeadPositionMustBeVisible) {\r\n let headheight = this._myTeleportParams.myPlayerTransformManager.getHeightReal();\r\n headTeleportPosition = teleportPosition.vec3_add(playerUp.vec3_scale(headheight, headTeleportPosition), headTeleportPosition);\r\n isHeadVisible = this._isPositionVisible(headTeleportPosition);\r\n } else {\r\n isHeadVisible = true;\r\n }\r\n\r\n if (this._myTeleportParams.myDetectionParams.myTeleportHeadOrFeetPositionMustBeVisible && isHeadVisible) {\r\n isFeetVisible = true;\r\n } else {\r\n if (this._myTeleportParams.myDetectionParams.myTeleportHeadOrFeetPositionMustBeVisible ||\r\n (this._myTeleportParams.myDetectionParams.myTeleportFeetPositionMustBeVisible && isHeadVisible)) {\r\n offsetFeetTeleportPosition = teleportPosition.vec3_add(playerUp.vec3_scale(this._myTeleportParams.myDetectionParams.myVisibilityCheckFeetPositionVerticalOffset, offsetFeetTeleportPosition), offsetFeetTeleportPosition);\r\n isFeetVisible = this._isPositionVisible(offsetFeetTeleportPosition);\r\n } else {\r\n isFeetVisible = true;\r\n }\r\n }\r\n\r\n isVisible = isHeadVisible && isFeetVisible;\r\n }\r\n\r\n return isVisible;\r\n };\r\n}();\r\n\r\nPlayerLocomotionTeleportDetectionState.prototype._isPositionVisible = function () {\r\n let playerRotationQuat = quat_create();\r\n let playerUp = vec3_create();\r\n let playerPosition = vec3_create();\r\n let headPosition = vec3_create();\r\n\r\n let standardUp = vec3_create(0, 1, 0);\r\n let standardUpNegated = vec3_create(0, -1, 0);\r\n let standardForward = vec3_create(0, 0, 1);\r\n let referenceUp = vec3_create();\r\n let direction = vec3_create();\r\n let fixedRight = vec3_create();\r\n let fixedForward = vec3_create();\r\n let fixedUp = vec3_create();\r\n let raycastEndPosition = vec3_create();\r\n\r\n let raycastParams = null;\r\n let raycastResult = new RaycastResults();\r\n\r\n let objectsEqualCallback = (first, second) => first == second;\r\n return function _isPositionVisible(position) {\r\n let isVisible = true;\r\n\r\n playerUp = this._myTeleportParams.myPlayerTransformManager.getRotationQuat(playerRotationQuat).quat_getUp(playerUp);\r\n this._myTeleportParams.myPlayerTransformManager.getPosition(playerPosition);\r\n let headheight = this._myTeleportParams.myPlayerTransformManager.getHeight();\r\n playerPosition.vec3_add(playerUp.vec3_scale(headheight, headPosition), headPosition);\r\n\r\n direction = position.vec3_sub(headPosition, direction).vec3_normalize(direction);\r\n\r\n referenceUp.vec3_copy(standardUp);\r\n if (direction.vec3_angle(standardUp) < 0.0001 || direction.vec3_angle(standardUpNegated) < 0.0001) {\r\n referenceUp.vec3_copy(standardForward);\r\n }\r\n\r\n fixedRight = direction.vec3_cross(referenceUp, fixedRight);\r\n fixedUp = fixedRight.vec3_cross(direction, fixedUp);\r\n fixedForward.vec3_copy(direction);\r\n\r\n fixedUp.vec3_normalize(fixedUp);\r\n fixedForward.vec3_normalize(fixedForward);\r\n\r\n let checkPositions = this._getVisibilityCheckPositions(headPosition, fixedUp, fixedForward);\r\n\r\n let distance = headPosition.vec3_distance(position);\r\n\r\n if (raycastParams == null) {\r\n raycastParams = new RaycastParams(this._myTeleportParams.myEngine);\r\n }\r\n\r\n let teleportCollisionCheckParams = this._myTeleportParams.myPlayerTransformManager.getTeleportCollisionCheckParams();\r\n for (let checkPosition of checkPositions) {\r\n raycastParams.myOrigin.vec3_copy(checkPosition);\r\n raycastParams.myDirection.vec3_copy(fixedForward);\r\n raycastParams.myDistance = distance;\r\n raycastParams.myPhysics = Globals.getPhysics(this._myTeleportParams.myEngine);\r\n\r\n raycastParams.myBlockLayerFlags.setMask(this._myTeleportParams.myDetectionParams.myVisibilityBlockLayerFlags.getMask());\r\n raycastParams.myBlockColliderType = this._myTeleportParams.myDetectionParams.myVisibilityBlockColliderType;\r\n\r\n raycastParams.myObjectsToIgnore.pp_copy(teleportCollisionCheckParams.myHorizontalObjectsToIgnore);\r\n for (let objectToIgnore of teleportCollisionCheckParams.myVerticalObjectsToIgnore) {\r\n raycastParams.myObjectsToIgnore.pp_pushUnique(objectToIgnore, objectsEqualCallback);\r\n }\r\n\r\n raycastParams.myIgnoreHitsInsideCollision = true;\r\n\r\n raycastResult = PhysicsUtils.raycast(raycastParams, raycastResult);\r\n\r\n if (this._myTeleportParams.myDebugEnabled && this._myTeleportParams.myDebugVisibilityEnabled && Globals.isDebugEnabled(this._myTeleportParams.myEngine)) {\r\n Globals.getDebugVisualManager(this._myTeleportParams.myEngine).drawRaycast(0, raycastResult);\r\n }\r\n\r\n if (raycastResult.isColliding()) {\r\n raycastEndPosition = checkPosition.vec3_add(fixedForward.vec3_scale(distance, raycastEndPosition), raycastEndPosition);\r\n let hit = raycastResult.myHits.pp_first();\r\n\r\n if (this._myTeleportParams.myDetectionParams.myVisibilityCheckDistanceFromHitThreshold == 0 || hit.myPosition.vec3_distance(raycastEndPosition) > this._myTeleportParams.myDetectionParams.myVisibilityCheckDistanceFromHitThreshold + 0.00001) {\r\n isVisible = false;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return isVisible;\r\n };\r\n}();\r\n\r\nPlayerLocomotionTeleportDetectionState.prototype._getVisibilityCheckPositions = function () {\r\n let checkPositions = [];\r\n let cachedCheckPositions = [];\r\n let currentCachedCheckPositionIndex = 0;\r\n let _localGetCachedCheckPosition = function () {\r\n let item = null;\r\n while (cachedCheckPositions.length <= currentCachedCheckPositionIndex) {\r\n cachedCheckPositions.push(vec3_create());\r\n }\r\n\r\n item = cachedCheckPositions[currentCachedCheckPositionIndex];\r\n currentCachedCheckPositionIndex++;\r\n return item;\r\n };\r\n\r\n let currentDirection = vec3_create();\r\n return function _getVisibilityCheckPositions(position, up, forward) {\r\n checkPositions.length = 0;\r\n currentCachedCheckPositionIndex = 0;\r\n\r\n {\r\n let tempCheckPosition = _localGetCachedCheckPosition();\r\n tempCheckPosition.vec3_copy(position);\r\n checkPositions.push(tempCheckPosition);\r\n }\r\n\r\n let radiusStep = this._myTeleportParams.myDetectionParams.myVisibilityCheckRadius / this._myTeleportParams.myDetectionParams.myVisibilityCheckCircumferenceStepAmount;\r\n let sliceAngle = 360 / this._myTeleportParams.myDetectionParams.myVisibilityCheckCircumferenceSliceAmount;\r\n let currentStepRotation = 0;\r\n for (let i = 0; i < this._myTeleportParams.myDetectionParams.myVisibilityCheckCircumferenceStepAmount; i++) {\r\n let currentRadius = radiusStep * (i + 1);\r\n\r\n currentDirection = up.vec3_rotateAxis(currentStepRotation, forward, currentDirection);\r\n for (let j = 0; j < this._myTeleportParams.myDetectionParams.myVisibilityCheckCircumferenceSliceAmount; j++) {\r\n let tempCheckPosition = _localGetCachedCheckPosition();\r\n let sliceDirection = currentDirection.vec3_rotateAxis(sliceAngle * j, forward, tempCheckPosition);\r\n checkPositions.push(position.vec3_add(sliceDirection.vec3_scale(currentRadius, sliceDirection), sliceDirection));\r\n }\r\n\r\n currentStepRotation += this._myTeleportParams.myDetectionParams.myVisibilityCheckCircumferenceRotationPerStep;\r\n }\r\n\r\n return checkPositions;\r\n };\r\n}();", "import { VisualArrow, VisualArrowParams } from \"../../../../../../cauldron/visual/elements/visual_arrow.js\";\r\nimport { VisualLine, VisualLineParams } from \"../../../../../../cauldron/visual/elements/visual_line.js\";\r\nimport { VisualPoint, VisualPointParams } from \"../../../../../../cauldron/visual/elements/visual_point.js\";\r\nimport { VisualTorus, VisualTorusParams } from \"../../../../../../cauldron/visual/elements/visual_torus.js\";\r\nimport { quat2_create, quat_create, vec3_create, vec4_create } from \"../../../../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Globals } from \"../../../../../../pp/globals.js\";\r\n\r\nexport class PlayerLocomotionTeleportDetectionVisualizerParams {\r\n\r\n constructor() {\r\n this.myTeleportValidMaterial = null;\r\n this.myTeleportInvalidMaterial = null;\r\n\r\n this.myTeleportPositionObject = null;\r\n this.myTeleportPositionObjectRotateWithHead = true;\r\n\r\n this.myTeleportParableLineEndOffset = 0.05;\r\n this.myTeleportParableMinVerticalDistanceToShowVerticalLine = 0.80;\r\n this.myTeleportParableShowVerticalLineMaxLength = 0.30;\r\n\r\n this.myTeleportParablePositionUpOffset = 0.05;\r\n\r\n this.myTeleportParablePositionVisualAlignOnSurface = true;\r\n\r\n this.myVisualTeleportPositionLerpEnabled = true;\r\n this.myVisualTeleportPositionLerpFactor = 10;\r\n this.myVisualTeleportPositionMinDistanceToResetLerp = 0.005;\r\n this.myVisualTeleportPositionMinDistanceToLerp = 0.15;\r\n this.myVisualTeleportPositionMaxDistanceToLerp = 5;\r\n\r\n this.myVisualTeleportPositionMinDistanceToCloseLerpFactor = 0.02;\r\n this.myVisualTeleportPositionCloseLerpFactor = 30;\r\n\r\n this.myVisualTeleportPositionMinAngleDistanceToResetLerp = 0.1;\r\n this.myVisualTeleportPositionMinAngleDistanceToLerp = 1;\r\n this.myVisualTeleportPositionMaxAngleDistanceToLerp = 180;\r\n }\r\n}\r\n\r\nexport class PlayerLocomotionTeleportDetectionVisualizer {\r\n\r\n constructor(teleportParams, teleportRuntimeParams, detectionRuntimeParams) {\r\n this._myDetectionRuntimeParams = detectionRuntimeParams;\r\n\r\n this._myTeleportParams = teleportParams;\r\n this._myTeleportRuntimeParams = teleportRuntimeParams;\r\n\r\n this._myVisualTeleportTransformQuatReset = true;\r\n this._myVisualTeleportTransformQuat = quat2_create();\r\n this._myVisualTeleportTransformPositionLerping = false;\r\n this._myVisualTeleportTransformRotationLerping = false;\r\n\r\n //Globals.getEasyTuneVariables(this._myTeleportParams.myEngine).add(new EasyTuneNumber(\"Teleport Min Distance Lerp\", this._myTeleportParams.myVisualizerParams.myVisualTeleportPositionMinDistanceToLerp, 1, 3, 0, undefined, undefined, this._myTeleportParams.myEngine));\r\n //Globals.getEasyTuneVariables(this._myTeleportParams.myEngine).add(new EasyTuneNumber(\"Teleport Max Distance Lerp\", this._myTeleportParams.myVisualizerParams.myVisualTeleportPositionMaxDistanceToLerp, 1, 3, 0, undefined, undefined, this._myTeleportParams.myEngine));\r\n //Globals.getEasyTuneVariables(this._myTeleportParams.myEngine).add(new EasyTuneNumber(\"Teleport Min Angle Distance Lerp\", this._myTeleportParams.myVisualizerParams.myVisualTeleportPositionMinAngleDistanceToLerp, 10, 3, 0, undefined, undefined, this._myTeleportParams.myEngine));\r\n //Globals.getEasyTuneVariables(this._myTeleportParams.myEngine).add(new EasyTuneNumber(\"Teleport Max Angle Distance Lerp\", this._myTeleportParams.myVisualizerParams.myVisualTeleportPositionMaxAngleDistanceToLerp, 10, 3, 0, undefined, undefined, this._myTeleportParams.myEngine));\r\n\r\n this._setupVisuals();\r\n\r\n this._myDestroyed = false;\r\n }\r\n\r\n start() {\r\n\r\n }\r\n\r\n end() {\r\n this._myVisualTeleportTransformQuatReset = true;\r\n this._myVisualTeleportTransformPositionLerping = false;\r\n this._myVisualTeleportTransformRotationLerping = false;\r\n\r\n this._hideTeleportPosition();\r\n }\r\n\r\n update(dt) {\r\n //this._myTeleportParams.myVisualizerParams.myVisualTeleportPositionMinDistanceToLerp = Globals.getEasyTuneVariables(this._myTeleportParams.myEngine).get(\"Teleport Min Distance Lerp\");\r\n //this._myTeleportParams.myVisualizerParams.myVisualTeleportPositionMaxDistanceToLerp = Globals.getEasyTuneVariables(this._myTeleportParams.myEngine).get(\"Teleport Max Distance Lerp\");\r\n //this._myTeleportParams.myVisualizerParams.myVisualTeleportPositionMinAngleDistanceToLerp = Globals.getEasyTuneVariables(this._myTeleportParams.myEngine).get(\"Teleport Min Angle Distance Lerp\");\r\n //this._myTeleportParams.myVisualizerParams.myVisualTeleportPositionMaxAngleDistanceToLerp = Globals.getEasyTuneVariables(this._myTeleportParams.myEngine).get(\"Teleport Max Angle Distance Lerp\");\r\n\r\n if (this._myDetectionRuntimeParams.myTeleportDetectionValid) {\r\n this._showTeleportPosition(dt);\r\n } else {\r\n this._myVisualTeleportTransformQuatReset = true;\r\n this._myVisualTeleportTransformPositionLerping = false;\r\n this._myVisualTeleportTransformRotationLerping = false;\r\n this._hideTeleportPosition();\r\n }\r\n }\r\n\r\n _showTeleportPosition(dt) {\r\n this._showTeleportParable(dt);\r\n }\r\n\r\n _hideTeleportPosition() {\r\n for (let visualLine of this._myValidVisualLines) {\r\n visualLine.setVisible(false);\r\n }\r\n\r\n for (let visualLine of this._myInvalidVisualLines) {\r\n visualLine.setVisible(false);\r\n }\r\n\r\n this._myValidVisualPoint.setVisible(false);\r\n this._myInvalidVisualPoint.setVisible(false);\r\n\r\n this._myValidVisualVerticalArrow.setVisible(false);\r\n\r\n this._myValidVisualTeleportPositionTorus.setVisible(false);\r\n this._myValidVisualTeleportPositionTorusInner.setVisible(false);\r\n\r\n if (this._myTeleportParams.myVisualizerParams.myTeleportPositionObject != null) {\r\n this._myTeleportParams.myVisualizerParams.myTeleportPositionObject.pp_setActive(false);\r\n }\r\n }\r\n\r\n _addVisualLines(amount) {\r\n for (let i = 0; i < amount; i++) {\r\n {\r\n let visualParams = new VisualLineParams(this._myTeleportParams.myEngine);\r\n\r\n if (this._myTeleportParams.myVisualizerParams.myTeleportValidMaterial != null) {\r\n visualParams.myMaterial = this._myTeleportParams.myVisualizerParams.myTeleportValidMaterial;\r\n } else {\r\n visualParams.myMaterial = this._myTeleportValidMaterial;\r\n }\r\n\r\n this._myValidVisualLines.push(new VisualLine(visualParams));\r\n }\r\n\r\n {\r\n let visualParams = new VisualLineParams(this._myTeleportParams.myEngine);\r\n\r\n if (this._myTeleportParams.myVisualizerParams.myTeleportValidMaterial != null) {\r\n visualParams.myMaterial = this._myTeleportParams.myVisualizerParams.myTeleportInvalidMaterial;\r\n } else {\r\n visualParams.myMaterial = this._myTeleportInvalidMaterial;\r\n }\r\n\r\n this._myInvalidVisualLines.push(new VisualLine(visualParams));\r\n }\r\n }\r\n }\r\n\r\n _showTeleportParablePosition(dt) {\r\n // Implemented outside class definition\r\n }\r\n\r\n _showTeleportParable(dt) {\r\n // Implemented outside class definition\r\n }\r\n\r\n _setupVisuals() {\r\n // Implemented outside class definition\r\n }\r\n\r\n destroy() {\r\n this._myDestroyed = true;\r\n\r\n for (let visual of this._myValidVisualLines) {\r\n visual.destroy();\r\n }\r\n\r\n for (let visual of this._myInvalidVisualLines) {\r\n visual.destroy();\r\n }\r\n\r\n this._myValidVisualPoint.destroy();\r\n this._myInvalidVisualPoint.destroy();\r\n\r\n this._myValidVisualVerticalArrow.destroy();\r\n this._myValidVisualTeleportPositionTorus.destroy();\r\n this._myValidVisualTeleportPositionTorusInner.destroy();\r\n }\r\n\r\n isDestroyed() {\r\n return this._myDestroyed;\r\n }\r\n}\r\n\r\n\r\n\r\n// IMPLEMENTATION\r\n\r\nPlayerLocomotionTeleportDetectionVisualizer.prototype._setupVisuals = function () {\r\n let innerTorusPosition = vec3_create();\r\n return function _setupVisuals() {\r\n this._myTeleportValidMaterial = Globals.getDefaultMaterials(this._myTeleportParams.myEngine).myFlatOpaque.clone();\r\n this._myTeleportValidMaterial.color = vec4_create(0, 0.5, 1, 1);\r\n this._myTeleportInvalidMaterial = Globals.getDefaultMaterials(this._myTeleportParams.myEngine).myFlatOpaque.clone();\r\n this._myTeleportInvalidMaterial.color = vec4_create(0.75, 0.05, 0, 1);\r\n\r\n this._myValidVisualLines = [];\r\n this._myInvalidVisualLines = [];\r\n this._addVisualLines(30);\r\n\r\n {\r\n let visualParams = new VisualPointParams(this._myTeleportParams.myEngine);\r\n\r\n if (this._myTeleportParams.myVisualizerParams.myTeleportValidMaterial != null) {\r\n visualParams.myMaterial = this._myTeleportParams.myVisualizerParams.myTeleportValidMaterial;\r\n } else {\r\n visualParams.myMaterial = this._myTeleportValidMaterial;\r\n }\r\n\r\n this._myValidVisualPoint = new VisualPoint(visualParams);\r\n }\r\n\r\n {\r\n let visualParams = new VisualPointParams(this._myTeleportParams.myEngine);\r\n\r\n if (this._myTeleportParams.myVisualizerParams.myTeleportInvalidMaterial != null) {\r\n visualParams.myMaterial = this._myTeleportParams.myVisualizerParams.myTeleportInvalidMaterial;\r\n } else {\r\n visualParams.myMaterial = this._myTeleportInvalidMaterial;\r\n }\r\n\r\n this._myInvalidVisualPoint = new VisualPoint(visualParams);\r\n }\r\n\r\n {\r\n let visualParams = new VisualArrowParams(this._myTeleportParams.myEngine);\r\n\r\n if (this._myTeleportParams.myVisualizerParams.myTeleportValidMaterial != null) {\r\n visualParams.myMaterial = this._myTeleportParams.myVisualizerParams.myTeleportValidMaterial;\r\n } else {\r\n visualParams.myMaterial = this._myTeleportValidMaterial;\r\n }\r\n\r\n this._myValidVisualVerticalArrow = new VisualArrow(visualParams);\r\n }\r\n\r\n this._myVisualTeleportPositionObject = Globals.getPlayerObjects(this._myTeleportParams.myEngine).myCauldron.pp_addChild();\r\n\r\n //Globals.getEasyTuneVariables(this._myTeleportParams.myEngine).add(new EasyTuneNumber(\"Teleport Torus Radius\", 0.175, 0.1, 3, undefined, undefined, undefined, this._myTeleportParams.myEngine));\r\n //Globals.getEasyTuneVariables(this._myTeleportParams.myEngine).add(new EasyTuneInt(\"Teleport Torus Segments\", 24, 1, undefined, undefined, undefined, this._myTeleportParams.myEngine));\r\n //Globals.getEasyTuneVariables(this._myTeleportParams.myEngine).add(new EasyTuneNumber(\"Teleport Torus Thickness\", 0.02, 0.1, 3, undefined, undefined, undefined, this._myTeleportParams.myEngine));\r\n\r\n //Globals.getEasyTuneVariables(this._myTeleportParams.myEngine).add(new EasyTuneNumber(\"Teleport Torus Inner Radius\", 0.04, 0.1, 3, undefined, undefined, undefined, this._myTeleportParams.myEngine));\r\n\r\n {\r\n let visualParams = new VisualTorusParams(this._myTeleportParams.myEngine);\r\n visualParams.myRadius = 0.175;\r\n visualParams.mySegmentsAmount = 24;\r\n visualParams.mySegmentThickness = 0.02;\r\n\r\n //visualParams.myRadius = Globals.getEasyTuneVariables(this._myTeleportParams.myEngine).get(\"Teleport Torus Radius\");\r\n //visualParams.mySegmentsAmount = Globals.getEasyTuneVariables(this._myTeleportParams.myEngine).get(\"Teleport Torus Segments\");\r\n //visualParams.mySegmentThickness = Globals.getEasyTuneVariables(this._myTeleportParams.myEngine).get(\"Teleport Torus Thickness\");\r\n\r\n if (this._myTeleportParams.myVisualizerParams.myTeleportValidMaterial != null) {\r\n visualParams.myMaterial = this._myTeleportParams.myVisualizerParams.myTeleportValidMaterial;\r\n } else {\r\n visualParams.myMaterial = this._myTeleportValidMaterial;\r\n }\r\n\r\n visualParams.myParent = this._myVisualTeleportPositionObject;\r\n visualParams.myLocal = true;\r\n\r\n this._myValidVisualTeleportPositionTorus = new VisualTorus(visualParams);\r\n }\r\n\r\n {\r\n let visualParams = new VisualTorusParams(this._myTeleportParams.myEngine);\r\n visualParams.myRadius = 0.04;\r\n visualParams.mySegmentsAmount = 24;\r\n visualParams.mySegmentThickness = 0.02;\r\n\r\n //visualParams.myRadius = Globals.getEasyTuneVariables(this._myTeleportParams.myEngine).get(\"Teleport Torus Inner Radius\");\r\n //visualParams.mySegmentsAmount = Globals.getEasyTuneVariables(this._myTeleportParams.myEngine).get(\"Teleport Torus Segments\");\r\n //visualParams.mySegmentThickness = Globals.getEasyTuneVariables(this._myTeleportParams.myEngine).get(\"Teleport Torus Thickness\");\r\n\r\n if (this._myTeleportParams.myVisualizerParams.myTeleportValidMaterial != null) {\r\n visualParams.myMaterial = this._myTeleportParams.myVisualizerParams.myTeleportValidMaterial;\r\n } else {\r\n visualParams.myMaterial = this._myTeleportValidMaterial;\r\n }\r\n\r\n visualParams.myParent = this._myVisualTeleportPositionObject;\r\n visualParams.myLocal = true;\r\n\r\n let visualTorusParams = this._myValidVisualTeleportPositionTorus.getParams();\r\n\r\n let innerTorusCenter = (visualTorusParams.myRadius - (visualTorusParams.mySegmentThickness / 2)) / 2;\r\n innerTorusPosition.vec3_set(0, 0, innerTorusCenter);\r\n\r\n visualParams.myTransform.mat4_setPosition(innerTorusPosition);\r\n\r\n this._myValidVisualTeleportPositionTorusInner = new VisualTorus(visualParams);\r\n }\r\n\r\n if (this._myTeleportParams.myVisualizerParams.myTeleportPositionObject != null) {\r\n this._myTeleportParams.myVisualizerParams.myTeleportPositionObject.pp_setParent(this._myVisualTeleportPositionObject);\r\n this._myTeleportParams.myVisualizerParams.myTeleportPositionObject.pp_resetTransformLocal();\r\n this._myTeleportParams.myVisualizerParams.myTeleportPositionObject.pp_setActive(false);\r\n }\r\n\r\n this._hideTeleportPosition();\r\n };\r\n}();\r\n\r\nPlayerLocomotionTeleportDetectionVisualizer.prototype._showTeleportParable = function () {\r\n let currentPosition = vec3_create();\r\n let nextPosition = vec3_create();\r\n\r\n let playerRotationQuat = quat_create();\r\n let playerUp = vec3_create();\r\n let upDifference = vec3_create();\r\n return function _showTeleportParable(dt) {\r\n let showParableDistance = Math.max(this._myDetectionRuntimeParams.myParableDistance - this._myTeleportParams.myVisualizerParams.myTeleportParableLineEndOffset);\r\n let lastParableIndex = this._myDetectionRuntimeParams.myParable.getPositionIndexByDistance(showParableDistance);\r\n let lastParableIndexDistance = this._myDetectionRuntimeParams.myParable.getDistance(lastParableIndex);\r\n\r\n if (lastParableIndex + 1 > this._myValidVisualLines.length) {\r\n this._addVisualLines(lastParableIndex + 1, this._myValidVisualLines.length);\r\n }\r\n\r\n const usedVisualLines = [];\r\n for (let i = 0; i <= lastParableIndex; i++) {\r\n currentPosition = this._myDetectionRuntimeParams.myParable.getPosition(i, currentPosition);\r\n nextPosition = this._myDetectionRuntimeParams.myParable.getPosition(i + 1, nextPosition);\r\n\r\n let visuaLine = (this._myDetectionRuntimeParams.myTeleportPositionValid) ? this._myValidVisualLines[i] : this._myInvalidVisualLines[i];\r\n usedVisualLines.push(visuaLine);\r\n\r\n let currentVisualLineParams = visuaLine.getParams();\r\n\r\n if (i == lastParableIndex) {\r\n let stepLength = Math.max(0, showParableDistance - lastParableIndexDistance);\r\n nextPosition = nextPosition.vec3_sub(currentPosition, nextPosition).vec3_normalize(nextPosition);\r\n nextPosition = currentPosition.vec3_add(nextPosition.vec3_scale(stepLength, nextPosition), nextPosition);\r\n }\r\n\r\n currentVisualLineParams.setStartEnd(currentPosition, nextPosition);\r\n currentVisualLineParams.myThickness = 0.005;\r\n\r\n visuaLine.paramsUpdated();\r\n visuaLine.setVisible(true);\r\n\r\n if (this._myTeleportParams.myDebugEnabled && this._myTeleportParams.myDebugShowEnabled && Globals.isDebugEnabled(this._myTeleportParams.myEngine)) {\r\n Globals.getDebugVisualManager(this._myTeleportParams.myEngine).drawPoint(0, currentPosition, vec4_create(1, 0, 0, 1), 0.01);\r\n }\r\n }\r\n\r\n for (let visualLine of this._myValidVisualLines) {\r\n if (usedVisualLines.indexOf(visualLine) == -1) {\r\n visualLine.setVisible(false);\r\n }\r\n }\r\n\r\n for (let visualLine of this._myInvalidVisualLines) {\r\n if (usedVisualLines.indexOf(visualLine) == -1) {\r\n visualLine.setVisible(false);\r\n }\r\n }\r\n\r\n let visualPoint = (this._myDetectionRuntimeParams.myTeleportPositionValid) ? this._myValidVisualPoint : this._myInvalidVisualPoint;\r\n let visualPointParams = visualPoint.getParams();\r\n visualPointParams.myPosition.vec3_copy(nextPosition);\r\n visualPointParams.myRadius = 0.01;\r\n visualPoint.paramsUpdated();\r\n visualPoint.setVisible(true);\r\n\r\n let unusedVisualPoint = (this._myDetectionRuntimeParams.myTeleportPositionValid) ? this._myInvalidVisualPoint : this._myValidVisualPoint;\r\n unusedVisualPoint.setVisible(false);\r\n\r\n if (this._myDetectionRuntimeParams.myTeleportPositionValid) {\r\n playerUp = this._myTeleportParams.myPlayerTransformManager.getRotationRealQuat(playerRotationQuat).quat_getUp(playerUp);\r\n\r\n upDifference = nextPosition.vec3_sub(this._myTeleportRuntimeParams.myTeleportPosition, upDifference).vec3_componentAlongAxis(playerUp, upDifference);\r\n let upDistance = upDifference.vec3_valueAlongAxis(playerUp);\r\n if (upDistance >= this._myTeleportParams.myVisualizerParams.myTeleportParableMinVerticalDistanceToShowVerticalLine) {\r\n let lineLength = Math.min(upDistance - this._myTeleportParams.myVisualizerParams.myTeleportParableMinVerticalDistanceToShowVerticalLine, this._myTeleportParams.myVisualizerParams.myTeleportParableShowVerticalLineMaxLength);\r\n\r\n let visualArrowParams = this._myValidVisualVerticalArrow.getParams();\r\n\r\n visualArrowParams.myStart.vec3_copy(nextPosition);\r\n visualArrowParams.myDirection = playerUp.vec3_negate(visualArrowParams.myDirection);\r\n visualArrowParams.myLength = lineLength;\r\n visualArrowParams.myThickness = 0.005;\r\n\r\n visualArrowParams.myArrowThickness = visualPointParams.myRadius;\r\n visualArrowParams.myArrowLength = visualArrowParams.myArrowThickness * 3.5 / 1.5;\r\n\r\n this._myValidVisualVerticalArrow.paramsUpdated();\r\n this._myValidVisualVerticalArrow.setVisible(true);\r\n } else {\r\n this._myValidVisualVerticalArrow.setVisible(false);\r\n }\r\n\r\n this._showTeleportParablePosition(dt);\r\n } else {\r\n this._myValidVisualTeleportPositionTorus.setVisible(false);\r\n this._myValidVisualTeleportPositionTorusInner.setVisible(false);\r\n\r\n this._myValidVisualVerticalArrow.setVisible(false);\r\n\r\n if (this._myTeleportParams.myVisualizerParams.myTeleportPositionObject != null) {\r\n this._myTeleportParams.myVisualizerParams.myTeleportPositionObject.pp_setActive(false);\r\n }\r\n\r\n this._myVisualTeleportTransformQuatReset = true;\r\n this._myVisualTeleportTransformPositionLerping = false;\r\n this._myVisualTeleportTransformRotationLerping = false;\r\n }\r\n };\r\n}();\r\n\r\nPlayerLocomotionTeleportDetectionVisualizer.prototype._showTeleportParablePosition = function () {\r\n let playerUp = vec3_create();\r\n let feetRotationQuat = quat_create();\r\n\r\n let parableFirstPosition = vec3_create();\r\n let parableSecondPosition = vec3_create();\r\n let parableDirection = vec3_create();\r\n\r\n let visualPosition = vec3_create();\r\n let visualForward = vec3_create();\r\n let visualRotationQuat = quat_create();\r\n\r\n let currentVisualTeleportTransformQuat = quat2_create();\r\n let currentVisualTeleportPosition = vec3_create();\r\n let currentVisualTeleportRotationQuat = quat_create();\r\n let differenceRotationQuat = quat_create();\r\n\r\n return function _showTeleportParablePosition(dt) {\r\n this._myTeleportParams.myPlayerTransformManager.getRotationRealQuat(feetRotationQuat);\r\n feetRotationQuat.quat_getUp(playerUp);\r\n\r\n visualPosition = this._myTeleportRuntimeParams.myTeleportPosition.vec3_add(playerUp.vec3_scale(this._myTeleportParams.myVisualizerParams.myTeleportParablePositionUpOffset, visualPosition), visualPosition);\r\n\r\n if (!this._myDetectionRuntimeParams.myTeleportForward.vec3_isZero(0.00001)) {\r\n visualForward.vec3_copy(this._myDetectionRuntimeParams.myTeleportForward);\r\n } else {\r\n feetRotationQuat.quat_getForward(visualForward);\r\n }\r\n\r\n if (!this._myTeleportParams.myVisualizerParams.myTeleportPositionObjectRotateWithHead) {\r\n parableFirstPosition = this._myDetectionRuntimeParams.myParable.getPosition(0, parableFirstPosition);\r\n parableSecondPosition = this._myDetectionRuntimeParams.myParable.getPosition(1, parableSecondPosition);\r\n parableDirection = parableSecondPosition.vec3_sub(parableFirstPosition, parableDirection).vec3_removeComponentAlongAxis(playerUp, parableDirection);\r\n if (parableDirection.vec3_length() > Math.PP_EPSILON) {\r\n visualForward = parableDirection.vec3_normalize(visualForward);\r\n }\r\n }\r\n\r\n if (this._myTeleportParams.myVisualizerParams.myTeleportParablePositionVisualAlignOnSurface) {\r\n visualRotationQuat.quat_setUp(this._myDetectionRuntimeParams.myTeleportSurfaceNormal, visualForward);\r\n } else {\r\n visualRotationQuat.quat_setUp(playerUp, visualForward);\r\n }\r\n\r\n this._myVisualTeleportTransformQuat.quat2_setPositionRotationQuat(visualPosition, visualRotationQuat);\r\n\r\n if (this._myVisualTeleportTransformQuatReset || !this._myTeleportParams.myVisualizerParams.myVisualTeleportPositionLerpEnabled) {\r\n this._myVisualTeleportPositionObject.pp_setTransformQuat(this._myVisualTeleportTransformQuat);\r\n this._myVisualTeleportTransformQuatReset = false;\r\n } else {\r\n currentVisualTeleportTransformQuat = this._myVisualTeleportPositionObject.pp_getTransformQuat(currentVisualTeleportTransformQuat);\r\n currentVisualTeleportPosition = currentVisualTeleportTransformQuat.quat2_getPosition(currentVisualTeleportPosition);\r\n currentVisualTeleportRotationQuat = currentVisualTeleportTransformQuat.quat2_getRotationQuat(currentVisualTeleportRotationQuat);\r\n currentVisualTeleportRotationQuat.quat_rotationToQuat(visualRotationQuat, differenceRotationQuat);\r\n\r\n let positionDistance = currentVisualTeleportPosition.vec3_distance(visualPosition);\r\n let rotationAngleDistance = differenceRotationQuat.quat_getAngle();\r\n\r\n if ((!this._myVisualTeleportTransformPositionLerping || positionDistance < this._myTeleportParams.myVisualizerParams.myVisualTeleportPositionMinDistanceToResetLerp) &&\r\n (positionDistance < this._myTeleportParams.myVisualizerParams.myVisualTeleportPositionMinDistanceToLerp ||\r\n positionDistance > this._myTeleportParams.myVisualizerParams.myVisualTeleportPositionMaxDistanceToLerp)) {\r\n this._myVisualTeleportTransformPositionLerping = false;\r\n currentVisualTeleportPosition.vec3_copy(visualPosition);\r\n } else {\r\n this._myVisualTeleportTransformPositionLerping = true;\r\n\r\n let interpolationFactor = this._myTeleportParams.myVisualizerParams.myVisualTeleportPositionLerpFactor * dt;\r\n if (positionDistance < this._myTeleportParams.myVisualizerParams.myVisualTeleportPositionMinDistanceToCloseLerpFactor) {\r\n interpolationFactor = this._myTeleportParams.myVisualizerParams.myVisualTeleportPositionCloseLerpFactor * dt;\r\n }\r\n currentVisualTeleportPosition.vec3_lerp(visualPosition, interpolationFactor, currentVisualTeleportPosition);\r\n }\r\n\r\n if ((!this._myVisualTeleportTransformRotationLerping || rotationAngleDistance < this._myTeleportParams.myVisualizerParams.myVisualTeleportPositionMinAngleDistanceToResetLerp) &&\r\n (rotationAngleDistance < this._myTeleportParams.myVisualizerParams.myVisualTeleportPositionMinAngleDistanceToLerp ||\r\n positionDistance > this._myTeleportParams.myVisualizerParams.myVisualTeleportPositionMaxAngleDistanceToLerp)) {\r\n this._myVisualTeleportTransformRotationLerping = false;\r\n currentVisualTeleportRotationQuat.quat_copy(visualRotationQuat);\r\n } else {\r\n let interpolationFactor = this._myTeleportParams.myVisualizerParams.myVisualTeleportPositionLerpFactor * dt;\r\n\r\n this._myVisualTeleportTransformRotationLerping = true;\r\n currentVisualTeleportRotationQuat.quat_slerp(visualRotationQuat, interpolationFactor, currentVisualTeleportRotationQuat);\r\n }\r\n\r\n currentVisualTeleportTransformQuat.quat2_setPositionRotationQuat(currentVisualTeleportPosition, currentVisualTeleportRotationQuat);\r\n this._myVisualTeleportPositionObject.pp_setTransformQuat(currentVisualTeleportTransformQuat);\r\n }\r\n\r\n if (this._myTeleportParams.myVisualizerParams.myTeleportPositionObject == null) {\r\n {\r\n let visualParams = this._myValidVisualTeleportPositionTorus.getParams();\r\n visualParams.myRadius = 0.175;\r\n visualParams.mySegmentsAmount = 24;\r\n visualParams.mySegmentThickness = 0.02;\r\n\r\n //visualParams.myRadius = Globals.getEasyTuneVariables(this._myTeleportParams.myEngine).get(\"Teleport Torus Radius\");\r\n //visualParams.mySegmentsAmount = Globals.getEasyTuneVariables(this._myTeleportParams.myEngine).get(\"Teleport Torus Segments\");\r\n //visualParams.mySegmentThickness = Globals.getEasyTuneVariables(this._myTeleportParams.myEngine).get(\"Teleport Torus Thickness\");\r\n\r\n this._myValidVisualTeleportPositionTorus.paramsUpdated();\r\n }\r\n\r\n {\r\n let visualParams = this._myValidVisualTeleportPositionTorusInner.getParams();\r\n visualParams.myRadius = 0.04;\r\n visualParams.mySegmentsAmount = 24;\r\n visualParams.mySegmentThickness = 0.02;\r\n\r\n //visualParams.myRadius = Globals.getEasyTuneVariables(this._myTeleportParams.myEngine).get(\"Teleport Torus Inner Radius\");\r\n //visualParams.mySegmentsAmount = Globals.getEasyTuneVariables(this._myTeleportParams.myEngine).get(\"Teleport Torus Segments\");\r\n //visualParams.mySegmentThickness = Globals.getEasyTuneVariables(this._myTeleportParams.myEngine).get(\"Teleport Torus Thickness\");\r\n\r\n this._myValidVisualTeleportPositionTorusInner.paramsUpdated();\r\n }\r\n\r\n this._myValidVisualTeleportPositionTorus.setVisible(true);\r\n this._myValidVisualTeleportPositionTorusInner.setVisible(true);\r\n } else {\r\n this._myValidVisualTeleportPositionTorus.setVisible(false);\r\n this._myValidVisualTeleportPositionTorusInner.setVisible(false);\r\n this._myTeleportParams.myVisualizerParams.myTeleportPositionObject.pp_setActive(true);\r\n }\r\n\r\n if (this._myTeleportParams.myDebugEnabled && this._myTeleportParams.myDebugShowEnabled && Globals.isDebugEnabled(this._myTeleportParams.myEngine)) {\r\n Globals.getDebugVisualManager(this._myTeleportParams.myEngine).drawPoint(0, this._myTeleportRuntimeParams.myTeleportPosition, vec4_create(0, 0, 1, 1), 0.02);\r\n }\r\n };\r\n}();", "import { vec3_create } from \"../../../../../../plugin/js/extensions/array/vec_create_extension.js\";\r\n\r\nexport class PlayerLocomotionTeleportParable {\r\n\r\n constructor() {\r\n this._myStartPosition = vec3_create();\r\n\r\n this._myForward = vec3_create();\r\n this._myUp = vec3_create();\r\n\r\n this._mySpeed = 0;\r\n this._myGravity = 0;\r\n this._myStepLength = 0;\r\n }\r\n\r\n setStartPosition(startPosition) {\r\n this._myStartPosition.vec3_copy(startPosition);\r\n }\r\n\r\n setForward(forward) {\r\n this._myForward.vec3_copy(forward);\r\n }\r\n\r\n setUp(up) {\r\n this._myUp.vec3_copy(up);\r\n }\r\n\r\n setSpeed(speed) {\r\n this._mySpeed = speed;\r\n }\r\n\r\n setGravity(gravity) {\r\n this._myGravity = gravity;\r\n }\r\n\r\n setStepLength(stepLength) {\r\n this._myStepLength = stepLength;\r\n }\r\n\r\n getPosition(positionIndex, outPosition = vec3_create()) {\r\n // Implemented outside class definition\r\n }\r\n\r\n getDistance(positionIndex) {\r\n // Implemented outside class definition\r\n }\r\n\r\n getPositionIndexByDistance(distance) {\r\n // Implemented outside class definition\r\n }\r\n\r\n getPositionByDistance(distance, outPosition = vec3_create()) {\r\n // Implemented outside class definition\r\n }\r\n\r\n getDistanceOverFlatDistance(flatDistance, maxParableDistance) {\r\n // Implemented outside class definition\r\n }\r\n\r\n getFlatDistanceOverDistance(distance) {\r\n // Implemented outside class definition\r\n }\r\n}\r\n\r\n\r\n\r\n// IMPLEMENTATION\r\n\r\nPlayerLocomotionTeleportParable.prototype.getPosition = function () {\r\n let forwardPosition = vec3_create();\r\n let upPosition = vec3_create();\r\n return function getPosition(positionIndex, outPosition = vec3_create()) {\r\n let deltaTimePerStep = this._myStepLength / this._mySpeed;\r\n\r\n let elapsedTime = deltaTimePerStep * positionIndex;\r\n\r\n forwardPosition = this._myForward.vec3_scale(this._mySpeed * elapsedTime, forwardPosition);\r\n forwardPosition = forwardPosition.vec3_add(this._myStartPosition, forwardPosition);\r\n\r\n upPosition = this._myUp.vec3_scale(this._myGravity * elapsedTime * elapsedTime / 2, upPosition);\r\n\r\n outPosition = forwardPosition.vec3_add(upPosition, outPosition);\r\n\r\n return outPosition;\r\n };\r\n}();\r\n\r\nPlayerLocomotionTeleportParable.prototype.getDistance = function () {\r\n let currentPosition = vec3_create();\r\n let prevPosition = vec3_create();\r\n return function getDistance(positionIndex) {\r\n let distance = 0;\r\n prevPosition.vec3_copy(this._myStartPosition);\r\n\r\n for (let i = 1; i <= positionIndex; i++) {\r\n currentPosition = this.getPosition(i, currentPosition);\r\n distance += currentPosition.vec3_distance(prevPosition);\r\n\r\n prevPosition.vec3_copy(currentPosition);\r\n }\r\n\r\n return distance;\r\n };\r\n}();\r\n\r\nPlayerLocomotionTeleportParable.prototype.getPositionIndexByDistance = function () {\r\n let currentPosition = vec3_create();\r\n let prevPosition = vec3_create();\r\n return function getPositionIndexByDistance(distance) {\r\n let currentDistance = 0;\r\n let currentIndex = 0;\r\n prevPosition = this.getPosition(currentIndex, prevPosition);\r\n\r\n while (currentDistance < distance) {\r\n currentPosition = this.getPosition(currentIndex + 1, currentPosition);\r\n currentDistance += currentPosition.vec3_distance(prevPosition);\r\n currentIndex++;\r\n\r\n prevPosition.vec3_copy(currentPosition);\r\n }\r\n\r\n return Math.max(0, currentIndex - 1);\r\n };\r\n}();\r\n\r\nPlayerLocomotionTeleportParable.prototype.getPositionByDistance = function () {\r\n let currentPosition = vec3_create();\r\n let prevPosition = vec3_create();\r\n let prevToCurrent = vec3_create();\r\n return function getPositionByDistance(distance, outPosition = vec3_create()) {\r\n let currentDistance = 0;\r\n let currentIndex = 0;\r\n let found = false;\r\n\r\n prevPosition = this.getPosition(currentIndex, prevPosition);\r\n while (!found) {\r\n currentPosition = this.getPosition(currentIndex + 1, currentPosition);\r\n currentDistance += currentPosition.vec3_distance(prevPosition);\r\n currentIndex++;\r\n\r\n if (currentDistance > distance) {\r\n let lengthToRemove = currentDistance - distance;\r\n prevToCurrent = currentPosition.vec3_sub(prevPosition, prevToCurrent);\r\n let lengthToAdd = prevToCurrent.vec3_length() - lengthToRemove;\r\n prevToCurrent.vec3_normalize(prevToCurrent);\r\n\r\n outPosition = prevPosition.vec3_add(prevToCurrent.vec3_scale(lengthToAdd, outPosition), outPosition);\r\n found = true;\r\n }\r\n prevPosition.vec3_copy(currentPosition);\r\n }\r\n\r\n return outPosition;\r\n };\r\n}();\r\n\r\nPlayerLocomotionTeleportParable.prototype.getDistanceOverFlatDistance = function () {\r\n let currentPosition = vec3_create();\r\n let flatCurrentPosition = vec3_create();\r\n let flatStartPosition = vec3_create();\r\n let prevPosition = vec3_create();\r\n let prevToCurrent = vec3_create();\r\n let startToCurrentFlat = vec3_create();\r\n return function getDistanceOverFlatDistance(flatDistance, maxParableDistance) {\r\n if (flatDistance < 0.00001) {\r\n return 0;\r\n }\r\n\r\n let currentDistance = 0;\r\n let currentIndex = 0;\r\n flatStartPosition = this._myStartPosition.vec3_removeComponentAlongAxis(this._myUp, flatStartPosition);\r\n prevPosition = this.getPosition(currentIndex, prevPosition);\r\n\r\n let distanceOverFlatDistance = 0;\r\n\r\n while (currentDistance <= maxParableDistance) {\r\n currentPosition = this.getPosition(currentIndex + 1, currentPosition);\r\n currentDistance += currentPosition.vec3_distance(prevPosition);\r\n currentIndex++;\r\n\r\n flatCurrentPosition = currentPosition.vec3_removeComponentAlongAxis(this._myUp, flatCurrentPosition);\r\n startToCurrentFlat = flatCurrentPosition.vec3_sub(flatStartPosition, startToCurrentFlat);\r\n let currentFlatDistance = startToCurrentFlat.vec3_length();\r\n if (currentFlatDistance >= flatDistance) {\r\n let flatDifference = currentFlatDistance - flatDistance;\r\n prevToCurrent = currentPosition.vec3_sub(prevPosition, prevToCurrent);\r\n let angleWithFlat = prevToCurrent.vec3_angleRadians(startToCurrentFlat);\r\n let cos = Math.cos(angleWithFlat);\r\n let lengthToRemove = prevToCurrent.vec3_length();\r\n if (cos != 0) {\r\n lengthToRemove = flatDifference / Math.cos(angleWithFlat);\r\n }\r\n\r\n distanceOverFlatDistance = currentDistance - lengthToRemove;\r\n break;\r\n\r\n } else {\r\n distanceOverFlatDistance = currentDistance;\r\n }\r\n\r\n prevPosition.vec3_copy(currentPosition);\r\n }\r\n\r\n return Math.min(maxParableDistance, distanceOverFlatDistance);\r\n };\r\n}();\r\n\r\nPlayerLocomotionTeleportParable.prototype.getFlatDistanceOverDistance = function () {\r\n let positionByDistance = vec3_create();\r\n let flatPositionByDistance = vec3_create();\r\n let flatStartPosition = vec3_create();\r\n return function getFlatDistanceOverDistance(distance) {\r\n positionByDistance = this.getPositionByDistance(distance, positionByDistance);\r\n\r\n flatPositionByDistance = positionByDistance.vec3_removeComponentAlongAxis(this._myUp, flatPositionByDistance);\r\n flatStartPosition = this._myStartPosition.vec3_removeComponentAlongAxis(this._myUp, flatStartPosition);\r\n\r\n return flatStartPosition.vec3_distance(flatPositionByDistance);\r\n };\r\n}();", "import { quat2_create, quat_create, vec3_create } from \"../../../../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { CollisionRuntimeParams } from \"../../../../character_controller/collision/legacy/collision_check/collision_params.js\";\r\n\r\nexport class PlayerLocomotionTeleportState {\r\n\r\n constructor(teleportParams, teleportRuntimeParams, locomotionRuntimeParams) {\r\n this._myLocomotionRuntimeParams = locomotionRuntimeParams;\r\n\r\n this._myTeleportParams = teleportParams;\r\n this._myTeleportRuntimeParams = teleportRuntimeParams;\r\n\r\n this._myTeleportAsMovementFailed = false;\r\n }\r\n\r\n cancelTeleport() {\r\n\r\n }\r\n\r\n _teleport() {\r\n this._teleportToPosition(this._myTeleportRuntimeParams.myTeleportPosition, this._myTeleportRuntimeParams.myTeleportForward);\r\n this._myLocomotionRuntimeParams.myIsTeleporting = false;\r\n this._myLocomotionRuntimeParams.myTeleportJustPerformed = true;\r\n\r\n this._myTeleportParams.myPlayerTransformManager.resetReal();\r\n }\r\n\r\n _checkTeleport(teleportPosition, teleportRotationQuat, collisionRuntimeParams, checkTeleportCollisionRuntimeParams = null) {\r\n // Implemented outside class definition\r\n }\r\n\r\n _checkTeleportAsMovement(teleportPosition, teleportRotationQuat, collisionRuntimeParams, checkTeleportCollisionRuntimeParams) {\r\n // Implemented outside class definition\r\n }\r\n\r\n _teleportToPosition(teleportPosition, teleportForward, collisionRuntimeParams, forceTeleport = false) {\r\n // Implemented outside class definition\r\n }\r\n}\r\n\r\n\r\n\r\n// IMPLEMENTATION\r\n\r\nPlayerLocomotionTeleportState.prototype._checkTeleport = function () {\r\n let teleportTransformQuat = quat2_create();\r\n return function _checkTeleport(teleportPosition, teleportRotationQuat, collisionRuntimeParams, checkTeleportCollisionRuntimeParams = null) {\r\n teleportTransformQuat.quat2_setPositionRotationQuat(teleportPosition, teleportRotationQuat);\r\n\r\n this._myTeleportParams.myPlayerTransformManager.checkTeleportToTransformQuat(teleportTransformQuat, undefined, undefined, true, collisionRuntimeParams);\r\n\r\n if (checkTeleportCollisionRuntimeParams != null) {\r\n checkTeleportCollisionRuntimeParams.copy(collisionRuntimeParams);\r\n }\r\n };\r\n}();\r\n\r\nPlayerLocomotionTeleportState.prototype._checkTeleportAsMovement = function () {\r\n let checkTeleportMovementCollisionRuntimeParams = new CollisionRuntimeParams();\r\n let feetRotationQuat = quat_create();\r\n let playerUp = vec3_create();\r\n\r\n let currentFeetPosition = vec3_create();\r\n let fixedTeleportPosition = vec3_create();\r\n\r\n let teleportMovement = vec3_create();\r\n let extraVerticalMovement = vec3_create();\r\n let movementToTeleportPosition = vec3_create();\r\n let movementFeetTransformQuat = quat2_create();\r\n return function _checkTeleportAsMovement(teleportPosition, teleportRotationQuat, collisionRuntimeParams, checkTeleportCollisionRuntimeParams) {\r\n checkTeleportMovementCollisionRuntimeParams.copy(collisionRuntimeParams);\r\n\r\n this._checkTeleport(teleportPosition, teleportRotationQuat, collisionRuntimeParams, checkTeleportCollisionRuntimeParams);\r\n\r\n // If teleport is ok then we can check movement knowing we have to move toward the teleported position (which has also snapped/fixed the position)\r\n if (!collisionRuntimeParams.myTeleportCanceled) {\r\n let teleportMovementValid = false;\r\n\r\n fixedTeleportPosition.vec3_copy(collisionRuntimeParams.myNewPosition);\r\n this._myTeleportParams.myPlayerTransformManager.getPosition(currentFeetPosition);\r\n\r\n for (let i = 0; i < this._myTeleportParams.myTeleportAsMovementMaxSteps; i++) {\r\n teleportMovement = fixedTeleportPosition.vec3_sub(currentFeetPosition, teleportMovement);\r\n\r\n if (this._myTeleportParams.myTeleportAsMovementRemoveVerticalMovement) {\r\n teleportMovement = teleportMovement.vec3_removeComponentAlongAxis(playerUp, teleportMovement);\r\n }\r\n\r\n if (this._myTeleportParams.myTeleportAsMovementExtraVerticalMovementPerMeter != 0) {\r\n let meters = teleportMovement.vec3_length();\r\n let extraVerticalMovementValue = meters * this._myTeleportParams.myTeleportAsMovementExtraVerticalMovementPerMeter;\r\n extraVerticalMovement = playerUp.vec3_scale(extraVerticalMovementValue, extraVerticalMovement);\r\n teleportMovement = teleportMovement.vec3_add(extraVerticalMovement, teleportMovement);\r\n }\r\n\r\n movementFeetTransformQuat.quat2_setPositionRotationQuat(currentFeetPosition, feetRotationQuat);\r\n\r\n {\r\n const movementCollisionCheckParams = this._myTeleportParams.myPlayerTransformManager.getMovementCollisionCheckParams();\r\n const internalSplitMovementMaxStepsDisabledBackup = movementCollisionCheckParams._myInternalSplitMovementMaxStepsDisabled;\r\n\r\n // This is used for the perform teleport as movement, so it needs to be able to do as many steps needed based on teleport distance\r\n movementCollisionCheckParams._myInternalSplitMovementMaxStepsDisabled = true;\r\n\r\n this._myTeleportParams.myPlayerTransformManager.checkMovement(teleportMovement, movementFeetTransformQuat, undefined, true, checkTeleportMovementCollisionRuntimeParams);\r\n\r\n movementCollisionCheckParams._myInternalSplitMovementMaxStepsDisabled = internalSplitMovementMaxStepsDisabledBackup;\r\n }\r\n\r\n if (!checkTeleportMovementCollisionRuntimeParams.myHorizontalMovementCanceled && !checkTeleportMovementCollisionRuntimeParams.myVerticalMovementCanceled) {\r\n movementToTeleportPosition = fixedTeleportPosition.vec3_sub(checkTeleportMovementCollisionRuntimeParams.myNewPosition, movementToTeleportPosition);\r\n //console.error(movementToTeleportPosition.vec3_length());\r\n if (movementToTeleportPosition.vec3_length() < this._myTeleportParams.myTeleportAsMovementMaxDistanceFromTeleportPosition + 0.00001) {\r\n teleportMovementValid = true;\r\n break;\r\n } else {\r\n teleportMovement.vec3_copy(movementToTeleportPosition);\r\n currentFeetPosition.vec3_copy(checkTeleportMovementCollisionRuntimeParams.myNewPosition);\r\n }\r\n } else {\r\n break;\r\n }\r\n }\r\n\r\n if (!teleportMovementValid) {\r\n collisionRuntimeParams.myTeleportCanceled = true;\r\n }\r\n\r\n this._myTeleportAsMovementFailed = !teleportMovementValid;\r\n }\r\n };\r\n}();\r\n\r\nPlayerLocomotionTeleportState.prototype._teleportToPosition = function () {\r\n let playerUp = vec3_create();\r\n let newFeetTransformQuat = quat2_create();\r\n let newFeetRotationQuat = quat_create();\r\n return function _teleportToPosition(teleportPosition, teleportForward) {\r\n this._myTeleportAsMovementFailed = false;\r\n\r\n this._myTeleportParams.myPlayerTransformManager.getRotationRealQuat(newFeetRotationQuat);\r\n\r\n if (!teleportForward.vec3_isZero(0.00001)) {\r\n newFeetRotationQuat.quat_getUp(playerUp);\r\n newFeetRotationQuat.quat_setUp(playerUp, teleportForward);\r\n }\r\n\r\n newFeetTransformQuat.quat2_setPositionRotationQuat(teleportPosition, newFeetRotationQuat);\r\n\r\n this._myTeleportParams.myPlayerTransformManager.teleportTransformQuat(newFeetTransformQuat, undefined, undefined, true);\r\n };\r\n}();", "import { MeshComponent } from \"@wonderlandengine/api\";\r\nimport { Timer } from \"../../../../../../cauldron/cauldron/timer.js\";\r\nimport { FSM } from \"../../../../../../cauldron/fsm/fsm.js\";\r\nimport { TimerState } from \"../../../../../../cauldron/fsm/states/condition_states/timer_state.js\";\r\nimport { quat_create, vec3_create, vec4_create } from \"../../../../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Globals } from \"../../../../../../pp/globals.js\";\r\nimport { NumberOverFactor } from \"../../../../../cauldron/cauldron/number_over_factor.js\";\r\nimport { PlayerLocomotionTeleportState } from \"./player_locomotion_teleport_state.js\";\r\n\r\nexport class PlayerLocomotionTeleportTeleportBlinkState extends PlayerLocomotionTeleportState {\r\n\r\n constructor(teleportParams, teleportRuntimeParams, locomotionRuntimeParams) {\r\n super(teleportParams, teleportRuntimeParams, locomotionRuntimeParams);\r\n\r\n this._myBlinkSphere = Globals.getPlayerObjects(this._myTeleportParams.myEngine).myCauldron.pp_addChild();\r\n this._myBlinkSphereMeshComponent = this._myBlinkSphere.pp_addComponent(MeshComponent);\r\n this._myBlinkSphereMeshComponent.mesh = Globals.getDefaultMeshes(this._myTeleportParams.myEngine).myInvertedSphere;\r\n this._myBlinkSphereMeshComponent.material = Globals.getDefaultMaterials(this._myTeleportParams.myEngine).myFlatTransparentNoDepth.clone();\r\n this._myBlinkSphereMaterialColor = vec4_create(\r\n this._myTeleportParams.myTeleportParams.myBlinkSphereColor[0] / 255,\r\n this._myTeleportParams.myTeleportParams.myBlinkSphereColor[1] / 255,\r\n this._myTeleportParams.myTeleportParams.myBlinkSphereColor[2] / 255,\r\n 0);\r\n\r\n this._myBlinkSphereMeshComponent.material.color = this._myBlinkSphereMaterialColor;\r\n\r\n this._myBlinkSphere.pp_resetTransformLocal();\r\n this._myBlinkSphere.pp_setScaleLocal(this._myTeleportParams.myTeleportParams.myBlinkSphereScale);\r\n this._myBlinkSphere.pp_setActive(false);\r\n\r\n this._myFSM = new FSM();\r\n //this._myFSM.setLogEnabled(true, \"Locomotion Teleport Teleport Blink\");\r\n\r\n this._myFSM.addState(\"init\");\r\n this._myFSM.addState(\"idle\");\r\n\r\n this._myFSM.addState(\"fade_out\", this._fadeOutUpdate.bind(this));\r\n this._myFSM.addState(\"wait\", new TimerState(this._myTeleportParams.myTeleportParams.myBlinkWaitSeconds, \"done\"));\r\n this._myFSM.addState(\"fade_in\", this._fadeInUpdate.bind(this));\r\n\r\n this._myFSM.addTransition(\"init\", \"idle\", \"start\");\r\n\r\n this._myFSM.addTransition(\"idle\", \"fade_out\", \"teleport\", this._startFadeOut.bind(this));\r\n this._myFSM.addTransition(\"fade_out\", \"wait\", \"done\", this._teleport.bind(this));\r\n this._myFSM.addTransition(\"wait\", \"fade_in\", \"done\", this._startFadeIn.bind(this));\r\n this._myFSM.addTransition(\"fade_in\", \"idle\", \"done\", this._teleportDone.bind(this));\r\n\r\n this._myFSM.addTransition(\"idle\", \"idle\", \"stop\");\r\n this._myFSM.addTransition(\"fade_out\", \"idle\", \"stop\", this._stop.bind(this, true));\r\n this._myFSM.addTransition(\"wait\", \"idle\", \"stop\", this._stop.bind(this, false));\r\n this._myFSM.addTransition(\"fade_in\", \"idle\", \"stop\", this._stop.bind(this, false));\r\n\r\n this._myFSM.addTransition(\"idle\", \"idle\", \"cancel\");\r\n this._myFSM.addTransition(\"fade_out\", \"idle\", \"cancel\", this._cancel.bind(this));\r\n this._myFSM.addTransition(\"wait\", \"idle\", \"cancel\", this._cancel.bind(this));\r\n this._myFSM.addTransition(\"fade_in\", \"idle\", \"cancel\", this._cancel.bind(this));\r\n\r\n this._myFSM.init(\"init\");\r\n this._myFSM.perform(\"start\");\r\n\r\n this._myFadeInTimer = new Timer(this._myTeleportParams.myTeleportParams.myBlinkFadeInSeconds);\r\n this._myFadeOutTimer = new Timer(this._myTeleportParams.myTeleportParams.myBlinkFadeOutSeconds);\r\n this._myFadeOutAlphaOverTime = new NumberOverFactor(0, 1, 0, 1);\r\n this._myFadeInAlphaOverTime = new NumberOverFactor(1, 0, 0, 1);\r\n }\r\n\r\n start(fsm) {\r\n this._myParentFSM = fsm;\r\n\r\n this._myFSM.perform(\"teleport\");\r\n }\r\n\r\n end() {\r\n this._myBlinkSphere.pp_setActive(false);\r\n this._myBlinkSphere.pp_setParent(Globals.getPlayerObjects(this._myTeleportParams.myEngine).myCauldron, false);\r\n\r\n this._myFSM.perform(\"stop\");\r\n }\r\n\r\n cancelTeleport() {\r\n this._myFSM.perform(\"cancel\");\r\n }\r\n\r\n update(dt, fsm) {\r\n this._myBlinkSphere.pp_setParent(this._myTeleportParams.myPlayerTransformManager.getPlayerHeadManager().getHead(), false);\r\n this._myBlinkSphere.pp_resetTransformLocal();\r\n\r\n this._myFSM.update(dt);\r\n }\r\n\r\n _startFadeOut() {\r\n // Implemented outside class definition\r\n }\r\n\r\n _startFadeIn() {\r\n this._myFadeInTimer.start();\r\n }\r\n\r\n _fadeOutUpdate(dt, fsm) {\r\n this._myFadeOutTimer.update(dt);\r\n\r\n let alpha = this._myFadeOutAlphaOverTime.get(this._myFadeOutTimer.getPercentage());\r\n this._myBlinkSphereMaterialColor[3] = alpha;\r\n this._myBlinkSphereMeshComponent.material.color = this._myBlinkSphereMaterialColor;\r\n\r\n if (this._myFadeOutTimer.isDone()) {\r\n fsm.perform(\"done\");\r\n }\r\n }\r\n\r\n _fadeInUpdate(dt, fsm) {\r\n this._myFadeInTimer.update(dt);\r\n\r\n let alpha = this._myFadeInAlphaOverTime.get(this._myFadeInTimer.getPercentage());\r\n this._myBlinkSphereMaterialColor[3] = alpha;\r\n this._myBlinkSphereMeshComponent.material.color = this._myBlinkSphereMaterialColor;\r\n\r\n if (this._myFadeInTimer.isDone()) {\r\n fsm.perform(\"done\");\r\n }\r\n }\r\n\r\n _teleportDone() {\r\n this._myBlinkSphere.pp_setActive(false);\r\n\r\n this._myParentFSM.performDelayed(\"done\");\r\n }\r\n\r\n _stop(teleport) {\r\n this._myBlinkSphere.pp_setActive(false);\r\n\r\n if (teleport) {\r\n this._teleport();\r\n }\r\n }\r\n\r\n _cancel() {\r\n this._myLocomotionRuntimeParams.myIsTeleporting = false;\r\n\r\n this._myBlinkSphere.pp_setActive(false);\r\n this._myBlinkSphere.pp_setParent(Globals.getPlayerObjects(this._myTeleportParams.myEngine).myCauldron, false);\r\n }\r\n}\r\n\r\n\r\n\r\n// IMPLEMENTATION\r\n\r\nPlayerLocomotionTeleportTeleportBlinkState.prototype._startFadeOut = function () {\r\n let playerUp = vec3_create();\r\n let playerForward = vec3_create();\r\n let flatTeleportForward = vec3_create();\r\n let feetRotationQuat = quat_create();\r\n return function _startFadeOut() {\r\n this._myFadeOutTimer.start();\r\n\r\n this._myBlinkSphereMaterialColor[3] = 0;\r\n this._myBlinkSphereMeshComponent.material.color = this._myBlinkSphereMaterialColor;\r\n this._myBlinkSphere.pp_setActive(true);\r\n\r\n if (!this._myTeleportRuntimeParams.myTeleportForward.vec3_isZero(0.00001)) {\r\n let angleToPerform = 0;\r\n\r\n this._myTeleportParams.myPlayerTransformManager.getRotationRealQuat(feetRotationQuat);\r\n feetRotationQuat.quat_getUp(playerUp);\r\n feetRotationQuat.quat_getForward(playerForward);\r\n this._myTeleportRuntimeParams.myTeleportForward.vec3_removeComponentAlongAxis(playerUp, flatTeleportForward);\r\n\r\n if (!flatTeleportForward.vec3_isZero(0.00001)) {\r\n flatTeleportForward.vec3_normalize(flatTeleportForward);\r\n angleToPerform = flatTeleportForward.vec3_angle(playerForward);\r\n }\r\n\r\n if (angleToPerform < this._myTeleportParams.myTeleportParams.myBlinkRotateMinAngleToRotate) {\r\n this._myTeleportRuntimeParams.myTeleportForward.vec3_zero();\r\n }\r\n }\r\n\r\n this._myLocomotionRuntimeParams.myIsTeleporting = true;\r\n };\r\n}();", "import { Timer } from \"../../../../../../cauldron/cauldron/timer.js\";\r\nimport { FSM } from \"../../../../../../cauldron/fsm/fsm.js\";\r\nimport { quat_create, vec3_create } from \"../../../../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { PlayerLocomotionTeleportState } from \"./player_locomotion_teleport_state.js\";\r\n\r\nexport class PlayerLocomotionTeleportTeleportShiftState extends PlayerLocomotionTeleportState {\r\n\r\n constructor(teleportParams, teleportRuntimeParams, locomotionRuntimeParams) {\r\n super(teleportParams, teleportRuntimeParams, locomotionRuntimeParams);\r\n\r\n this._myFSM = new FSM();\r\n //this._myFSM.setLogEnabled(true, \"Locomotion Teleport Teleport Shift\");\r\n\r\n this._myFSM.addState(\"init\");\r\n this._myFSM.addState(\"idle\");\r\n this._myFSM.addState(\"shifting\", this._shiftingUpdate.bind(this));\r\n\r\n this._myFSM.addTransition(\"init\", \"idle\", \"start\");\r\n\r\n this._myFSM.addTransition(\"idle\", \"shifting\", \"teleport\", this._startShifting.bind(this));\r\n this._myFSM.addTransition(\"shifting\", \"idle\", \"done\", this._teleportDone.bind(this));\r\n\r\n this._myFSM.addTransition(\"idle\", \"idle\", \"stop\");\r\n this._myFSM.addTransition(\"shifting\", \"idle\", \"stop\", this._stop.bind(this));\r\n\r\n this._myFSM.addTransition(\"idle\", \"idle\", \"cancel\");\r\n this._myFSM.addTransition(\"shifting\", \"idle\", \"cancel\", this._cancel.bind(this));\r\n\r\n this._myFSM.init(\"init\");\r\n this._myFSM.perform(\"start\");\r\n\r\n this._myShiftMovementTimer = new Timer(this._myTeleportParams.myTeleportParams.myShiftMovementSeconds);\r\n this._myShiftRotateTimer = new Timer(this._myTeleportParams.myTeleportParams.myShiftRotateSeconds, false);\r\n\r\n this._myFeetStartPosition = vec3_create();\r\n\r\n this._myStartForward = vec3_create();\r\n\r\n //Globals.getEasyTuneVariables(this._myTeleportParams.myEngine).add(new EasyTuneNumber(\"Shift Movement Seconds\", this._myTeleportParams.myTeleportParams.myShiftMovementSeconds, 0.5, 3, 0, undefined, undefined, this._myTeleportParams.myEngine));\r\n //Globals.getEasyTuneVariables(this._myTeleportParams.myEngine).add(new EasyTuneNumber(\"Shift Rotate Seconds\", this._myTeleportParams.myTeleportParams.myShiftRotateSeconds, 0.5, 3, 0, undefined, undefined, this._myTeleportParams.myEngine));\r\n //Globals.getEasyTuneVariables(this._myTeleportParams.myEngine).add(new EasyTuneNumber(\"Shift Rotate Start Percentage\", this._myTeleportParams.myTeleportParams.myShiftRotateStartAfterMovementPercentage, 0.5, 3, 0, 1, undefined, this._myTeleportParams.myEngine));\r\n }\r\n\r\n start(fsm) {\r\n this._myParentFSM = fsm;\r\n\r\n this._myFSM.perform(\"teleport\");\r\n }\r\n\r\n end() {\r\n this._myFSM.perform(\"stop\");\r\n }\r\n\r\n update(dt, fsm) {\r\n //this._myTeleportParams.myTeleportParams.myShiftMovementSeconds = Globals.getEasyTuneVariables(this._myTeleportParams.myEngine).get(\"Shift Movement Seconds\");\r\n //this._myTeleportParams.myTeleportParams.myShiftRotateSeconds = Globals.getEasyTuneVariables(this._myTeleportParams.myEngine).get(\"Shift Rotate Seconds\");\r\n //this._myTeleportParams.myTeleportParams.myShiftRotateStartAfterMovementPercentage = Globals.getEasyTuneVariables(this._myTeleportParams.myEngine).get(\"Shift Rotate Start Percentage\");\r\n\r\n this._myFSM.update(dt);\r\n }\r\n\r\n cancelTeleport() {\r\n this._myFSM.perform(\"cancel\");\r\n }\r\n\r\n _startShifting() {\r\n // Implemented outside class definition\r\n }\r\n\r\n _cancel() {\r\n this._myLocomotionRuntimeParams.myIsTeleporting = false;\r\n }\r\n\r\n _stop() {\r\n this._teleport();\r\n }\r\n\r\n _teleportDone() {\r\n this._teleport();\r\n this._myParentFSM.performDelayed(\"done\");\r\n }\r\n\r\n _shiftingUpdate(dt, fsm) {\r\n // Implemented outside class definition\r\n }\r\n}\r\n\r\n\r\n\r\n// IMPLEMENTATION\r\n\r\n\r\nPlayerLocomotionTeleportTeleportShiftState.prototype._startShifting = function () {\r\n let playerUp = vec3_create();\r\n let playerForward = vec3_create();\r\n let flatTeleportForward = vec3_create();\r\n let feetRotationQuat = quat_create();\r\n return function _startShifting(dt, fsm) {\r\n this._myLocomotionRuntimeParams.myIsTeleporting = true;\r\n this._myFeetStartPosition = this._myTeleportParams.myPlayerTransformManager.getPositionReal(this._myFeetStartPosition);\r\n\r\n this._myShiftMovementTimer.start(this._myTeleportParams.myTeleportParams.myShiftMovementSeconds);\r\n\r\n if (this._myTeleportParams.myTeleportParams.myShiftMovementSecondsMultiplierOverDistanceFunction) {\r\n let distance = this._myTeleportRuntimeParams.myTeleportPosition.vec3_distance(this._myFeetStartPosition);\r\n let multiplier = this._myTeleportParams.myTeleportParams.myShiftMovementSecondsMultiplierOverDistanceFunction(distance);\r\n this._myShiftMovementTimer.start(this._myTeleportParams.myTeleportParams.myShiftMovementSeconds * multiplier);\r\n }\r\n\r\n if (!this._myTeleportRuntimeParams.myTeleportForward.vec3_isZero(0.00001)) {\r\n let angleToPerform = 0;\r\n\r\n this._myTeleportParams.myPlayerTransformManager.getRotationRealQuat(feetRotationQuat);\r\n feetRotationQuat.quat_getUp(playerUp);\r\n feetRotationQuat.quat_getForward(playerForward);\r\n this._myTeleportRuntimeParams.myTeleportForward.vec3_removeComponentAlongAxis(playerUp, flatTeleportForward);\r\n\r\n if (!flatTeleportForward.vec3_isZero(0.00001)) {\r\n flatTeleportForward.vec3_normalize(flatTeleportForward);\r\n angleToPerform = flatTeleportForward.vec3_angle(playerForward);\r\n }\r\n\r\n if (angleToPerform < this._myTeleportParams.myTeleportParams.myShiftRotateMinAngleToRotate) {\r\n this._myTeleportRuntimeParams.myTeleportForward.vec3_zero();\r\n }\r\n }\r\n\r\n this._myShiftRotateTimer.reset();\r\n };\r\n}();\r\n\r\nPlayerLocomotionTeleportTeleportShiftState.prototype._shiftingUpdate = function () {\r\n let movementToTeleportFeet = vec3_create();\r\n let newFeetPosition = vec3_create();\r\n\r\n let playerUp = vec3_create();\r\n let playerForward = vec3_create();\r\n let flatTeleportForward = vec3_create();\r\n let feetRotationQuat = quat_create();\r\n let currentRotationQuat = quat_create();\r\n let targetRotationQuat = quat_create();\r\n let lerpedRotationQuat = quat_create();\r\n let lerpedForward = vec3_create();\r\n let newFeetRotationQuat = quat_create();\r\n return function _shiftingUpdate(dt, fsm) {\r\n this._myShiftMovementTimer.update(dt);\r\n this._myShiftRotateTimer.update(dt);\r\n\r\n if (this._myShiftRotateTimer.isDone() && this._myShiftMovementTimer.isDone()) {\r\n fsm.perform(\"done\");\r\n } else {\r\n newFeetPosition.vec3_copy(this._myTeleportRuntimeParams.myTeleportPosition);\r\n\r\n if (this._myShiftMovementTimer.isStarted() || this._myShiftMovementTimer.isJustDone()) {\r\n\r\n let interpolationFactor = this._myTeleportParams.myTeleportParams.myShiftMovementEasingFunction(this._myShiftMovementTimer.getPercentage());\r\n\r\n if (interpolationFactor >= this._myTeleportParams.myTeleportParams.myShiftRotateStartAfterMovementPercentage && !this._myShiftRotateTimer.isStarted()) {\r\n let angleToPerform = 0;\r\n if (!this._myTeleportRuntimeParams.myTeleportForward.vec3_isZero(0.00001)) {\r\n this._myTeleportParams.myPlayerTransformManager.getRotationRealQuat(feetRotationQuat);\r\n feetRotationQuat.quat_getUp(playerUp);\r\n feetRotationQuat.quat_getForward(playerForward);\r\n this._myTeleportRuntimeParams.myTeleportForward.vec3_removeComponentAlongAxis(playerUp, flatTeleportForward);\r\n\r\n if (!flatTeleportForward.vec3_isZero(0.00001)) {\r\n flatTeleportForward.vec3_normalize(flatTeleportForward);\r\n angleToPerform = flatTeleportForward.vec3_angle(playerForward);\r\n }\r\n\r\n this._myStartForward.vec3_copy(playerForward);\r\n }\r\n\r\n if (angleToPerform > 0 && angleToPerform >= this._myTeleportParams.myTeleportParams.myShiftRotateMinAngleToRotate) {\r\n this._myShiftRotateTimer.reset(this._myTeleportParams.myTeleportParams.myShiftRotateSeconds);\r\n if (this._myTeleportParams.myTeleportParams.myShiftRotateSecondsMultiplierOverAngleFunction) {\r\n let multiplier = this._myTeleportParams.myTeleportParams.myShiftRotateSecondsMultiplierOverAngleFunction(angleToPerform);\r\n this._myShiftRotateTimer.reset(this._myTeleportParams.myTeleportParams.myShiftRotateSeconds * multiplier);\r\n }\r\n } else {\r\n this._myTeleportRuntimeParams.myTeleportForward.vec3_zero();\r\n this._myShiftRotateTimer.reset(0);\r\n }\r\n\r\n this._myShiftRotateTimer.start();\r\n this._myShiftRotateTimer.update(dt);\r\n }\r\n\r\n movementToTeleportFeet = this._myTeleportRuntimeParams.myTeleportPosition.vec3_sub(this._myFeetStartPosition, movementToTeleportFeet);\r\n movementToTeleportFeet.vec3_scale(interpolationFactor, movementToTeleportFeet);\r\n newFeetPosition = this._myFeetStartPosition.vec3_add(movementToTeleportFeet, newFeetPosition);\r\n }\r\n\r\n this._myTeleportParams.myPlayerTransformManager.getRotationRealQuat(newFeetRotationQuat);\r\n\r\n if (!this._myTeleportRuntimeParams.myTeleportForward.vec3_isZero(0.00001)) {\r\n if (this._myShiftRotateTimer.isRunning() || this._myShiftRotateTimer.isJustDone()) {\r\n let interpolationFactor = this._myTeleportParams.myTeleportParams.myShiftRotateEasingFunction(this._myShiftRotateTimer.getPercentage());\r\n\r\n newFeetRotationQuat.quat_getUp(playerUp);\r\n currentRotationQuat.quat_copy(newFeetRotationQuat);\r\n targetRotationQuat.quat_copy(newFeetRotationQuat);\r\n\r\n currentRotationQuat.quat_setUp(playerUp, this._myStartForward);\r\n targetRotationQuat.quat_setUp(playerUp, this._myTeleportRuntimeParams.myTeleportForward);\r\n\r\n currentRotationQuat.quat_slerp(targetRotationQuat, interpolationFactor, lerpedRotationQuat);\r\n\r\n newFeetRotationQuat.quat_setUp(playerUp, lerpedRotationQuat.quat_getForward(lerpedForward));\r\n\r\n if (lerpedForward.vec3_angle(this._myTeleportRuntimeParams.myTeleportForward) <= this._myTeleportParams.myTeleportParams.myShiftRotateStopAngleThreshold) {\r\n this._myShiftRotateTimer.end();\r\n }\r\n }\r\n }\r\n\r\n let playerHeadManager = this._myTeleportParams.myPlayerTransformManager.getPlayerHeadManager();\r\n playerHeadManager.setRotationFeetQuat(newFeetRotationQuat);\r\n playerHeadManager.teleportPositionFeet(newFeetPosition);\r\n }\r\n };\r\n}();", "import { FSM, SkipStateFunction } from \"../../../../../../cauldron/fsm/fsm.js\";\r\nimport { EasingFunction } from \"../../../../../../cauldron/utils/math_utils.js\";\r\nimport { quat_create, vec3_create } from \"../../../../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { PlayerLocomotionTeleportState } from \"./player_locomotion_teleport_state.js\";\r\nimport { PlayerLocomotionTeleportTeleportBlinkState } from \"./player_locomotion_teleport_teleport_blink_state.js\";\r\nimport { PlayerLocomotionTeleportTeleportShiftState } from \"./player_locomotion_teleport_teleport_shift_state.js\";\r\n\r\nexport let PlayerLocomotionTeleportTeleportType = {\r\n INSTANT: 0,\r\n BLINK: 1,\r\n SHIFT: 2\r\n};\r\n\r\nexport class PlayerLocomotionTeleportTeleportParams {\r\n\r\n constructor() {\r\n this.myTeleportType = PlayerLocomotionTeleportTeleportType.SHIFT;\r\n\r\n this.myInstantRotateMinAngleToRotate = 25;\r\n\r\n this.myBlinkFadeOutSeconds = 0.2;\r\n this.myBlinkFadeInSeconds = 0.2;\r\n this.myBlinkWaitSeconds = 0.1;\r\n this.myBlinkSphereColor = vec3_create();\r\n this.myBlinkSphereScale = 0.5;\r\n this.myBlinkRotateMinAngleToRotate = 25;\r\n\r\n this.myShiftMovementSeconds = 0.15;\r\n this.myShiftMovementSecondsMultiplierOverDistanceFunction = null;\r\n this.myShiftMovementEasingFunction = EasingFunction.easeInOut;\r\n\r\n this.myShiftRotateSeconds = 0.75;\r\n this.myShiftRotateSecondsMultiplierOverAngleFunction = null;\r\n this.myShiftRotateEasingFunction = EasingFunction.easeOutWeak;\r\n this.myShiftRotateStartAfterMovementPercentage = 0.7;\r\n this.myShiftRotateMinAngleToRotate = 25;\r\n this.myShiftRotateStopAngleThreshold = 0.25;\r\n\r\n this.myShiftRotateSecondsMultiplierOverAngleFunction = function (angle) {\r\n return EasingFunction.easeOut(angle / 180);\r\n };\r\n }\r\n}\r\n\r\nexport class PlayerLocomotionTeleportTeleportState extends PlayerLocomotionTeleportState {\r\n\r\n constructor(teleportParams, teleportRuntimeParams, locomotionRuntimeParams) {\r\n super(teleportParams, teleportRuntimeParams, locomotionRuntimeParams);\r\n\r\n this._myFSM = new FSM();\r\n //this._myFSM.setLogEnabled(true, \"Locomotion Teleport Teleport\");\r\n\r\n this._myFSM.addState(\"init\");\r\n this._myFSM.addState(\"idle\");\r\n\r\n this._myBlinkState = new PlayerLocomotionTeleportTeleportBlinkState(teleportParams, teleportRuntimeParams, locomotionRuntimeParams);\r\n this._myShiftState = new PlayerLocomotionTeleportTeleportShiftState(teleportParams, teleportRuntimeParams, locomotionRuntimeParams);\r\n\r\n this._myFSM.addState(\"instant_teleport\", this._instantUpdate.bind(this));\r\n this._myFSM.addState(\"blink_teleport\", this._myBlinkState);\r\n this._myFSM.addState(\"shift_teleport\", this._myShiftState);\r\n\r\n this._myFSM.addTransition(\"init\", \"idle\", \"start\");\r\n\r\n this._myFSM.addTransition(\"idle\", \"instant_teleport\", \"start_instant\", this._startInstantTeleport.bind(this));\r\n this._myFSM.addTransition(\"idle\", \"blink_teleport\", \"start_blink\");\r\n this._myFSM.addTransition(\"idle\", \"shift_teleport\", \"start_shift\");\r\n\r\n this._myFSM.addTransition(\"instant_teleport\", \"idle\", \"done\", this._teleportDone.bind(this));\r\n this._myFSM.addTransition(\"blink_teleport\", \"idle\", \"done\", this._teleportDone.bind(this));\r\n this._myFSM.addTransition(\"shift_teleport\", \"idle\", \"done\", this._teleportDone.bind(this));\r\n\r\n this._myFSM.addTransition(\"idle\", \"idle\", \"stop\");\r\n this._myFSM.addTransition(\"instant_teleport\", \"idle\", \"stop\", this._instantStop.bind(this));\r\n this._myFSM.addTransition(\"blink_teleport\", \"idle\", \"stop\");\r\n this._myFSM.addTransition(\"shift_teleport\", \"idle\", \"stop\");\r\n\r\n this._myFSM.addTransition(\"idle\", \"idle\", \"cancel\");\r\n this._myFSM.addTransition(\"instant_teleport\", \"idle\", \"cancel\", this._cancelInstant.bind(this));\r\n this._myFSM.addTransition(\"blink_teleport\", \"idle\", \"cancel\", this._cancelBlink.bind(this), SkipStateFunction.END);\r\n this._myFSM.addTransition(\"shift_teleport\", \"idle\", \"cancel\", this._cancelShift.bind(this), SkipStateFunction.END);\r\n\r\n this._myFSM.init(\"init\");\r\n this._myFSM.perform(\"start\");\r\n }\r\n\r\n start(fsm) {\r\n this._myParentFSM = fsm;\r\n\r\n switch (this._myTeleportParams.myTeleportParams.myTeleportType) {\r\n case PlayerLocomotionTeleportTeleportType.INSTANT:\r\n this._myFSM.perform(\"start_instant\");\r\n break;\r\n case PlayerLocomotionTeleportTeleportType.BLINK:\r\n this._myFSM.perform(\"start_blink\");\r\n break;\r\n case PlayerLocomotionTeleportTeleportType.SHIFT:\r\n this._myFSM.perform(\"start_shift\");\r\n break;\r\n default:\r\n this._myFSM.perform(\"start_instant\");\r\n }\r\n }\r\n\r\n end() {\r\n\r\n }\r\n\r\n cancelTeleport() {\r\n this._myFSM.perform(\"cancel\");\r\n }\r\n\r\n update(dt, fsm) {\r\n this._myFSM.update(dt);\r\n }\r\n\r\n completeTeleport() {\r\n this._myFSM.perform(\"stop\");\r\n }\r\n\r\n _startInstantTeleport() {\r\n // Implemented outside class definition\r\n }\r\n\r\n _instantUpdate(dt, fsm) {\r\n this._teleport();\r\n\r\n fsm.perform(\"done\");\r\n }\r\n\r\n _instantStop(fsm) {\r\n this._teleport();\r\n }\r\n\r\n _teleportDone() {\r\n this._myParentFSM.performDelayed(\"done\");\r\n }\r\n\r\n _cancelInstant() {\r\n this._myLocomotionRuntimeParams.myIsTeleporting = false;\r\n }\r\n\r\n _cancelBlink() {\r\n this._myBlinkState.cancelTeleport();\r\n }\r\n\r\n _cancelShift() {\r\n this._myShiftState.cancelTeleport();\r\n }\r\n}\r\n\r\n\r\n\r\n// IMPLEMENTATION\r\n\r\nPlayerLocomotionTeleportTeleportState.prototype._startInstantTeleport = function () {\r\n let playerUp = vec3_create();\r\n let playerForward = vec3_create();\r\n let flatTeleportForward = vec3_create();\r\n let feetRotationQuat = quat_create();\r\n return function _startInstantTeleport() {\r\n if (!this._myTeleportRuntimeParams.myTeleportForward.vec3_isZero(0.00001)) {\r\n let angleToPerform = 0;\r\n\r\n this._myTeleportParams.myPlayerTransformManager.getRotationRealQuat(feetRotationQuat);\r\n feetRotationQuat.quat_getUp(playerUp);\r\n feetRotationQuat.quat_getForward(playerForward);\r\n this._myTeleportRuntimeParams.myTeleportForward.vec3_removeComponentAlongAxis(playerUp, flatTeleportForward);\r\n\r\n if (!flatTeleportForward.vec3_isZero(0.00001)) {\r\n flatTeleportForward.vec3_normalize(flatTeleportForward);\r\n angleToPerform = flatTeleportForward.vec3_angle(playerForward);\r\n }\r\n\r\n if (angleToPerform < this._myTeleportParams.myTeleportParams.myInstantRotateMinAngleToRotate) {\r\n this._myTeleportRuntimeParams.myTeleportForward.vec3_zero();\r\n }\r\n }\r\n\r\n this._myLocomotionRuntimeParams.myIsTeleporting = true;\r\n };\r\n}();", "import { FSM, SkipStateFunction } from \"../../../../../../cauldron/fsm/fsm.js\";\r\nimport { XRUtils } from \"../../../../../../cauldron/utils/xr_utils.js\";\r\nimport { Handedness } from \"../../../../../../input/cauldron/input_types.js\";\r\nimport { MouseButtonID } from \"../../../../../../input/cauldron/mouse.js\";\r\nimport { GamepadAxesID } from \"../../../../../../input/gamepad/gamepad_buttons.js\";\r\nimport { quat_create, vec3_create } from \"../../../../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Globals } from \"../../../../../../pp/globals.js\";\r\nimport { PlayerLocomotionMovement } from \"../player_locomotion_movement.js\";\r\nimport { PlayerLocomotionTeleportDetectionParams, PlayerLocomotionTeleportDetectionState } from \"./player_locomotion_teleport_detection_state.js\";\r\nimport { PlayerLocomotionTeleportDetectionVisualizerParams } from \"./player_locomotion_teleport_detection_visualizer.js\";\r\nimport { PlayerLocomotionTeleportTeleportParams, PlayerLocomotionTeleportTeleportState } from \"./player_locomotion_teleport_teleport_state.js\";\r\n\r\nexport class PlayerLocomotionTeleportParams {\r\n\r\n constructor(engine = Globals.getMainEngine()) {\r\n this.myPlayerTransformManager = null;\r\n\r\n this.myDetectionParams = new PlayerLocomotionTeleportDetectionParams();\r\n this.myVisualizerParams = new PlayerLocomotionTeleportDetectionVisualizerParams();\r\n this.myTeleportParams = new PlayerLocomotionTeleportTeleportParams();\r\n\r\n this.myHandedness = Handedness.LEFT;\r\n\r\n this.myPerformTeleportAsMovement = false;\r\n this.myTeleportAsMovementMaxDistanceFromTeleportPosition = 0.001;\r\n this.myTeleportAsMovementMaxSteps = 2;\r\n // When checking teleport as movement u may need to move more times to get to the position due to snap and gravity\r\n // This specifies how many movement u can try to get to the teleport position\r\n\r\n this.myTeleportAsMovementRemoveVerticalMovement = true;\r\n // This can be used to remove the vertical movement from the difference from the current and teleport position so that u can apply just\r\n // the gravity as vertical movement\r\n this.myTeleportAsMovementExtraVerticalMovementPerMeter = 1; // This simulate the gravity for the teleport movement\r\n\r\n this.myStickIdleThreshold = 0.1;\r\n\r\n this.myAdjustPositionEveryFrame = false;\r\n this.myGravityAcceleration = 0;\r\n this.myMaxGravitySpeed = 0;\r\n\r\n this.myEngine = engine;\r\n\r\n this.myDebugEnabled = false;\r\n this.myDebugDetectEnabled = false;\r\n this.myDebugShowEnabled = false;\r\n this.myDebugVisibilityEnabled = false;\r\n }\r\n}\r\n\r\nexport class PlayerLocomotionTeleportRuntimeParams {\r\n\r\n constructor() {\r\n this.myTeleportPosition = vec3_create();\r\n this.myTeleportForward = vec3_create(0, 0, 0);\r\n }\r\n}\r\n\r\nexport class PlayerLocomotionTeleport extends PlayerLocomotionMovement {\r\n\r\n constructor(teleportParams, locomotionRuntimeParams) {\r\n super(locomotionRuntimeParams);\r\n\r\n this._myTeleportParams = teleportParams;\r\n this._myTeleportRuntimeParams = new PlayerLocomotionTeleportRuntimeParams();\r\n\r\n this._myStickIdleCharge = true;\r\n\r\n this._myDetectionState = new PlayerLocomotionTeleportDetectionState(this._myTeleportParams, this._myTeleportRuntimeParams, this._myLocomotionRuntimeParams);\r\n this._myTeleportState = new PlayerLocomotionTeleportTeleportState(this._myTeleportParams, this._myTeleportRuntimeParams, this._myLocomotionRuntimeParams);\r\n\r\n this._myFSM = new FSM();\r\n //this._myFSM.setLogEnabled(true, \"Locomotion Teleport\");\r\n\r\n this._myFSM.addState(\"init\");\r\n this._myFSM.addState(\"idle\", this._idleUpdate.bind(this));\r\n this._myFSM.addState(\"detect\", this._myDetectionState);\r\n this._myFSM.addState(\"teleport\", this._myTeleportState);\r\n\r\n this._myFSM.addTransition(\"init\", \"idle\", \"start\");\r\n\r\n this._myFSM.addTransition(\"idle\", \"detect\", \"detect\");\r\n this._myFSM.addTransition(\"detect\", \"teleport\", \"teleport\");\r\n this._myFSM.addTransition(\"teleport\", \"idle\", \"done\");\r\n\r\n this._myFSM.addTransition(\"idle\", \"idle\", \"stop\");\r\n this._myFSM.addTransition(\"detect\", \"idle\", \"stop\");\r\n this._myFSM.addTransition(\"teleport\", \"idle\", \"stop\", this._completeTeleport.bind(this));\r\n\r\n this._myFSM.addTransition(\"idle\", \"idle\", \"cancel\");\r\n this._myFSM.addTransition(\"detect\", \"idle\", \"cancel\");\r\n this._myFSM.addTransition(\"teleport\", \"idle\", \"cancel\", this._cancelTeleport.bind(this), SkipStateFunction.END);\r\n\r\n this._myFSM.init(\"init\");\r\n this._myFSM.perform(\"start\");\r\n\r\n this._myIsUpdating = false;\r\n this._myDestroyed = false;\r\n\r\n this.setActive(true);\r\n }\r\n\r\n start() {\r\n }\r\n\r\n stop() {\r\n this._myFSM.perform(\"stop\");\r\n }\r\n\r\n cancelTeleport() {\r\n if (!this._myIsUpdating && this._myFSM.isInState(\"teleport\")) {\r\n this._myFSM.perform(\"cancel\");\r\n }\r\n }\r\n\r\n canStop() {\r\n return this._myFSM.isInState(\"idle\");\r\n }\r\n\r\n isTeleporting() {\r\n return this._myFSM.isInState(\"teleport\");\r\n }\r\n\r\n getParams() {\r\n return this._myTeleportParams;\r\n }\r\n\r\n getTeleportRuntimeParams() {\r\n return this._myTeleportRuntimeParams;\r\n }\r\n\r\n update(dt) {\r\n if (!this.isActive()) return;\r\n\r\n this._myIsUpdating = true;\r\n\r\n this._prepareCollisionCheckParams();\r\n\r\n this._myLocomotionRuntimeParams.myTeleportJustPerformed = false;\r\n\r\n this._myFSM.update(dt);\r\n\r\n if (!this._myLocomotionRuntimeParams.myIsTeleporting && (this._myTeleportParams.myAdjustPositionEveryFrame || this._myTeleportParams.myGravityAcceleration != 0)) {\r\n this._applyGravity(dt);\r\n }\r\n\r\n if (this._myTeleportParams.myPlayerTransformManager.getCollisionRuntimeParams().myIsOnGround) {\r\n this._myLocomotionRuntimeParams.myIsFlying = false;\r\n }\r\n\r\n this._myIsUpdating = false;\r\n }\r\n\r\n _idleUpdate(dt) {\r\n if (this._startDetecting()) {\r\n this._myFSM.perform(\"detect\");\r\n }\r\n }\r\n\r\n _startDetecting() {\r\n let startDetecting = false;\r\n\r\n if (!XRUtils.isSessionActive(this._myTeleportParams.myEngine)) {\r\n startDetecting = Globals.getMouse(this._myTeleportParams.myEngine).isButtonPressStart(MouseButtonID.MIDDLE) &&\r\n Globals.getMouse(this._myTeleportParams.myEngine).isTargetingRenderCanvas();\r\n } else {\r\n let axes = Globals.getGamepads(this._myTeleportParams.myEngine)[this._myTeleportParams.myHandedness].getAxesInfo(GamepadAxesID.THUMBSTICK).getAxes();\r\n\r\n if (axes.vec2_length() <= this._myTeleportParams.myStickIdleThreshold) {\r\n this._myStickIdleCharge = true;\r\n }\r\n\r\n if (this._myStickIdleCharge && axes[1] >= 0.75) {\r\n this._myStickIdleCharge = false;\r\n startDetecting = true;\r\n }\r\n }\r\n\r\n return startDetecting;\r\n }\r\n\r\n _completeTeleport() {\r\n this._myTeleportState.completeTeleport();\r\n }\r\n\r\n _cancelDetection() {\r\n this._myDetectionState.cancel();\r\n }\r\n\r\n _cancelTeleport() {\r\n this._myTeleportState.cancelTeleport();\r\n }\r\n\r\n _prepareCollisionCheckParams() {\r\n //this._myTeleportCollisionCheckParams.copy(this._myTeleportParams.myPlayerTransformManager.getTeleportCollisionCheckParams());\r\n\r\n // Increased so to let teleport on steep slopes from above (from below is fixed through detection myGroundAngleToIgnoreUpward)\r\n // this._myTeleportCollisionCheckParams.myGroundAngleToIgnore = Math.max(61, this._myTeleportCollisionCheckParams.myGroundAngleToIgnore);\r\n\r\n /*\r\n this._myTeleportCollisionCheckParams.myExtraTeleportCheckCallback = function (\r\n offsetTeleportPosition, endPosition, feetPosition, transformUp, transformForward, height,\r\n collisionCheckParams, prevCollisionRuntimeParams, collisionRuntimeParams, newFeetPosition\r\n\r\n ) {\r\n let isTeleportingUpward = endPosition.vec3_isFartherAlongAxis(feetPosition, transformUp);\r\n if (isTeleportingUpward) {\r\n collisionRuntimeParams.myTeleportCanceled = collisionRuntimeParams.myGroundAngle > 30 + 0.0001;\r\n console.error(collisionRuntimeParams.myTeleportCanceled);\r\n }\r\n\r\n return newFeetPosition;\r\n }\r\n */\r\n\r\n /*\r\n * This is needed for when u want to perform the teleport as a movement\r\n * Maybe this should be another set of collsion check params copied from the smooth ones?\r\n * When you teleport as move, u check with the teleport for the position, and this other params for the move, so that u can use a smaller\r\n * cone, and sliding if desired\r\n * If nothing is specified it's copied from the teleport and if greater than 90 cone is tuned down, and also the below settings are applied\r\n\r\n * You could also do this if u want to perform the teleport as movement, instead of using the smooth\r\n * but this will make even the final teleport check be halved\r\n */\r\n\r\n /*\r\n this._myTeleportCollisionCheckParams.myHalfConeAngle = 90;\r\n this._myTeleportCollisionCheckParams.myHalfConeSliceAmount = 3;\r\n this._myTeleportCollisionCheckParams.myCheckHorizontalFixedForwardEnabled = false;\r\n this._myTeleportCollisionCheckParams.mySplitMovementEnabled = true;\r\n this._myTeleportCollisionCheckParams.mySplitMovementMaxLengthEnabled = true;\r\n this._myTeleportCollisionCheckParams.mySplitMovementMaxLength = this._myTeleportCollisionCheckParams.myRadius * 0.75;\r\n this._myTeleportCollisionCheckParams.mySplitMovementMinLengthEnabled = true;\r\n this._myTeleportCollisionCheckParams.mySplitMovementMinLength = params.mySplitMovementMaxLength;\r\n this._myTeleportCollisionCheckParams.mySplitMovementStopWhenHorizontalMovementCanceled = true;\r\n this._myTeleportCollisionCheckParams.mySplitMovementStopWhenVerticalMovementCanceled = true;\r\n\r\n this._myTeleportCollisionCheckParams.myDebugEnabled = true;\r\n */\r\n }\r\n\r\n destroy() {\r\n this._myDestroyed = true;\r\n\r\n this._myDetectionState.destroy();\r\n\r\n }\r\n\r\n isDestroyed() {\r\n return this._myDestroyed;\r\n }\r\n}\r\n\r\n\r\n\r\n// IMPLEMENTATION\r\n\r\nPlayerLocomotionTeleport.prototype._applyGravity = function () {\r\n let playerRotationQuat = quat_create();\r\n let playerUp = vec3_create();\r\n let gravityMovement = vec3_create();\r\n return function _applyGravity(dt) {\r\n // If gravity is zero it's still important to move to remain snapped and gather proper surface data even when not teleporting\r\n\r\n playerUp = this._myTeleportParams.myPlayerTransformManager.getRotationQuat(playerRotationQuat).quat_getUp(playerUp);\r\n\r\n gravityMovement.vec3_zero();\r\n if (!this._myLocomotionRuntimeParams.myIsFlying && !this._myLocomotionRuntimeParams.myIsTeleporting) {\r\n this._myLocomotionRuntimeParams.myGravitySpeed += this._myTeleportParams.myGravityAcceleration * dt;\r\n\r\n if (Math.abs(this._myLocomotionRuntimeParams.myGravitySpeed) > Math.abs(this._myTeleportParams.myMaxGravitySpeed)) {\r\n this._myLocomotionRuntimeParams.myGravitySpeed = Math.pp_sign(this._myTeleportParams.myGravityAcceleration) * Math.abs(this._myTeleportParams.myMaxGravitySpeed);\r\n }\r\n\r\n gravityMovement = playerUp.vec3_scale(this._myLocomotionRuntimeParams.myGravitySpeed * dt, gravityMovement);\r\n } else {\r\n this._myLocomotionRuntimeParams.myGravitySpeed = 0;\r\n }\r\n\r\n this._myTeleportParams.myPlayerTransformManager.move(gravityMovement, false);\r\n\r\n const collisionRuntimeParams = this._myTeleportParams.myPlayerTransformManager.getCollisionRuntimeParams();\r\n if (this._myLocomotionRuntimeParams.myGravitySpeed > 0 && collisionRuntimeParams.myIsOnCeiling ||\r\n this._myLocomotionRuntimeParams.myGravitySpeed < 0 && collisionRuntimeParams.myIsOnGround) {\r\n this._myLocomotionRuntimeParams.myGravitySpeed = 0;\r\n }\r\n };\r\n}();", "import { Timer } from \"../../../../../cauldron/cauldron/timer.js\";\r\nimport { XRUtils } from \"../../../../../cauldron/utils/xr_utils.js\";\r\nimport { Handedness } from \"../../../../../input/cauldron/input_types.js\";\r\nimport { InputUtils } from \"../../../../../input/cauldron/input_utils.js\";\r\nimport { GamepadAxesID, GamepadButtonID } from \"../../../../../input/gamepad/gamepad_buttons.js\";\r\nimport { quat2_create, quat_create, vec3_create } from \"../../../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Globals } from \"../../../../../pp/globals.js\";\r\nimport { Direction2DTo3DConverter, Direction2DTo3DConverterParams } from \"../../../../cauldron/cauldron/direction_2D_to_3D_converter.js\";\r\nimport { PlayerLocomotionDirectionReferenceType } from \"./player_locomotion.js\";\r\nimport { PlayerLocomotionMovement } from \"./player_locomotion_movement.js\";\r\n\r\nexport class PlayerLocomotionSmoothParams {\r\n\r\n constructor(engine = Globals.getMainEngine()) {\r\n this.myPlayerTransformManager = null;\r\n\r\n this.myMaxSpeed = 0;\r\n this.mySpeedSlowDownPercentageOnWallSlid = 1; // this is the target value for a 90 degrees slid, the more u move toward the wall the slower u go \r\n\r\n this.myMovementMinStickIntensityThreshold = 0;\r\n\r\n this.myFlyEnabled = false;\r\n this.myFlyWithButtonsEnabled = false;\r\n this.myFlyWithViewAngleEnabled = false;\r\n this.myMinAngleToFlyUpNonVR = 0;\r\n this.myMinAngleToFlyDownNonVR = 0;\r\n this.myMinAngleToFlyUpVR = 0;\r\n this.myMinAngleToFlyDownVR = 0;\r\n this.myMinAngleToFlyRight = 0;\r\n\r\n this.myGravityAcceleration = 0;\r\n this.myMaxGravitySpeed = 0;\r\n\r\n this.myDirectionInvertForwardWhenUpsideDown = true;\r\n this.myVRDirectionReferenceType = PlayerLocomotionDirectionReferenceType.HEAD;\r\n this.myVRDirectionReferenceObject = null;\r\n\r\n this.myHandedness = Handedness.LEFT;\r\n\r\n this.myAttemptMoveAgainWhenFailedDueToCeilingPopOut = true;\r\n\r\n this.myDebugFlyMaxSpeedMultiplier = 5;\r\n this.myMoveThroughCollisionShortcutEnabled = false;\r\n this.myMoveHeadShortcutEnabled = false;\r\n this.myTripleSpeedShortcutEnabled = false;\r\n\r\n this.myEngine = engine;\r\n }\r\n}\r\n\r\nexport class PlayerLocomotionSmooth extends PlayerLocomotionMovement {\r\n\r\n constructor(params, locomotionRuntimeParams) {\r\n super(locomotionRuntimeParams);\r\n\r\n this._myParams = params;\r\n\r\n this._myCurrentSpeed = 0;\r\n this._myLastHorizontalMovement = vec3_create();\r\n\r\n this._myDirectionReference = Globals.getPlayerObjects(this._myParams.myEngine).myHead;\r\n\r\n this._myStickIdleTimer = new Timer(0.25, false);\r\n\r\n let directionConverterNonVRParams = new Direction2DTo3DConverterParams(this._myParams.myEngine);\r\n directionConverterNonVRParams.myAutoUpdateFlyForward = this._myParams.myFlyEnabled && this._myParams.myFlyWithViewAngleEnabled;\r\n directionConverterNonVRParams.myAutoUpdateFlyRight = this._myParams.myFlyEnabled && this._myParams.myFlyWithViewAngleEnabled;\r\n directionConverterNonVRParams.myMinAngleToFlyForwardUp = this._myParams.myMinAngleToFlyUpNonVR;\r\n directionConverterNonVRParams.myMinAngleToFlyForwardDown = this._myParams.myMinAngleToFlyDownNonVR;\r\n directionConverterNonVRParams.myMinAngleToFlyRightUp = this._myParams.myMinAngleToFlyRight;\r\n directionConverterNonVRParams.myMinAngleToFlyRightDown = this._myParams.myMinAngleToFlyRight;\r\n directionConverterNonVRParams.myInvertForwardWhenUpsideDown = this._myParams.myDirectionInvertForwardWhenUpsideDown;\r\n\r\n let directionConverterVRParams = new Direction2DTo3DConverterParams(this._myParams.myEngine);\r\n directionConverterVRParams.myAutoUpdateFlyForward = this._myParams.myFlyEnabled && this._myParams.myFlyWithViewAngleEnabled;\r\n directionConverterVRParams.myAutoUpdateFlyRight = this._myParams.myFlyEnabled && this._myParams.myFlyWithViewAngleEnabled;\r\n directionConverterVRParams.myMinAngleToFlyForwardUp = this._myParams.myMinAngleToFlyUpVR;\r\n directionConverterVRParams.myMinAngleToFlyForwardDown = this._myParams.myMinAngleToFlyDownVR;\r\n directionConverterVRParams.myMinAngleToFlyRightUp = this._myParams.myMinAngleToFlyRight;\r\n directionConverterVRParams.myMinAngleToFlyRightDown = this._myParams.myMinAngleToFlyRight;\r\n directionConverterVRParams.myInvertForwardWhenUpsideDown = this._myParams.myDirectionInvertForwardWhenUpsideDown;\r\n\r\n this._myDirectionConverterNonVR = new Direction2DTo3DConverter(directionConverterNonVRParams);\r\n this._myDirectionConverterVR = new Direction2DTo3DConverter(directionConverterVRParams);\r\n this._myCurrentDirectionConverter = this._myDirectionConverterNonVR;\r\n\r\n this._myDebugFlyEnabled = false;\r\n\r\n this._myDestroyed = false;\r\n\r\n this.setActive(true);\r\n }\r\n\r\n start() {\r\n this._myCurrentSpeed = 0;\r\n this._myLastHorizontalMovement.vec3_zero();\r\n }\r\n\r\n setActive(active) {\r\n if (this.isActive() != active) {\r\n if (active) {\r\n XRUtils.registerSessionStartEndEventListeners(this, this._onXRSessionStart.bind(this), this._onXRSessionEnd.bind(this), true, false, this._myParams.myEngine);\r\n } else {\r\n XRUtils.unregisterSessionStartEndEventListeners(this, this._myParams.myEngine);\r\n }\r\n }\r\n\r\n super.setActive(active);\r\n }\r\n\r\n getParams() {\r\n return this._myParams;\r\n }\r\n\r\n getCurrentSpeed() {\r\n return this._myCurrentSpeed;\r\n }\r\n\r\n getLastHorizontalSpeed() {\r\n return this._myLastHorizontalMovement;\r\n }\r\n\r\n update(dt) {\r\n // Implemented outside class definition\r\n }\r\n\r\n setDebugFlyEnabled(enabled) {\r\n if (this._myDebugFlyEnabled != enabled) {\r\n if (!enabled) {\r\n this._myLocomotionRuntimeParams.myIsFlying = false;\r\n this._myCurrentDirectionConverter.resetFly();\r\n }\r\n }\r\n\r\n this._myDebugFlyEnabled = enabled;\r\n }\r\n\r\n isDebugFlyEnabled() {\r\n return this._myDebugFlyEnabled;\r\n }\r\n\r\n _onXRSessionStart(session) {\r\n // Implemented outside class definition\r\n }\r\n\r\n _onXRSessionEnd(session) {\r\n // Implemented outside class definition\r\n }\r\n\r\n destroy() {\r\n this._myDestroyed = true;\r\n\r\n this.setActive(false);\r\n }\r\n\r\n isDestroyed() {\r\n return this._myDestroyed;\r\n }\r\n}\r\n\r\n\r\n\r\n// IMPLEMENTATION\r\n\r\nPlayerLocomotionSmooth.prototype.update = function () {\r\n let playerRotationQuat = quat_create();\r\n let playerUp = vec3_create();\r\n let horizontalMovement = vec3_create();\r\n let headMovement = vec3_create();\r\n let direction = vec3_create();\r\n let directionOnUp = vec3_create();\r\n let verticalMovement = vec3_create();\r\n\r\n let directionReferenceTransformQuat = quat2_create();\r\n return function update(dt) {\r\n if (!this.isActive()) return;\r\n\r\n let debugFlyEnabled = this._myDebugFlyEnabled && Globals.isDebugEnabled(this._myParams.myEngine);\r\n\r\n this._myCurrentSpeed = 0;\r\n this._myLastHorizontalMovement.vec3_zero();\r\n\r\n playerUp = this._myParams.myPlayerTransformManager.getRotationQuat(playerRotationQuat).quat_getUp(playerUp);\r\n\r\n horizontalMovement.vec3_zero();\r\n headMovement.vec3_zero();\r\n\r\n let axes = Globals.getGamepads(this._myParams.myEngine)[this._myParams.myHandedness].getAxesInfo(GamepadAxesID.THUMBSTICK).getAxes();\r\n axes[0] = Math.abs(axes[0]) > this._myParams.myMovementMinStickIntensityThreshold ? axes[0] : 0;\r\n axes[1] = Math.abs(axes[1]) > this._myParams.myMovementMinStickIntensityThreshold ? axes[1] : 0;\r\n\r\n let isManuallyMoving = false;\r\n let maxSpeed = this._myParams.myMaxSpeed;\r\n if (debugFlyEnabled) {\r\n maxSpeed = maxSpeed * this._myParams.myDebugFlyMaxSpeedMultiplier;\r\n }\r\n\r\n if ((this._myParams.myTripleSpeedShortcutEnabled && Globals.isDebugEnabled(this._myParams.myEngine)) || debugFlyEnabled) {\r\n if (Globals.getGamepads(this._myParams.myEngine)[this._myParams.myHandedness].getButtonInfo(GamepadButtonID.SELECT).isPressed()) {\r\n maxSpeed *= 3;\r\n }\r\n }\r\n\r\n if (debugFlyEnabled && Globals.getGamepads(this._myParams.myEngine)[InputUtils.getOppositeHandedness(this._myParams.myHandedness)].getButtonInfo(GamepadButtonID.SELECT).isPressed()) {\r\n maxSpeed = this._myParams.myMaxSpeed;\r\n }\r\n\r\n const collisionRuntimeParams = this._myParams.myPlayerTransformManager.getCollisionRuntimeParams();\r\n\r\n if (!axes.vec2_isZero()) {\r\n this._myStickIdleTimer.start();\r\n\r\n direction = this._myCurrentDirectionConverter.convertTransformQuat(axes, this._myDirectionReference.pp_getTransformQuat(directionReferenceTransformQuat), playerUp, direction);\r\n\r\n if (!direction.vec3_isZero()) {\r\n this._myLocomotionRuntimeParams.myIsFlying = this._myLocomotionRuntimeParams.myIsFlying || direction.vec3_componentAlongAxis(playerUp, directionOnUp).vec3_length() > 0.000001;\r\n if (!this._myLocomotionRuntimeParams.myIsFlying) {\r\n direction = direction.vec3_removeComponentAlongAxis(playerUp, direction);\r\n }\r\n\r\n let movementIntensity = axes.vec2_length();\r\n this._myCurrentSpeed = Math.pp_lerp(0, maxSpeed, movementIntensity);\r\n\r\n if (collisionRuntimeParams.myIsSliding && this._myParams.mySpeedSlowDownPercentageOnWallSlid != 1) {\r\n let slowPercentage = this._myParams.mySpeedSlowDownPercentageOnWallSlid;\r\n\r\n let slidStrength = Math.pp_mapToRange(Math.abs(collisionRuntimeParams.mySlidingMovementAngle), 0, 90, 0, 1);\r\n slowPercentage = Math.pp_lerp(1, slowPercentage, slidStrength);\r\n\r\n this._myCurrentSpeed = this._myCurrentSpeed * slowPercentage;\r\n }\r\n\r\n horizontalMovement = direction.vec3_scale(this._myCurrentSpeed * dt, horizontalMovement);\r\n\r\n isManuallyMoving = true;\r\n }\r\n } else {\r\n if (this._myStickIdleTimer.isRunning()) {\r\n this._myStickIdleTimer.update(dt);\r\n if (this._myStickIdleTimer.isDone()) {\r\n this._myCurrentDirectionConverter.resetFly();\r\n }\r\n }\r\n }\r\n\r\n headMovement = headMovement.vec3_add(horizontalMovement, headMovement);\r\n\r\n if ((this._myParams.myFlyEnabled && this._myParams.myFlyWithButtonsEnabled) || debugFlyEnabled) {\r\n if (Globals.getGamepads(this._myParams.myEngine)[InputUtils.getOppositeHandedness(this._myParams.myHandedness)].getButtonInfo(GamepadButtonID.TOP_BUTTON).isPressed()) {\r\n verticalMovement = playerUp.vec3_scale(maxSpeed * dt, verticalMovement);\r\n headMovement = headMovement.vec3_add(verticalMovement, headMovement);\r\n this._myLocomotionRuntimeParams.myIsFlying = true;\r\n\r\n isManuallyMoving = true;\r\n } else if (Globals.getGamepads(this._myParams.myEngine)[InputUtils.getOppositeHandedness(this._myParams.myHandedness)].getButtonInfo(GamepadButtonID.BOTTOM_BUTTON).isPressed()) {\r\n verticalMovement = playerUp.vec3_scale(-maxSpeed * dt, verticalMovement);\r\n headMovement = headMovement.vec3_add(verticalMovement, headMovement);\r\n this._myLocomotionRuntimeParams.myIsFlying = true;\r\n\r\n isManuallyMoving = true;\r\n }\r\n\r\n if (Globals.getGamepads(this._myParams.myEngine)[InputUtils.getOppositeHandedness(this._myParams.myHandedness)].getButtonInfo(GamepadButtonID.BOTTOM_BUTTON).isPressEnd(2)) {\r\n this._myLocomotionRuntimeParams.myIsFlying = false;\r\n }\r\n }\r\n\r\n if (this._myParams.myMoveHeadShortcutEnabled && Globals.isDebugEnabled(this._myParams.myEngine) &&\r\n Globals.getGamepads(this._myParams.myEngine)[InputUtils.getOppositeHandedness(this._myParams.myHandedness)].getButtonInfo(GamepadButtonID.THUMBSTICK).isPressed()) {\r\n this._myParams.myPlayerTransformManager.getPlayerHeadManager().moveFeet(headMovement);\r\n } else if ((this._myParams.myMoveThroughCollisionShortcutEnabled && Globals.isDebugEnabled(this._myParams.myEngine) &&\r\n Globals.getGamepads(this._myParams.myEngine)[this._myParams.myHandedness].getButtonInfo(GamepadButtonID.THUMBSTICK).isPressed())\r\n || debugFlyEnabled) {\r\n this._myParams.myPlayerTransformManager.move(headMovement, true, isManuallyMoving ? true : false);\r\n\r\n if (isManuallyMoving) {\r\n this._myParams.myPlayerTransformManager.resetReal();\r\n }\r\n } else {\r\n if (!this._myLocomotionRuntimeParams.myIsFlying) {\r\n this._myLocomotionRuntimeParams.myGravitySpeed += this._myParams.myGravityAcceleration * dt;\r\n\r\n if (Math.abs(this._myLocomotionRuntimeParams.myGravitySpeed) > Math.abs(this._myParams.myMaxGravitySpeed)) {\r\n this._myLocomotionRuntimeParams.myGravitySpeed = Math.pp_sign(this._myParams.myGravityAcceleration) * Math.abs(this._myParams.myMaxGravitySpeed);\r\n }\r\n\r\n verticalMovement = playerUp.vec3_scale(this._myLocomotionRuntimeParams.myGravitySpeed * dt, verticalMovement);\r\n headMovement = headMovement.vec3_add(verticalMovement, headMovement);\r\n } else {\r\n this._myLocomotionRuntimeParams.myGravitySpeed = 0;\r\n }\r\n\r\n this._myParams.myPlayerTransformManager.move(headMovement, false, isManuallyMoving ? true : false);\r\n if (this._myParams.myAttemptMoveAgainWhenFailedDueToCeilingPopOut && isManuallyMoving && !horizontalMovement.vec3_isZero(0.000001)) {\r\n const collisionRuntimeParams = this._myParams.myPlayerTransformManager.getCollisionRuntimeParams();\r\n if (collisionRuntimeParams.myHorizontalMovementCanceled &&\r\n !collisionRuntimeParams.myVerticalMovementCanceled &&\r\n collisionRuntimeParams.myHasPoppedOutCeiling\r\n ) {\r\n // The pop out means it was inside a ceiling, can happen due to moving the head up when close to the ceiling\r\n // the pop fixes this but the horizontal movement is canceled before that, so we try it again\r\n this._myParams.myPlayerTransformManager.move(horizontalMovement, false, isManuallyMoving ? true : false);\r\n }\r\n }\r\n\r\n if (isManuallyMoving) {\r\n this._myParams.myPlayerTransformManager.resetReal();\r\n\r\n collisionRuntimeParams.myFixedMovement.vec3_removeComponentAlongAxis(\r\n collisionRuntimeParams.myOriginalUp,\r\n this._myLastHorizontalMovement\r\n );\r\n }\r\n\r\n if (this._myLocomotionRuntimeParams.myGravitySpeed > 0 && collisionRuntimeParams.myIsOnCeiling ||\r\n this._myLocomotionRuntimeParams.myGravitySpeed < 0 && collisionRuntimeParams.myIsOnGround) {\r\n this._myLocomotionRuntimeParams.myGravitySpeed = 0;\r\n }\r\n }\r\n\r\n if (collisionRuntimeParams.myIsOnGround) {\r\n this._myLocomotionRuntimeParams.myIsFlying = false;\r\n this._myCurrentDirectionConverter.resetFly();\r\n }\r\n };\r\n}();\r\n\r\nPlayerLocomotionSmooth.prototype._onXRSessionStart = function () {\r\n return function _onXRSessionStart(session) {\r\n switch (this._myParams.myVRDirectionReferenceType) {\r\n case 0:\r\n this._myDirectionReference = Globals.getPlayerObjects(this._myParams.myEngine).myHead;\r\n break;\r\n case 1:\r\n this._myDirectionReference = Globals.getPlayerObjects(this._myParams.myEngine).myHands[this._myParams.myHandedness];\r\n break;\r\n case 2:\r\n this._myDirectionReference = this._myParams.myVRDirectionReferenceObject;\r\n break;\r\n }\r\n\r\n this._myCurrentDirectionConverter = this._myDirectionConverterVR;\r\n this._myCurrentDirectionConverter.resetFly();\r\n };\r\n}();\r\n\r\nPlayerLocomotionSmooth.prototype._onXRSessionEnd = function () {\r\n return function _onXRSessionEnd(session) {\r\n this._myDirectionReference = Globals.getPlayerObjects(this._myParams.myEngine).myHead;\r\n this._myCurrentDirectionConverter = this._myDirectionConverterNonVR;\r\n\r\n this._myCurrentDirectionConverter.resetFly();\r\n };\r\n}();", "import { Component, Material, Object3D, property } from \"@wonderlandengine/api\";\r\nimport { Timer } from \"../../../../../../cauldron/cauldron/timer.js\";\r\nimport { PhysicsLayerFlags } from \"../../../../../../cauldron/physics/physics_layer_flags.js\";\r\nimport { PhysicsUtils } from \"../../../../../../cauldron/physics/physics_utils.js\";\r\nimport { InputUtils } from \"../../../../../../input/cauldron/input_utils.js\";\r\nimport { BasePose } from \"../../../../../../input/pose/base_pose.js\";\r\nimport { Globals } from \"../../../../../../pp/globals.js\";\r\nimport { PlayerLocomotion, PlayerLocomotionParams } from \"../player_locomotion.js\";\r\n\r\n/**\r\n * Tips \r\n * - Be sure that your colliders have faces on both sides of the mesh, this helps the collision check which otherise might be able to move through walls\r\n */\r\nexport class PlayerLocomotionComponent extends Component {\r\n public static override TypeName = \"pp-player-locomotion\";\r\n\r\n @property.enum([\"Smooth\", \"Teleport\"], \"Smooth\")\r\n private readonly _myDefaultLocomotionType!: number;\r\n\r\n @property.bool(true)\r\n private readonly _myAlwaysSmoothForNonVR!: boolean;\r\n\r\n /** Double press main hand thumbstick (default: left) to switch */\r\n @property.bool(true)\r\n private readonly _mySwitchLocomotionTypeShortcutEnabled!: boolean;\r\n\r\n @property.bool(false)\r\n private readonly _myStartIdle!: boolean;\r\n\r\n @property.string(\"0, 0, 0, 0, 0, 0, 0, 0\")\r\n private readonly _myPhysicsBlockLayerFlags!: string;\r\n\r\n\r\n @property.float(1.70)\r\n private readonly _myDefaultHeight!: number;\r\n\r\n @property.float(0.50)\r\n private readonly _myMinHeight!: number;\r\n\r\n @property.float(0.3)\r\n private readonly _myCharacterRadius!: number;\r\n\r\n /** Set this to `-1` to auto compute the feet radius based on {@link _myCharacterRadius} */\r\n @property.float(-1)\r\n private readonly _myCharacterFeetRadius!: number;\r\n\r\n @property.float(0.1)\r\n private readonly _myForeheadExtraHeight!: number;\r\n\r\n\r\n\r\n @property.float(2)\r\n private readonly _myMaxSpeed!: number;\r\n\r\n @property.float(100)\r\n private readonly _myMaxRotationSpeed!: number;\r\n\r\n @property.float(1)\r\n private readonly _mySpeedSlowDownPercentageOnWallSlid!: number;\r\n\r\n\r\n\r\n @property.float(-20)\r\n private readonly _myGravityAcceleration!: number;\r\n\r\n @property.float(-15)\r\n private readonly _myMaxGravitySpeed!: number;\r\n\r\n\r\n\r\n @property.bool(true)\r\n private readonly _myIsSnapTurn!: boolean;\r\n\r\n @property.bool(true)\r\n private readonly _mySnapTurnOnlyVR!: boolean;\r\n\r\n @property.float(30)\r\n private readonly _mySnapTurnAngle!: number;\r\n\r\n @property.float(0)\r\n private readonly _mySnapTurnSpeedDegrees!: number;\r\n\r\n\r\n\r\n @property.bool(false)\r\n private readonly _myFlyEnabled!: boolean;\r\n\r\n @property.bool(false)\r\n private readonly _myStartFlying!: boolean;\r\n\r\n @property.bool(false)\r\n private readonly _myFlyWithButtonsEnabled!: boolean;\r\n\r\n @property.bool(false)\r\n private readonly _myFlyWithViewAngleEnabled!: boolean;\r\n\r\n @property.float(30)\r\n private readonly _myMinAngleToFlyUpNonVR!: number;\r\n\r\n @property.float(40)\r\n private readonly _myMinAngleToFlyDownNonVR!: number;\r\n\r\n @property.float(30)\r\n private readonly _myMinAngleToFlyUpVR!: number;\r\n\r\n @property.float(40)\r\n private readonly _myMinAngleToFlyDownVR!: number;\r\n\r\n @property.float(90)\r\n private readonly _myMinAngleToFlyRight!: number;\r\n\r\n\r\n\r\n @property.enum([\"Left\", \"Right\"], \"Left\")\r\n private readonly _myMainHand!: number;\r\n\r\n @property.bool(true)\r\n private readonly _myDirectionInvertForwardWhenUpsideDown!: boolean;\r\n\r\n @property.enum([\"Head\", \"Hand\", \"Custom Object\"], \"Head\")\r\n private readonly _myVRDirectionReferenceType!: number;\r\n\r\n @property.object()\r\n private readonly _myVRDirectionReferenceObject!: Readonly;\r\n\r\n\r\n\r\n @property.enum([\"Instant\", \"Blink\", \"Shift\"], \"Shift\")\r\n private readonly _myTeleportType!: number;\r\n\r\n @property.float(3)\r\n private readonly _myTeleportMaxDistance!: number;\r\n\r\n @property.float(1.25)\r\n private readonly _myTeleportMaxHeightDifference!: number;\r\n\r\n /** If empty use {@link _myPhysicsBlockLayerFlags} */\r\n @property.string(\"\")\r\n private readonly _myTeleportFloorLayerFlags!: string;\r\n\r\n @property.bool(false)\r\n private readonly _myTeleportRotationOnUpEnabled!: boolean;\r\n\r\n @property.material()\r\n private readonly _myTeleportValidMaterial!: Readonly;\r\n\r\n @property.material()\r\n private readonly _myTeleportInvalidMaterial!: Readonly;\r\n\r\n @property.object()\r\n private readonly _myTeleportPositionObject!: Readonly;\r\n\r\n @property.bool(true)\r\n private readonly _myTeleportPositionObjectRotateWithHead!: boolean;\r\n\r\n @property.object()\r\n private readonly _myTeleportParableStartReferenceObject!: Readonly;\r\n\r\n\r\n\r\n @property.bool(true)\r\n private readonly _myResetRealOnStart!: boolean;\r\n\r\n /**\r\n * #WARN With `_myResetRealOnStartFramesAmount` at `1` it can happen that you enter the session like 1 frame before the game load\r\n * and the head pose might have not been properly initialized yet in the WebXR API, so the reset real will not happen has expected \r\n * Since this is a sort of edge case (either u enter after the load, or you were already in for more than 2-3 frames), and that\r\n * setting this to more than `1` can cause a visible (even if very short) stutter after the load (due to resetting the head multiple times),\r\n * it's better to keep this value at `1` \r\n * A possible effect of the edge case is the view being obscured on start because it thinks you are colliding\r\n * \r\n * A value of `3` will make u sure that the head pose will be initialized and the reset real will happen as expected in any case \r\n * For example, if u have a total fade at start and nothing can be seen aside the clear color for at least, let's say, 10 frames, \r\n * you can set this to `3` safely, since there will be no visible stutter to be seen (beside the clear color)\r\n */\r\n @property.int(1)\r\n private readonly _myResetRealOnStartFramesAmount!: number;\r\n\r\n /** Can fix some head through floor issues, when you can move your head completely to the other side of the floor \r\n If the floors are thick enough that this can't happen, you can leave this to false */\r\n @property.bool(true)\r\n private readonly _myResetHeadToFeetInsteadOfReal!: boolean;\r\n\r\n @property.float(0.25)\r\n private readonly _myResetHeadToRealMinDistance!: number;\r\n\r\n @property.int(-1)\r\n private readonly _myMaxHeadToRealHeadSteps!: number;\r\n\r\n\r\n\r\n /** Valid means, for example, that the real player has not moved inside a wall by moving in the real space */\r\n @property.bool(true)\r\n private readonly _mySyncWithRealWorldPositionOnlyIfValid!: boolean;\r\n\r\n /** Valid means, for example, that the real player has not moved inside a wall by moving in the real space */\r\n @property.bool(true)\r\n private readonly _mySyncWithRealHeightOnlyIfValid!: boolean;\r\n\r\n @property.bool(false)\r\n private readonly _mySnapRealPositionToGround!: boolean;\r\n\r\n @property.bool(false)\r\n private readonly _myPreventRealFromColliding!: boolean;\r\n\r\n @property.bool(true)\r\n private readonly _myViewOcclusionInsideWallsEnabled!: boolean;\r\n\r\n /** If empty use {@link _myPhysicsBlockLayerFlags} */\r\n @property.string(\"\")\r\n private readonly _myViewOcclusionLayerFlags!: string;\r\n\r\n /**\r\n * To avoid occlusion issues when moving when touching a tilted ceiling (which is not commong anyway), \r\n * this value should be a bit lower than {@link _myCharacterFeetRadius}\r\n * \r\n * If you have a high camera near value, you might need to increase this value, even though the view occlusion might become more aggressive\r\n */\r\n @property.float(0.145)\r\n private readonly _myViewOcclusionHeadRadius!: number;\r\n\r\n /**\r\n * Half of this value should be a bit lower than {@link _myForeheadExtraHeight} plus {@link _myColliderExtraHeight}, otherwise view occlusion might \r\n * trigger simply when moving under a low ceiling\r\n * \r\n * If you have a high camera near value, you might need to increase this value, even though the view occlusion might become more aggressive\r\n */\r\n @property.float(0.15)\r\n private readonly _myViewOcclusionHeadHeight!: number;\r\n\r\n @property.float(0.1)\r\n private readonly _myViewOcclusionFadeOutSeconds!: number;\r\n\r\n @property.float(0.025)\r\n private readonly _myViewOcclusionMaxRealHeadDistance!: number;\r\n\r\n\r\n\r\n @property.bool(false)\r\n private readonly _mySyncNonVRHeightWithVROnExitSession!: boolean;\r\n\r\n @property.bool(false)\r\n private readonly _mySyncNonVRVerticalAngleWithVROnExitSession!: boolean;\r\n\r\n\r\n\r\n @property.bool(true)\r\n private readonly _mySyncHeadWithRealAfterLocomotionUpdateIfNeeded!: boolean;\r\n\r\n\r\n\r\n @property.enum([\"Very Low\", \"Low\", \"Medium\", \"High\", \"Very High\"], \"High\")\r\n private readonly _myColliderAccuracy!: number;\r\n\r\n /**\r\n * If you enable this, you might also want to disable {@link _myColliderCheckCeilings}, \r\n * since it doesn't make much sense to check for ceilings when not checking the height\r\n */\r\n @property.bool(false)\r\n private readonly _myColliderCheckOnlyFeet!: boolean;\r\n\r\n /**\r\n * If you enable this, you might also want to disable {@link _myColliderCheckOnlyFeet}, \r\n * since it doesn't make much sense to check for ceilings without also checking the height\r\n */\r\n @property.bool(true)\r\n private readonly _myColliderCheckCeilings!: boolean;\r\n\r\n @property.bool(true)\r\n private readonly _myColliderSlideAlongWall!: boolean;\r\n\r\n @property.float(30)\r\n private readonly _myColliderMaxWalkableGroundAngle!: number;\r\n\r\n /** \r\n * This is useful if you want the locomotion teleport feature to be able to go downhill\r\n * on surfaces steeper than {@link _myColliderMaxWalkableGroundAngle}\r\n * \r\n * By default the locomotion teleport can't go up on surfaces steeper than {@link _myColliderMaxWalkableGroundAngle} anyway,\r\n * no matter, the value of {@link _myColliderMaxTeleportableGroundAngle}\r\n * \r\n * If you set this to a value bigger than {@link _myColliderMaxWalkableGroundAngle} you will be able to teleport in any case on steeper surfaces,\r\n * so be careful if you want that, even though usually it's safe, since teleport positions, aside from the locomotion teleport ones, are predefined and\r\n * safe positions\r\n * \r\n * The idea is that with the locomotion smooth you can always go downhill but might no be able to climb back up due to the surface beeing steep,\r\n * this sort of replicates that for the locomotion, letting you teleport down on steep surfaces but not up\r\n */\r\n @property.float(-1)\r\n private readonly _myColliderMaxTeleportableGroundAngle!: number;\r\n\r\n @property.bool(true)\r\n private readonly _myColliderSnapOnGround!: boolean;\r\n\r\n @property.float(0.1)\r\n private readonly _myColliderMaxDistanceToSnapOnGround!: number;\r\n\r\n @property.float(0.2)\r\n private readonly _myColliderMaxDistanceToPopOutGround!: number;\r\n\r\n @property.float(0.1)\r\n private readonly _myColliderMaxWalkableGroundStepHeight!: number;\r\n\r\n /**\r\n * Allowing walkable steps on ceiling might create issues with view occlusion for the player (especially with a high value) \r\n * since you can go more under some low ceiling making the occlusion head collide with it\r\n * \r\n * Settings it to zero is safer, but means that the ceilings physx must be more flat, because it's easier that a small ceiling bump now blocks you\r\n * \r\n * If you want this to be higher than 0, you might also want to increase {@link _myColliderExtraHeight} by this value to avoid issue with view occlusion\r\n * It will need you to be further from ceiling to be able to move under them tho (since it will be like wearing a hat as tall as {@link _myColliderExtraHeight})\r\n */\r\n @property.float(0)\r\n private readonly _myColliderMaxWalkableCeilingStepHeight!: number;\r\n\r\n @property.bool(false)\r\n private readonly _myColliderPreventFallingFromEdges!: boolean;\r\n\r\n @property.int(3)\r\n private readonly _myColliderMaxMovementSteps!: number;\r\n\r\n /**\r\n * Helps staying a little further from the ceiling\r\n * \r\n * If you need to increase {@link _myViewOcclusionHeadRadius}, also increasing this can help preventing view occlusion happening when shouldn't\r\n */\r\n @property.float(0.025)\r\n private readonly _myColliderExtraHeight!: number;\r\n\r\n\r\n\r\n /** Main hand (default: left) select + thumbstick press, auto switch to smooth */\r\n @property.bool(false)\r\n private readonly _myDebugFlyShortcutEnabled!: boolean;\r\n\r\n @property.float(5)\r\n private readonly _myDebugFlyMaxSpeedMultiplier!: number;\r\n\r\n /** Main hand (default: left) thumbstick pressed while moving */\r\n @property.bool(false)\r\n private readonly _myMoveThroughCollisionShortcutEnabled!: boolean;\r\n\r\n /** Not main hand (default: right) thumbstick pressed while moving */\r\n @property.bool(false)\r\n private readonly _myMoveHeadShortcutEnabled!: boolean;\r\n\r\n /** Main hand (default: left) select pressed while moving */\r\n @property.bool(false)\r\n private readonly _myTripleSpeedShortcutEnabled!: boolean;\r\n\r\n\r\n\r\n @property.bool(false)\r\n private readonly _myDebugHorizontalEnabled!: boolean;\r\n\r\n @property.bool(false)\r\n private readonly _myDebugVerticalEnabled!: boolean;\r\n\r\n\r\n\r\n @property.bool(false)\r\n private readonly _myCollisionCheckDisabled!: boolean;\r\n\r\n\r\n\r\n @property.bool(false)\r\n private readonly _myRaycastCountLogEnabled!: boolean;\r\n\r\n @property.bool(false)\r\n private readonly _myRaycastVisualDebugEnabled!: boolean;\r\n\r\n @property.bool(false)\r\n private readonly _myPerformanceLogEnabled!: boolean;\r\n\r\n\r\n\r\n private readonly _myPlayerLocomotion: PlayerLocomotion | null = null;\r\n\r\n private _myRegisterToPostPoseUpdateOnNextUpdate: boolean = false;\r\n private _myActivateOnNextPostPoseUpdate: boolean = false;\r\n\r\n private readonly _myDebugPerformanceLogTimer: Timer = new Timer(0.5);\r\n private _myDebugPerformanceLogTotalTime: number = 0;\r\n private _myDebugPerformanceLogFrameCount: number = 0;\r\n\r\n\r\n\r\n private _start(): void {\r\n const params = new PlayerLocomotionParams(this.engine);\r\n\r\n params.myDefaultLocomotionType = this._myDefaultLocomotionType;\r\n params.myAlwaysSmoothForNonVR = this._myAlwaysSmoothForNonVR;\r\n params.mySwitchLocomotionTypeShortcutEnabled = this._mySwitchLocomotionTypeShortcutEnabled;\r\n params.myStartIdle = this._myStartIdle;\r\n\r\n params.myDefaultHeight = this._myDefaultHeight;\r\n params.myMinHeight = this._myMinHeight;\r\n\r\n params.myMaxSpeed = this._myMaxSpeed;\r\n params.myMaxRotationSpeed = this._myMaxRotationSpeed;\r\n params.myGravityAcceleration = this._myGravityAcceleration;\r\n params.myMaxGravitySpeed = this._myMaxGravitySpeed;\r\n\r\n params.myCharacterRadius = this._myCharacterRadius;\r\n params.myCharacterFeetRadius = this._myCharacterFeetRadius >= 0 ? this._myCharacterFeetRadius : null;\r\n\r\n params.mySpeedSlowDownPercentageOnWallSlid = this._mySpeedSlowDownPercentageOnWallSlid;\r\n\r\n params.myIsSnapTurn = this._myIsSnapTurn;\r\n params.mySnapTurnOnlyVR = this._mySnapTurnOnlyVR;\r\n params.mySnapTurnAngle = this._mySnapTurnAngle;\r\n params.mySnapTurnSpeedDegrees = this._mySnapTurnSpeedDegrees;\r\n\r\n params.myFlyEnabled = this._myFlyEnabled;\r\n params.myStartFlying = this._myStartFlying;\r\n params.myFlyWithButtonsEnabled = this._myFlyWithButtonsEnabled;\r\n params.myFlyWithViewAngleEnabled = this._myFlyWithViewAngleEnabled;\r\n params.myMinAngleToFlyUpNonVR = this._myMinAngleToFlyUpNonVR;\r\n params.myMinAngleToFlyDownNonVR = this._myMinAngleToFlyDownNonVR;\r\n params.myMinAngleToFlyUpVR = this._myMinAngleToFlyUpVR;\r\n params.myMinAngleToFlyDownVR = this._myMinAngleToFlyDownVR;\r\n params.myMinAngleToFlyRight = this._myMinAngleToFlyRight;\r\n\r\n params.myMainHand = InputUtils.getHandednessByIndex(this._myMainHand)!;\r\n\r\n params.myDirectionInvertForwardWhenUpsideDown = this._myDirectionInvertForwardWhenUpsideDown;\r\n params.myVRDirectionReferenceType = this._myVRDirectionReferenceType;\r\n params.myVRDirectionReferenceObject = this._myVRDirectionReferenceObject;\r\n\r\n params.myForeheadExtraHeight = this._myForeheadExtraHeight;\r\n\r\n params.myTeleportType = this._myTeleportType;\r\n params.myTeleportMaxDistance = this._myTeleportMaxDistance;\r\n params.myTeleportMaxHeightDifference = this._myTeleportMaxHeightDifference;\r\n params.myTeleportRotationOnUpEnabled = this._myTeleportRotationOnUpEnabled;\r\n params.myTeleportValidMaterial = this._myTeleportValidMaterial;\r\n params.myTeleportInvalidMaterial = this._myTeleportInvalidMaterial;\r\n params.myTeleportPositionObject = this._myTeleportPositionObject;\r\n params.myTeleportPositionObjectRotateWithHead = this._myTeleportPositionObjectRotateWithHead;\r\n params.myTeleportParableStartReferenceObject = this._myTeleportParableStartReferenceObject;\r\n\r\n params.myResetRealOnStart = this._myResetRealOnStart;\r\n params.myResetRealOnStartFramesAmount = this._myResetRealOnStartFramesAmount;\r\n params.myResetHeadToFeetInsteadOfReal = this._myResetHeadToFeetInsteadOfReal;\r\n params.myResetHeadToRealMinDistance = this._myResetHeadToRealMinDistance;\r\n params.myMaxHeadToRealHeadSteps = this._myMaxHeadToRealHeadSteps > 0 ? this._myMaxHeadToRealHeadSteps : null;\r\n\r\n params.mySyncWithRealWorldPositionOnlyIfValid = this._mySyncWithRealWorldPositionOnlyIfValid;\r\n params.mySyncWithRealHeightOnlyIfValid = this._mySyncWithRealHeightOnlyIfValid;\r\n params.mySnapRealPositionToGround = this._mySnapRealPositionToGround;\r\n params.myPreventRealFromColliding = this._myPreventRealFromColliding;\r\n params.myViewOcclusionInsideWallsEnabled = this._myViewOcclusionInsideWallsEnabled;\r\n params.myViewOcclusionHeadRadius = this._myViewOcclusionHeadRadius;\r\n params.myViewOcclusionHeadHeight = this._myViewOcclusionHeadHeight;\r\n params.myViewOcclusionFadeOutSeconds = this._myViewOcclusionFadeOutSeconds;\r\n params.myViewOcclusionMaxRealHeadDistance = this._myViewOcclusionMaxRealHeadDistance;\r\n\r\n params.mySyncNonVRHeightWithVROnExitSession = this._mySyncNonVRHeightWithVROnExitSession;\r\n params.mySyncNonVRVerticalAngleWithVROnExitSession = this._mySyncNonVRVerticalAngleWithVROnExitSession;\r\n\r\n params.mySyncHeadWithRealAfterLocomotionUpdateIfNeeded = this._mySyncHeadWithRealAfterLocomotionUpdateIfNeeded;\r\n\r\n params.myColliderAccuracy = this._myColliderAccuracy;\r\n params.myColliderCheckOnlyFeet = this._myColliderCheckOnlyFeet;\r\n params.myColliderCheckCeilings = this._myColliderCheckCeilings;\r\n params.myColliderSlideAlongWall = this._myColliderSlideAlongWall;\r\n params.myColliderMaxWalkableGroundAngle = this._myColliderMaxWalkableGroundAngle;\r\n params.myColliderMaxTeleportableGroundAngle = this._myColliderMaxTeleportableGroundAngle < 0 ? null : this._myColliderMaxTeleportableGroundAngle;\r\n params.myColliderSnapOnGround = this._myColliderSnapOnGround;\r\n params.myColliderMaxDistanceToSnapOnGround = this._myColliderMaxDistanceToSnapOnGround;\r\n params.myColliderMaxDistanceToPopOutGround = this._myColliderMaxDistanceToPopOutGround;\r\n params.myColliderMaxWalkableGroundStepHeight = this._myColliderMaxWalkableGroundStepHeight;\r\n params.myColliderMaxWalkableCeilingStepHeight = this._myColliderMaxWalkableCeilingStepHeight;\r\n params.myColliderPreventFallingFromEdges = this._myColliderPreventFallingFromEdges;\r\n params.myColliderMaxMovementSteps = this._myColliderMaxMovementSteps > 0 ? this._myColliderMaxMovementSteps : null;\r\n params.myColliderExtraHeight = this._myColliderExtraHeight;\r\n\r\n params.myDebugFlyShortcutEnabled = this._myDebugFlyShortcutEnabled;\r\n params.myDebugFlyMaxSpeedMultiplier = this._myDebugFlyMaxSpeedMultiplier;\r\n params.myMoveThroughCollisionShortcutEnabled = this._myMoveThroughCollisionShortcutEnabled;\r\n params.myMoveHeadShortcutEnabled = this._myMoveHeadShortcutEnabled;\r\n params.myTripleSpeedShortcutEnabled = this._myTripleSpeedShortcutEnabled;\r\n\r\n params.myDebugHorizontalEnabled = this._myDebugHorizontalEnabled;\r\n params.myDebugVerticalEnabled = this._myDebugVerticalEnabled;\r\n\r\n params.myCollisionCheckDisabled = this._myCollisionCheckDisabled;\r\n\r\n params.myPhysicsBlockLayerFlags.copy(this._getPhysicsBlockLayersFlags());\r\n params.myTeleportFloorLayerFlags.copy(this._getTeleportFloorLayersFlags());\r\n params.myViewOcclusionLayerFlags.copy(this._getViewOcclusionLayersFlags());\r\n\r\n (this._myPlayerLocomotion as PlayerLocomotion) = new PlayerLocomotion(params);\r\n }\r\n\r\n public override update(dt: number): void {\r\n if (this._myRegisterToPostPoseUpdateOnNextUpdate) {\r\n Globals.getHeadPose(this.engine)!.registerPostPoseUpdatedEventListener(this, this.onPostPoseUpdatedEvent.bind(this));\r\n\r\n this._myRegisterToPostPoseUpdateOnNextUpdate = false;\r\n }\r\n }\r\n\r\n public onPostPoseUpdatedEvent(dt: number, pose: Readonly, manualUpdate: boolean): void {\r\n if (!this.active || this._myRegisterToPostPoseUpdateOnNextUpdate) {\r\n Globals.getHeadPose(this.engine)?.unregisterPostPoseUpdatedEventListener(this);\r\n return;\r\n }\r\n\r\n if (manualUpdate) return;\r\n\r\n let setPlayerLocomotionOnGlobals = false;\r\n if (this._myActivateOnNextPostPoseUpdate) {\r\n setPlayerLocomotionOnGlobals = this._onActivate();\r\n\r\n this._myActivateOnNextPostPoseUpdate = false;\r\n }\r\n\r\n if (!this._myPlayerLocomotion!.isStarted()) {\r\n this._myPlayerLocomotion!.start();\r\n }\r\n\r\n if (!setPlayerLocomotionOnGlobals && Globals.hasPlayerLocomotion(this.engine) && Globals.getPlayerLocomotion(this.engine) != this._myPlayerLocomotion) return;\r\n\r\n let startTime = 0;\r\n if (this._myPerformanceLogEnabled && Globals.isDebugEnabled(this.engine)) {\r\n startTime = window.performance.now();\r\n }\r\n\r\n let raycastVisualDebugEnabledBackup = false;\r\n if (this._myRaycastVisualDebugEnabled && Globals.isDebugEnabled(this.engine)) {\r\n raycastVisualDebugEnabledBackup = PhysicsUtils.isRaycastVisualDebugEnabled(this.engine.physics!);\r\n PhysicsUtils.setRaycastVisualDebugEnabled(true, this.engine.physics!);\r\n }\r\n\r\n if (this._myRaycastCountLogEnabled && Globals.isDebugEnabled(this.engine)) {\r\n PhysicsUtils.resetRaycastCount(this.engine.physics!);\r\n }\r\n\r\n this._myPlayerLocomotion!.update(dt);\r\n\r\n if (this._myPerformanceLogEnabled && Globals.isDebugEnabled(this.engine)) {\r\n const endTime = window.performance.now();\r\n this._myDebugPerformanceLogTotalTime += endTime - startTime;\r\n this._myDebugPerformanceLogFrameCount++;\r\n\r\n this._myDebugPerformanceLogTimer.update(dt);\r\n if (this._myDebugPerformanceLogTimer.isDone()) {\r\n this._myDebugPerformanceLogTimer.start();\r\n\r\n const averageTime = this._myDebugPerformanceLogTotalTime / this._myDebugPerformanceLogFrameCount;\r\n\r\n console.log(\"Locomotion ms: \" + averageTime.toFixed(3));\r\n\r\n this._myDebugPerformanceLogTotalTime = 0;\r\n this._myDebugPerformanceLogFrameCount = 0;\r\n }\r\n }\r\n\r\n if (this._myRaycastVisualDebugEnabled && Globals.isDebugEnabled(this.engine)) {\r\n PhysicsUtils.setRaycastVisualDebugEnabled(raycastVisualDebugEnabledBackup, this.engine.physics!);\r\n }\r\n\r\n if (this._myRaycastCountLogEnabled && Globals.isDebugEnabled(this.engine)) {\r\n console.log(\"Raycast count: \" + PhysicsUtils.getRaycastCount(this.engine.physics!));\r\n PhysicsUtils.resetRaycastCount(this.engine.physics!);\r\n }\r\n\r\n if (setPlayerLocomotionOnGlobals && !Globals.hasPlayerLocomotion(this.engine)) {\r\n // This is done to only set the global when the locomotion is active and updated, so \"ready\"\r\n Globals.setPlayerLocomotion(this._myPlayerLocomotion!, this.engine);\r\n } else if (setPlayerLocomotionOnGlobals && Globals.getPlayerLocomotion(this.engine) != this._myPlayerLocomotion) {\r\n // If someone in some way managed to set the globals, just deactivate this one, which was just being activated since the flag is true\r\n this._myPlayerLocomotion!.setActive(false);\r\n }\r\n }\r\n\r\n public getPlayerLocomotion(): PlayerLocomotion | null {\r\n return this._myPlayerLocomotion;\r\n }\r\n\r\n public override onActivate(): void {\r\n this._myRegisterToPostPoseUpdateOnNextUpdate = true;\r\n this._myActivateOnNextPostPoseUpdate = true;\r\n }\r\n\r\n public override onDeactivate(): void {\r\n Globals.getHeadPose(this.engine)?.unregisterPostPoseUpdatedEventListener(this);\r\n\r\n if (this._myPlayerLocomotion != null) {\r\n this._myPlayerLocomotion.setActive(false);\r\n\r\n if (Globals.getPlayerLocomotion(this.engine) == this._myPlayerLocomotion) {\r\n Globals.removePlayerLocomotion(this.engine);\r\n }\r\n }\r\n }\r\n\r\n private _onActivate(): boolean {\r\n let setPlayerLocomotionOnGlobals = false;\r\n\r\n if (this._myPlayerLocomotion == null) {\r\n this._start();\r\n }\r\n\r\n if (!Globals.hasPlayerLocomotion(this.engine)) {\r\n this._myPlayerLocomotion!.setActive(true);\r\n setPlayerLocomotionOnGlobals = true;\r\n }\r\n\r\n return setPlayerLocomotionOnGlobals;\r\n }\r\n\r\n private _getPhysicsBlockLayersFlags(): PhysicsLayerFlags {\r\n return this._convertStringToLayerFlags(this._myPhysicsBlockLayerFlags);\r\n }\r\n\r\n private _getTeleportFloorLayersFlags(): PhysicsLayerFlags {\r\n if (this._myTeleportFloorLayerFlags.length == 0) {\r\n return this._getPhysicsBlockLayersFlags();\r\n }\r\n\r\n return this._convertStringToLayerFlags(this._myTeleportFloorLayerFlags);\r\n }\r\n\r\n private _getViewOcclusionLayersFlags(): PhysicsLayerFlags {\r\n if (this._myViewOcclusionLayerFlags.length == 0) {\r\n return this._getPhysicsBlockLayersFlags();\r\n }\r\n\r\n return this._convertStringToLayerFlags(this._myViewOcclusionLayerFlags);\r\n }\r\n\r\n private _convertStringToLayerFlags(string: string): PhysicsLayerFlags {\r\n const physicsFlags = new PhysicsLayerFlags();\r\n\r\n const flags = [...string.split(\",\")];\r\n for (let i = 0; i < flags.length; i++) {\r\n physicsFlags.setFlagActive(i, flags[i].trim() == \"1\");\r\n }\r\n\r\n return physicsFlags;\r\n }\r\n\r\n public override onDestroy(): void {\r\n if (this._myPlayerLocomotion != null) {\r\n this._myPlayerLocomotion.destroy();\r\n }\r\n }\r\n}", "import { CollisionComponent, Component, Object3D, PhysXComponent, property } from \"@wonderlandengine/api\";\r\nimport { Cursor, CursorTarget } from \"@wonderlandengine/components\";\r\nimport { PhysicsCollisionCollector } from \"../../../cauldron/physics/physics_collision_collector.js\";\r\nimport { Vector3 } from \"../../../cauldron/type_definitions/array_type_definitions.js\";\r\nimport { vec3_create } from \"../../../plugin/js/extensions/array/vec_create_extension.js\";\r\n\r\n/** #WARN This class is not actually a `Cursor`, but since it triggers `CursorTarget` emitters, it needs to forward a `Cursor` to them \r\n As of now, this class forward a fake cursor as `Cursor`, which is a plain object with just the info usually need, like the `handedness` value */\r\nexport class OverlapCursorComponent extends Component {\r\n public static override TypeName = \"pp-overlap-cursor\";\r\n\r\n /** \r\n * This is useful if you want to avoid the cursor entering and exiting the target when very close to the target, \r\n * due to it flickering between inside and outside. \r\n * You can scale the collision up a bit so that it needs to move a bit outside to actually exit, so that it will not collide \r\n * \r\n * #WARN When using a `PhysXComponent` sadly this require to active and deactivate it to update the extents, which triggers a collision end and a start \r\n * This is not an issue for the cursor, but if you use the same `PhysXComponent` for other queries, you might have issues due to this \r\n */\r\n @property.float(1.125)\r\n private readonly _myCollisionSizeMultiplierOnOverlap!: number;\r\n\r\n @property.float(90)\r\n private readonly _myValidOverlapAngleFromTargetForward!: number;\r\n\r\n private _myLastTarget: CursorTarget | null = null;\r\n\r\n private _myPhysXComponent: PhysXComponent | null = null;\r\n private _myPhysicsCollisionCollector: PhysicsCollisionCollector | null = null;\r\n private readonly _myPhysXComponentExtents: Vector3 = vec3_create();\r\n private _myCollisionComponent: CollisionComponent | null = null;\r\n private readonly _myCollisionComponentExtents: Vector3 = vec3_create();\r\n private readonly _myFakeCursor!: Cursor;\r\n\r\n private readonly _myCursorPositionHistory: Vector3[] = [];\r\n private readonly _myInvalidOverlapCursorTargets: CursorTarget[] = [];\r\n\r\n private _myDoubleClickTimer: number = 0;\r\n private _myTripleClickTimer: number = 0;\r\n private _myMultipleClickObject: Readonly | null = null;\r\n\r\n private static readonly _myMultipleClickDelay: number = 0.3;\r\n\r\n private static _SV = {\r\n componentEqualCallback(first: CursorTarget, second: CursorTarget): boolean {\r\n return first == second;\r\n }\r\n };\r\n\r\n public override init(): void {\r\n const fakeCursor = {\r\n handedness: null,\r\n handednessTyped: null,\r\n object: this.object,\r\n cursorPos: vec3_create()\r\n };\r\n\r\n (this._myFakeCursor as Cursor) = fakeCursor as unknown as Cursor;\r\n\r\n for (let i = 0; i < 5; i++) {\r\n this._myCursorPositionHistory.push(vec3_create());\r\n }\r\n }\r\n\r\n public override start(): void {\r\n this._myPhysXComponent = this.object.pp_getComponent(PhysXComponent);\r\n if (this._myPhysXComponent != null) {\r\n this._myPhysicsCollisionCollector = new PhysicsCollisionCollector(this._myPhysXComponent);\r\n\r\n this._myPhysXComponentExtents.vec3_copy(this._myPhysXComponent.extents);\r\n }\r\n\r\n this._myCollisionComponent = this.object.pp_getComponent(CollisionComponent);\r\n if (this._myCollisionComponent != null) {\r\n this._myCollisionComponentExtents.vec3_copy(this._myCollisionComponent.extents);\r\n }\r\n }\r\n\r\n public override update(dt: number): void {\r\n if (this._myDoubleClickTimer > 0) {\r\n this._myDoubleClickTimer -= dt;\r\n }\r\n\r\n if (this._myTripleClickTimer > 0) {\r\n this._myTripleClickTimer -= dt;\r\n }\r\n\r\n for (let i = this._myCursorPositionHistory.length - 1; i > 0; i--) {\r\n this._myCursorPositionHistory[i].vec3_copy(this._myCursorPositionHistory[i - 1]);\r\n }\r\n this.object.pp_getPosition(this._myCursorPositionHistory[0]);\r\n this._myFakeCursor.cursorPos.vec3_copy(this._myCursorPositionHistory[0]);\r\n\r\n let bestCursorTarget = null;\r\n const processedCursorTargets: CursorTarget[] = [];\r\n\r\n if (this._myCollisionComponent != null) {\r\n const collisions = this._myCollisionComponent!.queryOverlaps();\r\n for (const collision of collisions) {\r\n if (collision.group & this._myCollisionComponent!.group) {\r\n const target = collision.object.pp_getComponentSelf(CursorTarget);\r\n if (target != null && target.active) {\r\n processedCursorTargets.push(target);\r\n bestCursorTarget = this._pickBestCursorTarget(bestCursorTarget, target);\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (this._myPhysicsCollisionCollector != null) {\r\n this._myPhysicsCollisionCollector.update(dt);\r\n const collisions = this._myPhysicsCollisionCollector.getCollisions();\r\n for (const collision of collisions) {\r\n const target = collision.object.pp_getComponentSelf(CursorTarget);\r\n if (target != null && target.active) {\r\n processedCursorTargets.push(target);\r\n bestCursorTarget = this._pickBestCursorTarget(bestCursorTarget, target);\r\n }\r\n }\r\n }\r\n\r\n if (this._myInvalidOverlapCursorTargets.length > 0) {\r\n const componentEqualCallback = OverlapCursorComponent._SV.componentEqualCallback;\r\n this._myInvalidOverlapCursorTargets.pp_removeAll((elementToCheck) => {\r\n return !processedCursorTargets.pp_hasEqual(elementToCheck, componentEqualCallback);\r\n });\r\n }\r\n\r\n if (bestCursorTarget == null) {\r\n this._targetOverlapEnd();\r\n } else if (bestCursorTarget != this._myLastTarget) {\r\n this._targetOverlapEnd();\r\n\r\n this._myLastTarget = bestCursorTarget;\r\n\r\n this._targetOverlapStart();\r\n }\r\n }\r\n\r\n public override onActivate(): void {\r\n if (this._myPhysicsCollisionCollector != null) {\r\n this._myPhysicsCollisionCollector.setActive(true);\r\n }\r\n }\r\n\r\n public override onDeactivate(): void {\r\n this._targetOverlapEnd();\r\n\r\n if (this._myPhysicsCollisionCollector != null) {\r\n this._myPhysicsCollisionCollector.setActive(false);\r\n }\r\n }\r\n\r\n private _targetOverlapStart(): void {\r\n if (this._myCollisionSizeMultiplierOnOverlap != 1 && !this._myLastTarget!.isSurface) {\r\n if (this._myPhysXComponent != null) {\r\n this._myPhysXComponent.extents = this._myPhysXComponentExtents.vec3_scale(this._myCollisionSizeMultiplierOnOverlap);\r\n\r\n this._myPhysicsCollisionCollector!.setActive(false);\r\n this._myPhysXComponent.active = false;\r\n this._myPhysicsCollisionCollector!.setActive(true);\r\n this._myPhysXComponent.active = true;\r\n }\r\n\r\n if (this._myCollisionComponent != null) {\r\n this._myCollisionComponent.extents = this._myCollisionComponentExtents.vec3_scale(this._myCollisionSizeMultiplierOnOverlap);\r\n }\r\n }\r\n\r\n this._myLastTarget!.onHover.notify(this._myLastTarget!.object, this._myFakeCursor);\r\n this._myLastTarget!.onDown.notify(this._myLastTarget!.object, this._myFakeCursor);\r\n }\r\n\r\n private _targetOverlapEnd(): void {\r\n if (this._myLastTarget != null) {\r\n if (this._myCollisionSizeMultiplierOnOverlap != 1) {\r\n if (this._myPhysXComponent != null) {\r\n this._myPhysXComponent.extents = this._myPhysXComponentExtents;\r\n\r\n this._myPhysicsCollisionCollector!.setActive(false);\r\n this._myPhysXComponent.active = false;\r\n this._myPhysicsCollisionCollector!.setActive(true);\r\n this._myPhysXComponent.active = true;\r\n }\r\n\r\n if (this._myCollisionComponent != null) {\r\n this._myCollisionComponent.extents = this._myCollisionComponentExtents;\r\n }\r\n }\r\n\r\n if (!this._myLastTarget.isDestroyed && this._myLastTarget.active) {\r\n this._myLastTarget.onClick.notify(this._myLastTarget.object, this._myFakeCursor);\r\n\r\n if (this._myTripleClickTimer > 0 && this._myMultipleClickObject && this._myMultipleClickObject == this._myLastTarget.object) {\r\n this._myLastTarget.onTripleClick.notify(this._myLastTarget.object, this._myFakeCursor);\r\n\r\n this._myTripleClickTimer = 0;\r\n } else if (this._myDoubleClickTimer > 0 && this._myMultipleClickObject && this._myMultipleClickObject == this._myLastTarget.object) {\r\n this._myLastTarget.onDoubleClick.notify(this._myLastTarget.object, this._myFakeCursor);\r\n\r\n this._myTripleClickTimer = OverlapCursorComponent._myMultipleClickDelay;\r\n this._myDoubleClickTimer = 0;\r\n } else {\r\n this._myLastTarget.onSingleClick.notify(this._myLastTarget.object, this._myFakeCursor);\r\n\r\n this._myTripleClickTimer = 0;\r\n this._myDoubleClickTimer = OverlapCursorComponent._myMultipleClickDelay;\r\n this._myMultipleClickObject = this._myLastTarget.object;\r\n }\r\n\r\n this._myLastTarget.onUp.notify(this._myLastTarget.object, this._myFakeCursor);\r\n this._myLastTarget.onUpWithDown.notify(this._myLastTarget.object, this._myFakeCursor);\r\n\r\n this._myLastTarget.onUnhover.notify(this._myLastTarget.object, this._myFakeCursor);\r\n }\r\n\r\n this._myLastTarget = null;\r\n }\r\n }\r\n\r\n private _pickBestCursorTarget(currentBestCursorTarget: CursorTarget | null, cursorTarget: CursorTarget): CursorTarget | null {\r\n let bestCursorTarget = currentBestCursorTarget;\r\n\r\n if (cursorTarget == this._myLastTarget) {\r\n bestCursorTarget = cursorTarget;\r\n } else {\r\n const componentEqualCallback = OverlapCursorComponent._SV.componentEqualCallback;\r\n if (!this._myInvalidOverlapCursorTargets.pp_hasEqual(cursorTarget, componentEqualCallback)) {\r\n const isAngleValid = this._isOverlapAngleValid(cursorTarget.object);\r\n\r\n if (isAngleValid) {\r\n if (bestCursorTarget == null || (!cursorTarget.isSurface && bestCursorTarget.isSurface)) {\r\n bestCursorTarget = cursorTarget;\r\n }\r\n } else {\r\n this._myInvalidOverlapCursorTargets.push(cursorTarget);\r\n }\r\n }\r\n }\r\n\r\n return bestCursorTarget;\r\n }\r\n\r\n private static _isOverlapAngleValidSV =\r\n {\r\n cursorPosition: vec3_create(),\r\n targetPosition: vec3_create(),\r\n targetForward: vec3_create(),\r\n directionToCursor: vec3_create()\r\n };\r\n private _isOverlapAngleValid(targetObject: Readonly): boolean {\r\n if (this._myValidOverlapAngleFromTargetForward == 180) {\r\n return true;\r\n }\r\n\r\n const targetPosition = OverlapCursorComponent._isOverlapAngleValidSV.targetPosition;\r\n const targetForward = OverlapCursorComponent._isOverlapAngleValidSV.targetForward;\r\n targetObject.pp_getPosition(targetPosition);\r\n targetObject.pp_getForward(targetForward);\r\n\r\n const directionToCursor = OverlapCursorComponent._isOverlapAngleValidSV.directionToCursor;\r\n this._myCursorPositionHistory.pp_last()!.vec3_sub(targetPosition, directionToCursor).vec3_normalize(directionToCursor);\r\n\r\n const overlapAngle = directionToCursor.vec3_angle(targetForward);\r\n\r\n return overlapAngle <= this._myValidOverlapAngleFromTargetForward;\r\n }\r\n}", "import { Collider, CollisionComponent, Component, Object3D, PhysXComponent, property, Shape } from \"@wonderlandengine/api\";\r\nimport { Cursor } from \"@wonderlandengine/components\";\r\nimport { PhysicsLayerFlags } from \"../../../cauldron/physics/physics_layer_flags.js\";\r\nimport { XRUtils } from \"../../../cauldron/utils/xr_utils.js\";\r\nimport { quat2_create, vec3_create } from \"../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Globals } from \"../../../pp/globals.js\";\r\nimport { Handedness, InputSourceType, TrackedHandJointID } from \"../input_types.js\";\r\nimport { InputUtils } from \"../input_utils.js\";\r\nimport { OverlapCursorComponent } from \"./overlap_cursor_component.js\";\r\n\r\n/** #WARN This class is actually adding an `OverlapCursorComponent` so use that if you want to interact with the cursor */\r\nexport class FingerCursorComponent extends Component {\r\n public static override TypeName = \"pp-finger-cursor\";\r\n\r\n @property.enum([\"Left\", \"Right\"], \"Left\")\r\n private readonly _myHandedness!: number;\r\n\r\n @property.enum([\"Thumb\", \"Index\", \"Middle\", \"Ring\", \"Pinky\"], \"Index\")\r\n private readonly _myFinger!: number;\r\n\r\n @property.enum([\"PhysX\", \"Collision\"], \"PhysX\")\r\n private readonly _myCollisionMode!: number;\r\n\r\n @property.string(\"0, 0, 0, 0, 0, 0, 0, 0\")\r\n private readonly _myCollisionFlags!: string;\r\n\r\n @property.float(0.0125)\r\n private readonly _myCollisionSize!: number;\r\n\r\n @property.float(1.25)\r\n private readonly _myCollisionSizeMultiplierOnOverlap!: number;\r\n\r\n @property.float(90)\r\n private readonly _myValidOverlapAngleFromTargetForward!: number;\r\n\r\n @property.object()\r\n private readonly _myCursorPointerObject!: Object3D;\r\n\r\n @property.bool(true)\r\n private readonly _myDisableDefaultCursorOnTrackedHandDetected!: boolean;\r\n\r\n @property.object()\r\n private readonly _myDefaultCursorObject!: Readonly;\r\n\r\n private readonly _myHandednessType!: Handedness;\r\n private readonly _myFingerJointID!: TrackedHandJointID;\r\n private _myDefaultCursorComponent: Cursor | null = null;\r\n private _myHandInputSource: Readonly | null = null;\r\n private _myForceRefreshActiveCursor: boolean = true;\r\n\r\n private readonly _myCursorParentObject!: Object3D;\r\n private readonly _myActualCursorParentObject!: Object3D;\r\n private readonly _myOverlapCursorComponent!: OverlapCursorComponent;\r\n\r\n public override init(): void {\r\n (this._myHandednessType as Handedness) = InputUtils.getHandednessByIndex(this._myHandedness)!;\r\n\r\n switch (this._myFinger) {\r\n case 0:\r\n (this._myFingerJointID as TrackedHandJointID) = TrackedHandJointID.THUMB_TIP;\r\n break;\r\n case 1:\r\n (this._myFingerJointID as TrackedHandJointID) = TrackedHandJointID.INDEX_FINGER_TIP;\r\n break;\r\n case 2:\r\n (this._myFingerJointID as TrackedHandJointID) = TrackedHandJointID.MIDDLE_FINGER_TIP;\r\n break;\r\n case 3:\r\n (this._myFingerJointID as TrackedHandJointID) = TrackedHandJointID.RING_FINGER_TIP;\r\n break;\r\n case 4:\r\n (this._myFingerJointID as TrackedHandJointID) = TrackedHandJointID.PINKY_FINGER_TIP;\r\n break;\r\n }\r\n }\r\n\r\n public override start(): void {\r\n (this._myCursorParentObject as Object3D) = this.object.pp_addChild();\r\n\r\n if (this._myCursorPointerObject == null) {\r\n (this._myActualCursorParentObject as Object3D) = this._myCursorParentObject.pp_addChild();\r\n } else {\r\n (this._myActualCursorParentObject as Object3D) = this._myCursorPointerObject;\r\n }\r\n\r\n this._myActualCursorParentObject.pp_setParent(this._myCursorParentObject);\r\n\r\n const physicsFlags = new PhysicsLayerFlags();\r\n const flags = [...this._myCollisionFlags.split(\",\")];\r\n for (let i = 0; i < flags.length; i++) {\r\n physicsFlags.setFlagActive(i, flags[i].trim() == \"1\");\r\n }\r\n\r\n if (this._myCollisionMode == 0) {\r\n this._myActualCursorParentObject.pp_addComponent(PhysXComponent, {\r\n shape: Shape.Sphere,\r\n extents: vec3_create(this._myCollisionSize, this._myCollisionSize, this._myCollisionSize),\r\n kinematic: true,\r\n trigger: true,\r\n groupsMask: physicsFlags.getMask()\r\n })!;\r\n } else if (this._myCollisionMode == 1) {\r\n const collisionComponent = this._myActualCursorParentObject.pp_addComponent(CollisionComponent)!;\r\n collisionComponent.collider = Collider.Sphere;\r\n collisionComponent.extents = vec3_create(this._myCollisionSize, this._myCollisionSize, this._myCollisionSize);\r\n collisionComponent.group = physicsFlags.getMask();\r\n }\r\n\r\n if (this._myDisableDefaultCursorOnTrackedHandDetected) {\r\n let defaultCursorObject: Readonly = this.object;\r\n if (this._myDefaultCursorObject != null) {\r\n defaultCursorObject = this._myDefaultCursorObject;\r\n }\r\n\r\n this._myDefaultCursorComponent = defaultCursorObject.pp_getComponent(Cursor);\r\n }\r\n\r\n (this._myOverlapCursorComponent as OverlapCursorComponent) = this._myActualCursorParentObject.pp_addComponent(OverlapCursorComponent, {\r\n _myCollisionSizeMultiplierOnOverlap: this._myCollisionSizeMultiplierOnOverlap,\r\n _myValidOverlapAngleFromTargetForward: this._myValidOverlapAngleFromTargetForward,\r\n })!;\r\n\r\n this._myCursorParentObject.pp_setActive(false);\r\n }\r\n\r\n private static readonly _updateSV =\r\n {\r\n transformQuat: quat2_create()\r\n };\r\n public override update(dt: number): void {\r\n const transformQuat = FingerCursorComponent._updateSV.transformQuat;\r\n this._myCursorParentObject.pp_setTransformQuat(Globals.getPlayerObjects(this.engine)!.myReferenceSpace!.pp_getTransformQuat(transformQuat));\r\n this._updateHand();\r\n }\r\n\r\n public override onActivate(): void {\r\n this._myForceRefreshActiveCursor = true;\r\n }\r\n\r\n public override onDeactivate(): void {\r\n if (this._myCursorParentObject != null) {\r\n this._myCursorParentObject.pp_setActive(false);\r\n }\r\n }\r\n\r\n private _updateHand(): void {\r\n let newHandInputSource = null;\r\n\r\n const handPose = Globals.getHandPoses(this.engine)![this._myHandednessType];\r\n if (handPose.getInputSourceType() == InputSourceType.TRACKED_HAND) {\r\n newHandInputSource = handPose.getInputSource();\r\n }\r\n\r\n if (newHandInputSource != null && (this._myHandInputSource == null || this._myForceRefreshActiveCursor)) {\r\n if (this._myDefaultCursorComponent != null) {\r\n this._myDefaultCursorComponent.active = false;\r\n }\r\n\r\n this._myCursorParentObject.pp_setActive(true);\r\n } else if (newHandInputSource == null && (this._myHandInputSource != null || this._myForceRefreshActiveCursor)) {\r\n this._myCursorParentObject.pp_setActive(false);\r\n\r\n if (this._myDefaultCursorComponent != null) {\r\n this._myDefaultCursorComponent.active = true;\r\n }\r\n }\r\n\r\n this._myHandInputSource = newHandInputSource;\r\n\r\n if (this._myHandInputSource != null) {\r\n let tip: XRJointPose | null = null;\r\n\r\n try {\r\n const xrFrame = XRUtils.getFrame(this.engine)!;\r\n if (xrFrame.getJointPose != null) {\r\n tip = xrFrame.getJointPose(this._myHandInputSource.hand!.get(this._myFingerJointID)!, XRUtils.getReferenceSpace(this.engine)!) ?? null;\r\n }\r\n } catch (error) {\r\n // Do nothing\r\n }\r\n\r\n if (tip != null) {\r\n this._myActualCursorParentObject.pp_setRotationLocalQuat([\r\n tip.transform.orientation.x,\r\n tip.transform.orientation.y,\r\n tip.transform.orientation.z,\r\n tip.transform.orientation.w]);\r\n\r\n this._myActualCursorParentObject.pp_setPositionLocal([\r\n tip.transform.position.x,\r\n tip.transform.position.y,\r\n tip.transform.position.z]);\r\n }\r\n }\r\n }\r\n}", "import { Component, Property } from \"@wonderlandengine/api\";\r\nimport { XRUtils } from \"../../../cauldron/utils/xr_utils.js\";\r\nimport { Globals } from \"../../../pp/globals.js\";\r\nimport { InputSourceType } from \"../input_types.js\";\r\nimport { InputUtils } from \"../input_utils.js\";\r\n\r\nexport class SwitchHandObjectComponent extends Component {\r\n static TypeName = \"pp-switch-hand-object\";\r\n static Properties = {\r\n _myHandedness: Property.enum([\"Left\", \"Right\"], \"Left\"),\r\n _myGamepad: Property.object(),\r\n _myTrackedHand: Property.object(),\r\n _myDisableHandsWhenNonXR: Property.bool(true)\r\n };\r\n\r\n start() {\r\n this._myHandednessType = InputUtils.getHandednessByIndex(this._myHandedness);\r\n this._myFirstUpdate = true;\r\n\r\n this._myCurrentInputSourceType = null;\r\n\r\n this._myActivateOnNextUpdate = false;\r\n }\r\n\r\n update(dt) {\r\n if (this._myActivateOnNextUpdate) {\r\n this._onActivate();\r\n\r\n this._myActivateOnNextUpdate = false;\r\n }\r\n }\r\n\r\n _start() {\r\n if (this._myGamepad != null) {\r\n this._myGamepad.pp_setActive(false);\r\n }\r\n\r\n if (this._myTrackedHand != null) {\r\n this._myTrackedHand.pp_setActive(false);\r\n }\r\n\r\n this._myCurrentInputSourceType = null;\r\n }\r\n\r\n _onPoseUpdated(dt, pose) {\r\n if (!this.active || this._myActivateOnNextUpdate) {\r\n Globals.getHandPose(this._myHandednessType, this.engine)?.unregisterPoseUpdatedEventListener(this);\r\n return;\r\n }\r\n\r\n if (this._myFirstUpdate) {\r\n this._myFirstUpdate = false;\r\n this._start();\r\n }\r\n\r\n if (this._myDisableHandsWhenNonXR && !XRUtils.isSessionActive(this.engine)) {\r\n if (this._myCurrentInputSourceType != null) {\r\n this._myCurrentInputSourceType = null;\r\n\r\n this._myGamepad.pp_setActive(false);\r\n this._myTrackedHand.pp_setActive(false);\r\n }\r\n } else {\r\n let inputSourceType = pose.getInputSourceType();\r\n if (this._myCurrentInputSourceType != inputSourceType) {\r\n this._myCurrentInputSourceType = inputSourceType;\r\n\r\n if (inputSourceType == InputSourceType.TRACKED_HAND) {\r\n if (this._myGamepad != null) {\r\n this._myGamepad.pp_setActive(false);\r\n }\r\n if (this._myTrackedHand != null) {\r\n this._myTrackedHand.pp_setActive(true);\r\n }\r\n } else if (inputSourceType == InputSourceType.GAMEPAD) {\r\n if (this._myTrackedHand != null) {\r\n this._myTrackedHand.pp_setActive(false);\r\n }\r\n if (this._myGamepad != null) {\r\n this._myGamepad.pp_setActive(true);\r\n }\r\n } else if (inputSourceType == null) {\r\n this._myGamepad.pp_setActive(false);\r\n this._myTrackedHand.pp_setActive(false);\r\n }\r\n }\r\n }\r\n }\r\n\r\n onActivate() {\r\n this._myActivateOnNextUpdate = true;\r\n }\r\n\r\n _onActivate() {\r\n Globals.getHandPose(this._myHandednessType, this.engine).registerPoseUpdatedEventListener(this, this._onPoseUpdated.bind(this));\r\n\r\n this._myFirstUpdate = true;\r\n }\r\n\r\n onDeactivate() {\r\n Globals.getHandPose(this._myHandednessType, this.engine)?.unregisterPoseUpdatedEventListener(this);\r\n }\r\n}", "import { Component, MeshComponent, Property } from \"@wonderlandengine/api\";\r\nimport { quat2_create } from \"../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Globals } from \"../../../pp/globals.js\";\r\nimport { InputUtils } from \"../input_utils.js\";\r\n\r\nexport class TrackedHandDrawJointComponent extends Component {\r\n static TypeName = \"pp-tracked-hand-draw-joint\";\r\n static Properties = {\r\n _myHandedness: Property.enum([\"Left\", \"Right\"], \"Left\"),\r\n _myJointID: Property.enum(\r\n [\r\n \"Wrist\",\r\n \"Thumb Metacarpal\", \"Thumb Phalanx Proximal\", \"Thumb Phalanx Distal\", \"Thumb Tip\",\r\n \"Index Metacarpal\", \"Index Phalanx Proximal\", \"Index Phalanx Intermediate\", \"Index Phalanx Distal\", \"Index Tip\",\r\n \"Middle Metacarpal\", \"Middle Phalanx Proximal\", \"Middle Phalanx Intermediate\", \"Middle Phalanx Distal\", \"Middle Tip\",\r\n \"Ring Metacarpal\", \"Ring Phalanx Proximal\", \"Ring Phalanx Intermediate\", \"Ring Phalanx Distal\", \"Ring Tip\",\r\n \"Pinky Metacarpal\", \"Pinky Phalanx Proximal\", \"Pinky Phalanx Intermediate\", \"Pinky Phalanx Distal\", \"Pinky Tip\"\r\n ],\r\n \"Wrist\"),\r\n _myJointMesh: Property.mesh(),\r\n _myJointMaterial: Property.material()\r\n };\r\n\r\n start() {\r\n this._myHandednessType = InputUtils.getHandednessByIndex(this._myHandedness);\r\n this._myJointIDType = InputUtils.getJointIDByIndex(this._myJointID);\r\n\r\n this._buildTrackedHandHierarchy();\r\n }\r\n\r\n update(dt) {\r\n // Implemented outside class definition\r\n }\r\n\r\n _buildTrackedHandHierarchy() {\r\n this._myJointMeshObject = this.object.pp_addChild();\r\n\r\n let mesh = this._myJointMeshObject.pp_addComponent(MeshComponent);\r\n mesh.mesh = this._myJointMesh;\r\n mesh.material = this._myJointMaterial;\r\n\r\n this._myJointMeshObject.pp_setScaleLocal(0);\r\n }\r\n}\r\n\r\n\r\n\r\n// IMPLEMENTATION\r\n\r\nTrackedHandDrawJointComponent.prototype.update = function () {\r\n let transformQuat = quat2_create();\r\n return function update(dt) {\r\n let jointPose = Globals.getTrackedHandPose(this._myHandednessType, this.engine).getJointPose(this._myJointIDType);\r\n\r\n this._myJointMeshObject.pp_setTransformLocalQuat(jointPose.getTransformQuat(transformQuat, null));\r\n this._myJointMeshObject.pp_setScaleLocal(jointPose.getJointRadius());\r\n };\r\n}();", "import { Component, Property } from \"@wonderlandengine/api\";\r\nimport { TrackedHandJointID, TrackedHandJointIDIndex } from \"../input_types.js\";\r\nimport { TrackedHandDrawJointComponent } from \"./tracked_hand_draw_joint_component.js\";\r\n\r\nexport class TrackedHandDrawAllJointsComponent extends Component {\r\n static TypeName = \"pp-tracked-hand-draw-all-joints\";\r\n static Properties = {\r\n _myHandedness: Property.enum([\"Left\", \"Right\"], \"Left\"),\r\n _myHideMetacarpals: Property.bool(true),\r\n _myJointMesh: Property.mesh(),\r\n _myJointMaterial: Property.material()\r\n };\r\n\r\n start() {\r\n this._buildTrackedHandHierarchy();\r\n }\r\n\r\n _buildTrackedHandHierarchy() {\r\n this._myTrackedHandMeshObject = this.object.pp_addChild();\r\n\r\n this._myJointMeshObjectList = [];\r\n\r\n for (let jointIDKey in TrackedHandJointID) {\r\n let jointID = TrackedHandJointID[jointIDKey];\r\n if (!this._myHideMetacarpals ||\r\n (jointID != TrackedHandJointID.THUMB_METACARPAL &&\r\n jointID != TrackedHandJointID.INDEX_FINGER_METACARPAL && jointID != TrackedHandJointID.MIDDLE_FINGER_METACARPAL &&\r\n jointID != TrackedHandJointID.RING_FINGER_METACARPAL && jointID != TrackedHandJointID.PINKY_FINGER_METACARPAL)\r\n ) {\r\n let jointObject = this._myTrackedHandMeshObject.pp_addChild();\r\n this._myJointMeshObjectList[jointID] = jointObject;\r\n\r\n jointObject.pp_addComponent(TrackedHandDrawJointComponent,\r\n {\r\n \"_myHandedness\": this._myHandedness,\r\n \"_myJointID\": TrackedHandJointIDIndex[jointIDKey],\r\n \"_myJointMesh\": this._myJointMesh,\r\n \"_myJointMaterial\": this._myJointMaterial\r\n });\r\n\r\n }\r\n }\r\n }\r\n}", "import { Component, Property } from \"@wonderlandengine/api\";\r\nimport { ObjectUtils } from \"../../../cauldron/wl/utils/object_utils.js\";\r\nimport { quat2_create } from \"../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Globals } from \"../../../pp/globals.js\";\r\nimport { InputUtils } from \"../input_utils.js\";\r\n\r\nexport class TrackedHandDrawSkinComponent extends Component {\r\n static TypeName = \"pp-tracked-hand-draw-skin\";\r\n static Properties = {\r\n _myHandedness: Property.enum([\"Left\", \"Right\"], \"Left\"),\r\n _myHandSkin: Property.skin(null),\r\n _myIsHandSkinForwardFixed: Property.bool(false) // Should become true when I can manage to create a tracked hand skin with the forward fixed\r\n };\r\n\r\n start() {\r\n this._myHandednessType = InputUtils.getHandednessByIndex(this._myHandedness);\r\n\r\n this._prepareJoints();\r\n }\r\n\r\n update(dt) {\r\n // Implemented outside class definition\r\n }\r\n\r\n _prepareJoints() {\r\n this._myJoints = [];\r\n\r\n let skinJointIDs = this._myHandSkin.jointIds;\r\n\r\n for (let i = 0; i < skinJointIDs.length; i++) {\r\n this._myJoints[i] = ObjectUtils.wrapObject(skinJointIDs[i], this.engine);\r\n }\r\n }\r\n}\r\n\r\n\r\n\r\n// IMPLEMENTATION\r\n\r\nTrackedHandDrawSkinComponent.prototype.update = function () {\r\n let transformQuat = quat2_create();\r\n return function update(dt) {\r\n for (let i = 0; i < this._myJoints.length; i++) {\r\n let jointObject = this._myJoints[i];\r\n\r\n let jointID = jointObject.pp_getName(); // Joint name must match the TrackedHandJointID enum value\r\n let jointPose = Globals.getTrackedHandPose(this._myHandednessType, this.engine).getJointPose(jointID);\r\n\r\n let jointTransformQuat = jointPose.getTransformQuat(transformQuat, null);\r\n if (jointPose.isForwardFixed() != this._myIsHandSkinForwardFixed) {\r\n jointTransformQuat.quat2_rotateAxis(180, jointTransformQuat.quat2_getUp(), jointTransformQuat);\r\n }\r\n jointObject.pp_setTransformLocalQuat(jointTransformQuat);\r\n }\r\n };\r\n}();", "import { Component, Property } from \"@wonderlandengine/api\";\r\nimport { vec3_create } from \"../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Globals } from \"../../../pp/globals.js\";\r\nimport { HandednessIndex } from \"../../cauldron/input_types.js\";\r\nimport { GamepadAxesEvent, GamepadAxesID, GamepadButtonEvent, GamepadButtonID } from \"../gamepad_buttons.js\";\r\n\r\nexport class GamepadMeshAnimatorComponent extends Component {\r\n static TypeName = \"pp-gamepad-mesh-animator\";\r\n static Properties = {\r\n _myHandedness: Property.enum([\"Left\", \"Right\"], \"Left\"),\r\n _mySelect: Property.object(null),\r\n _mySqueeze: Property.object(null),\r\n _myThumbstick: Property.object(null),\r\n _myTopButton: Property.object(null),\r\n _myBottomButton: Property.object(null),\r\n _mySelectRotateAngle: Property.float(15),\r\n _mySqueezeRotateAngle: Property.float(11),\r\n _myThumbstickRotateAngle: Property.float(15),\r\n _myThumbstickPressOffset: Property.float(0.000625),\r\n _myTopButtonPressOffset: Property.float(0.0015),\r\n _myBottomButtonPressOffset: Property.float(0.0015),\r\n _myUsePressForSqueeze: Property.bool(false),\r\n _mySqueezePressOffset: Property.float(0.0015)\r\n };\r\n\r\n start() {\r\n if (this._mySelect != null) {\r\n this._mySelectOriginalRotation = this._mySelect.pp_getRotationLocalQuat();\r\n this._mySelectOriginalLeft = this._mySelect.pp_getLeftLocal();\r\n }\r\n\r\n if (this._mySqueeze != null) {\r\n this._mySqueezeOriginalPosition = this._mySqueeze.pp_getPositionLocal();\r\n this._mySqueezeOriginalRotation = this._mySqueeze.pp_getRotationLocalQuat();\r\n this._mySqueezeOriginalLeft = this._mySqueeze.pp_getLeftLocal();\r\n this._mySqueezeOriginalForward = this._mySqueeze.pp_getForwardLocal();\r\n }\r\n\r\n if (this._myThumbstick != null) {\r\n this._myThumbstickOriginalPosition = this._myThumbstick.pp_getPositionLocal();\r\n this._myThumbstickOriginalRotation = this._myThumbstick.pp_getRotationLocalQuat();\r\n this._myThumbstickOriginalLeft = this._myThumbstick.pp_getLeftLocal();\r\n this._myThumbstickOriginalUp = this._myThumbstick.pp_getUpLocal();\r\n this._myThumbstickOriginalForward = this._myThumbstick.pp_getForwardLocal();\r\n }\r\n\r\n if (this._myTopButton != null) {\r\n this._myTopButtonOriginalPosition = this._myTopButton.pp_getPositionLocal();\r\n this._myTopButtonOriginalUp = this._myTopButton.pp_getUpLocal();\r\n }\r\n\r\n if (this._myBottomButton != null) {\r\n this._myBottomButtonOriginalPosition = this._myBottomButton.pp_getPositionLocal();\r\n this._myBottomButtonOriginalUp = this._myBottomButton.pp_getUpLocal();\r\n }\r\n\r\n this._myActivateOnNextUpdate = true;\r\n }\r\n\r\n update(dt) {\r\n if (this._myActivateOnNextUpdate) {\r\n this._onActivate();\r\n\r\n this._myActivateOnNextUpdate = false;\r\n }\r\n }\r\n\r\n onActivate() {\r\n this._myActivateOnNextUpdate = true;\r\n }\r\n\r\n _onActivate() {\r\n let gamepad = null;\r\n if (this._myHandedness == HandednessIndex.LEFT) {\r\n gamepad = Globals.getLeftGamepad(this.engine);\r\n } else {\r\n gamepad = Globals.getRightGamepad(this.engine);\r\n }\r\n\r\n // PRESSED\r\n if (this._myThumbstick != null) {\r\n gamepad.registerButtonEventListener(GamepadButtonID.THUMBSTICK, GamepadButtonEvent.PRESS_START, this, this._thumbstickPressedStart.bind(this));\r\n gamepad.registerButtonEventListener(GamepadButtonID.THUMBSTICK, GamepadButtonEvent.PRESS_END, this, this._thumbstickPressedEnd.bind(this));\r\n }\r\n\r\n if (this._myTopButton != null) {\r\n gamepad.registerButtonEventListener(GamepadButtonID.TOP_BUTTON, GamepadButtonEvent.PRESS_START, this, this._topButtonPressedStart.bind(this));\r\n gamepad.registerButtonEventListener(GamepadButtonID.TOP_BUTTON, GamepadButtonEvent.PRESS_END, this, this._topButtonPressedEnd.bind(this));\r\n }\r\n\r\n if (this._myBottomButton != null) {\r\n\r\n gamepad.registerButtonEventListener(GamepadButtonID.BOTTOM_BUTTON, GamepadButtonEvent.PRESS_START, this, this._bottomButtonPressedStart.bind(this));\r\n gamepad.registerButtonEventListener(GamepadButtonID.BOTTOM_BUTTON, GamepadButtonEvent.PRESS_END, this, this._bottomButtonPressedEnd.bind(this));\r\n }\r\n\r\n // VALUE CHANGED\r\n if (this._mySelect != null) {\r\n gamepad.registerButtonEventListener(GamepadButtonID.SELECT, GamepadButtonEvent.VALUE_CHANGED, this, this._selectValueChanged.bind(this));\r\n }\r\n\r\n if (this._mySqueeze != null) {\r\n gamepad.registerButtonEventListener(GamepadButtonID.SQUEEZE, GamepadButtonEvent.VALUE_CHANGED, this, this._squeezeValueChanged.bind(this));\r\n }\r\n\r\n // AXES CHANGED\r\n if (this._myThumbstick != null) {\r\n gamepad.registerAxesEventListener(GamepadAxesID.THUMBSTICK, GamepadAxesEvent.AXES_CHANGED, this, this._thumbstickValueChanged.bind(this));\r\n }\r\n }\r\n\r\n onDeactivate() {\r\n let gamepad = null;\r\n if (this._myHandedness == HandednessIndex.LEFT) {\r\n gamepad = Globals.getLeftGamepad(this.engine);\r\n } else {\r\n gamepad = Globals.getRightGamepad(this.engine);\r\n }\r\n\r\n if (gamepad != null) {\r\n // PRESSED\r\n if (this._myThumbstick != null) {\r\n gamepad.unregisterButtonEventListener(GamepadButtonID.THUMBSTICK, GamepadButtonEvent.PRESS_START, this);\r\n gamepad.unregisterButtonEventListener(GamepadButtonID.THUMBSTICK, GamepadButtonEvent.PRESS_END, this);\r\n }\r\n\r\n if (this._myTopButton != null) {\r\n gamepad.unregisterButtonEventListener(GamepadButtonID.TOP_BUTTON, GamepadButtonEvent.PRESS_START, this);\r\n gamepad.unregisterButtonEventListener(GamepadButtonID.TOP_BUTTON, GamepadButtonEvent.PRESS_END, this);\r\n }\r\n\r\n if (this._myBottomButton != null) {\r\n\r\n gamepad.unregisterButtonEventListener(GamepadButtonID.BOTTOM_BUTTON, GamepadButtonEvent.PRESS_START, this);\r\n gamepad.unregisterButtonEventListener(GamepadButtonID.BOTTOM_BUTTON, GamepadButtonEvent.PRESS_END, this);\r\n }\r\n\r\n // VALUE CHANGED\r\n if (this._mySelect != null) {\r\n gamepad.unregisterButtonEventListener(GamepadButtonID.SELECT, GamepadButtonEvent.VALUE_CHANGED, this);\r\n }\r\n\r\n if (this._mySqueeze != null) {\r\n gamepad.unregisterButtonEventListener(GamepadButtonID.SQUEEZE, GamepadButtonEvent.VALUE_CHANGED, this);\r\n }\r\n\r\n // AXES CHANGED\r\n if (this._myThumbstick != null) {\r\n gamepad.unregisterAxesEventListener(GamepadAxesID.THUMBSTICK, GamepadAxesEvent.AXES_CHANGED, this);\r\n }\r\n }\r\n }\r\n\r\n _thumbstickPressedStart() {\r\n // Implemented outside class definition\r\n }\r\n\r\n _thumbstickPressedEnd(buttonInfo, gamepad) {\r\n if (!this.active || this._myActivateOnNextUpdate) {\r\n this.onDeactivate();\r\n return;\r\n }\r\n\r\n this._myThumbstick.pp_setPositionLocal(this._myThumbstickOriginalPosition);\r\n }\r\n\r\n _topButtonPressedStart(buttonInfo, gamepad) {\r\n if (!this.active || this._myActivateOnNextUpdate) {\r\n this.onDeactivate();\r\n return;\r\n }\r\n\r\n\r\n this._myTopButton.pp_translateAxisLocal(-this._myTopButtonPressOffset, this._myTopButtonOriginalUp);\r\n }\r\n\r\n _topButtonPressedEnd(buttonInfo, gamepad) {\r\n if (!this.active || this._myActivateOnNextUpdate) {\r\n this.onDeactivate();\r\n return;\r\n }\r\n\r\n this._myTopButton.pp_setPositionLocal(this._myTopButtonOriginalPosition);\r\n }\r\n\r\n _bottomButtonPressedStart(buttonInfo, gamepad) {\r\n if (!this.active || this._myActivateOnNextUpdate) {\r\n this.onDeactivate();\r\n return;\r\n }\r\n\r\n this._myBottomButton.pp_translateAxisLocal(-this._myBottomButtonPressOffset, this._myBottomButtonOriginalUp);\r\n }\r\n\r\n _bottomButtonPressedEnd(buttonInfo, gamepad) {\r\n if (!this.active || this._myActivateOnNextUpdate) {\r\n this.onDeactivate();\r\n return;\r\n }\r\n\r\n this._myBottomButton.pp_setPositionLocal(this._myBottomButtonOriginalPosition);\r\n }\r\n\r\n _selectValueChanged(buttonInfo, gamepad) {\r\n if (!this.active || this._myActivateOnNextUpdate) {\r\n this.onDeactivate();\r\n return;\r\n }\r\n\r\n this._mySelect.pp_setRotationLocalQuat(this._mySelectOriginalRotation);\r\n\r\n if (buttonInfo.getValue() > 0.00001) {\r\n this._mySelect.pp_rotateAxisLocal(this._mySelectRotateAngle * buttonInfo.getValue(), this._mySelectOriginalLeft);\r\n }\r\n }\r\n\r\n _squeezeValueChanged(buttonInfo, gamepad) {\r\n if (!this.active || this._myActivateOnNextUpdate) {\r\n this.onDeactivate();\r\n return;\r\n }\r\n\r\n this._mySqueeze.pp_setPositionLocal(this._mySqueezeOriginalPosition);\r\n this._mySqueeze.pp_setRotationLocalQuat(this._mySqueezeOriginalRotation);\r\n\r\n if (buttonInfo.getValue() > 0.00001) {\r\n if (this._myUsePressForSqueeze) {\r\n let translation = this._mySqueezePressOffset;\r\n if (this._myHandedness == 1) {\r\n translation *= -1;\r\n }\r\n\r\n this._mySqueeze.pp_translateAxisLocal(translation * buttonInfo.getValue(), this._mySqueezeOriginalLeft);\r\n } else {\r\n let rotation = -this._mySqueezeRotateAngle;\r\n if (this._myHandedness == 1) {\r\n rotation *= -1;\r\n }\r\n\r\n this._mySqueeze.pp_rotateAxisLocal(rotation * buttonInfo.getValue(), this._mySqueezeOriginalForward);\r\n }\r\n }\r\n }\r\n\r\n _thumbstickValueChanged(axesInfo, gamepad) {\r\n if (!this.active || this._myActivateOnNextUpdate) {\r\n this.onDeactivate();\r\n return;\r\n }\r\n\r\n this._myThumbstick.pp_setRotationLocalQuat(this._myThumbstickOriginalRotation);\r\n\r\n let leftRotation = this._myThumbstickRotateAngle * axesInfo.myAxes[1];\r\n let forwardRotation = this._myThumbstickRotateAngle * axesInfo.myAxes[0];\r\n\r\n if (Math.abs(leftRotation) > 0.0001) {\r\n this._myThumbstick.pp_rotateAxisLocal(leftRotation, this._myThumbstickOriginalLeft);\r\n }\r\n\r\n if (Math.abs(forwardRotation) > 0.0001) {\r\n this._myThumbstick.pp_rotateAxisLocal(forwardRotation, this._myThumbstickOriginalForward);\r\n }\r\n }\r\n}\r\n\r\n\r\n\r\n// IMPLEMENTATION\r\n\r\nGamepadMeshAnimatorComponent.prototype._thumbstickPressedStart = function () {\r\n let upTranslation = vec3_create();\r\n return function _thumbstickPressedStart(buttonInfo, gamepad) {\r\n if (!this.active || this._myActivateOnNextUpdate) {\r\n this.onDeactivate();\r\n return;\r\n }\r\n\r\n // Since thumbstick object rotate you need to specifically use its original up to translate it\r\n this._myThumbstickOriginalUp.vec3_scale(-this._myThumbstickPressOffset, upTranslation);\r\n this._myThumbstick.pp_translateLocal(upTranslation);\r\n };\r\n}();", "import { Alignment, Component, MeshComponent, Property, TextComponent, VerticalAlignment } from \"@wonderlandengine/api\";\r\nimport { vec3_create } from \"../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Globals } from \"../../../pp/globals.js\";\r\nimport { Handedness } from \"../../cauldron/input_types.js\";\r\nimport { InputUtils } from \"../../cauldron/input_utils.js\";\r\n\r\nexport class GamepadControlSchemeComponent extends Component {\r\n static TypeName = \"pp-gamepad-control-scheme\";\r\n static Properties = {\r\n _myShowOnStart: Property.bool(true),\r\n\r\n _myHandedness: Property.enum([\"Left\", \"Right\"], \"Left\"),\r\n\r\n _mySelectText: Property.string(\"\"),\r\n _mySqueezeText: Property.string(\"\"),\r\n _myThumbstickText: Property.string(\"\"),\r\n _myBottomButtonText: Property.string(\"\"),\r\n _myTopButtonText: Property.string(\"\"),\r\n\r\n _mySelect: Property.object(null),\r\n _mySqueeze: Property.object(null),\r\n _myThumbstick: Property.object(null),\r\n _myBottomButton: Property.object(null),\r\n _myTopButton: Property.object(null),\r\n\r\n _myTextScaleMultiplier: Property.float(1),\r\n _myTextOffsetMultiplier: Property.float(1),\r\n _myLineLengthMultiplier: Property.float(1),\r\n _myLineThicknessMultiplier: Property.float(1),\r\n _myDistanceFromButtonsMultiplier: Property.float(1),\r\n\r\n _myTextMaterial: Property.material(),\r\n _myLineMaterial: Property.material()\r\n };\r\n\r\n start() {\r\n this._myTextMaterialFinal = (this._myTextMaterial != null) ? this._myTextMaterial : Globals.getDefaultMaterials(this.engine).myText.clone();\r\n this._myLineMaterialFinal = (this._myLineMaterial != null) ? this._myLineMaterial : Globals.getDefaultMaterials(this.engine).myFlatOpaque.clone();\r\n\r\n this._myHandednessType = InputUtils.getHandednessByIndex(this._myHandedness);\r\n this._myControlSchemeDirection = (this._myHandednessType == Handedness.LEFT) ? 1 : -1;\r\n\r\n this._myVisible = false;\r\n this._mySetVisibleNextUpdate = false;\r\n\r\n this._createControlScheme();\r\n this.setVisible(this._myShowOnStart);\r\n\r\n this._myVisibleBackup = this._myVisible;\r\n }\r\n\r\n update(dt) {\r\n if (this._mySetVisibleNextUpdate) {\r\n this._mySetVisibleNextUpdate = false;\r\n this.setVisible(false);\r\n this.setVisible(this._myVisibleBackup);\r\n }\r\n }\r\n\r\n onActivate() {\r\n this._mySetVisibleNextUpdate = true;\r\n }\r\n\r\n onDeactivate() {\r\n if (this._myVisible != null) {\r\n this._myVisibleBackup = this._myVisible;\r\n this.setVisible(false);\r\n }\r\n }\r\n\r\n isVisible() {\r\n return this._myVisible;\r\n }\r\n\r\n setVisible(visible) {\r\n this._myVisible = visible;\r\n\r\n if (this._myParentObject != null) {\r\n this._myParentObject.pp_setActive(this._myVisible);\r\n\r\n if (this._myVisible) {\r\n this._hideEmptySchemes();\r\n }\r\n }\r\n }\r\n\r\n setSelectText(text) {\r\n this._mySelectText = text;\r\n this._mySelectTextComponent.text = this._mySelectText;\r\n this.setVisible(this._myVisible);\r\n }\r\n\r\n setSqueezeText(text) {\r\n this._mySqueezeText = text;\r\n this._mySqueezeTextComponent.text = this._mySqueezeText;\r\n this.setVisible(this._myVisible);\r\n }\r\n\r\n setThumbstickText(text) {\r\n this._myThumbstickText = text;\r\n this._myThumbstickTextComponent.text = this._myThumbstickText;\r\n this.setVisible(this._myVisible);\r\n }\r\n\r\n setBottomButtonText(text) {\r\n this._myBottomButtonText = text;\r\n this._myBottomButtonTextComponent.text = this._myBottomButtonText;\r\n this.setVisible(this._myVisible);\r\n }\r\n\r\n setTopButtonText(text) {\r\n this._myTopButtonText = text;\r\n this._myTopButtonTextComponent.text = this._myTopButtonText;\r\n this.setVisible(this._myVisible);\r\n }\r\n\r\n _createControlScheme() {\r\n this._myParentObject = this.object.pp_addChild();\r\n\r\n let distanceFromButton = 0.02 * this._myDistanceFromButtonsMultiplier;\r\n let lineLength = 0.0935 * this._myLineLengthMultiplier;\r\n\r\n let referenceObject = this._myThumbstick;\r\n\r\n this._mySelectObject = this._myParentObject.pp_addChild();\r\n this._mySelectTextComponent = this._addScheme(this._mySelect, referenceObject,\r\n vec3_create(0, 0, distanceFromButton),\r\n vec3_create(lineLength * this._myControlSchemeDirection, 0, 0),\r\n this._mySelectObject);\r\n this._mySelectTextComponent.text = this._mySelectText;\r\n\r\n this._mySqueezeObject = this._myParentObject.pp_addChild();\r\n this._mySqueezeTextComponent = this._addScheme(this._mySqueeze, referenceObject,\r\n vec3_create(distanceFromButton * this._myControlSchemeDirection, 0, 0),\r\n vec3_create(lineLength * this._myControlSchemeDirection, 0, 0),\r\n this._mySqueezeObject);\r\n this._mySqueezeTextComponent.text = this._mySqueezeText;\r\n\r\n this._myThumbstickObject = this._myParentObject.pp_addChild();\r\n this._myThumbstickTextComponent = this._addScheme(this._myThumbstick, referenceObject,\r\n vec3_create(0, distanceFromButton, 0),\r\n vec3_create(-lineLength * this._myControlSchemeDirection, 0, 0),\r\n this._myThumbstickObject);\r\n this._myThumbstickTextComponent.text = this._myThumbstickText;\r\n\r\n let thumbstickPositionLocal = this._myThumbstick.pp_getPositionLocal();\r\n let thumbstickUpLocal = this._myThumbstick.pp_getUpLocal();\r\n\r\n {\r\n let bottomButtonPositionLocal = this._myBottomButton.pp_getPositionLocal();\r\n let difference = bottomButtonPositionLocal.vec3_sub(thumbstickPositionLocal);\r\n let differenceOnUp = difference.vec3_valueAlongAxis(thumbstickUpLocal);\r\n\r\n this._myBottomButtonObject = this._myParentObject.pp_addChild();\r\n this._myBottomButtonTextComponent = this._addScheme(this._myBottomButton, referenceObject,\r\n vec3_create(0, distanceFromButton - differenceOnUp, 0),\r\n vec3_create(0, 0, -lineLength),\r\n this._myBottomButtonObject);\r\n this._myBottomButtonTextComponent.text = this._myBottomButtonText;\r\n }\r\n\r\n {\r\n let topButtonPositionLocal = this._myTopButton.pp_getPositionLocal();\r\n let difference = topButtonPositionLocal.vec3_sub(thumbstickPositionLocal);\r\n let differenceOnUp = difference.vec3_valueAlongAxis(thumbstickUpLocal);\r\n\r\n this._myTopButtonObject = this._myParentObject.pp_addChild();\r\n this._myTopButtonTextComponent = this._addScheme(this._myTopButton, referenceObject,\r\n vec3_create(0, distanceFromButton - differenceOnUp, 0),\r\n vec3_create(-lineLength * this._myControlSchemeDirection, 0, 0).vec3_rotateAxis(-45 * this._myControlSchemeDirection, vec3_create(0, 1, 0)),\r\n this._myTopButtonObject);\r\n this._myTopButtonTextComponent.text = this._myTopButtonText;\r\n }\r\n }\r\n\r\n _addScheme(buttonObject, referenceObject, startOffset, endOffset, parentObject) {\r\n let buttonPosition = buttonObject.pp_getPositionLocal();\r\n let referenceForward = referenceObject.pp_getForwardLocal();\r\n let referenceRight = referenceObject.pp_getRightLocal();\r\n let referenceUp = referenceObject.pp_getUpLocal();\r\n\r\n let lineStart = buttonPosition.vec3_add(referenceRight.vec3_scale(startOffset[0]));\r\n lineStart.vec3_add(referenceUp.vec3_scale(startOffset[1]), lineStart);\r\n lineStart.vec3_add(referenceForward.vec3_scale(startOffset[2]), lineStart);\r\n\r\n let lineEnd = lineStart.vec3_add(referenceRight.vec3_scale(endOffset[0]));\r\n lineEnd.vec3_add(referenceUp.vec3_scale(endOffset[1]), lineEnd);\r\n lineEnd.vec3_add(referenceForward.vec3_scale(endOffset[2]), lineEnd);\r\n\r\n let textOffset = 0.01 * this._myTextOffsetMultiplier;\r\n let textPosition = lineEnd.vec3_add(referenceForward.vec3_scale(-textOffset));\r\n\r\n this._addLine(lineStart, lineEnd, parentObject);\r\n let textComponent = this._addText(textPosition, referenceForward, referenceUp, parentObject);\r\n\r\n return textComponent;\r\n }\r\n\r\n _addLine(start, end, parentObject) {\r\n let lineDirection = end.vec3_sub(start);\r\n let length = lineDirection.vec3_length();\r\n lineDirection.vec3_normalize(lineDirection);\r\n\r\n let lineParentObject = parentObject.pp_addChild();\r\n let lineObject = lineParentObject.pp_addChild();\r\n\r\n let lineMesh = lineObject.pp_addComponent(MeshComponent);\r\n lineMesh.mesh = Globals.getDefaultMeshes(this.engine).myCylinder;\r\n lineMesh.material = this._myLineMaterialFinal;\r\n\r\n lineParentObject.pp_setPositionLocal(start);\r\n\r\n let thickness = 0.001 * this._myLineThicknessMultiplier;\r\n lineObject.pp_scaleObject(vec3_create(thickness / 2, length / 2, thickness / 2));\r\n\r\n lineObject.pp_setUpLocal(lineDirection);\r\n lineObject.pp_translateObject(vec3_create(0, length / 2, 0));\r\n }\r\n\r\n _addText(position, forward, up, parentObject) {\r\n let textObject = parentObject.pp_addChild();\r\n textObject.pp_setPositionLocal(position);\r\n textObject.pp_lookToLocal(up, forward);\r\n textObject.pp_scaleObject(0.0935 * this._myTextScaleMultiplier);\r\n\r\n let textComponent = textObject.pp_addComponent(TextComponent);\r\n textComponent.alignment = Alignment.Center;\r\n textComponent.verticalAlignment = VerticalAlignment.Top;\r\n textComponent.material = this._myTextMaterialFinal;\r\n\r\n return textComponent;\r\n }\r\n\r\n _hideEmptySchemes() {\r\n if (this._mySelectText.length == 0) {\r\n this._mySelectObject.pp_setActive(false);\r\n }\r\n if (this._mySqueezeText.length == 0) {\r\n this._mySqueezeObject.pp_setActive(false);\r\n }\r\n if (this._myThumbstickText.length == 0) {\r\n this._myThumbstickObject.pp_setActive(false);\r\n }\r\n if (this._myBottomButtonText.length == 0) {\r\n this._myBottomButtonObject.pp_setActive(false);\r\n }\r\n if (this._myTopButtonText.length == 0) {\r\n this._myTopButtonObject.pp_setActive(false);\r\n }\r\n }\r\n}", "import { Globals } from \"../../../pp/globals.js\";\r\n\r\nexport let VirtualGamepadIconType = {\r\n NONE: 0,\r\n LABEL: 1,\r\n IMAGE: 2,\r\n DOT: 3,\r\n CIRCLE: 4,\r\n SQUARE: 5,\r\n RING: 6,\r\n FRAME: 7\r\n};\r\n\r\nexport class VirtualGamepadIconParams {\r\n\r\n constructor() {\r\n this.myBackgroundColor = \"\";\r\n this.myBackgroundPressedColor = \"\";\r\n this.myIconColor = \"\";\r\n this.myIconPressedColor = \"\";\r\n\r\n this.myIconType = VirtualGamepadIconType.NONE;\r\n\r\n this.myOverallHoveredBrightness = 1;\r\n\r\n // If icon type is label\r\n\r\n this.myLabel = \"\";\r\n this.myLabelFontSize = 0;\r\n this.myLabelFontFamily = \"\";\r\n this.myLabelFontWeight = \"\";\r\n\r\n // If icon type is image\r\n\r\n this.myImageURL = \"\";\r\n this.myImagePressedBrightness = 1;\r\n }\r\n}\r\n\r\nexport class VirtualGamepadIcon {\r\n\r\n constructor(iconElementParent, iconParams, minSizeMultiplier, scale, engine = Globals.getMainEngine()) {\r\n this._myEngine = engine;\r\n\r\n this._myParams = iconParams;\r\n\r\n this._myIconContainerElement = null;\r\n this._myBackgroundElement = null;\r\n this._myIconElement = null;\r\n\r\n this._myPressed = false;\r\n\r\n this._myMouseHover = false;\r\n this._myMouseHoverEnabled = true;\r\n\r\n this._myDestroyed = false;\r\n\r\n this._build(iconElementParent, minSizeMultiplier, scale);\r\n }\r\n\r\n update(dt) {\r\n if (this._myPressed || !this._myMouseHover || !this._myMouseHoverEnabled) {\r\n this._myIconContainerElement.style.filter = \"none\";\r\n } else {\r\n this._myIconContainerElement.style.filter = \"brightness(\" + this._myParams.myOverallHoveredBrightness + \")\";\r\n }\r\n }\r\n\r\n reset() {\r\n this.setPressed(false);\r\n this._myMouseHover = false;\r\n this._myIconContainerElement.style.filter = \"none\";\r\n }\r\n\r\n setPressed(pressed) {\r\n if (this._myPressed != pressed) {\r\n this._myPressed = pressed;\r\n\r\n if (this._myPressed) {\r\n this._myBackgroundElement.style.fill = this._myParams.myBackgroundPressedColor;\r\n if (this._myIconElement != null) {\r\n if (this._myIconElement.style.strokeWidth.length > 0) {\r\n this._myIconElement.style.stroke = this._myParams.myIconPressedColor;\r\n } else {\r\n this._myIconElement.style.fill = this._myParams.myIconPressedColor;\r\n }\r\n\r\n if (this._myParams.myIconType == VirtualGamepadIconType.IMAGE) {\r\n this._myIconElement.style.filter = \"brightness(\" + this._myParams.myImagePressedBrightness + \")\";\r\n }\r\n }\r\n } else {\r\n this._myBackgroundElement.style.fill = this._myParams.myBackgroundColor;\r\n if (this._myIconElement != null) {\r\n if (this._myIconElement.style.strokeWidth.length > 0) {\r\n this._myIconElement.style.stroke = this._myParams.myIconColor;\r\n } else {\r\n this._myIconElement.style.fill = this._myParams.myIconColor;\r\n }\r\n\r\n if (this._myParams.myIconType == VirtualGamepadIconType.IMAGE) {\r\n this._myIconElement.style.filter = \"none\";\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n onMouseEnter() {\r\n this._myMouseHover = true;\r\n }\r\n\r\n onMouseLeave() {\r\n this._myMouseHover = false;\r\n }\r\n\r\n setMouseHoverEnabled(enabled) {\r\n this._myMouseHoverEnabled = enabled;\r\n }\r\n\r\n _build(iconElementParent, minSizeMultiplier, scale) {\r\n this._myIconContainerElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\r\n this._myIconContainerElement.style.position = \"absolute\";\r\n this._myIconContainerElement.style.width = \"100%\";\r\n this._myIconContainerElement.style.height = \"100%\";\r\n iconElementParent.appendChild(this._myIconContainerElement);\r\n\r\n this._myBackgroundElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"circle\");\r\n this._myBackgroundElement.setAttributeNS(null, \"cx\", \"50%\");\r\n this._myBackgroundElement.setAttributeNS(null, \"cy\", \"50%\");\r\n this._myBackgroundElement.setAttributeNS(null, \"r\", \"50%\");\r\n this._myBackgroundElement.style.fill = this._myParams.myBackgroundColor;\r\n this._myIconContainerElement.appendChild(this._myBackgroundElement);\r\n\r\n switch (this._myParams.myIconType) {\r\n case VirtualGamepadIconType.NONE:\r\n break;\r\n case VirtualGamepadIconType.LABEL:\r\n this._myIconElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"text\");\r\n this._myIconElement.setAttributeNS(null, \"x\", \"50%\");\r\n this._myIconElement.setAttributeNS(null, \"y\", \"50%\");\r\n this._myIconElement.style.textAlign = \"center\";\r\n this._myIconElement.style.textAnchor = \"middle\";\r\n this._myIconElement.style.dominantBaseline = \"central\";\r\n this._myIconElement.style.alignmentBaseline = \"central\";\r\n this._myIconElement.style.fontFamily = this._myParams.myLabelFontFamily;\r\n this._myIconElement.style.fontWeight = this._myParams.myLabelFontWeight;\r\n this._myIconElement.style.fontSize = this._createSizeValue(this._myParams.myLabelFontSize * scale, minSizeMultiplier);\r\n this._myIconElement.style.fill = this._myParams.myIconColor;\r\n this._myIconElement.textContent = this._myParams.myLabel;\r\n this._myIconContainerElement.appendChild(this._myIconElement);\r\n break;\r\n case VirtualGamepadIconType.IMAGE:\r\n this._myIconElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"image\");\r\n this._myIconElement.setAttributeNS(null, \"x\", \"0%\");\r\n this._myIconElement.setAttributeNS(null, \"y\", \"0%\");\r\n this._myIconElement.setAttribute(\"href\", this._myParams.myImageURL);\r\n this._myIconElement.style.width = \"100%\";\r\n this._myIconElement.style.height = \"100%\";\r\n this._myIconElement.style.filter = \"none\";\r\n this._myIconContainerElement.appendChild(this._myIconElement);\r\n break;\r\n case VirtualGamepadIconType.DOT:\r\n this._myIconElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"circle\");\r\n this._myIconElement.setAttributeNS(null, \"cx\", \"50%\");\r\n this._myIconElement.setAttributeNS(null, \"cy\", \"50%\");\r\n this._myIconElement.setAttributeNS(null, \"r\", \"17.5%\");\r\n this._myIconElement.style.fill = this._myParams.myIconColor;\r\n this._myIconContainerElement.appendChild(this._myIconElement);\r\n break;\r\n case VirtualGamepadIconType.CIRCLE:\r\n this._myIconElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"circle\");\r\n this._myIconElement.setAttributeNS(null, \"cx\", \"50%\");\r\n this._myIconElement.setAttributeNS(null, \"cy\", \"50%\");\r\n this._myIconElement.setAttributeNS(null, \"r\", \"24%\");\r\n this._myIconElement.style.fill = this._myParams.myIconColor;\r\n this._myIconContainerElement.appendChild(this._myIconElement);\r\n break;\r\n case VirtualGamepadIconType.SQUARE:\r\n this._myIconElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"rect\");\r\n this._myIconElement.setAttributeNS(null, \"x\", \"28%\");\r\n this._myIconElement.setAttributeNS(null, \"y\", \"28%\");\r\n this._myIconElement.setAttributeNS(null, \"rx\", \"10%\");\r\n this._myIconElement.setAttributeNS(null, \"ry\", \"10%\");\r\n this._myIconElement.setAttributeNS(null, \"width\", \"44%\");\r\n this._myIconElement.setAttributeNS(null, \"height\", \"44%\");\r\n this._myIconElement.style.fill = this._myParams.myIconColor;\r\n this._myIconElement.style.transformOrigin = \"center\";\r\n this._myIconContainerElement.appendChild(this._myIconElement);\r\n break;\r\n case VirtualGamepadIconType.RING:\r\n this._myIconElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"circle\");\r\n this._myIconElement.setAttributeNS(null, \"cx\", \"50%\");\r\n this._myIconElement.setAttributeNS(null, \"cy\", \"50%\");\r\n this._myIconElement.setAttributeNS(null, \"r\", \"20%\");\r\n this._myIconElement.style.fill = \"#00000000\";\r\n this._myIconElement.style.stroke = this._myParams.myIconColor;\r\n this._myIconElement.style.strokeWidth = \"10%\";\r\n this._myIconContainerElement.appendChild(this._myIconElement);\r\n break;\r\n case VirtualGamepadIconType.FRAME:\r\n this._myIconElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"rect\");\r\n this._myIconElement.setAttributeNS(null, \"x\", \"31.5%\");\r\n this._myIconElement.setAttributeNS(null, \"y\", \"31.5%\");\r\n this._myIconElement.setAttributeNS(null, \"rx\", \"10%\");\r\n this._myIconElement.setAttributeNS(null, \"ry\", \"10%\");\r\n this._myIconElement.setAttributeNS(null, \"width\", \"37%\");\r\n this._myIconElement.setAttributeNS(null, \"height\", \"37%\");\r\n this._myIconElement.style.fill = \"#00000000\";\r\n this._myIconElement.style.stroke = this._myParams.myIconColor;\r\n this._myIconElement.style.strokeWidth = \"10%\";\r\n this._myIconElement.style.transformOrigin = \"center\";\r\n this._myIconContainerElement.appendChild(this._myIconElement);\r\n break;\r\n }\r\n }\r\n\r\n _createSizeValue(value, minSizeMultiplier) {\r\n return \"min(\" + value.toFixed(3) + \"vmax,\" + (value * minSizeMultiplier).toFixed(3) + \"vw)\";\r\n }\r\n\r\n _invertColors() {\r\n if (this._myIconElement.style.strokeWidth.length > 0) {\r\n this._myBackgroundElement.style.fill = this._myParams.myIconColor;\r\n this._myIconElement.style.fill = this._myParams.myIconColor;\r\n this._myIconElement.style.stroke = this._myParams.myBackgroundColor;\r\n } else {\r\n this._myBackgroundElement.style.fill = this._myParams.myIconColor;\r\n this._myIconElement.style.fill = this._myParams.myBackgroundColor;\r\n }\r\n }\r\n\r\n destroy() {\r\n this._myDestroyed = true;\r\n\r\n this._myIconContainerElement.remove();\r\n }\r\n\r\n isDestroyed() {\r\n return this._myDestroyed;\r\n }\r\n}", "import { Globals } from \"../../../pp/globals.js\";\r\nimport { Handedness } from \"../../cauldron/input_types.js\";\r\nimport { VirtualGamepadAxesID, VirtualGamepadButtonID } from \"./virtual_gamepad.js\";\r\nimport { VirtualGamepadIconParams, VirtualGamepadIconType } from \"./virtual_gamepad_icon.js\";\r\n\r\nexport class VirtualGamepadButtonParams {\r\n\r\n constructor() {\r\n this.myIconParams = new VirtualGamepadIconParams();\r\n }\r\n}\r\n\r\nexport class VirtualGamepadThumbstickParams {\r\n\r\n constructor() {\r\n this.myBackgroundColor = \"\";\r\n\r\n this.myMaxDistanceFromCenterMultiplier = 1;\r\n\r\n this.myReleaseTransitionSeconds = 0.2;\r\n this.myMoveTransitionSeconds = 0;\r\n\r\n this.myIncludeBackgroundToDetection = false; // You can press the background of the icon to move the thumbstick, makes it harder to miss it\r\n\r\n this.myIconParams = new VirtualGamepadIconParams();\r\n }\r\n}\r\n\r\nexport class VirtualGamepadParams {\r\n\r\n constructor(engine = Globals.getMainEngine()) {\r\n this.myShowOnDesktop = false;\r\n this.myShowOnMobile = false;\r\n this.myShowOnHeadset = false; // Not 100% reliable, this is true if the device supports XR and it is Desktop\r\n\r\n this.myAutoUpdateVisibility = false;\r\n\r\n this.myOpacity = 1;\r\n\r\n this.myInterfaceScale = 1;\r\n this.myMarginScale = 1;\r\n\r\n this.myReleaseOnPointerLeave = true; // If mouse leaves the canvas it will be like it was released\r\n this.myStopPropagatingMouseDownEvents = true; // This can be used to make it so the rest of the game will ignore clicks on the virtual gamepad\r\n\r\n // Advanced Params\r\n\r\n this.myButtonParams = [];\r\n this.myButtonParams[Handedness.LEFT] = [];\r\n this.myButtonParams[Handedness.RIGHT] = [];\r\n\r\n this.myButtonParams[Handedness.LEFT][VirtualGamepadButtonID.SECOND_BUTTON] = new VirtualGamepadButtonParams();\r\n this.myButtonParams[Handedness.LEFT][VirtualGamepadButtonID.FIRST_BUTTON] = new VirtualGamepadButtonParams();\r\n this.myButtonParams[Handedness.LEFT][VirtualGamepadButtonID.FIFTH_BUTTON] = new VirtualGamepadButtonParams();\r\n this.myButtonParams[Handedness.LEFT][VirtualGamepadButtonID.THIRD_BUTTON] = new VirtualGamepadButtonParams();\r\n this.myButtonParams[Handedness.LEFT][VirtualGamepadButtonID.FOURTH_BUTTON] = new VirtualGamepadButtonParams();\r\n\r\n this.myButtonParams[Handedness.RIGHT][VirtualGamepadButtonID.SECOND_BUTTON] = new VirtualGamepadButtonParams();\r\n this.myButtonParams[Handedness.RIGHT][VirtualGamepadButtonID.FIRST_BUTTON] = new VirtualGamepadButtonParams();\r\n this.myButtonParams[Handedness.RIGHT][VirtualGamepadButtonID.FIFTH_BUTTON] = new VirtualGamepadButtonParams();\r\n this.myButtonParams[Handedness.RIGHT][VirtualGamepadButtonID.THIRD_BUTTON] = new VirtualGamepadButtonParams();\r\n this.myButtonParams[Handedness.RIGHT][VirtualGamepadButtonID.FOURTH_BUTTON] = new VirtualGamepadButtonParams();\r\n\r\n this.myThumbstickParams = [];\r\n this.myThumbstickParams[Handedness.LEFT] = [];\r\n this.myThumbstickParams[Handedness.RIGHT] = [];\r\n this.myThumbstickParams[Handedness.LEFT][VirtualGamepadAxesID.FIRST_AXES] = new VirtualGamepadThumbstickParams();\r\n this.myThumbstickParams[Handedness.RIGHT][VirtualGamepadAxesID.FIRST_AXES] = new VirtualGamepadThumbstickParams();\r\n\r\n this.myButtonsEnabled = [];\r\n this.myButtonsEnabled[Handedness.LEFT] = [];\r\n this.myButtonsEnabled[Handedness.RIGHT] = [];\r\n\r\n this.myButtonsEnabled[Handedness.LEFT][VirtualGamepadButtonID.FIRST_BUTTON] = false;\r\n this.myButtonsEnabled[Handedness.LEFT][VirtualGamepadButtonID.SECOND_BUTTON] = false;\r\n this.myButtonsEnabled[Handedness.LEFT][VirtualGamepadButtonID.THIRD_BUTTON] = false;\r\n this.myButtonsEnabled[Handedness.LEFT][VirtualGamepadButtonID.FOURTH_BUTTON] = false;\r\n this.myButtonsEnabled[Handedness.LEFT][VirtualGamepadButtonID.FIFTH_BUTTON] = false;\r\n\r\n this.myButtonsEnabled[Handedness.RIGHT][VirtualGamepadButtonID.FIRST_BUTTON] = false;\r\n this.myButtonsEnabled[Handedness.RIGHT][VirtualGamepadButtonID.SECOND_BUTTON] = false;\r\n this.myButtonsEnabled[Handedness.RIGHT][VirtualGamepadButtonID.THIRD_BUTTON] = false;\r\n this.myButtonsEnabled[Handedness.RIGHT][VirtualGamepadButtonID.FOURTH_BUTTON] = false;\r\n this.myButtonsEnabled[Handedness.RIGHT][VirtualGamepadButtonID.FIFTH_BUTTON] = false;\r\n\r\n this.myThumbsticksEnabled = [];\r\n this.myThumbsticksEnabled[Handedness.LEFT] = [];\r\n this.myThumbsticksEnabled[Handedness.RIGHT] = [];\r\n\r\n this.myThumbsticksEnabled[Handedness.LEFT][VirtualGamepadAxesID.FIRST_AXES] = false;\r\n this.myThumbsticksEnabled[Handedness.RIGHT][VirtualGamepadAxesID.FIRST_AXES] = false;\r\n\r\n // Even More Advanced Params\r\n\r\n this.myValidPointerButtons = [];\r\n\r\n this.myMarginLeft = 0;\r\n this.myMarginRight = 0;\r\n this.myMarginBottom = 0;\r\n\r\n this.myThumbstickSize = 0;\r\n\r\n this.myButtonSize = 0;\r\n this.myButtonsRingRadius = 0;\r\n this.myButtonsRingStartAngle = 0;\r\n this.myButtonsRingEndAngle = 0;\r\n\r\n this.myFontSize = 0;\r\n\r\n this.myMinSizeMultiplier = 0; // Can be used to specify a min size based on the view width for when the view is in portrait mode\r\n\r\n this.myDisableMouseHoverWhenPressed = false;\r\n\r\n this.myEngine = engine;\r\n }\r\n\r\n defaultConfig() {\r\n this.myShowOnMobile = true;\r\n this.myAutoUpdateVisibility = true;\r\n\r\n this.myOpacity = 0.5;\r\n\r\n // Params\r\n\r\n let backgroundColor = \"#616161\";\r\n let iconColor = \"#e0e0e0\";\r\n\r\n let buttonHoveredBrightness = 0.75;\r\n let thumbstickHoveredBrightness = 0.75;\r\n\r\n let thumbstickIncludeBackgroundToDetection = true;\r\n\r\n for (let handedness in this.myButtonParams) {\r\n for (let gamepadButtonID in this.myButtonParams[handedness]) {\r\n let buttonParams = this.myButtonParams[handedness][gamepadButtonID];\r\n buttonParams.myIconParams.myBackgroundColor = backgroundColor;\r\n buttonParams.myIconParams.myBackgroundPressedColor = iconColor;\r\n buttonParams.myIconParams.myIconColor = iconColor;\r\n buttonParams.myIconParams.myIconPressedColor = backgroundColor;\r\n buttonParams.myIconParams.myOverallHoveredBrightness = buttonHoveredBrightness;\r\n }\r\n }\r\n\r\n this.myButtonParams[Handedness.LEFT][VirtualGamepadButtonID.FIRST_BUTTON].myIconParams.myIconType = VirtualGamepadIconType.SQUARE;\r\n this.myButtonParams[Handedness.RIGHT][VirtualGamepadButtonID.FIRST_BUTTON].myIconParams.myIconType = VirtualGamepadIconType.SQUARE;\r\n\r\n this.myButtonParams[Handedness.LEFT][VirtualGamepadButtonID.SECOND_BUTTON].myIconParams.myIconType = VirtualGamepadIconType.FRAME;\r\n this.myButtonParams[Handedness.RIGHT][VirtualGamepadButtonID.SECOND_BUTTON].myIconParams.myIconType = VirtualGamepadIconType.FRAME;\r\n\r\n this.myButtonParams[Handedness.LEFT][VirtualGamepadButtonID.THIRD_BUTTON].myIconParams.myIconType = VirtualGamepadIconType.CIRCLE;\r\n this.myButtonParams[Handedness.RIGHT][VirtualGamepadButtonID.THIRD_BUTTON].myIconParams.myIconType = VirtualGamepadIconType.CIRCLE;\r\n\r\n this.myButtonParams[Handedness.LEFT][VirtualGamepadButtonID.FOURTH_BUTTON].myIconParams.myIconType = VirtualGamepadIconType.RING;\r\n this.myButtonParams[Handedness.RIGHT][VirtualGamepadButtonID.FOURTH_BUTTON].myIconParams.myIconType = VirtualGamepadIconType.RING;\r\n\r\n this.myButtonParams[Handedness.LEFT][VirtualGamepadButtonID.FIFTH_BUTTON].myIconParams.myIconType = VirtualGamepadIconType.DOT;\r\n this.myButtonParams[Handedness.RIGHT][VirtualGamepadButtonID.FIFTH_BUTTON].myIconParams.myIconType = VirtualGamepadIconType.DOT;\r\n\r\n for (let handedness in this.myThumbstickParams) {\r\n for (let gamepadAxesID in this.myThumbstickParams[handedness]) {\r\n let thumbstickParams = this.myThumbstickParams[handedness][gamepadAxesID];\r\n thumbstickParams.myBackgroundColor = backgroundColor;\r\n thumbstickParams.myIconParams.myBackgroundColor = iconColor;\r\n thumbstickParams.myIconParams.myBackgroundPressedColor = iconColor;\r\n thumbstickParams.myIconParams.myIconColor = backgroundColor;\r\n thumbstickParams.myIconParams.myIconPressedColor = backgroundColor;\r\n thumbstickParams.myIconParams.myOverallHoveredBrightness = thumbstickHoveredBrightness;\r\n\r\n thumbstickParams.myIncludeBackgroundToDetection = thumbstickIncludeBackgroundToDetection;\r\n }\r\n }\r\n\r\n // Enabled\r\n\r\n this.myButtonsEnabled[Handedness.LEFT][VirtualGamepadButtonID.FIRST_BUTTON] = true;\r\n this.myButtonsEnabled[Handedness.LEFT][VirtualGamepadButtonID.SECOND_BUTTON] = true;\r\n this.myButtonsEnabled[Handedness.LEFT][VirtualGamepadButtonID.THIRD_BUTTON] = true;\r\n this.myButtonsEnabled[Handedness.LEFT][VirtualGamepadButtonID.FOURTH_BUTTON] = true;\r\n this.myButtonsEnabled[Handedness.LEFT][VirtualGamepadButtonID.FIFTH_BUTTON] = true;\r\n\r\n this.myButtonsEnabled[Handedness.RIGHT][VirtualGamepadButtonID.FIRST_BUTTON] = true;\r\n this.myButtonsEnabled[Handedness.RIGHT][VirtualGamepadButtonID.SECOND_BUTTON] = true;\r\n this.myButtonsEnabled[Handedness.RIGHT][VirtualGamepadButtonID.THIRD_BUTTON] = true;\r\n this.myButtonsEnabled[Handedness.RIGHT][VirtualGamepadButtonID.FOURTH_BUTTON] = true;\r\n this.myButtonsEnabled[Handedness.RIGHT][VirtualGamepadButtonID.FIFTH_BUTTON] = true;\r\n\r\n this.myThumbsticksEnabled[Handedness.LEFT][VirtualGamepadAxesID.FIRST_AXES] = true;\r\n this.myThumbsticksEnabled[Handedness.RIGHT][VirtualGamepadAxesID.FIRST_AXES] = true;\r\n\r\n // Sizes\r\n\r\n this.myMarginLeft = 3;\r\n this.myMarginRight = 3;\r\n this.myMarginBottom = 3;\r\n\r\n this.myThumbstickSize = 15;\r\n\r\n this.myButtonSize = 5;\r\n this.myButtonsRingRadius = 12;\r\n this.myButtonsRingStartAngle = 385;\r\n this.myButtonsRingEndAngle = 245;\r\n\r\n this.myMinSizeMultiplier = 5 / 3;\r\n\r\n // Cauldron\r\n\r\n this.myDisableMouseHoverWhenPressed = true;\r\n this.myValidPointerButtons = [0];\r\n }\r\n}", "import { Handedness } from \"../../cauldron/input_types.js\";\r\nimport { VirtualGamepadIcon } from \"./virtual_gamepad_icon.js\";\r\n\r\nexport class VirtualGamepadVirtualButton {\r\n\r\n constructor(buttonElementParent, virtualGamepadParams, virtualButtonHandedness, virtualGamepadButtonID) {\r\n this._myButtonElement = null;\r\n this._myButtonIcon = null;\r\n this._myButtonDetectionElement = null;\r\n\r\n this._myActive = true;\r\n\r\n this._myPointerID = null;\r\n this._myPointerButton = null;\r\n\r\n this._myPressed = false;\r\n\r\n this._myVirtualGamepadParams = virtualGamepadParams;\r\n this._myParams = this._myVirtualGamepadParams.myButtonParams[virtualButtonHandedness][virtualGamepadButtonID];\r\n\r\n this._myButtonElementParent = buttonElementParent;\r\n this._build(virtualButtonHandedness, virtualGamepadButtonID);\r\n\r\n this._myPointerDownEventListener = this._onPointerDown.bind(this, this._myVirtualGamepadParams.myStopPropagatingPointerDownEvents);\r\n this._myPointerUpEventListener = this._onPointerUp.bind(this);\r\n this._myPointerLeaveEventListener = this._onPointerLeave.bind(this);\r\n this._myMouseEnterEventListener = this._onButtonEnter.bind(this);\r\n this._myMouseLeaveEventListener = this._onButtonLeave.bind(this);\r\n\r\n this._myButtonDetectionElement.addEventListener(\"pointerdown\", this._myPointerDownEventListener);\r\n document.body.addEventListener(\"pointerup\", this._myPointerUpEventListener);\r\n\r\n if (this._myVirtualGamepadParams.myReleaseOnPointerLeave) {\r\n document.body.addEventListener(\"pointerleave\", this._myPointerLeaveEventListener);\r\n }\r\n\r\n this._myButtonDetectionElement.addEventListener(\"mouseenter\", this._myMouseEnterEventListener);\r\n this._myButtonDetectionElement.addEventListener(\"mouseleave\", this._myMouseLeaveEventListener);\r\n\r\n this._myDestroyed = false;\r\n }\r\n\r\n isPressed() {\r\n return this._myActive && this._myPressed;\r\n }\r\n\r\n setActive(active) {\r\n if (this._myActive != active) {\r\n this._myActive = active;\r\n\r\n this.reset();\r\n this._myButtonIcon.reset();\r\n\r\n if (this._myActive) {\r\n this._myButtonDetectionElement.addEventListener(\"pointerdown\", this._myPointerDownEventListener);\r\n document.body.addEventListener(\"pointerup\", this._myPointerUpEventListener);\r\n\r\n if (this._myVirtualGamepadParams.myReleaseOnPointerLeave) {\r\n document.body.addEventListener(\"pointerleave\", this._myPointerLeaveEventListener);\r\n }\r\n\r\n this._myButtonDetectionElement.addEventListener(\"mouseenter\", this._myMouseEnterEventListener);\r\n this._myButtonDetectionElement.addEventListener(\"mouseleave\", this._myMouseLeaveEventListener);\r\n\r\n this._myButtonElementParent.appendChild(this._myButtonContainer);\r\n } else {\r\n this._myButtonDetectionElement.removeEventListener(\"pointerdown\", this._myPointerDownEventListener);\r\n\r\n document.body.removeEventListener(\"pointerup\", this._myPointerUpEventListener);\r\n document.body.removeEventListener(\"pointerleave\", this._myPointerLeaveEventListener);\r\n\r\n this._myButtonDetectionElement.removeEventListener(\"mouseenter\", this._myMouseEnterEventListener);\r\n this._myButtonDetectionElement.removeEventListener(\"mouseleave\", this._myMouseLeaveEventListener);\r\n\r\n this._myButtonContainer.remove();\r\n }\r\n }\r\n }\r\n\r\n setMouseHoverEnabled(hoverActive) {\r\n this._myButtonIcon.setMouseHoverEnabled(hoverActive);\r\n }\r\n\r\n reset() {\r\n this._myButtonIcon.setPressed(false);\r\n\r\n this._myPressed = false;\r\n this._myPointerID = null;\r\n this._myPointerButton = null;\r\n }\r\n\r\n update(dt) {\r\n this._myButtonIcon.update(dt);\r\n }\r\n\r\n _onPointerDown(stopPropagatingPointerDownEvents, event) {\r\n if (!this._myActive) return;\r\n if (this._myPressed) return;\r\n if (!this._myVirtualGamepadParams.myValidPointerButtons.pp_hasEqual(event.button)) return;\r\n\r\n if (stopPropagatingPointerDownEvents) {\r\n event.stopPropagation();\r\n }\r\n event.preventDefault();\r\n\r\n this._myButtonIcon.setPressed(true);\r\n\r\n this._myPointerID = event.pointerId;\r\n this._myPointerButton = event.button;\r\n\r\n this._myPressed = true;\r\n }\r\n\r\n _onPointerUp(event) {\r\n if (!this._myActive) return;\r\n if (!this._myPressed) return;\r\n if (this._myPointerID != event.pointerId) return;\r\n if (this._myPointerButton != null && this._myPointerButton != event.button) return;\r\n\r\n this.reset();\r\n }\r\n\r\n _onPointerLeave(event) {\r\n if (!this._myActive) return;\r\n if (this._myPointerID != event.pointerId) return;\r\n\r\n this.reset();\r\n }\r\n\r\n _onButtonEnter(event) {\r\n if (!this._myActive) return;\r\n\r\n this._myButtonIcon.onMouseEnter(event);\r\n }\r\n\r\n _onButtonLeave(event) {\r\n if (!this._myActive) return;\r\n\r\n this._myButtonIcon.onMouseLeave(event);\r\n }\r\n\r\n _build(virtualButtonHandedness, virtualButtonIndex) {\r\n // Config variables used for the sizes and the like\r\n\r\n let buttonSize = this._myVirtualGamepadParams.myButtonSize * this._myVirtualGamepadParams.myInterfaceScale;\r\n let buttonsRingRadius = this._myVirtualGamepadParams.myButtonsRingRadius * this._myVirtualGamepadParams.myInterfaceScale;\r\n\r\n let thumbstickSize = this._myVirtualGamepadParams.myThumbstickSize * this._myVirtualGamepadParams.myInterfaceScale;\r\n\r\n let marginBottom = this._myVirtualGamepadParams.myMarginBottom * this._myVirtualGamepadParams.myInterfaceScale * this._myVirtualGamepadParams.myMarginScale;\r\n let marginLeft = this._myVirtualGamepadParams.myMarginLeft * this._myVirtualGamepadParams.myInterfaceScale * this._myVirtualGamepadParams.myMarginScale;\r\n let marginRight = this._myVirtualGamepadParams.myMarginRight * this._myVirtualGamepadParams.myInterfaceScale * this._myVirtualGamepadParams.myMarginScale;\r\n\r\n let buttonRingStartAngle = this._myVirtualGamepadParams.myButtonsRingStartAngle;\r\n let buttonRingEndAngle = this._myVirtualGamepadParams.myButtonsRingEndAngle;\r\n\r\n let minSizeMultiplier = Math.max(1, this._myVirtualGamepadParams.myMinSizeMultiplier / this._myVirtualGamepadParams.myInterfaceScale);\r\n\r\n let buttonsAmount = this._myVirtualGamepadParams.myButtonsEnabled[Handedness.LEFT].length;\r\n\r\n let angleStep = (buttonRingEndAngle - buttonRingStartAngle) / (buttonsAmount - 1);\r\n\r\n let currentAngle = Math.pp_angleClamp(buttonRingStartAngle + angleStep * virtualButtonIndex);\r\n\r\n if (virtualButtonHandedness == Handedness.RIGHT) {\r\n currentAngle = 270 + (270 - currentAngle);\r\n currentAngle = Math.pp_angleClamp(currentAngle, true);\r\n }\r\n\r\n let counterAngle = 360 - currentAngle;\r\n\r\n // Actual button creation\r\n\r\n this._myButtonContainer = document.createElement(\"div\");\r\n this._myButtonContainer.style.position = \"absolute\";\r\n this._myButtonContainer.style.width = this._createSizeValue(buttonSize, minSizeMultiplier);\r\n this._myButtonContainer.style.height = this._createSizeValue(buttonSize, minSizeMultiplier);\r\n\r\n let centerOnThumbstickBottom = marginBottom + thumbstickSize / 2 - buttonSize / 2;\r\n\r\n this._myButtonContainer.style.bottom = this._createSizeValue(centerOnThumbstickBottom, minSizeMultiplier);\r\n\r\n if (virtualButtonHandedness == Handedness.LEFT) {\r\n let centerOnThumbstickLeft = marginLeft + thumbstickSize / 2 - buttonSize / 2;\r\n this._myButtonContainer.style.left = this._createSizeValue(centerOnThumbstickLeft, minSizeMultiplier);\r\n } else {\r\n let centerOnThumbstickRight = marginRight + thumbstickSize / 2 - buttonSize / 2;\r\n this._myButtonContainer.style.right = this._createSizeValue(centerOnThumbstickRight, minSizeMultiplier);\r\n }\r\n\r\n this._myButtonContainer.style.transform = \"rotate(\" + currentAngle + \"deg) translateX(\" + this._createSizeValue(buttonsRingRadius, minSizeMultiplier) + \")\";\r\n this._myButtonElementParent.appendChild(this._myButtonContainer);\r\n\r\n this._myButtonElement = document.createElement(\"div\");\r\n this._myButtonElement.style.position = \"absolute\";\r\n this._myButtonElement.style.width = \"100%\";\r\n this._myButtonElement.style.height = \"100%\";\r\n this._myButtonElement.style.transform = \"rotate(\" + counterAngle + \"deg)\";\r\n this._myButtonContainer.appendChild(this._myButtonElement);\r\n\r\n this._myButtonIcon = new VirtualGamepadIcon(this._myButtonElement, this._myParams.myIconParams, minSizeMultiplier, this._myVirtualGamepadParams.myInterfaceScale, this._myVirtualGamepadParams.myEngine);\r\n\r\n let buttonElementStill = document.createElement(\"div\");\r\n buttonElementStill.style.position = \"absolute\";\r\n buttonElementStill.style.width = \"100%\";\r\n buttonElementStill.style.height = \"100%\";\r\n buttonElementStill.style.transform = \"rotate(\" + counterAngle + \"deg)\";\r\n this._myButtonContainer.appendChild(buttonElementStill);\r\n\r\n let buttonDetectionElementSVG = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\r\n buttonDetectionElementSVG.style.position = \"absolute\";\r\n buttonDetectionElementSVG.style.width = \"100%\";\r\n buttonDetectionElementSVG.style.height = \"100%\";\r\n buttonElementStill.appendChild(buttonDetectionElementSVG);\r\n\r\n let buttonDetectionElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"circle\");\r\n buttonDetectionElement.setAttributeNS(null, \"cx\", \"50%\");\r\n buttonDetectionElement.setAttributeNS(null, \"cy\", \"50%\");\r\n buttonDetectionElement.setAttributeNS(null, \"r\", \"50%\");\r\n buttonDetectionElement.style.fill = \"#00000000\";\r\n buttonDetectionElementSVG.appendChild(buttonDetectionElement);\r\n\r\n this._myButtonDetectionElement = buttonDetectionElement;\r\n }\r\n\r\n _createSizeValue(value, minSizeMultiplier) {\r\n return \"min(\" + value.toFixed(3) + \"vmax,\" + (value * minSizeMultiplier).toFixed(3) + \"vw)\";\r\n }\r\n\r\n destroy() {\r\n this._myDestroyed = true;\r\n\r\n this.setActive(false);\r\n\r\n this._myButtonIcon.destroy();\r\n }\r\n\r\n isDestroyed() {\r\n return this._myDestroyed;\r\n }\r\n}", "import { vec2_create } from \"../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Handedness } from \"../../cauldron/input_types.js\";\r\nimport { VirtualGamepadIcon } from \"./virtual_gamepad_icon.js\";\r\n\r\nexport class VirtualGamepadVirtualThumbstick {\r\n\r\n constructor(thumbstickElementParent, virtualGamepadParams, virtualThumbstickHandedness, virtualGamepadAxesID) {\r\n this._myThumbstickElement = null;\r\n this._myThumbstickIcon = null;\r\n\r\n this._myThumbstickBackground = null;\r\n this._myThumbstickBackgroundResizeObserver = null;\r\n this._myThumbstickBackgroundWidth = 0;\r\n\r\n this._myThumbstickDetectionElement = null;\r\n\r\n this._myActive = true;\r\n\r\n this._myPointerID = null;\r\n this._myPointerButton = null;\r\n\r\n this._myThumbstickDragStartPosition = vec2_create();\r\n\r\n this._myAxes = vec2_create();\r\n this._myPressed = false;\r\n\r\n this._myVirtualGamepadParams = virtualGamepadParams;\r\n this._myParams = this._myVirtualGamepadParams.myThumbstickParams[virtualThumbstickHandedness][virtualGamepadAxesID];\r\n\r\n this._myThumbstickElementParent = thumbstickElementParent;\r\n this._build(virtualThumbstickHandedness);\r\n\r\n this._myPointerDownEventListener = this._onPointerDown.bind(this, this._myVirtualGamepadParams.myStopPropagatingPointerDownEvents);\r\n this._myPointerUpEventListener = this._onPointerUp.bind(this);\r\n this._myPointerMoveEventListener = this._onPointerMove.bind(this);\r\n this._myPointerLeaveEventListener = this._onPointerLeave.bind(this);\r\n this._myMouseEnterEventListener = this._onThumbstickEnter.bind(this);\r\n this._myMouseLeaveEventListener = this._onThumbstickLeave.bind(this);\r\n\r\n this._myThumbstickDetectionElement.addEventListener(\"pointerdown\", this._myPointerDownEventListener);\r\n document.body.addEventListener(\"pointerup\", this._myPointerUpEventListener);\r\n document.body.addEventListener(\"pointermove\", this._myPointerMoveEventListener);\r\n\r\n if (this._myVirtualGamepadParams.myReleaseOnPointerLeave) {\r\n document.body.addEventListener(\"pointerleave\", this._myPointerLeaveEventListener);\r\n }\r\n\r\n this._myThumbstickDetectionElement.addEventListener(\"mouseenter\", this._myMouseEnterEventListener);\r\n this._myThumbstickDetectionElement.addEventListener(\"mouseleave\", this._myMouseLeaveEventListener);\r\n\r\n this._myDestroyed = false;\r\n }\r\n\r\n isPressed() {\r\n return this._myActive && this._myPressed;\r\n }\r\n\r\n getAxes() {\r\n return this._myAxes;\r\n }\r\n\r\n setActive(active) {\r\n if (this._myActive != active) {\r\n this._myActive = active;\r\n\r\n this.reset();\r\n this._myThumbstickIcon.reset();\r\n\r\n if (this._myActive) {\r\n this._myThumbstickDetectionElement.addEventListener(\"pointerdown\", this._myPointerDownEventListener);\r\n document.body.addEventListener(\"pointerup\", this._myPointerUpEventListener);\r\n document.body.addEventListener(\"pointermove\", this._myPointerMoveEventListener);\r\n\r\n if (this._myVirtualGamepadParams.myReleaseOnPointerLeave) {\r\n document.body.addEventListener(\"pointerleave\", this._myPointerLeaveEventListener);\r\n }\r\n\r\n this._myThumbstickDetectionElement.addEventListener(\"mouseenter\", this._myMouseEnterEventListener);\r\n this._myThumbstickDetectionElement.addEventListener(\"mouseleave\", this._myMouseLeaveEventListener);\r\n\r\n this._myThumbstickBackgroundResizeObserver.observe(this._myThumbstickBackground);\r\n\r\n\r\n this._myThumbstickElementParent.appendChild(this._myThumbstickContainer);\r\n } else {\r\n this._myThumbstickDetectionElement.removeEventListener(\"pointerdown\", this._myPointerDownEventListener);\r\n\r\n document.body.removeEventListener(\"pointerup\", this._myPointerUpEventListener);\r\n document.body.removeEventListener(\"pointermove\", this._myPointerMoveEventListener);\r\n document.body.removeEventListener(\"pointerleave\", this._myPointerLeaveEventListener);\r\n\r\n this._myThumbstickDetectionElement.removeEventListener(\"mouseenter\", this._myMouseEnterEventListener);\r\n this._myThumbstickDetectionElement.removeEventListener(\"mouseleave\", this._myPointerUpEventLis_myMouseLeaveEventListenertener);\r\n\r\n this._myThumbstickBackgroundResizeObserver.disconnect();\r\n\r\n this._myThumbstickContainer.remove();\r\n }\r\n }\r\n }\r\n\r\n setMouseHoverEnabled(hoverActive) {\r\n this._myThumbstickIcon.setMouseHoverEnabled(hoverActive);\r\n }\r\n\r\n reset() {\r\n this._myThumbstickIcon.setPressed(false);\r\n\r\n this._myAxes[0] = 0;\r\n this._myAxes[1] = 0;\r\n this._myPressed = false;\r\n this._myPointerID = null;\r\n this._myPointerButton = null;\r\n\r\n this._myThumbstickElement.style.transition = \"all \" + this._myParams.myReleaseTransitionSeconds + \"s ease 0s\";\r\n this._myThumbstickElement.style.transform = \"translate(0px, 0px)\";\r\n }\r\n\r\n update(dt) {\r\n this._myThumbstickIcon.update(dt);\r\n }\r\n\r\n _onPointerDown(stopPropagatingPointerDownEvents, event) {\r\n if (!this._myActive) return;\r\n if (this._myPressed) return;\r\n if (!this._myVirtualGamepadParams.myValidPointerButtons.pp_hasEqual(event.button)) return;\r\n\r\n if (stopPropagatingPointerDownEvents) {\r\n event.stopPropagation();\r\n }\r\n event.preventDefault();\r\n\r\n this._myThumbstickIcon.setPressed(true);\r\n\r\n this._myPointerID = event.pointerId;\r\n this._myPointerButton = event.button;\r\n\r\n this._myThumbstickDragStartPosition[0] = event.clientX;\r\n this._myThumbstickDragStartPosition[1] = event.clientY;\r\n\r\n this._myPressed = true;\r\n }\r\n\r\n _onPointerUp(event) {\r\n if (!this._myActive) return;\r\n if (!this._myPressed) return;\r\n if (this._myPointerID != event.pointerId) return;\r\n if (this._myPointerButton != null && this._myPointerButton != event.button) return;\r\n\r\n this.reset();\r\n }\r\n\r\n _onPointerLeave(event) {\r\n if (!this._myActive) return;\r\n if (this._myPointerID != event.pointerId) return;\r\n\r\n this.reset();\r\n }\r\n\r\n _onThumbstickEnter(event) {\r\n this._myThumbstickIcon.onMouseEnter(event);\r\n }\r\n\r\n _onThumbstickLeave(event) {\r\n this._myThumbstickIcon.onMouseLeave(event);\r\n }\r\n\r\n _onPointerMove(event) {\r\n if (!this._myActive) return;\r\n if (!this._myPressed) return;\r\n\r\n if (event.pointerId != this._myPointerID) return;\r\n\r\n let mouseX = event.clientX;\r\n let mouseY = event.clientY;\r\n\r\n let maxDistanceFromCenter = (this._myThumbstickBackgroundWidth / 2) * this._myParams.myMaxDistanceFromCenterMultiplier;\r\n\r\n let xDiff = mouseX - this._myThumbstickDragStartPosition[0];\r\n let yDiff = mouseY - this._myThumbstickDragStartPosition[1];\r\n\r\n let angle = Math.atan2(yDiff, xDiff);\r\n let distanceFromDragStart = Math.min(maxDistanceFromCenter, Math.hypot(xDiff, yDiff));\r\n\r\n let translateThumbstickX = distanceFromDragStart * Math.cos(angle);\r\n let translateThumbstickY = distanceFromDragStart * Math.sin(angle);\r\n\r\n this._myThumbstickElement.style.transition = \"all \" + this._myParams.myMoveTransitionSeconds + \"s ease-out 0s\";\r\n this._myThumbstickElement.style.transform = \"translate(\" + translateThumbstickX + \"px, \" + translateThumbstickY + \"px)\";\r\n\r\n this._myAxes[0] = translateThumbstickX / maxDistanceFromCenter;\r\n this._myAxes[1] = -(translateThumbstickY / maxDistanceFromCenter);\r\n }\r\n\r\n _build(virtualThumbstickHandedness) {\r\n // Config variables used for the sizes and the like\r\n\r\n let thumbstickSize = this._myVirtualGamepadParams.myThumbstickSize * this._myVirtualGamepadParams.myInterfaceScale;\r\n\r\n let marginBottom = this._myVirtualGamepadParams.myMarginBottom * this._myVirtualGamepadParams.myInterfaceScale * this._myVirtualGamepadParams.myMarginScale;\r\n let marginLeft = this._myVirtualGamepadParams.myMarginLeft * this._myVirtualGamepadParams.myInterfaceScale * this._myVirtualGamepadParams.myMarginScale;\r\n let marginRight = this._myVirtualGamepadParams.myMarginRight * this._myVirtualGamepadParams.myInterfaceScale * this._myVirtualGamepadParams.myMarginScale;\r\n\r\n let minSizeMultiplier = Math.max(1, this._myVirtualGamepadParams.myMinSizeMultiplier / this._myVirtualGamepadParams.myInterfaceScale);\r\n\r\n // Actual thumbstick creation\r\n\r\n this._myThumbstickContainer = document.createElement(\"div\");\r\n this._myThumbstickContainer.style.position = \"absolute\";\r\n this._myThumbstickContainer.style.width = this._createSizeValue(thumbstickSize, minSizeMultiplier);\r\n this._myThumbstickContainer.style.height = this._createSizeValue(thumbstickSize, minSizeMultiplier);\r\n this._myThumbstickContainer.style.bottom = this._createSizeValue(marginBottom, minSizeMultiplier);\r\n\r\n if (virtualThumbstickHandedness == Handedness.LEFT) {\r\n this._myThumbstickContainer.style.left = this._createSizeValue(marginLeft, minSizeMultiplier);\r\n } else {\r\n this._myThumbstickContainer.style.right = this._createSizeValue(marginRight, minSizeMultiplier);\r\n }\r\n\r\n this._myThumbstickElementParent.appendChild(this._myThumbstickContainer);\r\n\r\n let thumbstickContainerSVG = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\r\n thumbstickContainerSVG.style.position = \"absolute\";\r\n thumbstickContainerSVG.style.width = \"100%\";\r\n thumbstickContainerSVG.style.height = \"100%\";\r\n this._myThumbstickContainer.appendChild(thumbstickContainerSVG);\r\n\r\n this._myThumbstickBackground = document.createElementNS(\"http://www.w3.org/2000/svg\", \"circle\");\r\n this._myThumbstickBackground.setAttributeNS(null, \"cx\", \"50%\");\r\n this._myThumbstickBackground.setAttributeNS(null, \"cy\", \"50%\");\r\n this._myThumbstickBackground.setAttributeNS(null, \"r\", \"48%\");\r\n this._myThumbstickBackground.style.fill = this._myParams.myBackgroundColor;\r\n thumbstickContainerSVG.appendChild(this._myThumbstickBackground);\r\n\r\n this._myThumbstickElement = document.createElement(\"div\");\r\n this._myThumbstickElement.style.position = \"absolute\";\r\n this._myThumbstickElement.style.width = \"34%\";\r\n this._myThumbstickElement.style.height = \"34%\";\r\n this._myThumbstickElement.style.top = \"33%\";\r\n this._myThumbstickElement.style.left = \"33%\";\r\n this._myThumbstickContainer.appendChild(this._myThumbstickElement);\r\n\r\n this._myThumbstickIcon = new VirtualGamepadIcon(this._myThumbstickElement, this._myParams.myIconParams, minSizeMultiplier, this._myVirtualGamepadParams.myScale, this._myVirtualGamepadParams.myEngine);\r\n\r\n if (this._myParams.myIncludeBackgroundToDetection) {\r\n let thumbstickBackgroundDetectionElementSVG = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\r\n thumbstickBackgroundDetectionElementSVG.style.position = \"absolute\";\r\n thumbstickBackgroundDetectionElementSVG.style.width = \"100%\";\r\n thumbstickBackgroundDetectionElementSVG.style.height = \"100%\";\r\n this._myThumbstickContainer.appendChild(thumbstickBackgroundDetectionElementSVG);\r\n\r\n let thumbstickBackgroundDetectionElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"circle\");\r\n thumbstickBackgroundDetectionElement.setAttributeNS(null, \"cx\", \"50%\");\r\n thumbstickBackgroundDetectionElement.setAttributeNS(null, \"cy\", \"50%\");\r\n thumbstickBackgroundDetectionElement.setAttributeNS(null, \"r\", \"48%\");\r\n thumbstickBackgroundDetectionElement.style.fill = \"#00000000\";\r\n thumbstickBackgroundDetectionElementSVG.appendChild(thumbstickBackgroundDetectionElement);\r\n\r\n this._myThumbstickDetectionElement = thumbstickBackgroundDetectionElement;\r\n } else {\r\n let thumbstickElementStill = document.createElement(\"div\");\r\n thumbstickElementStill.style.position = \"absolute\";\r\n thumbstickElementStill.style.width = \"34%\";\r\n thumbstickElementStill.style.height = \"34%\";\r\n thumbstickElementStill.style.top = \"33%\";\r\n thumbstickElementStill.style.left = \"33%\";\r\n this._myThumbstickContainer.appendChild(thumbstickElementStill);\r\n\r\n let thumbstickDetectionElementSVG = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\r\n thumbstickDetectionElementSVG.style.position = \"absolute\";\r\n thumbstickDetectionElementSVG.style.width = \"100%\";\r\n thumbstickDetectionElementSVG.style.height = \"100%\";\r\n thumbstickElementStill.appendChild(thumbstickDetectionElementSVG);\r\n\r\n let thumbstickDetectionElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"circle\");\r\n thumbstickDetectionElement.setAttributeNS(null, \"cx\", \"50%\");\r\n thumbstickDetectionElement.setAttributeNS(null, \"cy\", \"50%\");\r\n thumbstickDetectionElement.setAttributeNS(null, \"r\", \"50%\");\r\n thumbstickDetectionElement.style.fill = \"#00000000\";\r\n thumbstickDetectionElementSVG.appendChild(thumbstickDetectionElement);\r\n\r\n this._myThumbstickDetectionElement = thumbstickDetectionElement;\r\n }\r\n\r\n this._myThumbstickBackgroundResizeObserver = new ResizeObserver(() => {\r\n let backgroundRect = this._myThumbstickBackground.getBoundingClientRect();\r\n this._myThumbstickBackgroundWidth = backgroundRect.width;\r\n });\r\n }\r\n\r\n _createSizeValue(value, minSizeMultiplier) {\r\n return \"min(\" + value.toFixed(3) + \"vmax,\" + (value * minSizeMultiplier).toFixed(3) + \"vw)\";\r\n }\r\n\r\n destroy() {\r\n this._myDestroyed = true;\r\n\r\n this.setActive(false);\r\n\r\n this._myThumbstickIcon.destroy();\r\n }\r\n\r\n isDestroyed() {\r\n return this._myDestroyed;\r\n }\r\n}", "import { BrowserUtils } from \"../../../cauldron/utils/browser_utils.js\";\r\nimport { XRUtils } from \"../../../cauldron/utils/xr_utils.js\";\r\nimport { vec2_create } from \"../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Handedness } from \"../../cauldron/input_types.js\";\r\nimport { VirtualGamepadParams } from \"./virtual_gamepad_params.js\";\r\nimport { VirtualGamepadVirtualButton } from \"./virtual_gamepad_virtual_button.js\";\r\nimport { VirtualGamepadVirtualThumbstick } from \"./virtual_gamepad_virtual_thumbstick.js\";\r\n\r\nexport let VirtualGamepadButtonID = {\r\n FIRST_BUTTON: 0,\r\n SECOND_BUTTON: 1,\r\n THIRD_BUTTON: 2,\r\n FOURTH_BUTTON: 3,\r\n FIFTH_BUTTON: 4\r\n};\r\n\r\nexport let VirtualGamepadAxesID = {\r\n FIRST_AXES: 0\r\n};\r\n\r\nexport class VirtualGamepad {\r\n\r\n constructor(params = new VirtualGamepadParams()) {\r\n this._myParams = params;\r\n\r\n this._myVisible = true;\r\n\r\n this._myVirtualGamepadContainer = null;\r\n\r\n this._myVirtualGamepadVirtualButtons = [];\r\n this._myVirtualGamepadVirtualButtons[Handedness.LEFT] = [];\r\n this._myVirtualGamepadVirtualButtons[Handedness.RIGHT] = [];\r\n\r\n this._myVirtualGamepadVirtualButtons[Handedness.LEFT][VirtualGamepadButtonID.FIRST_BUTTON] = null;\r\n this._myVirtualGamepadVirtualButtons[Handedness.LEFT][VirtualGamepadButtonID.SECOND_BUTTON] = null;\r\n this._myVirtualGamepadVirtualButtons[Handedness.LEFT][VirtualGamepadButtonID.THIRD_BUTTON] = null;\r\n this._myVirtualGamepadVirtualButtons[Handedness.LEFT][VirtualGamepadButtonID.FOURTH_BUTTON] = null;\r\n this._myVirtualGamepadVirtualButtons[Handedness.LEFT][VirtualGamepadButtonID.FIFTH_BUTTON] = null;\r\n\r\n this._myVirtualGamepadVirtualButtons[Handedness.RIGHT][VirtualGamepadButtonID.FIRST_BUTTON] = null;\r\n this._myVirtualGamepadVirtualButtons[Handedness.RIGHT][VirtualGamepadButtonID.SECOND_BUTTON] = null;\r\n this._myVirtualGamepadVirtualButtons[Handedness.RIGHT][VirtualGamepadButtonID.THIRD_BUTTON] = null;\r\n this._myVirtualGamepadVirtualButtons[Handedness.RIGHT][VirtualGamepadButtonID.FOURTH_BUTTON] = null;\r\n this._myVirtualGamepadVirtualButtons[Handedness.RIGHT][VirtualGamepadButtonID.FIFTH_BUTTON] = null;\r\n\r\n this._myButtonsAmount = this._myVirtualGamepadVirtualButtons[Handedness.LEFT].length;\r\n\r\n this._myVirtualGamepadVirtualThumbsticks = [];\r\n this._myVirtualGamepadVirtualThumbsticks[Handedness.LEFT] = [];\r\n this._myVirtualGamepadVirtualThumbsticks[Handedness.RIGHT] = [];\r\n this._myVirtualGamepadVirtualThumbsticks[Handedness.LEFT][VirtualGamepadAxesID.FIRST_AXES] = null;\r\n this._myVirtualGamepadVirtualThumbsticks[Handedness.RIGHT][VirtualGamepadAxesID.FIRST_AXES] = null;\r\n\r\n this._myGestureStartEventListener = null;\r\n\r\n this._myDestroyed = false;\r\n }\r\n\r\n isVisible() {\r\n return this._myVisible;\r\n }\r\n\r\n setVisible(visible) {\r\n if (this._myVisible != visible) {\r\n this._myVisible = visible;\r\n\r\n if (this._myVirtualGamepadContainer != null) {\r\n for (let handedness in this._myVirtualGamepadVirtualButtons) {\r\n for (let virtualGamepadButtonID in this._myVirtualGamepadVirtualButtons[handedness]) {\r\n let button = this._myVirtualGamepadVirtualButtons[handedness][virtualGamepadButtonID];\r\n if (button != null) {\r\n button.setActive(this._myVisible);\r\n }\r\n }\r\n }\r\n\r\n for (let handedness in this._myVirtualGamepadVirtualThumbsticks) {\r\n for (let virtualGamepadAxesID in this._myVirtualGamepadVirtualThumbsticks[handedness]) {\r\n let thumbstick = this._myVirtualGamepadVirtualThumbsticks[handedness][virtualGamepadAxesID];\r\n if (thumbstick != null) {\r\n thumbstick.setActive(this._myVisible);\r\n }\r\n }\r\n }\r\n\r\n if (this._myVisible) {\r\n document.body.appendChild(this._myVirtualGamepadContainer);\r\n } else {\r\n this._myVirtualGamepadContainer?.remove();\r\n }\r\n }\r\n\r\n if (this._myVisible) {\r\n document.addEventListener(\"gesturestart\", this._myGestureStartEventListener);\r\n } else {\r\n document.removeEventListener(\"gesturestart\", this._myGestureStartEventListener);\r\n }\r\n }\r\n }\r\n\r\n isButtonPressed(handedness, virtualGamepadButtonID) {\r\n if (!this._myVisible) return false;\r\n\r\n let button = this._myVirtualGamepadVirtualButtons[handedness][virtualGamepadButtonID];\r\n if (button != null) {\r\n return button.isPressed();\r\n }\r\n\r\n return false;\r\n }\r\n\r\n getAxes(handedness, virtualGamepadAxesID, outAxes = vec2_create(0, 0)) {\r\n if (!this._myVisible) return outAxes;\r\n\r\n let thumbstick = this._myVirtualGamepadVirtualThumbsticks[handedness][virtualGamepadAxesID];\r\n if (thumbstick != null) {\r\n outAxes.vec2_copy(thumbstick.getAxes());\r\n }\r\n\r\n return outAxes;\r\n }\r\n\r\n start() {\r\n this._buildVirtualGamepad();\r\n\r\n let currentVisible = this._myVisible;\r\n this._myVisible = !this._myVisible;\r\n this.setVisible(currentVisible);\r\n }\r\n\r\n update(dt) {\r\n if (this._myParams.myAutoUpdateVisibility) {\r\n if (XRUtils.isSessionActive(this._myParams.myEngine) && XRUtils.isVRSupported(this._myParams.myEngine)) {\r\n this.setVisible(false);\r\n } else if (this._myParams.myShowOnDesktop && BrowserUtils.isDesktop() && !XRUtils.isVRSupported(this._myParams.myEngine)) {\r\n this.setVisible(true);\r\n } else if (this._myParams.myShowOnHeadset && BrowserUtils.isDesktop() && XRUtils.isVRSupported(this._myParams.myEngine)) {\r\n this.setVisible(true);\r\n } else if (this._myParams.myShowOnMobile && BrowserUtils.isMobile()) {\r\n this.setVisible(true);\r\n } else {\r\n this.setVisible(false);\r\n }\r\n }\r\n\r\n if (this._myVisible) {\r\n for (let handedness in this._myVirtualGamepadVirtualButtons) {\r\n for (let virtualGamepadButtonID in this._myVirtualGamepadVirtualButtons[handedness]) {\r\n let button = this._myVirtualGamepadVirtualButtons[handedness][virtualGamepadButtonID];\r\n if (button != null) {\r\n button.update(dt);\r\n }\r\n }\r\n }\r\n\r\n for (let handedness in this._myVirtualGamepadVirtualThumbsticks) {\r\n for (let virtualGamepadAxesID in this._myVirtualGamepadVirtualThumbsticks[handedness]) {\r\n let thumbstick = this._myVirtualGamepadVirtualThumbsticks[handedness][virtualGamepadAxesID];\r\n if (thumbstick != null) {\r\n thumbstick.update(dt);\r\n }\r\n }\r\n }\r\n\r\n this._setMouseHoverEnabled(!(this._myParams.myDisableMouseHoverWhenPressed && this._isAnyElementPressed()));\r\n }\r\n }\r\n\r\n _buildVirtualGamepad() {\r\n this._setupDocumentBody();\r\n\r\n this._myVirtualGamepadContainer = document.createElement(\"div\");\r\n this._myVirtualGamepadContainer.style.display = \"block\";\r\n this._myVirtualGamepadContainer.style.opacity = this._myParams.myOpacity.toString();\r\n document.body.appendChild(this._myVirtualGamepadContainer);\r\n\r\n let leftDiv = document.createElement(\"div\");\r\n this._myVirtualGamepadContainer.appendChild(leftDiv);\r\n\r\n let rightDiv = document.createElement(\"div\");\r\n this._myVirtualGamepadContainer.appendChild(rightDiv);\r\n\r\n for (let virtualGamepadButtonID in this._myParams.myButtonsEnabled[Handedness.LEFT]) {\r\n if (this._myParams.myButtonsEnabled[Handedness.LEFT][virtualGamepadButtonID] != null) {\r\n let enabled = this._myParams.myButtonsEnabled[Handedness.LEFT][virtualGamepadButtonID];\r\n if (enabled) {\r\n this._buildButton(leftDiv, Handedness.LEFT, virtualGamepadButtonID);\r\n }\r\n }\r\n\r\n if (this._myParams.myButtonsEnabled[Handedness.RIGHT][virtualGamepadButtonID] != null) {\r\n let enabled = this._myParams.myButtonsEnabled[Handedness.RIGHT][virtualGamepadButtonID];\r\n if (enabled) {\r\n this._buildButton(rightDiv, Handedness.RIGHT, virtualGamepadButtonID);\r\n }\r\n }\r\n }\r\n\r\n for (let virtualGamepadAxesID in this._myParams.myThumbsticksEnabled[Handedness.LEFT]) {\r\n if (this._myParams.myThumbsticksEnabled[Handedness.LEFT][virtualGamepadAxesID] != null) {\r\n let enabled = this._myParams.myThumbsticksEnabled[Handedness.LEFT][virtualGamepadAxesID];\r\n if (enabled) {\r\n this._buildThumbstick(leftDiv, Handedness.LEFT, virtualGamepadAxesID);\r\n }\r\n }\r\n\r\n if (this._myParams.myThumbsticksEnabled[Handedness.RIGHT][virtualGamepadAxesID] != null) {\r\n let enabled = this._myParams.myThumbsticksEnabled[Handedness.RIGHT][virtualGamepadAxesID];\r\n if (enabled) {\r\n this._buildThumbstick(rightDiv, Handedness.RIGHT, virtualGamepadAxesID);\r\n }\r\n }\r\n }\r\n }\r\n\r\n _setupDocumentBody() {\r\n document.body.style.overflow = \"hidden\";\r\n document.body.style.userSelect = \"none\";\r\n document.body.style.webkitUserSelect = \"none\";\r\n document.body.style.webkitTapHighlightColor = \"transparent\";\r\n document.body.style.touchAction = \"none\";\r\n\r\n this._myGestureStartEventListener = function (e) {\r\n e.preventDefault();\r\n };\r\n document.addEventListener(\"gesturestart\", this._myGestureStartEventListener);\r\n }\r\n\r\n _buildButton(buttonElementParent, virtualButtonHandedness, virtualGamepadButtonID) {\r\n let virtualGamepadVirtualButton = new VirtualGamepadVirtualButton(buttonElementParent, this._myParams, virtualButtonHandedness, virtualGamepadButtonID);\r\n this._myVirtualGamepadVirtualButtons[virtualButtonHandedness][virtualGamepadButtonID] = virtualGamepadVirtualButton;\r\n }\r\n\r\n _buildThumbstick(thumbstickElementParent, virtualThumbstickHandedness, virtualGamepadAxesID) {\r\n let virtualGamepadVirtualThumbstick = new VirtualGamepadVirtualThumbstick(thumbstickElementParent, this._myParams, virtualThumbstickHandedness, virtualGamepadAxesID);\r\n this._myVirtualGamepadVirtualThumbsticks[virtualThumbstickHandedness][virtualGamepadAxesID] = virtualGamepadVirtualThumbstick;\r\n }\r\n\r\n _createSizeValue(value, minSizeMultiplier) {\r\n return \"min(\" + value.toFixed(3) + \"vmax,\" + (value * minSizeMultiplier).toFixed(3) + \"vw)\";\r\n }\r\n\r\n _isAnyElementPressed() {\r\n let anyElementPressed = false;\r\n\r\n for (let handedness in this._myVirtualGamepadVirtualButtons) {\r\n for (let virtualGamepadButtonID in this._myVirtualGamepadVirtualButtons[handedness]) {\r\n let button = this._myVirtualGamepadVirtualButtons[handedness][virtualGamepadButtonID];\r\n if (button != null && button.isPressed()) {\r\n anyElementPressed = true;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if (!anyElementPressed) {\r\n for (let handedness in this._myVirtualGamepadVirtualThumbsticks) {\r\n for (let virtualGamepadAxesID in this._myVirtualGamepadVirtualThumbsticks[handedness]) {\r\n let thumbstick = this._myVirtualGamepadVirtualThumbsticks[handedness][virtualGamepadAxesID];\r\n if (thumbstick != null && thumbstick.isPressed()) {\r\n anyElementPressed = true;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n return anyElementPressed;\r\n }\r\n\r\n _setMouseHoverEnabled(hoverActive) {\r\n for (let handedness in this._myVirtualGamepadVirtualButtons) {\r\n for (let virtualGamepadButtonID in this._myVirtualGamepadVirtualButtons[handedness]) {\r\n let button = this._myVirtualGamepadVirtualButtons[handedness][virtualGamepadButtonID];\r\n if (button != null) {\r\n button.setMouseHoverEnabled(hoverActive);\r\n }\r\n }\r\n }\r\n\r\n for (let handedness in this._myVirtualGamepadVirtualThumbsticks) {\r\n for (let virtualGamepadAxesID in this._myVirtualGamepadVirtualThumbsticks[handedness]) {\r\n let thumbstick = this._myVirtualGamepadVirtualThumbsticks[handedness][virtualGamepadAxesID];\r\n if (thumbstick != null) {\r\n thumbstick.setMouseHoverEnabled(hoverActive);\r\n }\r\n }\r\n }\r\n }\r\n\r\n destroy() {\r\n this._myDestroyed = true;\r\n\r\n this.setVisible(false);\r\n\r\n for (let handedness in this._myVirtualGamepadVirtualButtons) {\r\n for (let virtualGamepadButtonID in this._myVirtualGamepadVirtualButtons[handedness]) {\r\n let button = this._myVirtualGamepadVirtualButtons[handedness][virtualGamepadButtonID];\r\n if (button != null) {\r\n button.destroy();\r\n }\r\n }\r\n }\r\n\r\n for (let handedness in this._myVirtualGamepadVirtualThumbsticks) {\r\n for (let virtualGamepadAxesID in this._myVirtualGamepadVirtualThumbsticks[handedness]) {\r\n let thumbstick = this._myVirtualGamepadVirtualThumbsticks[handedness][virtualGamepadAxesID];\r\n if (thumbstick != null) {\r\n thumbstick.destroy();\r\n }\r\n }\r\n }\r\n }\r\n\r\n isDestroyed() {\r\n return this._myDestroyed;\r\n }\r\n}", "import { GamepadRawAxesData, GamepadRawButtonData } from \"../gamepad.js\";\r\nimport { GamepadAxesID, GamepadButtonID } from \"../gamepad_buttons.js\";\r\nimport { VirtualGamepadAxesID, VirtualGamepadButtonID } from \"../virtual_gamepad/virtual_gamepad.js\";\r\nimport { GamepadCore } from \"./gamepad_core.js\";\r\n\r\nexport class VirtualGamepadGamepadCore extends GamepadCore {\r\n\r\n constructor(virtualGamepad, handPose, gamepadToVirtualGamepadButtonIDMap = null, gamepadToVirtualGamepadAxesIDMap = null) {\r\n super(handPose);\r\n\r\n this.myGamepadToVirtualGamepadButtonIDMap = new Map();\r\n if (gamepadToVirtualGamepadButtonIDMap == null) {\r\n this.myGamepadToVirtualGamepadButtonIDMap.set(GamepadButtonID.SQUEEZE, [this.getHandedness(), VirtualGamepadButtonID.FIRST_BUTTON]);\r\n this.myGamepadToVirtualGamepadButtonIDMap.set(GamepadButtonID.SELECT, [this.getHandedness(), VirtualGamepadButtonID.SECOND_BUTTON]);\r\n this.myGamepadToVirtualGamepadButtonIDMap.set(GamepadButtonID.TOP_BUTTON, [this.getHandedness(), VirtualGamepadButtonID.THIRD_BUTTON]);\r\n this.myGamepadToVirtualGamepadButtonIDMap.set(GamepadButtonID.BOTTOM_BUTTON, [this.getHandedness(), VirtualGamepadButtonID.FOURTH_BUTTON]);\r\n this.myGamepadToVirtualGamepadButtonIDMap.set(GamepadButtonID.THUMBSTICK, [this.getHandedness(), VirtualGamepadButtonID.FIFTH_BUTTON]);\r\n } else {\r\n this.myGamepadToVirtualGamepadButtonIDMap = gamepadToVirtualGamepadButtonIDMap;\r\n }\r\n\r\n this.myGamepadToVirtualGamepadAxesIDMap = new Map();\r\n if (gamepadToVirtualGamepadAxesIDMap == null) {\r\n this.myGamepadToVirtualGamepadAxesIDMap.set(GamepadAxesID.THUMBSTICK, [this.getHandedness(), VirtualGamepadAxesID.FIRST_AXES]);\r\n } else {\r\n this.myGamepadToVirtualGamepadAxesIDMap = gamepadToVirtualGamepadAxesIDMap;\r\n }\r\n\r\n this._myVirtualGamepad = virtualGamepad;\r\n\r\n // Support Variables\r\n this._myButtonData = new GamepadRawButtonData();\r\n this._myAxesData = new GamepadRawAxesData();\r\n this._myHapticActuators = [];\r\n }\r\n\r\n isGamepadCoreActive() {\r\n return this.isActive() && this._myVirtualGamepad.isVisible();\r\n }\r\n\r\n getButtonData(buttonID) {\r\n this._myButtonData.reset();\r\n\r\n if (this.isGamepadCoreActive()) {\r\n const virtualGamepadButtonInfo = this.myGamepadToVirtualGamepadButtonIDMap.get(buttonID);\r\n if (virtualGamepadButtonInfo != null && this._myVirtualGamepad.isButtonPressed(virtualGamepadButtonInfo[0], virtualGamepadButtonInfo[1])) {\r\n this._myButtonData.myPressed = true;\r\n this._myButtonData.myTouched = true;\r\n this._myButtonData.myValue = 1;\r\n }\r\n }\r\n\r\n return this._myButtonData;\r\n }\r\n\r\n getAxesData(axesID) {\r\n this._myAxesData.reset();\r\n\r\n if (this.isGamepadCoreActive()) {\r\n const virtualGamepadAxesInfo = this.myGamepadToVirtualGamepadAxesIDMap.get(axesID);\r\n if (virtualGamepadAxesInfo != null) {\r\n this._myVirtualGamepad.getAxes(virtualGamepadAxesInfo[0], virtualGamepadAxesInfo[1], this._myAxesData.myAxes);\r\n }\r\n }\r\n\r\n return this._myAxesData;\r\n }\r\n\r\n getHapticActuators() {\r\n return this._myHapticActuators;\r\n }\r\n}", "import { Component, Property } from \"@wonderlandengine/api\";\r\nimport { InputUtils } from \"../../../input/cauldron/input_utils.js\";\r\nimport { Globals } from \"../../../pp/globals.js\";\r\nimport { Handedness } from \"../../cauldron/input_types.js\";\r\nimport { GamepadAxesID, GamepadButtonID } from \"../gamepad_buttons.js\";\r\nimport { VirtualGamepadGamepadCore } from \"../gamepad_cores/virtual_gamepad_gamepad_core.js\";\r\nimport { VirtualGamepad, VirtualGamepadAxesID, VirtualGamepadButtonID } from \"./virtual_gamepad.js\";\r\nimport { VirtualGamepadParams } from \"./virtual_gamepad_params.js\";\r\n\r\nexport class VirtualGamepadComponent extends Component {\r\n static TypeName = \"pp-virtual-gamepad\";\r\n static Properties = {\r\n _myShowOnDesktop: Property.bool(false), // You may have to enable headset too\r\n _myShowOnMobile: Property.bool(true),\r\n _myShowOnHeadset: Property.bool(false), // Not 100% reliable, this is true if the device supports XR and it is Desktop\r\n _myAddToUniversalGamepad: Property.bool(true),\r\n _myOpacity: Property.float(0.5),\r\n _myIconColor: Property.string(\"#e0e0e0\"),\r\n _myBackgroundColor: Property.string(\"#616161\"),\r\n _myInterfaceScale: Property.float(1),\r\n _myMarginScale: Property.float(1),\r\n\r\n ADVANCED_PARAMS_BELOW: Property.string(\"\"),\r\n\r\n _myLabelFontSize: Property.float(2),\r\n _myLabelFontFamily: Property.string(\"sans-serif\"),\r\n _myLabelFontWeight: Property.string(\"bold\"),\r\n _myImagePressedBrightness: Property.float(0.5),\r\n\r\n _myLeftFirstButtonEnabled: Property.bool(true),\r\n _myLeftFirstButtonGamepadButtonID: Property.enum([\"Select\", \"Squeeze\", \"Thumbstick\", \"Top Button\", \"Bottom Button\", \"Left Button\", \"Right Button\", \"Menu\", \"Touchpad\", \"Thumb Rest\"], \"Squeeze\"),\r\n _myLeftFirstButtonGamepadHandedness: Property.enum([\"Left\", \"Right\"], \"Left\"),\r\n _myLeftFirstButtonIconType: Property.enum([\"None\", \"Label\", \"Image\", \"Dot\", \"Circle\", \"Square\", \"Ring\", \"Frame\"], \"Square\"),\r\n _myLeftFirstButtonIconLabelOrImageUrl: Property.string(\"\"),\r\n\r\n _myLeftSecondButtonEnabled: Property.bool(true),\r\n _myLeftSecondButtonGamepadButtonID: Property.enum([\"Select\", \"Squeeze\", \"Thumbstick\", \"Top Button\", \"Bottom Button\", \"Left Button\", \"Right Button\", \"Menu\", \"Touchpad\", \"Thumb Rest\"], \"Select\"),\r\n _myLeftSecondButtonGamepadHandedness: Property.enum([\"Left\", \"Right\"], \"Left\"),\r\n _myLeftSecondButtonIconType: Property.enum([\"None\", \"Label\", \"Image\", \"Dot\", \"Circle\", \"Square\", \"Ring\", \"Frame\"], \"Frame\"),\r\n _myLeftSecondButtonIconLabelOrImageUrl: Property.string(\"\"),\r\n\r\n _myLeftThirdButtonEnabled: Property.bool(true),\r\n _myLeftThirdButtonGamepadButtonID: Property.enum([\"Select\", \"Squeeze\", \"Thumbstick\", \"Top Button\", \"Bottom Button\", \"Left Button\", \"Right Button\", \"Menu\", \"Touchpad\", \"Thumb Rest\"], \"Top Button\"),\r\n _myLeftThirdButtonGamepadHandedness: Property.enum([\"Left\", \"Right\"], \"Left\"),\r\n _myLeftThirdButtonIconType: Property.enum([\"None\", \"Label\", \"Image\", \"Dot\", \"Circle\", \"Square\", \"Ring\", \"Frame\"], \"Circle\"),\r\n _myLeftThirdButtonIconLabelOrImageUrl: Property.string(\"\"),\r\n\r\n _myLeftFourthButtonEnabled: Property.bool(true),\r\n _myLeftFourthButtonGamepadButtonID: Property.enum([\"Select\", \"Squeeze\", \"Thumbstick\", \"Top Button\", \"Bottom Button\", \"Left Button\", \"Right Button\", \"Menu\", \"Touchpad\", \"Thumb Rest\"], \"Bottom Button\"),\r\n _myLeftFourthButtonGamepadHandedness: Property.enum([\"Left\", \"Right\"], \"Left\"),\r\n _myLeftFourthButtonIconType: Property.enum([\"None\", \"Label\", \"Image\", \"Dot\", \"Circle\", \"Square\", \"Ring\", \"Frame\"], \"Ring\"),\r\n _myLeftFourthButtonIconLabelOrImageUrl: Property.string(\"\"),\r\n\r\n _myLeftFifthButtonEnabled: Property.bool(true),\r\n _myLeftFifthButtonGamepadButtonID: Property.enum([\"Select\", \"Squeeze\", \"Thumbstick\", \"Top Button\", \"Bottom Button\", \"Left Button\", \"Right Button\", \"Menu\", \"Touchpad\", \"Thumb Rest\"], \"Thumbstick\"),\r\n _myLeftFifthButtonGamepadHandedness: Property.enum([\"Left\", \"Right\"], \"Left\"),\r\n _myLeftFifthButtonIconType: Property.enum([\"None\", \"Label\", \"Image\", \"Dot\", \"Circle\", \"Square\", \"Ring\", \"Frame\"], \"Dot\"),\r\n _myLeftFifthButtonIconLabelOrImageUrl: Property.string(\"\"),\r\n\r\n _myLeftThumbstickEnabled: Property.bool(true),\r\n _myLeftThumbstickGamepadHandedness: Property.enum([\"Left\", \"Right\"], \"Left\"),\r\n\r\n _myRightFirstButtonEnabled: Property.bool(true),\r\n _myRightFirstButtonGamepadButtonID: Property.enum([\"Select\", \"Squeeze\", \"Thumbstick\", \"Top Button\", \"Bottom Button\", \"Left Button\", \"Right Button\", \"Menu\", \"Touchpad\", \"Thumb Rest\"], \"Squeeze\"),\r\n _myRightFirstButtonGamepadHandedness: Property.enum([\"Left\", \"Right\"], \"Right\"),\r\n _myRightFirstButtonIconType: Property.enum([\"None\", \"Label\", \"Image\", \"Dot\", \"Circle\", \"Square\", \"Ring\", \"Frame\"], \"Square\"),\r\n _myRightFirstButtonIconLabelOrImageUrl: Property.string(\"\"),\r\n\r\n _myRightSecondButtonEnabled: Property.bool(true),\r\n _myRightSecondButtonGamepadButtonID: Property.enum([\"Select\", \"Squeeze\", \"Thumbstick\", \"Top Button\", \"Bottom Button\", \"Left Button\", \"Right Button\", \"Menu\", \"Touchpad\", \"Thumb Rest\"], \"Select\"),\r\n _myRightSecondButtonGamepadHandedness: Property.enum([\"Left\", \"Right\"], \"Right\"),\r\n _myRightSecondButtonIconType: Property.enum([\"None\", \"Label\", \"Image\", \"Dot\", \"Circle\", \"Square\", \"Ring\", \"Frame\"], \"Frame\"),\r\n _myRightSecondButtonIconLabelOrImageUrl: Property.string(\"\"),\r\n\r\n _myRightThirdButtonEnabled: Property.bool(true),\r\n _myRightThirdButtonGamepadButtonID: Property.enum([\"Select\", \"Squeeze\", \"Thumbstick\", \"Top Button\", \"Bottom Button\", \"Left Button\", \"Right Button\", \"Menu\", \"Touchpad\", \"Thumb Rest\"], \"Top Button\"),\r\n _myRightThirdButtonGamepadHandedness: Property.enum([\"Left\", \"Right\"], \"Right\"),\r\n _myRightThirdButtonIconType: Property.enum([\"None\", \"Label\", \"Image\", \"Dot\", \"Circle\", \"Square\", \"Ring\", \"Frame\"], \"Circle\"),\r\n _myRightThirdButtonIconLabelOrImageUrl: Property.string(\"\"),\r\n\r\n _myRightFourthButtonEnabled: Property.bool(true),\r\n _myRightFourthButtonGamepadButtonID: Property.enum([\"Select\", \"Squeeze\", \"Thumbstick\", \"Top Button\", \"Bottom Button\", \"Left Button\", \"Right Button\", \"Menu\", \"Touchpad\", \"Thumb Rest\"], \"Bottom Button\"),\r\n _myRightFourthButtonGamepadHandedness: Property.enum([\"Left\", \"Right\"], \"Right\"),\r\n _myRightFourthButtonIconType: Property.enum([\"None\", \"Label\", \"Image\", \"Dot\", \"Circle\", \"Square\", \"Ring\", \"Frame\"], \"Ring\"),\r\n _myRightFourthButtonIconLabelOrImageUrl: Property.string(\"\"),\r\n\r\n _myRightFifthButtonEnabled: Property.bool(true),\r\n _myRightFifthButtonGamepadButtonID: Property.enum([\"Select\", \"Squeeze\", \"Thumbstick\", \"Top Button\", \"Bottom Button\", \"Left Button\", \"Right Button\", \"Menu\", \"Touchpad\", \"Thumb Rest\"], \"Thumbstick\"),\r\n _myRightFifthButtonGamepadHandedness: Property.enum([\"Left\", \"Right\"], \"Right\"),\r\n _myRightFifthButtonIconType: Property.enum([\"None\", \"Label\", \"Image\", \"Dot\", \"Circle\", \"Square\", \"Ring\", \"Frame\"], \"Dot\"),\r\n _myRightFifthButtonIconLabelOrImageUrl: Property.string(\"\"),\r\n\r\n _myRightThumbstickEnabled: Property.bool(true),\r\n _myRightThumbstickGamepadHandedness: Property.enum([\"Left\", \"Right\"], \"Right\")\r\n };\r\n\r\n start() {\r\n let params = new VirtualGamepadParams(this.engine);\r\n params.defaultConfig();\r\n\r\n for (let handedness in params.myButtonParams) {\r\n for (let gamepadButtonID in params.myButtonParams[handedness]) {\r\n let buttonParams = params.myButtonParams[handedness][gamepadButtonID];\r\n buttonParams.myIconParams.myBackgroundColor = this._myBackgroundColor;\r\n buttonParams.myIconParams.myBackgroundPressedColor = this._myIconColor;\r\n buttonParams.myIconParams.myIconColor = this._myIconColor;\r\n buttonParams.myIconParams.myIconPressedColor = this._myBackgroundColor;\r\n }\r\n }\r\n\r\n for (let handedness in params.myThumbstickParams) {\r\n for (let gamepadAxesID in params.myThumbstickParams[handedness]) {\r\n let thumbstickParams = params.myThumbstickParams[handedness][gamepadAxesID];\r\n thumbstickParams.myBackgroundColor = this._myBackgroundColor;\r\n thumbstickParams.myIconParams.myBackgroundColor = this._myIconColor;\r\n thumbstickParams.myIconParams.myBackgroundPressedColor = this._myIconColor;\r\n thumbstickParams.myIconParams.myIconColor = this._myBackgroundColor;\r\n thumbstickParams.myIconParams.myIconPressedColor = this._myBackgroundColor;\r\n }\r\n }\r\n\r\n params.myOpacity = this._myOpacity;\r\n\r\n params.myInterfaceScale = this._myInterfaceScale;\r\n params.myMarginScale = this._myMarginScale;\r\n\r\n params.myShowOnDesktop = this._myShowOnDesktop;\r\n params.myShowOnMobile = this._myShowOnMobile;\r\n params.myShowOnHeadset = this._myShowOnHeadset;\r\n\r\n if (params.myShowOnDesktop || params.myShowOnMobile || params.myShowOnHeadset) {\r\n params.myAutoUpdateVisibility = true;\r\n } else {\r\n params.myAutoUpdateVisibility = false;\r\n }\r\n\r\n this._advancedConfig(params);\r\n\r\n this._myVirtualGamepad = new VirtualGamepad(params);\r\n this._myVirtualGamepad.setVisible(false);\r\n\r\n this._myVirtualGamepad.start();\r\n\r\n this._myFirstUpdate = true;\r\n\r\n this._myLeftVirtualGamepadGamepadCore = null;\r\n this._myRightVirtualGamepadGamepadCore = null;\r\n\r\n this._myActivateOnNextUpdate = false;\r\n }\r\n\r\n update(dt) {\r\n if (this._myActivateOnNextUpdate) {\r\n this._onActivate();\r\n\r\n this._myActivateOnNextUpdate = false;\r\n }\r\n\r\n if (this._myFirstUpdate) {\r\n this._myFirstUpdate = false;\r\n\r\n if (this._myAddToUniversalGamepad) {\r\n this._addToUniversalGamepad();\r\n }\r\n }\r\n\r\n this._myVirtualGamepad.update(dt);\r\n }\r\n\r\n _advancedConfig(params) {\r\n {\r\n let buttonParams = params.myButtonParams[Handedness.LEFT][VirtualGamepadButtonID.SECOND_BUTTON];\r\n buttonParams.myIconParams.myIconType = this._myLeftSecondButtonIconType;\r\n buttonParams.myIconParams.myLabel = this._myLeftSecondButtonIconLabelOrImageUrl;\r\n buttonParams.myIconParams.myImageURL = this._myLeftSecondButtonIconLabelOrImageUrl;\r\n buttonParams.myIconParams.myLabelFontSize = this._myLabelFontSize;\r\n buttonParams.myIconParams.myLabelFontFamily = this._myLabelFontFamily;\r\n buttonParams.myIconParams.myLabelFontWeight = this._myLabelFontWeight;\r\n buttonParams.myIconParams.myImagePressedBrightness = this._myImagePressedBrightness;\r\n\r\n params.myButtonsEnabled[Handedness.LEFT][VirtualGamepadButtonID.SECOND_BUTTON] = this._myLeftSecondButtonEnabled;\r\n }\r\n\r\n {\r\n let buttonParams = params.myButtonParams[Handedness.LEFT][VirtualGamepadButtonID.FIRST_BUTTON];\r\n buttonParams.myIconParams.myIconType = this._myLeftFirstButtonIconType;\r\n buttonParams.myIconParams.myLabel = this._myLeftFirstButtonIconLabelOrImageUrl;\r\n buttonParams.myIconParams.myImageURL = this._myLeftFirstButtonIconLabelOrImageUrl;\r\n buttonParams.myIconParams.myLabelFontSize = this._myLabelFontSize;\r\n buttonParams.myIconParams.myLabelFontFamily = this._myLabelFontFamily;\r\n buttonParams.myIconParams.myLabelFontWeight = this._myLabelFontWeight;\r\n buttonParams.myIconParams.myImagePressedBrightness = this._myImagePressedBrightness;\r\n\r\n params.myButtonsEnabled[Handedness.LEFT][VirtualGamepadButtonID.FIRST_BUTTON] = this._myLeftFirstButtonEnabled;\r\n }\r\n\r\n {\r\n let buttonParams = params.myButtonParams[Handedness.LEFT][VirtualGamepadButtonID.FIFTH_BUTTON];\r\n buttonParams.myIconParams.myIconType = this._myLeftFifthButtonIconType;\r\n buttonParams.myIconParams.myLabel = this._myLeftFifthButtonIconLabelOrImageUrl;\r\n buttonParams.myIconParams.myImageURL = this._myLeftFifthButtonIconLabelOrImageUrl;\r\n buttonParams.myIconParams.myLabelFontSize = this._myLabelFontSize;\r\n buttonParams.myIconParams.myLabelFontFamily = this._myLabelFontFamily;\r\n buttonParams.myIconParams.myLabelFontWeight = this._myLabelFontWeight;\r\n buttonParams.myIconParams.myImagePressedBrightness = this._myImagePressedBrightness;\r\n\r\n params.myButtonsEnabled[Handedness.LEFT][VirtualGamepadButtonID.FIFTH_BUTTON] = this._myLeftFifthButtonEnabled;\r\n }\r\n\r\n {\r\n let buttonParams = params.myButtonParams[Handedness.LEFT][VirtualGamepadButtonID.THIRD_BUTTON];\r\n buttonParams.myIconParams.myIconType = this._myLeftThirdButtonIconType;\r\n buttonParams.myIconParams.myLabel = this._myLeftThirdButtonIconLabelOrImageUrl;\r\n buttonParams.myIconParams.myImageURL = this._myLeftThirdButtonIconLabelOrImageUrl;\r\n buttonParams.myIconParams.myLabelFontSize = this._myLabelFontSize;\r\n buttonParams.myIconParams.myLabelFontFamily = this._myLabelFontFamily;\r\n buttonParams.myIconParams.myLabelFontWeight = this._myLabelFontWeight;\r\n buttonParams.myIconParams.myImagePressedBrightness = this._myImagePressedBrightness;\r\n\r\n params.myButtonsEnabled[Handedness.LEFT][VirtualGamepadButtonID.THIRD_BUTTON] = this._myLeftThirdButtonEnabled;\r\n }\r\n\r\n {\r\n let buttonParams = params.myButtonParams[Handedness.LEFT][VirtualGamepadButtonID.FOURTH_BUTTON];\r\n buttonParams.myIconParams.myIconType = this._myLeftFourthButtonIconType;\r\n buttonParams.myIconParams.myLabel = this._myLeftFourthButtonIconLabelOrImageUrl;\r\n buttonParams.myIconParams.myImageURL = this._myLeftFourthButtonIconLabelOrImageUrl;\r\n buttonParams.myIconParams.myLabelFontSize = this._myLabelFontSize;\r\n buttonParams.myIconParams.myLabelFontFamily = this._myLabelFontFamily;\r\n buttonParams.myIconParams.myLabelFontWeight = this._myLabelFontWeight;\r\n buttonParams.myIconParams.myImagePressedBrightness = this._myImagePressedBrightness;\r\n\r\n params.myButtonsEnabled[Handedness.LEFT][VirtualGamepadButtonID.FOURTH_BUTTON] = this._myLeftFourthButtonEnabled;\r\n }\r\n\r\n {\r\n let buttonParams = params.myButtonParams[Handedness.RIGHT][VirtualGamepadButtonID.SECOND_BUTTON];\r\n buttonParams.myIconParams.myIconType = this._myRightSecondButtonIconType;\r\n buttonParams.myIconParams.myLabel = this._myRightSecondButtonIconLabelOrImageUrl;\r\n buttonParams.myIconParams.myImageURL = this._myRightSecondButtonIconLabelOrImageUrl;\r\n buttonParams.myIconParams.myLabelFontSize = this._myLabelFontSize;\r\n buttonParams.myIconParams.myLabelFontFamily = this._myLabelFontFamily;\r\n buttonParams.myIconParams.myLabelFontWeight = this._myLabelFontWeight;\r\n buttonParams.myIconParams.myImagePressedBrightness = this._myImagePressedBrightness;\r\n\r\n params.myButtonsEnabled[Handedness.RIGHT][VirtualGamepadButtonID.SECOND_BUTTON] = this._myRightSecondButtonEnabled;\r\n }\r\n\r\n {\r\n let buttonParams = params.myButtonParams[Handedness.RIGHT][VirtualGamepadButtonID.FIRST_BUTTON];\r\n buttonParams.myIconParams.myIconType = this._myRightFirstButtonIconType;\r\n buttonParams.myIconParams.myLabel = this._myRightFirstButtonIconLabelOrImageUrl;\r\n buttonParams.myIconParams.myImageURL = this._myRightFirstButtonIconLabelOrImageUrl;\r\n buttonParams.myIconParams.myLabelFontSize = this._myLabelFontSize;\r\n buttonParams.myIconParams.myLabelFontFamily = this._myLabelFontFamily;\r\n buttonParams.myIconParams.myLabelFontWeight = this._myLabelFontWeight;\r\n buttonParams.myIconParams.myImagePressedBrightness = this._myImagePressedBrightness;\r\n\r\n params.myButtonsEnabled[Handedness.RIGHT][VirtualGamepadButtonID.FIRST_BUTTON] = this._myRightFirstButtonEnabled;\r\n }\r\n\r\n {\r\n let buttonParams = params.myButtonParams[Handedness.RIGHT][VirtualGamepadButtonID.FIFTH_BUTTON];\r\n buttonParams.myIconParams.myIconType = this._myRightFifthButtonIconType;\r\n buttonParams.myIconParams.myLabel = this._myRightFifthButtonIconLabelOrImageUrl;\r\n buttonParams.myIconParams.myImageURL = this._myRightFifthButtonIconLabelOrImageUrl;\r\n buttonParams.myIconParams.myLabelFontSize = this._myLabelFontSize;\r\n buttonParams.myIconParams.myLabelFontFamily = this._myLabelFontFamily;\r\n buttonParams.myIconParams.myLabelFontWeight = this._myLabelFontWeight;\r\n buttonParams.myIconParams.myImagePressedBrightness = this._myImagePressedBrightness;\r\n\r\n params.myButtonsEnabled[Handedness.RIGHT][VirtualGamepadButtonID.FIFTH_BUTTON] = this._myRightFifthButtonEnabled;\r\n }\r\n\r\n {\r\n let buttonParams = params.myButtonParams[Handedness.RIGHT][VirtualGamepadButtonID.THIRD_BUTTON];\r\n buttonParams.myIconParams.myIconType = this._myRightThirdButtonIconType;\r\n buttonParams.myIconParams.myLabel = this._myRightThirdButtonIconLabelOrImageUrl;\r\n buttonParams.myIconParams.myImageURL = this._myRightThirdButtonIconLabelOrImageUrl;\r\n buttonParams.myIconParams.myLabelFontSize = this._myLabelFontSize;\r\n buttonParams.myIconParams.myLabelFontFamily = this._myLabelFontFamily;\r\n buttonParams.myIconParams.myLabelFontWeight = this._myLabelFontWeight;\r\n buttonParams.myIconParams.myImagePressedBrightness = this._myImagePressedBrightness;\r\n\r\n params.myButtonsEnabled[Handedness.RIGHT][VirtualGamepadButtonID.THIRD_BUTTON] = this._myRightThirdButtonEnabled;\r\n }\r\n\r\n {\r\n let buttonParams = params.myButtonParams[Handedness.RIGHT][VirtualGamepadButtonID.FOURTH_BUTTON];\r\n buttonParams.myIconParams.myIconType = this._myRightFourthButtonIconType;\r\n buttonParams.myIconParams.myLabel = this._myRightFourthButtonIconLabelOrImageUrl;\r\n buttonParams.myIconParams.myImageURL = this._myRightFourthButtonIconLabelOrImageUrl;\r\n buttonParams.myIconParams.myLabelFontSize = this._myLabelFontSize;\r\n buttonParams.myIconParams.myLabelFontFamily = this._myLabelFontFamily;\r\n buttonParams.myIconParams.myLabelFontWeight = this._myLabelFontWeight;\r\n buttonParams.myIconParams.myImagePressedBrightness = this._myImagePressedBrightness;\r\n\r\n params.myButtonsEnabled[Handedness.RIGHT][VirtualGamepadButtonID.FOURTH_BUTTON] = this._myRightFourthButtonEnabled;\r\n }\r\n\r\n params.myThumbsticksEnabled[Handedness.LEFT][VirtualGamepadAxesID.FIRST_AXES] = this._myLeftThumbstickEnabled;\r\n params.myThumbsticksEnabled[Handedness.RIGHT][VirtualGamepadAxesID.FIRST_AXES] = this._myRightThumbstickEnabled;\r\n }\r\n\r\n _addToUniversalGamepad() {\r\n const leftGamepadToVirtualGamepadButtonIDMap = new Map();\r\n const rightGamepadToVirtualGamepadButtonIDMap = new Map();\r\n\r\n if (this._myLeftFirstButtonEnabled) {\r\n if (InputUtils.getHandednessByIndex(this._myLeftFirstButtonGamepadHandedness) == Handedness.LEFT) {\r\n leftGamepadToVirtualGamepadButtonIDMap.set(this._gamepadPropertyButtonIDToEnum(this._myLeftFirstButtonGamepadButtonID), [Handedness.LEFT, VirtualGamepadButtonID.FIRST_BUTTON]);\r\n } else {\r\n rightGamepadToVirtualGamepadButtonIDMap.set(this._gamepadPropertyButtonIDToEnum(this._myLeftFirstButtonGamepadButtonID), [Handedness.LEFT, VirtualGamepadButtonID.FIRST_BUTTON]);\r\n }\r\n }\r\n\r\n if (this._myLeftSecondButtonEnabled) {\r\n if (InputUtils.getHandednessByIndex(this._myLeftSecondButtonGamepadHandedness) == Handedness.LEFT) {\r\n leftGamepadToVirtualGamepadButtonIDMap.set(this._gamepadPropertyButtonIDToEnum(this._myLeftSecondButtonGamepadButtonID), [Handedness.LEFT, VirtualGamepadButtonID.SECOND_BUTTON]);\r\n } else {\r\n rightGamepadToVirtualGamepadButtonIDMap.set(this._gamepadPropertyButtonIDToEnum(this._myLeftSecondButtonGamepadButtonID), [Handedness.LEFT, VirtualGamepadButtonID.SECOND_BUTTON]);\r\n }\r\n }\r\n\r\n if (this._myLeftThirdButtonEnabled) {\r\n if (InputUtils.getHandednessByIndex(this._myLeftThirdButtonGamepadHandedness) == Handedness.LEFT) {\r\n leftGamepadToVirtualGamepadButtonIDMap.set(this._gamepadPropertyButtonIDToEnum(this._myLeftThirdButtonGamepadButtonID), [Handedness.LEFT, VirtualGamepadButtonID.THIRD_BUTTON]);\r\n } else {\r\n rightGamepadToVirtualGamepadButtonIDMap.set(this._gamepadPropertyButtonIDToEnum(this._myLeftThirdButtonGamepadButtonID), [Handedness.LEFT, VirtualGamepadButtonID.THIRD_BUTTON]);\r\n }\r\n }\r\n\r\n if (this._myLeftFourthButtonEnabled) {\r\n if (InputUtils.getHandednessByIndex(this._myLeftFourthButtonGamepadHandedness) == Handedness.LEFT) {\r\n leftGamepadToVirtualGamepadButtonIDMap.set(this._gamepadPropertyButtonIDToEnum(this._myLeftFourthButtonGamepadButtonID), [Handedness.LEFT, VirtualGamepadButtonID.FOURTH_BUTTON]);\r\n } else {\r\n rightGamepadToVirtualGamepadButtonIDMap.set(this._gamepadPropertyButtonIDToEnum(this._myLeftFourthButtonGamepadButtonID), [Handedness.LEFT, VirtualGamepadButtonID.FOURTH_BUTTON]);\r\n }\r\n }\r\n\r\n if (this._myLeftFifthButtonEnabled) {\r\n if (InputUtils.getHandednessByIndex(this._myLeftFifthButtonGamepadHandedness) == Handedness.LEFT) {\r\n leftGamepadToVirtualGamepadButtonIDMap.set(this._gamepadPropertyButtonIDToEnum(this._myLeftFifthButtonGamepadButtonID), [Handedness.LEFT, VirtualGamepadButtonID.FIFTH_BUTTON]);\r\n } else {\r\n rightGamepadToVirtualGamepadButtonIDMap.set(this._gamepadPropertyButtonIDToEnum(this._myLeftFifthButtonGamepadButtonID), [Handedness.LEFT, VirtualGamepadButtonID.FIFTH_BUTTON]);\r\n }\r\n }\r\n\r\n if (this._myRightFirstButtonEnabled) {\r\n if (InputUtils.getHandednessByIndex(this._myRightFirstButtonGamepadHandedness) == Handedness.LEFT) {\r\n leftGamepadToVirtualGamepadButtonIDMap.set(this._gamepadPropertyButtonIDToEnum(this._myRightFirstButtonGamepadButtonID), [Handedness.RIGHT, VirtualGamepadButtonID.FIRST_BUTTON]);\r\n } else {\r\n rightGamepadToVirtualGamepadButtonIDMap.set(this._gamepadPropertyButtonIDToEnum(this._myRightFirstButtonGamepadButtonID), [Handedness.RIGHT, VirtualGamepadButtonID.FIRST_BUTTON]);\r\n }\r\n }\r\n\r\n if (this._myRightSecondButtonEnabled) {\r\n if (InputUtils.getHandednessByIndex(this._myRightSecondButtonGamepadHandedness) == Handedness.LEFT) {\r\n leftGamepadToVirtualGamepadButtonIDMap.set(this._gamepadPropertyButtonIDToEnum(this._myRightSecondButtonGamepadButtonID), [Handedness.RIGHT, VirtualGamepadButtonID.SECOND_BUTTON]);\r\n } else {\r\n rightGamepadToVirtualGamepadButtonIDMap.set(this._gamepadPropertyButtonIDToEnum(this._myRightSecondButtonGamepadButtonID), [Handedness.RIGHT, VirtualGamepadButtonID.SECOND_BUTTON]);\r\n }\r\n }\r\n\r\n if (this._myRightThirdButtonEnabled) {\r\n if (InputUtils.getHandednessByIndex(this._myRightThirdButtonGamepadHandedness) == Handedness.LEFT) {\r\n leftGamepadToVirtualGamepadButtonIDMap.set(this._gamepadPropertyButtonIDToEnum(this._myRightThirdButtonGamepadButtonID), [Handedness.RIGHT, VirtualGamepadButtonID.THIRD_BUTTON]);\r\n } else {\r\n rightGamepadToVirtualGamepadButtonIDMap.set(this._gamepadPropertyButtonIDToEnum(this._myRightThirdButtonGamepadButtonID), [Handedness.RIGHT, VirtualGamepadButtonID.THIRD_BUTTON]);\r\n }\r\n }\r\n\r\n if (this._myRightFourthButtonEnabled) {\r\n if (InputUtils.getHandednessByIndex(this._myRightFourthButtonGamepadHandedness) == Handedness.LEFT) {\r\n leftGamepadToVirtualGamepadButtonIDMap.set(this._gamepadPropertyButtonIDToEnum(this._myRightFourthButtonGamepadButtonID), [Handedness.RIGHT, VirtualGamepadButtonID.FOURTH_BUTTON]);\r\n } else {\r\n rightGamepadToVirtualGamepadButtonIDMap.set(this._gamepadPropertyButtonIDToEnum(this._myRightFourthButtonGamepadButtonID), [Handedness.RIGHT, VirtualGamepadButtonID.FOURTH_BUTTON]);\r\n }\r\n }\r\n\r\n if (this._myRightFifthButtonEnabled) {\r\n if (InputUtils.getHandednessByIndex(this._myRightFifthButtonGamepadHandedness) == Handedness.LEFT) {\r\n leftGamepadToVirtualGamepadButtonIDMap.set(this._gamepadPropertyButtonIDToEnum(this._myRightFifthButtonGamepadButtonID), [Handedness.RIGHT, VirtualGamepadButtonID.FIFTH_BUTTON]);\r\n } else {\r\n rightGamepadToVirtualGamepadButtonIDMap.set(this._gamepadPropertyButtonIDToEnum(this._myRightFifthButtonGamepadButtonID), [Handedness.RIGHT, VirtualGamepadButtonID.FIFTH_BUTTON]);\r\n }\r\n }\r\n\r\n const leftGamepadToVirtualGamepadAxesIDMap = new Map();\r\n const rightGamepadToVirtualGamepadAxesIDMap = new Map();\r\n\r\n if (this._myLeftThumbstickEnabled) {\r\n if (InputUtils.getHandednessByIndex(this._myLeftThumbstickGamepadHandedness) == Handedness.LEFT) {\r\n leftGamepadToVirtualGamepadAxesIDMap.set(GamepadAxesID.THUMBSTICK, [Handedness.LEFT, VirtualGamepadAxesID.FIRST_AXES]);\r\n } else {\r\n rightGamepadToVirtualGamepadAxesIDMap.set(GamepadAxesID.THUMBSTICK, [Handedness.LEFT, VirtualGamepadAxesID.FIRST_AXES]);\r\n }\r\n }\r\n\r\n if (this._myRightThumbstickEnabled) {\r\n if (InputUtils.getHandednessByIndex(this._myRightThumbstickGamepadHandedness) == Handedness.LEFT) {\r\n leftGamepadToVirtualGamepadAxesIDMap.set(GamepadAxesID.THUMBSTICK, [Handedness.RIGHT, VirtualGamepadAxesID.FIRST_AXES]);\r\n } else {\r\n rightGamepadToVirtualGamepadAxesIDMap.set(GamepadAxesID.THUMBSTICK, [Handedness.RIGHT, VirtualGamepadAxesID.FIRST_AXES]);\r\n }\r\n }\r\n\r\n const leftHandPose = Globals.getLeftGamepad(this.engine).getGamepadCore(\"pp_left_xr_gamepad\").getHandPose();\r\n const rightHandPose = Globals.getRightGamepad(this.engine).getGamepadCore(\"pp_right_xr_gamepad\").getHandPose();\r\n this._myLeftVirtualGamepadGamepadCore = new VirtualGamepadGamepadCore(this._myVirtualGamepad, leftHandPose, leftGamepadToVirtualGamepadButtonIDMap, leftGamepadToVirtualGamepadAxesIDMap);\r\n this._myRightVirtualGamepadGamepadCore = new VirtualGamepadGamepadCore(this._myVirtualGamepad, rightHandPose, rightGamepadToVirtualGamepadButtonIDMap, rightGamepadToVirtualGamepadAxesIDMap);\r\n\r\n Globals.getLeftGamepad(this.engine).addGamepadCore(\"pp_left_virtual_gamepad\", this._myLeftVirtualGamepadGamepadCore);\r\n Globals.getRightGamepad(this.engine).addGamepadCore(\"pp_right_virtual_gamepad\", this._myRightVirtualGamepadGamepadCore);\r\n\r\n }\r\n\r\n _gamepadPropertyButtonIDToEnum(propertyButtonID) {\r\n let buttonID = null;\r\n\r\n switch (propertyButtonID) {\r\n case 0:\r\n buttonID = GamepadButtonID.SELECT;\r\n break;\r\n case 1:\r\n buttonID = GamepadButtonID.SQUEEZE;\r\n break;\r\n case 2:\r\n buttonID = GamepadButtonID.THUMBSTICK;\r\n break;\r\n case 3:\r\n buttonID = GamepadButtonID.TOP_BUTTON;\r\n break;\r\n case 4:\r\n buttonID = GamepadButtonID.BOTTOM_BUTTON;\r\n break;\r\n case 5:\r\n buttonID = GamepadButtonID.LEFT_BUTTON;\r\n break;\r\n case 6:\r\n buttonID = GamepadButtonID.RIGHT_BUTTON;\r\n break;\r\n case 7:\r\n buttonID = GamepadButtonID.MENU;\r\n break;\r\n case 8:\r\n buttonID = GamepadButtonID.TOUCHPAD;\r\n break;\r\n case 9:\r\n buttonID = GamepadButtonID.THUMB_REST;\r\n break;\r\n }\r\n\r\n return buttonID;\r\n }\r\n\r\n onActivate() {\r\n this._myActivateOnNextUpdate = true;\r\n }\r\n\r\n _onActivate() {\r\n if (!this._myFirstUpdate && this._myAddToUniversalGamepad) {\r\n Globals.getLeftGamepad(this.engine).addGamepadCore(\"pp_left_virtual_gamepad\", this._myLeftVirtualGamepadGamepadCore);\r\n Globals.getRightGamepad(this.engine).addGamepadCore(\"pp_right_virtual_gamepad\", this._myRightVirtualGamepadGamepadCore);\r\n }\r\n }\r\n\r\n onDeactivate() {\r\n this._myVirtualGamepad?.setVisible(false);\r\n\r\n if (!this._myFirstUpdate && this._myAddToUniversalGamepad) {\r\n // Sadly here, if it can't manage to remove them due to global gamepads being null,\r\n // then if the gamepad is activated again it will still have and use the virtual gamepad cores\r\n // Usually not an issue since this is happens only when the whole scene is deactivated\r\n Globals.getLeftGamepad(this.engine)?.removeGamepadCore(\"pp_left_virtual_gamepad\");\r\n Globals.getRightGamepad(this.engine)?.removeGamepadCore(\"pp_right_virtual_gamepad\");\r\n\r\n this._myLeftVirtualGamepadGamepadCore.setActive(false);\r\n this._myRightVirtualGamepadGamepadCore.setActive(false);\r\n }\r\n }\r\n\r\n onDestroy() {\r\n this._myLeftVirtualGamepadGamepadCore?.destroy();\r\n this._myRightVirtualGamepadGamepadCore?.destroy();\r\n\r\n this._myVirtualGamepad?.destroy();\r\n }\r\n}", "import { Component, Property } from \"@wonderlandengine/api\";\r\nimport { XRUtils } from \"../../../cauldron/utils/xr_utils.js\";\r\nimport { vec3_create } from \"../../../plugin/js/extensions/array/vec_create_extension.js\";\r\n\r\nexport class SetPlayerHeightComponent extends Component {\r\n static TypeName = \"pp-set-player-height\";\r\n static Properties = {\r\n _myEyesHeight: Property.float(1.65),\r\n _mySetOnlyOnStart: Property.bool(false)\r\n };\r\n\r\n start() {\r\n let localPosition = this.object.pp_getPositionLocal();\r\n this.object.pp_setPositionLocal(vec3_create(localPosition[0], this._myEyesHeight, localPosition[2]));\r\n\r\n this._myHeightSetOnce = false;\r\n }\r\n\r\n onActivate() {\r\n XRUtils.registerSessionStartEndEventListeners(this, this._onXRSessionStart.bind(this), this._onXRSessionEnd.bind(this), true, false, this.engine);\r\n }\r\n\r\n onDeactivate() {\r\n XRUtils.unregisterSessionStartEndEventListeners(this, this.engine);\r\n }\r\n\r\n _onXRSessionStart() {\r\n if (this.active && (!this._mySetOnlyOnStart || !this._myHeightSetOnce)) {\r\n let localPosition = this.object.pp_getPositionLocal();\r\n if (XRUtils.isReferenceSpaceFloorBased(this.engine)) {\r\n this.object.pp_setPositionLocal(vec3_create(localPosition[0], 0, localPosition[2]));\r\n } else {\r\n this.object.pp_setPositionLocal(vec3_create(localPosition[0], this._myEyesHeight, localPosition[2]));\r\n }\r\n\r\n this._myHeightSetOnce = true;\r\n }\r\n }\r\n\r\n _onXRSessionEnd() {\r\n if (this.active && !this._mySetOnlyOnStart) {\r\n let localPosition = this.object.pp_getPositionLocal();\r\n this.object.pp_setPositionLocal(vec3_create(localPosition[0], this._myEyesHeight, localPosition[2]));\r\n }\r\n }\r\n}", "import { Component, Property } from \"@wonderlandengine/api\";\r\nimport { XRUtils } from \"../../../cauldron/utils/xr_utils.js\";\r\nimport { quat2_create } from \"../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Globals } from \"../../../pp/globals.js\";\r\nimport { InputUtils } from \"../../cauldron/input_utils.js\";\r\n\r\nexport class SetHandLocalTransformComponent extends Component {\r\n static TypeName = \"pp-set-hand-local-transform\";\r\n static Properties = {\r\n _myHandedness: Property.enum([\"Left\", \"Right\"], \"Left\")\r\n };\r\n\r\n start() {\r\n this._myHandednessType = InputUtils.getHandednessByIndex(this._myHandedness);\r\n\r\n this._myActivateOnNextUpdate = false;\r\n }\r\n\r\n update(dt) {\r\n if (this._myActivateOnNextUpdate) {\r\n this._onActivate();\r\n\r\n this._myActivateOnNextUpdate = false;\r\n }\r\n }\r\n\r\n _onPoseUpdated(dt, pose) {\r\n // Implemented outside class definition\r\n }\r\n\r\n onActivate() {\r\n this._myActivateOnNextUpdate = true;\r\n }\r\n\r\n _onActivate() {\r\n Globals.getHandPose(this._myHandednessType, this.engine).registerPoseUpdatedEventListener(this, this._onPoseUpdated.bind(this));\r\n }\r\n\r\n onDeactivate() {\r\n Globals.getHandPose(this._myHandednessType, this.engine)?.unregisterPoseUpdatedEventListener(this);\r\n }\r\n}\r\n\r\n\r\n\r\n// IMPLEMENTATION\r\n\r\nSetHandLocalTransformComponent.prototype._onPoseUpdated = function () {\r\n let handPoseTransform = quat2_create();\r\n return function _onPoseUpdated(dt, pose) {\r\n if (!this.active || this._myActivateOnNextUpdate) {\r\n this.onDeactivate();\r\n return;\r\n }\r\n\r\n if (XRUtils.isSessionActive(this.engine)) {\r\n if (pose.isValid()) {\r\n this.object.pp_setTransformLocalQuat(pose.getTransformQuat(handPoseTransform, null));\r\n }\r\n }\r\n };\r\n}();", "import { Component, Property } from \"@wonderlandengine/api\";\r\nimport { XRUtils } from \"../../../cauldron/utils/xr_utils.js\";\r\nimport { quat2_create } from \"../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Globals } from \"../../../pp/globals.js\";\r\nimport { InputUtils } from \"../../cauldron/input_utils.js\";\r\n\r\nexport class SetHandRayLocalTransformComponent extends Component {\r\n static TypeName = \"pp-set-hand-ray-local-transform\";\r\n static Properties = {\r\n _myHandedness: Property.enum([\"Left\", \"Right\"], \"Left\")\r\n };\r\n\r\n start() {\r\n this._myHandednessType = InputUtils.getHandednessByIndex(this._myHandedness);\r\n\r\n this._myActivateOnNextUpdate = false;\r\n }\r\n\r\n update(dt) {\r\n if (this._myActivateOnNextUpdate) {\r\n this._onActivate();\r\n\r\n this._myActivateOnNextUpdate = false;\r\n }\r\n }\r\n\r\n _onPoseUpdated(dt, pose) {\r\n // Implemented outside class definition\r\n }\r\n\r\n onActivate() {\r\n this._myActivateOnNextUpdate = true;\r\n }\r\n\r\n _onActivate() {\r\n Globals.getHandRayPose(this._myHandednessType, this.engine).registerPoseUpdatedEventListener(this, this._onPoseUpdated.bind(this));\r\n }\r\n\r\n onDeactivate() {\r\n Globals.getHandRayPose(this._myHandednessType, this.engine)?.unregisterPoseUpdatedEventListener(this);\r\n }\r\n}\r\n\r\n\r\n\r\n// IMPLEMENTATION\r\n\r\nSetHandRayLocalTransformComponent.prototype._onPoseUpdated = function () {\r\n let handPoseTransform = quat2_create();\r\n return function _onPoseUpdated(dt, pose) {\r\n if (!this.active || this._myActivateOnNextUpdate) {\r\n this.onDeactivate();\r\n return;\r\n }\r\n\r\n if (XRUtils.isSessionActive(this.engine)) {\r\n if (pose.isValid()) {\r\n this.object.pp_setTransformLocalQuat(pose.getTransformQuat(handPoseTransform, null));\r\n }\r\n }\r\n };\r\n}();", "import { Component } from \"@wonderlandengine/api\";\r\nimport { XRUtils } from \"../../../cauldron/utils/xr_utils.js\";\r\nimport { quat2_create, quat_create, vec3_create } from \"../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Globals } from \"../../../pp/globals.js\";\r\nimport { BasePose } from \"../base_pose.js\";\r\n\r\nexport class SetHeadLocalTransformComponent extends Component {\r\n public static override TypeName = \"pp-set-head-local-transform\";\r\n\r\n private _myActivateOnNextUpdate: boolean = false;\r\n\r\n public override update(dt: number): void {\r\n if (this._myActivateOnNextUpdate) {\r\n this._onActivate();\r\n\r\n this._myActivateOnNextUpdate = false;\r\n }\r\n }\r\n\r\n private static readonly _onPoseUpdatedSV =\r\n {\r\n cameraNonXRRotation: quat_create(),\r\n cameraNonXRUp: vec3_create(),\r\n cameraNonXRPosition: vec3_create(),\r\n headPoseTransform: quat2_create()\r\n };\r\n private _onPoseUpdated(dt: number, pose: Readonly): void {\r\n if (!this.active || this._myActivateOnNextUpdate) {\r\n this.onDeactivate();\r\n return;\r\n }\r\n\r\n if (!XRUtils.isSessionActive(this.engine)) {\r\n const cameraNonXR = Globals.getPlayerObjects(this.engine)!.myCameraNonXR!;\r\n\r\n const cameraNonXRRotation = SetHeadLocalTransformComponent._onPoseUpdatedSV.cameraNonXRRotation;\r\n cameraNonXR.pp_getRotationLocalQuat(cameraNonXRRotation);\r\n\r\n if (Globals.isPoseForwardFixed(this.engine)) {\r\n const cameraNonXRUp = SetHeadLocalTransformComponent._onPoseUpdatedSV.cameraNonXRUp;\r\n cameraNonXRRotation.quat_rotateAxisRadians(Math.PI, cameraNonXRRotation.quat_getUp(cameraNonXRUp), cameraNonXRRotation);\r\n }\r\n\r\n const cameraNonXRPosition = SetHeadLocalTransformComponent._onPoseUpdatedSV.cameraNonXRPosition;\r\n this.object.pp_setPositionLocal(cameraNonXR.pp_getPositionLocal(cameraNonXRPosition));\r\n this.object.pp_setRotationLocalQuat(cameraNonXRRotation);\r\n } else {\r\n if (pose.isValid()) {\r\n const headPoseTransform = SetHeadLocalTransformComponent._onPoseUpdatedSV.headPoseTransform;\r\n this.object.pp_setTransformLocalQuat(pose.getTransformQuat(headPoseTransform, null));\r\n }\r\n }\r\n }\r\n\r\n public override onActivate(): void {\r\n this._myActivateOnNextUpdate = true;\r\n }\r\n\r\n private _onActivate(): void {\r\n Globals.getHeadPose(this.engine)!.registerPoseUpdatedEventListener(this, this._onPoseUpdated.bind(this));\r\n }\r\n\r\n public override onDeactivate(): void {\r\n Globals.getHeadPose(this.engine)?.unregisterPoseUpdatedEventListener(this);\r\n }\r\n}", "import { Component, Property } from \"@wonderlandengine/api\";\r\nimport { XRUtils } from \"../../../cauldron/utils/xr_utils.js\";\r\nimport { quat2_create } from \"../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Globals } from \"../../../pp/globals.js\";\r\nimport { InputUtils } from \"../../cauldron/input_utils.js\";\r\n\r\nexport class SetTrackedHandJointLocalTransformComponent extends Component {\r\n static TypeName = \"pp-set-tracked-hand-joint-local-transform\";\r\n static Properties = {\r\n _myHandedness: Property.enum([\"Left\", \"Right\"], \"Left\"),\r\n _mySetLocalScaleAsJointRadius: Property.bool(false),\r\n _myJointID: Property.enum(\r\n [\r\n \"Wrist\",\r\n \"Thumb Metacarpal\", \"Thumb Phalanx Proximal\", \"Thumb Phalanx Distal\", \"Thumb Tip\",\r\n \"Index Metacarpal\", \"Index Phalanx Proximal\", \"Index Phalanx Intermediate\", \"Index Phalanx Distal\", \"Index Tip\",\r\n \"Middle Metacarpal\", \"Middle Phalanx Proximal\", \"Middle Phalanx Intermediate\", \"Middle Phalanx Distal\", \"Middle Tip\",\r\n \"Ring Metacarpal\", \"Ring Phalanx Proximal\", \"Ring Phalanx Intermediate\", \"Ring Phalanx Distal\", \"Ring Tip\",\r\n \"Pinky Metacarpal\", \"Pinky Phalanx Proximal\", \"Pinky Phalanx Intermediate\", \"Pinky Phalanx Distal\", \"Pinky Tip\"\r\n ],\r\n \"Wrist\")\r\n };\r\n\r\n start() {\r\n this._myHandednessType = InputUtils.getHandednessByIndex(this._myHandedness);\r\n this._myJointIDType = InputUtils.getJointIDByIndex(this._myJointID);\r\n\r\n this._myActivateOnNextUpdate = false;\r\n }\r\n\r\n update(dt) {\r\n if (this._myActivateOnNextUpdate) {\r\n this._onActivate();\r\n\r\n this._myActivateOnNextUpdate = false;\r\n }\r\n }\r\n\r\n _onPoseUpdated(dt, pose) {\r\n // Implemented outside class definition\r\n }\r\n\r\n onActivate() {\r\n this._myActivateOnNextUpdate = true;\r\n }\r\n\r\n _onActivate() {\r\n Globals.getTrackedHandPose(this._myHandednessType, this.engine).getJointPose(this._myJointIDType).registerPoseUpdatedEventListener(this, this._onPoseUpdated.bind(this));\r\n }\r\n\r\n onDeactivate() {\r\n Globals.getTrackedHandPose(this._myHandednessType, this.engine)?.getJointPose(this._myJointIDType)?.unregisterPoseUpdatedEventListener(this);\r\n }\r\n}\r\n\r\n\r\n\r\n// IMPLEMENTATION\r\n\r\nSetTrackedHandJointLocalTransformComponent.prototype._onPoseUpdated = function () {\r\n let jointPoseTransform = quat2_create();\r\n return function _onPoseUpdated(dt, pose) {\r\n if (!this.active || this._myActivateOnNextUpdate) {\r\n this.onDeactivate();\r\n return;\r\n }\r\n\r\n if (XRUtils.isSessionActive(this.engine)) {\r\n if (pose.isValid()) {\r\n this.object.pp_setTransformLocalQuat(pose.getTransformQuat(jointPoseTransform, null));\r\n\r\n if (this._mySetLocalScaleAsJointRadius) {\r\n this.object.pp_setScaleLocal(pose.getJointRadius());\r\n }\r\n }\r\n }\r\n };\r\n}();", "import { Component, Property } from \"@wonderlandengine/api\";\r\nimport { Globals } from \"../../../pp/globals.js\";\r\nimport { InputUtils } from \"../../cauldron/input_utils.js\";\r\n\r\nexport class CopyHandTransformComponent extends Component {\r\n static TypeName = \"pp-copy-hand-transform\";\r\n static Properties = {\r\n _myHandedness: Property.enum([\"Left\", \"Right\"], \"Left\")\r\n };\r\n\r\n init() {\r\n this._myHandednessType = InputUtils.getHandednessByIndex(this._myHandedness);\r\n }\r\n\r\n update(dt) {\r\n let hand = Globals.getPlayerObjects(this.engine).myHands[this._myHandednessType];\r\n this.object.pp_setTransformQuat(hand.pp_getTransformQuat());\r\n this.object.pp_setScale(hand.pp_getScale());\r\n }\r\n}", "import { Component } from \"@wonderlandengine/api\";\r\nimport { Globals } from \"../../../pp/globals.js\";\r\n\r\nexport class CopyHeadTransformComponent extends Component {\r\n static TypeName = \"pp-copy-head-transform\";\r\n\r\n update(dt) {\r\n let head = Globals.getPlayerObjects(this.engine).myHead;\r\n this.object.pp_setTransformQuat(head.pp_getTransformQuat());\r\n this.object.pp_setScale(head.pp_getScale());\r\n }\r\n}", "import { Component } from \"@wonderlandengine/api\";\r\nimport { Globals } from \"../../../pp/globals.js\";\r\n\r\nexport class CopyPlayerTransformComponent extends Component {\r\n static TypeName = \"pp-copy-player-transform\";\r\n\r\n update(dt) {\r\n let player = Globals.getPlayerObjects(this.engine).myPlayer;\r\n this.object.pp_setTransformQuat(player.pp_getTransformQuat());\r\n this.object.pp_setScale(player.pp_getScale());\r\n }\r\n}", "import { Component } from \"@wonderlandengine/api\";\r\nimport { Globals } from \"../../../pp/globals.js\";\r\n\r\nexport class CopyReferenceSpaceTransformComponent extends Component {\r\n static TypeName = \"pp-copy-reference-space-transform\";\r\n\r\n update(dt) {\r\n let referenceSpace = Globals.getPlayerObjects(this.engine).myReferenceSpace;\r\n this.object.pp_setTransformQuat(referenceSpace.pp_getTransformQuat());\r\n this.object.pp_setScale(referenceSpace.pp_getScale());\r\n }\r\n}", "export let ToolHandedness = {\r\n NONE: null,\r\n LEFT: \"left\",\r\n RIGHT: \"right\"\r\n};\r\n\r\nexport let ToolInputSourceType = {\r\n NONE: null,\r\n GAMEPAD: 0,\r\n TRACKED_HAND: 1\r\n};", "import { Component, MeshComponent, Property, ViewComponent } from \"@wonderlandengine/api\";\r\nimport { Cursor, CursorTarget } from \"@wonderlandengine/components\";\r\nimport { PhysicsUtils } from \"../../../cauldron/physics/physics_utils.js\";\r\nimport { XRUtils } from \"../../../cauldron/utils/xr_utils.js\";\r\nimport { FingerCursorComponent } from \"../../../input/cauldron/components/finger_cursor_component.js\";\r\nimport { InputUtils } from \"../../../input/cauldron/input_utils.js\";\r\nimport { quat2_create, vec3_create, vec4_create } from \"../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Globals } from \"../../../pp/globals.js\";\r\n\r\nexport class ToolCursorComponent extends Component {\r\n static TypeName = \"pp-tool-cursor\";\r\n static Properties = {\r\n _myHandedness: Property.enum([\"Left\", \"Right\"], \"Left\"),\r\n _myApplyDefaultCursorOffset: Property.bool(true),\r\n _myPulseOnHover: Property.bool(false),\r\n _myShowFingerCursor: Property.bool(false),\r\n _myUpdatePointerCursorStyle: Property.bool(true)\r\n };\r\n\r\n init() {\r\n this._myHandednessType = InputUtils.getHandednessByIndex(this._myHandedness);\r\n\r\n this._myCursorPositionDefaultOffset = vec3_create(0, -0.035, 0.05);\r\n this._myCursorRotationDefaultOffset = vec3_create(30, 0, 0);\r\n\r\n this._myCursorMeshScale = vec3_create(0.0025, 0.0025, 0.0025);\r\n this._myCursorColor = vec4_create(255 / 255, 255 / 255, 255 / 255, 1);\r\n\r\n this._myCursorTargetCollisionGroup = 7; // Keep this in sync with Widgets \r\n\r\n this._myStarted = false;\r\n }\r\n\r\n start() {\r\n if (Globals.isToolEnabled(this.engine)) {\r\n this._myToolCursorObject = this.object.pp_addChild();\r\n\r\n this._myCursorObjectXR = this._myToolCursorObject.pp_addChild();\r\n\r\n if (this._myApplyDefaultCursorOffset) {\r\n this._myCursorObjectXR.pp_setPositionLocal(this._myCursorPositionDefaultOffset);\r\n this._myCursorObjectXR.pp_rotateObject(this._myCursorRotationDefaultOffset);\r\n }\r\n\r\n {\r\n this._myCursorMeshobject = this._myCursorObjectXR.pp_addChild();\r\n this._myCursorMeshobject.pp_setScale(this._myCursorMeshScale);\r\n\r\n let cursorMeshComponent = this._myCursorMeshobject.pp_addComponent(MeshComponent);\r\n cursorMeshComponent.mesh = Globals.getDefaultMeshes(this.engine).mySphere;\r\n cursorMeshComponent.material = Globals.getDefaultMaterials(this.engine).myFlatOpaque.clone();\r\n cursorMeshComponent.material.color = this._myCursorColor;\r\n\r\n this._myCursorComponentXR = this._myCursorObjectXR.pp_addComponent(Cursor, {\r\n \"collisionGroup\": this._myCursorTargetCollisionGroup,\r\n \"handedness\": this._myHandedness + 1,\r\n \"cursorObject\": this._myCursorMeshobject,\r\n \"styleCursor\": false\r\n });\r\n\r\n this._myCursorComponentXR.rayCastMode = 0; // Collision\r\n }\r\n\r\n this._myCursorObjectNonXR = this._myToolCursorObject.pp_addChild();\r\n\r\n {\r\n this._myCursorComponentNonXR = this._myCursorObjectNonXR.pp_addComponent(Cursor, {\r\n \"collisionGroup\": this._myCursorTargetCollisionGroup,\r\n \"handedness\": this._myHandedness + 1,\r\n \"styleCursor\": this._myUpdatePointerCursorStyle\r\n });\r\n\r\n this._myCursorComponentNonXR.rayCastMode = 0; // Collision\r\n this._myCursorComponentNonXR.pp_setViewComponent(Globals.getPlayerObjects(this.engine).myCameraNonXR.pp_getComponent(ViewComponent));\r\n }\r\n\r\n let fingerCursorMeshObject = null;\r\n let fingerCollisionSize = 0.0125;\r\n\r\n if (this._myShowFingerCursor) {\r\n fingerCursorMeshObject = this._myToolCursorObject.pp_addChild();\r\n\r\n let meshComponent = fingerCursorMeshObject.pp_addComponent(MeshComponent);\r\n meshComponent.mesh = Globals.getDefaultMeshes(this.engine).mySphere;\r\n meshComponent.material = Globals.getDefaultMaterials(this.engine).myFlatOpaque.clone();\r\n meshComponent.material.color = this._myCursorColor;\r\n\r\n fingerCursorMeshObject.pp_setScale(fingerCollisionSize);\r\n }\r\n\r\n let collisionFlags = \"\";\r\n for (let i = 0; i < PhysicsUtils.getLayerFlagsNames().length; i++) {\r\n if (i == this._myCursorTargetCollisionGroup) {\r\n collisionFlags += \"1\";\r\n } else {\r\n collisionFlags += \"0\";\r\n }\r\n\r\n if (i != PhysicsUtils.getLayerFlagsNames().length - 1) {\r\n collisionFlags += \", \";\r\n }\r\n }\r\n\r\n this._myFingerCursorObject = this._myToolCursorObject.pp_addChild();\r\n this._myFingerCursorComponent = this._myFingerCursorObject.pp_addComponent(FingerCursorComponent, {\r\n \"_myHandedness\": this._myHandedness,\r\n \"_myDisableDefaultCursorOnTrackedHandDetected\": false,\r\n \"_myMultipleClicksEnabled\": true,\r\n \"_myCollisionMode\": 1,\r\n \"_myCollisionFlags\": collisionFlags,\r\n \"_myCollisionSize\": fingerCollisionSize,\r\n \"_myCursorPointerObject\": fingerCursorMeshObject\r\n });\r\n\r\n this._myCursorComponentXR.active = false;\r\n this._myCursorComponentNonXR.active = false;\r\n this._myFingerCursorComponent.active = false;\r\n\r\n this._myStarted = true;\r\n }\r\n }\r\n\r\n update(dt) {\r\n // Implemented outside class definition\r\n }\r\n\r\n _isUsingHand() {\r\n let usingHand = false;\r\n\r\n if (XRUtils.getSession(this.engine) && XRUtils.getSession(this.engine).inputSources != null) {\r\n for (let i = 0; i < XRUtils.getSession(this.engine).inputSources.length; i++) {\r\n let input = XRUtils.getSession(this.engine).inputSources[i];\r\n if (input.hand && input.handedness == this._myHandednessType) {\r\n usingHand = true;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return usingHand;\r\n }\r\n\r\n _pulseOnHover(object) {\r\n let targetComponent = object.pp_getComponent(CursorTarget);\r\n\r\n if (targetComponent && !targetComponent.isSurface) {\r\n if (this._myHandedness == 0) {\r\n if (Globals.getLeftGamepad(this.engine) != null) {\r\n Globals.getLeftGamepad(this.engine).pulse(0.4, 0);\r\n }\r\n } else {\r\n if (Globals.getRightGamepad(this.engine) != null) {\r\n Globals.getRightGamepad(this.engine).pulse(0.4, 0);\r\n }\r\n }\r\n }\r\n }\r\n\r\n onActivate() {\r\n if (this._myStarted && this._myPulseOnHover) {\r\n this._myCursorComponentXR.globalTarget.onHover.add(this._pulseOnHover.bind(this), { id: this });\r\n this._myCursorComponentNonXR.globalTarget.onHover.add(this._pulseOnHover.bind(this), { id: this });\r\n }\r\n }\r\n\r\n onDeactivate() {\r\n if (this._myStarted) {\r\n this._myCursorComponentXR.globalTarget.onHover.remove(this);\r\n this._myCursorComponentNonXR.globalTarget.onHover.remove(this);\r\n }\r\n }\r\n}\r\n\r\n\r\n\r\n// IMPLEMENTATION\r\n\r\nToolCursorComponent.prototype.update = function () {\r\n let transformQuat = quat2_create();\r\n return function update(dt) {\r\n if (Globals.isToolEnabled(this.engine)) {\r\n if (this._myStarted) {\r\n let usingHand = this._isUsingHand();\r\n\r\n this._myFingerCursorComponent.active = usingHand;\r\n\r\n if (usingHand) {\r\n this._myCursorComponentXR.active = false;\r\n this._myCursorComponentNonXR.active = false;\r\n } else {\r\n if (XRUtils.isSessionActive(this.engine)) {\r\n this._myCursorComponentXR.active = !usingHand;\r\n this._myCursorComponentNonXR.active = false;\r\n } else {\r\n this._myCursorComponentNonXR.active = !usingHand;\r\n this._myCursorComponentXR.active = false;\r\n\r\n this._myCursorObjectNonXR.pp_setTransformQuat(Globals.getPlayerObjects(this.engine).myCameraNonXR.pp_getTransformQuat(transformQuat));\r\n }\r\n }\r\n }\r\n }\r\n };\r\n}();", "import { Alignment, Collider, VerticalAlignment } from \"@wonderlandengine/api\";\r\nimport { vec3_create, vec4_create } from \"../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { ToolHandedness } from \"../cauldron/tool_types.js\";\r\nimport { ConsoleVRWidgetMessageType } from \"./console_vr_types.js\";\r\n\r\nexport class ConsoleVRWidgetConfig {\r\n\r\n constructor() {\r\n this._setupBuildConfig();\r\n this._setupRuntimeConfig();\r\n }\r\n\r\n _setupBuildConfig() {\r\n // General\r\n this.myBackgroundColor = vec4_create(46 / 255, 46 / 255, 46 / 255, 1);\r\n\r\n this.myCursorTargetCollisionCollider = Collider.Box;\r\n this.myCursorTargetCollisionGroup = 7; // Keep this in sync with Tool Cursor\r\n this.myCursorTargetCollisionThickness = 0.001;\r\n\r\n this.myDefaultTextColor = vec4_create(255 / 255, 255 / 255, 255 / 255, 1);\r\n\r\n this.myTextAlignment = Alignment.Center;\r\n this.myTextVerticalAlignment = VerticalAlignment.Middle;\r\n this.myTextColor = this.myDefaultTextColor;\r\n\r\n this.myMessageTypeColors = [];\r\n this.myMessageTypeColors[ConsoleVRWidgetMessageType.LOG] = this.myDefaultTextColor;\r\n this.myMessageTypeColors[ConsoleVRWidgetMessageType.ERROR] = vec4_create(255 / 255, 40 / 255, 40 / 255, 1);\r\n this.myMessageTypeColors[ConsoleVRWidgetMessageType.WARN] = vec4_create(250 / 255, 220 / 255, 40 / 255, 1);\r\n this.myMessageTypeColors[ConsoleVRWidgetMessageType.DEBUG] = vec4_create(60 / 255, 200 / 255, 255 / 255, 1);\r\n\r\n // Messages\r\n this.myMessagesPanelPosition = vec3_create(0, 0.075, 0);\r\n\r\n this.myMessagesBackgroundScale = vec3_create(0.34, 0.15, 1);\r\n\r\n {\r\n let xPaddingPercentage = 0.03;\r\n let yPaddingPercentage = xPaddingPercentage * this.myMessagesBackgroundScale[0] / this.myMessagesBackgroundScale[1] * 0.8; // A bit less padding\r\n let xPosition = -this.myMessagesBackgroundScale[0] + this.myMessagesBackgroundScale[0] * xPaddingPercentage;\r\n let yPosition = this.myMessagesBackgroundScale[1] - this.myMessagesBackgroundScale[1] * yPaddingPercentage;\r\n this.myMessagesTextsPanelPosition = vec3_create(xPosition, yPosition, 0.007);\r\n }\r\n this.myMessagesTextsPanelScale = vec3_create(0.1, 0.1, 0.1);\r\n\r\n this.myMessagesTextStartString = \".\\n\"; // To avoid issue with text component padding\r\n this.myMessagesTextAlignment = Alignment.Left;\r\n this.myMessagesTextVerticalAlignment = VerticalAlignment.Top;\r\n\r\n this.myMessagesTextPositions = [];\r\n this.myMessagesTextPositions[ConsoleVRWidgetMessageType.LOG] = vec3_create(0, 0, 0.0002);\r\n this.myMessagesTextPositions[ConsoleVRWidgetMessageType.ERROR] = vec3_create(0, 0, 0);\r\n this.myMessagesTextPositions[ConsoleVRWidgetMessageType.WARN] = vec3_create(0, 0, 0);\r\n this.myMessagesTextPositions[ConsoleVRWidgetMessageType.DEBUG] = vec3_create(0, 0, 0);\r\n\r\n this.myMessagesTextColors = [];\r\n this.myMessagesTextColors[ConsoleVRWidgetMessageType.LOG] = this.myMessageTypeColors[ConsoleVRWidgetMessageType.LOG];\r\n this.myMessagesTextColors[ConsoleVRWidgetMessageType.ERROR] = this.myMessageTypeColors[ConsoleVRWidgetMessageType.ERROR];\r\n this.myMessagesTextColors[ConsoleVRWidgetMessageType.WARN] = this.myMessageTypeColors[ConsoleVRWidgetMessageType.WARN];\r\n this.myMessagesTextColors[ConsoleVRWidgetMessageType.DEBUG] = this.myMessageTypeColors[ConsoleVRWidgetMessageType.DEBUG];\r\n\r\n // Buttons \r\n this.myButtonsPanelPosition = vec3_create(0, -0.11, 0.015);\r\n\r\n this.myButtonBackgroundScale = vec3_create(0.04, 0.02, 1);\r\n\r\n this.myButtonTextPosition = vec3_create(0, 0, 0.007);\r\n this.myButtonTextScale = vec3_create(0.18, 0.18, 0.18);\r\n\r\n this.myButtonCursorTargetPosition = vec3_create(0, 0, 0);\r\n this.myButtonCursorTargetPosition[2] = this.myButtonTextPosition[2];\r\n\r\n this.myButtonsCollisionCollider = this.myCursorTargetCollisionCollider;\r\n this.myButtonsCollisionGroup = this.myCursorTargetCollisionGroup;\r\n this.myButtonsCollisionExtents = this.myButtonBackgroundScale.pp_clone();\r\n this.myButtonsCollisionExtents[2] = this.myCursorTargetCollisionThickness;\r\n\r\n this.myClearButtonTextLabel = \"clear\";\r\n this.myUpButtonTextLabel = \"up\";\r\n this.myDownButtonTextLabel = \"down\";\r\n\r\n this.myFilterButtonsTextColors = [];\r\n this.myFilterButtonsTextColors[ConsoleVRWidgetMessageType.LOG] = this.myMessageTypeColors[ConsoleVRWidgetMessageType.LOG];\r\n this.myFilterButtonsTextColors[ConsoleVRWidgetMessageType.ERROR] = this.myMessageTypeColors[ConsoleVRWidgetMessageType.ERROR];\r\n this.myFilterButtonsTextColors[ConsoleVRWidgetMessageType.WARN] = this.myMessageTypeColors[ConsoleVRWidgetMessageType.WARN];\r\n this.myFilterButtonsTextColors[ConsoleVRWidgetMessageType.DEBUG] = this.myMessageTypeColors[ConsoleVRWidgetMessageType.DEBUG];\r\n\r\n this.myFilterButtonsTextLabel = [];\r\n this.myFilterButtonsTextLabel[ConsoleVRWidgetMessageType.LOG] = \"log\";\r\n this.myFilterButtonsTextLabel[ConsoleVRWidgetMessageType.ERROR] = \"error\";\r\n this.myFilterButtonsTextLabel[ConsoleVRWidgetMessageType.WARN] = \"warn\";\r\n this.myFilterButtonsTextLabel[ConsoleVRWidgetMessageType.DEBUG] = \"debug\";\r\n\r\n // Buttons positioning\r\n {\r\n let numberOfButtons = 7;\r\n let buttonsHorizontalSpace = Math.max(0.68, this.myButtonBackgroundScale[0] * numberOfButtons);\r\n // 2 at start, 3 between filters, 4 spaces between filter and clear and 4 spaces between clear and up/down, 1 space between up and down, 1 at end\r\n let numberOfSpacesBetweenButtons = 2 + 3 + 4 + 4 + 1 + 2;\r\n let spaceWidth = Math.max((buttonsHorizontalSpace - numberOfButtons * this.myButtonBackgroundScale[0] * 2) / numberOfSpacesBetweenButtons, 0);\r\n let halfButtonWidth = this.myButtonBackgroundScale[0];\r\n let initialPosition = - buttonsHorizontalSpace / 2;\r\n\r\n this.myFilterButtonsPositions = [];\r\n this.myFilterButtonsPositions[ConsoleVRWidgetMessageType.LOG] = [initialPosition + spaceWidth * 2 + halfButtonWidth, 0, 0];\r\n this.myFilterButtonsPositions[ConsoleVRWidgetMessageType.ERROR] = [this.myFilterButtonsPositions[ConsoleVRWidgetMessageType.LOG][0] + halfButtonWidth + spaceWidth + halfButtonWidth, 0, 0];\r\n this.myFilterButtonsPositions[ConsoleVRWidgetMessageType.WARN] = [this.myFilterButtonsPositions[ConsoleVRWidgetMessageType.ERROR][0] + halfButtonWidth + spaceWidth + halfButtonWidth, 0, 0];\r\n this.myFilterButtonsPositions[ConsoleVRWidgetMessageType.DEBUG] = [this.myFilterButtonsPositions[ConsoleVRWidgetMessageType.WARN][0] + halfButtonWidth + spaceWidth + halfButtonWidth, 0, 0];\r\n\r\n this.myClearButtonPosition = [this.myFilterButtonsPositions[ConsoleVRWidgetMessageType.DEBUG][0] + halfButtonWidth + spaceWidth * 4 + halfButtonWidth, 0, 0];\r\n this.myUpButtonPosition = [this.myClearButtonPosition[0] + halfButtonWidth + spaceWidth * 4 + halfButtonWidth, 0, 0];\r\n this.myDownButtonPosition = [this.myUpButtonPosition[0] + halfButtonWidth + spaceWidth + halfButtonWidth, 0, 0];\r\n }\r\n\r\n // Notify Icon\r\n this.myNotifyIconBackgroundScale = vec3_create(0.01, 0.01, 1);\r\n\r\n this.myNotifyIconPanelPositions = [];\r\n this.myNotifyIconPanelPositions[ToolHandedness.NONE] = vec3_create(0, 0, 0);\r\n this.myNotifyIconPanelPositions[ToolHandedness.NONE][0] = -this.myMessagesBackgroundScale[0] + this.myNotifyIconBackgroundScale[0] + 0.01;\r\n this.myNotifyIconPanelPositions[ToolHandedness.NONE][1] = -this.myMessagesBackgroundScale[1] + this.myNotifyIconBackgroundScale[1] + 0.01;\r\n this.myNotifyIconPanelPositions[ToolHandedness.NONE][2] = this.myMessagesTextsPanelPosition[2] - 0.00001; // Prevent glitches with text\r\n\r\n this.myNotifyIconPanelPositions[ToolHandedness.LEFT] = this.myNotifyIconPanelPositions[ToolHandedness.NONE];\r\n\r\n this.myNotifyIconPanelPositions[ToolHandedness.RIGHT] = this.myNotifyIconPanelPositions[ToolHandedness.NONE];\r\n\r\n this.myNotifyIconCursorTargetPosition = vec3_create(0, 0, 0);\r\n this.myNotifyIconCursorTargetPosition[2] = this.myButtonsPanelPosition[2] + this.myButtonTextPosition[2] - this.myMessagesTextsPanelPosition[2]; // A little behind the button target to avoid hiding it\r\n\r\n this.myNotifyIconCollisionExtents = this.myNotifyIconBackgroundScale.pp_clone();\r\n this.myNotifyIconCollisionExtents[2] = this.myCursorTargetCollisionThickness;\r\n\r\n this.myNotifyIconColor = vec4_create(210 / 255, 210 / 255, 210 / 255, 1);\r\n\r\n // Pointer\r\n this.myPointerCollisionCollider = this.myCursorTargetCollisionCollider;\r\n this.myPointerCollisionGroup = this.myCursorTargetCollisionGroup;\r\n\r\n {\r\n let spaceBetweenMessagesAndButtons = Math.abs((this.myMessagesPanelPosition[1] - this.myMessagesBackgroundScale[1]) - (this.myButtonsPanelPosition[1] + this.myButtonBackgroundScale[1]));\r\n let pointerCollisionHalfHeight = this.myMessagesBackgroundScale[1] + this.myButtonBackgroundScale[1] + spaceBetweenMessagesAndButtons / 2;\r\n this.myPointerCollisionExtents = vec3_create(this.myMessagesBackgroundScale[0], pointerCollisionHalfHeight, this.myCursorTargetCollisionThickness);\r\n }\r\n\r\n this.myPointerCursorTargetPosition = vec3_create(0, 0, 0);\r\n this.myPointerCursorTargetPosition[1] = (this.myMessagesPanelPosition[1] + this.myMessagesBackgroundScale[1]) - this.myPointerCollisionExtents[1];\r\n this.myPointerCursorTargetPosition[2] = this.myButtonsPanelPosition[2] + this.myButtonTextPosition[2] - 0.0002; // A little behind the button target to avoid hiding it\r\n }\r\n\r\n _setupRuntimeConfig() {\r\n this.myTabString = \" \";\r\n this.myAssertStartString = \"Assertion failed:\";\r\n\r\n this.myMaxCharactersPerLine = 100;\r\n this.myMaxLineSplits = 500; // Prevent infinite splitting\r\n this.myMaxLines = 22;\r\n this.myMaxMessages = 2000;\r\n this.myMaxMessagesDeletePad = 2000; // To prevent deleting at every message, delay the delete after the limit is exceed by this value\r\n\r\n this.myLinesBetweenMessages = 1;\r\n\r\n this.myButtonHoverColor = vec4_create(150 / 255, 150 / 255, 150 / 255, 1);\r\n this.myButtonDisabledTextColor = this.myBackgroundColor;\r\n this.myButtonDisabledBackgroundColor = vec4_create(110 / 255, 110 / 255, 110 / 255, 1);\r\n\r\n this.myFilterButtonDisabledTextColor = this.myButtonDisabledTextColor;\r\n this.myFilterButtonDisabledBackgroundColor = this.myButtonDisabledBackgroundColor;\r\n\r\n this.myScrollDelay = 0.1;\r\n this.myScrollAmount = 1;\r\n this.myScrollThumbstickHandedness = ToolHandedness.RIGHT;\r\n this.myScrollThumbstickDelay = 0.1;\r\n this.myScrollThumbstickMinThreshold = 0.2;\r\n this.myScrollThumbstickAmount = 3;\r\n\r\n this.myPulseDelay = 5;\r\n this.myPulseIntensity = 0.3;\r\n this.myPulseDuration = 0.085;\r\n\r\n this.myClearBrowserConsoleWhenClearPressed = false;\r\n\r\n this.myGamepadScrollOnlyOnHover = true;\r\n }\r\n}", "export let ConsoleVRWidgetConsoleFunction = {\r\n DEBUG: 0,\r\n WARN: 1,\r\n ERROR: 2,\r\n LOG: 3,\r\n INFO: 4,\r\n ASSERT: 5\r\n};\r\n\r\nexport let ConsoleVRWidgetSender = {\r\n BROWSER_CONSOLE: 0,\r\n CONSOLE_VR: 1,\r\n WINDOW: 2\r\n};\r\n\r\nexport let ConsoleVRWidgetPulseOnNewMessage = {\r\n NEVER: 0,\r\n ALWAYS: 1,\r\n WHEN_HIDDEN: 2\r\n};\r\n\r\nexport let ConsoleVRWidgetMessageType = {\r\n DEBUG: 0,\r\n WARN: 1,\r\n ERROR: 2,\r\n LOG: 3\r\n};\r\n\r\nexport let OverrideBrowserConsoleFunctions = {\r\n NONE: 0,\r\n ALL: 1,\r\n ERRORS_AND_WARNS: 2\r\n};", "import { CollisionComponent, MeshComponent, TextComponent } from \"@wonderlandengine/api\";\r\nimport { CursorTarget } from \"@wonderlandengine/components\";\r\nimport { XRUtils } from \"../../cauldron/utils/xr_utils.js\";\r\nimport { Globals } from \"../../pp/globals.js\";\r\nimport { ToolHandedness } from \"../cauldron/tool_types.js\";\r\nimport { ConsoleVRWidgetMessageType } from \"./console_vr_types.js\";\r\n\r\nexport class ConsoleVRWidgetUI {\r\n\r\n constructor(engine = Globals.getMainEngine()) {\r\n this._myEngine = engine;\r\n\r\n this._myActive = false;\r\n this._myDestroyed = false;\r\n }\r\n\r\n build(parentObject, config, params) {\r\n this._myParentObject = parentObject;\r\n this._myConfig = config;\r\n this._myParams = params;\r\n\r\n this._myPlaneMesh = Globals.getDefaultMeshes(this._myEngine).myDoubleSidedPlane;\r\n\r\n this._createSkeleton();\r\n this._setTransforms();\r\n this._addComponents();\r\n\r\n this._setTransformForNonXR();\r\n\r\n this.setActive(true);\r\n }\r\n\r\n setVisible(visible) {\r\n this.myPivotObject.pp_setActive(visible);\r\n }\r\n\r\n // Skeleton\r\n _createSkeleton() {\r\n this.myPivotObject = this._myParentObject.pp_addChild();\r\n\r\n this._createMessagesSkeleton();\r\n this._createButtonsSkeleton();\r\n this._createPointerSkeleton();\r\n }\r\n\r\n _createMessagesSkeleton() {\r\n this.myMessagesPanel = this.myPivotObject.pp_addChild();\r\n this.myMessagesBackground = this.myMessagesPanel.pp_addChild();\r\n this.myMessagesTextsPanel = this.myMessagesPanel.pp_addChild();\r\n\r\n this.myMessagesTexts = [];\r\n for (let key in ConsoleVRWidgetMessageType) {\r\n this.myMessagesTexts[ConsoleVRWidgetMessageType[key]] = this.myMessagesTextsPanel.pp_addChild();\r\n }\r\n\r\n this.myNotifyIconPanel = this.myMessagesPanel.pp_addChild();\r\n this.myNotifyIconBackground = this.myNotifyIconPanel.pp_addChild();\r\n this.myNotifyIconCursorTarget = this.myNotifyIconPanel.pp_addChild();\r\n }\r\n\r\n _createButtonsSkeleton() {\r\n this.myButtonsPanel = this.myPivotObject.pp_addChild();\r\n\r\n this.myFilterButtonsPanels = [];\r\n this.myFilterButtonsBackgrounds = [];\r\n this.myFilterButtonsTexts = [];\r\n this.myFilterButtonsCursorTargets = [];\r\n\r\n for (let key in ConsoleVRWidgetMessageType) {\r\n this.myFilterButtonsPanels[ConsoleVRWidgetMessageType[key]] = this.myButtonsPanel.pp_addChild();\r\n this.myFilterButtonsBackgrounds[ConsoleVRWidgetMessageType[key]] = this.myFilterButtonsPanels[ConsoleVRWidgetMessageType[key]].pp_addChild();\r\n this.myFilterButtonsTexts[ConsoleVRWidgetMessageType[key]] = this.myFilterButtonsPanels[ConsoleVRWidgetMessageType[key]].pp_addChild();\r\n this.myFilterButtonsCursorTargets[ConsoleVRWidgetMessageType[key]] = this.myFilterButtonsPanels[ConsoleVRWidgetMessageType[key]].pp_addChild();\r\n }\r\n\r\n this.myClearButtonPanel = this.myButtonsPanel.pp_addChild();\r\n this.myClearButtonBackground = this.myClearButtonPanel.pp_addChild();\r\n this.myClearButtonText = this.myClearButtonPanel.pp_addChild();\r\n this.myClearButtonCursorTarget = this.myClearButtonPanel.pp_addChild();\r\n\r\n this.myUpButtonPanel = this.myButtonsPanel.pp_addChild();\r\n this.myUpButtonBackground = this.myUpButtonPanel.pp_addChild();\r\n this.myUpButtonText = this.myUpButtonPanel.pp_addChild();\r\n this.myUpButtonCursorTarget = this.myUpButtonPanel.pp_addChild();\r\n\r\n this.myDownButtonPanel = this.myButtonsPanel.pp_addChild();\r\n this.myDownButtonBackground = this.myDownButtonPanel.pp_addChild();\r\n this.myDownButtonText = this.myDownButtonPanel.pp_addChild();\r\n this.myDownButtonCursorTarget = this.myDownButtonPanel.pp_addChild();\r\n }\r\n\r\n _createPointerSkeleton() {\r\n this.myPointerCursorTarget = this.myPivotObject.pp_addChild();\r\n }\r\n\r\n // Transforms\r\n _setTransforms() {\r\n this.myPivotObject.pp_markDirty();\r\n\r\n this._setMessagesTransforms();\r\n this._setButtonsTransforms();\r\n this._setPointerTransform();\r\n }\r\n\r\n _setMessagesTransforms() {\r\n this.myMessagesPanel.pp_setPositionLocal(this._myConfig.myMessagesPanelPosition);\r\n this.myMessagesBackground.pp_scaleObject(this._myConfig.myMessagesBackgroundScale);\r\n\r\n this.myMessagesTextsPanel.pp_setPositionLocal(this._myConfig.myMessagesTextsPanelPosition);\r\n this.myMessagesTextsPanel.pp_scaleObject(this._myConfig.myMessagesTextsPanelScale);\r\n for (let key in ConsoleVRWidgetMessageType) {\r\n this.myMessagesTexts[ConsoleVRWidgetMessageType[key]].pp_setPositionLocal(this._myConfig.myMessagesTextPositions[ConsoleVRWidgetMessageType[key]]);\r\n }\r\n\r\n this.myNotifyIconPanel.pp_setPositionLocal(this._myConfig.myNotifyIconPanelPositions[this._myParams.myHandedness]);\r\n this.myNotifyIconBackground.pp_scaleObject(this._myConfig.myNotifyIconBackgroundScale);\r\n this.myNotifyIconCursorTarget.pp_setPositionLocal(this._myConfig.myNotifyIconCursorTargetPosition);\r\n }\r\n\r\n _setButtonsTransforms() {\r\n this.myButtonsPanel.pp_setPositionLocal(this._myConfig.myButtonsPanelPosition);\r\n\r\n // Filter Buttons\r\n for (let key in ConsoleVRWidgetMessageType) {\r\n this.myFilterButtonsPanels[ConsoleVRWidgetMessageType[key]].pp_setPositionLocal(this._myConfig.myFilterButtonsPositions[ConsoleVRWidgetMessageType[key]]);\r\n\r\n this.myFilterButtonsBackgrounds[ConsoleVRWidgetMessageType[key]].pp_scaleObject(this._myConfig.myButtonBackgroundScale);\r\n\r\n this.myFilterButtonsTexts[ConsoleVRWidgetMessageType[key]].pp_setPositionLocal(this._myConfig.myButtonTextPosition);\r\n this.myFilterButtonsTexts[ConsoleVRWidgetMessageType[key]].pp_scaleObject(this._myConfig.myButtonTextScale);\r\n\r\n this.myFilterButtonsCursorTargets[ConsoleVRWidgetMessageType[key]].pp_setPositionLocal(this._myConfig.myButtonCursorTargetPosition);\r\n }\r\n\r\n // Clear\r\n {\r\n this.myClearButtonPanel.pp_setPositionLocal(this._myConfig.myClearButtonPosition);\r\n\r\n this.myClearButtonBackground.pp_scaleObject(this._myConfig.myButtonBackgroundScale);\r\n\r\n this.myClearButtonText.pp_setPositionLocal(this._myConfig.myButtonTextPosition);\r\n this.myClearButtonText.pp_scaleObject(this._myConfig.myButtonTextScale);\r\n\r\n this.myClearButtonCursorTarget.pp_setPositionLocal(this._myConfig.myButtonCursorTargetPosition);\r\n }\r\n\r\n // Up\r\n {\r\n this.myUpButtonPanel.pp_setPositionLocal(this._myConfig.myUpButtonPosition);\r\n\r\n this.myUpButtonBackground.pp_scaleObject(this._myConfig.myButtonBackgroundScale);\r\n\r\n this.myUpButtonText.pp_setPositionLocal(this._myConfig.myButtonTextPosition);\r\n this.myUpButtonText.pp_scaleObject(this._myConfig.myButtonTextScale);\r\n\r\n this.myUpButtonCursorTarget.pp_setPositionLocal(this._myConfig.myButtonCursorTargetPosition);\r\n }\r\n\r\n // Down\r\n {\r\n this.myDownButtonPanel.pp_setPositionLocal(this._myConfig.myDownButtonPosition);\r\n\r\n this.myDownButtonBackground.pp_scaleObject(this._myConfig.myButtonBackgroundScale);\r\n\r\n this.myDownButtonText.pp_setPositionLocal(this._myConfig.myButtonTextPosition);\r\n this.myDownButtonText.pp_scaleObject(this._myConfig.myButtonTextScale);\r\n\r\n this.myDownButtonCursorTarget.pp_setPositionLocal(this._myConfig.myButtonCursorTargetPosition);\r\n }\r\n }\r\n\r\n _setPointerTransform() {\r\n this.myPointerCursorTarget.pp_setPositionLocal(this._myConfig.myPointerCursorTargetPosition);\r\n }\r\n\r\n // Components\r\n _addComponents() {\r\n this._addMessagesComponents();\r\n this._addButtonsComponents();\r\n this._addPointerComponents();\r\n }\r\n\r\n _addMessagesComponents() {\r\n let messagesBackgroundMeshComp = this.myMessagesBackground.pp_addComponent(MeshComponent);\r\n messagesBackgroundMeshComp.mesh = this._myPlaneMesh;\r\n messagesBackgroundMeshComp.material = this._myParams.myPlaneMaterial.clone();\r\n messagesBackgroundMeshComp.material.color = this._myConfig.myBackgroundColor;\r\n\r\n this.myMessagesTextComponents = [];\r\n for (let key in ConsoleVRWidgetMessageType) {\r\n let textComp = this.myMessagesTexts[ConsoleVRWidgetMessageType[key]].pp_addComponent(TextComponent);\r\n\r\n textComp.alignment = this._myConfig.myMessagesTextAlignment;\r\n textComp.verticalAlignment = this._myConfig.myMessagesTextVerticalAlignment;\r\n textComp.material = this._myParams.myTextMaterial.clone();\r\n textComp.material.color = this._myConfig.myMessagesTextColors[ConsoleVRWidgetMessageType[key]];\r\n textComp.lineSpacing = 1.2;\r\n textComp.text = this._myConfig.myMessagesTextStartString;\r\n\r\n this.myMessagesTextComponents[ConsoleVRWidgetMessageType[key]] = textComp;\r\n }\r\n\r\n this.myNotifyIconBackgroundComponent = this.myNotifyIconBackground.pp_addComponent(MeshComponent);\r\n this.myNotifyIconBackgroundComponent.mesh = this._myPlaneMesh;\r\n this.myNotifyIconBackgroundComponent.material = this._myParams.myPlaneMaterial.clone();\r\n this.myNotifyIconBackgroundComponent.material.color = this._myConfig.myNotifyIconColor;\r\n\r\n this.myNotifyIconCursorTargetComponent = this.myNotifyIconCursorTarget.pp_addComponent(CursorTarget);\r\n\r\n this.myNotifyIconCollisionComponent = this.myNotifyIconCursorTarget.pp_addComponent(CollisionComponent);\r\n this.myNotifyIconCollisionComponent.collider = this._myConfig.myCursorTargetCollisionCollider;\r\n this.myNotifyIconCollisionComponent.group = 1 << this._myConfig.myCursorTargetCollisionGroup;\r\n this.myNotifyIconCollisionComponent.extents = this._myConfig.myNotifyIconCollisionExtents;\r\n }\r\n\r\n _addButtonsComponents() {\r\n // Worship the code copy pasteness\r\n\r\n this.myFilterButtonsBackgroundComponents = [];\r\n this.myFilterButtonsTextComponents = [];\r\n this.myFilterButtonsCursorTargetComponents = [];\r\n this.myFilterButtonsCollisionComponents = [];\r\n\r\n // Filter Buttons\r\n for (let key in ConsoleVRWidgetMessageType) {\r\n let buttonBackgroundMeshComp = this.myFilterButtonsBackgrounds[ConsoleVRWidgetMessageType[key]].pp_addComponent(MeshComponent);\r\n buttonBackgroundMeshComp.mesh = this._myPlaneMesh;\r\n buttonBackgroundMeshComp.material = this._myParams.myPlaneMaterial.clone();\r\n buttonBackgroundMeshComp.material.color = this._myConfig.myBackgroundColor;\r\n\r\n let buttonTextComp = this.myFilterButtonsTexts[ConsoleVRWidgetMessageType[key]].pp_addComponent(TextComponent);\r\n this._setupButtonTextComponent(buttonTextComp);\r\n buttonTextComp.material.color = this._myConfig.myFilterButtonsTextColors[ConsoleVRWidgetMessageType[key]];\r\n buttonTextComp.text = this._myConfig.myFilterButtonsTextLabel[ConsoleVRWidgetMessageType[key]];\r\n\r\n let buttonCursorTargetComp = this.myFilterButtonsCursorTargets[ConsoleVRWidgetMessageType[key]].pp_addComponent(CursorTarget);\r\n\r\n let buttonCollisionComp = this.myFilterButtonsCursorTargets[ConsoleVRWidgetMessageType[key]].pp_addComponent(CollisionComponent);\r\n buttonCollisionComp.collider = this._myConfig.myButtonsCollisionCollider;\r\n buttonCollisionComp.group = 1 << this._myConfig.myButtonsCollisionGroup;\r\n buttonCollisionComp.extents = this._myConfig.myButtonsCollisionExtents;\r\n\r\n this.myFilterButtonsBackgroundComponents[ConsoleVRWidgetMessageType[key]] = buttonBackgroundMeshComp;\r\n this.myFilterButtonsTextComponents[ConsoleVRWidgetMessageType[key]] = buttonTextComp;\r\n this.myFilterButtonsCursorTargetComponents[ConsoleVRWidgetMessageType[key]] = buttonCursorTargetComp;\r\n this.myFilterButtonsCollisionComponents[ConsoleVRWidgetMessageType[key]] = buttonCollisionComp;\r\n }\r\n\r\n // Clear \r\n {\r\n let buttonBackgroundMeshComp = this.myClearButtonBackground.pp_addComponent(MeshComponent);\r\n buttonBackgroundMeshComp.mesh = this._myPlaneMesh;\r\n buttonBackgroundMeshComp.material = this._myParams.myPlaneMaterial.clone();\r\n buttonBackgroundMeshComp.material.color = this._myConfig.myBackgroundColor;\r\n\r\n let buttonTextComp = this.myClearButtonText.pp_addComponent(TextComponent);\r\n this._setupButtonTextComponent(buttonTextComp);\r\n buttonTextComp.text = this._myConfig.myClearButtonTextLabel;\r\n\r\n let buttonCursorTargetComp = this.myClearButtonCursorTarget.pp_addComponent(CursorTarget);\r\n\r\n let buttonCollisionComp = this.myClearButtonCursorTarget.pp_addComponent(CollisionComponent);\r\n buttonCollisionComp.collider = this._myConfig.myButtonsCollisionCollider;\r\n buttonCollisionComp.group = 1 << this._myConfig.myButtonsCollisionGroup;\r\n buttonCollisionComp.extents = this._myConfig.myButtonsCollisionExtents;\r\n\r\n this.myClearButtonBackgroundComponent = buttonBackgroundMeshComp;\r\n this.myClearButtonTextComponent = buttonTextComp;\r\n this.myClearButtonCursorTargetComponent = buttonCursorTargetComp;\r\n this.myClearButtonCollisionComponent = buttonCollisionComp;\r\n }\r\n\r\n // Up \r\n {\r\n let buttonBackgroundMeshComp = this.myUpButtonBackground.pp_addComponent(MeshComponent);\r\n buttonBackgroundMeshComp.mesh = this._myPlaneMesh;\r\n buttonBackgroundMeshComp.material = this._myParams.myPlaneMaterial.clone();\r\n buttonBackgroundMeshComp.material.color = this._myConfig.myBackgroundColor;\r\n\r\n let buttonTextComp = this.myUpButtonText.pp_addComponent(TextComponent);\r\n this._setupButtonTextComponent(buttonTextComp);\r\n buttonTextComp.text = this._myConfig.myUpButtonTextLabel;\r\n\r\n let buttonCursorTargetComp = this.myUpButtonCursorTarget.pp_addComponent(CursorTarget);\r\n\r\n let buttonCollisionComp = this.myUpButtonCursorTarget.pp_addComponent(CollisionComponent);\r\n buttonCollisionComp.collider = this._myConfig.myButtonsCollisionCollider;\r\n buttonCollisionComp.group = 1 << this._myConfig.myButtonsCollisionGroup;\r\n buttonCollisionComp.extents = this._myConfig.myButtonsCollisionExtents;\r\n\r\n this.myUpButtonBackgroundComponent = buttonBackgroundMeshComp;\r\n this.myUpButtonTextComponent = buttonTextComp;\r\n this.myUpButtonCursorTargetComponent = buttonCursorTargetComp;\r\n this.myUpButtonCollisionComponent = buttonCollisionComp;\r\n }\r\n\r\n // Down \r\n {\r\n let buttonBackgroundMeshComp = this.myDownButtonBackground.pp_addComponent(MeshComponent);\r\n buttonBackgroundMeshComp.mesh = this._myPlaneMesh;\r\n buttonBackgroundMeshComp.material = this._myParams.myPlaneMaterial.clone();\r\n buttonBackgroundMeshComp.material.color = this._myConfig.myBackgroundColor;\r\n\r\n let buttonTextComp = this.myDownButtonText.pp_addComponent(TextComponent);\r\n this._setupButtonTextComponent(buttonTextComp);\r\n buttonTextComp.text = this._myConfig.myDownButtonTextLabel;\r\n\r\n let buttonCursorTargetComp = this.myDownButtonCursorTarget.pp_addComponent(CursorTarget);\r\n\r\n let buttonCollisionComp = this.myDownButtonCursorTarget.pp_addComponent(CollisionComponent);\r\n buttonCollisionComp.collider = this._myConfig.myButtonsCollisionCollider;\r\n buttonCollisionComp.group = 1 << this._myConfig.myButtonsCollisionGroup;\r\n buttonCollisionComp.extents = this._myConfig.myButtonsCollisionExtents;\r\n\r\n this.myDownButtonBackgroundComponent = buttonBackgroundMeshComp;\r\n this.myDownButtonTextComponent = buttonTextComp;\r\n this.myDownButtonCursorTargetComponent = buttonCursorTargetComp;\r\n this.myDownButtonCollisionComponent = buttonCollisionComp;\r\n }\r\n }\r\n\r\n _addPointerComponents() {\r\n this.myPointerCursorTargetComponent = this.myPointerCursorTarget.pp_addComponent(CursorTarget);\r\n this.myPointerCursorTargetComponent.isSurface = true;\r\n\r\n let collisionComp = this.myPointerCursorTarget.pp_addComponent(CollisionComponent);\r\n collisionComp.collider = this._myConfig.myPointerCollisionCollider;\r\n collisionComp.group = 1 << this._myConfig.myPointerCollisionGroup;\r\n collisionComp.extents = this._myConfig.myPointerCollisionExtents;\r\n\r\n this.myPointerCollisionComponent = collisionComp;\r\n }\r\n\r\n _setupButtonTextComponent(textComponent) {\r\n textComponent.alignment = this._myConfig.myTextAlignment;\r\n textComponent.verticalAlignment = this._myConfig.myTextVerticalAlignment;\r\n textComponent.material = this._myParams.myTextMaterial.clone();\r\n textComponent.material.color = this._myConfig.myTextColor;\r\n textComponent.text = \"\";\r\n }\r\n\r\n _onXRSessionStart() {\r\n this._setTransformForXR();\r\n }\r\n\r\n _onXRSessionEnd() {\r\n this._setTransformForNonXR();\r\n }\r\n\r\n _setTransformForXR() {\r\n this.myNotifyIconPanel.pp_setPositionLocal(this._myConfig.myNotifyIconPanelPositions[this._myParams.myHandedness]);\r\n }\r\n\r\n _setTransformForNonXR() {\r\n this.myNotifyIconPanel.pp_setPositionLocal(this._myConfig.myNotifyIconPanelPositions[ToolHandedness.NONE]);\r\n }\r\n\r\n setActive(active) {\r\n if (this._myActive != active) {\r\n this._myActive = active;\r\n\r\n if (this._myActive) {\r\n XRUtils.registerSessionStartEndEventListeners(this, this._onXRSessionStart.bind(this), this._onXRSessionEnd.bind(this), true, false, this._myEngine);\r\n } else {\r\n XRUtils.unregisterSessionStartEndEventListeners(this, this._myEngine);\r\n }\r\n }\r\n }\r\n\r\n destroy() {\r\n this._myDestroyed = true;\r\n\r\n this.setActive(false);\r\n }\r\n\r\n isDestroyed() {\r\n return this._myDestroyed;\r\n }\r\n}", "import { Emitter } from \"@wonderlandengine/api\";\r\nimport { Globals } from \"../../pp/globals.js\";\r\nimport { ToolHandedness } from \"../cauldron/tool_types.js\";\r\nimport { WidgetFrameConfig } from \"./widget_frame_config.js\";\r\nimport { WidgetFrameUI } from \"./widget_frame_ui.js\";\r\n\r\nexport class WidgetParams {\r\n\r\n constructor() {\r\n this.myHandedness = ToolHandedness.NONE;\r\n\r\n this.myPlaneMaterial = null;\r\n this.myTextMaterial = null;\r\n }\r\n}\r\n\r\nexport class WidgetFrame {\r\n\r\n constructor(widgetLetterID, buttonsColumnIndex, engine = Globals.getMainEngine()) {\r\n this._myWidgetVisible = true;\r\n this._myPinned = false;\r\n\r\n this._myConfig = new WidgetFrameConfig(widgetLetterID, buttonsColumnIndex);\r\n this._myParams = null;\r\n\r\n this._myUI = new WidgetFrameUI(engine);\r\n this._myShowVisibilityButton = false;\r\n\r\n this._myWidgetVisibleChangedEmitter = new Emitter(); // Signature: listener(widgetVisible)\r\n this._myPinChangedEmitter = new Emitter(); // Signature: listener(pinned)\r\n\r\n this._myUnhoverCallbacks = [];\r\n\r\n this._myDestroyed = false;\r\n }\r\n\r\n getWidgetObject() {\r\n return this._myUI.myWidgetObject;\r\n }\r\n\r\n setVisible(visible) {\r\n this._myWidgetVisible = !visible;\r\n this._toggleVisibility(false, true);\r\n }\r\n\r\n isVisible() {\r\n return this._myWidgetVisible;\r\n }\r\n\r\n toggleVisibility() {\r\n this._toggleVisibility(false, true);\r\n }\r\n\r\n togglePin() {\r\n this._togglePin(false);\r\n }\r\n\r\n registerWidgetVisibleChangedEventListener(id, listener) {\r\n this._myWidgetVisibleChangedEmitter.add(listener, { id: id });\r\n }\r\n\r\n unregisterWidgetVisibleChangedEventListener(id) {\r\n this._myWidgetVisibleChangedEmitter.remove(id);\r\n }\r\n\r\n registerPinChangedEventListener(id, listener) {\r\n this._myPinChangedEmitter.add(listener, { id: id });\r\n }\r\n\r\n unregisterPinChangedEventListener(id) {\r\n this._myPinChangedEmitter.remove(id);\r\n }\r\n\r\n start(parentObject, params) {\r\n this._myParams = params;\r\n\r\n this._myUI.build(parentObject, this._myConfig, params);\r\n this._myUI.setVisibilityButtonVisible(params.myShowVisibilityButton);\r\n this._myShowVisibilityButton = params.myShowVisibilityButton;\r\n if (!params.myShowOnStart) {\r\n this._toggleVisibility(false, false);\r\n }\r\n\r\n this._addListeners();\r\n }\r\n\r\n update(dt) {\r\n this._myUI.update(dt);\r\n }\r\n\r\n _addListeners() {\r\n let ui = this._myUI;\r\n\r\n this._myUnhoverCallbacks = [];\r\n\r\n ui.myPinButtonCursorTargetComponent.onClick.add(this._togglePin.bind(this, true));\r\n ui.myPinButtonCursorTargetComponent.onHover.add(this._genericHover.bind(this, ui.myPinButtonBackgroundComponent.material));\r\n ui.myPinButtonCursorTargetComponent.onUnhover.add(this._pinUnhover.bind(this, ui.myPinButtonBackgroundComponent.material));\r\n\r\n this._myUnhoverCallbacks.push(this._pinUnhover.bind(this, ui.myPinButtonBackgroundComponent.material));\r\n\r\n ui.myVisibilityButtonCursorTargetComponent.onClick.add(this._toggleVisibility.bind(this, true, true));\r\n ui.myVisibilityButtonCursorTargetComponent.onHover.add(this._genericHover.bind(this, ui.myVisibilityButtonBackgroundComponent.material));\r\n ui.myVisibilityButtonCursorTargetComponent.onUnhover.add(this._visibilityUnhover.bind(this, ui.myVisibilityButtonBackgroundComponent.material));\r\n\r\n this._myUnhoverCallbacks.push(this._visibilityUnhover.bind(this, ui.myVisibilityButtonBackgroundComponent.material));\r\n }\r\n\r\n _toggleVisibility(isButton, notify) {\r\n this._myWidgetVisible = !this._myWidgetVisible;\r\n\r\n this._myUI.setWidgetVisible(this._myWidgetVisible);\r\n\r\n for (const unhoverCallback of this._myUnhoverCallbacks) {\r\n unhoverCallback();\r\n }\r\n\r\n let textMaterial = this._myUI.myVisibilityButtonTextComponent.material;\r\n let backgroundMaterial = this._myUI.myVisibilityButtonBackgroundComponent.material;\r\n if (this._myWidgetVisible) {\r\n textMaterial.color = this._myConfig.myDefaultTextColor;\r\n if (!isButton) {\r\n backgroundMaterial.color = this._myConfig.myBackgroundColor;\r\n }\r\n } else {\r\n textMaterial.color = this._myConfig.myButtonDisabledTextColor;\r\n if (!isButton) {\r\n backgroundMaterial.color = this._myConfig.myButtonDisabledBackgroundColor;\r\n }\r\n }\r\n\r\n if (notify) {\r\n this._myWidgetVisibleChangedEmitter.notify(this._myWidgetVisible);\r\n }\r\n\r\n this._myUI.setVisibilityButtonVisible(this._myShowVisibilityButton);\r\n }\r\n\r\n _togglePin(isButton) {\r\n if (this._myWidgetVisible) {\r\n this._myPinned = !this._myPinned;\r\n\r\n this._myUI.setPinned(this._myPinned);\r\n\r\n let textMaterial = this._myUI.myPinButtonTextComponent.material;\r\n let backgroundMaterial = this._myUI.myPinButtonBackgroundComponent.material;\r\n if (this._myPinned) {\r\n textMaterial.color = this._myConfig.myDefaultTextColor;\r\n if (!isButton) {\r\n backgroundMaterial.color = this._myConfig.myBackgroundColor;\r\n }\r\n } else {\r\n textMaterial.color = this._myConfig.myButtonDisabledTextColor;\r\n if (!isButton) {\r\n backgroundMaterial.color = this._myConfig.myButtonDisabledBackgroundColor;\r\n }\r\n }\r\n\r\n this._myPinChangedEmitter.notify(this._myPinned);\r\n }\r\n }\r\n\r\n _genericHover(material) {\r\n material.color = this._myConfig.myButtonHoverColor;\r\n }\r\n\r\n _visibilityUnhover(material) {\r\n if (this._myWidgetVisible) {\r\n material.color = this._myConfig.myBackgroundColor;\r\n } else {\r\n material.color = this._myConfig.myButtonDisabledBackgroundColor;\r\n }\r\n }\r\n\r\n _pinUnhover(material) {\r\n if (this._myPinned) {\r\n material.color = this._myConfig.myBackgroundColor;\r\n } else {\r\n material.color = this._myConfig.myButtonDisabledBackgroundColor;\r\n }\r\n }\r\n\r\n setActive(active) {\r\n this._myUI.setActive(active);\r\n }\r\n\r\n destroy() {\r\n this._myDestroyed = true;\r\n\r\n this.setActive(false);\r\n\r\n if (this._myUI != null) {\r\n this._myUI.destroy();\r\n }\r\n }\r\n\r\n isDestroyed() {\r\n return this._myDestroyed;\r\n }\r\n}", "import { Alignment, Collider, VerticalAlignment } from \"@wonderlandengine/api\";\r\nimport { quat_create, vec3_create, vec4_create } from \"../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { ToolHandedness, ToolInputSourceType } from \"../cauldron/tool_types.js\";\r\n\r\nexport class WidgetFrameConfig {\r\n\r\n constructor(widgetLetterID, buttonsColumnIndex) {\r\n\r\n this._setupBuildConfig(widgetLetterID, buttonsColumnIndex);\r\n this._setupRuntimeConfig();\r\n }\r\n\r\n _setupBuildConfig(widgetLetterID, buttonsColumnIndex) {\r\n // General\r\n this.myBackgroundColor = vec4_create(46 / 255, 46 / 255, 46 / 255, 1);\r\n\r\n this.myCursorTargetCollisionCollider = Collider.Box;\r\n this.myCursorTargetCollisionGroup = 7; // Keep this in sync with Tool Cursor\r\n this.myCursorTargetCollisionThickness = 0.001;\r\n\r\n this.myDefaultTextColor = vec4_create(255 / 255, 255 / 255, 255 / 255, 1);\r\n\r\n this.myTextAlignment = Alignment.Center;\r\n this.myTextVerticalAlignment = VerticalAlignment.Middle;\r\n this.myTextColor = this.myDefaultTextColor;\r\n\r\n this.myButtonTextScale = vec3_create(0.18, 0.18, 0.18);\r\n\r\n this.myVisibilityButtonBackgroundScale = vec3_create(0.015, 0.015, 1);\r\n this.myVisibilityButtonTextPosition = vec3_create(0, 0, 0.007);\r\n this.myVisibilityButtonTextScale = this.myButtonTextScale;\r\n\r\n let distanceBetweenToolsVisibilityButtons = 0.01;\r\n let buttonXOffset = this.myVisibilityButtonBackgroundScale[0] * (2 * buttonsColumnIndex) + distanceBetweenToolsVisibilityButtons * buttonsColumnIndex;\r\n\r\n this.myVisibilityButtonPosition = [];\r\n this.myVisibilityButtonPosition[ToolHandedness.NONE] = {};\r\n this.myVisibilityButtonPosition[ToolHandedness.NONE].myPosition = vec3_create(-0.3 + buttonXOffset, -0.205, 0.035);\r\n\r\n this.myVisibilityButtonPosition[ToolHandedness.LEFT] = {};\r\n this.myVisibilityButtonPosition[ToolHandedness.LEFT].myPosition = vec3_create(-0.2 + buttonXOffset, 0.025, 0.015);\r\n\r\n this.myVisibilityButtonPosition[ToolHandedness.RIGHT] = {};\r\n this.myVisibilityButtonPosition[ToolHandedness.RIGHT].myPosition = vec3_create(0.2 - buttonXOffset, 0.025, 0.015);\r\n\r\n this.myVisibilityButtonText = widgetLetterID;\r\n\r\n this.myVisibilityButtonCursorTargetPosition = vec3_create(0, 0, 0);\r\n this.myVisibilityButtonCursorTargetPosition[2] = this.myVisibilityButtonTextPosition[2];\r\n this.myVisibilityButtonCollisionExtents = this.myVisibilityButtonBackgroundScale.pp_clone();\r\n this.myVisibilityButtonCollisionExtents[2] = this.myCursorTargetCollisionThickness;\r\n\r\n this.myFlagButtonBackgroundScale = vec3_create(0.0125, 0.0125, 1);\r\n this.myFlagButtonTextPosition = vec3_create(0, 0, 0.007);\r\n this.myFlagButtonTextScale = vec3_create(0.15, 0.15, 0.15);\r\n\r\n let distanceBetweenFlagButtons = 0.0075;\r\n let pinFlagIndex = 0;\r\n let pinButtonYOffset = this.myVisibilityButtonBackgroundScale[1] + this.myFlagButtonBackgroundScale[1] + distanceBetweenFlagButtons +\r\n this.myFlagButtonBackgroundScale[1] * (2 * pinFlagIndex) + distanceBetweenFlagButtons * pinFlagIndex;\r\n\r\n this.myPinButtonPosition = [];\r\n this.myPinButtonPosition[ToolHandedness.NONE] = {};\r\n this.myPinButtonPosition[ToolHandedness.NONE].myPosition = this.myVisibilityButtonPosition[ToolHandedness.NONE].myPosition.pp_clone();\r\n this.myPinButtonPosition[ToolHandedness.NONE].myPosition[1] += pinButtonYOffset;\r\n\r\n this.myPinButtonPosition[ToolHandedness.LEFT] = {};\r\n this.myPinButtonPosition[ToolHandedness.LEFT].myPosition = this.myVisibilityButtonPosition[ToolHandedness.LEFT].myPosition.pp_clone();\r\n this.myPinButtonPosition[ToolHandedness.LEFT].myPosition[1] += pinButtonYOffset;\r\n\r\n this.myPinButtonPosition[ToolHandedness.RIGHT] = {};\r\n this.myPinButtonPosition[ToolHandedness.RIGHT].myPosition = this.myVisibilityButtonPosition[ToolHandedness.RIGHT].myPosition.pp_clone();\r\n this.myPinButtonPosition[ToolHandedness.RIGHT].myPosition[1] += pinButtonYOffset;\r\n\r\n this.myPinButtonText = \"P\";\r\n\r\n this.myPinButtonCursorTargetPosition = vec3_create(0, 0, 0);\r\n this.myPinButtonCursorTargetPosition[2] = this.myFlagButtonTextPosition[2];\r\n this.myPinButtonCollisionExtents = this.myFlagButtonBackgroundScale.pp_clone();\r\n this.myPinButtonCollisionExtents[2] = this.myCursorTargetCollisionThickness;\r\n }\r\n\r\n _setupRuntimeConfig() {\r\n this._initializeObjectsTransforms();\r\n\r\n this.myButtonHoverColor = vec4_create(150 / 255, 150 / 255, 150 / 255, 1);\r\n this.myButtonDisabledTextColor = this.myBackgroundColor;\r\n this.myButtonDisabledBackgroundColor = vec4_create(110 / 255, 110 / 255, 110 / 255, 1);\r\n }\r\n\r\n _initializeObjectsTransforms() {\r\n this.myPivotObjectTransforms = this._createDefaultObjectTransforms();\r\n\r\n this.myPivotObjectTransforms[ToolInputSourceType.GAMEPAD][ToolHandedness.LEFT].myRotation = quat_create(-0.645, 0.425, 0.25, 0.584);\r\n this.myPivotObjectTransforms[ToolInputSourceType.GAMEPAD][ToolHandedness.LEFT].myRotation.quat_normalize(this.myPivotObjectTransforms[ToolInputSourceType.GAMEPAD][ToolHandedness.LEFT].myRotation);\r\n\r\n this.myPivotObjectTransforms[ToolInputSourceType.GAMEPAD][ToolHandedness.RIGHT].myRotation = quat_create(-0.645, -0.425, -0.25, 0.584);\r\n this.myPivotObjectTransforms[ToolInputSourceType.GAMEPAD][ToolHandedness.RIGHT].myRotation.quat_normalize(this.myPivotObjectTransforms[ToolInputSourceType.GAMEPAD][ToolHandedness.RIGHT].myRotation);\r\n\r\n this.myPivotObjectTransforms[ToolInputSourceType.TRACKED_HAND][ToolHandedness.LEFT].myRotation = quat_create(-0.645, 0.425, 0.25, 0.584);\r\n this.myPivotObjectTransforms[ToolInputSourceType.TRACKED_HAND][ToolHandedness.LEFT].myRotation.quat_normalize(this.myPivotObjectTransforms[ToolInputSourceType.GAMEPAD][ToolHandedness.LEFT].myRotation);\r\n\r\n this.myPivotObjectTransforms[ToolInputSourceType.TRACKED_HAND][ToolHandedness.RIGHT].myRotation = quat_create(-0.645, -0.425, -0.25, 0.584);\r\n this.myPivotObjectTransforms[ToolInputSourceType.TRACKED_HAND][ToolHandedness.RIGHT].myRotation.quat_normalize(this.myPivotObjectTransforms[ToolInputSourceType.GAMEPAD][ToolHandedness.RIGHT].myRotation);\r\n\r\n /*\r\n this.myPivotObjectTransforms[ToolInputSourceType.TRACKED_HAND][ToolHandedness.LEFT].myPosition = vec3_create(-0.04, 0.045, -0.055);\r\n this.myPivotObjectTransforms[ToolInputSourceType.TRACKED_HAND][ToolHandedness.LEFT].myRotation = quat_create(0, 0.536, -0.43, 0.727);\r\n this.myPivotObjectTransforms[ToolInputSourceType.TRACKED_HAND][ToolHandedness.LEFT].myRotation.quat_normalize(this.myPivotObjectTransforms[ToolInputSourceType.TRACKED_HAND][ToolHandedness.LEFT].myRotation);\r\n\r\n this.myPivotObjectTransforms[ToolInputSourceType.TRACKED_HAND][ToolHandedness.RIGHT].myPosition = vec3_create(0.04, 0.045, -0.055);\r\n this.myPivotObjectTransforms[ToolInputSourceType.TRACKED_HAND][ToolHandedness.RIGHT].myRotation = quat_create(0, -0.536, 0.43, 0.727);\r\n this.myPivotObjectTransforms[ToolInputSourceType.TRACKED_HAND][ToolHandedness.RIGHT].myRotation.quat_normalize(this.myPivotObjectTransforms[ToolInputSourceType.TRACKED_HAND][ToolHandedness.RIGHT].myRotation);\r\n */\r\n\r\n this.myWidgetObjectTransforms = this._createDefaultObjectTransforms();\r\n\r\n this.myWidgetObjectTransforms[ToolInputSourceType.GAMEPAD][ToolHandedness.LEFT].myPosition = vec3_create(0.1, 0.23, -0.02);\r\n this.myWidgetObjectTransforms[ToolInputSourceType.GAMEPAD][ToolHandedness.RIGHT].myPosition = vec3_create(0.07, 0.23, -0.02);\r\n\r\n this.myWidgetObjectTransforms[ToolInputSourceType.TRACKED_HAND][ToolHandedness.LEFT].myPosition = vec3_create(0.1, 0.23, -0.02);\r\n this.myWidgetObjectTransforms[ToolInputSourceType.TRACKED_HAND][ToolHandedness.RIGHT].myPosition = vec3_create(0.07, 0.23, -0.02);\r\n\r\n this._myPivotObjectDistanceFromHeadNonXR = 0.6;\r\n }\r\n\r\n _createDefaultObjectTransforms() {\r\n let defaultObjectTransforms = [];\r\n\r\n for (let inputSourceTypeKey in ToolInputSourceType) {\r\n let inputSourceType = ToolInputSourceType[inputSourceTypeKey];\r\n defaultObjectTransforms[inputSourceType] = [];\r\n for (let handednessKey in ToolHandedness) {\r\n let handedness = ToolHandedness[handednessKey];\r\n defaultObjectTransforms[inputSourceType][handedness] = {};\r\n defaultObjectTransforms[inputSourceType][handedness].myPosition = vec3_create(0, 0, 0);\r\n defaultObjectTransforms[inputSourceType][handedness].myRotation = quat_create(0, 0, 0, 1);\r\n }\r\n }\r\n\r\n return defaultObjectTransforms;\r\n }\r\n}", "import { CollisionComponent, MeshComponent, TextComponent } from \"@wonderlandengine/api\";\r\nimport { CursorTarget } from \"@wonderlandengine/components\";\r\nimport { XRUtils } from \"../../cauldron/utils/xr_utils.js\";\r\nimport { vec3_create } from \"../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Globals } from \"../../pp/globals.js\";\r\nimport { ToolHandedness, ToolInputSourceType } from \"../cauldron/tool_types.js\";\r\n\r\nexport class WidgetFrameUI {\r\n\r\n constructor(engine = Globals.getMainEngine()) {\r\n this._myInputSourceType = null;\r\n\r\n this._myParentObject = null;\r\n this._myPinned = false;\r\n\r\n this._myWidgetVisible = true;\r\n this._myVisibilityButtonVisible = true;\r\n\r\n this._myEngine = engine;\r\n\r\n this._myActive = false;\r\n this._myDestroyed = false;\r\n }\r\n\r\n build(parentObject, config, params) {\r\n this._myParentObject = parentObject;\r\n this._myConfig = config;\r\n this._myParams = params;\r\n this._myPlaneMesh = Globals.getDefaultMeshes(this._myEngine).myDoubleSidedPlane;\r\n\r\n this._createSkeleton();\r\n this._setTransforms();\r\n this._addComponents();\r\n\r\n this._setTransformForNonXR();\r\n\r\n this.setActive(true);\r\n }\r\n\r\n setWidgetVisible(visible) {\r\n this._myWidgetVisible = visible;\r\n this.myFlagsButtonPanel.pp_setActive(visible);\r\n if (visible) {\r\n this._updateObjectsTransforms(true);\r\n }\r\n }\r\n\r\n setVisibilityButtonVisible(visible) {\r\n this._myVisibilityButtonVisible = visible;\r\n this.myVisibilityButtonPanel.pp_setActive(visible);\r\n }\r\n\r\n setPinned(pinned) {\r\n if (pinned != this._myPinned) {\r\n this._myPinned = pinned;\r\n if (this._myPinned) {\r\n this.myPivotObject.pp_setParent(Globals.getSceneObjects(this._myEngine).myTools);\r\n } else {\r\n this.myPivotObject.pp_setParent(this.myFixForwardObject);\r\n\r\n if (!XRUtils.isSessionActive(this._myEngine)) {\r\n this._setTransformForNonXR();\r\n }\r\n\r\n this._updateObjectsTransforms(true);\r\n }\r\n }\r\n }\r\n\r\n update(dt) {\r\n this._updateObjectsTransforms(false);\r\n }\r\n\r\n _updateObjectsTransforms(forceRefreshObjectsTransforms) {\r\n if (XRUtils.isSessionActive(this._myEngine)) {\r\n let inputSourceType = Globals.getHandPoses(this._myEngine)[this._myParams.myHandedness].getInputSourceType();\r\n\r\n if (inputSourceType != this._myInputSourceType || forceRefreshObjectsTransforms) {\r\n this._myInputSourceType = inputSourceType;\r\n\r\n if (!this._myPinned) {\r\n this.myPivotObject.pp_setPositionLocal(this._myConfig.myPivotObjectTransforms[this._myInputSourceType][this._myParams.myHandedness].myPosition);\r\n this.myPivotObject.pp_resetRotationLocal();\r\n this.myPivotObject.pp_rotateObjectQuat(this._myConfig.myPivotObjectTransforms[this._myInputSourceType][this._myParams.myHandedness].myRotation);\r\n\r\n this.myWidgetObject.pp_setPositionLocal(this._myConfig.myWidgetObjectTransforms[this._myInputSourceType][this._myParams.myHandedness].myPosition);\r\n this.myWidgetObject.pp_resetRotationLocal();\r\n this.myWidgetObject.pp_rotateObjectQuat(this._myConfig.myWidgetObjectTransforms[this._myInputSourceType][this._myParams.myHandedness].myRotation);\r\n\r\n this.myVisibilityButtonPanel.pp_setPositionLocal(this._myConfig.myVisibilityButtonPosition[this._myParams.myHandedness].myPosition);\r\n this.myPinButtonPanel.pp_setPositionLocal(this._myConfig.myPinButtonPosition[this._myParams.myHandedness].myPosition);\r\n }\r\n }\r\n } else {\r\n this.myVisibilityButtonPanel.pp_setActive(this._myWidgetVisible || this._myVisibilityButtonVisible);\r\n }\r\n }\r\n\r\n // Skeleton\r\n _createSkeleton() {\r\n this.myFixForwardObject = this._myParentObject.pp_addChild();\r\n\r\n if (Globals.isPoseForwardFixed(this._myEngine)) {\r\n this.myFixForwardObject.pp_rotateObject(vec3_create(0, 180, 0));\r\n }\r\n\r\n this.myPivotObject = this.myFixForwardObject.pp_addChild();\r\n this.myWidgetObject = this.myPivotObject.pp_addChild();\r\n\r\n this.myVisibilityButtonPanel = this.myPivotObject.pp_addChild();\r\n this.myVisibilityButtonBackground = this.myVisibilityButtonPanel.pp_addChild();\r\n this.myVisibilityButtonText = this.myVisibilityButtonPanel.pp_addChild();\r\n this.myVisibilityButtonCursorTarget = this.myVisibilityButtonPanel.pp_addChild();\r\n\r\n this.myFlagsButtonPanel = this.myPivotObject.pp_addChild();\r\n\r\n this.myPinButtonPanel = this.myFlagsButtonPanel.pp_addChild();\r\n this.myPinButtonBackground = this.myPinButtonPanel.pp_addChild();\r\n this.myPinButtonText = this.myPinButtonPanel.pp_addChild();\r\n this.myPinButtonCursorTarget = this.myPinButtonPanel.pp_addChild();\r\n\r\n this.myNonXRParentObject = Globals.getPlayerObjects(this._myEngine).myCameraNonXR.pp_addChild();\r\n this.myNonXRParentObject.pp_translateLocal(vec3_create(0, 0, -this._myConfig._myPivotObjectDistanceFromHeadNonXR));\r\n this.myNonXRParentObject.pp_lookToLocal(vec3_create(0, 0, 1), vec3_create(0, 1, 0));\r\n\r\n }\r\n\r\n // Transforms\r\n _setTransforms() {\r\n this.myPivotObject.pp_markDirty();\r\n\r\n this.myVisibilityButtonPanel.pp_setPositionLocal(this._myConfig.myVisibilityButtonPosition[this._myParams.myHandedness].myPosition);\r\n this.myVisibilityButtonBackground.pp_scaleObject(this._myConfig.myVisibilityButtonBackgroundScale);\r\n this.myVisibilityButtonText.pp_setPositionLocal(this._myConfig.myVisibilityButtonTextPosition);\r\n this.myVisibilityButtonText.pp_scaleObject(this._myConfig.myVisibilityButtonTextScale);\r\n this.myVisibilityButtonCursorTarget.pp_setPositionLocal(this._myConfig.myVisibilityButtonCursorTargetPosition);\r\n\r\n this.myPinButtonPanel.pp_setPositionLocal(this._myConfig.myPinButtonPosition[this._myParams.myHandedness].myPosition);\r\n\r\n this.myPinButtonBackground.pp_scaleObject(this._myConfig.myFlagButtonBackgroundScale);\r\n this.myPinButtonText.pp_setPositionLocal(this._myConfig.myFlagButtonTextPosition);\r\n this.myPinButtonText.pp_scaleObject(this._myConfig.myFlagButtonTextScale);\r\n this.myPinButtonCursorTarget.pp_setPositionLocal(this._myConfig.myPinButtonCursorTargetPosition);\r\n }\r\n\r\n // Components\r\n _addComponents() {\r\n this.myVisibilityButtonBackgroundComponent = this.myVisibilityButtonBackground.pp_addComponent(MeshComponent);\r\n this.myVisibilityButtonBackgroundComponent.mesh = this._myPlaneMesh;\r\n this.myVisibilityButtonBackgroundComponent.material = this._myParams.myPlaneMaterial.clone();\r\n this.myVisibilityButtonBackgroundComponent.material.color = this._myConfig.myBackgroundColor;\r\n\r\n this.myVisibilityButtonTextComponent = this.myVisibilityButtonText.pp_addComponent(TextComponent);\r\n this._setupButtonTextComponent(this.myVisibilityButtonTextComponent);\r\n this.myVisibilityButtonTextComponent.text = this._myConfig.myVisibilityButtonText;\r\n\r\n this.myVisibilityButtonCursorTargetComponent = this.myVisibilityButtonCursorTarget.pp_addComponent(CursorTarget);\r\n this.myVisibilityButtonCollisionComponent = this.myVisibilityButtonCursorTarget.pp_addComponent(CollisionComponent);\r\n this.myVisibilityButtonCollisionComponent.collider = this._myConfig.myCursorTargetCollisionCollider;\r\n this.myVisibilityButtonCollisionComponent.group = 1 << this._myConfig.myCursorTargetCollisionGroup;\r\n this.myVisibilityButtonCollisionComponent.extents = this._myConfig.myVisibilityButtonCollisionExtents;\r\n\r\n this.myPinButtonBackgroundComponent = this.myPinButtonBackground.pp_addComponent(MeshComponent);\r\n this.myPinButtonBackgroundComponent.mesh = this._myPlaneMesh;\r\n this.myPinButtonBackgroundComponent.material = this._myParams.myPlaneMaterial.clone();\r\n this.myPinButtonBackgroundComponent.material.color = this._myConfig.myButtonDisabledBackgroundColor;\r\n\r\n this.myPinButtonTextComponent = this.myPinButtonText.pp_addComponent(TextComponent);\r\n this._setupButtonTextComponent(this.myPinButtonTextComponent);\r\n this.myPinButtonTextComponent.material.color = this._myConfig.myButtonDisabledTextColor;\r\n this.myPinButtonTextComponent.text = this._myConfig.myPinButtonText;\r\n\r\n this.myPinButtonCursorTargetComponent = this.myPinButtonCursorTarget.pp_addComponent(CursorTarget);\r\n\r\n this.myPinButtonCollisionComponent = this.myPinButtonCursorTarget.pp_addComponent(CollisionComponent);\r\n this.myPinButtonCollisionComponent.collider = this._myConfig.myCursorTargetCollisionCollider;\r\n this.myPinButtonCollisionComponent.group = 1 << this._myConfig.myCursorTargetCollisionGroup;\r\n this.myPinButtonCollisionComponent.extents = this._myConfig.myPinButtonCollisionExtents;\r\n }\r\n\r\n _setupButtonTextComponent(textComponent) {\r\n textComponent.alignment = this._myConfig.myTextAlignment;\r\n textComponent.verticalAlignment = this._myConfig.myTextVerticalAlignment;\r\n textComponent.material = this._myParams.myTextMaterial.clone();\r\n textComponent.material.color = this._myConfig.myTextColor;\r\n textComponent.text = \"\";\r\n }\r\n\r\n _onXRSessionStart() {\r\n this.myVisibilityButtonPanel.pp_setActive(this._myVisibilityButtonVisible);\r\n\r\n this._setTransformForXR();\r\n }\r\n\r\n _onXRSessionEnd() {\r\n this._setTransformForNonXR();\r\n }\r\n\r\n _setTransformForXR() {\r\n this.myFixForwardObject.pp_setParent(this._myParentObject);\r\n\r\n this.myFixForwardObject.pp_resetTransformLocal();\r\n\r\n if (Globals.isPoseForwardFixed(this._myEngine)) {\r\n this.myFixForwardObject.pp_rotateObject(vec3_create(0, 180, 0));\r\n }\r\n\r\n this._updateObjectsTransforms(true);\r\n }\r\n\r\n _setTransformForNonXR() {\r\n if (!this._myPinned) {\r\n this.myFixForwardObject.pp_setParent(this.myNonXRParentObject);\r\n this.myFixForwardObject.pp_resetTransformLocal();\r\n\r\n this.myPivotObject.pp_setPositionLocal(this._myConfig.myPivotObjectTransforms[ToolInputSourceType.NONE][ToolHandedness.NONE].myPosition);\r\n this.myPivotObject.pp_resetRotationLocal();\r\n this.myPivotObject.pp_rotateObjectQuat(this._myConfig.myPivotObjectTransforms[ToolInputSourceType.NONE][ToolHandedness.NONE].myRotation);\r\n\r\n this.myWidgetObject.pp_setPositionLocal(this._myConfig.myWidgetObjectTransforms[ToolInputSourceType.NONE][ToolHandedness.NONE].myPosition);\r\n this.myWidgetObject.pp_resetRotationLocal();\r\n this.myWidgetObject.pp_rotateObjectQuat(this._myConfig.myWidgetObjectTransforms[ToolInputSourceType.NONE][ToolHandedness.NONE].myRotation);\r\n\r\n this.myVisibilityButtonPanel.pp_setPositionLocal(this._myConfig.myVisibilityButtonPosition[ToolHandedness.NONE].myPosition);\r\n this.myPinButtonPanel.pp_setPositionLocal(this._myConfig.myPinButtonPosition[ToolHandedness.NONE].myPosition);\r\n }\r\n }\r\n\r\n setActive(active) {\r\n if (this._myActive != active) {\r\n this._myActive = active;\r\n\r\n if (this._myActive) {\r\n XRUtils.registerSessionStartEndEventListeners(this, this._onXRSessionStart.bind(this), this._onXRSessionEnd.bind(this), true, false, this._myEngine);\r\n } else {\r\n XRUtils.unregisterSessionStartEndEventListeners(this, this._myEngine);\r\n }\r\n }\r\n }\r\n\r\n destroy() {\r\n this._myDestroyed = true;\r\n\r\n this.setActive(false);\r\n }\r\n\r\n isDestroyed() {\r\n return this._myDestroyed;\r\n }\r\n}", "import { GamepadAxesID, GamepadButtonID } from \"../../input/gamepad/gamepad_buttons.js\";\r\nimport { vec2_create } from \"../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Globals } from \"../../pp/globals.js\";\r\nimport { ToolHandedness } from \"../cauldron/tool_types.js\";\r\nimport { WidgetFrame, WidgetParams } from \"../widget_frame/widget_frame.js\";\r\nimport { ConsoleOriginalFunctions } from \"./console_original_functions.js\";\r\nimport { ConsoleVR } from \"./console_vr.js\";\r\nimport { ConsoleVRWidgetConsoleFunction, ConsoleVRWidgetMessageType, ConsoleVRWidgetPulseOnNewMessage, ConsoleVRWidgetSender, OverrideBrowserConsoleFunctions } from \"./console_vr_types.js\";\r\nimport { ConsoleVRWidgetConfig } from \"./console_vr_widget_config.js\";\r\nimport { ConsoleVRWidgetUI } from \"./console_vr_widget_ui.js\";\r\n\r\nexport class ConsoleVRWidgetParams extends WidgetParams {\r\n\r\n constructor() {\r\n super();\r\n\r\n this.myOverrideBrowserConsoleFunctions = false;\r\n this.myShowOnStart = false;\r\n this.myShowVisibilityButton = false;\r\n this.myPulseOnNewMessage = ConsoleVRWidgetPulseOnNewMessage.NEVER;\r\n\r\n this.myResetToOverwrittenConsoleFunctionsOnDeactivate = false;\r\n this.myResetToConsoleOriginalFunctionsOnDeactivate = true;\r\n\r\n this.myResetToOverwrittenConsoleFunctionsOnDestroy = false;\r\n this.myResetToConsoleOriginalFunctionsOnDestroy = false;\r\n }\r\n}\r\n\r\nexport class ConsoleVRWidgetMessage {\r\n\r\n constructor(messageType, messageLines) {\r\n this.myType = messageType;\r\n this.myLines = messageLines;\r\n\r\n this._myOriginalText = messageLines.join(\"\\n\");\r\n\r\n this._myMessagesCount = 1;\r\n }\r\n\r\n hasSameInfo(message) {\r\n return this._myOriginalText == message._myOriginalText && this.myType == message.myType;\r\n }\r\n\r\n increaseCount() {\r\n this._myMessagesCount += 1;\r\n\r\n let countString = ((\"(x\").concat(this._myMessagesCount)).concat(\") \");\r\n\r\n let text = this._myOriginalText;\r\n text = countString.concat(text);\r\n this.myLines = text.split(\"\\n\");\r\n }\r\n}\r\n\r\n// Does Not Support:\r\n// - Placeholder like %d and other similar kind of way to build strings\r\n//\r\n// Known Issues:\r\n// - Since the actual call to the browser console is done by the widget, u will not be able to click\r\n// on the browser console source code link (usually on the right of the logged message) to go to the line where \r\n// the console function has been called, since it will always go to the line where \r\n// the console VR widget forwards the call to the browser console\r\nexport class ConsoleVRWidget {\r\n\r\n constructor(engine = Globals.getMainEngine()) {\r\n this._myWidgetFrame = new WidgetFrame(\"C\", 0, engine);\r\n this._myWidgetFrame.registerWidgetVisibleChangedEventListener(this, this._widgetVisibleChanged.bind(this));\r\n\r\n this._myConfig = new ConsoleVRWidgetConfig();\r\n this._myParams = null;\r\n\r\n this._myUI = new ConsoleVRWidgetUI(engine);\r\n\r\n this._myMessages = [];\r\n\r\n this._myOldBrowserConsole = [];\r\n this._myOldConsoleVR = [];\r\n\r\n this._myTypeFilters = [];\r\n for (let key in ConsoleVRWidgetMessageType) {\r\n this._myTypeFilters[ConsoleVRWidgetMessageType[key]] = false;\r\n }\r\n\r\n this._myScrollUp = false;\r\n this._myScrollDown = false;\r\n this._myScrollOffset = 0;\r\n this._myScrollTimer = 0;\r\n this._myScrollThumbstickTimer = 0;\r\n\r\n this._myPulseTimer = 0;\r\n\r\n this._myGamepadScrollEnabled = true;\r\n if (this._myConfig.myGamepadScrollOnlyOnHover) {\r\n this._myGamepadScrollEnabled = false;\r\n }\r\n\r\n this._myErrorEventListener = null;\r\n this._myUnhandledRejectionEventListener = null;\r\n\r\n this._myConsolePrintAddMessageEnabled = true;\r\n this._myConsolePrintAddMessageEnabledReset = false;\r\n this._myTextDirty = false;\r\n\r\n this._myEngine = engine;\r\n\r\n this._myStarted = false;\r\n this._myActive = true;\r\n this._myVisibleBackup = null;\r\n\r\n this._myUnhoverCallbacks = [];\r\n\r\n this._myDestroyed = false;\r\n }\r\n\r\n setVisible(visible) {\r\n if (this._myActive) {\r\n this._myWidgetFrame.setVisible(visible);\r\n } else {\r\n this._myVisibleBackup = visible;\r\n }\r\n }\r\n\r\n isVisible() {\r\n return this._myWidgetFrame.isVisible();\r\n }\r\n\r\n start(parentObject, params) {\r\n this._myLeftGamepad = Globals.getLeftGamepad(this._myEngine);\r\n this._myRightGamepad = Globals.getRightGamepad(this._myEngine);\r\n\r\n this._myParams = params;\r\n\r\n this._myWidgetFrame.start(parentObject, params);\r\n\r\n this._myUI.build(this._myWidgetFrame.getWidgetObject(), this._myConfig, params);\r\n this._myUI.setVisible(this._myWidgetFrame.isVisible());\r\n this._setNotifyIconActive(false);\r\n\r\n this._addListeners();\r\n\r\n this._overrideConsolesFunctions();\r\n\r\n this._myStarted = true;\r\n }\r\n\r\n update(dt) {\r\n if (!this._myActive) return;\r\n\r\n if (this._myConsolePrintAddMessageEnabledReset) {\r\n this._myConsolePrintAddMessageEnabledReset = false;\r\n this._myConsolePrintAddMessageEnabled = true;\r\n }\r\n\r\n this._myWidgetFrame.update(dt);\r\n\r\n if (this._myWidgetFrame.isVisible()) {\r\n if (this._myTextDirty) {\r\n this._updateAllTexts();\r\n }\r\n\r\n this._updateScroll(dt);\r\n }\r\n\r\n this._updateGamepadsExtraActions(dt);\r\n }\r\n\r\n isActive() {\r\n return this._myActive;\r\n }\r\n\r\n setActive(active) {\r\n if (!this._myStarted) return;\r\n\r\n this._myUI.setActive(active);\r\n this._myWidgetFrame.setActive(active);\r\n\r\n if (this._myActive != active) {\r\n if (active) {\r\n this._myActive = active;\r\n if (this._myVisibleBackup != null) {\r\n this.setVisible(false);\r\n this.setVisible(this._myVisibleBackup);\r\n\r\n this._myVisibleBackup = null;\r\n }\r\n } else {\r\n if (this._myVisibleBackup == null) {\r\n this._myVisibleBackup = this.isVisible();\r\n }\r\n\r\n if (this.isVisible()) {\r\n this.setVisible(false);\r\n }\r\n this._myActive = active;\r\n }\r\n\r\n if (active) {\r\n if (this._myParams.myResetToConsoleOriginalFunctionsOnDeactivate || this._myParams.myResetToOverwrittenConsoleFunctionsOnDeactivate) {\r\n this._overrideConsolesFunctions();\r\n } else {\r\n if (this._myParams.myOverrideBrowserConsoleFunctions != OverrideBrowserConsoleFunctions.NONE) {\r\n window.addEventListener(\"error\", this._myErrorEventListener);\r\n window.addEventListener(\"unhandledrejection\", this._myUnhandledRejectionEventListener);\r\n }\r\n }\r\n } else {\r\n window.removeEventListener(\"error\", this._myErrorEventListener);\r\n window.removeEventListener(\"unhandledrejection\", this._myUnhandledRejectionEventListener);\r\n\r\n if (this._myParams.myResetToConsoleOriginalFunctionsOnDeactivate) {\r\n console.log = ConsoleOriginalFunctions.getLog(this._myEngine);\r\n console.error = ConsoleOriginalFunctions.getError(this._myEngine);\r\n console.warn = ConsoleOriginalFunctions.getWarn(this._myEngine);\r\n console.info = ConsoleOriginalFunctions.getInfo(this._myEngine);\r\n console.debug = ConsoleOriginalFunctions.getDebug(this._myEngine);\r\n console.assert = ConsoleOriginalFunctions.getAssert(this._myEngine);\r\n console.clear = ConsoleOriginalFunctions.getClear(this._myEngine);\r\n\r\n if (Globals.getConsoleVR(this._myEngine) != null) {\r\n Globals.getConsoleVR(this._myEngine).log = ConsoleVR.myOriginalLog;\r\n Globals.getConsoleVR(this._myEngine).error = ConsoleVR.myOriginalError;\r\n Globals.getConsoleVR(this._myEngine).warn = ConsoleVR.myOriginalWarn;\r\n Globals.getConsoleVR(this._myEngine).info = ConsoleVR.myOriginalInfo;\r\n Globals.getConsoleVR(this._myEngine).debug = ConsoleVR.myOriginalDebug;\r\n Globals.getConsoleVR(this._myEngine).assert = ConsoleVR.myOriginalAssert;\r\n Globals.getConsoleVR(this._myEngine).clear = ConsoleVR.myOriginalClear;\r\n }\r\n } else if (this._myParams.myResetToOverwrittenConsoleFunctionsOnDeactivate) {\r\n console.log = this._myOldBrowserConsole[ConsoleVRWidgetConsoleFunction.LOG];\r\n console.error = this._myOldBrowserConsole[ConsoleVRWidgetConsoleFunction.ERROR];\r\n console.warn = this._myOldBrowserConsole[ConsoleVRWidgetConsoleFunction.WARN];\r\n console.info = this._myOldBrowserConsole[ConsoleVRWidgetConsoleFunction.INFO];\r\n console.debug = this._myOldBrowserConsole[ConsoleVRWidgetConsoleFunction.DEBUG];\r\n console.assert = this._myOldBrowserConsole[ConsoleVRWidgetConsoleFunction.ASSERT];\r\n console.clear = this._myOldBrowserConsoleClear;\r\n\r\n if (Globals.getConsoleVR(this._myEngine) != null) {\r\n Globals.getConsoleVR(this._myEngine).log = this._myOldConsoleVR[ConsoleVRWidgetConsoleFunction.LOG];\r\n Globals.getConsoleVR(this._myEngine).error = this._myOldConsoleVR[ConsoleVRWidgetConsoleFunction.ERROR];\r\n Globals.getConsoleVR(this._myEngine).warn = this._myOldConsoleVR[ConsoleVRWidgetConsoleFunction.WARN];\r\n Globals.getConsoleVR(this._myEngine).info = this._myOldConsoleVR[ConsoleVRWidgetConsoleFunction.INFO];\r\n Globals.getConsoleVR(this._myEngine).debug = this._myOldConsoleVR[ConsoleVRWidgetConsoleFunction.DEBUG];\r\n Globals.getConsoleVR(this._myEngine).assert = this._myOldConsoleVR[ConsoleVRWidgetConsoleFunction.ASSERT];\r\n Globals.getConsoleVR(this._myEngine).clear = this._myOldConsoleVRClear;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n // This must be done only when all the setup is complete, to avoid issues with other part of the code calling the console and then triggering the console vr while not ready yet\r\n _overrideConsolesFunctions() {\r\n this._myOldBrowserConsole[ConsoleVRWidgetConsoleFunction.LOG] = console.log;\r\n this._myOldBrowserConsole[ConsoleVRWidgetConsoleFunction.ERROR] = console.error;\r\n this._myOldBrowserConsole[ConsoleVRWidgetConsoleFunction.WARN] = console.warn;\r\n this._myOldBrowserConsole[ConsoleVRWidgetConsoleFunction.INFO] = console.info;\r\n this._myOldBrowserConsole[ConsoleVRWidgetConsoleFunction.DEBUG] = console.debug;\r\n this._myOldBrowserConsole[ConsoleVRWidgetConsoleFunction.ASSERT] = console.assert;\r\n this._myOldBrowserConsoleClear = console.clear;\r\n\r\n if (this._myParams.myOverrideBrowserConsoleFunctions != OverrideBrowserConsoleFunctions.NONE) {\r\n\r\n if (this._myParams.myOverrideBrowserConsoleFunctions == OverrideBrowserConsoleFunctions.ALL) {\r\n console.log = this._consolePrint.bind(this, ConsoleVRWidgetConsoleFunction.LOG, ConsoleVRWidgetSender.BROWSER_CONSOLE);\r\n }\r\n\r\n console.error = this._consolePrint.bind(this, ConsoleVRWidgetConsoleFunction.ERROR, ConsoleVRWidgetSender.BROWSER_CONSOLE);\r\n console.warn = this._consolePrint.bind(this, ConsoleVRWidgetConsoleFunction.WARN, ConsoleVRWidgetSender.BROWSER_CONSOLE);\r\n\r\n if (this._myParams.myOverrideBrowserConsoleFunctions == OverrideBrowserConsoleFunctions.ALL) {\r\n console.info = this._consolePrint.bind(this, ConsoleVRWidgetConsoleFunction.INFO, ConsoleVRWidgetSender.BROWSER_CONSOLE);\r\n console.debug = this._consolePrint.bind(this, ConsoleVRWidgetConsoleFunction.DEBUG, ConsoleVRWidgetSender.BROWSER_CONSOLE);\r\n }\r\n\r\n console.assert = this._consolePrint.bind(this, ConsoleVRWidgetConsoleFunction.ASSERT, ConsoleVRWidgetSender.BROWSER_CONSOLE);\r\n\r\n console.clear = this._clearConsole.bind(this, true, ConsoleVRWidgetSender.BROWSER_CONSOLE);\r\n\r\n this._myErrorEventListener = function (errorEvent) {\r\n if (errorEvent.error != null) {\r\n this._consolePrint(ConsoleVRWidgetConsoleFunction.ERROR, ConsoleVRWidgetSender.WINDOW, \"Uncaught\", errorEvent.error.stack);\r\n } else {\r\n this._consolePrint(ConsoleVRWidgetConsoleFunction.ERROR, ConsoleVRWidgetSender.WINDOW, \"Uncaught\", errorEvent.message);\r\n }\r\n }.bind(this);\r\n\r\n this._myUnhandledRejectionEventListener = function (errorEvent) {\r\n this._consolePrint(ConsoleVRWidgetConsoleFunction.ERROR, ConsoleVRWidgetSender.WINDOW, \"Uncaught (in promise)\", errorEvent.reason);\r\n }.bind(this);\r\n\r\n window.addEventListener(\"error\", this._myErrorEventListener);\r\n window.addEventListener(\"unhandledrejection\", this._myUnhandledRejectionEventListener);\r\n }\r\n\r\n this._myOldConsoleVR[ConsoleVRWidgetConsoleFunction.LOG] = Globals.getConsoleVR(this._myEngine).log;\r\n this._myOldConsoleVR[ConsoleVRWidgetConsoleFunction.ERROR] = Globals.getConsoleVR(this._myEngine).error;\r\n this._myOldConsoleVR[ConsoleVRWidgetConsoleFunction.WARN] = Globals.getConsoleVR(this._myEngine).warn;\r\n this._myOldConsoleVR[ConsoleVRWidgetConsoleFunction.INFO] = Globals.getConsoleVR(this._myEngine).info;\r\n this._myOldConsoleVR[ConsoleVRWidgetConsoleFunction.DEBUG] = Globals.getConsoleVR(this._myEngine).debug;\r\n this._myOldConsoleVR[ConsoleVRWidgetConsoleFunction.ASSERT] = Globals.getConsoleVR(this._myEngine).assert;\r\n this._myOldConsoleVRClear = Globals.getConsoleVR(this._myEngine).clear;\r\n\r\n Globals.getConsoleVR(this._myEngine).log = this._consolePrint.bind(this, ConsoleVRWidgetConsoleFunction.LOG, ConsoleVRWidgetSender.CONSOLE_VR);\r\n Globals.getConsoleVR(this._myEngine).error = this._consolePrint.bind(this, ConsoleVRWidgetConsoleFunction.ERROR, ConsoleVRWidgetSender.CONSOLE_VR);\r\n Globals.getConsoleVR(this._myEngine).warn = this._consolePrint.bind(this, ConsoleVRWidgetConsoleFunction.WARN, ConsoleVRWidgetSender.CONSOLE_VR);\r\n Globals.getConsoleVR(this._myEngine).info = this._consolePrint.bind(this, ConsoleVRWidgetConsoleFunction.INFO, ConsoleVRWidgetSender.CONSOLE_VR);\r\n Globals.getConsoleVR(this._myEngine).debug = this._consolePrint.bind(this, ConsoleVRWidgetConsoleFunction.DEBUG, ConsoleVRWidgetSender.CONSOLE_VR);\r\n Globals.getConsoleVR(this._myEngine).assert = this._consolePrint.bind(this, ConsoleVRWidgetConsoleFunction.ASSERT, ConsoleVRWidgetSender.CONSOLE_VR);\r\n Globals.getConsoleVR(this._myEngine).clear = this._clearConsole.bind(this, true, ConsoleVRWidgetSender.CONSOLE_VR);\r\n }\r\n\r\n // Text section\r\n\r\n _updateText(messageType) {\r\n let consoleText = \"\";\r\n\r\n if (!this._myTypeFilters[messageType]) {\r\n let linesCount = 0;\r\n let i = this._myMessages.length - 1;\r\n\r\n let scrollLinesToSkip = Math.round(this._myScrollOffset);\r\n\r\n while (i >= 0 && linesCount < this._myConfig.myMaxLines) {\r\n let message = this._myMessages[i];\r\n\r\n // Skip filtered messages\r\n if (this._myTypeFilters[message.myType]) {\r\n i -= 1;\r\n continue;\r\n }\r\n\r\n let messageLines = message.myLines.length;\r\n\r\n // Compute line to skip due to scroll offset\r\n let linesToSkip = 0;\r\n if (scrollLinesToSkip > 0) {\r\n let additionalEmptyLines = 0;\r\n if (i != this._myMessages.length - 1) {\r\n additionalEmptyLines = this._myConfig.myLinesBetweenMessages;\r\n }\r\n\r\n if (scrollLinesToSkip >= messageLines + additionalEmptyLines) { // + empty lines between messages\r\n scrollLinesToSkip -= messageLines + additionalEmptyLines;\r\n linesToSkip = messageLines + additionalEmptyLines;\r\n } else {\r\n linesToSkip = scrollLinesToSkip;\r\n scrollLinesToSkip = 0;\r\n }\r\n }\r\n\r\n // Add empty lines between messages\r\n if (i != this._myMessages.length - 1) {\r\n let emptyLinesToSkip = this._myConfig.myLinesBetweenMessages - Math.max(this._myConfig.myLinesBetweenMessages - linesToSkip, 0);\r\n let emptyLinesToShow = this._myConfig.myLinesBetweenMessages - emptyLinesToSkip;\r\n if (linesCount + emptyLinesToShow > this._myConfig.myMaxLines) {\r\n emptyLinesToShow = this._myMaxLines - linesCount;\r\n }\r\n\r\n for (let j = 0; j < emptyLinesToShow; j++) {\r\n consoleText = (\"\\n\").concat(consoleText);\r\n }\r\n\r\n linesCount += emptyLinesToShow;\r\n linesToSkip -= emptyLinesToSkip;\r\n }\r\n\r\n // Computing the number of message lines to show\r\n let linesToShow = messageLines - linesToSkip;\r\n if (linesCount + linesToShow > this._myConfig.myMaxLines) {\r\n linesToShow = this._myConfig.myMaxLines - linesCount;\r\n }\r\n\r\n if (linesToShow > 0) {\r\n if (message.myType == messageType) {\r\n // If the message is the same type of this message text component, add the message lines\r\n\r\n let linesToPrint = message.myLines.slice(messageLines - linesToShow - linesToSkip, messageLines - linesToSkip);\r\n let text = linesToPrint.join(\"\\n\");\r\n consoleText = (text.concat(\"\\n\")).concat(consoleText);\r\n\r\n linesCount += linesToShow;\r\n } else {\r\n // Otherwise add empty lines, so that the text component with the correct type will have space to show this message\r\n\r\n for (let j = 0; j < linesToShow; j++) {\r\n consoleText = (\"\\n\").concat(consoleText);\r\n }\r\n\r\n linesCount += linesToShow;\r\n }\r\n }\r\n\r\n i -= 1;\r\n }\r\n }\r\n\r\n consoleText = this._myConfig.myMessagesTextStartString.concat(consoleText);\r\n\r\n this._myUI.myMessagesTextComponents[messageType].text = consoleText;\r\n }\r\n\r\n _consolePrint(consoleFunction, sender, ...args) {\r\n if (!this._myActive && sender == ConsoleVRWidgetSender.CONSOLE_VR) {\r\n this._deactivateFix();\r\n }\r\n\r\n switch (sender) {\r\n case ConsoleVRWidgetSender.BROWSER_CONSOLE:\r\n this._myOldBrowserConsole[consoleFunction].apply(console, args);\r\n break;\r\n case ConsoleVRWidgetSender.CONSOLE_VR:\r\n this._myOldConsoleVR[consoleFunction].apply(Globals.getConsoleVR(this._myEngine), args);\r\n break;\r\n default:\r\n this._myOldBrowserConsole[consoleFunction].apply(console, args);\r\n break;\r\n }\r\n\r\n if (this._myActive && this._myConsolePrintAddMessageEnabled && (consoleFunction != ConsoleVRWidgetConsoleFunction.ASSERT || (args.length > 0 && !args[0]))) {\r\n this._myTextDirty = true;\r\n this._pulseGamepad();\r\n\r\n try {\r\n let message = this._argsToMessage(consoleFunction, ...args);\r\n this._addMessage(message);\r\n\r\n if (this._myMessages.length >= this._myConfig.myMaxMessages + this._myConfig.myMaxMessagesDeletePad) {\r\n this._myMessages = this._myMessages.slice(this._myMessages.length - this._myConfig.myMaxMessages);\r\n this._clampScrollOffset();\r\n }\r\n } catch (error) {\r\n this._myConsolePrintAddMessageEnabled = false;\r\n this._myConsolePrintAddMessageEnabledReset = true;\r\n\r\n try {\r\n let errorMessage = \"An error occurred while trying to add a new message to the Console VR Widget\";\r\n let message = new ConsoleVRWidgetMessage(ConsoleVRWidgetMessageType.ERROR, [errorMessage]);\r\n this._myMessages.push(message);\r\n ConsoleOriginalFunctions.error(this._myEngine, errorMessage);\r\n } catch (anotherError) {\r\n // Do nothing\r\n }\r\n\r\n throw error;\r\n }\r\n }\r\n }\r\n\r\n _argsToMessage(consoleFunction, ...args) {\r\n if (consoleFunction == ConsoleVRWidgetConsoleFunction.ASSERT) {\r\n args = args.slice(1);\r\n args.splice(0, 0, this._myConfig.myAssertStartString);\r\n }\r\n\r\n let messageType = this._consoleFunctionToMessageType(consoleFunction);\r\n\r\n let formattedText = this._formatArgs(...args);\r\n\r\n let lines = this._splitLongLines(formattedText);\r\n\r\n if (messageType == ConsoleVRWidgetMessageType.INFO) {\r\n messageType = ConsoleVRWidgetMessageType.LOG;\r\n } else if (messageType == ConsoleVRWidgetMessageType.EXCEPTION || messageType == ConsoleVRWidgetMessageType.ASSERT) {\r\n messageType = ConsoleVRWidgetMessageType.ERROR;\r\n }\r\n\r\n\r\n let message = new ConsoleVRWidgetMessage(messageType, lines);\r\n\r\n return message;\r\n }\r\n\r\n _consoleFunctionToMessageType(consoleFunction) {\r\n let messageType = ConsoleVRWidgetMessageType.LOG;\r\n\r\n if (consoleFunction < ConsoleVRWidgetConsoleFunction.INFO) {\r\n messageType = consoleFunction;\r\n } else if (consoleFunction == ConsoleVRWidgetConsoleFunction.INFO) {\r\n messageType = ConsoleVRWidgetMessageType.LOG;\r\n } else {\r\n messageType = ConsoleVRWidgetMessageType.ERROR;\r\n }\r\n\r\n return messageType;\r\n }\r\n\r\n // Here the formatting using placeholder like %d could be implemented in the future\r\n _formatArgs(...args) {\r\n let stringifiedArgs = [];\r\n for (let i = 0; i < args.length; i++) {\r\n if (args[i] === undefined) {\r\n stringifiedArgs.push(\"undefined\");\r\n } else {\r\n stringifiedArgs.push(this._stringifyItem(args[i]));\r\n }\r\n }\r\n\r\n let formattedString = stringifiedArgs.join(\" \");\r\n\r\n return formattedString;\r\n }\r\n\r\n _stringifyItem(item) {\r\n let stringifiedItem = null;\r\n\r\n if (item instanceof Error) {\r\n stringifiedItem = item.stack;\r\n } else if (typeof item == \"object\") {\r\n let linesBetweenItems = 2;\r\n\r\n try {\r\n stringifiedItem = JSON.stringify(item, this._jsonReplacer.bind(this), linesBetweenItems);\r\n } catch (error) {\r\n let cache = new WeakSet();\r\n\r\n stringifiedItem = JSON.stringify(item, function (key, value) {\r\n if (value != null && typeof value == \"object\") {\r\n if (cache.has(value)) {\r\n return \"\"; // Try to avoid circular reference, a repeated object will be caught in this check too sadly\r\n }\r\n cache.add(value);\r\n }\r\n\r\n return this._jsonReplacer(key, value);\r\n }.bind(this), linesBetweenItems);\r\n }\r\n\r\n stringifiedItem = stringifiedItem.replaceAll(\"\\\"[\", \"[\");\r\n stringifiedItem = stringifiedItem.replaceAll(\"'[\", \"[\");\r\n stringifiedItem = stringifiedItem.replaceAll(\"]\\\"\", \"]\");\r\n stringifiedItem = stringifiedItem.replaceAll(\"]'\", \"]\");\r\n } else {\r\n stringifiedItem = item;\r\n }\r\n\r\n return stringifiedItem;\r\n }\r\n\r\n _splitLongLines(messageText) {\r\n let linesToSplit = messageText.split(\"\\n\");\r\n let lines = [];\r\n for (let i = 0; i < linesToSplit.length; i++) {\r\n let lineToSplit = linesToSplit[i];\r\n\r\n if (lineToSplit.length > this._myConfig.myMaxCharactersPerLine) {\r\n let spacesAtStart = this._getSpacesAtStart(lineToSplit);\r\n let spaceToAdd = this._myConfig.myTabString.concat(spacesAtStart);\r\n let lineSplits = 0;\r\n\r\n while (lineToSplit.length > this._myConfig.myMaxCharactersPerLine && lineSplits < this._myConfig.myMaxLineSplits) {\r\n let firstSub = lineToSplit.substr(0, this._myConfig.myMaxCharactersPerLine - 1);\r\n let secondSub = lineToSplit.substr(this._myConfig.myMaxCharactersPerLine - 1);\r\n secondSub = spaceToAdd.concat(secondSub);\r\n\r\n lines.push(firstSub);\r\n\r\n lineToSplit = secondSub;\r\n lineSplits++;\r\n }\r\n lines.push(lineToSplit);\r\n } else {\r\n lines.push(lineToSplit);\r\n }\r\n }\r\n\r\n return lines;\r\n }\r\n\r\n _getSpacesAtStart(text) {\r\n let spaces = \"\";\r\n let i = 0;\r\n\r\n while (i < text.length && text[i] == \" \") {\r\n spaces = spaces.concat(\" \");\r\n i++;\r\n }\r\n\r\n return spaces;\r\n }\r\n\r\n _addMessage(message) {\r\n let hasSameInfoAsPrev = false;\r\n if (this._myMessages.length > 0) {\r\n let lastMessage = this._myMessages[this._myMessages.length - 1];\r\n if (lastMessage.hasSameInfo(message)) {\r\n lastMessage.increaseCount();\r\n hasSameInfoAsPrev = true;\r\n }\r\n }\r\n\r\n if (!hasSameInfoAsPrev) {\r\n this._myMessages.push(message);\r\n }\r\n\r\n this._adjustScrollOffsetAfterMessageAdded(message, hasSameInfoAsPrev);\r\n this._updateNotifyIcon(message);\r\n }\r\n\r\n // If you have scrolled, new messages does not move the scroll position\r\n _adjustScrollOffsetAfterMessageAdded(message, hasSameInfoAsPrev) {\r\n if (!hasSameInfoAsPrev && !(this._myTypeFilters[message.myType]) && this._myScrollOffset > 0) {\r\n this._myScrollOffset += message.myLines.length + this._myConfig.myLinesBetweenMessages;\r\n }\r\n }\r\n\r\n _updateAllTexts() {\r\n if (this._myWidgetFrame.isVisible()) {\r\n for (let key in ConsoleVRWidgetMessageType) {\r\n this._updateText(ConsoleVRWidgetMessageType[key]);\r\n }\r\n\r\n this._myTextDirty = false;\r\n }\r\n }\r\n\r\n _updateNotifyIcon(message) {\r\n if (!(this._myTypeFilters[message.myType]) && this._myScrollOffset > 0) {\r\n this._setNotifyIconActive(true);\r\n }\r\n }\r\n\r\n _updateScroll(dt) {\r\n if (this._myScrollUp) {\r\n this._myScrollTimer += dt;\r\n while (this._myScrollTimer > this._myConfig.myScrollDelay) {\r\n this._myScrollTimer -= this._myConfig.myScrollDelay;\r\n this._myScrollOffset += this._myConfig.myScrollAmount;\r\n }\r\n } else if (this._myScrollDown) {\r\n this._myScrollTimer += dt;\r\n while (this._myScrollTimer > this._myConfig.myScrollDelay) {\r\n this._myScrollTimer -= this._myConfig.myScrollDelay;\r\n this._myScrollOffset -= this._myConfig.myScrollAmount;\r\n }\r\n }\r\n\r\n this._clampScrollOffset();\r\n\r\n if (this._myScrollUp || this._myScrollDown) {\r\n this._updateAllTexts();\r\n }\r\n\r\n if (this._myScrollOffset == 0) {\r\n this._setNotifyIconActive(false);\r\n }\r\n }\r\n\r\n _clampScrollOffset() {\r\n let maxScroll = this._getMaxScrollOffset();\r\n this._myScrollOffset = Math.pp_clamp(this._myScrollOffset, 0, maxScroll);\r\n }\r\n\r\n _getMaxScrollOffset() {\r\n return Math.max(this._getLinesCount() - this._myConfig.myMaxLines, 0);\r\n }\r\n\r\n _getLinesCount() {\r\n let linesCount = 0;\r\n for (let message of this._myMessages) {\r\n if (!this._myTypeFilters[message.myType]) {\r\n linesCount += message.myLines.length + this._myConfig.myLinesBetweenMessages;\r\n }\r\n }\r\n linesCount -= this._myConfig.myLinesBetweenMessages; // Empty line is added only between messages\r\n linesCount = Math.max(linesCount, 0);\r\n\r\n return linesCount;\r\n }\r\n\r\n // Listener section\r\n\r\n _addListeners() {\r\n let ui = this._myUI;\r\n\r\n for (let key in ConsoleVRWidgetMessageType) {\r\n let cursorTarget = ui.myFilterButtonsCursorTargetComponents[ConsoleVRWidgetMessageType[key]];\r\n let backgroundMaterial = ui.myFilterButtonsBackgroundComponents[ConsoleVRWidgetMessageType[key]].material;\r\n let textMaterial = ui.myFilterButtonsTextComponents[ConsoleVRWidgetMessageType[key]].material;\r\n\r\n cursorTarget.onSingleClick.add(this._toggleFilter.bind(this, ConsoleVRWidgetMessageType[key], textMaterial), { id: this });\r\n cursorTarget.onDoubleClick.add(this._filterAllButOne.bind(this, ConsoleVRWidgetMessageType[key], textMaterial), { id: this });\r\n cursorTarget.onTripleClick.add(this._resetFilters.bind(this, ConsoleVRWidgetMessageType[key]), { id: this });\r\n cursorTarget.onHover.add(this._filterHover.bind(this, ConsoleVRWidgetMessageType[key], backgroundMaterial), { id: this });\r\n cursorTarget.onUnhover.add(this._filterUnhover.bind(this, ConsoleVRWidgetMessageType[key], backgroundMaterial), { id: this });\r\n\r\n this._myUnhoverCallbacks.push(this._filterUnhover.bind(this, ConsoleVRWidgetMessageType[key], backgroundMaterial));\r\n }\r\n\r\n {\r\n let cursorTarget = ui.myClearButtonCursorTargetComponent;\r\n let backgroundMaterial = ui.myClearButtonBackgroundComponent.material;\r\n\r\n cursorTarget.onClick.add(this._clearConsole.bind(this, false, null), { id: this });\r\n cursorTarget.onHover.add(this._genericHover.bind(this, backgroundMaterial), { id: this });\r\n cursorTarget.onUnhover.add(this._genericUnhover.bind(this, backgroundMaterial), { id: this });\r\n\r\n this._myUnhoverCallbacks.push(this._genericUnhover.bind(this, backgroundMaterial));\r\n }\r\n\r\n {\r\n let cursorTarget = ui.myUpButtonCursorTargetComponent;\r\n let backgroundMaterial = ui.myUpButtonBackgroundComponent.material;\r\n\r\n cursorTarget.onDoubleClick.add(this._instantScrollUp.bind(this, true), { id: this });\r\n cursorTarget.onDown.add(this._setScrollUp.bind(this, true), { id: this });\r\n cursorTarget.onDownOnHover.add(this._setScrollUp.bind(this, true), { id: this });\r\n cursorTarget.onUp.add(this._setScrollUp.bind(this, false), { id: this });\r\n cursorTarget.onUnhover.add(() => {\r\n this._setScrollUp(false);\r\n this._genericUnhover(backgroundMaterial);\r\n }, { id: this });\r\n cursorTarget.onHover.add(this._genericHover.bind(this, backgroundMaterial), { id: this });\r\n\r\n this._myUnhoverCallbacks.push(() => {\r\n this._setScrollUp(false);\r\n this._genericUnhover(backgroundMaterial);\r\n });\r\n }\r\n\r\n {\r\n let cursorTarget = ui.myDownButtonCursorTargetComponent;\r\n let backgroundMaterial = ui.myDownButtonBackgroundComponent.material;\r\n\r\n cursorTarget.onDoubleClick.add(this._instantScrollDown.bind(this), { id: this });\r\n cursorTarget.onDown.add(this._setScrollDown.bind(this, true), { id: this });\r\n cursorTarget.onDownOnHover.add(this._setScrollDown.bind(this, true), { id: this });\r\n cursorTarget.onUp.add(this._setScrollDown.bind(this, false), { id: this });\r\n cursorTarget.onUnhover.add(() => {\r\n this._setScrollDown(false);\r\n this._genericUnhover(backgroundMaterial);\r\n }, { id: this });\r\n cursorTarget.onHover.add(this._genericHover.bind(this, backgroundMaterial), { id: this });\r\n\r\n this._myUnhoverCallbacks.push(() => {\r\n this._setScrollDown(false);\r\n this._genericUnhover(backgroundMaterial);\r\n });\r\n }\r\n\r\n {\r\n let cursorTarget = ui.myNotifyIconCursorTargetComponent;\r\n let backgroundMaterial = ui.myNotifyIconBackgroundComponent.material;\r\n\r\n cursorTarget.onClick.add(this._instantScrollDown.bind(this), { id: this });\r\n cursorTarget.onHover.add(this._genericHover.bind(this, backgroundMaterial), { id: this });\r\n cursorTarget.onUnhover.add(this._notifyIconUnhover.bind(this), { id: this });\r\n\r\n this._myUnhoverCallbacks.push(this._notifyIconUnhover.bind(this));\r\n }\r\n\r\n ui.myPointerCursorTargetComponent.onHover.add(this._setGamepadScrollEnabled.bind(this, true), { id: this });\r\n ui.myPointerCursorTargetComponent.onUnhover.add(this._setGamepadScrollEnabled.bind(this, false), { id: this });\r\n\r\n this._myUnhoverCallbacks.push(this._setGamepadScrollEnabled.bind(this, false));\r\n }\r\n\r\n _resetFilters(messageType) {\r\n if (this._myWidgetFrame.isVisible()) {\r\n for (let key in ConsoleVRWidgetMessageType) {\r\n let backgroundMaterial = this._myUI.myFilterButtonsBackgroundComponents[ConsoleVRWidgetMessageType[key]].material;\r\n let filterTextMaterial = this._myUI.myFilterButtonsTextComponents[ConsoleVRWidgetMessageType[key]].material;\r\n\r\n this._myTypeFilters[ConsoleVRWidgetMessageType[key]] = false;\r\n filterTextMaterial.color = this._myConfig.myMessageTypeColors[ConsoleVRWidgetMessageType[key]];\r\n if (ConsoleVRWidgetMessageType[key] != messageType) {\r\n backgroundMaterial.color = this._myConfig.myBackgroundColor;\r\n }\r\n }\r\n\r\n this._clampScrollOffset();\r\n this._updateAllTexts();\r\n }\r\n }\r\n\r\n _filterAllButOne(messageType) {\r\n if (this._myWidgetFrame.isVisible()) {\r\n for (let key in ConsoleVRWidgetMessageType) {\r\n let backgroundMaterial = this._myUI.myFilterButtonsBackgroundComponents[ConsoleVRWidgetMessageType[key]].material;\r\n let filterTextMaterial = this._myUI.myFilterButtonsTextComponents[ConsoleVRWidgetMessageType[key]].material;\r\n if (ConsoleVRWidgetMessageType[key] != messageType) {\r\n this._myTypeFilters[ConsoleVRWidgetMessageType[key]] = true;\r\n backgroundMaterial.color = this._myConfig.myFilterButtonDisabledBackgroundColor;\r\n filterTextMaterial.color = this._myConfig.myFilterButtonDisabledTextColor;\r\n } else {\r\n this._myTypeFilters[ConsoleVRWidgetMessageType[key]] = false;\r\n filterTextMaterial.color = this._myConfig.myMessageTypeColors[messageType];\r\n }\r\n }\r\n\r\n this._clampScrollOffset();\r\n this._updateAllTexts();\r\n }\r\n }\r\n\r\n _toggleFilter(messageType, textMaterial) {\r\n if (this._myWidgetFrame.isVisible()) {\r\n\r\n this._myTypeFilters[messageType] = !this._myTypeFilters[messageType];\r\n if (this._myTypeFilters[messageType]) {\r\n textMaterial.color = this._myConfig.myFilterButtonDisabledTextColor;\r\n } else {\r\n textMaterial.color = this._myConfig.myMessageTypeColors[messageType];\r\n }\r\n\r\n this._clampScrollOffset();\r\n this._updateAllTexts();\r\n }\r\n }\r\n\r\n _clearConsole(codeDrivenClear = false, sender = null) {\r\n if (this._myWidgetFrame.isVisible() || codeDrivenClear) {\r\n this._myMessages = [];\r\n this._clampScrollOffset();\r\n this._updateAllTexts();\r\n\r\n if (codeDrivenClear) {\r\n switch (sender) {\r\n case ConsoleVRWidgetSender.BROWSER_CONSOLE:\r\n this._myOldBrowserConsoleClear.apply(console);\r\n break;\r\n case ConsoleVRWidgetSender.CONSOLE_VR:\r\n this._myOldConsoleVRClear.apply(Globals.getConsoleVR(this._myEngine));\r\n break;\r\n default:\r\n break;\r\n }\r\n } else if (this._myConfig.myClearBrowserConsoleWhenClearPressed) {\r\n ConsoleOriginalFunctions.clear(this._myEngine);\r\n }\r\n }\r\n }\r\n\r\n _setScrollUp(value) {\r\n if (this._myWidgetFrame.isVisible() || !value) {\r\n if (value) {\r\n this._myScrollTimer = 0;\r\n }\r\n\r\n this._myScrollUp = value;\r\n }\r\n }\r\n\r\n _setScrollDown(value) {\r\n if (this._myWidgetFrame.isVisible() || !value) {\r\n if (value) {\r\n this._myScrollTimer = 0;\r\n }\r\n\r\n this._myScrollDown = value;\r\n }\r\n }\r\n\r\n _instantScrollUp() {\r\n if (this._myWidgetFrame.isVisible()) {\r\n this._myScrollOffset = this._getMaxScrollOffset();\r\n this._updateAllTexts();\r\n }\r\n }\r\n\r\n _instantScrollDown() {\r\n if (this._myWidgetFrame.isVisible()) {\r\n this._myScrollOffset = 0;\r\n this._setNotifyIconActive(false);\r\n this._updateAllTexts();\r\n }\r\n }\r\n\r\n _setNotifyIconActive(active) {\r\n this._myUI.myNotifyIconPanel.pp_setActive(active && this._myWidgetFrame.isVisible());\r\n }\r\n\r\n _notifyIconUnhover() {\r\n let material = this._myUI.myNotifyIconBackgroundComponent.material;\r\n material.color = this._myConfig.myNotifyIconColor;\r\n }\r\n\r\n _filterHover(messageType, material) {\r\n this._genericHover(material);\r\n }\r\n\r\n _filterUnhover(messageType, material) {\r\n if (this._myTypeFilters[messageType]) {\r\n material.color = this._myConfig.myFilterButtonDisabledBackgroundColor;\r\n } else {\r\n material.color = this._myConfig.myBackgroundColor;\r\n }\r\n }\r\n\r\n _genericHover(material) {\r\n material.color = this._myConfig.myButtonHoverColor;\r\n }\r\n\r\n _genericUnhover(material) {\r\n material.color = this._myConfig.myBackgroundColor;\r\n }\r\n\r\n // Gamepad section\r\n\r\n _updateGamepadsExtraActions(dt) {\r\n if (this._myLeftGamepad && this._myRightGamepad) {\r\n if ((this._myLeftGamepad.getButtonInfo(GamepadButtonID.THUMBSTICK).isPressStart() && this._myRightGamepad.getButtonInfo(GamepadButtonID.THUMBSTICK).isPressed()) ||\r\n (this._myRightGamepad.getButtonInfo(GamepadButtonID.THUMBSTICK).isPressStart() && this._myLeftGamepad.getButtonInfo(GamepadButtonID.THUMBSTICK).isPressed())) {\r\n this._toggleVisibility();\r\n }\r\n\r\n this._myPulseTimer = Math.max(this._myPulseTimer - dt, 0);\r\n\r\n this._updateScrollWithThumbstick(dt);\r\n }\r\n }\r\n\r\n _toggleVisibility() {\r\n this._myWidgetFrame.toggleVisibility();\r\n }\r\n\r\n _widgetVisibleChanged(visible) {\r\n this._myUI.setVisible(visible);\r\n\r\n for (const unhoverCallback of this._myUnhoverCallbacks) {\r\n unhoverCallback();\r\n }\r\n\r\n if (visible) {\r\n this._updateAllTexts();\r\n }\r\n }\r\n\r\n _updateScrollWithThumbstick(dt) {\r\n if (this._myWidgetFrame.isVisible() && this._myGamepadScrollEnabled) {\r\n let axes = vec2_create(0, 0);\r\n if (this._myConfig.myScrollThumbstickHandedness == ToolHandedness.LEFT) {\r\n axes = this._myLeftGamepad.getAxesInfo(GamepadAxesID.THUMBSTICK).myAxes;\r\n } else if (this._myConfig.myScrollThumbstickHandedness == ToolHandedness.RIGHT) {\r\n axes = this._myRightGamepad.getAxesInfo(GamepadAxesID.THUMBSTICK).myAxes;\r\n }\r\n\r\n if (Math.abs(axes[1]) > this._myConfig.myScrollThumbstickMinThreshold) {\r\n this._myScrollThumbstickTimer += dt;\r\n\r\n while (this._myScrollThumbstickTimer > this._myConfig.myScrollThumbstickDelay) {\r\n this._myScrollThumbstickTimer -= this._myConfig.myScrollThumbstickDelay;\r\n\r\n let normalizedScrollAmount = (Math.abs(axes[1]) - this._myConfig.myScrollThumbstickMinThreshold) / (1 - this._myConfig.myScrollThumbstickMinThreshold);\r\n this._myScrollOffset += Math.sign(axes[1]) * normalizedScrollAmount * this._myConfig.myScrollThumbstickAmount;\r\n }\r\n\r\n this._clampScrollOffset();\r\n this._updateAllTexts();\r\n } else {\r\n this._myScrollThumbstickTimer = 0;\r\n }\r\n }\r\n }\r\n\r\n _pulseGamepad() {\r\n if (this._myLeftGamepad && this._myRightGamepad) {\r\n let pulseType = this._myParams.myPulseOnNewMessage;\r\n let pulseEnabled = pulseType == ConsoleVRWidgetPulseOnNewMessage.ALWAYS || (!this._myWidgetFrame.isVisible() && pulseType == ConsoleVRWidgetPulseOnNewMessage.WHEN_HIDDEN);\r\n if (pulseEnabled && this._myPulseTimer == 0) {\r\n if (this._myParams.myHandedness == ToolHandedness.RIGHT) {\r\n this._myRightGamepad.pulse(this._myConfig.myPulseIntensity, this._myConfig.myPulseDuration);\r\n } else {\r\n this._myLeftGamepad.pulse(this._myConfig.myPulseIntensity, this._myConfig.myPulseDuration);\r\n }\r\n this._myPulseTimer = this._myConfig.myPulseDelay;\r\n }\r\n }\r\n }\r\n\r\n _isSimpleArray(array) {\r\n if (this._isSpecialSimpleArray(array)) {\r\n return true;\r\n } else if (Array.isArray(array)) {\r\n let builtInArray = true;\r\n for (let element of array) {\r\n if (element instanceof Object) {\r\n builtInArray = false;\r\n break;\r\n }\r\n }\r\n\r\n return builtInArray;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n _isSpecialSimpleArray(item) {\r\n return item && item.constructor &&\r\n (\r\n item.constructor.name == \"Uint8ClampedArray\" ||\r\n item.constructor.name == \"Uint8Array\" ||\r\n item.constructor.name == \"Uint16Array\" ||\r\n item.constructor.name == \"Uint32Array\" ||\r\n item.constructor.name == \"Int8Array\" ||\r\n item.constructor.name == \"Int16Array\" ||\r\n item.constructor.name == \"Int32Array\" ||\r\n item.constructor.name == \"Float32Array\" ||\r\n item.constructor.name == \"Float64Array\"\r\n );\r\n }\r\n\r\n _setGamepadScrollEnabled(enabled) {\r\n this._myGamepadScrollEnabled = enabled;\r\n\r\n if (!this._myConfig.myGamepadScrollOnlyOnHover) {\r\n this._myGamepadScrollEnabled = true;\r\n }\r\n }\r\n\r\n _jsonReplacer(key, value) {\r\n if (value instanceof Map) {\r\n return Array.from(value.entries());\r\n } else if (this._isSimpleArray(value)) {\r\n let array = value;\r\n if (this._isSpecialSimpleArray(array)) {\r\n let arrayCopy = []; // Special arrays like Float32Array do not print like Array\r\n for (let i = 0; i < array.length; i++) {\r\n arrayCopy[i] = array[i];\r\n }\r\n\r\n array = arrayCopy;\r\n }\r\n\r\n let stringifiedArray = JSON.stringify(array);\r\n stringifiedArray = stringifiedArray.split(\",\").join(\", \");\r\n return stringifiedArray;\r\n } else {\r\n return value;\r\n }\r\n }\r\n\r\n _deactivateFix() {\r\n if (this._myParams.myResetToConsoleOriginalFunctionsOnDeactivate || this._myParams.myResetToOverwrittenConsoleFunctionsOnDeactivate) {\r\n if (this._myParams.myResetToConsoleOriginalFunctionsOnDeactivate) {\r\n Globals.getConsoleVR(this._myEngine).log = ConsoleVR.myOriginalLog;\r\n Globals.getConsoleVR(this._myEngine).error = ConsoleVR.myOriginalError;\r\n Globals.getConsoleVR(this._myEngine).warn = ConsoleVR.myOriginalWarn;\r\n Globals.getConsoleVR(this._myEngine).info = ConsoleVR.myOriginalInfo;\r\n Globals.getConsoleVR(this._myEngine).debug = ConsoleVR.myOriginalDebug;\r\n Globals.getConsoleVR(this._myEngine).assert = ConsoleVR.myOriginalAssert;\r\n Globals.getConsoleVR(this._myEngine).clear = ConsoleVR.myOriginalClear;\r\n } else if (this._myParams.myResetToOverwrittenConsoleFunctionsOnDeactivate) {\r\n Globals.getConsoleVR(this._myEngine).log = this._myOldConsoleVR[ConsoleVRWidgetConsoleFunction.LOG];\r\n Globals.getConsoleVR(this._myEngine).error = this._myOldConsoleVR[ConsoleVRWidgetConsoleFunction.ERROR];\r\n Globals.getConsoleVR(this._myEngine).warn = this._myOldConsoleVR[ConsoleVRWidgetConsoleFunction.WARN];\r\n Globals.getConsoleVR(this._myEngine).info = this._myOldConsoleVR[ConsoleVRWidgetConsoleFunction.INFO];\r\n Globals.getConsoleVR(this._myEngine).debug = this._myOldConsoleVR[ConsoleVRWidgetConsoleFunction.DEBUG];\r\n Globals.getConsoleVR(this._myEngine).assert = this._myOldConsoleVR[ConsoleVRWidgetConsoleFunction.ASSERT];\r\n Globals.getConsoleVR(this._myEngine).clear = this._myOldConsoleVRClear;\r\n }\r\n\r\n this._myOldConsoleVR[ConsoleVRWidgetConsoleFunction.LOG] = Globals.getConsoleVR(this._myEngine).log;\r\n this._myOldConsoleVR[ConsoleVRWidgetConsoleFunction.ERROR] = Globals.getConsoleVR(this._myEngine).error;\r\n this._myOldConsoleVR[ConsoleVRWidgetConsoleFunction.WARN] = Globals.getConsoleVR(this._myEngine).warn;\r\n this._myOldConsoleVR[ConsoleVRWidgetConsoleFunction.INFO] = Globals.getConsoleVR(this._myEngine).info;\r\n this._myOldConsoleVR[ConsoleVRWidgetConsoleFunction.DEBUG] = Globals.getConsoleVR(this._myEngine).debug;\r\n this._myOldConsoleVR[ConsoleVRWidgetConsoleFunction.ASSERT] = Globals.getConsoleVR(this._myEngine).assert;\r\n this._myOldConsoleVRClear = Globals.getConsoleVR(this._myEngine).clear;\r\n }\r\n }\r\n\r\n destroy() {\r\n this._myDestroyed = true;\r\n\r\n this._myUI.destroy();\r\n this._myWidgetFrame.destroy();\r\n\r\n if (this._myParams.myResetToConsoleOriginalFunctionsOnDestroy) {\r\n console.log = ConsoleOriginalFunctions.getLog(this._myEngine);\r\n console.error = ConsoleOriginalFunctions.getError(this._myEngine);\r\n console.warn = ConsoleOriginalFunctions.getWarn(this._myEngine);\r\n console.info = ConsoleOriginalFunctions.getInfo(this._myEngine);\r\n console.debug = ConsoleOriginalFunctions.getDebug(this._myEngine);\r\n console.assert = ConsoleOriginalFunctions.getAssert(this._myEngine);\r\n console.clear = ConsoleOriginalFunctions.getClear(this._myEngine);\r\n\r\n Globals.getConsoleVR(this._myEngine).log = ConsoleVR.myOriginalLog;\r\n Globals.getConsoleVR(this._myEngine).error = ConsoleVR.myOriginalError;\r\n Globals.getConsoleVR(this._myEngine).warn = ConsoleVR.myOriginalWarn;\r\n Globals.getConsoleVR(this._myEngine).info = ConsoleVR.myOriginalInfo;\r\n Globals.getConsoleVR(this._myEngine).debug = ConsoleVR.myOriginalDebug;\r\n Globals.getConsoleVR(this._myEngine).assert = ConsoleVR.myOriginalAssert;\r\n Globals.getConsoleVR(this._myEngine).clear = ConsoleVR.myOriginalClear;\r\n } else if (this._myParams.myResetToOverwrittenConsoleFunctionsOnDestroy) {\r\n console.log = this._myOldBrowserConsole[ConsoleVRWidgetConsoleFunction.LOG];\r\n console.error = this._myOldBrowserConsole[ConsoleVRWidgetConsoleFunction.ERROR];\r\n console.warn = this._myOldBrowserConsole[ConsoleVRWidgetConsoleFunction.WARN];\r\n console.info = this._myOldBrowserConsole[ConsoleVRWidgetConsoleFunction.INFO];\r\n console.debug = this._myOldBrowserConsole[ConsoleVRWidgetConsoleFunction.DEBUG];\r\n console.assert = this._myOldBrowserConsole[ConsoleVRWidgetConsoleFunction.ASSERT];\r\n console.clear = this._myOldBrowserConsoleClear;\r\n\r\n Globals.getConsoleVR(this._myEngine).log = this._myOldBrowserConsole[ConsoleVRWidgetConsoleFunction.LOG];\r\n Globals.getConsoleVR(this._myEngine).error = this._myOldBrowserConsole[ConsoleVRWidgetConsoleFunction.ERROR];\r\n Globals.getConsoleVR(this._myEngine).warn = this._myOldBrowserConsole[ConsoleVRWidgetConsoleFunction.WARN];\r\n Globals.getConsoleVR(this._myEngine).info = this._myOldBrowserConsole[ConsoleVRWidgetConsoleFunction.INFO];\r\n Globals.getConsoleVR(this._myEngine).debug = this._myOldBrowserConsole[ConsoleVRWidgetConsoleFunction.DEBUG];\r\n Globals.getConsoleVR(this._myEngine).assert = this._myOldBrowserConsole[ConsoleVRWidgetConsoleFunction.ASSERT];\r\n Globals.getConsoleVR(this._myEngine).clear = this._myOldConsoleVRClear;\r\n }\r\n }\r\n\r\n isDestroyed() {\r\n return this._myDestroyed;\r\n }\r\n}", "import { Component, Property } from \"@wonderlandengine/api\";\r\nimport { Globals } from \"../../../pp/globals.js\";\r\nimport { ConsoleVRWidget, ConsoleVRWidgetParams } from \"../console_vr_widget.js\";\r\n\r\nexport class ConsoleVRToolComponent extends Component {\r\n static TypeName = \"pp-console-vr-tool\";\r\n static Properties = {\r\n _myHandedness: Property.enum([\"None\", \"Left\", \"Right\"], \"None\"),\r\n _myOverrideBrowserConsoleFunctions: Property.enum([\"None\", \"All\", \"Errors & Warns\"], \"All\"),\r\n _myShowOnStart: Property.bool(false),\r\n _myShowVisibilityButton: Property.bool(false),\r\n _myPulseOnNewMessage: Property.enum([\"Never\", \"Always\", \"When Hidden\"], \"Never\")\r\n };\r\n\r\n _start() {\r\n this._myWidget = new ConsoleVRWidget(this.engine);\r\n\r\n let params = new ConsoleVRWidgetParams(this.engine);\r\n params.myHandedness = [null, \"left\", \"right\"][this._myHandedness];\r\n params.myOverrideBrowserConsoleFunctions = this._myOverrideBrowserConsoleFunctions;\r\n params.myShowOnStart = this._myShowOnStart;\r\n params.myShowVisibilityButton = this._myShowVisibilityButton;\r\n params.myPulseOnNewMessage = this._myPulseOnNewMessage;\r\n params.myPlaneMaterial = Globals.getDefaultMaterials(this.engine).myFlatOpaque.clone();\r\n params.myTextMaterial = Globals.getDefaultMaterials(this.engine).myText.clone();\r\n\r\n this._myWidget.start(this.object, params);\r\n\r\n this._myStarted = true;\r\n\r\n if (!Globals.hasConsoleVRWidget(this.engine)) {\r\n Globals.setConsoleVRWidget(this._myWidget, this.engine);\r\n }\r\n }\r\n\r\n update(dt) {\r\n if (Globals.isToolEnabled(this.engine) && (!Globals.hasConsoleVRWidget(this.engine) || Globals.getConsoleVRWidget(this.engine) == this._myWidget)) {\r\n if (this._myStarted) {\r\n this._myWidget.setActive(true);\r\n this._myWidget.update(dt);\r\n } else {\r\n this._start();\r\n }\r\n } else if (this._myStarted) {\r\n this._myWidget.setActive(false);\r\n }\r\n }\r\n\r\n onActivate() {\r\n if (this._myStarted) {\r\n if (!Globals.hasConsoleVRWidget(this.engine)) {\r\n Globals.setConsoleVRWidget(this._myWidget, this.engine);\r\n }\r\n }\r\n }\r\n\r\n onDeactivate() {\r\n if (this._myStarted) {\r\n this._myWidget.setActive(false);\r\n\r\n if (Globals.getConsoleVRWidget(this.engine) == this._myWidget) {\r\n Globals.removeConsoleVRWidget(this.engine);\r\n }\r\n }\r\n }\r\n\r\n onDestroy() {\r\n if (this._myStarted) {\r\n this._myWidget.destroy();\r\n }\r\n }\r\n}", "import { Component, property } from \"@wonderlandengine/api\";\r\nimport { GamepadButtonID } from \"../../../input/gamepad/gamepad_buttons.js\";\r\nimport { Globals } from \"../../../pp/globals.js\";\r\nimport { EasyTuneUtils } from \"../easy_tune_utils.js\";\r\nimport { EasyTuneWidget, EasyTuneWidgetParams } from \"../easy_tune_widgets/easy_tune_widget.js\";\r\n\r\nexport class EasyTuneToolComponent extends Component {\r\n public static override TypeName = \"pp-easy-tune-tool\";\r\n\r\n @property.enum([\"None\", \"Left\", \"Right\"], \"None\")\r\n private readonly _myHandedness!: number;\r\n\r\n @property.bool(false)\r\n private readonly _myShowOnStart!: boolean;\r\n\r\n @property.bool(false)\r\n private readonly _myShowVisibilityButton!: boolean;\r\n\r\n @property.bool(true)\r\n private readonly _myGamepadScrollVariableEnabled!: boolean;\r\n\r\n\r\n @property.bool(false)\r\n private readonly _myShowVariablesImportExportButtons!: boolean;\r\n\r\n\r\n\r\n /**\r\n * Can contain parameters inside brackets, like `my-url.com/{param}`, \r\n * which will be replaced with the same one on the current page url, like `www.currentpage.com/?param=2` \r\n * If empty, it will import from the clipboard\r\n */\r\n @property.string(\"\")\r\n private readonly _myVariablesImportURL!: string;\r\n\r\n /**\r\n * Can contain parameters inside brackets, like `my-url.com/{param}`, \r\n * which will be replaced with the same one on the current page url, like `www.currentpage.com/?param=2` \r\n * If empty, it will import from the clipboard\r\n */\r\n @property.string(\"\")\r\n private readonly _myVariablesExportURL!: string;\r\n\r\n @property.bool(false)\r\n private readonly _myImportVariablesOnStart!: boolean;\r\n\r\n @property.bool(false)\r\n private readonly _myResetVariablesDefaultValueOnImport!: boolean;\r\n\r\n @property.bool(true)\r\n private readonly _myKeepImportVariablesOnExport!: boolean;\r\n\r\n @property.bool(true)\r\n private readonly _myAvoidExportingVariablesWithValueAsDefault!: boolean;\r\n\r\n private readonly _myWidget!: EasyTuneWidget;\r\n\r\n private _myStarted: boolean = false;\r\n private _myFirstUpdate: boolean = true;\r\n\r\n private _start(): void {\r\n (this._myWidget as EasyTuneWidget) = new EasyTuneWidget(this.engine);\r\n\r\n const params = new EasyTuneWidgetParams();\r\n params.myHandedness = [null, \"left\", \"right\"][this._myHandedness];\r\n params.myShowOnStart = this._myShowOnStart;\r\n params.myShowVisibilityButton = this._myShowVisibilityButton;\r\n params.myShowAdditionalButtons = true;\r\n params.myGamepadScrollVariableEnabled = this._myGamepadScrollVariableEnabled;\r\n params.myPlaneMaterial = Globals.getDefaultMaterials(this.engine)!.myFlatOpaque!.clone();\r\n params.myTextMaterial = Globals.getDefaultMaterials(this.engine)!.myText!.clone();\r\n\r\n params.myShowVariablesImportExportButtons = this._myShowVariablesImportExportButtons;\r\n params.myVariablesImportCallback = function (this: EasyTuneToolComponent, onSuccessCallback?: () => void, onFailureCallback?: () => void) {\r\n EasyTuneUtils.importVariables(this._myVariablesImportURL, this._myResetVariablesDefaultValueOnImport, false, true, onSuccessCallback, onFailureCallback, this.engine);\r\n }.bind(this);\r\n params.myVariablesExportCallback = function (this: EasyTuneToolComponent, onSuccessCallback?: () => void, onFailureCallback?: () => void) {\r\n if (Globals.getLeftGamepad()!.getButtonInfo(GamepadButtonID.SELECT).isPressed() &&\r\n Globals.getLeftGamepad()!.getButtonInfo(GamepadButtonID.SQUEEZE).isPressed() &&\r\n Globals.getLeftGamepad()!.getButtonInfo(GamepadButtonID.TOP_BUTTON).isPressed() &&\r\n Globals.getLeftGamepad()!.getButtonInfo(GamepadButtonID.BOTTOM_BUTTON).isPressed() &&\r\n Globals.getLeftGamepad()!.getButtonInfo(GamepadButtonID.THUMBSTICK).isPressed()) {\r\n\r\n EasyTuneUtils.clearExportedVariables(this._myVariablesExportURL, onSuccessCallback, onFailureCallback, this.engine);\r\n } else if (this._myKeepImportVariablesOnExport) {\r\n EasyTuneUtils.getImportVariablesJSON(this._myVariablesImportURL, (variablesToKeepJSON) => {\r\n let variablesToKeep = null;\r\n try {\r\n variablesToKeep = JSON.parse(variablesToKeepJSON);\r\n } catch (error) {\r\n // Do nothing\r\n }\r\n\r\n EasyTuneUtils.exportVariables(this._myVariablesExportURL, this._myAvoidExportingVariablesWithValueAsDefault, variablesToKeep, onSuccessCallback, onFailureCallback, this.engine);\r\n }, () => {\r\n EasyTuneUtils.exportVariables(this._myVariablesExportURL, this._myAvoidExportingVariablesWithValueAsDefault, undefined, onSuccessCallback, onFailureCallback, this.engine);\r\n }, this.engine);\r\n } else {\r\n EasyTuneUtils.exportVariables(this._myVariablesExportURL, this._myAvoidExportingVariablesWithValueAsDefault, undefined, onSuccessCallback, onFailureCallback, this.engine);\r\n }\r\n }.bind(this);\r\n\r\n this._myWidget.start(this.object, params, Globals.getEasyTuneVariables(this.engine));\r\n\r\n EasyTuneUtils.addSetWidgetCurrentVariableCallback(this, (variableName: string) => { this._myWidget.setCurrentVariable(variableName); }, this.engine);\r\n EasyTuneUtils.addRefreshWidgetCallback(this, () => { this._myWidget.refresh(); }, this.engine);\r\n\r\n this._myStarted = true;\r\n this._myFirstUpdate = true;\r\n\r\n if (!Globals.hasEasyTuneWidget(this.engine)) {\r\n Globals.setEasyTuneWidget(this._myWidget, this.engine);\r\n }\r\n }\r\n\r\n public override update(dt: number): void {\r\n if (Globals.isToolEnabled(this.engine) && (!Globals.hasEasyTuneWidget(this.engine) || Globals.getEasyTuneWidget(this.engine) == this._myWidget)) {\r\n if (this._myStarted) {\r\n if (this._myFirstUpdate) {\r\n this._myFirstUpdate = false;\r\n if (this._myImportVariablesOnStart) {\r\n EasyTuneUtils.importVariables(this._myVariablesImportURL, this._myResetVariablesDefaultValueOnImport, false, false, undefined, undefined, this.engine);\r\n }\r\n }\r\n\r\n this._myWidget.setActive(true);\r\n this._myWidget.update(dt);\r\n } else {\r\n this._start();\r\n }\r\n } else if (this._myStarted) {\r\n this._myWidget.setActive(false);\r\n }\r\n }\r\n\r\n public override onActivate(): void {\r\n if (this._myStarted) {\r\n if (!Globals.hasEasyTuneWidget(this.engine)) {\r\n Globals.setEasyTuneWidget(this._myWidget, this.engine);\r\n }\r\n\r\n EasyTuneUtils.addSetWidgetCurrentVariableCallback(this, (variableName: string) => { this._myWidget.setCurrentVariable(variableName); }, this.engine);\r\n EasyTuneUtils.addRefreshWidgetCallback(this, () => { this._myWidget.refresh(); }, this.engine);\r\n }\r\n }\r\n\r\n public override onDeactivate(): void {\r\n if (this._myStarted) {\r\n this._myWidget.setActive(false);\r\n\r\n EasyTuneUtils.removeSetWidgetCurrentVariableCallback(this, this.engine);\r\n EasyTuneUtils.removeRefreshWidgetCallback(this, this.engine);\r\n\r\n if (Globals.getEasyTuneWidget(this.engine) == this._myWidget) {\r\n Globals.removeEasyTuneWidget(this.engine);\r\n }\r\n }\r\n }\r\n\r\n public override onDestroy(): void {\r\n if (this._myStarted) {\r\n this._myWidget.destroy();\r\n }\r\n }\r\n}", "import { Emitter } from \"@wonderlandengine/api\";\r\nimport { Timer } from \"../../../../cauldron/cauldron/timer.js\";\r\n\r\nexport class EasyTuneBaseWidgetParams {\r\n\r\n constructor() {\r\n this.myVariablesImportCallback = null; // Signature: callback()\r\n this.myVariablesExportCallback = null; // Signature: callback()\r\n }\r\n}\r\n\r\nexport class EasyTuneBaseWidget {\r\n\r\n constructor(params) {\r\n this._myConfig = null;\r\n this._myUI = null;\r\n\r\n this._myParams = params;\r\n\r\n this._myVariable = null;\r\n\r\n this._myVisible = true;\r\n\r\n this._myScrollVariableRequestEmitter = new Emitter(); // Signature: listener(scrollAmount)\r\n\r\n this._myAppendToVariableName = \"\";\r\n\r\n this._myScrollVariableActive = false;\r\n this._myScrollDirection = 0;\r\n this._myScrollVariableTimer = 0;\r\n this._myHasScrolled = false;\r\n\r\n this._myResetImportLabelTimer = new Timer(0, false);\r\n this._myResetExportLabelTimer = new Timer(0, false);\r\n\r\n this._myUnhoverCallbacks = [];\r\n\r\n this._myDestroyed = false;\r\n\r\n }\r\n\r\n setVisible(visible) {\r\n if (visible) {\r\n this._refreshUI();\r\n }\r\n\r\n this._myUI.setVisible(visible);\r\n\r\n if (this._myVisible != visible) {\r\n for (const unhoverCallback of this._myUnhoverCallbacks) {\r\n unhoverCallback();\r\n }\r\n }\r\n\r\n this._myVisible = visible;\r\n }\r\n\r\n setEasyTuneVariable(variable, appendToVariableName) {\r\n this._myVariable = variable;\r\n\r\n if (appendToVariableName != null) {\r\n this._myAppendToVariableName = appendToVariableName;\r\n } else {\r\n this._myAppendToVariableName = \"\";\r\n }\r\n\r\n this._setEasyTuneVariableHook();\r\n\r\n this._refreshUI();\r\n }\r\n\r\n isScrollVariableActive() {\r\n return this._myScrollVariableActive;\r\n }\r\n\r\n getScrollVariableDirection() {\r\n return this._myScrollDirection;\r\n }\r\n\r\n setScrollVariableActive(active, scrollDirection) {\r\n this._myScrollVariableActive = active;\r\n this._myScrollDirection = scrollDirection;\r\n this._myScrollVariableTimer = this._myConfig.myScrollVariableDelay;\r\n this._myHasScrolled = false;\r\n }\r\n\r\n getWidget() {\r\n return this;\r\n }\r\n\r\n syncWidget(otherEasyTuneWidget) {\r\n if (otherEasyTuneWidget != null) {\r\n if (otherEasyTuneWidget._myResetImportLabelTimer.isRunning()) {\r\n this._myResetImportLabelTimer.start(otherEasyTuneWidget._myResetImportLabelTimer.getTimeLeft());\r\n } else {\r\n this._myResetImportLabelTimer.reset();\r\n }\r\n\r\n if (otherEasyTuneWidget._myResetExportLabelTimer.isRunning()) {\r\n this._myResetExportLabelTimer.start(otherEasyTuneWidget._myResetExportLabelTimer.getTimeLeft());\r\n } else {\r\n this._myResetExportLabelTimer.reset();\r\n }\r\n\r\n this._myUI.myImportButtonTextComponent.text = otherEasyTuneWidget._myUI.myImportButtonTextComponent.text;\r\n this._myUI.myExportButtonTextComponent.text = otherEasyTuneWidget._myUI.myExportButtonTextComponent.text;\r\n\r\n this.setScrollVariableActive(otherEasyTuneWidget.isScrollVariableActive(), otherEasyTuneWidget.getScrollVariableDirection());\r\n } else {\r\n this._myResetImportLabelTimer.reset();\r\n this._myUI.myImportButtonTextComponent.text = this._myConfig.myImportButtonText;\r\n\r\n this._myResetExportLabelTimer.reset();\r\n this._myUI.myExportButtonTextComponent.text = this._myConfig.myExportButtonText;\r\n }\r\n }\r\n\r\n onImportSuccess() {\r\n this._myUI.myImportButtonTextComponent.text = this._myConfig.myImportSuccessButtonText;\r\n this._myResetImportLabelTimer.start(this._myConfig.myImportExportResetLabelSeconds);\r\n }\r\n\r\n onImportFailure() {\r\n this._myUI.myImportButtonTextComponent.text = this._myConfig.myImportFailureButtonText;\r\n this._myResetImportLabelTimer.start(this._myConfig.myImportExportResetLabelSeconds);\r\n }\r\n\r\n onExportSuccess() {\r\n this._myUI.myExportButtonTextComponent.text = this._myConfig.myExportSuccessButtonText;\r\n this._myResetExportLabelTimer.start(this._myConfig.myImportExportResetLabelSeconds);\r\n }\r\n\r\n onExportFailure() {\r\n this._myUI.myExportButtonTextComponent.text = this._myConfig.myExportFailureButtonText;\r\n this._myResetExportLabelTimer.start(this._myConfig.myImportExportResetLabelSeconds);\r\n }\r\n\r\n registerScrollVariableRequestEventListener(id, listener) {\r\n this._myScrollVariableRequestEmitter.add(listener, { id: id });\r\n }\r\n\r\n unregisterScrollVariableRequestEventListener(id) {\r\n this._myScrollVariableRequestEmitter.remove(id);\r\n }\r\n\r\n start(parentObject, easyTuneParams) {\r\n this._myConfig.build();\r\n\r\n this._myResetImportLabelTimer.reset(this._myConfig.myImportExportResetLabelSeconds);\r\n this._myResetExportLabelTimer.reset(this._myConfig.myImportExportResetLabelSeconds);\r\n\r\n this._myUI.build(parentObject, this._myConfig, easyTuneParams);\r\n this._myUI.setImportExportButtonsVisible(easyTuneParams.myShowVariablesImportExportButtons);\r\n\r\n this._startHook(parentObject, easyTuneParams);\r\n\r\n this._addListeners();\r\n }\r\n\r\n update(dt) {\r\n if (this._isActive()) {\r\n this._updateHook(dt);\r\n\r\n this._updateScrollVariable(dt);\r\n\r\n this._updateImportExportLabel(dt);\r\n }\r\n }\r\n\r\n // Hooks\r\n\r\n _setEasyTuneVariableHook() {\r\n }\r\n\r\n _refreshUIHook() {\r\n }\r\n\r\n _startHook(parentObject, easyTuneParams) {\r\n }\r\n\r\n _addListenersHook() {\r\n }\r\n\r\n _updateHook(dt) {\r\n }\r\n\r\n // Hooks end\r\n\r\n _refreshUI() {\r\n if (this._myVariable) {\r\n if (this._myVariable.getName() != null) {\r\n this._myUI.myVariableLabelTextComponent.text = this._myVariable.getName().concat(this._myAppendToVariableName);\r\n } else {\r\n let name = \"Unknown\";\r\n this._myUI.myVariableLabelTextComponent.text = name.concat(this._myAppendToVariableName);\r\n }\r\n\r\n this._refreshUIHook();\r\n }\r\n }\r\n\r\n _updateScrollVariable(dt) {\r\n if (this._myScrollVariableActive) {\r\n if (this._myScrollVariableTimer <= 0) {\r\n this._scrollVariableRequest(this._myScrollDirection);\r\n this._myScrollVariableTimer = this._myConfig.myScrollVariableDelay;\r\n this._myHasScrolled = true;\r\n } else {\r\n this._myScrollVariableTimer -= dt;\r\n }\r\n }\r\n }\r\n\r\n _updateImportExportLabel(dt) {\r\n if (this._myResetImportLabelTimer.isRunning(dt)) {\r\n this._myResetImportLabelTimer.update(dt);\r\n if (this._myResetImportLabelTimer.isDone()) {\r\n this._myResetImportLabelTimer.reset();\r\n this._myUI.myImportButtonTextComponent.text = this._myConfig.myImportButtonText;\r\n }\r\n }\r\n\r\n if (this._myResetExportLabelTimer.isRunning(dt)) {\r\n this._myResetExportLabelTimer.update(dt);\r\n if (this._myResetExportLabelTimer.isDone()) {\r\n this._myResetExportLabelTimer.reset();\r\n this._myUI.myExportButtonTextComponent.text = this._myConfig.myExportButtonText;\r\n }\r\n }\r\n }\r\n\r\n _isActive() {\r\n return this._myVisible && this._myVariable;\r\n }\r\n\r\n _addListeners() {\r\n let ui = this._myUI;\r\n\r\n this._myUnhoverCallbacks = [];\r\n\r\n ui.myNextButtonCursorTargetComponent.onDown.add(this._setScrollVariableActive.bind(this, true, 1, false));\r\n ui.myNextButtonCursorTargetComponent.onDownOnHover.add(this._setScrollVariableActive.bind(this, true, 1, false));\r\n ui.myNextButtonCursorTargetComponent.onUpWithDown.add(this._setScrollVariableActive.bind(this, false, 0, false));\r\n ui.myNextButtonCursorTargetComponent.onUpWithNoDown.add(this._setScrollVariableActive.bind(this, false, 0, true));\r\n ui.myNextButtonCursorTargetComponent.onUnhover.add(this._setScrollVariableActive.bind(this, false, 0, true));\r\n ui.myNextButtonCursorTargetComponent.onHover.add(this._genericHover.bind(this, ui.myNextButtonBackgroundComponent.material));\r\n ui.myNextButtonCursorTargetComponent.onUnhover.add(this._genericUnhover.bind(this, ui.myNextButtonBackgroundComponent.material));\r\n\r\n this._myUnhoverCallbacks.push(this._setScrollVariableActive.bind(this, false, 0, true));\r\n this._myUnhoverCallbacks.push(this._genericUnhover.bind(this, ui.myNextButtonBackgroundComponent.material));\r\n\r\n ui.myPreviousButtonCursorTargetComponent.onDown.add(this._setScrollVariableActive.bind(this, true, -1, false));\r\n ui.myPreviousButtonCursorTargetComponent.onDownOnHover.add(this._setScrollVariableActive.bind(this, true, -1, false));\r\n ui.myPreviousButtonCursorTargetComponent.onUpWithDown.add(this._setScrollVariableActive.bind(this, false, 0, false));\r\n ui.myPreviousButtonCursorTargetComponent.onUpWithNoDown.add(this._setScrollVariableActive.bind(this, false, 0, true));\r\n ui.myPreviousButtonCursorTargetComponent.onUnhover.add(this._setScrollVariableActive.bind(this, false, 0, true));\r\n ui.myPreviousButtonCursorTargetComponent.onHover.add(this._genericHover.bind(this, ui.myPreviousButtonBackgroundComponent.material));\r\n ui.myPreviousButtonCursorTargetComponent.onUnhover.add(this._genericUnhover.bind(this, ui.myPreviousButtonBackgroundComponent.material));\r\n\r\n this._myUnhoverCallbacks.push(this._setScrollVariableActive.bind(this, false, 0, true));\r\n this._myUnhoverCallbacks.push(this._genericUnhover.bind(this, ui.myPreviousButtonBackgroundComponent.material));\r\n\r\n ui.myImportButtonCursorTargetComponent.onUpWithDown.add(this._importVariables.bind(this));\r\n ui.myImportButtonCursorTargetComponent.onHover.add(this._genericHover.bind(this, ui.myImportButtonBackgroundComponent.material));\r\n ui.myImportButtonCursorTargetComponent.onUnhover.add(this._genericUnhover.bind(this, ui.myImportButtonBackgroundComponent.material));\r\n\r\n this._myUnhoverCallbacks.push(this._genericUnhover.bind(this, ui.myImportButtonBackgroundComponent.material));\r\n\r\n ui.myExportButtonCursorTargetComponent.onUpWithDown.add(this._exportVariables.bind(this));\r\n ui.myExportButtonCursorTargetComponent.onHover.add(this._genericHover.bind(this, ui.myExportButtonBackgroundComponent.material));\r\n ui.myExportButtonCursorTargetComponent.onUnhover.add(this._genericUnhover.bind(this, ui.myExportButtonBackgroundComponent.material));\r\n\r\n this._myUnhoverCallbacks.push(this._genericUnhover.bind(this, ui.myExportButtonBackgroundComponent.material));\r\n\r\n this._addListenersHook();\r\n }\r\n\r\n _setScrollVariableActive(active, scrollDirection, skipForceScroll) {\r\n if (this._isActive() || !active) {\r\n let forceScroll = !active && !this._myHasScrolled && !skipForceScroll;\r\n let oldScrollDirection = this._myScrollDirection;\r\n\r\n this.setScrollVariableActive(active, scrollDirection);\r\n\r\n if (forceScroll) {\r\n this._scrollVariableRequest(oldScrollDirection);\r\n }\r\n }\r\n }\r\n\r\n _scrollVariableRequest(amount) {\r\n if (this._isActive() && amount != 0) {\r\n this._myScrollVariableRequestEmitter.notify(amount);\r\n }\r\n }\r\n\r\n _genericHover(material) {\r\n material.color = this._myConfig.myButtonHoverColor;\r\n }\r\n\r\n _genericUnhover(material) {\r\n material.color = this._myConfig.myBackgroundColor;\r\n }\r\n\r\n _importVariables() {\r\n if (this._myUI.myImportButtonTextComponent.text == this._myConfig.myImportButtonText) {\r\n this._myUI.myImportButtonTextComponent.text = this._myConfig.myImportingButtonText;\r\n this._myResetImportLabelTimer.reset();\r\n\r\n this._myParams.myVariablesImportCallback();\r\n }\r\n }\r\n\r\n _exportVariables() {\r\n if (this._myUI.myExportButtonTextComponent.text == this._myConfig.myExportButtonText) {\r\n this._myUI.myExportButtonTextComponent.text = this._myConfig.myExportingButtonText;\r\n this._myResetExportLabelTimer.reset();\r\n\r\n this._myParams.myVariablesExportCallback();\r\n }\r\n }\r\n\r\n setActive(active) {\r\n this._myUI.setActive(active);\r\n }\r\n\r\n destroy() {\r\n this._myDestroyed = true;\r\n\r\n this.setActive(false);\r\n\r\n if (this._myUI != null) {\r\n this._myUI.destroy();\r\n }\r\n }\r\n\r\n isDestroyed() {\r\n return this._myDestroyed;\r\n }\r\n}", "import { Emitter } from \"@wonderlandengine/api\";\r\nimport { Globals } from \"../../../../pp/globals.js\";\r\n\r\nexport class EasyTuneBaseArrayWidgetSelector {\r\n\r\n constructor(params, gamepad, engine = Globals.getMainEngine()) {\r\n this._myGamepad = gamepad;\r\n\r\n this._myParentObject = null;\r\n\r\n this._myParams = params;\r\n this._myEasyTuneParams = null;\r\n\r\n this._myWidgets = new Map();\r\n\r\n this._myVariable = null;\r\n this._myVisible = true;\r\n\r\n this._myAppendToVariableName = null;\r\n\r\n this._myScrollVariableRequestEmitter = new Emitter(); // Signature: listener(scrollAmount)\r\n\r\n this._myCurrentArraySize = null;\r\n\r\n this._myEngine = engine;\r\n\r\n this._myActive = true;\r\n this._myDestroyed = false;\r\n }\r\n\r\n setEasyTuneVariable(variable, appendToVariableName, skipSetVisible = false) {\r\n this._myVariable = variable;\r\n\r\n this._myCurrentArraySize = this._myVariable.getValue().length; // null for non array variable\r\n\r\n this._myAppendToVariableName = appendToVariableName;\r\n\r\n if (!this._myWidgets.has(this._myCurrentArraySize)) {\r\n this._createWidget(this._myCurrentArraySize);\r\n }\r\n\r\n let widget = this._myWidgets.get(this._myCurrentArraySize);\r\n if (widget) {\r\n widget.setEasyTuneVariable(variable, appendToVariableName);\r\n }\r\n\r\n if (!skipSetVisible) {\r\n this.setVisible(this._myVisible);\r\n }\r\n }\r\n\r\n setVisible(visible) {\r\n if (this._myVariable) {\r\n this._sizeChangedCheck(true);\r\n\r\n let currentWidget = this._myWidgets.get(this._myCurrentArraySize);\r\n\r\n for (let widget of this._myWidgets.values()) {\r\n if (currentWidget != widget) {\r\n widget.setVisible(false);\r\n }\r\n }\r\n\r\n if (currentWidget) {\r\n currentWidget.setVisible(visible);\r\n }\r\n } else {\r\n for (let widget of this._myWidgets.values()) {\r\n widget.setVisible(false);\r\n }\r\n }\r\n\r\n this._myVisible = visible;\r\n }\r\n\r\n isScrollVariableActive() {\r\n let widget = this._myWidgets.get(this._myCurrentArraySize);\r\n if (widget) {\r\n return widget.isScrollVariableActive();\r\n }\r\n\r\n return false;\r\n }\r\n\r\n getScrollVariableDirection() {\r\n let widget = this._myWidgets.get(this._myCurrentArraySize);\r\n if (widget) {\r\n return widget.getScrollVariableDirection();\r\n }\r\n\r\n return 0;\r\n }\r\n\r\n setScrollVariableActive(active, scrollDirection) {\r\n let widget = this._myWidgets.get(this._myCurrentArraySize);\r\n if (widget) {\r\n widget.setScrollVariableActive(active, scrollDirection);\r\n }\r\n }\r\n\r\n getWidget() {\r\n return this._myWidgets.get(this._myCurrentArraySize);\r\n }\r\n\r\n registerScrollVariableRequestEventListener(id, listener) {\r\n this._myScrollVariableRequestEmitter.add(listener, { id: id });\r\n }\r\n\r\n unregisterScrollVariableRequestEventListener(id) {\r\n this._myScrollVariableRequestEmitter.remove(id);\r\n }\r\n\r\n start(parentObject, easyTuneParams) {\r\n this._myParentObject = parentObject;\r\n this._myEasyTuneParams = easyTuneParams;\r\n\r\n this._createWidget(1);\r\n\r\n if (this._myVariable) {\r\n this.setEasyTuneVariable(this._myVariable, this._myAppendToVariableName);\r\n }\r\n }\r\n\r\n update(dt) {\r\n if (this._isActive()) {\r\n this._sizeChangedCheck();\r\n\r\n let widget = this._myWidgets.get(this._myCurrentArraySize);\r\n if (widget) {\r\n widget.update(dt);\r\n }\r\n }\r\n }\r\n\r\n onImportSuccess() {\r\n let widget = this._myWidgets.get(this._myCurrentArraySize);\r\n if (widget) {\r\n widget.onImportSuccess();\r\n }\r\n }\r\n\r\n onImportFailure() {\r\n let widget = this._myWidgets.get(this._myCurrentArraySize);\r\n if (widget) {\r\n widget.onImportFailure();\r\n }\r\n }\r\n\r\n onExportSuccess() {\r\n let widget = this._myWidgets.get(this._myCurrentArraySize);\r\n if (widget) {\r\n widget.onExportSuccess();\r\n }\r\n }\r\n\r\n onExportFailure() {\r\n let widget = this._myWidgets.get(this._myCurrentArraySize);\r\n if (widget) {\r\n widget.onExportFailure();\r\n }\r\n }\r\n\r\n _isActive() {\r\n return this._myVisible && this._myVariable;\r\n }\r\n\r\n _scrollVariableRequest(amount) {\r\n this._myScrollVariableRequestEmitter.notify(amount);\r\n }\r\n\r\n _createWidget(arraySize) {\r\n this._myWidgets.set(arraySize, this._getEasyTuneArrayWidget(arraySize));\r\n this._myWidgets.get(arraySize).start(this._myParentObject, this._myEasyTuneParams);\r\n this._myWidgets.get(arraySize).setVisible(false);\r\n this._myWidgets.get(arraySize).registerScrollVariableRequestEventListener(this, this._scrollVariableRequest.bind(this));\r\n this._myWidgets.get(arraySize).setActive(this._myActive);\r\n }\r\n\r\n _sizeChangedCheck(skipSetVisible = false) {\r\n if (this._myVariable.getValue().length != this._myCurrentArraySize) {\r\n this.setEasyTuneVariable(this._myVariable, this._myAppendToVariableName, skipSetVisible);\r\n }\r\n }\r\n\r\n /**\r\n * TS type inference helper\r\n * \r\n * @returns {any}\r\n */\r\n _getEasyTuneArrayWidget(arraySize) {\r\n return null;\r\n }\r\n\r\n setActive(active) {\r\n this._myActive = active;\r\n for (let widget of this._myWidgets.values()) {\r\n widget.setActive(active);\r\n }\r\n }\r\n\r\n destroy() {\r\n this._myDestroyed = true;\r\n\r\n this.setActive(false);\r\n\r\n for (let widget of this._myWidgets.values()) {\r\n widget.destroy();\r\n }\r\n }\r\n\r\n isDestroyed() {\r\n return this._myDestroyed;\r\n }\r\n}", "import { Alignment, Collider, VerticalAlignment } from \"@wonderlandengine/api\";\r\nimport { vec3_create, vec4_create } from \"../../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { ToolHandedness } from \"../../../cauldron/tool_types.js\";\r\n\r\nexport class EasyTuneBaseWidgetConfig {\r\n\r\n constructor() {\r\n\r\n }\r\n\r\n build() {\r\n this._setupBuildConfig();\r\n this._setupRuntimeConfig();\r\n }\r\n\r\n // Hooks\r\n\r\n _getBackPanelMaxY() {\r\n return this.myDisplayPanelPosition[1] + this.myVariableLabelPanelPosition[1] + this.mySideButtonBackgroundScale[1] + this._mySideButtonDistanceFromBorder * 1.25;\r\n }\r\n\r\n _getBackPanelMinY() {\r\n return this.myDisplayPanelPosition[1] - this._mySideButtonDistanceFromBorder * 1.25 - this.mySideButtonBackgroundScale[1];\r\n }\r\n\r\n _getBackPanelMaxX() {\r\n return this._mySideButtonPanelHalfWidth;\r\n }\r\n\r\n _getBackPanelMinX() {\r\n return -this._mySideButtonPanelHalfWidth;\r\n }\r\n\r\n // Small Z offset to avoid glitching with other widgets\r\n _getPivotZOffset() {\r\n return 0;\r\n }\r\n\r\n _setupBuildConfigHook() {\r\n }\r\n\r\n _setupRuntimeConfigHook() {\r\n }\r\n\r\n // Hooks end\r\n\r\n _setupBuildConfig() {\r\n // General\r\n\r\n this.myBackgroundColor = vec4_create(46 / 255, 46 / 255, 46 / 255, 1);\r\n\r\n this.myCursorTargetCollisionCollider = Collider.Box;\r\n this.myCursorTargetCollisionGroup = 7; // Keep this in sync with Tool Cursor\r\n this.myCursorTargetCollisionThickness = 0.001;\r\n\r\n this.myDefaultTextColor = vec4_create(255 / 255, 255 / 255, 255 / 255, 1);\r\n\r\n this.myTextAlignment = Alignment.Center;\r\n this.myTextVerticalAlignment = VerticalAlignment.Middle;\r\n this.myTextColor = this.myDefaultTextColor;\r\n\r\n this.myLabelTextScale = vec3_create(0.18, 0.18, 0.18);\r\n this.myButtonTextScale = vec3_create(0.18, 0.18, 0.18);\r\n\r\n this._myPanelZOffset = 0.01;\r\n this._myColliderZOffset = 0.017;\r\n this._mySideButtonDistanceFromBorder = 0.0125;\r\n this._mySideButtonPanelHalfWidth = 0.2;\r\n\r\n // Pivot\r\n\r\n this.myPivotObjectPositions = [];\r\n this.myPivotObjectPositions[ToolHandedness.NONE] = vec3_create(0, 0, this._getPivotZOffset());\r\n this.myPivotObjectPositions[ToolHandedness.LEFT] = vec3_create(-0.04, 0.02, this._getPivotZOffset());\r\n this.myPivotObjectPositions[ToolHandedness.RIGHT] = vec3_create(-0.08, 0.02, this._getPivotZOffset());\r\n\r\n this.mySideButtonBackgroundScale = vec3_create(0.015, 0.015, 1);\r\n this.mySideButtonTextScale = this.myButtonTextScale;\r\n this.mySideButtonTextPosition = vec3_create(0, 0, 0.007);\r\n\r\n this.mySideButtonCursorTargetPosition = vec3_create(0, 0, 0);\r\n this.mySideButtonCursorTargetPosition[2] = this._myColliderZOffset - this._myPanelZOffset;\r\n this.mySideButtonCollisionExtents = this.mySideButtonBackgroundScale.pp_clone();\r\n this.mySideButtonCollisionExtents[2] = this.myCursorTargetCollisionThickness;\r\n\r\n this.myLeftSideButtonPosition = vec3_create(0, 0, -0.00001);\r\n this.myLeftSideButtonPosition[0] = -this._mySideButtonPanelHalfWidth + this.mySideButtonBackgroundScale[0] + this._mySideButtonDistanceFromBorder;\r\n\r\n this.myRightSideButtonPosition = vec3_create(0, 0, -0.00001);\r\n this.myRightSideButtonPosition[0] = -this.myLeftSideButtonPosition[0];\r\n\r\n // Display\r\n\r\n this.myDisplayPanelPosition = vec3_create(0, 0.1, 0);\r\n\r\n this.myVariableLabelPanelPosition = vec3_create(0, 0.025, this._myPanelZOffset);\r\n this.myVariableLabelTextScale = this.myLabelTextScale;\r\n\r\n this.myVariableLabelCursorTargetPosition = vec3_create(0, 0, 0);\r\n this.myVariableLabelCursorTargetPosition[2] = this._myColliderZOffset - this._myPanelZOffset;\r\n this.myVariableLabelCollisionExtents = vec3_create(0.065, 0.0175, 1);\r\n this.myVariableLabelCollisionExtents[2] = this.myCursorTargetCollisionThickness;\r\n\r\n this.myNextButtonText = \">\";\r\n this.myPreviousButtonText = \"<\";\r\n\r\n this._setupBuildConfigHook();\r\n\r\n // Background\r\n\r\n {\r\n let maxX = this._getBackPanelMaxX();\r\n let minX = this._getBackPanelMinX();\r\n let maxY = this._getBackPanelMaxY();\r\n let minY = this._getBackPanelMinY();\r\n\r\n this.myBackPanelPosition = [(maxX + minX) / 2, (maxY + minY) / 2, 0];\r\n this.myBackBackgroundScale = [(maxX - minX) / 2, (maxY - minY) / 2, 1];\r\n\r\n this.myBackBackgroundColor = vec4_create(70 / 255, 70 / 255, 70 / 255, 1);\r\n }\r\n\r\n // Import Export\r\n\r\n this.myImportExportButtonBackgroundScale = vec3_create(0.04, 0.02, 1);\r\n this.myImportExportButtonTextScale = this.myButtonTextScale;\r\n this.myImportExportButtonTextPosition = vec3_create(0, 0, 0.007);\r\n\r\n this.myImportExportPanelPosition = [0, this._getBackPanelMaxY() + this._mySideButtonDistanceFromBorder + this.myImportExportButtonBackgroundScale[1], this._myPanelZOffset];\r\n\r\n this.myImportExportButtonCursorTargetPosition = vec3_create(0, 0, 0);\r\n this.myImportExportButtonCursorTargetPosition[2] = this._myColliderZOffset - this._myPanelZOffset;\r\n this.myImportExportButtonCollisionExtents = this.myImportExportButtonBackgroundScale.pp_clone();\r\n this.myImportExportButtonCollisionExtents[2] = this.myCursorTargetCollisionThickness;\r\n\r\n this.myImportButtonText = \"Import\";\r\n this.myExportButtonText = \"Export\";\r\n\r\n this.myImportExportResetLabelSeconds = 2;\r\n\r\n this.myImportingButtonText = \"...\";\r\n this.myImportSuccessButtonText = \"Done\";\r\n this.myImportFailureButtonText = \"Error\";\r\n\r\n this.myExportingButtonText = \"...\";\r\n this.myExportSuccessButtonText = \"Done\";\r\n this.myExportFailureButtonText = \"Error\";\r\n\r\n this.myImportButtonPosition = vec3_create(0, 0, -0.00001);\r\n this.myImportButtonPosition[0] = -this.myImportExportButtonBackgroundScale[0] - this._mySideButtonDistanceFromBorder / 2;\r\n\r\n this.myExportButtonPosition = vec3_create(0, 0, -0.00001);\r\n this.myExportButtonPosition[0] = -this.myImportButtonPosition[0];\r\n\r\n\r\n // Pointer\r\n\r\n this.myPointerCollisionExtents = this.myBackBackgroundScale.pp_clone();\r\n this.myPointerCollisionExtents[2] = this.myCursorTargetCollisionThickness;\r\n this.myPointerCursorTargetPosition = this.myBackPanelPosition.pp_clone();\r\n this.myPointerCursorTargetPosition[2] = this._myColliderZOffset - 0.0002; // A little behind the button target to avoid hiding it\r\n }\r\n\r\n _setupRuntimeConfig() {\r\n this.myButtonHoverColor = vec4_create(150 / 255, 150 / 255, 150 / 255, 1);\r\n\r\n this.myScrollVariableDelay = 0.5;\r\n\r\n this._setupRuntimeConfigHook();\r\n }\r\n}", "import { vec3_create } from \"../../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { EasyTuneBaseWidgetConfig } from \"../base/easy_tune_base_widget_config.js\";\r\n\r\nexport class EasyTuneBoolArrayWidgetConfig extends EasyTuneBaseWidgetConfig {\r\n\r\n constructor(arraySize) {\r\n super();\r\n\r\n this.myArraySize = arraySize;\r\n }\r\n\r\n _getBackPanelMinY() {\r\n let valuePanelLastPosition = (this.myValuePanelsPositions[this.myArraySize - 1]) ? this.myValuePanelsPositions[this.myArraySize - 1][1] : 0;\r\n return super._getBackPanelMinY() + this.myValuesPanelPosition[1] + valuePanelLastPosition;\r\n }\r\n\r\n _getPivotZOffset() {\r\n return 0.00802713;\r\n }\r\n\r\n _setupBuildConfigHook() {\r\n this.myIncreaseButtonText = \"+\";\r\n this.myDecreaseButtonText = \"-\";\r\n\r\n this._myValuePanelDistanceFromVariableLabelPanel = 0.055;\r\n this._myDistanceBetweenValues = this.mySideButtonBackgroundScale[1] * 2 + 0.015;\r\n\r\n this.myValuesPanelPosition = [0, this.myVariableLabelPanelPosition[1] - this._myValuePanelDistanceFromVariableLabelPanel, this._myPanelZOffset];\r\n\r\n this.myValueTextScale = vec3_create(0.4, 0.4, 0.4);\r\n\r\n this.myValueCursorTargetPosition = vec3_create(0, 0, 0);\r\n this.myValueCursorTargetPosition[2] = this._myColliderZOffset - this._myPanelZOffset;\r\n this.myValueCollisionExtents = vec3_create(0.065, 0.02, 1);\r\n this.myValueCollisionExtents[2] = this.myCursorTargetCollisionThickness;\r\n\r\n this.myValuePanelsPositions = [];\r\n this.myValuePanelsPositions[0] = vec3_create(0, 0, 0);\r\n for (let i = 1; i < this.myArraySize; i++) {\r\n this.myValuePanelsPositions[i] = this.myValuePanelsPositions[i - 1].pp_clone();\r\n this.myValuePanelsPositions[i][1] -= this._myDistanceBetweenValues;\r\n }\r\n }\r\n\r\n _setupRuntimeConfigHook() {\r\n this.myTextHoverScaleMultiplier = vec3_create(1.1, 1.1, 1.1);\r\n\r\n this.myThumbstickToggleThreshold = 0.6;\r\n this.myButtonEditDelay = 0;\r\n }\r\n}", "import { CollisionComponent, MeshComponent, TextComponent } from \"@wonderlandengine/api\";\r\nimport { CursorTarget } from \"@wonderlandengine/components\";\r\nimport { EasyTuneBaseWidgetUI } from \"../base/easy_tune_base_widget_ui.js\";\r\n\r\nexport class EasyTuneBoolArrayWidgetUI extends EasyTuneBaseWidgetUI {\r\n\r\n constructor(engine) {\r\n super(engine);\r\n }\r\n\r\n setAdditionalButtonsVisible(visible) {\r\n this._myAdditionalButtonsVisible = visible;\r\n\r\n for (let i = 0; i < this._myConfig.myArraySize; i++) {\r\n this.myValueIncreaseButtonPanels[i].pp_setActive(this._myAdditionalButtonsVisible);\r\n this.myValueDecreaseButtonPanels[i].pp_setActive(this._myAdditionalButtonsVisible);\r\n }\r\n }\r\n\r\n _buildHook() {\r\n this._myAdditionalButtonsVisible = true;\r\n }\r\n\r\n _createSkeletonHook() {\r\n this.myValuesPanel = this.myDisplayPanel.pp_addChild();\r\n\r\n this.myValuePanels = [];\r\n this.myValueTexts = [];\r\n this.myValueCursorTargets = [];\r\n\r\n this.myValueIncreaseButtonPanels = [];\r\n this.myValueIncreaseButtonBackgrounds = [];\r\n this.myValueIncreaseButtonTexts = [];\r\n this.myValueIncreaseButtonCursorTargets = [];\r\n\r\n this.myValueDecreaseButtonPanels = [];\r\n this.myValueDecreaseButtonBackgrounds = [];\r\n this.myValueDecreaseButtonTexts = [];\r\n this.myValueDecreaseButtonCursorTargets = [];\r\n\r\n for (let i = 0; i < this._myConfig.myArraySize; i++) {\r\n this.myValuePanels[i] = this.myValuesPanel.pp_addChild();\r\n this.myValueTexts[i] = this.myValuePanels[i].pp_addChild();\r\n this.myValueCursorTargets[i] = this.myValuePanels[i].pp_addChild();\r\n\r\n this.myValueIncreaseButtonPanels[i] = this.myValuePanels[i].pp_addChild();\r\n this.myValueIncreaseButtonBackgrounds[i] = this.myValueIncreaseButtonPanels[i].pp_addChild();\r\n this.myValueIncreaseButtonTexts[i] = this.myValueIncreaseButtonPanels[i].pp_addChild();\r\n this.myValueIncreaseButtonCursorTargets[i] = this.myValueIncreaseButtonPanels[i].pp_addChild();\r\n\r\n this.myValueDecreaseButtonPanels[i] = this.myValuePanels[i].pp_addChild();\r\n this.myValueDecreaseButtonBackgrounds[i] = this.myValueDecreaseButtonPanels[i].pp_addChild();\r\n this.myValueDecreaseButtonTexts[i] = this.myValueDecreaseButtonPanels[i].pp_addChild();\r\n this.myValueDecreaseButtonCursorTargets[i] = this.myValueDecreaseButtonPanels[i].pp_addChild();\r\n }\r\n }\r\n\r\n _setTransformHook() {\r\n this.myValuesPanel.pp_setPositionLocal(this._myConfig.myValuesPanelPosition);\r\n\r\n for (let i = 0; i < this._myConfig.myArraySize; i++) {\r\n this.myValuePanels[i].pp_setPositionLocal(this._myConfig.myValuePanelsPositions[i]);\r\n this.myValueTexts[i].pp_scaleObject(this._myConfig.myValueTextScale);\r\n this.myValueCursorTargets[i].pp_setPositionLocal(this._myConfig.myValueCursorTargetPosition);\r\n\r\n this.myValueIncreaseButtonPanels[i].pp_setPositionLocal(this._myConfig.myRightSideButtonPosition);\r\n this.myValueIncreaseButtonBackgrounds[i].pp_scaleObject(this._myConfig.mySideButtonBackgroundScale);\r\n this.myValueIncreaseButtonTexts[i].pp_setPositionLocal(this._myConfig.mySideButtonTextPosition);\r\n this.myValueIncreaseButtonTexts[i].pp_scaleObject(this._myConfig.mySideButtonTextScale);\r\n this.myValueIncreaseButtonCursorTargets[i].pp_setPositionLocal(this._myConfig.mySideButtonCursorTargetPosition);\r\n\r\n this.myValueDecreaseButtonPanels[i].pp_setPositionLocal(this._myConfig.myLeftSideButtonPosition);\r\n this.myValueDecreaseButtonBackgrounds[i].pp_scaleObject(this._myConfig.mySideButtonBackgroundScale);\r\n this.myValueDecreaseButtonTexts[i].pp_setPositionLocal(this._myConfig.mySideButtonTextPosition);\r\n this.myValueDecreaseButtonTexts[i].pp_scaleObject(this._myConfig.mySideButtonTextScale);\r\n this.myValueDecreaseButtonCursorTargets[i].pp_setPositionLocal(this._myConfig.mySideButtonCursorTargetPosition);\r\n }\r\n }\r\n\r\n _addComponentsHook() {\r\n this.myValueTextComponents = [];\r\n this.myValueCursorTargetComponents = [];\r\n this.myValueCollisionComponents = [];\r\n\r\n this.myValueIncreaseButtonBackgroundComponents = [];\r\n this.myValueIncreaseButtonTextComponents = [];\r\n this.myValueIncreaseButtonCursorTargetComponents = [];\r\n this.myValueIncreaseButtonCollisionComponents = [];\r\n\r\n this.myValueDecreaseButtonBackgroundComponents = [];\r\n this.myValueDecreaseButtonTextComponents = [];\r\n this.myValueDecreaseButtonCursorTargetComponents = [];\r\n this.myValueDecreaseButtonCollisionComponents = [];\r\n\r\n\r\n for (let i = 0; i < this._myConfig.myArraySize; i++) {\r\n this.myValueTextComponents[i] = this.myValueTexts[i].pp_addComponent(TextComponent);\r\n this._setupTextComponent(this.myValueTextComponents[i]);\r\n this.myValueTextComponents[i].text = \" \";\r\n\r\n this.myValueCursorTargetComponents[i] = this.myValueCursorTargets[i].pp_addComponent(CursorTarget);\r\n this.myValueCollisionComponents[i] = this.myValueCursorTargets[i].pp_addComponent(CollisionComponent);\r\n this.myValueCollisionComponents[i].collider = this._myConfig.myCursorTargetCollisionCollider;\r\n this.myValueCollisionComponents[i].group = 1 << this._myConfig.myCursorTargetCollisionGroup;\r\n this.myValueCollisionComponents[i].extents = this._myConfig.myValueCollisionExtents;\r\n\r\n this.myValueIncreaseButtonBackgroundComponents[i] = this.myValueIncreaseButtonBackgrounds[i].pp_addComponent(MeshComponent);\r\n this.myValueIncreaseButtonBackgroundComponents[i].mesh = this._myPlaneMesh;\r\n this.myValueIncreaseButtonBackgroundComponents[i].material = this._myParams.myPlaneMaterial.clone();\r\n this.myValueIncreaseButtonBackgroundComponents[i].material.color = this._myConfig.myBackgroundColor;\r\n\r\n this.myValueIncreaseButtonTextComponents[i] = this.myValueIncreaseButtonTexts[i].pp_addComponent(TextComponent);\r\n this._setupTextComponent(this.myValueIncreaseButtonTextComponents[i]);\r\n this.myValueIncreaseButtonTextComponents[i].text = this._myConfig.myIncreaseButtonText;\r\n\r\n this.myValueIncreaseButtonCursorTargetComponents[i] = this.myValueIncreaseButtonCursorTargets[i].pp_addComponent(CursorTarget);\r\n this.myValueIncreaseButtonCollisionComponents[i] = this.myValueIncreaseButtonCursorTargets[i].pp_addComponent(CollisionComponent);\r\n this.myValueIncreaseButtonCollisionComponents[i].collider = this._myConfig.myCursorTargetCollisionCollider;\r\n this.myValueIncreaseButtonCollisionComponents[i].group = 1 << this._myConfig.myCursorTargetCollisionGroup;\r\n this.myValueIncreaseButtonCollisionComponents[i].extents = this._myConfig.mySideButtonCollisionExtents;\r\n\r\n this.myValueDecreaseButtonBackgroundComponents[i] = this.myValueDecreaseButtonBackgrounds[i].pp_addComponent(MeshComponent);\r\n this.myValueDecreaseButtonBackgroundComponents[i].mesh = this._myPlaneMesh;\r\n this.myValueDecreaseButtonBackgroundComponents[i].material = this._myParams.myPlaneMaterial.clone();\r\n this.myValueDecreaseButtonBackgroundComponents[i].material.color = this._myConfig.myBackgroundColor;\r\n\r\n this.myValueDecreaseButtonTextComponents[i] = this.myValueDecreaseButtonTexts[i].pp_addComponent(TextComponent);\r\n this._setupTextComponent(this.myValueDecreaseButtonTextComponents[i]);\r\n this.myValueDecreaseButtonTextComponents[i].text = this._myConfig.myDecreaseButtonText;\r\n\r\n this.myValueDecreaseButtonCursorTargetComponents[i] = this.myValueDecreaseButtonCursorTargets[i].pp_addComponent(CursorTarget);\r\n this.myValueDecreaseButtonCollisionComponents[i] = this.myValueDecreaseButtonCursorTargets[i].pp_addComponent(CollisionComponent);\r\n this.myValueDecreaseButtonCollisionComponents[i].collider = this._myConfig.myCursorTargetCollisionCollider;\r\n this.myValueDecreaseButtonCollisionComponents[i].group = 1 << this._myConfig.myCursorTargetCollisionGroup;\r\n this.myValueDecreaseButtonCollisionComponents[i].extents = this._myConfig.mySideButtonCollisionExtents;\r\n }\r\n }\r\n\r\n _setVisibleHook(visible) {\r\n if (visible) {\r\n this.setAdditionalButtonsVisible(this._myAdditionalButtonsVisible);\r\n }\r\n }\r\n}", "import { CollisionComponent, MeshComponent, TextComponent } from \"@wonderlandengine/api\";\r\nimport { CursorTarget } from \"@wonderlandengine/components\";\r\nimport { XRUtils } from \"../../../../cauldron/utils/xr_utils.js\";\r\nimport { Globals } from \"../../../../pp/globals.js\";\r\nimport { ToolHandedness } from \"../../../cauldron/tool_types.js\";\r\n\r\nexport class EasyTuneBaseWidgetUI {\r\n\r\n constructor(engine = Globals.getMainEngine()) {\r\n this._myEngine = engine;\r\n\r\n this._myActive = false;\r\n this._myDestroyed = false;\r\n }\r\n\r\n build(parentObject, config, params) {\r\n this._myParentObject = parentObject;\r\n this._myConfig = config;\r\n this._myParams = params;\r\n\r\n this._myImportExportButtonsVisible = true;\r\n\r\n this._myPlaneMesh = Globals.getDefaultMeshes(this._myEngine).myDoubleSidedPlane;\r\n\r\n this._buildHook();\r\n\r\n this._createSkeleton();\r\n this._setTransforms();\r\n this._addComponents();\r\n\r\n this._setTransformForNonXR();\r\n\r\n this.setActive(true);\r\n }\r\n\r\n setVisible(visible) {\r\n this.myPivotObject.pp_setActive(visible);\r\n\r\n if (visible) {\r\n this.setImportExportButtonsVisible(this._myImportExportButtonsVisible);\r\n }\r\n\r\n this._setVisibleHook(visible);\r\n }\r\n\r\n setImportExportButtonsVisible(visible) {\r\n this._myImportExportButtonsVisible = visible;\r\n\r\n this.myImportExportPanel.pp_setActive(this._myImportExportButtonsVisible);\r\n }\r\n\r\n // Hooks\r\n\r\n _buildHook() {\r\n }\r\n\r\n _setVisibleHook(visible) {\r\n }\r\n\r\n _createSkeletonHook() {\r\n }\r\n\r\n _setTransformHook() {\r\n }\r\n\r\n _addComponentsHook() {\r\n }\r\n\r\n // Hooks end\r\n\r\n // Skeleton\r\n\r\n _createSkeleton() {\r\n this.myPivotObject = this._myParentObject.pp_addChild();\r\n\r\n this.myBackPanel = this.myPivotObject.pp_addChild();\r\n this.myBackBackground = this.myBackPanel.pp_addChild();\r\n\r\n // Display\r\n\r\n this.myDisplayPanel = this.myPivotObject.pp_addChild();\r\n\r\n this.myVariableLabelPanel = this.myDisplayPanel.pp_addChild();\r\n this.myVariableLabelText = this.myVariableLabelPanel.pp_addChild();\r\n this.myVariableLabelCursorTarget = this.myVariableLabelPanel.pp_addChild();\r\n\r\n // Next/Previous\r\n\r\n this.myNextButtonPanel = this.myVariableLabelPanel.pp_addChild();\r\n this.myNextButtonBackground = this.myNextButtonPanel.pp_addChild();\r\n this.myNextButtonText = this.myNextButtonPanel.pp_addChild();\r\n this.myNextButtonCursorTarget = this.myNextButtonPanel.pp_addChild();\r\n\r\n this.myPreviousButtonPanel = this.myVariableLabelPanel.pp_addChild();\r\n this.myPreviousButtonBackground = this.myPreviousButtonPanel.pp_addChild();\r\n this.myPreviousButtonText = this.myPreviousButtonPanel.pp_addChild();\r\n this.myPreviousButtonCursorTarget = this.myPreviousButtonPanel.pp_addChild();\r\n\r\n // Import/Export\r\n\r\n this.myImportExportPanel = this.myPivotObject.pp_addChild();\r\n\r\n this.myImportButtonPanel = this.myImportExportPanel.pp_addChild();\r\n this.myImportButtonBackground = this.myImportButtonPanel.pp_addChild();\r\n this.myImportButtonText = this.myImportButtonPanel.pp_addChild();\r\n this.myImportButtonCursorTarget = this.myImportButtonPanel.pp_addChild();\r\n\r\n this.myExportButtonPanel = this.myImportExportPanel.pp_addChild();\r\n this.myExportButtonBackground = this.myExportButtonPanel.pp_addChild();\r\n this.myExportButtonText = this.myExportButtonPanel.pp_addChild();\r\n this.myExportButtonCursorTarget = this.myExportButtonPanel.pp_addChild();\r\n\r\n // Pointer\r\n\r\n this.myPointerCursorTarget = this.myPivotObject.pp_addChild();\r\n\r\n this._createSkeletonHook();\r\n }\r\n\r\n // Transforms\r\n\r\n _setTransforms() {\r\n this.myPivotObject.pp_setPositionLocal(this._myConfig.myPivotObjectPositions[this._myParams.myHandedness]);\r\n\r\n this.myBackPanel.pp_setPositionLocal(this._myConfig.myBackPanelPosition);\r\n this.myBackBackground.pp_scaleObject(this._myConfig.myBackBackgroundScale);\r\n\r\n // Display\r\n this.myDisplayPanel.pp_setPositionLocal(this._myConfig.myDisplayPanelPosition);\r\n\r\n this.myVariableLabelPanel.pp_setPositionLocal(this._myConfig.myVariableLabelPanelPosition);\r\n this.myVariableLabelText.pp_scaleObject(this._myConfig.myVariableLabelTextScale);\r\n this.myVariableLabelCursorTarget.pp_setPositionLocal(this._myConfig.myVariableLabelCursorTargetPosition);\r\n\r\n // Next/Previous\r\n\r\n this.myNextButtonPanel.pp_setPositionLocal(this._myConfig.myRightSideButtonPosition);\r\n this.myNextButtonBackground.pp_scaleObject(this._myConfig.mySideButtonBackgroundScale);\r\n this.myNextButtonText.pp_setPositionLocal(this._myConfig.mySideButtonTextPosition);\r\n this.myNextButtonText.pp_scaleObject(this._myConfig.mySideButtonTextScale);\r\n this.myNextButtonCursorTarget.pp_setPositionLocal(this._myConfig.mySideButtonCursorTargetPosition);\r\n\r\n this.myPreviousButtonPanel.pp_setPositionLocal(this._myConfig.myLeftSideButtonPosition);\r\n this.myPreviousButtonBackground.pp_scaleObject(this._myConfig.mySideButtonBackgroundScale);\r\n this.myPreviousButtonText.pp_setPositionLocal(this._myConfig.mySideButtonTextPosition);\r\n this.myPreviousButtonText.pp_scaleObject(this._myConfig.mySideButtonTextScale);\r\n this.myPreviousButtonCursorTarget.pp_setPositionLocal(this._myConfig.mySideButtonCursorTargetPosition);\r\n\r\n // Import/Export\r\n\r\n this.myImportExportPanel.pp_setPositionLocal(this._myConfig.myImportExportPanelPosition);\r\n\r\n this.myImportButtonPanel.pp_setPositionLocal(this._myConfig.myImportButtonPosition);\r\n this.myImportButtonBackground.pp_scaleObject(this._myConfig.myImportExportButtonBackgroundScale);\r\n this.myImportButtonText.pp_setPositionLocal(this._myConfig.myImportExportButtonTextPosition);\r\n this.myImportButtonText.pp_scaleObject(this._myConfig.myImportExportButtonTextScale);\r\n this.myImportButtonCursorTarget.pp_setPositionLocal(this._myConfig.myImportExportButtonCursorTargetPosition);\r\n\r\n this.myExportButtonPanel.pp_setPositionLocal(this._myConfig.myExportButtonPosition);\r\n this.myExportButtonBackground.pp_scaleObject(this._myConfig.myImportExportButtonBackgroundScale);\r\n this.myExportButtonText.pp_setPositionLocal(this._myConfig.myImportExportButtonTextPosition);\r\n this.myExportButtonText.pp_scaleObject(this._myConfig.myImportExportButtonTextScale);\r\n this.myExportButtonCursorTarget.pp_setPositionLocal(this._myConfig.myImportExportButtonCursorTargetPosition);\r\n\r\n // Pointer\r\n\r\n this.myPointerCursorTarget.pp_setPositionLocal(this._myConfig.myPointerCursorTargetPosition);\r\n\r\n this._setTransformHook();\r\n }\r\n\r\n // Components\r\n\r\n _addComponents() {\r\n this.myBackBackgroundComponent = this.myBackBackground.pp_addComponent(MeshComponent);\r\n this.myBackBackgroundComponent.mesh = this._myPlaneMesh;\r\n this.myBackBackgroundComponent.material = this._myParams.myPlaneMaterial.clone();\r\n this.myBackBackgroundComponent.material.color = this._myConfig.myBackBackgroundColor;\r\n\r\n // Display\r\n\r\n this.myVariableLabelTextComponent = this.myVariableLabelText.pp_addComponent(TextComponent);\r\n this._setupTextComponent(this.myVariableLabelTextComponent);\r\n this.myVariableLabelTextComponent.text = \" \";\r\n\r\n this.myVariableLabelCursorTargetComponent = this.myVariableLabelCursorTarget.pp_addComponent(CursorTarget);\r\n this.myVariableLabelCollisionComponent = this.myVariableLabelCursorTarget.pp_addComponent(CollisionComponent);\r\n this.myVariableLabelCollisionComponent.collider = this._myConfig.myCursorTargetCollisionCollider;\r\n this.myVariableLabelCollisionComponent.group = 1 << this._myConfig.myCursorTargetCollisionGroup;\r\n this.myVariableLabelCollisionComponent.extents = this._myConfig.myVariableLabelCollisionExtents;\r\n\r\n // Next/Previous\r\n\r\n this.myNextButtonBackgroundComponent = this.myNextButtonBackground.pp_addComponent(MeshComponent);\r\n this.myNextButtonBackgroundComponent.mesh = this._myPlaneMesh;\r\n this.myNextButtonBackgroundComponent.material = this._myParams.myPlaneMaterial.clone();\r\n this.myNextButtonBackgroundComponent.material.color = this._myConfig.myBackgroundColor;\r\n\r\n this.myNextButtonTextComponent = this.myNextButtonText.pp_addComponent(TextComponent);\r\n this._setupTextComponent(this.myNextButtonTextComponent);\r\n this.myNextButtonTextComponent.text = this._myConfig.myNextButtonText;\r\n\r\n this.myNextButtonCursorTargetComponent = this.myNextButtonCursorTarget.pp_addComponent(CursorTarget);\r\n this.myNextButtonCollisionComponent = this.myNextButtonCursorTarget.pp_addComponent(CollisionComponent);\r\n this.myNextButtonCollisionComponent.collider = this._myConfig.myCursorTargetCollisionCollider;\r\n this.myNextButtonCollisionComponent.group = 1 << this._myConfig.myCursorTargetCollisionGroup;\r\n this.myNextButtonCollisionComponent.extents = this._myConfig.mySideButtonCollisionExtents;\r\n\r\n this.myPreviousButtonBackgroundComponent = this.myPreviousButtonBackground.pp_addComponent(MeshComponent);\r\n this.myPreviousButtonBackgroundComponent.mesh = this._myPlaneMesh;\r\n this.myPreviousButtonBackgroundComponent.material = this._myParams.myPlaneMaterial.clone();\r\n this.myPreviousButtonBackgroundComponent.material.color = this._myConfig.myBackgroundColor;\r\n\r\n this.myPreviousButtonTextComponent = this.myPreviousButtonText.pp_addComponent(TextComponent);\r\n this._setupTextComponent(this.myPreviousButtonTextComponent);\r\n this.myPreviousButtonTextComponent.text = this._myConfig.myPreviousButtonText;\r\n\r\n this.myPreviousButtonCursorTargetComponent = this.myPreviousButtonCursorTarget.pp_addComponent(CursorTarget);\r\n this.myPreviousButtonCollisionComponent = this.myPreviousButtonCursorTarget.pp_addComponent(CollisionComponent);\r\n this.myPreviousButtonCollisionComponent.collider = this._myConfig.myCursorTargetCollisionCollider;\r\n this.myPreviousButtonCollisionComponent.group = 1 << this._myConfig.myCursorTargetCollisionGroup;\r\n this.myPreviousButtonCollisionComponent.extents = this._myConfig.mySideButtonCollisionExtents;\r\n\r\n // Import/Export\r\n\r\n this.myImportButtonBackgroundComponent = this.myImportButtonBackground.pp_addComponent(MeshComponent);\r\n this.myImportButtonBackgroundComponent.mesh = this._myPlaneMesh;\r\n this.myImportButtonBackgroundComponent.material = this._myParams.myPlaneMaterial.clone();\r\n this.myImportButtonBackgroundComponent.material.color = this._myConfig.myBackgroundColor;\r\n\r\n this.myImportButtonTextComponent = this.myImportButtonText.pp_addComponent(TextComponent);\r\n this._setupTextComponent(this.myImportButtonTextComponent);\r\n this.myImportButtonTextComponent.text = this._myConfig.myImportButtonText;\r\n\r\n this.myImportButtonCursorTargetComponent = this.myImportButtonCursorTarget.pp_addComponent(CursorTarget);\r\n this.myImportButtonCollisionComponent = this.myImportButtonCursorTarget.pp_addComponent(CollisionComponent);\r\n this.myImportButtonCollisionComponent.collider = this._myConfig.myCursorTargetCollisionCollider;\r\n this.myImportButtonCollisionComponent.group = 1 << this._myConfig.myCursorTargetCollisionGroup;\r\n this.myImportButtonCollisionComponent.extents = this._myConfig.myImportExportButtonCollisionExtents;\r\n\r\n this.myExportButtonBackgroundComponent = this.myExportButtonBackground.pp_addComponent(MeshComponent);\r\n this.myExportButtonBackgroundComponent.mesh = this._myPlaneMesh;\r\n this.myExportButtonBackgroundComponent.material = this._myParams.myPlaneMaterial.clone();\r\n this.myExportButtonBackgroundComponent.material.color = this._myConfig.myBackgroundColor;\r\n\r\n this.myExportButtonTextComponent = this.myExportButtonText.pp_addComponent(TextComponent);\r\n this._setupTextComponent(this.myExportButtonTextComponent);\r\n this.myExportButtonTextComponent.text = this._myConfig.myExportButtonText;\r\n\r\n this.myExportButtonCursorTargetComponent = this.myExportButtonCursorTarget.pp_addComponent(CursorTarget);\r\n this.myExportButtonCollisionComponent = this.myExportButtonCursorTarget.pp_addComponent(CollisionComponent);\r\n this.myExportButtonCollisionComponent.collider = this._myConfig.myCursorTargetCollisionCollider;\r\n this.myExportButtonCollisionComponent.group = 1 << this._myConfig.myCursorTargetCollisionGroup;\r\n this.myExportButtonCollisionComponent.extents = this._myConfig.myImportExportButtonCollisionExtents;\r\n\r\n // Pointer\r\n\r\n this.myPointerCollisionComponent = this.myPointerCursorTarget.pp_addComponent(CollisionComponent);\r\n this.myPointerCollisionComponent.collider = this._myConfig.myCursorTargetCollisionCollider;\r\n this.myPointerCollisionComponent.group = 1 << this._myConfig.myCursorTargetCollisionGroup;\r\n this.myPointerCollisionComponent.extents = this._myConfig.myPointerCollisionExtents;\r\n\r\n this._addComponentsHook();\r\n }\r\n\r\n _setupTextComponent(textComponent) {\r\n textComponent.alignment = this._myConfig.myTextAlignment;\r\n textComponent.verticalAlignment = this._myConfig.myTextVerticalAlignment;\r\n textComponent.material = this._myParams.myTextMaterial.clone();\r\n textComponent.material.color = this._myConfig.myTextColor;\r\n textComponent.text = \"\";\r\n }\r\n\r\n _onXRSessionStart() {\r\n this._setTransformForXR();\r\n }\r\n\r\n _onXRSessionEnd() {\r\n this._setTransformForNonXR();\r\n }\r\n\r\n _setTransformForXR() {\r\n this.myPivotObject.pp_setPositionLocal(this._myConfig.myPivotObjectPositions[this._myParams.myHandedness]);\r\n }\r\n\r\n _setTransformForNonXR() {\r\n this.myPivotObject.pp_setPositionLocal(this._myConfig.myPivotObjectPositions[ToolHandedness.NONE]);\r\n }\r\n\r\n setActive(active) {\r\n if (this._myActive != active) {\r\n this._myActive = active;\r\n\r\n if (this._myActive) {\r\n XRUtils.registerSessionStartEndEventListeners(this, this._onXRSessionStart.bind(this), this._onXRSessionEnd.bind(this), true, false, this._myEngine);\r\n } else {\r\n XRUtils.unregisterSessionStartEndEventListeners(this, this._myEngine);\r\n }\r\n }\r\n }\r\n\r\n destroy() {\r\n this._myDestroyed = true;\r\n\r\n this.setActive(false);\r\n }\r\n\r\n isDestroyed() {\r\n return this._myDestroyed;\r\n }\r\n}", "import { GamepadAxesID } from \"../../../../input/gamepad/gamepad_buttons.js\";\r\nimport { Globals } from \"../../../../pp/globals.js\";\r\nimport { EasyTuneBaseWidget } from \"../base/easy_tune_base_widget.js\";\r\nimport { EasyTuneBoolArrayWidgetConfig } from \"./easy_tune_bool_array_widget_config.js\";\r\nimport { EasyTuneBoolArrayWidgetUI } from \"./easy_tune_bool_array_widget_ui.js\";\r\n\r\nexport class EasyTuneBoolArrayWidget extends EasyTuneBaseWidget {\r\n\r\n constructor(params, arraySize, gamepad, engine = Globals.getMainEngine()) {\r\n super(params);\r\n\r\n this._myNonArray = arraySize == null;\r\n this._myArraySize = this._myNonArray ? 1 : arraySize;\r\n\r\n this._myConfig = new EasyTuneBoolArrayWidgetConfig(this._myArraySize);\r\n this._myUI = new EasyTuneBoolArrayWidgetUI(engine);\r\n\r\n this._myGamepad = gamepad;\r\n\r\n this._myValueEditIndex = 0;\r\n this._myValueButtonEditIntensity = 0;\r\n this._myValueButtonEditIntensityTimer = 0;\r\n this._myValueEditEnabled = false;\r\n\r\n this._myTempValue = [];\r\n\r\n this._myTempNonArrayValue = [0];\r\n this._myTempNonArrayDefaultValue = [0];\r\n }\r\n\r\n _refreshUIHook() {\r\n for (let i = 0; i < this._myArraySize; i++) {\r\n this._myUI.myValueTextComponents[i].text = (this._getVariableValue()[i]) ? \"true\" : \"false\";\r\n }\r\n }\r\n\r\n _startHook(parentObject, easyTuneParams) {\r\n this._myUI.setAdditionalButtonsVisible(easyTuneParams.myShowAdditionalButtons);\r\n }\r\n\r\n _setEasyTuneVariableHook() {\r\n if (this._myVariable != null) {\r\n this._myTempValue.pp_copy(this._getVariableValue());\r\n }\r\n }\r\n\r\n _updateHook(dt) {\r\n this._updateValue(dt);\r\n }\r\n\r\n _updateValue(dt) {\r\n let stickVariableIntensity = 0;\r\n\r\n if (this._myGamepad) {\r\n stickVariableIntensity = this._myGamepad.getAxesInfo(GamepadAxesID.THUMBSTICK).myAxes[1];\r\n }\r\n\r\n let valueIntensity = 0;\r\n if (this._myValueEditEnabled) {\r\n valueIntensity = stickVariableIntensity;\r\n } else if (this._myValueButtonEditIntensity != 0) {\r\n if (this._myValueButtonEditIntensityTimer <= 0) {\r\n valueIntensity = this._myValueButtonEditIntensity;\r\n } else {\r\n this._myValueButtonEditIntensityTimer -= dt;\r\n }\r\n }\r\n\r\n if (this._myValueEditIndex >= 0 && this._myValueEditIndex < this._getVariableValue().length) {\r\n if (Math.abs(valueIntensity) > this._myConfig.myThumbstickToggleThreshold) {\r\n this._myTempValue.pp_copy(this._getVariableValue());\r\n this._myTempValue[this._myValueEditIndex] = valueIntensity > 0;\r\n this._setVariableValue(this._myTempValue);\r\n this._refreshUI();\r\n }\r\n }\r\n }\r\n\r\n _addListenersHook() {\r\n let ui = this._myUI;\r\n\r\n ui.myVariableLabelCursorTargetComponent.onClick.add(this._resetAllValues.bind(this));\r\n ui.myVariableLabelCursorTargetComponent.onHover.add(this._genericTextHover.bind(this, ui.myVariableLabelText));\r\n ui.myVariableLabelCursorTargetComponent.onUnhover.add(this._genericTextUnhover.bind(this, ui.myVariableLabelText, this._myConfig.myVariableLabelTextScale));\r\n\r\n this._myUnhoverCallbacks.push(this._genericTextUnhover.bind(this, ui.myVariableLabelText, this._myConfig.myVariableLabelTextScale));\r\n\r\n for (let i = 0; i < this._myArraySize; i++) {\r\n ui.myValueIncreaseButtonCursorTargetComponents[i].onDown.add(this._setValueEditIntensity.bind(this, i, 1));\r\n ui.myValueIncreaseButtonCursorTargetComponents[i].onDownOnHover.add(this._setValueEditIntensity.bind(this, i, 1));\r\n ui.myValueIncreaseButtonCursorTargetComponents[i].onUp.add(this._setValueEditIntensity.bind(this, i, 0));\r\n ui.myValueIncreaseButtonCursorTargetComponents[i].onUnhover.add(this._setValueEditIntensity.bind(this, i, 0));\r\n ui.myValueDecreaseButtonCursorTargetComponents[i].onDown.add(this._setValueEditIntensity.bind(this, i, -1));\r\n ui.myValueDecreaseButtonCursorTargetComponents[i].onDownOnHover.add(this._setValueEditIntensity.bind(this, i, -1));\r\n ui.myValueDecreaseButtonCursorTargetComponents[i].onUp.add(this._setValueEditIntensity.bind(this, i, 0));\r\n ui.myValueDecreaseButtonCursorTargetComponents[i].onUnhover.add(this._setValueEditIntensity.bind(this, i, 0));\r\n\r\n this._myUnhoverCallbacks.push(this._setValueEditIntensity.bind(this, i, 0));\r\n\r\n ui.myValueIncreaseButtonCursorTargetComponents[i].onHover.add(this._genericHover.bind(this, ui.myValueIncreaseButtonBackgroundComponents[i].material));\r\n ui.myValueIncreaseButtonCursorTargetComponents[i].onUnhover.add(this._genericUnhover.bind(this, ui.myValueIncreaseButtonBackgroundComponents[i].material));\r\n ui.myValueDecreaseButtonCursorTargetComponents[i].onHover.add(this._genericHover.bind(this, ui.myValueDecreaseButtonBackgroundComponents[i].material));\r\n ui.myValueDecreaseButtonCursorTargetComponents[i].onUnhover.add(this._genericUnhover.bind(this, ui.myValueDecreaseButtonBackgroundComponents[i].material));\r\n\r\n this._myUnhoverCallbacks.push(this._genericUnhover.bind(this, ui.myValueIncreaseButtonBackgroundComponents[i].material));\r\n this._myUnhoverCallbacks.push(this._genericUnhover.bind(this, ui.myValueDecreaseButtonBackgroundComponents[i].material));\r\n\r\n ui.myValueCursorTargetComponents[i].onClick.add(this._resetValue.bind(this, i));\r\n ui.myValueCursorTargetComponents[i].onHover.add(this._setValueEditEnabled.bind(this, i, ui.myValueTexts[i], true));\r\n ui.myValueCursorTargetComponents[i].onUnhover.add(this._setValueEditEnabled.bind(this, i, ui.myValueTexts[i], false));\r\n\r\n this._myUnhoverCallbacks.push(this._setValueEditEnabled.bind(this, i, ui.myValueTexts[i], false));\r\n }\r\n }\r\n\r\n _setValueEditIntensity(index, value) {\r\n if (this._isActive() || value == 0) {\r\n if (value != 0) {\r\n this._myValueButtonEditIntensityTimer = this._myConfig.myButtonEditDelay;\r\n this._myValueEditIndex = index;\r\n }\r\n\r\n this._myValueButtonEditIntensity = value;\r\n }\r\n }\r\n\r\n _setValueEditEnabled(index, text, enabled) {\r\n if (this._isActive() || !enabled) {\r\n if (enabled) {\r\n this._myValueEditIndex = index;\r\n text.pp_scaleObject(this._myConfig.myTextHoverScaleMultiplier);\r\n } else {\r\n text.pp_setScaleLocal(this._myConfig.myValueTextScale);\r\n }\r\n\r\n this._myValueEditEnabled = enabled;\r\n }\r\n }\r\n\r\n _resetValue(index) {\r\n if (this._isActive()) {\r\n this._myTempValue.pp_copy(this._getVariableValue());\r\n this._myTempValue[index] = this._getVariableDefaultValue()[index];\r\n this._setVariableValue(this._myTempValue);\r\n\r\n this._myUI.myValueTextComponents[index].text = (this._getVariableValue()[index]) ? \"true\" : \"false\";\r\n }\r\n }\r\n\r\n _resetAllValues() {\r\n for (let i = 0; i < this._myArraySize; i++) {\r\n this._resetValue(i);\r\n }\r\n }\r\n\r\n _genericTextHover(text) {\r\n text.pp_scaleObject(this._myConfig.myTextHoverScaleMultiplier);\r\n }\r\n\r\n _genericTextUnhover(text, originalScale) {\r\n text.pp_setScaleLocal(originalScale);\r\n }\r\n\r\n _getVariableValue() {\r\n if (this._myNonArray) {\r\n this._myTempNonArrayValue[0] = this._myVariable.getValue();\r\n return this._myTempNonArrayValue;\r\n }\r\n\r\n return this._myVariable.getValue();\r\n }\r\n\r\n _getVariableDefaultValue() {\r\n if (this._myNonArray) {\r\n this._myTempNonArrayDefaultValue[0] = this._myVariable.getDefaultValue();\r\n return this._myTempNonArrayDefaultValue;\r\n }\r\n\r\n return this._myVariable.getDefaultValue();\r\n }\r\n\r\n _setVariableValue(value) {\r\n if (this._myNonArray) {\r\n this._myVariable.setValue(value[0]);\r\n } else {\r\n this._myVariable.setValue(this._myTempValue);\r\n }\r\n }\r\n}", "import { EasyTuneBaseArrayWidgetSelector } from \"../base/easy_tune_base_array_widget_selector.js\";\r\nimport { EasyTuneBoolArrayWidget } from \"./easy_tune_bool_array_widget.js\";\r\n\r\nexport class EasyTuneBoolArrayWidgetSelector extends EasyTuneBaseArrayWidgetSelector {\r\n\r\n _getEasyTuneArrayWidget(arraySize) {\r\n return new EasyTuneBoolArrayWidget(this._myParams, arraySize, this._myGamepad, this._myEngine);\r\n }\r\n}", "import { ToolHandedness } from \"../../cauldron/tool_types.js\";\r\n\r\nexport class EasyTuneWidgetConfig {\r\n\r\n constructor() {\r\n this._setupRuntimeConfig();\r\n }\r\n\r\n _setupRuntimeConfig() {\r\n this.myGamepadHandedness = ToolHandedness.RIGHT;\r\n\r\n this.myScrollVariableDelay = 0.5;\r\n this.myScrollVariableMinXThreshold = 0.6;\r\n this.myScrollVariableMaxYThreshold = 0.25;\r\n this.myScrollVariableButtonID = null;\r\n\r\n this.myRefreshVariablesDelay = null;\r\n }\r\n}", "import { vec3_create } from \"../../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { EasyTuneBaseWidgetConfig } from \"../base/easy_tune_base_widget_config.js\";\r\n\r\nexport class EasyTuneNoneWidgetConfig extends EasyTuneBaseWidgetConfig {\r\n\r\n _getBackPanelMinY() {\r\n return super._getBackPanelMinY() + this.myTypeNotSupportedPanelPosition[1];\r\n }\r\n\r\n _getPivotZOffset() {\r\n return 0.00804713;\r\n }\r\n\r\n _setupBuildConfigHook() {\r\n this.myTypeNotSupportedPanelPosition = vec3_create(0, -0.03, this._myPanelZOffset);\r\n this.myTypeNotSupportedTextScale = vec3_create(0.275, 0.275, 0.275);\r\n this.myTypeNotSupportedText = \"Type Not Supported\";\r\n }\r\n}", "import { TextComponent } from \"@wonderlandengine/api\";\r\nimport { EasyTuneBaseWidgetUI } from \"../base/easy_tune_base_widget_ui.js\";\r\n\r\nexport class EasyTuneNoneWidgetUI extends EasyTuneBaseWidgetUI {\r\n\r\n constructor(engine) {\r\n super(engine);\r\n }\r\n\r\n _createSkeletonHook() {\r\n this.myTypeNotSupportedPanel = this.myDisplayPanel.pp_addChild();\r\n this.myTypeNotSupportedText = this.myTypeNotSupportedPanel.pp_addChild();\r\n this.myTypeNotSupportedCursorTarget = this.myTypeNotSupportedPanel.pp_addChild();\r\n }\r\n\r\n _setTransformHook() {\r\n this.myTypeNotSupportedPanel.pp_setPositionLocal(this._myConfig.myTypeNotSupportedPanelPosition);\r\n this.myTypeNotSupportedText.pp_scaleObject(this._myConfig.myTypeNotSupportedTextScale);\r\n }\r\n\r\n _addComponentsHook() {\r\n this.myTypeNotSupportedTextComponent = this.myTypeNotSupportedText.pp_addComponent(TextComponent);\r\n this._setupTextComponent(this.myTypeNotSupportedTextComponent);\r\n this.myTypeNotSupportedTextComponent.text = this._myConfig.myTypeNotSupportedText;\r\n }\r\n}", "import { Globals } from \"../../../../pp/globals.js\";\r\nimport { EasyTuneBaseWidget } from \"../base/easy_tune_base_widget.js\";\r\nimport { EasyTuneNoneWidgetConfig } from \"./easy_tune_none_widget_config.js\";\r\nimport { EasyTuneNoneWidgetUI } from \"./easy_tune_none_widget_ui.js\";\r\n\r\nexport class EasyTuneNoneWidget extends EasyTuneBaseWidget {\r\n\r\n constructor(params, engine = Globals.getMainEngine()) {\r\n super(params);\r\n\r\n this._myConfig = new EasyTuneNoneWidgetConfig();\r\n this._myUI = new EasyTuneNoneWidgetUI(engine);\r\n }\r\n}", "import { vec3_create } from \"../../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { EasyTuneBaseWidgetConfig } from \"../base/easy_tune_base_widget_config.js\";\r\n\r\nexport class EasyTuneNumberArrayWidgetConfig extends EasyTuneBaseWidgetConfig {\r\n\r\n constructor(arraySize) {\r\n super();\r\n\r\n this.myArraySize = arraySize;\r\n }\r\n\r\n _getBackPanelMinY() {\r\n return this.myStepPanelPosition[1] - this._mySideButtonDistanceFromBorder * 1.25 - this.mySideButtonBackgroundScale[1];\r\n }\r\n\r\n _getPivotZOffset() {\r\n return 0.00803713;\r\n }\r\n\r\n _setupBuildConfigHook() {\r\n this.myIncreaseButtonText = \"+\";\r\n this.myDecreaseButtonText = \"-\";\r\n\r\n this._myValuePanelDistanceFromVariableLabelPanel = 0.055;\r\n this._myDistanceBetweenValues = this.mySideButtonBackgroundScale[1] * 2 + 0.015;\r\n\r\n this.myValuesPanelPosition = [0, this.myVariableLabelPanelPosition[1] - this._myValuePanelDistanceFromVariableLabelPanel, this._myPanelZOffset];\r\n\r\n this.myValueTextScale = vec3_create(0.4, 0.4, 0.4);\r\n\r\n this.myValueCursorTargetPosition = vec3_create(0, 0, 0);\r\n this.myValueCursorTargetPosition[2] = this._myColliderZOffset - this._myPanelZOffset;\r\n this.myValueCollisionExtents = vec3_create(0.065, 0.02, 1);\r\n this.myValueCollisionExtents[2] = this.myCursorTargetCollisionThickness;\r\n\r\n this.myValuePanelsPositions = [];\r\n this.myValuePanelsPositions[0] = vec3_create(0, 0, 0);\r\n for (let i = 1; i < this.myArraySize; i++) {\r\n this.myValuePanelsPositions[i] = this.myValuePanelsPositions[i - 1].pp_clone();\r\n this.myValuePanelsPositions[i][1] -= this._myDistanceBetweenValues;\r\n }\r\n\r\n let valuePanelLastPosition = (this.myValuePanelsPositions[this.myArraySize - 1]) ? this.myValuePanelsPositions[this.myArraySize - 1][1] : 0;\r\n this.myStepPanelPosition = [0, this.myDisplayPanelPosition[1] + this.myValuesPanelPosition[1] + valuePanelLastPosition - this._myValuePanelDistanceFromVariableLabelPanel, this._myPanelZOffset];\r\n this.myStepTextScale = this.myLabelTextScale;\r\n this.myStepStartString = \"Step: \";\r\n\r\n this.myStepCursorTargetPosition = vec3_create(0, 0, 0);\r\n this.myStepCursorTargetPosition[2] = this._myColliderZOffset - this.myStepPanelPosition[2];\r\n this.myStepCollisionExtents = vec3_create(0.065, 0.0175, 1);\r\n this.myStepCollisionExtents[2] = this.myCursorTargetCollisionThickness;\r\n }\r\n\r\n _setupRuntimeConfigHook() {\r\n this.myTextHoverScaleMultiplier = vec3_create(1.1, 1.1, 1.1);\r\n\r\n this.myEditThumbstickMinThreshold = 0.35;\r\n this.myStepMultiplierStepPerSecond = 2.25;\r\n this.myButtonEditDelay = 0;\r\n }\r\n}", "import { CollisionComponent, MeshComponent, TextComponent } from \"@wonderlandengine/api\";\r\nimport { CursorTarget } from \"@wonderlandengine/components\";\r\nimport { EasyTuneBaseWidgetUI } from \"../base/easy_tune_base_widget_ui.js\";\r\n\r\nexport class EasyTuneNumberArrayWidgetUI extends EasyTuneBaseWidgetUI {\r\n\r\n constructor(engine) {\r\n super(engine);\r\n }\r\n\r\n setAdditionalButtonsVisible(visible) {\r\n this._myAdditionalButtonsVisible = visible;\r\n\r\n for (let i = 0; i < this._myConfig.myArraySize; i++) {\r\n this.myValueIncreaseButtonPanels[i].pp_setActive(this._myAdditionalButtonsVisible);\r\n this.myValueDecreaseButtonPanels[i].pp_setActive(this._myAdditionalButtonsVisible);\r\n }\r\n\r\n this.myStepIncreaseButtonPanel.pp_setActive(this._myAdditionalButtonsVisible);\r\n this.myStepDecreaseButtonPanel.pp_setActive(this._myAdditionalButtonsVisible);\r\n }\r\n\r\n _buildHook() {\r\n this._myAdditionalButtonsVisible = true;\r\n }\r\n\r\n _createSkeletonHook() {\r\n this.myValuesPanel = this.myDisplayPanel.pp_addChild();\r\n\r\n this.myValuePanels = [];\r\n this.myValueTexts = [];\r\n this.myValueCursorTargets = [];\r\n\r\n this.myValueIncreaseButtonPanels = [];\r\n this.myValueIncreaseButtonBackgrounds = [];\r\n this.myValueIncreaseButtonTexts = [];\r\n this.myValueIncreaseButtonCursorTargets = [];\r\n\r\n this.myValueDecreaseButtonPanels = [];\r\n this.myValueDecreaseButtonBackgrounds = [];\r\n this.myValueDecreaseButtonTexts = [];\r\n this.myValueDecreaseButtonCursorTargets = [];\r\n\r\n for (let i = 0; i < this._myConfig.myArraySize; i++) {\r\n this.myValuePanels[i] = this.myValuesPanel.pp_addChild();\r\n this.myValueTexts[i] = this.myValuePanels[i].pp_addChild();\r\n this.myValueCursorTargets[i] = this.myValuePanels[i].pp_addChild();\r\n\r\n this.myValueIncreaseButtonPanels[i] = this.myValuePanels[i].pp_addChild();\r\n this.myValueIncreaseButtonBackgrounds[i] = this.myValueIncreaseButtonPanels[i].pp_addChild();\r\n this.myValueIncreaseButtonTexts[i] = this.myValueIncreaseButtonPanels[i].pp_addChild();\r\n this.myValueIncreaseButtonCursorTargets[i] = this.myValueIncreaseButtonPanels[i].pp_addChild();\r\n\r\n this.myValueDecreaseButtonPanels[i] = this.myValuePanels[i].pp_addChild();\r\n this.myValueDecreaseButtonBackgrounds[i] = this.myValueDecreaseButtonPanels[i].pp_addChild();\r\n this.myValueDecreaseButtonTexts[i] = this.myValueDecreaseButtonPanels[i].pp_addChild();\r\n this.myValueDecreaseButtonCursorTargets[i] = this.myValueDecreaseButtonPanels[i].pp_addChild();\r\n }\r\n\r\n this.myStepPanel = this.myPivotObject.pp_addChild();\r\n this.myStepText = this.myStepPanel.pp_addChild();\r\n this.myStepCursorTarget = this.myStepPanel.pp_addChild();\r\n\r\n this.myStepIncreaseButtonPanel = this.myStepPanel.pp_addChild();\r\n this.myStepIncreaseButtonBackground = this.myStepIncreaseButtonPanel.pp_addChild();\r\n this.myStepIncreaseButtonText = this.myStepIncreaseButtonPanel.pp_addChild();\r\n this.myStepIncreaseButtonCursorTarget = this.myStepIncreaseButtonPanel.pp_addChild();\r\n\r\n this.myStepDecreaseButtonPanel = this.myStepPanel.pp_addChild();\r\n this.myStepDecreaseButtonBackground = this.myStepDecreaseButtonPanel.pp_addChild();\r\n this.myStepDecreaseButtonText = this.myStepDecreaseButtonPanel.pp_addChild();\r\n this.myStepDecreaseButtonCursorTarget = this.myStepDecreaseButtonPanel.pp_addChild();\r\n }\r\n\r\n _setTransformHook() {\r\n this.myValuesPanel.pp_setPositionLocal(this._myConfig.myValuesPanelPosition);\r\n\r\n for (let i = 0; i < this._myConfig.myArraySize; i++) {\r\n this.myValuePanels[i].pp_setPositionLocal(this._myConfig.myValuePanelsPositions[i]);\r\n this.myValueTexts[i].pp_scaleObject(this._myConfig.myValueTextScale);\r\n this.myValueCursorTargets[i].pp_setPositionLocal(this._myConfig.myValueCursorTargetPosition);\r\n\r\n this.myValueIncreaseButtonPanels[i].pp_setPositionLocal(this._myConfig.myRightSideButtonPosition);\r\n this.myValueIncreaseButtonBackgrounds[i].pp_scaleObject(this._myConfig.mySideButtonBackgroundScale);\r\n this.myValueIncreaseButtonTexts[i].pp_setPositionLocal(this._myConfig.mySideButtonTextPosition);\r\n this.myValueIncreaseButtonTexts[i].pp_scaleObject(this._myConfig.mySideButtonTextScale);\r\n this.myValueIncreaseButtonCursorTargets[i].pp_setPositionLocal(this._myConfig.mySideButtonCursorTargetPosition);\r\n\r\n this.myValueDecreaseButtonPanels[i].pp_setPositionLocal(this._myConfig.myLeftSideButtonPosition);\r\n this.myValueDecreaseButtonBackgrounds[i].pp_scaleObject(this._myConfig.mySideButtonBackgroundScale);\r\n this.myValueDecreaseButtonTexts[i].pp_setPositionLocal(this._myConfig.mySideButtonTextPosition);\r\n this.myValueDecreaseButtonTexts[i].pp_scaleObject(this._myConfig.mySideButtonTextScale);\r\n this.myValueDecreaseButtonCursorTargets[i].pp_setPositionLocal(this._myConfig.mySideButtonCursorTargetPosition);\r\n }\r\n\r\n this.myStepPanel.pp_setPositionLocal(this._myConfig.myStepPanelPosition);\r\n this.myStepText.pp_scaleObject(this._myConfig.myStepTextScale);\r\n this.myStepCursorTarget.pp_setPositionLocal(this._myConfig.myStepCursorTargetPosition);\r\n\r\n this.myStepIncreaseButtonPanel.pp_setPositionLocal(this._myConfig.myRightSideButtonPosition);\r\n this.myStepIncreaseButtonBackground.pp_scaleObject(this._myConfig.mySideButtonBackgroundScale);\r\n this.myStepIncreaseButtonText.pp_setPositionLocal(this._myConfig.mySideButtonTextPosition);\r\n this.myStepIncreaseButtonText.pp_scaleObject(this._myConfig.mySideButtonTextScale);\r\n this.myStepIncreaseButtonCursorTarget.pp_setPositionLocal(this._myConfig.mySideButtonCursorTargetPosition);\r\n\r\n this.myStepDecreaseButtonPanel.pp_setPositionLocal(this._myConfig.myLeftSideButtonPosition);\r\n this.myStepDecreaseButtonBackground.pp_scaleObject(this._myConfig.mySideButtonBackgroundScale);\r\n this.myStepDecreaseButtonText.pp_setPositionLocal(this._myConfig.mySideButtonTextPosition);\r\n this.myStepDecreaseButtonText.pp_scaleObject(this._myConfig.mySideButtonTextScale);\r\n this.myStepDecreaseButtonCursorTarget.pp_setPositionLocal(this._myConfig.mySideButtonCursorTargetPosition);\r\n }\r\n\r\n _addComponentsHook() {\r\n this.myValueTextComponents = [];\r\n this.myValueCursorTargetComponents = [];\r\n this.myValueCollisionComponents = [];\r\n\r\n this.myValueIncreaseButtonBackgroundComponents = [];\r\n this.myValueIncreaseButtonTextComponents = [];\r\n this.myValueIncreaseButtonCursorTargetComponents = [];\r\n this.myValueIncreaseButtonCollisionComponents = [];\r\n\r\n this.myValueDecreaseButtonBackgroundComponents = [];\r\n this.myValueDecreaseButtonTextComponents = [];\r\n this.myValueDecreaseButtonCursorTargetComponents = [];\r\n this.myValueDecreaseButtonCollisionComponents = [];\r\n\r\n\r\n for (let i = 0; i < this._myConfig.myArraySize; i++) {\r\n this.myValueTextComponents[i] = this.myValueTexts[i].pp_addComponent(TextComponent);\r\n this._setupTextComponent(this.myValueTextComponents[i]);\r\n this.myValueTextComponents[i].text = \" \";\r\n\r\n this.myValueCursorTargetComponents[i] = this.myValueCursorTargets[i].pp_addComponent(CursorTarget);\r\n this.myValueCollisionComponents[i] = this.myValueCursorTargets[i].pp_addComponent(CollisionComponent);\r\n this.myValueCollisionComponents[i].collider = this._myConfig.myCursorTargetCollisionCollider;\r\n this.myValueCollisionComponents[i].group = 1 << this._myConfig.myCursorTargetCollisionGroup;\r\n this.myValueCollisionComponents[i].extents = this._myConfig.myValueCollisionExtents;\r\n\r\n this.myValueIncreaseButtonBackgroundComponents[i] = this.myValueIncreaseButtonBackgrounds[i].pp_addComponent(MeshComponent);\r\n this.myValueIncreaseButtonBackgroundComponents[i].mesh = this._myPlaneMesh;\r\n this.myValueIncreaseButtonBackgroundComponents[i].material = this._myParams.myPlaneMaterial.clone();\r\n this.myValueIncreaseButtonBackgroundComponents[i].material.color = this._myConfig.myBackgroundColor;\r\n\r\n this.myValueIncreaseButtonTextComponents[i] = this.myValueIncreaseButtonTexts[i].pp_addComponent(TextComponent);\r\n this._setupTextComponent(this.myValueIncreaseButtonTextComponents[i]);\r\n this.myValueIncreaseButtonTextComponents[i].text = this._myConfig.myIncreaseButtonText;\r\n\r\n this.myValueIncreaseButtonCursorTargetComponents[i] = this.myValueIncreaseButtonCursorTargets[i].pp_addComponent(CursorTarget);\r\n this.myValueIncreaseButtonCollisionComponents[i] = this.myValueIncreaseButtonCursorTargets[i].pp_addComponent(CollisionComponent);\r\n this.myValueIncreaseButtonCollisionComponents[i].collider = this._myConfig.myCursorTargetCollisionCollider;\r\n this.myValueIncreaseButtonCollisionComponents[i].group = 1 << this._myConfig.myCursorTargetCollisionGroup;\r\n this.myValueIncreaseButtonCollisionComponents[i].extents = this._myConfig.mySideButtonCollisionExtents;\r\n\r\n this.myValueDecreaseButtonBackgroundComponents[i] = this.myValueDecreaseButtonBackgrounds[i].pp_addComponent(MeshComponent);\r\n this.myValueDecreaseButtonBackgroundComponents[i].mesh = this._myPlaneMesh;\r\n this.myValueDecreaseButtonBackgroundComponents[i].material = this._myParams.myPlaneMaterial.clone();\r\n this.myValueDecreaseButtonBackgroundComponents[i].material.color = this._myConfig.myBackgroundColor;\r\n\r\n this.myValueDecreaseButtonTextComponents[i] = this.myValueDecreaseButtonTexts[i].pp_addComponent(TextComponent);\r\n this._setupTextComponent(this.myValueDecreaseButtonTextComponents[i]);\r\n this.myValueDecreaseButtonTextComponents[i].text = this._myConfig.myDecreaseButtonText;\r\n\r\n this.myValueDecreaseButtonCursorTargetComponents[i] = this.myValueDecreaseButtonCursorTargets[i].pp_addComponent(CursorTarget);\r\n this.myValueDecreaseButtonCollisionComponents[i] = this.myValueDecreaseButtonCursorTargets[i].pp_addComponent(CollisionComponent);\r\n this.myValueDecreaseButtonCollisionComponents[i].collider = this._myConfig.myCursorTargetCollisionCollider;\r\n this.myValueDecreaseButtonCollisionComponents[i].group = 1 << this._myConfig.myCursorTargetCollisionGroup;\r\n this.myValueDecreaseButtonCollisionComponents[i].extents = this._myConfig.mySideButtonCollisionExtents;\r\n }\r\n\r\n this.myStepTextComponent = this.myStepText.pp_addComponent(TextComponent);\r\n this._setupTextComponent(this.myStepTextComponent);\r\n this.myStepTextComponent.text = \" \";\r\n\r\n this.myStepCursorTargetComponent = this.myStepCursorTarget.pp_addComponent(CursorTarget);\r\n this.myStepCollisionComponent = this.myStepCursorTarget.pp_addComponent(CollisionComponent);\r\n this.myStepCollisionComponent.collider = this._myConfig.myCursorTargetCollisionCollider;\r\n this.myStepCollisionComponent.group = 1 << this._myConfig.myCursorTargetCollisionGroup;\r\n this.myStepCollisionComponent.extents = this._myConfig.myStepCollisionExtents;\r\n\r\n // Increase/Decrease\r\n this.myStepIncreaseButtonBackgroundComponent = this.myStepIncreaseButtonBackground.pp_addComponent(MeshComponent);\r\n this.myStepIncreaseButtonBackgroundComponent.mesh = this._myPlaneMesh;\r\n this.myStepIncreaseButtonBackgroundComponent.material = this._myParams.myPlaneMaterial.clone();\r\n this.myStepIncreaseButtonBackgroundComponent.material.color = this._myConfig.myBackgroundColor;\r\n\r\n this.myStepIncreaseButtonTextComponent = this.myStepIncreaseButtonText.pp_addComponent(TextComponent);\r\n this._setupTextComponent(this.myStepIncreaseButtonTextComponent);\r\n this.myStepIncreaseButtonTextComponent.text = this._myConfig.myIncreaseButtonText;\r\n\r\n this.myStepIncreaseButtonCursorTargetComponent = this.myStepIncreaseButtonCursorTarget.pp_addComponent(CursorTarget);\r\n this.myStepIncreaseButtonCollisionComponent = this.myStepIncreaseButtonCursorTarget.pp_addComponent(CollisionComponent);\r\n this.myStepIncreaseButtonCollisionComponent.collider = this._myConfig.myCursorTargetCollisionCollider;\r\n this.myStepIncreaseButtonCollisionComponent.group = 1 << this._myConfig.myCursorTargetCollisionGroup;\r\n this.myStepIncreaseButtonCollisionComponent.extents = this._myConfig.mySideButtonCollisionExtents;\r\n\r\n this.myStepDecreaseButtonBackgroundComponent = this.myStepDecreaseButtonBackground.pp_addComponent(MeshComponent);\r\n this.myStepDecreaseButtonBackgroundComponent.mesh = this._myPlaneMesh;\r\n this.myStepDecreaseButtonBackgroundComponent.material = this._myParams.myPlaneMaterial.clone();\r\n this.myStepDecreaseButtonBackgroundComponent.material.color = this._myConfig.myBackgroundColor;\r\n\r\n this.myStepDecreaseButtonTextComponent = this.myStepDecreaseButtonText.pp_addComponent(TextComponent);\r\n this._setupTextComponent(this.myStepDecreaseButtonTextComponent);\r\n this.myStepDecreaseButtonTextComponent.text = this._myConfig.myDecreaseButtonText;\r\n\r\n this.myStepDecreaseButtonCursorTargetComponent = this.myStepDecreaseButtonCursorTarget.pp_addComponent(CursorTarget);\r\n this.myStepDecreaseButtonCollisionComponent = this.myStepDecreaseButtonCursorTarget.pp_addComponent(CollisionComponent);\r\n this.myStepDecreaseButtonCollisionComponent.collider = this._myConfig.myCursorTargetCollisionCollider;\r\n this.myStepDecreaseButtonCollisionComponent.group = 1 << this._myConfig.myCursorTargetCollisionGroup;\r\n this.myStepDecreaseButtonCollisionComponent.extents = this._myConfig.mySideButtonCollisionExtents;\r\n }\r\n\r\n _setVisibleHook(visible) {\r\n if (visible) {\r\n this.setAdditionalButtonsVisible(this._myAdditionalButtonsVisible);\r\n }\r\n }\r\n}", "import { GamepadAxesID } from \"../../../../input/gamepad/gamepad_buttons.js\";\r\nimport { Globals } from \"../../../../pp/globals.js\";\r\nimport { EasyTuneBaseWidget } from \"../base/easy_tune_base_widget.js\";\r\nimport { EasyTuneNumberArrayWidgetConfig } from \"./easy_tune_number_array_widget_config.js\";\r\nimport { EasyTuneNumberArrayWidgetUI } from \"./easy_tune_number_array_widget_ui.js\";\r\n\r\nexport class EasyTuneNumberArrayWidget extends EasyTuneBaseWidget {\r\n\r\n constructor(params, arraySize, gamepad, engine = Globals.getMainEngine()) {\r\n super(params);\r\n\r\n this._myGamepad = gamepad;\r\n\r\n this._myNonArray = arraySize == null;\r\n this._myArraySize = this._myNonArray ? 1 : arraySize;\r\n\r\n this._myConfig = new EasyTuneNumberArrayWidgetConfig(this._myArraySize);\r\n this._myUI = new EasyTuneNumberArrayWidgetUI(engine);\r\n\r\n this._myValueEditIndex = -1;\r\n\r\n this._myValueButtonEditIntensity = 0;\r\n this._myValueButtonEditIntensityTimer = 0;\r\n this._myStepButtonEditIntensity = 0;\r\n this._myStepButtonEditIntensityTimer = 0;\r\n\r\n this._myValueEditEnabled = false;\r\n this._myStepEditEnabled = false;\r\n\r\n this._myValueRealValue = 0;\r\n this._myStepMultiplierValue = 0;\r\n this._myStepFastEdit = false;\r\n\r\n this._myTempValue = [];\r\n\r\n this._myTempNonArrayValue = [0];\r\n this._myTempNonArrayDefaultValue = [0];\r\n }\r\n\r\n _refreshUIHook() {\r\n for (let i = 0; i < this._myArraySize; i++) {\r\n this._myUI.myValueTextComponents[i].text = this._getVariableValue()[i].toFixed(this._myVariable._myDecimalPlaces);\r\n }\r\n\r\n this._myUI.myStepTextComponent.text = this._myConfig.myStepStartString.concat(this._myVariable._myStepPerSecond);\r\n }\r\n\r\n\r\n _startHook(parentObject, easyTuneParams) {\r\n this._myUI.setAdditionalButtonsVisible(easyTuneParams.myShowAdditionalButtons);\r\n }\r\n\r\n _setEasyTuneVariableHook() {\r\n if (this._myVariable != null) {\r\n if (this._myValueEditIndex >= 0 && this._myValueEditIndex < this._getVariableValue().length) {\r\n this._myValueRealValue = this._getVariableValue()[this._myValueEditIndex];\r\n } else {\r\n this._myValueRealValue = 0;\r\n }\r\n\r\n this._myTempValue.pp_copy(this._getVariableValue());\r\n\r\n this._myStepMultiplierValue = 0;\r\n this._myStepFastEdit = false;\r\n }\r\n }\r\n\r\n _updateHook(dt) {\r\n this._updateValue(dt);\r\n }\r\n\r\n _updateValue(dt) {\r\n let stickVariableIntensity = 0;\r\n\r\n if (this._myGamepad) {\r\n let y = this._myGamepad.getAxesInfo(GamepadAxesID.THUMBSTICK).myAxes[1];\r\n\r\n if (Math.abs(y) > this._myConfig.myEditThumbstickMinThreshold) {\r\n let normalizedEditAmount = (Math.abs(y) - this._myConfig.myEditThumbstickMinThreshold) / (1 - this._myConfig.myEditThumbstickMinThreshold);\r\n stickVariableIntensity = Math.sign(y) * normalizedEditAmount;\r\n }\r\n }\r\n\r\n let valueIntensity = 0;\r\n if (this._myValueEditEnabled) {\r\n valueIntensity = stickVariableIntensity;\r\n } else if (this._myValueButtonEditIntensity != 0) {\r\n if (this._myValueButtonEditIntensityTimer <= 0) {\r\n valueIntensity = this._myValueButtonEditIntensity;\r\n } else {\r\n this._myValueButtonEditIntensityTimer -= dt;\r\n }\r\n }\r\n\r\n if (this._myValueEditIndex >= 0 && this._myValueEditIndex < this._getVariableValue().length) {\r\n if (valueIntensity != 0) {\r\n let amountToAdd = valueIntensity * this._myVariable._myStepPerSecond * dt;\r\n\r\n this._myValueRealValue += amountToAdd;\r\n\r\n if (this._myVariable._myMin != null && this._myVariable._myMax != null) {\r\n this._myValueRealValue = Math.pp_clamp(this._myValueRealValue, this._myVariable._myMin, this._myVariable._myMax);\r\n } else if (this._myVariable._myMin != null) {\r\n this._myValueRealValue = Math.max(this._myValueRealValue, this._myVariable._myMin);\r\n } else if (this._myVariable._myMax != null) {\r\n this._myValueRealValue = Math.min(this._myValueRealValue, this._myVariable._myMax);\r\n }\r\n\r\n let decimalPlacesMultiplier = Math.pow(10, this._myVariable._myDecimalPlaces);\r\n\r\n this._myTempValue.pp_copy(this._getVariableValue());\r\n\r\n if (!this._myNonArray && this._myVariable._myEditAllValuesTogether) {\r\n let newValue = Math.round(this._myValueRealValue * decimalPlacesMultiplier + Number.EPSILON) / decimalPlacesMultiplier;\r\n let difference = newValue - this._myTempValue[this._myValueEditIndex];\r\n\r\n for (let i = 0; i < this._myArraySize; i++) {\r\n this._myTempValue[i] = Math.round((this._myTempValue[i] + difference) * decimalPlacesMultiplier + Number.EPSILON) / decimalPlacesMultiplier;\r\n\r\n if (this._myVariable._myMin != null && this._myVariable._myMax != null) {\r\n this._myTempValue[i] = Math.pp_clamp(this._myTempValue[i], this._myVariable._myMin, this._myVariable._myMax);\r\n } else if (this._myVariable._myMin != null) {\r\n this._myTempValue[i] = Math.max(this._myTempValue[i], this._myVariable._myMin);\r\n } else if (this._myVariable._myMax != null) {\r\n this._myTempValue[i] = Math.min(this._myTempValue[i], this._myVariable._myMax);\r\n }\r\n\r\n this._myUI.myValueTextComponents[i].text = this._myTempValue[i].toFixed(this._myVariable._myDecimalPlaces);\r\n }\r\n\r\n } else {\r\n this._myTempValue[this._myValueEditIndex] = Math.round(this._myValueRealValue * decimalPlacesMultiplier + Number.EPSILON) / decimalPlacesMultiplier;\r\n\r\n if (this._myVariable._myMin != null && this._myVariable._myMax != null) {\r\n this._myTempValue[this._myValueEditIndex] = Math.pp_clamp(this._myTempValue[this._myValueEditIndex], this._myVariable._myMin, this._myVariable._myMax);\r\n } else if (this._myVariable._myMin != null) {\r\n this._myTempValue[this._myValueEditIndex] = Math.max(this._myTempValue[this._myValueEditIndex], this._myVariable._myMin);\r\n } else if (this._myVariable._myMax != null) {\r\n this._myTempValue[this._myValueEditIndex] = Math.min(this._myTempValue[this._myValueEditIndex], this._myVariable._myMax);\r\n }\r\n\r\n this._myUI.myValueTextComponents[this._myValueEditIndex].text = this._myTempValue[this._myValueEditIndex].toFixed(this._myVariable._myDecimalPlaces);\r\n }\r\n\r\n this._setVariableValue(this._myTempValue);\r\n } else {\r\n this._myValueRealValue = this._getVariableValue()[this._myValueEditIndex];\r\n }\r\n }\r\n\r\n let stepIntensity = 0;\r\n if (this._myStepEditEnabled) {\r\n stepIntensity = stickVariableIntensity;\r\n } else if (this._myStepButtonEditIntensity != 0) {\r\n if (this._myStepButtonEditIntensityTimer <= 0) {\r\n stepIntensity = this._myStepButtonEditIntensity;\r\n } else {\r\n this._myStepButtonEditIntensityTimer -= dt;\r\n }\r\n }\r\n\r\n if (stepIntensity != 0) {\r\n let amountToAdd = 0;\r\n if (this._myStepFastEdit) {\r\n amountToAdd = Math.sign(stepIntensity) * 1;\r\n this._myStepFastEdit = false;\r\n } else {\r\n amountToAdd = stepIntensity * this._myConfig.myStepMultiplierStepPerSecond * dt;\r\n }\r\n\r\n this._myStepMultiplierValue += amountToAdd;\r\n if (Math.abs(this._myStepMultiplierValue) >= 1) {\r\n if (Math.sign(this._myStepMultiplierValue) > 0) {\r\n this._myStepMultiplierValue -= 1;\r\n this._changeStep(this._myVariable._myStepPerSecond * 10);\r\n } else {\r\n this._myStepMultiplierValue += 1;\r\n this._changeStep(this._myVariable._myStepPerSecond * 0.1);\r\n }\r\n }\r\n } else {\r\n this._myStepMultiplierValue = 0;\r\n this._myStepFastEdit = true;\r\n }\r\n }\r\n\r\n _addListenersHook() {\r\n let ui = this._myUI;\r\n\r\n ui.myVariableLabelCursorTargetComponent.onClick.add(this._resetAllValues.bind(this));\r\n ui.myVariableLabelCursorTargetComponent.onHover.add(this._genericTextHover.bind(this, ui.myVariableLabelText));\r\n ui.myVariableLabelCursorTargetComponent.onUnhover.add(this._genericTextUnhover.bind(this, ui.myVariableLabelText, this._myConfig.myVariableLabelTextScale));\r\n\r\n this._myUnhoverCallbacks.push(this._genericTextUnhover.bind(this, ui.myVariableLabelText, this._myConfig.myVariableLabelTextScale));\r\n\r\n for (let i = 0; i < this._myArraySize; i++) {\r\n ui.myValueIncreaseButtonCursorTargetComponents[i].onDown.add(this._setValueEditIntensity.bind(this, i, 1));\r\n ui.myValueIncreaseButtonCursorTargetComponents[i].onDownOnHover.add(this._setValueEditIntensity.bind(this, i, 1));\r\n ui.myValueIncreaseButtonCursorTargetComponents[i].onUp.add(this._setValueEditIntensity.bind(this, i, 0));\r\n ui.myValueIncreaseButtonCursorTargetComponents[i].onUnhover.add(this._setValueEditIntensity.bind(this, i, 0));\r\n ui.myValueDecreaseButtonCursorTargetComponents[i].onDown.add(this._setValueEditIntensity.bind(this, i, -1));\r\n ui.myValueDecreaseButtonCursorTargetComponents[i].onDownOnHover.add(this._setValueEditIntensity.bind(this, i, -1));\r\n ui.myValueDecreaseButtonCursorTargetComponents[i].onUp.add(this._setValueEditIntensity.bind(this, i, 0));\r\n ui.myValueDecreaseButtonCursorTargetComponents[i].onUnhover.add(this._setValueEditIntensity.bind(this, i, 0));\r\n\r\n this._myUnhoverCallbacks.push(this._setValueEditIntensity.bind(this, i, 0));\r\n\r\n ui.myValueIncreaseButtonCursorTargetComponents[i].onHover.add(this._genericHover.bind(this, ui.myValueIncreaseButtonBackgroundComponents[i].material));\r\n ui.myValueIncreaseButtonCursorTargetComponents[i].onUnhover.add(this._genericUnhover.bind(this, ui.myValueIncreaseButtonBackgroundComponents[i].material));\r\n ui.myValueDecreaseButtonCursorTargetComponents[i].onHover.add(this._genericHover.bind(this, ui.myValueDecreaseButtonBackgroundComponents[i].material));\r\n ui.myValueDecreaseButtonCursorTargetComponents[i].onUnhover.add(this._genericUnhover.bind(this, ui.myValueDecreaseButtonBackgroundComponents[i].material));\r\n\r\n this._myUnhoverCallbacks.push(this._genericUnhover.bind(this, ui.myValueIncreaseButtonBackgroundComponents[i].material));\r\n this._myUnhoverCallbacks.push(this._genericUnhover.bind(this, ui.myValueDecreaseButtonBackgroundComponents[i].material));\r\n\r\n ui.myValueCursorTargetComponents[i].onClick.add(this._resetValue.bind(this, i));\r\n ui.myValueCursorTargetComponents[i].onHover.add(this._setValueEditEnabled.bind(this, i, ui.myValueTexts[i], true));\r\n ui.myValueCursorTargetComponents[i].onUnhover.add(this._setValueEditEnabled.bind(this, i, ui.myValueTexts[i], false));\r\n\r\n this._myUnhoverCallbacks.push(this._setValueEditEnabled.bind(this, i, ui.myValueTexts[i], false));\r\n }\r\n\r\n ui.myStepCursorTargetComponent.onClick.add(this._resetStep.bind(this));\r\n ui.myStepCursorTargetComponent.onHover.add(this._setStepEditEnabled.bind(this, ui.myStepText, true));\r\n ui.myStepCursorTargetComponent.onUnhover.add(this._setStepEditEnabled.bind(this, ui.myStepText, false));\r\n\r\n this._myUnhoverCallbacks.push(this._setStepEditEnabled.bind(this, ui.myStepText, false));\r\n\r\n ui.myStepIncreaseButtonCursorTargetComponent.onDown.add(this._setStepEditIntensity.bind(this, 1));\r\n ui.myStepIncreaseButtonCursorTargetComponent.onDownOnHover.add(this._setStepEditIntensity.bind(this, 1));\r\n ui.myStepIncreaseButtonCursorTargetComponent.onUp.add(this._setStepEditIntensity.bind(this, 0));\r\n ui.myStepIncreaseButtonCursorTargetComponent.onUnhover.add(this._setStepEditIntensity.bind(this, 0));\r\n ui.myStepDecreaseButtonCursorTargetComponent.onDown.add(this._setStepEditIntensity.bind(this, -1));\r\n ui.myStepDecreaseButtonCursorTargetComponent.onDownOnHover.add(this._setStepEditIntensity.bind(this, -1));\r\n ui.myStepDecreaseButtonCursorTargetComponent.onUp.add(this._setStepEditIntensity.bind(this, 0));\r\n ui.myStepDecreaseButtonCursorTargetComponent.onUnhover.add(this._setStepEditIntensity.bind(this, 0));\r\n\r\n this._myUnhoverCallbacks.push(this._setStepEditIntensity.bind(this, 0));\r\n\r\n ui.myStepIncreaseButtonCursorTargetComponent.onHover.add(this._genericHover.bind(this, ui.myStepIncreaseButtonBackgroundComponent.material));\r\n ui.myStepIncreaseButtonCursorTargetComponent.onUnhover.add(this._genericUnhover.bind(this, ui.myStepIncreaseButtonBackgroundComponent.material));\r\n ui.myStepDecreaseButtonCursorTargetComponent.onHover.add(this._genericHover.bind(this, ui.myStepDecreaseButtonBackgroundComponent.material));\r\n ui.myStepDecreaseButtonCursorTargetComponent.onUnhover.add(this._genericUnhover.bind(this, ui.myStepDecreaseButtonBackgroundComponent.material));\r\n\r\n this._myUnhoverCallbacks.push(this._genericUnhover.bind(this, ui.myStepIncreaseButtonBackgroundComponent.material));\r\n this._myUnhoverCallbacks.push(this._genericUnhover.bind(this, ui.myStepDecreaseButtonBackgroundComponent.material));\r\n }\r\n\r\n _setValueEditIntensity(index, value) {\r\n if (this._isActive() || value == 0) {\r\n if (value != 0) {\r\n this._myValueButtonEditIntensityTimer = this._myConfig.myButtonEditDelay;\r\n this._myValueRealValue = this._getVariableValue()[index];\r\n this._myValueEditIndex = index;\r\n }\r\n\r\n this._myValueButtonEditIntensity = value;\r\n }\r\n }\r\n\r\n _setStepEditIntensity(value) {\r\n if (this._isActive() || value == 0) {\r\n if (value != 0) {\r\n this._myStepButtonEditIntensityTimer = this._myConfig.myButtonEditDelay;\r\n }\r\n\r\n this._myStepButtonEditIntensity = value;\r\n }\r\n }\r\n\r\n _setValueEditEnabled(index, text, enabled) {\r\n if (this._isActive() || !enabled) {\r\n if (enabled) {\r\n this._myValueRealValue = this._getVariableValue()[index];\r\n this._myValueEditIndex = index;\r\n text.pp_scaleObject(this._myConfig.myTextHoverScaleMultiplier);\r\n } else {\r\n text.pp_setScaleLocal(this._myConfig.myValueTextScale);\r\n }\r\n\r\n this._myValueEditEnabled = enabled;\r\n }\r\n }\r\n\r\n _setStepEditEnabled(text, enabled) {\r\n if (this._isActive() || !enabled) {\r\n if (enabled) {\r\n text.pp_scaleObject(this._myConfig.myTextHoverScaleMultiplier);\r\n } else {\r\n text.pp_setScaleLocal(this._myConfig.myStepTextScale);\r\n }\r\n\r\n this._myStepEditEnabled = enabled;\r\n }\r\n }\r\n\r\n _resetValue(index) {\r\n if (this._isActive()) {\r\n this._myTempValue.pp_copy(this._getVariableValue());\r\n this._myTempValue[index] = this._getVariableDefaultValue()[index];\r\n this._setVariableValue(this._myTempValue);\r\n\r\n this._myUI.myValueTextComponents[index].text = this._getVariableValue()[index].toFixed(this._myVariable._myDecimalPlaces);\r\n }\r\n }\r\n\r\n _resetAllValues() {\r\n for (let i = 0; i < this._myArraySize; i++) {\r\n this._resetValue(i);\r\n }\r\n }\r\n\r\n _resetStep() {\r\n if (this._isActive()) {\r\n this._changeStep(this._myVariable._myDefaultStepPerSecond);\r\n }\r\n }\r\n\r\n _changeStep(step) {\r\n step = Math.pp_roundDecimal(step, 10);\r\n this._myVariable._myStepPerSecond = step;\r\n this._myUI.myStepTextComponent.text = this._myConfig.myStepStartString.concat(this._myVariable._myStepPerSecond);\r\n }\r\n\r\n _genericTextHover(text) {\r\n text.pp_scaleObject(this._myConfig.myTextHoverScaleMultiplier);\r\n }\r\n\r\n _genericTextUnhover(text, originalScale) {\r\n text.pp_setScaleLocal(originalScale);\r\n }\r\n\r\n _getVariableValue() {\r\n if (this._myNonArray) {\r\n this._myTempNonArrayValue[0] = this._myVariable.getValue();\r\n return this._myTempNonArrayValue;\r\n }\r\n\r\n return this._myVariable.getValue();\r\n }\r\n\r\n _getVariableDefaultValue() {\r\n if (this._myNonArray) {\r\n this._myTempNonArrayDefaultValue[0] = this._myVariable.getDefaultValue();\r\n return this._myTempNonArrayDefaultValue;\r\n }\r\n\r\n return this._myVariable.getDefaultValue();\r\n }\r\n\r\n _setVariableValue(value) {\r\n if (this._myNonArray) {\r\n this._myVariable.setValue(value[0]);\r\n } else {\r\n this._myVariable.setValue(this._myTempValue);\r\n }\r\n }\r\n}", "import { EasyTuneBaseArrayWidgetSelector } from \"../base/easy_tune_base_array_widget_selector.js\";\r\nimport { EasyTuneNumberArrayWidget } from \"./easy_tune_number_array_widget.js\";\r\n\r\nexport class EasyTuneNumberArrayWidgetSelector extends EasyTuneBaseArrayWidgetSelector {\r\n\r\n _getEasyTuneArrayWidget(arraySize) {\r\n return new EasyTuneNumberArrayWidget(this._myParams, arraySize, this._myGamepad, this._myEngine);\r\n }\r\n}", "import { vec3_create } from \"../../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { EasyTuneBaseWidgetConfig } from \"../base/easy_tune_base_widget_config.js\";\r\n\r\nexport class EasyTuneTransformWidgetConfig extends EasyTuneBaseWidgetConfig {\r\n\r\n _getBackPanelMinY() {\r\n return super._getBackPanelMinY() + this.myPositionPanelPosition[1] + this.myStepPanelPosition[1];\r\n }\r\n\r\n _getBackPanelMaxX() {\r\n return this.myDisplayPanelPosition[0] + this.myRotationPanelPosition[0] + this.myIncreaseButtonPosition[0] + this.mySideButtonBackgroundScale[0] + this._mySideButtonDistanceFromBorder;\r\n }\r\n\r\n _getBackPanelMinX() {\r\n return this.myDisplayPanelPosition[0] + this.myScalePanelPosition[0] + this.myDecreaseButtonPosition[0] - this.mySideButtonBackgroundScale[0] - this._mySideButtonDistanceFromBorder;\r\n }\r\n\r\n _getPivotZOffset() {\r\n return 0.00805713;\r\n }\r\n\r\n _setupBuildConfigHook() {\r\n this.myIncreaseButtonText = \"+\";\r\n this.myDecreaseButtonText = \"-\";\r\n\r\n this.myDecreaseButtonPosition = vec3_create(-0.13, 0, -0.00001);\r\n this.myIncreaseButtonPosition = vec3_create(-this.myDecreaseButtonPosition[0], 0, -0.00001);\r\n\r\n let distanceBetweenComponents = Math.abs(this.myIncreaseButtonPosition[0]) + Math.abs(this.myRightSideButtonPosition[0]);\r\n let distanceFromVariableLabel = 0.045;\r\n this.myPositionPanelPosition = [0, this.myVariableLabelPanelPosition[1] - distanceFromVariableLabel, this._myPanelZOffset];\r\n this.myRotationPanelPosition = [this.myPositionPanelPosition[0] + distanceBetweenComponents, this.myVariableLabelPanelPosition[1] - distanceFromVariableLabel, this._myPanelZOffset];\r\n this.myScalePanelPosition = [this.myPositionPanelPosition[0] - distanceBetweenComponents, this.myVariableLabelPanelPosition[1] - distanceFromVariableLabel, this._myPanelZOffset];\r\n\r\n this.myPositionText = \"Position\";\r\n this.myRotationText = \"Rotation\";\r\n this.myScaleText = \"Scale\";\r\n\r\n this.myComponentLabelTextScale = this.myLabelTextScale;\r\n this.myComponentLabelCursorTargetPosition = vec3_create(0, 0, 0);\r\n this.myComponentLabelCursorTargetPosition[2] = this._myColliderZOffset - this._myPanelZOffset;\r\n this.myComponentLabelCollisionExtents = vec3_create(0.065, 0.0175, 1);\r\n this.myComponentLabelCollisionExtents[2] = this.myCursorTargetCollisionThickness;\r\n\r\n this._myValuePanelDistanceFromVariableLabelPanel = 0.055;\r\n this._myDistanceBetweenValues = this.mySideButtonBackgroundScale[1] * 2 + 0.015;\r\n\r\n this.myValueTextScale = vec3_create(0.4, 0.4, 0.4);\r\n\r\n this.myValueCursorTargetPosition = vec3_create(0, 0, 0);\r\n this.myValueCursorTargetPosition[2] = this._myColliderZOffset - this._myPanelZOffset;\r\n this.myValueCollisionExtents = vec3_create(0.065, 0.02, 1);\r\n this.myValueCollisionExtents[2] = this.myCursorTargetCollisionThickness;\r\n\r\n this.myValuePanelsPositions = [];\r\n this.myValuePanelsPositions[0] = vec3_create(0, -this._myValuePanelDistanceFromVariableLabelPanel, 0);\r\n for (let i = 1; i < 3; i++) {\r\n this.myValuePanelsPositions[i] = this.myValuePanelsPositions[i - 1].pp_clone();\r\n this.myValuePanelsPositions[i][1] -= this._myDistanceBetweenValues;\r\n }\r\n\r\n let valuePanelLastPosition = this.myValuePanelsPositions[2][1];\r\n this.myStepPanelPosition = [0, valuePanelLastPosition - this._myValuePanelDistanceFromVariableLabelPanel, 0];\r\n this.myStepTextScale = this.myLabelTextScale;\r\n this.myStepStartString = \"Step: \";\r\n\r\n this.myStepCursorTargetPosition = vec3_create(0, 0, 0);\r\n this.myStepCursorTargetPosition[2] = this._myColliderZOffset - this.myStepPanelPosition[2];\r\n this.myStepCollisionExtents = vec3_create(0.065, 0.0175, 1);\r\n this.myStepCollisionExtents[2] = this.myCursorTargetCollisionThickness;\r\n }\r\n\r\n _setupRuntimeConfigHook() {\r\n this.myTextHoverScaleMultiplier = vec3_create(1.1, 1.1, 1.1);\r\n\r\n this.myEditThumbstickMinThreshold = 0.35;\r\n this.myStepMultiplierStepPerSecond = 2.25;\r\n this.myButtonEditDelay = 0;\r\n }\r\n}", "import { CollisionComponent, MeshComponent, TextComponent } from \"@wonderlandengine/api\";\r\nimport { CursorTarget } from \"@wonderlandengine/components\";\r\nimport { EasyTuneBaseWidgetUI } from \"../base/easy_tune_base_widget_ui.js\";\r\n\r\nexport class EasyTuneTransformWidgetUI extends EasyTuneBaseWidgetUI {\r\n\r\n constructor(engine) {\r\n super(engine);\r\n }\r\n\r\n setAdditionalButtonsVisible(visible) {\r\n this._myAdditionalButtonsVisible = visible;\r\n\r\n for (let i = 0; i < 3; i++) {\r\n this.myPositionIncreaseButtonPanels[i].pp_setActive(this._myAdditionalButtonsVisible);\r\n this.myPositionDecreaseButtonPanels[i].pp_setActive(this._myAdditionalButtonsVisible);\r\n }\r\n this.myPositionStepIncreaseButtonPanel.pp_setActive(this._myAdditionalButtonsVisible);\r\n this.myPositionStepDecreaseButtonPanel.pp_setActive(this._myAdditionalButtonsVisible);\r\n\r\n for (let i = 0; i < 3; i++) {\r\n this.myRotationIncreaseButtonPanels[i].pp_setActive(this._myAdditionalButtonsVisible);\r\n this.myRotationDecreaseButtonPanels[i].pp_setActive(this._myAdditionalButtonsVisible);\r\n }\r\n this.myRotationStepIncreaseButtonPanel.pp_setActive(this._myAdditionalButtonsVisible);\r\n this.myRotationStepDecreaseButtonPanel.pp_setActive(this._myAdditionalButtonsVisible);\r\n\r\n for (let i = 0; i < 3; i++) {\r\n this.myScaleIncreaseButtonPanels[i].pp_setActive(this._myAdditionalButtonsVisible);\r\n this.myScaleDecreaseButtonPanels[i].pp_setActive(this._myAdditionalButtonsVisible);\r\n }\r\n this.myScaleStepIncreaseButtonPanel.pp_setActive(this._myAdditionalButtonsVisible);\r\n this.myScaleStepDecreaseButtonPanel.pp_setActive(this._myAdditionalButtonsVisible);\r\n }\r\n\r\n _buildHook() {\r\n this._myAdditionalButtonsVisible = true;\r\n }\r\n\r\n _createSkeletonHook() {\r\n // Position\r\n\r\n this.myPositionPanel = this.myDisplayPanel.pp_addChild();\r\n this.myPositionLabelText = this.myPositionPanel.pp_addChild();\r\n this.myPositionLabelCursorTarget = this.myPositionPanel.pp_addChild();\r\n\r\n this.myPositionPanels = [];\r\n this.myPositionTexts = [];\r\n this.myPositionCursorTargets = [];\r\n\r\n this.myPositionIncreaseButtonPanels = [];\r\n this.myPositionIncreaseButtonBackgrounds = [];\r\n this.myPositionIncreaseButtonTexts = [];\r\n this.myPositionIncreaseButtonCursorTargets = [];\r\n\r\n this.myPositionDecreaseButtonPanels = [];\r\n this.myPositionDecreaseButtonBackgrounds = [];\r\n this.myPositionDecreaseButtonTexts = [];\r\n this.myPositionDecreaseButtonCursorTargets = [];\r\n\r\n for (let i = 0; i < 3; i++) {\r\n this.myPositionPanels[i] = this.myPositionPanel.pp_addChild();\r\n this.myPositionTexts[i] = this.myPositionPanels[i].pp_addChild();\r\n this.myPositionCursorTargets[i] = this.myPositionPanels[i].pp_addChild();\r\n\r\n this.myPositionIncreaseButtonPanels[i] = this.myPositionPanels[i].pp_addChild();\r\n this.myPositionIncreaseButtonBackgrounds[i] = this.myPositionIncreaseButtonPanels[i].pp_addChild();\r\n this.myPositionIncreaseButtonTexts[i] = this.myPositionIncreaseButtonPanels[i].pp_addChild();\r\n this.myPositionIncreaseButtonCursorTargets[i] = this.myPositionIncreaseButtonPanels[i].pp_addChild();\r\n\r\n this.myPositionDecreaseButtonPanels[i] = this.myPositionPanels[i].pp_addChild();\r\n this.myPositionDecreaseButtonBackgrounds[i] = this.myPositionDecreaseButtonPanels[i].pp_addChild();\r\n this.myPositionDecreaseButtonTexts[i] = this.myPositionDecreaseButtonPanels[i].pp_addChild();\r\n this.myPositionDecreaseButtonCursorTargets[i] = this.myPositionDecreaseButtonPanels[i].pp_addChild();\r\n }\r\n\r\n // Rotation\r\n\r\n this.myRotationPanel = this.myDisplayPanel.pp_addChild();\r\n this.myRotationLabelText = this.myRotationPanel.pp_addChild();\r\n this.myRotationLabelCursorTarget = this.myRotationPanel.pp_addChild();\r\n\r\n this.myRotationPanels = [];\r\n this.myRotationTexts = [];\r\n this.myRotationCursorTargets = [];\r\n\r\n this.myRotationIncreaseButtonPanels = [];\r\n this.myRotationIncreaseButtonBackgrounds = [];\r\n this.myRotationIncreaseButtonTexts = [];\r\n this.myRotationIncreaseButtonCursorTargets = [];\r\n\r\n this.myRotationDecreaseButtonPanels = [];\r\n this.myRotationDecreaseButtonBackgrounds = [];\r\n this.myRotationDecreaseButtonTexts = [];\r\n this.myRotationDecreaseButtonCursorTargets = [];\r\n\r\n for (let i = 0; i < 3; i++) {\r\n this.myRotationPanels[i] = this.myRotationPanel.pp_addChild();\r\n this.myRotationTexts[i] = this.myRotationPanels[i].pp_addChild();\r\n this.myRotationCursorTargets[i] = this.myRotationPanels[i].pp_addChild();\r\n\r\n this.myRotationIncreaseButtonPanels[i] = this.myRotationPanels[i].pp_addChild();\r\n this.myRotationIncreaseButtonBackgrounds[i] = this.myRotationIncreaseButtonPanels[i].pp_addChild();\r\n this.myRotationIncreaseButtonTexts[i] = this.myRotationIncreaseButtonPanels[i].pp_addChild();\r\n this.myRotationIncreaseButtonCursorTargets[i] = this.myRotationIncreaseButtonPanels[i].pp_addChild();\r\n\r\n this.myRotationDecreaseButtonPanels[i] = this.myRotationPanels[i].pp_addChild();\r\n this.myRotationDecreaseButtonBackgrounds[i] = this.myRotationDecreaseButtonPanels[i].pp_addChild();\r\n this.myRotationDecreaseButtonTexts[i] = this.myRotationDecreaseButtonPanels[i].pp_addChild();\r\n this.myRotationDecreaseButtonCursorTargets[i] = this.myRotationDecreaseButtonPanels[i].pp_addChild();\r\n }\r\n\r\n // Scale\r\n\r\n this.myScalePanel = this.myDisplayPanel.pp_addChild();\r\n this.myScaleLabelText = this.myScalePanel.pp_addChild();\r\n this.myScaleLabelCursorTarget = this.myScalePanel.pp_addChild();\r\n\r\n this.myScalePanels = [];\r\n this.myScaleTexts = [];\r\n this.myScaleCursorTargets = [];\r\n\r\n this.myScaleIncreaseButtonPanels = [];\r\n this.myScaleIncreaseButtonBackgrounds = [];\r\n this.myScaleIncreaseButtonTexts = [];\r\n this.myScaleIncreaseButtonCursorTargets = [];\r\n\r\n this.myScaleDecreaseButtonPanels = [];\r\n this.myScaleDecreaseButtonBackgrounds = [];\r\n this.myScaleDecreaseButtonTexts = [];\r\n this.myScaleDecreaseButtonCursorTargets = [];\r\n\r\n for (let i = 0; i < 3; i++) {\r\n this.myScalePanels[i] = this.myScalePanel.pp_addChild();\r\n this.myScaleTexts[i] = this.myScalePanels[i].pp_addChild();\r\n this.myScaleCursorTargets[i] = this.myScalePanels[i].pp_addChild();\r\n\r\n this.myScaleIncreaseButtonPanels[i] = this.myScalePanels[i].pp_addChild();\r\n this.myScaleIncreaseButtonBackgrounds[i] = this.myScaleIncreaseButtonPanels[i].pp_addChild();\r\n this.myScaleIncreaseButtonTexts[i] = this.myScaleIncreaseButtonPanels[i].pp_addChild();\r\n this.myScaleIncreaseButtonCursorTargets[i] = this.myScaleIncreaseButtonPanels[i].pp_addChild();\r\n\r\n this.myScaleDecreaseButtonPanels[i] = this.myScalePanels[i].pp_addChild();\r\n this.myScaleDecreaseButtonBackgrounds[i] = this.myScaleDecreaseButtonPanels[i].pp_addChild();\r\n this.myScaleDecreaseButtonTexts[i] = this.myScaleDecreaseButtonPanels[i].pp_addChild();\r\n this.myScaleDecreaseButtonCursorTargets[i] = this.myScaleDecreaseButtonPanels[i].pp_addChild();\r\n }\r\n\r\n // Steps\r\n\r\n // Position\r\n\r\n this.myPositionStepPanel = this.myPositionPanel.pp_addChild();\r\n this.myPositionStepText = this.myPositionStepPanel.pp_addChild();\r\n this.myPositionStepCursorTarget = this.myPositionStepPanel.pp_addChild();\r\n\r\n this.myPositionStepIncreaseButtonPanel = this.myPositionStepPanel.pp_addChild();\r\n this.myPositionStepIncreaseButtonBackground = this.myPositionStepIncreaseButtonPanel.pp_addChild();\r\n this.myPositionStepIncreaseButtonText = this.myPositionStepIncreaseButtonPanel.pp_addChild();\r\n this.myPositionStepIncreaseButtonCursorTarget = this.myPositionStepIncreaseButtonPanel.pp_addChild();\r\n\r\n this.myPositionStepDecreaseButtonPanel = this.myPositionStepPanel.pp_addChild();\r\n this.myPositionStepDecreaseButtonBackground = this.myPositionStepDecreaseButtonPanel.pp_addChild();\r\n this.myPositionStepDecreaseButtonText = this.myPositionStepDecreaseButtonPanel.pp_addChild();\r\n this.myPositionStepDecreaseButtonCursorTarget = this.myPositionStepDecreaseButtonPanel.pp_addChild();\r\n\r\n // Rotation\r\n\r\n this.myRotationStepPanel = this.myRotationPanel.pp_addChild();\r\n this.myRotationStepText = this.myRotationStepPanel.pp_addChild();\r\n this.myRotationStepCursorTarget = this.myRotationStepPanel.pp_addChild();\r\n\r\n this.myRotationStepIncreaseButtonPanel = this.myRotationStepPanel.pp_addChild();\r\n this.myRotationStepIncreaseButtonBackground = this.myRotationStepIncreaseButtonPanel.pp_addChild();\r\n this.myRotationStepIncreaseButtonText = this.myRotationStepIncreaseButtonPanel.pp_addChild();\r\n this.myRotationStepIncreaseButtonCursorTarget = this.myRotationStepIncreaseButtonPanel.pp_addChild();\r\n\r\n this.myRotationStepDecreaseButtonPanel = this.myRotationStepPanel.pp_addChild();\r\n this.myRotationStepDecreaseButtonBackground = this.myRotationStepDecreaseButtonPanel.pp_addChild();\r\n this.myRotationStepDecreaseButtonText = this.myRotationStepDecreaseButtonPanel.pp_addChild();\r\n this.myRotationStepDecreaseButtonCursorTarget = this.myRotationStepDecreaseButtonPanel.pp_addChild();\r\n\r\n // Scale\r\n\r\n this.myScaleStepPanel = this.myScalePanel.pp_addChild();\r\n this.myScaleStepText = this.myScaleStepPanel.pp_addChild();\r\n this.myScaleStepCursorTarget = this.myScaleStepPanel.pp_addChild();\r\n\r\n this.myScaleStepIncreaseButtonPanel = this.myScaleStepPanel.pp_addChild();\r\n this.myScaleStepIncreaseButtonBackground = this.myScaleStepIncreaseButtonPanel.pp_addChild();\r\n this.myScaleStepIncreaseButtonText = this.myScaleStepIncreaseButtonPanel.pp_addChild();\r\n this.myScaleStepIncreaseButtonCursorTarget = this.myScaleStepIncreaseButtonPanel.pp_addChild();\r\n\r\n this.myScaleStepDecreaseButtonPanel = this.myScaleStepPanel.pp_addChild();\r\n this.myScaleStepDecreaseButtonBackground = this.myScaleStepDecreaseButtonPanel.pp_addChild();\r\n this.myScaleStepDecreaseButtonText = this.myScaleStepDecreaseButtonPanel.pp_addChild();\r\n this.myScaleStepDecreaseButtonCursorTarget = this.myScaleStepDecreaseButtonPanel.pp_addChild();\r\n }\r\n\r\n _setTransformHook() {\r\n // Position\r\n\r\n this.myPositionPanel.pp_setPositionLocal(this._myConfig.myPositionPanelPosition);\r\n this.myPositionLabelText.pp_scaleObject(this._myConfig.myComponentLabelTextScale);\r\n this.myPositionLabelCursorTarget.pp_setPositionLocal(this._myConfig.myComponentLabelCursorTargetPosition);\r\n\r\n for (let i = 0; i < 3; i++) {\r\n this.myPositionPanels[i].pp_setPositionLocal(this._myConfig.myValuePanelsPositions[i]);\r\n this.myPositionTexts[i].pp_scaleObject(this._myConfig.myValueTextScale);\r\n this.myPositionCursorTargets[i].pp_setPositionLocal(this._myConfig.myValueCursorTargetPosition);\r\n\r\n this.myPositionIncreaseButtonPanels[i].pp_setPositionLocal(this._myConfig.myIncreaseButtonPosition);\r\n this.myPositionIncreaseButtonBackgrounds[i].pp_scaleObject(this._myConfig.mySideButtonBackgroundScale);\r\n this.myPositionIncreaseButtonTexts[i].pp_setPositionLocal(this._myConfig.mySideButtonTextPosition);\r\n this.myPositionIncreaseButtonTexts[i].pp_scaleObject(this._myConfig.mySideButtonTextScale);\r\n this.myPositionIncreaseButtonCursorTargets[i].pp_setPositionLocal(this._myConfig.mySideButtonCursorTargetPosition);\r\n\r\n this.myPositionDecreaseButtonPanels[i].pp_setPositionLocal(this._myConfig.myDecreaseButtonPosition);\r\n this.myPositionDecreaseButtonBackgrounds[i].pp_scaleObject(this._myConfig.mySideButtonBackgroundScale);\r\n this.myPositionDecreaseButtonTexts[i].pp_setPositionLocal(this._myConfig.mySideButtonTextPosition);\r\n this.myPositionDecreaseButtonTexts[i].pp_scaleObject(this._myConfig.mySideButtonTextScale);\r\n this.myPositionDecreaseButtonCursorTargets[i].pp_setPositionLocal(this._myConfig.mySideButtonCursorTargetPosition);\r\n }\r\n\r\n // Rotation\r\n\r\n this.myRotationPanel.pp_setPositionLocal(this._myConfig.myRotationPanelPosition);\r\n this.myRotationLabelText.pp_scaleObject(this._myConfig.myComponentLabelTextScale);\r\n this.myRotationLabelCursorTarget.pp_setPositionLocal(this._myConfig.myComponentLabelCursorTargetPosition);\r\n\r\n for (let i = 0; i < 3; i++) {\r\n this.myRotationPanels[i].pp_setPositionLocal(this._myConfig.myValuePanelsPositions[i]);\r\n this.myRotationTexts[i].pp_scaleObject(this._myConfig.myValueTextScale);\r\n this.myRotationCursorTargets[i].pp_setPositionLocal(this._myConfig.myValueCursorTargetPosition);\r\n\r\n this.myRotationIncreaseButtonPanels[i].pp_setPositionLocal(this._myConfig.myIncreaseButtonPosition);\r\n this.myRotationIncreaseButtonBackgrounds[i].pp_scaleObject(this._myConfig.mySideButtonBackgroundScale);\r\n this.myRotationIncreaseButtonTexts[i].pp_setPositionLocal(this._myConfig.mySideButtonTextPosition);\r\n this.myRotationIncreaseButtonTexts[i].pp_scaleObject(this._myConfig.mySideButtonTextScale);\r\n this.myRotationIncreaseButtonCursorTargets[i].pp_setPositionLocal(this._myConfig.mySideButtonCursorTargetPosition);\r\n\r\n this.myRotationDecreaseButtonPanels[i].pp_setPositionLocal(this._myConfig.myDecreaseButtonPosition);\r\n this.myRotationDecreaseButtonBackgrounds[i].pp_scaleObject(this._myConfig.mySideButtonBackgroundScale);\r\n this.myRotationDecreaseButtonTexts[i].pp_setPositionLocal(this._myConfig.mySideButtonTextPosition);\r\n this.myRotationDecreaseButtonTexts[i].pp_scaleObject(this._myConfig.mySideButtonTextScale);\r\n this.myRotationDecreaseButtonCursorTargets[i].pp_setPositionLocal(this._myConfig.mySideButtonCursorTargetPosition);\r\n }\r\n\r\n // Scale\r\n\r\n this.myScalePanel.pp_setPositionLocal(this._myConfig.myScalePanelPosition);\r\n this.myScaleLabelText.pp_scaleObject(this._myConfig.myComponentLabelTextScale);\r\n this.myScaleLabelCursorTarget.pp_setPositionLocal(this._myConfig.myComponentLabelCursorTargetPosition);\r\n\r\n for (let i = 0; i < 3; i++) {\r\n this.myScalePanels[i].pp_setPositionLocal(this._myConfig.myValuePanelsPositions[i]);\r\n this.myScaleTexts[i].pp_scaleObject(this._myConfig.myValueTextScale);\r\n this.myScaleCursorTargets[i].pp_setPositionLocal(this._myConfig.myValueCursorTargetPosition);\r\n\r\n this.myScaleIncreaseButtonPanels[i].pp_setPositionLocal(this._myConfig.myIncreaseButtonPosition);\r\n this.myScaleIncreaseButtonBackgrounds[i].pp_scaleObject(this._myConfig.mySideButtonBackgroundScale);\r\n this.myScaleIncreaseButtonTexts[i].pp_setPositionLocal(this._myConfig.mySideButtonTextPosition);\r\n this.myScaleIncreaseButtonTexts[i].pp_scaleObject(this._myConfig.mySideButtonTextScale);\r\n this.myScaleIncreaseButtonCursorTargets[i].pp_setPositionLocal(this._myConfig.mySideButtonCursorTargetPosition);\r\n\r\n this.myScaleDecreaseButtonPanels[i].pp_setPositionLocal(this._myConfig.myDecreaseButtonPosition);\r\n this.myScaleDecreaseButtonBackgrounds[i].pp_scaleObject(this._myConfig.mySideButtonBackgroundScale);\r\n this.myScaleDecreaseButtonTexts[i].pp_setPositionLocal(this._myConfig.mySideButtonTextPosition);\r\n this.myScaleDecreaseButtonTexts[i].pp_scaleObject(this._myConfig.mySideButtonTextScale);\r\n this.myScaleDecreaseButtonCursorTargets[i].pp_setPositionLocal(this._myConfig.mySideButtonCursorTargetPosition);\r\n }\r\n\r\n // Steps\r\n\r\n // Position\r\n\r\n this.myPositionStepPanel.pp_setPositionLocal(this._myConfig.myStepPanelPosition);\r\n this.myPositionStepText.pp_scaleObject(this._myConfig.myStepTextScale);\r\n this.myPositionStepCursorTarget.pp_setPositionLocal(this._myConfig.myStepCursorTargetPosition);\r\n\r\n this.myPositionStepIncreaseButtonPanel.pp_setPositionLocal(this._myConfig.myIncreaseButtonPosition);\r\n this.myPositionStepIncreaseButtonBackground.pp_scaleObject(this._myConfig.mySideButtonBackgroundScale);\r\n this.myPositionStepIncreaseButtonText.pp_setPositionLocal(this._myConfig.mySideButtonTextPosition);\r\n this.myPositionStepIncreaseButtonText.pp_scaleObject(this._myConfig.mySideButtonTextScale);\r\n this.myPositionStepIncreaseButtonCursorTarget.pp_setPositionLocal(this._myConfig.mySideButtonCursorTargetPosition);\r\n\r\n this.myPositionStepDecreaseButtonPanel.pp_setPositionLocal(this._myConfig.myDecreaseButtonPosition);\r\n this.myPositionStepDecreaseButtonBackground.pp_scaleObject(this._myConfig.mySideButtonBackgroundScale);\r\n this.myPositionStepDecreaseButtonText.pp_setPositionLocal(this._myConfig.mySideButtonTextPosition);\r\n this.myPositionStepDecreaseButtonText.pp_scaleObject(this._myConfig.mySideButtonTextScale);\r\n this.myPositionStepDecreaseButtonCursorTarget.pp_setPositionLocal(this._myConfig.mySideButtonCursorTargetPosition);\r\n\r\n // Rotation\r\n\r\n this.myRotationStepPanel.pp_setPositionLocal(this._myConfig.myStepPanelPosition);\r\n this.myRotationStepText.pp_scaleObject(this._myConfig.myStepTextScale);\r\n this.myRotationStepCursorTarget.pp_setPositionLocal(this._myConfig.myStepCursorTargetPosition);\r\n\r\n this.myRotationStepIncreaseButtonPanel.pp_setPositionLocal(this._myConfig.myIncreaseButtonPosition);\r\n this.myRotationStepIncreaseButtonBackground.pp_scaleObject(this._myConfig.mySideButtonBackgroundScale);\r\n this.myRotationStepIncreaseButtonText.pp_setPositionLocal(this._myConfig.mySideButtonTextPosition);\r\n this.myRotationStepIncreaseButtonText.pp_scaleObject(this._myConfig.mySideButtonTextScale);\r\n this.myRotationStepIncreaseButtonCursorTarget.pp_setPositionLocal(this._myConfig.mySideButtonCursorTargetPosition);\r\n\r\n this.myRotationStepDecreaseButtonPanel.pp_setPositionLocal(this._myConfig.myDecreaseButtonPosition);\r\n this.myRotationStepDecreaseButtonBackground.pp_scaleObject(this._myConfig.mySideButtonBackgroundScale);\r\n this.myRotationStepDecreaseButtonText.pp_setPositionLocal(this._myConfig.mySideButtonTextPosition);\r\n this.myRotationStepDecreaseButtonText.pp_scaleObject(this._myConfig.mySideButtonTextScale);\r\n this.myRotationStepDecreaseButtonCursorTarget.pp_setPositionLocal(this._myConfig.mySideButtonCursorTargetPosition);\r\n\r\n // Scale\r\n\r\n this.myScaleStepPanel.pp_setPositionLocal(this._myConfig.myStepPanelPosition);\r\n this.myScaleStepText.pp_scaleObject(this._myConfig.myStepTextScale);\r\n this.myScaleStepCursorTarget.pp_setPositionLocal(this._myConfig.myStepCursorTargetPosition);\r\n\r\n this.myScaleStepIncreaseButtonPanel.pp_setPositionLocal(this._myConfig.myIncreaseButtonPosition);\r\n this.myScaleStepIncreaseButtonBackground.pp_scaleObject(this._myConfig.mySideButtonBackgroundScale);\r\n this.myScaleStepIncreaseButtonText.pp_setPositionLocal(this._myConfig.mySideButtonTextPosition);\r\n this.myScaleStepIncreaseButtonText.pp_scaleObject(this._myConfig.mySideButtonTextScale);\r\n this.myScaleStepIncreaseButtonCursorTarget.pp_setPositionLocal(this._myConfig.mySideButtonCursorTargetPosition);\r\n\r\n this.myScaleStepDecreaseButtonPanel.pp_setPositionLocal(this._myConfig.myDecreaseButtonPosition);\r\n this.myScaleStepDecreaseButtonBackground.pp_scaleObject(this._myConfig.mySideButtonBackgroundScale);\r\n this.myScaleStepDecreaseButtonText.pp_setPositionLocal(this._myConfig.mySideButtonTextPosition);\r\n this.myScaleStepDecreaseButtonText.pp_scaleObject(this._myConfig.mySideButtonTextScale);\r\n this.myScaleStepDecreaseButtonCursorTarget.pp_setPositionLocal(this._myConfig.mySideButtonCursorTargetPosition);\r\n }\r\n\r\n _addComponentsHook() {\r\n // Position\r\n\r\n this.myPositionLabelTextComponent = this.myPositionLabelText.pp_addComponent(TextComponent);\r\n this._setupTextComponent(this.myPositionLabelTextComponent);\r\n this.myPositionLabelTextComponent.text = this._myConfig.myPositionText;\r\n\r\n this.myPositionLabelCursorTargetComponent = this.myPositionLabelCursorTarget.pp_addComponent(CursorTarget);\r\n this.myPositionLabelCollisionComponent = this.myPositionLabelCursorTarget.pp_addComponent(CollisionComponent);\r\n this.myPositionLabelCollisionComponent.collider = this._myConfig.myCursorTargetCollisionCollider;\r\n this.myPositionLabelCollisionComponent.group = 1 << this._myConfig.myCursorTargetCollisionGroup;\r\n this.myPositionLabelCollisionComponent.extents = this._myConfig.myComponentLabelCollisionExtents;\r\n\r\n this.myPositionTextComponents = [];\r\n this.myPositionCursorTargetComponents = [];\r\n this.myPositionCollisionComponents = [];\r\n\r\n this.myPositionIncreaseButtonBackgroundComponents = [];\r\n this.myPositionIncreaseButtonTextComponents = [];\r\n this.myPositionIncreaseButtonCursorTargetComponents = [];\r\n this.myPositionIncreaseButtonCollisionComponents = [];\r\n\r\n this.myPositionDecreaseButtonBackgroundComponents = [];\r\n this.myPositionDecreaseButtonTextComponents = [];\r\n this.myPositionDecreaseButtonCursorTargetComponents = [];\r\n this.myPositionDecreaseButtonCollisionComponents = [];\r\n\r\n for (let i = 0; i < 3; i++) {\r\n this.myPositionTextComponents[i] = this.myPositionTexts[i].pp_addComponent(TextComponent);\r\n this._setupTextComponent(this.myPositionTextComponents[i]);\r\n this.myPositionTextComponents[i].text = \" \";\r\n\r\n this.myPositionCursorTargetComponents[i] = this.myPositionCursorTargets[i].pp_addComponent(CursorTarget);\r\n this.myPositionCollisionComponents[i] = this.myPositionCursorTargets[i].pp_addComponent(CollisionComponent);\r\n this.myPositionCollisionComponents[i].collider = this._myConfig.myCursorTargetCollisionCollider;\r\n this.myPositionCollisionComponents[i].group = 1 << this._myConfig.myCursorTargetCollisionGroup;\r\n this.myPositionCollisionComponents[i].extents = this._myConfig.myValueCollisionExtents;\r\n\r\n this.myPositionIncreaseButtonBackgroundComponents[i] = this.myPositionIncreaseButtonBackgrounds[i].pp_addComponent(MeshComponent);\r\n this.myPositionIncreaseButtonBackgroundComponents[i].mesh = this._myPlaneMesh;\r\n this.myPositionIncreaseButtonBackgroundComponents[i].material = this._myParams.myPlaneMaterial.clone();\r\n this.myPositionIncreaseButtonBackgroundComponents[i].material.color = this._myConfig.myBackgroundColor;\r\n\r\n this.myPositionIncreaseButtonTextComponents[i] = this.myPositionIncreaseButtonTexts[i].pp_addComponent(TextComponent);\r\n this._setupTextComponent(this.myPositionIncreaseButtonTextComponents[i]);\r\n this.myPositionIncreaseButtonTextComponents[i].text = this._myConfig.myIncreaseButtonText;\r\n\r\n this.myPositionIncreaseButtonCursorTargetComponents[i] = this.myPositionIncreaseButtonCursorTargets[i].pp_addComponent(CursorTarget);\r\n this.myPositionIncreaseButtonCollisionComponents[i] = this.myPositionIncreaseButtonCursorTargets[i].pp_addComponent(CollisionComponent);\r\n this.myPositionIncreaseButtonCollisionComponents[i].collider = this._myConfig.myCursorTargetCollisionCollider;\r\n this.myPositionIncreaseButtonCollisionComponents[i].group = 1 << this._myConfig.myCursorTargetCollisionGroup;\r\n this.myPositionIncreaseButtonCollisionComponents[i].extents = this._myConfig.mySideButtonCollisionExtents;\r\n\r\n this.myPositionDecreaseButtonBackgroundComponents[i] = this.myPositionDecreaseButtonBackgrounds[i].pp_addComponent(MeshComponent);\r\n this.myPositionDecreaseButtonBackgroundComponents[i].mesh = this._myPlaneMesh;\r\n this.myPositionDecreaseButtonBackgroundComponents[i].material = this._myParams.myPlaneMaterial.clone();\r\n this.myPositionDecreaseButtonBackgroundComponents[i].material.color = this._myConfig.myBackgroundColor;\r\n\r\n this.myPositionDecreaseButtonTextComponents[i] = this.myPositionDecreaseButtonTexts[i].pp_addComponent(TextComponent);\r\n this._setupTextComponent(this.myPositionDecreaseButtonTextComponents[i]);\r\n this.myPositionDecreaseButtonTextComponents[i].text = this._myConfig.myDecreaseButtonText;\r\n\r\n this.myPositionDecreaseButtonCursorTargetComponents[i] = this.myPositionDecreaseButtonCursorTargets[i].pp_addComponent(CursorTarget);\r\n this.myPositionDecreaseButtonCollisionComponents[i] = this.myPositionDecreaseButtonCursorTargets[i].pp_addComponent(CollisionComponent);\r\n this.myPositionDecreaseButtonCollisionComponents[i].collider = this._myConfig.myCursorTargetCollisionCollider;\r\n this.myPositionDecreaseButtonCollisionComponents[i].group = 1 << this._myConfig.myCursorTargetCollisionGroup;\r\n this.myPositionDecreaseButtonCollisionComponents[i].extents = this._myConfig.mySideButtonCollisionExtents;\r\n }\r\n\r\n // Rotation\r\n\r\n this.myRotationLabelTextComponent = this.myRotationLabelText.pp_addComponent(TextComponent);\r\n this._setupTextComponent(this.myRotationLabelTextComponent);\r\n this.myRotationLabelTextComponent.text = this._myConfig.myRotationText;\r\n\r\n this.myRotationLabelCursorTargetComponent = this.myRotationLabelCursorTarget.pp_addComponent(CursorTarget);\r\n this.myRotationLabelCollisionComponent = this.myRotationLabelCursorTarget.pp_addComponent(CollisionComponent);\r\n this.myRotationLabelCollisionComponent.collider = this._myConfig.myCursorTargetCollisionCollider;\r\n this.myRotationLabelCollisionComponent.group = 1 << this._myConfig.myCursorTargetCollisionGroup;\r\n this.myRotationLabelCollisionComponent.extents = this._myConfig.myComponentLabelCollisionExtents;\r\n\r\n this.myRotationTextComponents = [];\r\n this.myRotationCursorTargetComponents = [];\r\n this.myRotationCollisionComponents = [];\r\n\r\n this.myRotationIncreaseButtonBackgroundComponents = [];\r\n this.myRotationIncreaseButtonTextComponents = [];\r\n this.myRotationIncreaseButtonCursorTargetComponents = [];\r\n this.myRotationIncreaseButtonCollisionComponents = [];\r\n\r\n this.myRotationDecreaseButtonBackgroundComponents = [];\r\n this.myRotationDecreaseButtonTextComponents = [];\r\n this.myRotationDecreaseButtonCursorTargetComponents = [];\r\n this.myRotationDecreaseButtonCollisionComponents = [];\r\n\r\n for (let i = 0; i < 3; i++) {\r\n this.myRotationTextComponents[i] = this.myRotationTexts[i].pp_addComponent(TextComponent);\r\n this._setupTextComponent(this.myRotationTextComponents[i]);\r\n this.myRotationTextComponents[i].text = \" \";\r\n\r\n this.myRotationCursorTargetComponents[i] = this.myRotationCursorTargets[i].pp_addComponent(CursorTarget);\r\n this.myRotationCollisionComponents[i] = this.myRotationCursorTargets[i].pp_addComponent(CollisionComponent);\r\n this.myRotationCollisionComponents[i].collider = this._myConfig.myCursorTargetCollisionCollider;\r\n this.myRotationCollisionComponents[i].group = 1 << this._myConfig.myCursorTargetCollisionGroup;\r\n this.myRotationCollisionComponents[i].extents = this._myConfig.myValueCollisionExtents;\r\n\r\n this.myRotationIncreaseButtonBackgroundComponents[i] = this.myRotationIncreaseButtonBackgrounds[i].pp_addComponent(MeshComponent);\r\n this.myRotationIncreaseButtonBackgroundComponents[i].mesh = this._myPlaneMesh;\r\n this.myRotationIncreaseButtonBackgroundComponents[i].material = this._myParams.myPlaneMaterial.clone();\r\n this.myRotationIncreaseButtonBackgroundComponents[i].material.color = this._myConfig.myBackgroundColor;\r\n\r\n this.myRotationIncreaseButtonTextComponents[i] = this.myRotationIncreaseButtonTexts[i].pp_addComponent(TextComponent);\r\n this._setupTextComponent(this.myRotationIncreaseButtonTextComponents[i]);\r\n this.myRotationIncreaseButtonTextComponents[i].text = this._myConfig.myIncreaseButtonText;\r\n\r\n this.myRotationIncreaseButtonCursorTargetComponents[i] = this.myRotationIncreaseButtonCursorTargets[i].pp_addComponent(CursorTarget);\r\n this.myRotationIncreaseButtonCollisionComponents[i] = this.myRotationIncreaseButtonCursorTargets[i].pp_addComponent(CollisionComponent);\r\n this.myRotationIncreaseButtonCollisionComponents[i].collider = this._myConfig.myCursorTargetCollisionCollider;\r\n this.myRotationIncreaseButtonCollisionComponents[i].group = 1 << this._myConfig.myCursorTargetCollisionGroup;\r\n this.myRotationIncreaseButtonCollisionComponents[i].extents = this._myConfig.mySideButtonCollisionExtents;\r\n\r\n this.myRotationDecreaseButtonBackgroundComponents[i] = this.myRotationDecreaseButtonBackgrounds[i].pp_addComponent(MeshComponent);\r\n this.myRotationDecreaseButtonBackgroundComponents[i].mesh = this._myPlaneMesh;\r\n this.myRotationDecreaseButtonBackgroundComponents[i].material = this._myParams.myPlaneMaterial.clone();\r\n this.myRotationDecreaseButtonBackgroundComponents[i].material.color = this._myConfig.myBackgroundColor;\r\n\r\n this.myRotationDecreaseButtonTextComponents[i] = this.myRotationDecreaseButtonTexts[i].pp_addComponent(TextComponent);\r\n this._setupTextComponent(this.myRotationDecreaseButtonTextComponents[i]);\r\n this.myRotationDecreaseButtonTextComponents[i].text = this._myConfig.myDecreaseButtonText;\r\n\r\n this.myRotationDecreaseButtonCursorTargetComponents[i] = this.myRotationDecreaseButtonCursorTargets[i].pp_addComponent(CursorTarget);\r\n this.myRotationDecreaseButtonCollisionComponents[i] = this.myRotationDecreaseButtonCursorTargets[i].pp_addComponent(CollisionComponent);\r\n this.myRotationDecreaseButtonCollisionComponents[i].collider = this._myConfig.myCursorTargetCollisionCollider;\r\n this.myRotationDecreaseButtonCollisionComponents[i].group = 1 << this._myConfig.myCursorTargetCollisionGroup;\r\n this.myRotationDecreaseButtonCollisionComponents[i].extents = this._myConfig.mySideButtonCollisionExtents;\r\n }\r\n\r\n // Scale\r\n\r\n this.myScaleLabelTextComponent = this.myScaleLabelText.pp_addComponent(TextComponent);\r\n this._setupTextComponent(this.myScaleLabelTextComponent);\r\n this.myScaleLabelTextComponent.text = this._myConfig.myScaleText;\r\n\r\n this.myScaleLabelCursorTargetComponent = this.myScaleLabelCursorTarget.pp_addComponent(CursorTarget);\r\n this.myScaleLabelCollisionComponent = this.myScaleLabelCursorTarget.pp_addComponent(CollisionComponent);\r\n this.myScaleLabelCollisionComponent.collider = this._myConfig.myCursorTargetCollisionCollider;\r\n this.myScaleLabelCollisionComponent.group = 1 << this._myConfig.myCursorTargetCollisionGroup;\r\n this.myScaleLabelCollisionComponent.extents = this._myConfig.myComponentLabelCollisionExtents;\r\n\r\n this.myScaleTextComponents = [];\r\n this.myScaleCursorTargetComponents = [];\r\n this.myScaleCollisionComponents = [];\r\n\r\n this.myScaleIncreaseButtonBackgroundComponents = [];\r\n this.myScaleIncreaseButtonTextComponents = [];\r\n this.myScaleIncreaseButtonCursorTargetComponents = [];\r\n this.myScaleIncreaseButtonCollisionComponents = [];\r\n\r\n this.myScaleDecreaseButtonBackgroundComponents = [];\r\n this.myScaleDecreaseButtonTextComponents = [];\r\n this.myScaleDecreaseButtonCursorTargetComponents = [];\r\n this.myScaleDecreaseButtonCollisionComponents = [];\r\n\r\n for (let i = 0; i < 3; i++) {\r\n this.myScaleTextComponents[i] = this.myScaleTexts[i].pp_addComponent(TextComponent);\r\n this._setupTextComponent(this.myScaleTextComponents[i]);\r\n this.myScaleTextComponents[i].text = \" \";\r\n\r\n this.myScaleCursorTargetComponents[i] = this.myScaleCursorTargets[i].pp_addComponent(CursorTarget);\r\n this.myScaleCollisionComponents[i] = this.myScaleCursorTargets[i].pp_addComponent(CollisionComponent);\r\n this.myScaleCollisionComponents[i].collider = this._myConfig.myCursorTargetCollisionCollider;\r\n this.myScaleCollisionComponents[i].group = 1 << this._myConfig.myCursorTargetCollisionGroup;\r\n this.myScaleCollisionComponents[i].extents = this._myConfig.myValueCollisionExtents;\r\n\r\n this.myScaleIncreaseButtonBackgroundComponents[i] = this.myScaleIncreaseButtonBackgrounds[i].pp_addComponent(MeshComponent);\r\n this.myScaleIncreaseButtonBackgroundComponents[i].mesh = this._myPlaneMesh;\r\n this.myScaleIncreaseButtonBackgroundComponents[i].material = this._myParams.myPlaneMaterial.clone();\r\n this.myScaleIncreaseButtonBackgroundComponents[i].material.color = this._myConfig.myBackgroundColor;\r\n\r\n this.myScaleIncreaseButtonTextComponents[i] = this.myScaleIncreaseButtonTexts[i].pp_addComponent(TextComponent);\r\n this._setupTextComponent(this.myScaleIncreaseButtonTextComponents[i]);\r\n this.myScaleIncreaseButtonTextComponents[i].text = this._myConfig.myIncreaseButtonText;\r\n\r\n this.myScaleIncreaseButtonCursorTargetComponents[i] = this.myScaleIncreaseButtonCursorTargets[i].pp_addComponent(CursorTarget);\r\n this.myScaleIncreaseButtonCollisionComponents[i] = this.myScaleIncreaseButtonCursorTargets[i].pp_addComponent(CollisionComponent);\r\n this.myScaleIncreaseButtonCollisionComponents[i].collider = this._myConfig.myCursorTargetCollisionCollider;\r\n this.myScaleIncreaseButtonCollisionComponents[i].group = 1 << this._myConfig.myCursorTargetCollisionGroup;\r\n this.myScaleIncreaseButtonCollisionComponents[i].extents = this._myConfig.mySideButtonCollisionExtents;\r\n\r\n this.myScaleDecreaseButtonBackgroundComponents[i] = this.myScaleDecreaseButtonBackgrounds[i].pp_addComponent(MeshComponent);\r\n this.myScaleDecreaseButtonBackgroundComponents[i].mesh = this._myPlaneMesh;\r\n this.myScaleDecreaseButtonBackgroundComponents[i].material = this._myParams.myPlaneMaterial.clone();\r\n this.myScaleDecreaseButtonBackgroundComponents[i].material.color = this._myConfig.myBackgroundColor;\r\n\r\n this.myScaleDecreaseButtonTextComponents[i] = this.myScaleDecreaseButtonTexts[i].pp_addComponent(TextComponent);\r\n this._setupTextComponent(this.myScaleDecreaseButtonTextComponents[i]);\r\n this.myScaleDecreaseButtonTextComponents[i].text = this._myConfig.myDecreaseButtonText;\r\n\r\n this.myScaleDecreaseButtonCursorTargetComponents[i] = this.myScaleDecreaseButtonCursorTargets[i].pp_addComponent(CursorTarget);\r\n this.myScaleDecreaseButtonCollisionComponents[i] = this.myScaleDecreaseButtonCursorTargets[i].pp_addComponent(CollisionComponent);\r\n this.myScaleDecreaseButtonCollisionComponents[i].collider = this._myConfig.myCursorTargetCollisionCollider;\r\n this.myScaleDecreaseButtonCollisionComponents[i].group = 1 << this._myConfig.myCursorTargetCollisionGroup;\r\n this.myScaleDecreaseButtonCollisionComponents[i].extents = this._myConfig.mySideButtonCollisionExtents;\r\n }\r\n\r\n // Steps\r\n\r\n // Position \r\n this.myPositionStepTextComponent = this.myPositionStepText.pp_addComponent(TextComponent);\r\n this._setupTextComponent(this.myPositionStepTextComponent);\r\n this.myPositionStepTextComponent.text = \" \";\r\n\r\n this.myPositionStepCursorTargetComponent = this.myPositionStepCursorTarget.pp_addComponent(CursorTarget);\r\n this.myPositionStepCollisionComponent = this.myPositionStepCursorTarget.pp_addComponent(CollisionComponent);\r\n this.myPositionStepCollisionComponent.collider = this._myConfig.myCursorTargetCollisionCollider;\r\n this.myPositionStepCollisionComponent.group = 1 << this._myConfig.myCursorTargetCollisionGroup;\r\n this.myPositionStepCollisionComponent.extents = this._myConfig.myStepCollisionExtents;\r\n\r\n this.myPositionStepIncreaseButtonBackgroundComponent = this.myPositionStepIncreaseButtonBackground.pp_addComponent(MeshComponent);\r\n this.myPositionStepIncreaseButtonBackgroundComponent.mesh = this._myPlaneMesh;\r\n this.myPositionStepIncreaseButtonBackgroundComponent.material = this._myParams.myPlaneMaterial.clone();\r\n this.myPositionStepIncreaseButtonBackgroundComponent.material.color = this._myConfig.myBackgroundColor;\r\n\r\n this.myPositionStepIncreaseButtonTextComponent = this.myPositionStepIncreaseButtonText.pp_addComponent(TextComponent);\r\n this._setupTextComponent(this.myPositionStepIncreaseButtonTextComponent);\r\n this.myPositionStepIncreaseButtonTextComponent.text = this._myConfig.myIncreaseButtonText;\r\n\r\n this.myPositionStepIncreaseButtonCursorTargetComponent = this.myPositionStepIncreaseButtonCursorTarget.pp_addComponent(CursorTarget);\r\n this.myPositionStepIncreaseButtonCollisionComponent = this.myPositionStepIncreaseButtonCursorTarget.pp_addComponent(CollisionComponent);\r\n this.myPositionStepIncreaseButtonCollisionComponent.collider = this._myConfig.myCursorTargetCollisionCollider;\r\n this.myPositionStepIncreaseButtonCollisionComponent.group = 1 << this._myConfig.myCursorTargetCollisionGroup;\r\n this.myPositionStepIncreaseButtonCollisionComponent.extents = this._myConfig.mySideButtonCollisionExtents;\r\n\r\n this.myPositionStepDecreaseButtonBackgroundComponent = this.myPositionStepDecreaseButtonBackground.pp_addComponent(MeshComponent);\r\n this.myPositionStepDecreaseButtonBackgroundComponent.mesh = this._myPlaneMesh;\r\n this.myPositionStepDecreaseButtonBackgroundComponent.material = this._myParams.myPlaneMaterial.clone();\r\n this.myPositionStepDecreaseButtonBackgroundComponent.material.color = this._myConfig.myBackgroundColor;\r\n\r\n this.myPositionStepDecreaseButtonTextComponent = this.myPositionStepDecreaseButtonText.pp_addComponent(TextComponent);\r\n this._setupTextComponent(this.myPositionStepDecreaseButtonTextComponent);\r\n this.myPositionStepDecreaseButtonTextComponent.text = this._myConfig.myDecreaseButtonText;\r\n\r\n this.myPositionStepDecreaseButtonCursorTargetComponent = this.myPositionStepDecreaseButtonCursorTarget.pp_addComponent(CursorTarget);\r\n this.myPositionStepDecreaseButtonCollisionComponent = this.myPositionStepDecreaseButtonCursorTarget.pp_addComponent(CollisionComponent);\r\n this.myPositionStepDecreaseButtonCollisionComponent.collider = this._myConfig.myCursorTargetCollisionCollider;\r\n this.myPositionStepDecreaseButtonCollisionComponent.group = 1 << this._myConfig.myCursorTargetCollisionGroup;\r\n this.myPositionStepDecreaseButtonCollisionComponent.extents = this._myConfig.mySideButtonCollisionExtents;\r\n\r\n // Rotation\r\n\r\n this.myRotationStepTextComponent = this.myRotationStepText.pp_addComponent(TextComponent);\r\n this._setupTextComponent(this.myRotationStepTextComponent);\r\n this.myRotationStepTextComponent.text = \" \";\r\n\r\n this.myRotationStepCursorTargetComponent = this.myRotationStepCursorTarget.pp_addComponent(CursorTarget);\r\n this.myRotationStepCollisionComponent = this.myRotationStepCursorTarget.pp_addComponent(CollisionComponent);\r\n this.myRotationStepCollisionComponent.collider = this._myConfig.myCursorTargetCollisionCollider;\r\n this.myRotationStepCollisionComponent.group = 1 << this._myConfig.myCursorTargetCollisionGroup;\r\n this.myRotationStepCollisionComponent.extents = this._myConfig.myStepCollisionExtents;\r\n\r\n this.myRotationStepIncreaseButtonBackgroundComponent = this.myRotationStepIncreaseButtonBackground.pp_addComponent(MeshComponent);\r\n this.myRotationStepIncreaseButtonBackgroundComponent.mesh = this._myPlaneMesh;\r\n this.myRotationStepIncreaseButtonBackgroundComponent.material = this._myParams.myPlaneMaterial.clone();\r\n this.myRotationStepIncreaseButtonBackgroundComponent.material.color = this._myConfig.myBackgroundColor;\r\n\r\n this.myRotationStepIncreaseButtonTextComponent = this.myRotationStepIncreaseButtonText.pp_addComponent(TextComponent);\r\n this._setupTextComponent(this.myRotationStepIncreaseButtonTextComponent);\r\n this.myRotationStepIncreaseButtonTextComponent.text = this._myConfig.myIncreaseButtonText;\r\n\r\n this.myRotationStepIncreaseButtonCursorTargetComponent = this.myRotationStepIncreaseButtonCursorTarget.pp_addComponent(CursorTarget);\r\n this.myRotationStepIncreaseButtonCollisionComponent = this.myRotationStepIncreaseButtonCursorTarget.pp_addComponent(CollisionComponent);\r\n this.myRotationStepIncreaseButtonCollisionComponent.collider = this._myConfig.myCursorTargetCollisionCollider;\r\n this.myRotationStepIncreaseButtonCollisionComponent.group = 1 << this._myConfig.myCursorTargetCollisionGroup;\r\n this.myRotationStepIncreaseButtonCollisionComponent.extents = this._myConfig.mySideButtonCollisionExtents;\r\n\r\n this.myRotationStepDecreaseButtonBackgroundComponent = this.myRotationStepDecreaseButtonBackground.pp_addComponent(MeshComponent);\r\n this.myRotationStepDecreaseButtonBackgroundComponent.mesh = this._myPlaneMesh;\r\n this.myRotationStepDecreaseButtonBackgroundComponent.material = this._myParams.myPlaneMaterial.clone();\r\n this.myRotationStepDecreaseButtonBackgroundComponent.material.color = this._myConfig.myBackgroundColor;\r\n\r\n this.myRotationStepDecreaseButtonTextComponent = this.myRotationStepDecreaseButtonText.pp_addComponent(TextComponent);\r\n this._setupTextComponent(this.myRotationStepDecreaseButtonTextComponent);\r\n this.myRotationStepDecreaseButtonTextComponent.text = this._myConfig.myDecreaseButtonText;\r\n\r\n this.myRotationStepDecreaseButtonCursorTargetComponent = this.myRotationStepDecreaseButtonCursorTarget.pp_addComponent(CursorTarget);\r\n this.myRotationStepDecreaseButtonCollisionComponent = this.myRotationStepDecreaseButtonCursorTarget.pp_addComponent(CollisionComponent);\r\n this.myRotationStepDecreaseButtonCollisionComponent.collider = this._myConfig.myCursorTargetCollisionCollider;\r\n this.myRotationStepDecreaseButtonCollisionComponent.group = 1 << this._myConfig.myCursorTargetCollisionGroup;\r\n this.myRotationStepDecreaseButtonCollisionComponent.extents = this._myConfig.mySideButtonCollisionExtents;\r\n\r\n // Scale\r\n\r\n this.myScaleStepTextComponent = this.myScaleStepText.pp_addComponent(TextComponent);\r\n this._setupTextComponent(this.myScaleStepTextComponent);\r\n this.myScaleStepTextComponent.text = \" \";\r\n\r\n this.myScaleStepCursorTargetComponent = this.myScaleStepCursorTarget.pp_addComponent(CursorTarget);\r\n this.myScaleStepCollisionComponent = this.myScaleStepCursorTarget.pp_addComponent(CollisionComponent);\r\n this.myScaleStepCollisionComponent.collider = this._myConfig.myCursorTargetCollisionCollider;\r\n this.myScaleStepCollisionComponent.group = 1 << this._myConfig.myCursorTargetCollisionGroup;\r\n this.myScaleStepCollisionComponent.extents = this._myConfig.myStepCollisionExtents;\r\n\r\n this.myScaleStepIncreaseButtonBackgroundComponent = this.myScaleStepIncreaseButtonBackground.pp_addComponent(MeshComponent);\r\n this.myScaleStepIncreaseButtonBackgroundComponent.mesh = this._myPlaneMesh;\r\n this.myScaleStepIncreaseButtonBackgroundComponent.material = this._myParams.myPlaneMaterial.clone();\r\n this.myScaleStepIncreaseButtonBackgroundComponent.material.color = this._myConfig.myBackgroundColor;\r\n\r\n this.myScaleStepIncreaseButtonTextComponent = this.myScaleStepIncreaseButtonText.pp_addComponent(TextComponent);\r\n this._setupTextComponent(this.myScaleStepIncreaseButtonTextComponent);\r\n this.myScaleStepIncreaseButtonTextComponent.text = this._myConfig.myIncreaseButtonText;\r\n\r\n this.myScaleStepIncreaseButtonCursorTargetComponent = this.myScaleStepIncreaseButtonCursorTarget.pp_addComponent(CursorTarget);\r\n this.myScaleStepIncreaseButtonCollisionComponent = this.myScaleStepIncreaseButtonCursorTarget.pp_addComponent(CollisionComponent);\r\n this.myScaleStepIncreaseButtonCollisionComponent.collider = this._myConfig.myCursorTargetCollisionCollider;\r\n this.myScaleStepIncreaseButtonCollisionComponent.group = 1 << this._myConfig.myCursorTargetCollisionGroup;\r\n this.myScaleStepIncreaseButtonCollisionComponent.extents = this._myConfig.mySideButtonCollisionExtents;\r\n\r\n this.myScaleStepDecreaseButtonBackgroundComponent = this.myScaleStepDecreaseButtonBackground.pp_addComponent(MeshComponent);\r\n this.myScaleStepDecreaseButtonBackgroundComponent.mesh = this._myPlaneMesh;\r\n this.myScaleStepDecreaseButtonBackgroundComponent.material = this._myParams.myPlaneMaterial.clone();\r\n this.myScaleStepDecreaseButtonBackgroundComponent.material.color = this._myConfig.myBackgroundColor;\r\n\r\n this.myScaleStepDecreaseButtonTextComponent = this.myScaleStepDecreaseButtonText.pp_addComponent(TextComponent);\r\n this._setupTextComponent(this.myScaleStepDecreaseButtonTextComponent);\r\n this.myScaleStepDecreaseButtonTextComponent.text = this._myConfig.myDecreaseButtonText;\r\n\r\n this.myScaleStepDecreaseButtonCursorTargetComponent = this.myScaleStepDecreaseButtonCursorTarget.pp_addComponent(CursorTarget);\r\n this.myScaleStepDecreaseButtonCollisionComponent = this.myScaleStepDecreaseButtonCursorTarget.pp_addComponent(CollisionComponent);\r\n this.myScaleStepDecreaseButtonCollisionComponent.collider = this._myConfig.myCursorTargetCollisionCollider;\r\n this.myScaleStepDecreaseButtonCollisionComponent.group = 1 << this._myConfig.myCursorTargetCollisionGroup;\r\n this.myScaleStepDecreaseButtonCollisionComponent.extents = this._myConfig.mySideButtonCollisionExtents;\r\n }\r\n\r\n _addStepComponents() {\r\n // Position\r\n this.myPositionStepTextComponent = this.myPositionStepText.pp_addComponent(TextComponent);\r\n this._setupTextComponent(this.myPositionStepTextComponent);\r\n this.myPositionStepTextComponent.text = \" \";\r\n\r\n this.myPositionStepCursorTargetComponent = this.myPositionStepCursorTarget.pp_addComponent(CursorTarget);\r\n this.myPositionStepCollisionComponent = this.myPositionStepCursorTarget.pp_addComponent(CollisionComponent);\r\n this.myPositionStepCollisionComponent.collider = this._myConfig.myCursorTargetCollisionCollider;\r\n this.myPositionStepCollisionComponent.group = 1 << this._myConfig.myCursorTargetCollisionGroup;\r\n this.myPositionStepCollisionComponent.extents = this._myConfig.myStepCollisionExtents;\r\n\r\n // Increase/Decrease\r\n this.myPositionStepIncreaseButtonBackgroundComponent = this.myPositionStepIncreaseButtonBackground.pp_addComponent(MeshComponent);\r\n this.myPositionStepIncreaseButtonBackgroundComponent.mesh = this._myPlaneMesh;\r\n this.myPositionStepIncreaseButtonBackgroundComponent.material = this._myParams.myPlaneMaterial.clone();\r\n this.myPositionStepIncreaseButtonBackgroundComponent.material.color = this._myConfig.myBackgroundColor;\r\n\r\n this.myPositionStepIncreaseButtonTextComponent = this.myPositionStepIncreaseButtonText.pp_addComponent(TextComponent);\r\n this._setupTextComponent(this.myPositionStepIncreaseButtonTextComponent);\r\n this.myPositionStepIncreaseButtonTextComponent.text = this._myConfig.myIncreaseButtonText;\r\n\r\n this.myPositionStepIncreaseButtonCursorTargetComponent = this.myPositionStepIncreaseButtonCursorTarget.pp_addComponent(CursorTarget);\r\n this.myPositionStepIncreaseButtonCollisionComponent = this.myPositionStepIncreaseButtonCursorTarget.pp_addComponent(CollisionComponent);\r\n this.myPositionStepIncreaseButtonCollisionComponent.collider = this._myConfig.myCursorTargetCollisionCollider;\r\n this.myPositionStepIncreaseButtonCollisionComponent.group = 1 << this._myConfig.myCursorTargetCollisionGroup;\r\n this.myPositionStepIncreaseButtonCollisionComponent.extents = this._myConfig.mySideButtonCollisionExtents;\r\n\r\n this.myPositionStepDecreaseButtonBackgroundComponent = this.myPositionStepDecreaseButtonBackground.pp_addComponent(MeshComponent);\r\n this.myPositionStepDecreaseButtonBackgroundComponent.mesh = this._myPlaneMesh;\r\n this.myPositionStepDecreaseButtonBackgroundComponent.material = this._myParams.myPlaneMaterial.clone();\r\n this.myPositionStepDecreaseButtonBackgroundComponent.material.color = this._myConfig.myBackgroundColor;\r\n\r\n this.myPositionStepDecreaseButtonTextComponent = this.myPositionStepDecreaseButtonText.pp_addComponent(TextComponent);\r\n this._setupTextComponent(this.myPositionStepDecreaseButtonTextComponent);\r\n this.myPositionStepDecreaseButtonTextComponent.text = this._myConfig.myDecreaseButtonText;\r\n\r\n this.myPositionStepDecreaseButtonCursorTargetComponent = this.myPositionStepDecreaseButtonCursorTarget.pp_addComponent(CursorTarget);\r\n this.myPositionStepDecreaseButtonCollisionComponent = this.myPositionStepDecreaseButtonCursorTarget.pp_addComponent(CollisionComponent);\r\n this.myPositionStepDecreaseButtonCollisionComponent.collider = this._myConfig.myCursorTargetCollisionCollider;\r\n this.myPositionStepDecreaseButtonCollisionComponent.group = 1 << this._myConfig.myCursorTargetCollisionGroup;\r\n this.myPositionStepDecreaseButtonCollisionComponent.extents = this._myConfig.mySideButtonCollisionExtents;\r\n\r\n // Rotation\r\n this.myRotationStepTextComponent = this.myRotationStepText.pp_addComponent(TextComponent);\r\n this._setupTextComponent(this.myRotationStepTextComponent);\r\n this.myRotationStepTextComponent.text = \" \";\r\n\r\n this.myRotationStepCursorTargetComponent = this.myRotationStepCursorTarget.pp_addComponent(CursorTarget);\r\n this.myRotationStepCollisionComponent = this.myRotationStepCursorTarget.pp_addComponent(CollisionComponent);\r\n this.myRotationStepCollisionComponent.collider = this._myConfig.myCursorTargetCollisionCollider;\r\n this.myRotationStepCollisionComponent.group = 1 << this._myConfig.myCursorTargetCollisionGroup;\r\n this.myRotationStepCollisionComponent.extents = this._myConfig.myStepCollisionExtents;\r\n\r\n // Increase/Decrease\r\n this.myRotationStepIncreaseButtonBackgroundComponent = this.myRotationStepIncreaseButtonBackground.pp_addComponent(MeshComponent);\r\n this.myRotationStepIncreaseButtonBackgroundComponent.mesh = this._myPlaneMesh;\r\n this.myRotationStepIncreaseButtonBackgroundComponent.material = this._myParams.myPlaneMaterial.clone();\r\n this.myRotationStepIncreaseButtonBackgroundComponent.material.color = this._myConfig.myBackgroundColor;\r\n\r\n this.myRotationStepIncreaseButtonTextComponent = this.myRotationStepIncreaseButtonText.pp_addComponent(TextComponent);\r\n this._setupTextComponent(this.myRotationStepIncreaseButtonTextComponent);\r\n this.myRotationStepIncreaseButtonTextComponent.text = this._myConfig.myIncreaseButtonText;\r\n\r\n this.myRotationStepIncreaseButtonCursorTargetComponent = this.myRotationStepIncreaseButtonCursorTarget.pp_addComponent(CursorTarget);\r\n this.myRotationStepIncreaseButtonCollisionComponent = this.myRotationStepIncreaseButtonCursorTarget.pp_addComponent(CollisionComponent);\r\n this.myRotationStepIncreaseButtonCollisionComponent.collider = this._myConfig.myCursorTargetCollisionCollider;\r\n this.myRotationStepIncreaseButtonCollisionComponent.group = 1 << this._myConfig.myCursorTargetCollisionGroup;\r\n this.myRotationStepIncreaseButtonCollisionComponent.extents = this._myConfig.mySideButtonCollisionExtents;\r\n\r\n this.myRotationStepDecreaseButtonBackgroundComponent = this.myRotationStepDecreaseButtonBackground.pp_addComponent(MeshComponent);\r\n this.myRotationStepDecreaseButtonBackgroundComponent.mesh = this._myPlaneMesh;\r\n this.myRotationStepDecreaseButtonBackgroundComponent.material = this._myParams.myPlaneMaterial.clone();\r\n this.myRotationStepDecreaseButtonBackgroundComponent.material.color = this._myConfig.myBackgroundColor;\r\n\r\n this.myRotationStepDecreaseButtonTextComponent = this.myRotationStepDecreaseButtonText.pp_addComponent(TextComponent);\r\n this._setupTextComponent(this.myRotationStepDecreaseButtonTextComponent);\r\n this.myRotationStepDecreaseButtonTextComponent.text = this._myConfig.myDecreaseButtonText;\r\n\r\n this.myRotationStepDecreaseButtonCursorTargetComponent = this.myRotationStepDecreaseButtonCursorTarget.pp_addComponent(CursorTarget);\r\n this.myRotationStepDecreaseButtonCollisionComponent = this.myRotationStepDecreaseButtonCursorTarget.pp_addComponent(CollisionComponent);\r\n this.myRotationStepDecreaseButtonCollisionComponent.collider = this._myConfig.myCursorTargetCollisionCollider;\r\n this.myRotationStepDecreaseButtonCollisionComponent.group = 1 << this._myConfig.myCursorTargetCollisionGroup;\r\n this.myRotationStepDecreaseButtonCollisionComponent.extents = this._myConfig.mySideButtonCollisionExtents;\r\n\r\n // Scale\r\n this.myScaleStepTextComponent = this.myScaleStepText.pp_addComponent(TextComponent);\r\n this._setupTextComponent(this.myScaleStepTextComponent);\r\n this.myScaleStepTextComponent.text = \" \";\r\n\r\n this.myScaleStepCursorTargetComponent = this.myScaleStepCursorTarget.pp_addComponent(CursorTarget);\r\n this.myScaleStepCollisionComponent = this.myScaleStepCursorTarget.pp_addComponent(CollisionComponent);\r\n this.myScaleStepCollisionComponent.collider = this._myConfig.myCursorTargetCollisionCollider;\r\n this.myScaleStepCollisionComponent.group = 1 << this._myConfig.myCursorTargetCollisionGroup;\r\n this.myScaleStepCollisionComponent.extents = this._myConfig.myStepCollisionExtents;\r\n\r\n // Increase/Decrease\r\n this.myScaleStepIncreaseButtonBackgroundComponent = this.myScaleStepIncreaseButtonBackground.pp_addComponent(MeshComponent);\r\n this.myScaleStepIncreaseButtonBackgroundComponent.mesh = this._myPlaneMesh;\r\n this.myScaleStepIncreaseButtonBackgroundComponent.material = this._myParams.myPlaneMaterial.clone();\r\n this.myScaleStepIncreaseButtonBackgroundComponent.material.color = this._myConfig.myBackgroundColor;\r\n\r\n this.myScaleStepIncreaseButtonTextComponent = this.myScaleStepIncreaseButtonText.pp_addComponent(TextComponent);\r\n this._setupTextComponent(this.myScaleStepIncreaseButtonTextComponent);\r\n this.myScaleStepIncreaseButtonTextComponent.text = this._myConfig.myIncreaseButtonText;\r\n\r\n this.myScaleStepIncreaseButtonCursorTargetComponent = this.myScaleStepIncreaseButtonCursorTarget.pp_addComponent(CursorTarget);\r\n this.myScaleStepIncreaseButtonCollisionComponent = this.myScaleStepIncreaseButtonCursorTarget.pp_addComponent(CollisionComponent);\r\n this.myScaleStepIncreaseButtonCollisionComponent.collider = this._myConfig.myCursorTargetCollisionCollider;\r\n this.myScaleStepIncreaseButtonCollisionComponent.group = 1 << this._myConfig.myCursorTargetCollisionGroup;\r\n this.myScaleStepIncreaseButtonCollisionComponent.extents = this._myConfig.mySideButtonCollisionExtents;\r\n\r\n this.myScaleStepDecreaseButtonBackgroundComponent = this.myScaleStepDecreaseButtonBackground.pp_addComponent(MeshComponent);\r\n this.myScaleStepDecreaseButtonBackgroundComponent.mesh = this._myPlaneMesh;\r\n this.myScaleStepDecreaseButtonBackgroundComponent.material = this._myParams.myPlaneMaterial.clone();\r\n this.myScaleStepDecreaseButtonBackgroundComponent.material.color = this._myConfig.myBackgroundColor;\r\n\r\n this.myScaleStepDecreaseButtonTextComponent = this.myScaleStepDecreaseButtonText.pp_addComponent(TextComponent);\r\n this._setupTextComponent(this.myScaleStepDecreaseButtonTextComponent);\r\n this.myScaleStepDecreaseButtonTextComponent.text = this._myConfig.myDecreaseButtonText;\r\n\r\n this.myScaleStepDecreaseButtonCursorTargetComponent = this.myScaleStepDecreaseButtonCursorTarget.pp_addComponent(CursorTarget);\r\n this.myScaleStepDecreaseButtonCollisionComponent = this.myScaleStepDecreaseButtonCursorTarget.pp_addComponent(CollisionComponent);\r\n this.myScaleStepDecreaseButtonCollisionComponent.collider = this._myConfig.myCursorTargetCollisionCollider;\r\n this.myScaleStepDecreaseButtonCollisionComponent.group = 1 << this._myConfig.myCursorTargetCollisionGroup;\r\n this.myScaleStepDecreaseButtonCollisionComponent.extents = this._myConfig.mySideButtonCollisionExtents;\r\n }\r\n}", "import { GamepadAxesID } from \"../../../../input/gamepad/gamepad_buttons.js\";\r\nimport { mat4_create, vec3_create } from \"../../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Globals } from \"../../../../pp/globals.js\";\r\nimport { EasyTuneBaseWidget } from \"../base/easy_tune_base_widget.js\";\r\nimport { EasyTuneTransformWidgetConfig } from \"./easy_tune_transform_widget_config.js\";\r\nimport { EasyTuneTransformWidgetUI } from \"./easy_tune_transform_widget_ui.js\";\r\n\r\nexport class EasyTuneTransformWidget extends EasyTuneBaseWidget {\r\n\r\n constructor(params, gamepad, engine = Globals.getMainEngine()) {\r\n super(params);\r\n\r\n this._myGamepad = gamepad;\r\n\r\n this._myConfig = new EasyTuneTransformWidgetConfig();\r\n this._myUI = new EasyTuneTransformWidgetUI(engine);\r\n\r\n this._myValueButtonEditIntensity = 0;\r\n this._myValueButtonEditIntensityTimer = 0;\r\n this._myStepButtonEditIntensity = 0;\r\n this._myStepButtonEditIntensityTimer = 0;\r\n\r\n this._myValueEditEnabled = false;\r\n this._myStepEditEnabled = false;\r\n\r\n this._myValueRealValue = 0;\r\n this._myComponentStepValue = 0;\r\n this._myStepMultiplierValue = 0;\r\n this._myStepFastEdit = false;\r\n\r\n this._myValueEditIndex = -1;\r\n this._myComponentIndex = 0;\r\n this._myStepIndex = 0;\r\n\r\n this._myTempTransformValue = mat4_create();\r\n this._myTempPositionValue = vec3_create();\r\n this._myTempRotationValue = vec3_create();\r\n this._myTempScaleValue = vec3_create();\r\n }\r\n\r\n _refreshUIHook() {\r\n for (let i = 0; i < 3; i++) {\r\n this._myUI.myPositionTextComponents[i].text = this._myVariable._myPosition[i].toFixed(this._myVariable._myDecimalPlaces);\r\n }\r\n this._myUI.myPositionStepTextComponent.text = this._myConfig.myStepStartString.concat(this._myVariable._myPositionStepPerSecond);\r\n\r\n for (let i = 0; i < 3; i++) {\r\n this._myUI.myRotationTextComponents[i].text = this._myVariable._myRotation[i].toFixed(this._myVariable._myDecimalPlaces);\r\n }\r\n this._myUI.myRotationStepTextComponent.text = this._myConfig.myStepStartString.concat(this._myVariable._myRotationStepPerSecond);\r\n\r\n for (let i = 0; i < 3; i++) {\r\n this._myUI.myScaleTextComponents[i].text = this._myVariable._myScale[i].toFixed(this._myVariable._myDecimalPlaces);\r\n }\r\n this._myUI.myScaleStepTextComponent.text = this._myConfig.myStepStartString.concat(this._myVariable._myScaleStepPerSecond);\r\n }\r\n\r\n _startHook(parentObject, easyTuneParams) {\r\n this._myUI.setAdditionalButtonsVisible(easyTuneParams.myShowAdditionalButtons);\r\n }\r\n\r\n _setEasyTuneVariableHook() {\r\n if (this._myVariable != null) {\r\n if (this._myValueEditIndex >= 0 && this._myValueEditIndex < 3) {\r\n switch (this._myComponentIndex) {\r\n case 0:\r\n this._myValueRealValue = this._myVariable._myPosition[this._myValueEditIndex];\r\n this._myComponentStepValue = this._myVariable._myPositionStepPerSecond;\r\n break;\r\n case 1:\r\n this._myValueRealValue = this._myVariable._myRotation[this._myValueEditIndex];\r\n this._myComponentStepValue = this._myVariable._myRotationStepPerSecond;\r\n break;\r\n case 2:\r\n this._myValueRealValue = this._myVariable._myScale[this._myValueEditIndex];\r\n this._myComponentStepValue = this._myVariable._myScaleStepPerSecond;\r\n break;\r\n }\r\n }\r\n\r\n this._myTempPositionValue.pp_copy(this._myVariable._myPosition);\r\n this._myTempRotationValue.pp_copy(this._myVariable._myRotation);\r\n this._myTempScaleValue.pp_copy(this._myVariable._myScale);\r\n\r\n this._myStepMultiplierValue = 0;\r\n this._myStepFastEdit = false;\r\n }\r\n }\r\n\r\n _updateHook(dt) {\r\n this._updateValue(dt);\r\n }\r\n\r\n _updateValue(dt) {\r\n let stickVariableIntensity = 0;\r\n\r\n if (this._myGamepad) {\r\n let y = this._myGamepad.getAxesInfo(GamepadAxesID.THUMBSTICK).myAxes[1];\r\n\r\n if (Math.abs(y) > this._myConfig.myEditThumbstickMinThreshold) {\r\n let normalizedEditAmount = (Math.abs(y) - this._myConfig.myEditThumbstickMinThreshold) / (1 - this._myConfig.myEditThumbstickMinThreshold);\r\n stickVariableIntensity = Math.sign(y) * normalizedEditAmount;\r\n }\r\n }\r\n\r\n let valueIntensity = 0;\r\n if (this._myValueEditEnabled) {\r\n valueIntensity = stickVariableIntensity;\r\n } else if (this._myValueButtonEditIntensity != 0) {\r\n if (this._myValueButtonEditIntensityTimer <= 0) {\r\n valueIntensity = this._myValueButtonEditIntensity;\r\n } else {\r\n this._myValueButtonEditIntensityTimer -= dt;\r\n }\r\n }\r\n\r\n if (this._myValueEditIndex >= 0 && this._myValueEditIndex < 3) {\r\n if (valueIntensity != 0) {\r\n this._myTempPositionValue.pp_copy(this._myVariable._myPosition);\r\n this._myTempRotationValue.pp_copy(this._myVariable._myRotation);\r\n this._myTempScaleValue.pp_copy(this._myVariable._myScale);\r\n\r\n let amountToAdd = valueIntensity * this._myComponentStepValue * dt;\r\n\r\n this._myValueRealValue += amountToAdd;\r\n\r\n let decimalPlacesMultiplier = Math.pow(10, this._myVariable._myDecimalPlaces);\r\n\r\n switch (this._myComponentIndex) {\r\n case 0:\r\n this._myTempPositionValue[this._myValueEditIndex] = Math.round(this._myValueRealValue * decimalPlacesMultiplier + Number.EPSILON) / decimalPlacesMultiplier;\r\n this._myUI.myPositionTextComponents[this._myValueEditIndex].text = this._myTempPositionValue[this._myValueEditIndex].toFixed(this._myVariable._myDecimalPlaces);\r\n break;\r\n case 1:\r\n if (this._myValueRealValue > 180) {\r\n while (this._myValueRealValue > 180) {\r\n this._myValueRealValue -= 180;\r\n }\r\n this._myValueRealValue = -180 + this._myValueRealValue;\r\n }\r\n\r\n if (this._myValueRealValue < -180) {\r\n while (this._myValueRealValue < - 180) {\r\n this._myValueRealValue += 180;\r\n }\r\n this._myValueRealValue = 180 - this._myValueRealValue;\r\n }\r\n\r\n this._myTempRotationValue[this._myValueEditIndex] = Math.round(this._myValueRealValue * decimalPlacesMultiplier + Number.EPSILON) / decimalPlacesMultiplier;\r\n this._myUI.myRotationTextComponents[this._myValueEditIndex].text = this._myTempRotationValue[this._myValueEditIndex].toFixed(this._myVariable._myDecimalPlaces);\r\n break;\r\n case 2:\r\n if (this._myValueRealValue <= 0) {\r\n this._myValueRealValue = 1 / decimalPlacesMultiplier;\r\n }\r\n\r\n if (this._myVariable._myScaleAsOne) {\r\n let newValue = Math.round(this._myValueRealValue * decimalPlacesMultiplier + Number.EPSILON) / decimalPlacesMultiplier;\r\n let difference = newValue - this._myTempScaleValue[this._myValueEditIndex];\r\n\r\n for (let i = 0; i < 3; i++) {\r\n this._myTempScaleValue[i] = Math.round((this._myTempScaleValue[i] + difference) * decimalPlacesMultiplier + Number.EPSILON) / decimalPlacesMultiplier;\r\n this._myTempScaleValue[i] = Math.max(this._myTempScaleValue[i], 1 / decimalPlacesMultiplier);\r\n this._myUI.myScaleTextComponents[i].text = this._myTempScaleValue[i].toFixed(this._myVariable._myDecimalPlaces);\r\n }\r\n } else {\r\n this._myTempScaleValue[this._myValueEditIndex] = Math.round(this._myValueRealValue * decimalPlacesMultiplier + Number.EPSILON) / decimalPlacesMultiplier;\r\n this._myTempScaleValue[this._myValueEditIndex] = Math.max(this._myTempScaleValue[this._myValueEditIndex], 1 / decimalPlacesMultiplier);\r\n this._myUI.myScaleTextComponents[this._myValueEditIndex].text = this._myTempScaleValue[this._myValueEditIndex].toFixed(this._myVariable._myDecimalPlaces);\r\n }\r\n break;\r\n }\r\n\r\n this._myTempTransformValue.mat4_setPositionRotationDegreesScale(this._myTempPositionValue, this._myTempRotationValue, this._myTempScaleValue);\r\n this._myVariable.setValue(this._myTempTransformValue);\r\n } else {\r\n switch (this._myComponentIndex) {\r\n case 0:\r\n this._myValueRealValue = this._myVariable._myPosition[this._myValueEditIndex];\r\n break;\r\n case 1:\r\n this._myValueRealValue = this._myVariable._myRotation[this._myValueEditIndex];\r\n break;\r\n case 2:\r\n this._myValueRealValue = this._myVariable._myScale[this._myValueEditIndex];\r\n break;\r\n }\r\n }\r\n }\r\n\r\n let stepIntensity = 0;\r\n if (this._myStepEditEnabled) {\r\n stepIntensity = stickVariableIntensity;\r\n } else if (this._myStepButtonEditIntensity != 0) {\r\n if (this._myStepButtonEditIntensityTimer <= 0) {\r\n stepIntensity = this._myStepButtonEditIntensity;\r\n } else {\r\n this._myStepButtonEditIntensityTimer -= dt;\r\n }\r\n }\r\n\r\n if (stepIntensity != 0) {\r\n let amountToAdd = 0;\r\n if (this._myStepFastEdit) {\r\n amountToAdd = Math.sign(stepIntensity) * 1;\r\n this._myStepFastEdit = false;\r\n } else {\r\n amountToAdd = stepIntensity * this._myConfig.myStepMultiplierStepPerSecond * dt;\r\n }\r\n\r\n this._myStepMultiplierValue += amountToAdd;\r\n if (Math.abs(this._myStepMultiplierValue) >= 1) {\r\n let stepValue = 0;\r\n switch (this._myStepIndex) {\r\n case 0:\r\n stepValue = this._myVariable._myPositionStepPerSecond;\r\n break;\r\n case 1:\r\n stepValue = this._myVariable._myRotationStepPerSecond;\r\n break;\r\n case 2:\r\n stepValue = this._myVariable._myScaleStepPerSecond;\r\n break;\r\n default:\r\n stepValue = 0;\r\n }\r\n if (Math.sign(this._myStepMultiplierValue) > 0) {\r\n this._myStepMultiplierValue -= 1;\r\n this._changeStep(this._myStepIndex, stepValue * 10);\r\n } else {\r\n this._myStepMultiplierValue += 1;\r\n this._changeStep(this._myStepIndex, stepValue * 0.1);\r\n }\r\n }\r\n } else {\r\n this._myStepMultiplierValue = 0;\r\n this._myStepFastEdit = true;\r\n }\r\n }\r\n\r\n _addListenersHook() {\r\n let ui = this._myUI;\r\n\r\n ui.myVariableLabelCursorTargetComponent.onClick.add(this._resetAllValues.bind(this));\r\n ui.myVariableLabelCursorTargetComponent.onHover.add(this._genericTextHover.bind(this, ui.myVariableLabelText));\r\n ui.myVariableLabelCursorTargetComponent.onUnhover.add(this._genericTextUnhover.bind(this, ui.myVariableLabelText, this._myConfig.myVariableLabelTextScale));\r\n\r\n this._myUnhoverCallbacks.push(this._genericTextUnhover.bind(this, ui.myVariableLabelText, this._myConfig.myVariableLabelTextScale));\r\n\r\n ui.myPositionLabelCursorTargetComponent.onClick.add(this._resetComponentValues.bind(this, 0));\r\n ui.myPositionLabelCursorTargetComponent.onHover.add(this._genericTextHover.bind(this, ui.myPositionLabelText));\r\n ui.myPositionLabelCursorTargetComponent.onUnhover.add(this._genericTextUnhover.bind(this, ui.myPositionLabelText, this._myConfig.myComponentLabelTextScale));\r\n\r\n this._myUnhoverCallbacks.push(this._genericTextUnhover.bind(this, ui.myPositionLabelText, this._myConfig.myComponentLabelTextScale));\r\n\r\n for (let i = 0; i < 3; i++) {\r\n ui.myPositionIncreaseButtonCursorTargetComponents[i].onDown.add(this._setValueEditIntensity.bind(this, 0, i, 1));\r\n ui.myPositionIncreaseButtonCursorTargetComponents[i].onDownOnHover.add(this._setValueEditIntensity.bind(this, 0, i, 1));\r\n ui.myPositionIncreaseButtonCursorTargetComponents[i].onUp.add(this._setValueEditIntensity.bind(this, 0, i, 0));\r\n ui.myPositionIncreaseButtonCursorTargetComponents[i].onUnhover.add(this._setValueEditIntensity.bind(this, 0, i, 0));\r\n ui.myPositionDecreaseButtonCursorTargetComponents[i].onDown.add(this._setValueEditIntensity.bind(this, 0, i, -1));\r\n ui.myPositionDecreaseButtonCursorTargetComponents[i].onDownOnHover.add(this._setValueEditIntensity.bind(this, 0, i, -1));\r\n ui.myPositionDecreaseButtonCursorTargetComponents[i].onUp.add(this._setValueEditIntensity.bind(this, 0, i, 0));\r\n ui.myPositionDecreaseButtonCursorTargetComponents[i].onUnhover.add(this._setValueEditIntensity.bind(this, 0, i, 0));\r\n\r\n this._myUnhoverCallbacks.push(this._setValueEditIntensity.bind(this, 0, i, 0));\r\n\r\n ui.myPositionIncreaseButtonCursorTargetComponents[i].onHover.add(this._genericHover.bind(this, ui.myPositionIncreaseButtonBackgroundComponents[i].material));\r\n ui.myPositionIncreaseButtonCursorTargetComponents[i].onUnhover.add(this._genericUnhover.bind(this, ui.myPositionIncreaseButtonBackgroundComponents[i].material));\r\n ui.myPositionDecreaseButtonCursorTargetComponents[i].onHover.add(this._genericHover.bind(this, ui.myPositionDecreaseButtonBackgroundComponents[i].material));\r\n ui.myPositionDecreaseButtonCursorTargetComponents[i].onUnhover.add(this._genericUnhover.bind(this, ui.myPositionDecreaseButtonBackgroundComponents[i].material));\r\n\r\n this._myUnhoverCallbacks.push(this._genericUnhover.bind(this, ui.myPositionIncreaseButtonBackgroundComponents[i].material));\r\n this._myUnhoverCallbacks.push(this._genericUnhover.bind(this, ui.myPositionDecreaseButtonBackgroundComponents[i].material));\r\n\r\n ui.myPositionCursorTargetComponents[i].onClick.add(this._resetValue.bind(this, 0, i));\r\n ui.myPositionCursorTargetComponents[i].onHover.add(this._setValueEditEnabled.bind(this, 0, i, ui.myPositionTexts[i], true));\r\n ui.myPositionCursorTargetComponents[i].onUnhover.add(this._setValueEditEnabled.bind(this, 0, i, ui.myPositionTexts[i], false));\r\n\r\n this._myUnhoverCallbacks.push(this._setValueEditEnabled.bind(this, 0, i, ui.myPositionTexts[i], false));\r\n }\r\n\r\n ui.myRotationLabelCursorTargetComponent.onClick.add(this._resetComponentValues.bind(this, 1));\r\n ui.myRotationLabelCursorTargetComponent.onHover.add(this._genericTextHover.bind(this, ui.myRotationLabelText));\r\n ui.myRotationLabelCursorTargetComponent.onUnhover.add(this._genericTextUnhover.bind(this, ui.myRotationLabelText, this._myConfig.myComponentLabelTextScale));\r\n\r\n this._myUnhoverCallbacks.push(this._genericTextUnhover.bind(this, ui.myRotationLabelText, this._myConfig.myComponentLabelTextScale));\r\n\r\n for (let i = 0; i < 3; i++) {\r\n ui.myRotationIncreaseButtonCursorTargetComponents[i].onDown.add(this._setValueEditIntensity.bind(this, 1, i, 1));\r\n ui.myRotationIncreaseButtonCursorTargetComponents[i].onDownOnHover.add(this._setValueEditIntensity.bind(this, 1, i, 1));\r\n ui.myRotationIncreaseButtonCursorTargetComponents[i].onUp.add(this._setValueEditIntensity.bind(this, 1, i, 0));\r\n ui.myRotationIncreaseButtonCursorTargetComponents[i].onUnhover.add(this._setValueEditIntensity.bind(this, 1, i, 0));\r\n ui.myRotationDecreaseButtonCursorTargetComponents[i].onDown.add(this._setValueEditIntensity.bind(this, 1, i, -1));\r\n ui.myRotationDecreaseButtonCursorTargetComponents[i].onDownOnHover.add(this._setValueEditIntensity.bind(this, 1, i, -1));\r\n ui.myRotationDecreaseButtonCursorTargetComponents[i].onUp.add(this._setValueEditIntensity.bind(this, 1, i, 0));\r\n ui.myRotationDecreaseButtonCursorTargetComponents[i].onUnhover.add(this._setValueEditIntensity.bind(this, 1, i, 0));\r\n\r\n this._myUnhoverCallbacks.push(this._setValueEditIntensity.bind(this, 1, i, 0));\r\n\r\n ui.myRotationIncreaseButtonCursorTargetComponents[i].onHover.add(this._genericHover.bind(this, ui.myRotationIncreaseButtonBackgroundComponents[i].material));\r\n ui.myRotationIncreaseButtonCursorTargetComponents[i].onUnhover.add(this._genericUnhover.bind(this, ui.myRotationIncreaseButtonBackgroundComponents[i].material));\r\n ui.myRotationDecreaseButtonCursorTargetComponents[i].onHover.add(this._genericHover.bind(this, ui.myRotationDecreaseButtonBackgroundComponents[i].material));\r\n ui.myRotationDecreaseButtonCursorTargetComponents[i].onUnhover.add(this._genericUnhover.bind(this, ui.myRotationDecreaseButtonBackgroundComponents[i].material));\r\n\r\n this._myUnhoverCallbacks.push(this._genericUnhover.bind(this, ui.myRotationIncreaseButtonBackgroundComponents[i].material));\r\n this._myUnhoverCallbacks.push(this._genericUnhover.bind(this, ui.myRotationDecreaseButtonBackgroundComponents[i].material));\r\n\r\n ui.myRotationCursorTargetComponents[i].onClick.add(this._resetValue.bind(this, 1, i));\r\n ui.myRotationCursorTargetComponents[i].onHover.add(this._setValueEditEnabled.bind(this, 1, i, ui.myRotationTexts[i], true));\r\n ui.myRotationCursorTargetComponents[i].onUnhover.add(this._setValueEditEnabled.bind(this, 1, i, ui.myRotationTexts[i], false));\r\n\r\n this._myUnhoverCallbacks.push(this._setValueEditEnabled.bind(this, 1, i, ui.myRotationTexts[i], false));\r\n }\r\n\r\n ui.myScaleLabelCursorTargetComponent.onClick.add(this._resetComponentValues.bind(this, 2));\r\n ui.myScaleLabelCursorTargetComponent.onHover.add(this._genericTextHover.bind(this, ui.myScaleLabelText));\r\n ui.myScaleLabelCursorTargetComponent.onUnhover.add(this._genericTextUnhover.bind(this, ui.myScaleLabelText, this._myConfig.myComponentLabelTextScale));\r\n\r\n this._myUnhoverCallbacks.push(this._genericTextUnhover.bind(this, ui.myScaleLabelText, this._myConfig.myComponentLabelTextScale));\r\n\r\n for (let i = 0; i < 3; i++) {\r\n ui.myScaleIncreaseButtonCursorTargetComponents[i].onDown.add(this._setValueEditIntensity.bind(this, 2, i, 1));\r\n ui.myScaleIncreaseButtonCursorTargetComponents[i].onDownOnHover.add(this._setValueEditIntensity.bind(this, 2, i, 1));\r\n ui.myScaleIncreaseButtonCursorTargetComponents[i].onUp.add(this._setValueEditIntensity.bind(this, 2, i, 0));\r\n ui.myScaleIncreaseButtonCursorTargetComponents[i].onUnhover.add(this._setValueEditIntensity.bind(this, 2, i, 0));\r\n ui.myScaleDecreaseButtonCursorTargetComponents[i].onDown.add(this._setValueEditIntensity.bind(this, 2, i, -1));\r\n ui.myScaleDecreaseButtonCursorTargetComponents[i].onDownOnHover.add(this._setValueEditIntensity.bind(this, 2, i, -1));\r\n ui.myScaleDecreaseButtonCursorTargetComponents[i].onUp.add(this._setValueEditIntensity.bind(this, 2, i, 0));\r\n ui.myScaleDecreaseButtonCursorTargetComponents[i].onUnhover.add(this._setValueEditIntensity.bind(this, 2, i, 0));\r\n\r\n this._myUnhoverCallbacks.push(this._setValueEditIntensity.bind(this, 2, i, 0));\r\n\r\n ui.myScaleIncreaseButtonCursorTargetComponents[i].onHover.add(this._genericHover.bind(this, ui.myScaleIncreaseButtonBackgroundComponents[i].material));\r\n ui.myScaleIncreaseButtonCursorTargetComponents[i].onUnhover.add(this._genericUnhover.bind(this, ui.myScaleIncreaseButtonBackgroundComponents[i].material));\r\n ui.myScaleDecreaseButtonCursorTargetComponents[i].onHover.add(this._genericHover.bind(this, ui.myScaleDecreaseButtonBackgroundComponents[i].material));\r\n ui.myScaleDecreaseButtonCursorTargetComponents[i].onUnhover.add(this._genericUnhover.bind(this, ui.myScaleDecreaseButtonBackgroundComponents[i].material));\r\n\r\n this._myUnhoverCallbacks.push(this._genericUnhover.bind(this, ui.myScaleIncreaseButtonBackgroundComponents[i].material));\r\n this._myUnhoverCallbacks.push(this._genericUnhover.bind(this, ui.myScaleDecreaseButtonBackgroundComponents[i].material));\r\n\r\n ui.myScaleCursorTargetComponents[i].onClick.add(this._resetValue.bind(this, 2, i));\r\n ui.myScaleCursorTargetComponents[i].onHover.add(this._setValueEditEnabled.bind(this, 2, i, ui.myScaleTexts[i], true));\r\n ui.myScaleCursorTargetComponents[i].onUnhover.add(this._setValueEditEnabled.bind(this, 2, i, ui.myScaleTexts[i], false));\r\n\r\n this._myUnhoverCallbacks.push(this._setValueEditEnabled.bind(this, 2, i, ui.myScaleTexts[i], false));\r\n }\r\n\r\n ui.myPositionStepCursorTargetComponent.onClick.add(this._resetStep.bind(this, 0));\r\n ui.myPositionStepCursorTargetComponent.onHover.add(this._setStepEditEnabled.bind(this, 0, ui.myPositionStepText, true));\r\n ui.myPositionStepCursorTargetComponent.onUnhover.add(this._setStepEditEnabled.bind(this, 0, ui.myPositionStepText, false));\r\n\r\n this._myUnhoverCallbacks.push(this._setStepEditEnabled.bind(this, 0, ui.myPositionStepText, false));\r\n\r\n ui.myPositionStepIncreaseButtonCursorTargetComponent.onDown.add(this._setStepEditIntensity.bind(this, 0, 1));\r\n ui.myPositionStepIncreaseButtonCursorTargetComponent.onDownOnHover.add(this._setStepEditIntensity.bind(this, 0, 1));\r\n ui.myPositionStepIncreaseButtonCursorTargetComponent.onUp.add(this._setStepEditIntensity.bind(this, 0, 0));\r\n ui.myPositionStepIncreaseButtonCursorTargetComponent.onUnhover.add(this._setStepEditIntensity.bind(this, 0, 0));\r\n ui.myPositionStepDecreaseButtonCursorTargetComponent.onDown.add(this._setStepEditIntensity.bind(this, 0, -1));\r\n ui.myPositionStepDecreaseButtonCursorTargetComponent.onDownOnHover.add(this._setStepEditIntensity.bind(this, 0, -1));\r\n ui.myPositionStepDecreaseButtonCursorTargetComponent.onUp.add(this._setStepEditIntensity.bind(this, 0, 0));\r\n ui.myPositionStepDecreaseButtonCursorTargetComponent.onUnhover.add(this._setStepEditIntensity.bind(this, 0, 0));\r\n\r\n this._myUnhoverCallbacks.push(this._setStepEditIntensity.bind(this, 0, 0));\r\n\r\n ui.myPositionStepIncreaseButtonCursorTargetComponent.onHover.add(this._genericHover.bind(this, ui.myPositionStepIncreaseButtonBackgroundComponent.material));\r\n ui.myPositionStepIncreaseButtonCursorTargetComponent.onUnhover.add(this._genericUnhover.bind(this, ui.myPositionStepIncreaseButtonBackgroundComponent.material));\r\n ui.myPositionStepDecreaseButtonCursorTargetComponent.onHover.add(this._genericHover.bind(this, ui.myPositionStepDecreaseButtonBackgroundComponent.material));\r\n ui.myPositionStepDecreaseButtonCursorTargetComponent.onUnhover.add(this._genericUnhover.bind(this, ui.myPositionStepDecreaseButtonBackgroundComponent.material));\r\n\r\n this._myUnhoverCallbacks.push(this._genericUnhover.bind(this, ui.myPositionStepIncreaseButtonBackgroundComponent.material));\r\n this._myUnhoverCallbacks.push(this._genericUnhover.bind(this, ui.myPositionStepDecreaseButtonBackgroundComponent.material));\r\n\r\n ui.myRotationStepCursorTargetComponent.onClick.add(this._resetStep.bind(this, 1));\r\n ui.myRotationStepCursorTargetComponent.onHover.add(this._setStepEditEnabled.bind(this, 1, ui.myRotationStepText, true));\r\n ui.myRotationStepCursorTargetComponent.onUnhover.add(this._setStepEditEnabled.bind(this, 1, ui.myRotationStepText, false));\r\n\r\n this._myUnhoverCallbacks.push(this._setStepEditEnabled.bind(this, 1, ui.myRotationStepText, false));\r\n\r\n ui.myRotationStepIncreaseButtonCursorTargetComponent.onDown.add(this._setStepEditIntensity.bind(this, 1, 1));\r\n ui.myRotationStepIncreaseButtonCursorTargetComponent.onDownOnHover.add(this._setStepEditIntensity.bind(this, 1, 1));\r\n ui.myRotationStepIncreaseButtonCursorTargetComponent.onUp.add(this._setStepEditIntensity.bind(this, 1, 0));\r\n ui.myRotationStepIncreaseButtonCursorTargetComponent.onUnhover.add(this._setStepEditIntensity.bind(this, 1, 0));\r\n ui.myRotationStepDecreaseButtonCursorTargetComponent.onDown.add(this._setStepEditIntensity.bind(this, 1, -1));\r\n ui.myRotationStepDecreaseButtonCursorTargetComponent.onDownOnHover.add(this._setStepEditIntensity.bind(this, 1, -1));\r\n ui.myRotationStepDecreaseButtonCursorTargetComponent.onUp.add(this._setStepEditIntensity.bind(this, 1, 0));\r\n ui.myRotationStepDecreaseButtonCursorTargetComponent.onUnhover.add(this._setStepEditIntensity.bind(this, 1, 0));\r\n\r\n this._myUnhoverCallbacks.push(this._setStepEditIntensity.bind(this, 1, 0));\r\n\r\n ui.myRotationStepIncreaseButtonCursorTargetComponent.onHover.add(this._genericHover.bind(this, ui.myRotationStepIncreaseButtonBackgroundComponent.material));\r\n ui.myRotationStepIncreaseButtonCursorTargetComponent.onUnhover.add(this._genericUnhover.bind(this, ui.myRotationStepIncreaseButtonBackgroundComponent.material));\r\n ui.myRotationStepDecreaseButtonCursorTargetComponent.onHover.add(this._genericHover.bind(this, ui.myRotationStepDecreaseButtonBackgroundComponent.material));\r\n ui.myRotationStepDecreaseButtonCursorTargetComponent.onUnhover.add(this._genericUnhover.bind(this, ui.myRotationStepDecreaseButtonBackgroundComponent.material));\r\n\r\n this._myUnhoverCallbacks.push(this._genericUnhover.bind(this, ui.myRotationStepIncreaseButtonBackgroundComponent.material));\r\n this._myUnhoverCallbacks.push(this._genericUnhover.bind(this, ui.myRotationStepDecreaseButtonBackgroundComponent.material));\r\n\r\n ui.myScaleStepCursorTargetComponent.onClick.add(this._resetStep.bind(this, 2));\r\n ui.myScaleStepCursorTargetComponent.onHover.add(this._setStepEditEnabled.bind(this, 2, ui.myScaleStepText, true));\r\n ui.myScaleStepCursorTargetComponent.onUnhover.add(this._setStepEditEnabled.bind(this, 2, ui.myScaleStepText, false));\r\n\r\n this._myUnhoverCallbacks.push(this._setStepEditEnabled.bind(this, 2, ui.myScaleStepText, false));\r\n\r\n ui.myScaleStepIncreaseButtonCursorTargetComponent.onDown.add(this._setStepEditIntensity.bind(this, 2, 1));\r\n ui.myScaleStepIncreaseButtonCursorTargetComponent.onDownOnHover.add(this._setStepEditIntensity.bind(this, 2, 1));\r\n ui.myScaleStepIncreaseButtonCursorTargetComponent.onUp.add(this._setStepEditIntensity.bind(this, 2, 0));\r\n ui.myScaleStepIncreaseButtonCursorTargetComponent.onUnhover.add(this._setStepEditIntensity.bind(this, 2, 0));\r\n ui.myScaleStepDecreaseButtonCursorTargetComponent.onDown.add(this._setStepEditIntensity.bind(this, 2, -1));\r\n ui.myScaleStepDecreaseButtonCursorTargetComponent.onDownOnHover.add(this._setStepEditIntensity.bind(this, 2, -1));\r\n ui.myScaleStepDecreaseButtonCursorTargetComponent.onUp.add(this._setStepEditIntensity.bind(this, 2, 0));\r\n ui.myScaleStepDecreaseButtonCursorTargetComponent.onUnhover.add(this._setStepEditIntensity.bind(this, 2, 0));\r\n\r\n this._myUnhoverCallbacks.push(this._setStepEditIntensity.bind(this, 2, 0));\r\n\r\n ui.myScaleStepIncreaseButtonCursorTargetComponent.onHover.add(this._genericHover.bind(this, ui.myScaleStepIncreaseButtonBackgroundComponent.material));\r\n ui.myScaleStepIncreaseButtonCursorTargetComponent.onUnhover.add(this._genericUnhover.bind(this, ui.myScaleStepIncreaseButtonBackgroundComponent.material));\r\n ui.myScaleStepDecreaseButtonCursorTargetComponent.onHover.add(this._genericHover.bind(this, ui.myScaleStepDecreaseButtonBackgroundComponent.material));\r\n ui.myScaleStepDecreaseButtonCursorTargetComponent.onUnhover.add(this._genericUnhover.bind(this, ui.myScaleStepDecreaseButtonBackgroundComponent.material));\r\n\r\n this._myUnhoverCallbacks.push(this._genericUnhover.bind(this, ui.myScaleStepIncreaseButtonBackgroundComponent.material));\r\n this._myUnhoverCallbacks.push(this._genericUnhover.bind(this, ui.myScaleStepDecreaseButtonBackgroundComponent.material));\r\n\r\n }\r\n\r\n _setValueEditIntensity(componentIndex, index, value) {\r\n if (this._isActive() || value == 0) {\r\n if (value != 0) {\r\n switch (componentIndex) {\r\n case 0:\r\n this._myValueRealValue = this._myVariable._myPosition[index];\r\n this._myComponentStepValue = this._myVariable._myPositionStepPerSecond;\r\n break;\r\n case 1:\r\n this._myValueRealValue = this._myVariable._myRotation[index];\r\n this._myComponentStepValue = this._myVariable._myRotationStepPerSecond;\r\n break;\r\n case 2:\r\n this._myValueRealValue = this._myVariable._myScale[index];\r\n this._myComponentStepValue = this._myVariable._myScaleStepPerSecond;\r\n break;\r\n }\r\n\r\n this._myValueButtonEditIntensityTimer = this._myConfig.myButtonEditDelay;\r\n this._myValueEditIndex = index;\r\n this._myComponentIndex = componentIndex;\r\n }\r\n\r\n this._myValueButtonEditIntensity = value;\r\n }\r\n }\r\n\r\n _setStepEditIntensity(index, value) {\r\n if (this._isActive() || value == 0) {\r\n if (value != 0) {\r\n this._myStepButtonEditIntensityTimer = this._myConfig.myButtonEditDelay;\r\n }\r\n\r\n this._myStepButtonEditIntensity = value;\r\n\r\n this._myStepIndex = index;\r\n }\r\n }\r\n\r\n _setValueEditEnabled(componentIndex, index, text, enabled) {\r\n if (this._isActive() || !enabled) {\r\n if (enabled) {\r\n switch (componentIndex) {\r\n case 0:\r\n this._myValueRealValue = this._myVariable._myPosition[index];\r\n this._myComponentStepValue = this._myVariable._myPositionStepPerSecond;\r\n break;\r\n case 1:\r\n this._myValueRealValue = this._myVariable._myRotation[index];\r\n this._myComponentStepValue = this._myVariable._myRotationStepPerSecond;\r\n break;\r\n case 2:\r\n this._myValueRealValue = this._myVariable._myScale[index];\r\n this._myComponentStepValue = this._myVariable._myScaleStepPerSecond;\r\n break;\r\n }\r\n\r\n this._myValueEditIndex = index;\r\n this._myComponentIndex = componentIndex;\r\n text.pp_scaleObject(this._myConfig.myTextHoverScaleMultiplier);\r\n } else {\r\n text.pp_setScaleLocal(this._myConfig.myValueTextScale);\r\n }\r\n\r\n this._myValueEditEnabled = enabled;\r\n }\r\n }\r\n\r\n _setStepEditEnabled(index, text, enabled) {\r\n if (this._isActive() || !enabled) {\r\n if (enabled) {\r\n text.pp_scaleObject(this._myConfig.myTextHoverScaleMultiplier);\r\n } else {\r\n text.pp_setScaleLocal(this._myConfig.myStepTextScale);\r\n }\r\n\r\n this._myStepEditEnabled = enabled;\r\n this._myStepIndex = index;\r\n }\r\n }\r\n\r\n _resetValue(componentIndex, index) {\r\n if (this._isActive()) {\r\n this._myTempPositionValue.pp_copy(this._myVariable._myPosition);\r\n this._myTempRotationValue.pp_copy(this._myVariable._myRotation);\r\n this._myTempScaleValue.pp_copy(this._myVariable._myScale);\r\n\r\n switch (componentIndex) {\r\n case 0:\r\n this._myTempPositionValue[index] = this._myVariable._myDefaultPosition[index];\r\n this._myUI.myPositionTextComponents[index].text = this._myTempPositionValue[index].toFixed(this._myVariable._myDecimalPlaces);\r\n break;\r\n case 1:\r\n this._myTempRotationValue[index] = this._myVariable._myDefaultRotation[index];\r\n this._myUI.myRotationTextComponents[index].text = this._myTempRotationValue[index].toFixed(this._myVariable._myDecimalPlaces);\r\n break;\r\n case 2:\r\n this._myTempScaleValue[index] = this._myVariable._myDefaultScale[index];\r\n this._myUI.myScaleTextComponents[index].text = this._myTempScaleValue[index].toFixed(this._myVariable._myDecimalPlaces);\r\n break;\r\n\r\n }\r\n\r\n this._myTempTransformValue.mat4_setPositionRotationDegreesScale(this._myTempPositionValue, this._myTempRotationValue, this._myTempScaleValue);\r\n this._myVariable.setValue(this._myTempTransformValue);\r\n }\r\n }\r\n\r\n _resetAllValues() {\r\n for (let i = 0; i < 3; i++) {\r\n this._resetComponentValues(i);\r\n }\r\n }\r\n\r\n _resetComponentValues(index) {\r\n for (let i = 0; i < 3; i++) {\r\n this._resetValue(index, i);\r\n }\r\n }\r\n\r\n _resetStep(index) {\r\n if (this._isActive()) {\r\n let defaultValue = 0;\r\n switch (index) {\r\n case 0:\r\n defaultValue = this._myVariable._myDefaultPositionStepPerSecond;\r\n break;\r\n case 1:\r\n defaultValue = this._myVariable._myDefaultRotationStepPerSecond;\r\n break;\r\n case 2:\r\n defaultValue = this._myVariable._myDefaultScaleStepPerSecond;\r\n break;\r\n default:\r\n defaultValue = 0;\r\n }\r\n\r\n this._changeStep(index, defaultValue);\r\n }\r\n }\r\n\r\n _changeStep(index, step) {\r\n step = Math.pp_roundDecimal(step, 10);\r\n\r\n switch (index) {\r\n case 0:\r\n this._myVariable._myPositionStepPerSecond = step;\r\n this._myUI.myPositionStepTextComponent.text = this._myConfig.myStepStartString.concat(this._myVariable._myPositionStepPerSecond);\r\n break;\r\n case 1:\r\n this._myVariable._myRotationStepPerSecond = step;\r\n this._myUI.myRotationStepTextComponent.text = this._myConfig.myStepStartString.concat(this._myVariable._myRotationStepPerSecond);\r\n break;\r\n case 2:\r\n this._myVariable._myScaleStepPerSecond = step;\r\n this._myUI.myScaleStepTextComponent.text = this._myConfig.myStepStartString.concat(this._myVariable._myScaleStepPerSecond);\r\n break;\r\n }\r\n }\r\n\r\n _genericTextHover(text) {\r\n text.pp_scaleObject(this._myConfig.myTextHoverScaleMultiplier);\r\n }\r\n\r\n _genericTextUnhover(text, originalScale) {\r\n text.pp_setScaleLocal(originalScale);\r\n }\r\n}", "import { GamepadAxesID, GamepadButtonID } from \"../../../input/gamepad/gamepad_buttons.js\";\r\nimport { Globals } from \"../../../pp/globals.js\";\r\nimport { ToolHandedness } from \"../../cauldron/tool_types.js\";\r\nimport { WidgetFrame, WidgetParams } from \"../../widget_frame/widget_frame.js\";\r\nimport { EasyTuneVariableType } from \"../easy_tune_variable_types.js\";\r\nimport { EasyTuneBaseWidgetParams } from \"./base/easy_tune_base_widget.js\";\r\nimport { EasyTuneBoolArrayWidgetSelector } from \"./bool/easy_tune_bool_array_widget_selector.js\";\r\nimport { EasyTuneWidgetConfig } from \"./easy_tune_widget_config.js\";\r\nimport { EasyTuneNoneWidget } from \"./none/easy_tune_none_widget.js\";\r\nimport { EasyTuneNumberArrayWidgetSelector } from \"./number/easy_tune_number_widget_selector.js\";\r\nimport { EasyTuneTransformWidget } from \"./transform/easy_tune_transform_widget.js\";\r\n\r\nexport class EasyTuneWidgetParams extends WidgetParams {\r\n\r\n constructor() {\r\n super();\r\n\r\n this.myShowOnStart = false;\r\n this.myShowVisibilityButton = false;\r\n this.myShowAdditionalButtons = false;\r\n this.myGamepadScrollVariableEnabled = false;\r\n\r\n this.myShowVariablesImportExportButtons = false;\r\n this.myVariablesImportCallback = null; // Signature: callback()\r\n this.myVariablesExportCallback = null; // Signature: callback()\r\n }\r\n}\r\n\r\nexport class EasyTuneWidget {\r\n\r\n constructor(engine = Globals.getMainEngine()) {\r\n this._myStarted = false;\r\n this._myStartVariable = null;\r\n\r\n this._myActive = true;\r\n this._myVisibleBackup = null;\r\n\r\n this._myWidgetFrame = new WidgetFrame(\"E\", 1, engine);\r\n this._myWidgetFrame.registerWidgetVisibleChangedEventListener(this, this._widgetVisibleChanged.bind(this));\r\n\r\n this._myConfig = new EasyTuneWidgetConfig();\r\n this._myParams = null;\r\n\r\n this._myWidgets = [];\r\n\r\n this._myEasyTuneVariables = null;\r\n this._myEasyTuneLastSize = 0;\r\n this._myVariableNames = null;\r\n\r\n this._myCurrentWidget = null;\r\n this._myCurrentVariable = null;\r\n\r\n this._myScrollVariableTimer = 0;\r\n\r\n this._myGamepad = null;\r\n\r\n this._myRefreshVariablesTimer = 0;\r\n\r\n this._myDirty = false;\r\n\r\n this._myEngine = engine;\r\n\r\n this._myDestroyed = false;\r\n }\r\n\r\n setCurrentVariable(variableName) {\r\n if (!this._myStarted) {\r\n this._myStartVariable = variableName;\r\n } else if (this._myEasyTuneVariables.has(variableName)) {\r\n this._myCurrentVariable = this._myEasyTuneVariables.getEasyTuneVariable(variableName);\r\n this._selectCurrentWidget();\r\n } else {\r\n console.warn(\"Can't change easy tune current variable to inexistent variable:\", variableName);\r\n }\r\n }\r\n\r\n refresh() {\r\n if (this._myWidgetFrame.isVisible()) {\r\n this._myDirty = true;\r\n }\r\n }\r\n\r\n setVisible(visible) {\r\n if (this._myActive) {\r\n this._myWidgetFrame.setVisible(visible);\r\n } else {\r\n this._myVisibleBackup = visible;\r\n }\r\n }\r\n\r\n isVisible() {\r\n return this._myWidgetFrame.isVisible();\r\n }\r\n\r\n start(parentObject, params, easyTuneVariables) {\r\n this._myRightGamepad = Globals.getRightGamepad(this._myEngine);\r\n this._myLeftGamepad = Globals.getLeftGamepad(this._myEngine);\r\n if (this._myConfig.myGamepadHandedness == ToolHandedness.RIGHT) {\r\n this._myGamepad = this._myRightGamepad;\r\n } else if (this._myConfig.myGamepadHandedness == ToolHandedness.LEFT) {\r\n this._myGamepad = this._myLeftGamepad;\r\n }\r\n\r\n this._myStarted = true;\r\n\r\n this._myParams = params;\r\n\r\n this._myWidgetFrame.start(parentObject, params);\r\n\r\n this._myEasyTuneVariables = easyTuneVariables;\r\n this._myEasyTuneLastSize = this.getValidEasyTuneVariablesLength();\r\n this._myVariableNames = this.getValidEasyTuneVariablesNames();\r\n\r\n if (this.getValidEasyTuneVariablesLength() > 0) {\r\n this._myCurrentVariable = this._myEasyTuneVariables.getEasyTuneVariable(this._myVariableNames[0]);\r\n }\r\n\r\n if (this._myStartVariable != null) {\r\n if (this._myEasyTuneVariables.has(this._myStartVariable)) {\r\n this._myCurrentVariable = this._myEasyTuneVariables.getEasyTuneVariable(this._myStartVariable);\r\n } else {\r\n console.warn(\"Can't change easy tune current variable to inexistent variable:\", this._myStartVariable);\r\n }\r\n }\r\n\r\n this._initializeWidgets();\r\n }\r\n\r\n update(dt) {\r\n if (!this._myActive) return;\r\n\r\n this._myWidgetFrame.update(dt);\r\n\r\n if (this.getValidEasyTuneVariablesLength() != this._myEasyTuneLastSize || this._myDirty) {\r\n this._refreshEasyTuneVariables();\r\n }\r\n\r\n if (this._myWidgetFrame.isVisible() && this.getValidEasyTuneVariablesLength() > 0) {\r\n if (this._myConfig.myRefreshVariablesDelay != null) {\r\n this._myRefreshVariablesTimer += dt;\r\n if (this._myRefreshVariablesTimer > this._myConfig.myRefreshVariablesDelay) {\r\n this._myRefreshVariablesTimer = 0;\r\n this._refreshEasyTuneVariables();\r\n }\r\n }\r\n\r\n if (this._myCurrentWidget) {\r\n this._myCurrentWidget.update(dt);\r\n }\r\n\r\n if (this._myParams.myGamepadScrollVariableEnabled) {\r\n this._updateGamepadScrollVariable(dt);\r\n }\r\n }\r\n\r\n this._updateGamepadWidgetVisibility();\r\n\r\n this._updateWidgetCurrentVariable();\r\n }\r\n\r\n isActive() {\r\n return this._myActive;\r\n }\r\n\r\n setActive(active) {\r\n if (!this._myStarted) return;\r\n\r\n for (let widget of this._myWidgets) {\r\n widget.setActive(active);\r\n }\r\n this._myWidgetFrame.setActive(active);\r\n\r\n if (this._myActive != active) {\r\n if (active) {\r\n this._myActive = active;\r\n if (this._myVisibleBackup != null) {\r\n this.setVisible(false);\r\n this.setVisible(this._myVisibleBackup);\r\n\r\n this._myVisibleBackup = null;\r\n }\r\n } else {\r\n if (this._myVisibleBackup == null) {\r\n this._myVisibleBackup = this.isVisible();\r\n }\r\n\r\n if (this.isVisible()) {\r\n this.setVisible(false);\r\n }\r\n this._myActive = active;\r\n }\r\n }\r\n }\r\n\r\n _initializeWidgets() {\r\n let widgetParams = new EasyTuneBaseWidgetParams();\r\n widgetParams.myVariablesImportCallback = this._importVariables.bind(this);\r\n widgetParams.myVariablesExportCallback = this._exportVariables.bind(this);\r\n\r\n this._myWidgets[EasyTuneVariableType.NONE] = new EasyTuneNoneWidget(widgetParams, this._myEngine);\r\n this._myWidgets[EasyTuneVariableType.NUMBER] = new EasyTuneNumberArrayWidgetSelector(widgetParams, this._myGamepad, this._myEngine);\r\n this._myWidgets[EasyTuneVariableType.BOOL] = new EasyTuneBoolArrayWidgetSelector(widgetParams, this._myGamepad, this._myEngine);\r\n this._myWidgets[EasyTuneVariableType.TRANSFORM] = new EasyTuneTransformWidget(widgetParams, this._myGamepad, this._myEngine);\r\n\r\n for (let widget of this._myWidgets) {\r\n widget.start(this._myWidgetFrame.getWidgetObject(), this._myParams);\r\n widget.setVisible(false);\r\n widget.registerScrollVariableRequestEventListener(this, this._scrollVariable.bind(this));\r\n }\r\n\r\n this._selectCurrentWidget();\r\n }\r\n\r\n _selectCurrentWidget() {\r\n if (this.getValidEasyTuneVariablesLength() <= 0) {\r\n return;\r\n } else if (this._myCurrentVariable == null) {\r\n this._myVariableNames = this.getValidEasyTuneVariablesNames();\r\n this._myCurrentVariable = this._myEasyTuneVariables.getEasyTuneVariable(this._myVariableNames[0]);\r\n }\r\n\r\n let prevWidget = null;\r\n if (this._myCurrentWidget != null) {\r\n prevWidget = this._myCurrentWidget.getWidget();\r\n }\r\n\r\n if (this._myCurrentVariable.getType() in this._myWidgets) {\r\n this._myCurrentWidget = this._myWidgets[this._myCurrentVariable.getType()];\r\n } else {\r\n this._myCurrentWidget = this._myWidgets[EasyTuneVariableType.NONE];\r\n }\r\n\r\n this._myCurrentWidget.setEasyTuneVariable(this._myCurrentVariable, this._createIndexString());\r\n this._myCurrentWidget.getWidget().syncWidget(prevWidget);\r\n\r\n if (prevWidget != null && this._myCurrentWidget.getWidget() != prevWidget) {\r\n prevWidget.setVisible(false);\r\n }\r\n\r\n this._myCurrentWidget.setVisible(this._myWidgetFrame.isVisible());\r\n }\r\n\r\n _refreshEasyTuneVariables() {\r\n this._myVariableNames = this.getValidEasyTuneVariablesNames();\r\n this._myEasyTuneLastSize = this.getValidEasyTuneVariablesLength();\r\n\r\n if (this.getValidEasyTuneVariablesLength() > 0) {\r\n if (this._myCurrentVariable && this._myVariableNames.pp_hasEqual(this._myCurrentVariable.getName())) {\r\n this._myCurrentVariable = this._myEasyTuneVariables.getEasyTuneVariable(this._myCurrentVariable.getName());\r\n } else {\r\n this._myCurrentVariable = this._myEasyTuneVariables.getEasyTuneVariable(this._myVariableNames[0]);\r\n }\r\n\r\n this._selectCurrentWidget();\r\n } else {\r\n this._myCurrentVariable = null;\r\n if (this._myCurrentWidget) {\r\n this._myCurrentWidget.setVisible(false);\r\n this._myCurrentWidget = null;\r\n }\r\n }\r\n\r\n this._myDirty = false;\r\n }\r\n\r\n _updateGamepadWidgetVisibility() {\r\n if (this._myGamepad) {\r\n if ((this._myGamepad.getButtonInfo(GamepadButtonID.BOTTOM_BUTTON).isPressStart() && this._myGamepad.getButtonInfo(GamepadButtonID.TOP_BUTTON).isPressed()) ||\r\n (this._myGamepad.getButtonInfo(GamepadButtonID.TOP_BUTTON).isPressStart() && this._myGamepad.getButtonInfo(GamepadButtonID.BOTTOM_BUTTON).isPressed())) {\r\n this._toggleVisibility();\r\n }\r\n }\r\n }\r\n\r\n _toggleVisibility() {\r\n this._myWidgetFrame.toggleVisibility();\r\n }\r\n\r\n _widgetVisibleChanged(visible) {\r\n for (let widget of this._myWidgets) {\r\n widget.setVisible(false);\r\n }\r\n\r\n if (this._myCurrentWidget) {\r\n if (this.getValidEasyTuneVariablesLength() > 0) {\r\n this._myCurrentWidget.setVisible(visible);\r\n } else {\r\n this._myCurrentWidget.setVisible(false);\r\n }\r\n }\r\n\r\n if (visible) {\r\n this._refreshEasyTuneVariables();\r\n }\r\n }\r\n\r\n _updateGamepadScrollVariable(dt) {\r\n if (this._myGamepad && (!this._myConfig.myScrollVariableButtonID || this._myGamepad.getButtonInfo(this._myConfig.myScrollVariableButtonID).isPressed())) {\r\n let x = this._myGamepad.getAxesInfo(GamepadAxesID.THUMBSTICK).myAxes[0];\r\n let y = this._myGamepad.getAxesInfo(GamepadAxesID.THUMBSTICK).myAxes[1];\r\n if (Math.abs(x) > this._myConfig.myScrollVariableMinXThreshold && Math.abs(y) < this._myConfig.myScrollVariableMaxYThreshold) {\r\n this._myScrollVariableTimer += dt;\r\n while (this._myScrollVariableTimer > this._myConfig.myScrollVariableDelay) {\r\n this._myScrollVariableTimer -= this._myConfig.myScrollVariableDelay;\r\n this._scrollVariable(Math.sign(x));\r\n }\r\n } else {\r\n this._myScrollVariableTimer = this._myConfig.myScrollVariableDelay;\r\n }\r\n } else {\r\n this._myScrollVariableTimer = this._myConfig.myScrollVariableDelay;\r\n }\r\n }\r\n\r\n _scrollVariable(amount) {\r\n if (this.getValidEasyTuneVariablesLength() <= 0) {\r\n return;\r\n }\r\n\r\n let variableIndex = this._getVariableIndex(this._myCurrentVariable);\r\n if (variableIndex >= 0) {\r\n // Manage negative numbers\r\n let newIndex = (((variableIndex + amount) % this._myVariableNames.length) + this._myVariableNames.length) % this._myVariableNames.length;\r\n if (this._myEasyTuneVariables.has(this._myVariableNames[newIndex])) {\r\n this._myCurrentVariable = this._myEasyTuneVariables.getEasyTuneVariable(this._myVariableNames[newIndex]);\r\n this._selectCurrentWidget();\r\n } else {\r\n this._refreshEasyTuneVariables();\r\n }\r\n } else {\r\n this._refreshEasyTuneVariables();\r\n }\r\n }\r\n\r\n _createIndexString() {\r\n let indexString = \" (\";\r\n let index = (this._getVariableIndex(this._myCurrentVariable) + 1).toString();\r\n let length = (this.getValidEasyTuneVariablesLength()).toString();\r\n while (index.length < length.length) {\r\n index = \"0\".concat(index);\r\n }\r\n\r\n indexString = indexString.concat(index).concat(\" - \").concat(length).concat(\")\");\r\n\r\n return indexString;\r\n }\r\n\r\n _getVariableIndex(variable) {\r\n let variableIndex = this._myVariableNames.indexOf(variable.getName());\r\n return variableIndex;\r\n }\r\n\r\n _updateWidgetCurrentVariable() {\r\n for (let variable of this._myEasyTuneVariables.getEasyTuneVariablesList()) {\r\n variable.setWidgetCurrentVariable(false);\r\n }\r\n\r\n if (this._myWidgetFrame.isVisible() && this._myCurrentVariable) {\r\n this._myCurrentVariable.setWidgetCurrentVariable(true);\r\n }\r\n }\r\n\r\n _importVariables() {\r\n this._myParams.myVariablesImportCallback(this._onImportSuccess.bind(this), this._onImportFailure.bind(this));\r\n }\r\n\r\n _exportVariables() {\r\n this._myParams.myVariablesExportCallback(this._onExportSuccess.bind(this), this._onExportFailure.bind(this));\r\n }\r\n\r\n _onImportSuccess() {\r\n if (this._myCurrentWidget) {\r\n this._myCurrentWidget.onImportSuccess();\r\n }\r\n }\r\n\r\n _onImportFailure() {\r\n if (this._myCurrentWidget) {\r\n this._myCurrentWidget.onImportFailure();\r\n }\r\n }\r\n\r\n _onExportSuccess() {\r\n if (this._myCurrentWidget) {\r\n this._myCurrentWidget.onExportSuccess();\r\n }\r\n }\r\n\r\n _onExportFailure() {\r\n if (this._myCurrentWidget) {\r\n this._myCurrentWidget.onExportFailure();\r\n }\r\n }\r\n\r\n destroy() {\r\n this._myDestroyed = true;\r\n\r\n this.setActive(false);\r\n\r\n for (let widget of this._myWidgets) {\r\n widget.destroy();\r\n }\r\n\r\n this._myWidgetFrame.destroy();\r\n }\r\n\r\n isDestroyed() {\r\n return this._myDestroyed;\r\n }\r\n\r\n\r\n getValidEasyTuneVariablesLength() {\r\n return this.getValidEasyTuneVariablesNames().length;\r\n }\r\n\r\n getValidEasyTuneVariablesNames() {\r\n let names = this._myEasyTuneVariables.getEasyTuneVariablesNames();\r\n\r\n let validNames = [];\r\n for (let name of names) {\r\n let variable = this._myEasyTuneVariables.getEasyTuneVariable(name);\r\n if (variable.isShownOnWidget()) {\r\n validNames.push(name);\r\n }\r\n }\r\n\r\n return validNames;\r\n }\r\n}", "import { Component, Property } from \"@wonderlandengine/api\";\r\nimport { EasyTuneUtils } from \"../easy_tune_utils.js\";\r\n\r\nexport class EasyTuneImportVariablesComponent extends Component {\r\n static TypeName = \"pp-easy-tune-import-variables\";\r\n static Properties = {\r\n _myVariablesImportURL: Property.string(\"\"),\r\n _myResetVariablesDefaultValueOnImport: Property.bool(true)\r\n };\r\n\r\n start() {\r\n this._myFirstUpdate = true;\r\n }\r\n\r\n update(dt) {\r\n if (this._myFirstUpdate) {\r\n this._myFirstUpdate = false;\r\n EasyTuneUtils.importVariables(this._myVariablesImportURL, this._myResetVariablesDefaultValueOnImport, false, false, undefined, undefined, this.engine);\r\n }\r\n }\r\n}", "import { LightComponent, Object3D, WonderlandEngine } from \"@wonderlandengine/api\";\r\nimport { EasyTuneNumber } from \"../easy_tune_variable_types.js\";\r\nimport { EasyObjectTuner } from \"./easy_object_tuner.js\";\r\n\r\nexport class EasyLightAttenuation extends EasyObjectTuner {\r\n\r\n constructor(object: Object3D, variableName: string, setAsWidgetCurrentVariable: boolean, useTuneTarget: boolean, engine?: Readonly) {\r\n super(object, variableName, setAsWidgetCurrentVariable, useTuneTarget, engine);\r\n }\r\n\r\n protected override _getVariableNamePrefix(): string {\r\n return \"Light Attenuation \";\r\n }\r\n\r\n protected override _createEasyTuneVariable(variableName: string): EasyTuneNumber {\r\n return new EasyTuneNumber(variableName, this._getDefaultValue(), null, true, 3, 0.01, 0, 1, undefined, this._myEngine);\r\n }\r\n\r\n protected override _getObjectValue(object: Readonly): Readonly {\r\n let attenuation = this._getDefaultValue();\r\n\r\n const light = object.pp_getComponent(LightComponent);\r\n if (light != null) {\r\n attenuation = light.color[3];\r\n }\r\n\r\n return attenuation;\r\n }\r\n\r\n protected override _getDefaultValue(): Readonly {\r\n return 0;\r\n }\r\n\r\n protected override _areValueEqual(first: Readonly, second: Readonly): boolean {\r\n return first == second;\r\n }\r\n\r\n protected override _updateObjectValue(object: Object3D, value: Readonly): void {\r\n const attenuation = value;\r\n\r\n const light = object.pp_getComponent(LightComponent);\r\n if (light) {\r\n light.color[3] = attenuation;\r\n }\r\n }\r\n}", "import { LightComponent, Object3D, WonderlandEngine } from \"@wonderlandengine/api\";\r\nimport { Vector3 } from \"../../../cauldron/type_definitions/array_type_definitions.js\";\r\nimport { ColorModel, ColorUtils } from \"../../../cauldron/utils/color_utils.js\";\r\nimport { GamepadButtonID } from \"../../../input/gamepad/gamepad_buttons.js\";\r\nimport { vec3_create } from \"../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Globals } from \"../../../pp/globals.js\";\r\nimport { EasyTuneIntArray } from \"../easy_tune_variable_types.js\";\r\nimport { EasyObjectTuner } from \"./easy_object_tuner.js\";\r\n\r\nexport class EasyLightColor extends EasyObjectTuner {\r\n\r\n private _myColorModel: ColorModel;\r\n\r\n constructor(colorModel: ColorModel, object: Object3D, variableName: string, setAsWidgetCurrentVariable: boolean, useTuneTarget: boolean, engine?: Readonly) {\r\n super(object, variableName, setAsWidgetCurrentVariable, useTuneTarget, engine);\r\n\r\n this._myColorModel = colorModel;\r\n }\r\n\r\n protected override _getVariableNamePrefix(): string {\r\n let nameFirstPart = null;\r\n\r\n if (this._myColorModel == ColorModel.RGB) {\r\n nameFirstPart = \"Light RGB \";\r\n } else {\r\n nameFirstPart = \"Light HSV \";\r\n }\r\n\r\n return nameFirstPart;\r\n }\r\n\r\n protected override _createEasyTuneVariable(variableName: string): EasyTuneIntArray {\r\n return new EasyTuneIntArray(variableName, this._getDefaultValue(), null, true, 100, 0, 255, false, undefined, this._myEngine);\r\n }\r\n\r\n protected override _getObjectValue(object: Readonly): Readonly {\r\n let color = null;\r\n\r\n const lightColor = this._getLightColor(object);\r\n if (lightColor) {\r\n if (this._myColorModel == ColorModel.RGB) {\r\n color = ColorUtils.colorNormalizedToInt(lightColor);\r\n } else {\r\n color = ColorUtils.colorNormalizedToInt(ColorUtils.rgbToHSV(lightColor));\r\n }\r\n } else {\r\n color = this._getDefaultValue();\r\n }\r\n\r\n return color;\r\n }\r\n\r\n protected override _getDefaultValue(): Readonly {\r\n return vec3_create();\r\n }\r\n\r\n protected override _areValueEqual(first: Readonly, second: Readonly): boolean {\r\n return first.vec_equals(second);\r\n }\r\n\r\n protected override _updateObjectValue(object: Object3D, value: Readonly): void {\r\n let color = value;\r\n\r\n if (this._myColorModel == 0) {\r\n color = ColorUtils.colorIntToNormalized(color);\r\n } else {\r\n color = ColorUtils.hsvToRGB(ColorUtils.colorIntToNormalized(color));\r\n }\r\n\r\n const light = object.pp_getComponent(LightComponent);\r\n if (light != null) {\r\n light.color[0] = color[0];\r\n light.color[1] = color[1];\r\n light.color[2] = color[2];\r\n }\r\n\r\n if ((Globals.getRightGamepad(this._myEngine)!.getButtonInfo(GamepadButtonID.TOP_BUTTON).isPressStart() && Globals.getLeftGamepad(this._myEngine)!.getButtonInfo(GamepadButtonID.TOP_BUTTON).isPressed()) ||\r\n (Globals.getLeftGamepad(this._myEngine)!.getButtonInfo(GamepadButtonID.TOP_BUTTON).isPressStart() && Globals.getRightGamepad(this._myEngine)!.getButtonInfo(GamepadButtonID.TOP_BUTTON).isPressed())) {\r\n\r\n const hsvColor = ColorUtils.colorNormalizedToInt(ColorUtils.rgbToHSV(color));\r\n const rgbColor = ColorUtils.colorNormalizedToInt(color);\r\n\r\n console.log(\"RGB:\", rgbColor.vec_toString(0), \"- HSV:\", hsvColor.vec_toString(0));\r\n }\r\n }\r\n\r\n private _getLightColor(object: Readonly): Readonly | null {\r\n let color = null;\r\n\r\n const light = object.pp_getComponent(LightComponent);\r\n if (light != null) {\r\n color = light.color.slice();\r\n }\r\n\r\n return color;\r\n }\r\n}", "import { Material, MeshComponent, Object3D, WonderlandEngine } from \"@wonderlandengine/api\";\r\nimport { Vector4 } from \"../../../cauldron/type_definitions/array_type_definitions.js\";\r\nimport { ColorModel, ColorUtils } from \"../../../cauldron/utils/color_utils.js\";\r\nimport { GamepadButtonID } from \"../../../input/gamepad/gamepad_buttons.js\";\r\nimport { vec4_create } from \"../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Globals } from \"../../../pp/globals.js\";\r\nimport { EasyTuneIntArray } from \"../easy_tune_variable_types.js\";\r\nimport { EasyObjectTuner } from \"./easy_object_tuner.js\";\r\n\r\nexport enum EasyMeshColorColorType {\r\n COLOR,\r\n DIFFUSE_COLOR,\r\n AMBIENT_COLOR,\r\n SPECULAR_COLOR,\r\n EMISSIVE_COLOR,\r\n FOG_COLOR\r\n}\r\n\r\nexport class EasyMeshColor extends EasyObjectTuner {\r\n\r\n private _myColorModel: ColorModel;\r\n private _myColorType: EasyMeshColorColorType;\r\n\r\n private static readonly _myColorVariableNames: Record = {\r\n [EasyMeshColorColorType.COLOR]: \"color\",\r\n [EasyMeshColorColorType.DIFFUSE_COLOR]: \"diffuseColor\",\r\n [EasyMeshColorColorType.AMBIENT_COLOR]: \"ambientColor\",\r\n [EasyMeshColorColorType.SPECULAR_COLOR]: \"specularColor\",\r\n [EasyMeshColorColorType.EMISSIVE_COLOR]: \"emissiveColor\",\r\n [EasyMeshColorColorType.FOG_COLOR]: \"fogColor\"\r\n };\r\n\r\n constructor(colorModel: ColorModel, colorType: EasyMeshColorColorType, object: Object3D, variableName: string, setAsWidgetCurrentVariable: boolean, useTuneTarget: boolean, engine?: Readonly) {\r\n super(object, variableName, setAsWidgetCurrentVariable, useTuneTarget, engine);\r\n\r\n this._myColorModel = colorModel;\r\n this._myColorType = colorType;\r\n }\r\n\r\n protected override _getVariableNamePrefix(): string {\r\n let nameFirstPart = null;\r\n\r\n if (this._myColorModel == ColorModel.RGB) {\r\n nameFirstPart = \"Mesh RGB \";\r\n } else {\r\n nameFirstPart = \"Mesh HSV \";\r\n }\r\n\r\n return nameFirstPart;\r\n }\r\n\r\n protected override _createEasyTuneVariable(variableName: string): EasyTuneIntArray {\r\n return new EasyTuneIntArray(variableName, this._getDefaultValue(), null, true, 100, 0, 255, false, undefined, this._myEngine);\r\n }\r\n\r\n protected override _getObjectValue(object: Readonly): Readonly {\r\n let color = null;\r\n\r\n const meshMaterial: Record = this._getMeshMaterial(object) as unknown as Record;\r\n if (meshMaterial != null) {\r\n color = meshMaterial[EasyMeshColor._myColorVariableNames[this._myColorType]].pp_clone();\r\n\r\n if (this._myColorModel == ColorModel.RGB) {\r\n color = ColorUtils.colorNormalizedToInt(color);\r\n } else {\r\n color = ColorUtils.colorNormalizedToInt(ColorUtils.rgbToHSV(color));\r\n }\r\n } else {\r\n color = this._getDefaultValue();\r\n }\r\n\r\n return color;\r\n }\r\n\r\n protected override _getDefaultValue(): Readonly {\r\n return vec4_create();\r\n }\r\n\r\n protected override _areValueEqual(first: Readonly, second: Readonly): boolean {\r\n return first.vec_equals(second);\r\n }\r\n\r\n protected override _updateObjectValue(object: Object3D, value: Readonly): void {\r\n let color = value;\r\n\r\n if (this._myColorModel == 0) {\r\n color = ColorUtils.colorIntToNormalized(color);\r\n } else {\r\n color = ColorUtils.hsvToRGB(ColorUtils.colorIntToNormalized(color));\r\n }\r\n\r\n const meshMaterial: Record = this._getMeshMaterial(object) as unknown as Record;\r\n if (meshMaterial) {\r\n meshMaterial[EasyMeshColor._myColorVariableNames[this._myColorType]] = color;\r\n }\r\n\r\n if ((Globals.getRightGamepad(this._myEngine)!.getButtonInfo(GamepadButtonID.TOP_BUTTON).isPressStart() && Globals.getLeftGamepad(this._myEngine)!.getButtonInfo(GamepadButtonID.TOP_BUTTON).isPressed()) ||\r\n (Globals.getLeftGamepad(this._myEngine)!.getButtonInfo(GamepadButtonID.TOP_BUTTON).isPressStart() && Globals.getRightGamepad(this._myEngine)!.getButtonInfo(GamepadButtonID.TOP_BUTTON).isPressed())) {\r\n\r\n const hsvColor = ColorUtils.colorNormalizedToInt(ColorUtils.rgbToHSV(color));\r\n const rgbColor = ColorUtils.colorNormalizedToInt(color);\r\n\r\n console.log(\"RGB:\", rgbColor.vec_toString(0), \"- HSV:\", hsvColor.vec_toString(0));\r\n }\r\n }\r\n\r\n private _getMeshMaterial(object: Readonly): Material | null {\r\n let material = null;\r\n const mesh = object.pp_getComponent(MeshComponent);\r\n if (mesh != null) {\r\n material = mesh.material;\r\n }\r\n\r\n return material;\r\n }\r\n}", "import { Object3D, WonderlandEngine } from \"@wonderlandengine/api\";\r\nimport { Vector3 } from \"../../../cauldron/type_definitions/array_type_definitions.js\";\r\nimport { vec3_create } from \"../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { EasyTuneNumberArray } from \"../easy_tune_variable_types.js\";\r\nimport { EasyObjectTuner } from \"./easy_object_tuner.js\";\r\n\r\nexport class EasyScale extends EasyObjectTuner {\r\n\r\n private _myLocal: boolean;\r\n private _myScaleAsOne: boolean;\r\n private _myStepPerSecond: number;\r\n\r\n constructor(local: boolean, scaleAsOne: boolean, stepPerSecond: number, object: Object3D, variableName: string, setAsWidgetCurrentVariable: boolean, useTuneTarget: boolean, engine?: Readonly) {\r\n super(object, variableName, setAsWidgetCurrentVariable, useTuneTarget, engine);\r\n\r\n this._myLocal = local;\r\n this._myScaleAsOne = scaleAsOne;\r\n this._myStepPerSecond = stepPerSecond;\r\n }\r\n\r\n protected override _getVariableNamePrefix(): string {\r\n return \"Scale \";\r\n }\r\n\r\n protected override _createEasyTuneVariable(variableName: string): EasyTuneNumberArray {\r\n return new EasyTuneNumberArray(variableName, this._getDefaultValue(), null, true, 3, this._myStepPerSecond, 0.001, undefined, this._myScaleAsOne, undefined, this._myEngine);\r\n }\r\n\r\n protected override _getObjectValue(object: Readonly): Readonly {\r\n return this._myLocal ? object.pp_getScaleLocal() : object.pp_getScale();\r\n }\r\n\r\n protected override _getDefaultValue(): Readonly {\r\n return vec3_create(1, 1, 1);\r\n }\r\n\r\n protected override _areValueEqual(first: Readonly, second: Readonly): boolean {\r\n return first.vec_equals(second);\r\n }\r\n\r\n protected override _updateObjectValue(object: Object3D, value: Readonly): void {\r\n if (this._myLocal) {\r\n object.pp_setScaleLocal(value);\r\n } else {\r\n object.pp_setScale(value);\r\n }\r\n }\r\n}", "import { Object3D, WonderlandEngine } from \"@wonderlandengine/api\";\r\nimport { Matrix4 } from \"../../../cauldron/type_definitions/array_type_definitions.js\";\r\nimport { mat4_create } from \"../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { EasyTuneTransform } from \"../easy_tune_variable_types.js\";\r\nimport { EasyObjectTuner } from \"./easy_object_tuner.js\";\r\n\r\nexport class EasyTransform extends EasyObjectTuner {\r\n\r\n private _myLocal: boolean;\r\n private _myScaleAsOne: boolean;\r\n private _myPositionStepPerSecond: number;\r\n private _myRotationStepPerSecond: number;\r\n private _myScaleStepPerSecond: number;\r\n\r\n constructor(local: boolean, scaleAsOne: boolean, positionStepPerSecond: number, rotationStepPerSecond: number, scaleStepPerSecond: number, object: Object3D, variableName: string, setAsWidgetCurrentVariable: boolean, useTuneTarget: boolean, engine?: Readonly) {\r\n super(object, variableName, setAsWidgetCurrentVariable, useTuneTarget, engine);\r\n\r\n this._myLocal = local;\r\n this._myScaleAsOne = scaleAsOne;\r\n this._myPositionStepPerSecond = positionStepPerSecond;\r\n this._myRotationStepPerSecond = rotationStepPerSecond;\r\n this._myScaleStepPerSecond = scaleStepPerSecond;\r\n }\r\n\r\n protected override _getVariableNamePrefix(): string {\r\n return \"Transform \";\r\n }\r\n\r\n protected override _createEasyTuneVariable(variableName: string): EasyTuneTransform {\r\n return new EasyTuneTransform(variableName, this._getDefaultValue(), null, true, this._myScaleAsOne, 3, this._myPositionStepPerSecond, this._myRotationStepPerSecond, this._myScaleStepPerSecond, undefined, this._myEngine);\r\n }\r\n\r\n protected override _getObjectValue(object: Readonly): Readonly {\r\n return this._myLocal ? object.pp_getTransformLocal() : object.pp_getTransform();\r\n }\r\n\r\n protected override _getDefaultValue(): Readonly {\r\n return mat4_create();\r\n }\r\n\r\n protected override _areValueEqual(first: Readonly, second: Readonly): boolean {\r\n return first.vec_equals(second);\r\n }\r\n\r\n protected override _updateObjectValue(object: Object3D, value: Readonly): void {\r\n if (this._myLocal) {\r\n object.pp_setTransformLocal(value);\r\n } else {\r\n object.pp_setTransform(value);\r\n }\r\n }\r\n}", "import { Material, Object3D, TextComponent, WonderlandEngine } from \"@wonderlandengine/api\";\r\nimport { Vector4 } from \"../../../cauldron/type_definitions/array_type_definitions.js\";\r\nimport { ColorModel, ColorUtils } from \"../../../cauldron/utils/color_utils.js\";\r\nimport { GamepadButtonID } from \"../../../input/gamepad/gamepad_buttons.js\";\r\nimport { vec4_create } from \"../../../plugin/js/extensions/array/vec_create_extension.js\";\r\nimport { Globals } from \"../../../pp/globals.js\";\r\nimport { EasyTuneIntArray } from \"../easy_tune_variable_types.js\";\r\nimport { EasyObjectTuner } from \"./easy_object_tuner.js\";\r\n\r\nexport enum EasyTextColorColorType {\r\n COLOR,\r\n EFFECT_COLOR\r\n}\r\n\r\nexport class EasyTextColor extends EasyObjectTuner {\r\n\r\n private _myColorModel: ColorModel;\r\n private _myColorType: EasyTextColorColorType;\r\n\r\n private static readonly _myColorVariableNames: Record = {\r\n [EasyTextColorColorType.COLOR]: \"color\",\r\n [EasyTextColorColorType.EFFECT_COLOR]: \"effectColor\"\r\n };\r\n\r\n constructor(colorModel: ColorModel, colorType: EasyTextColorColorType, object: Object3D, variableName: string, setAsWidgetCurrentVariable: boolean, useTuneTarget: boolean, engine?: Readonly) {\r\n super(object, variableName, setAsWidgetCurrentVariable, useTuneTarget, engine);\r\n\r\n this._myColorModel = colorModel;\r\n this._myColorType = colorType;\r\n }\r\n\r\n protected override _getVariableNamePrefix(): string {\r\n let nameFirstPart = null;\r\n\r\n if (this._myColorModel == ColorModel.RGB) {\r\n nameFirstPart = \"Text RGB \";\r\n } else {\r\n nameFirstPart = \"Text HSV \";\r\n }\r\n\r\n return nameFirstPart;\r\n }\r\n\r\n protected override _createEasyTuneVariable(variableName: string): EasyTuneIntArray {\r\n return new EasyTuneIntArray(variableName, this._getDefaultValue(), null, true, 100, 0, 255, false, undefined, this._myEngine);\r\n }\r\n\r\n protected override _getObjectValue(object: Readonly): Readonly {\r\n let color = null;\r\n\r\n const textMaterial: Record = this._getMeshMaterial(object) as unknown as Record;\r\n if (textMaterial != null) {\r\n color = textMaterial[EasyTextColor._myColorVariableNames[this._myColorType]].pp_clone();\r\n\r\n if (this._myColorModel == 0) {\r\n color = ColorUtils.colorNormalizedToInt(color);\r\n } else {\r\n color = ColorUtils.colorNormalizedToInt(ColorUtils.rgbToHSV(color));\r\n }\r\n } else {\r\n color = this._getDefaultValue();\r\n }\r\n\r\n return color;\r\n }\r\n\r\n protected override _getDefaultValue(): Readonly {\r\n return vec4_create();\r\n }\r\n\r\n protected override _areValueEqual(first: Readonly, second: Readonly): boolean {\r\n return first.vec_equals(second);\r\n }\r\n\r\n protected override _updateObjectValue(object: Object3D, value: Readonly): void {\r\n let color = value;\r\n\r\n if (this._myColorModel == 0) {\r\n color = ColorUtils.colorIntToNormalized(color);\r\n } else {\r\n color = ColorUtils.hsvToRGB(ColorUtils.colorIntToNormalized(color));\r\n }\r\n\r\n const textMaterial: Record = this._getMeshMaterial(object) as unknown as Record;\r\n if (textMaterial != null) {\r\n textMaterial[EasyTextColor._myColorVariableNames[this._myColorType]] = color;\r\n }\r\n\r\n if ((Globals.getRightGamepad(this._myEngine)!.getButtonInfo(GamepadButtonID.TOP_BUTTON).isPressStart() && Globals.getLeftGamepad(this._myEngine)!.getButtonInfo(GamepadButtonID.TOP_BUTTON).isPressed()) ||\r\n (Globals.getLeftGamepad(this._myEngine)!.getButtonInfo(GamepadButtonID.TOP_BUTTON).isPressStart() && Globals.getRightGamepad(this._myEngine)!.getButtonInfo(GamepadButtonID.TOP_BUTTON).isPressed())) {\r\n\r\n const hsvColor = ColorUtils.colorNormalizedToInt(ColorUtils.rgbToHSV(color));\r\n const rgbColor = ColorUtils.colorNormalizedToInt(color);\r\n\r\n console.log(\"RGB:\", rgbColor.vec_toString(0), \"- HSV:\", hsvColor.vec_toString(0));\r\n }\r\n }\r\n\r\n private _getMeshMaterial(object: Readonly): Material | null {\r\n let material = null;\r\n const text = object.pp_getComponent(TextComponent);\r\n if (text != null) {\r\n material = text.material;\r\n }\r\n\r\n return material;\r\n }\r\n}", "import { Component, Object3D, property } from \"@wonderlandengine/api\";\r\nimport { ComponentUtils } from \"../../../../cauldron/wl/utils/component_utils.js\";\r\nimport { Globals } from \"../../../../pp/globals.js\";\r\nimport { EasyLightAttenuation } from \"../easy_light_attenuation.js\";\r\n\r\nexport class EasyLightAttenuationComponent extends Component {\r\n public static override TypeName = \"pp-easy-light-attenuation\";\r\n\r\n @property.string(\"\")\r\n private readonly _myVariableName!: string;\r\n\r\n @property.bool(false)\r\n private readonly _mySetAsWidgetCurrentVariable!: boolean;\r\n\r\n @property.bool(false)\r\n private readonly _myUseTuneTarget!: boolean;\r\n\r\n\r\n\r\n private _myEasyObjectTuner: EasyLightAttenuation | null = null;\r\n\r\n public override update(dt: number): void {\r\n if (Globals.isToolEnabled(this.engine)) {\r\n if (this._myEasyObjectTuner != null) {\r\n this._myEasyObjectTuner.update(dt);\r\n } else {\r\n this._myEasyObjectTuner = new EasyLightAttenuation(this.object, this._myVariableName, this._mySetAsWidgetCurrentVariable, this._myUseTuneTarget);\r\n this._myEasyObjectTuner.start();\r\n }\r\n }\r\n }\r\n\r\n public override onActivate(): void {\r\n if (this._myEasyObjectTuner != null) {\r\n this._myEasyObjectTuner.setActive(true);\r\n }\r\n }\r\n\r\n public override onDeactivate(): void {\r\n if (this._myEasyObjectTuner != null) {\r\n this._myEasyObjectTuner.setActive(false);\r\n }\r\n }\r\n\r\n public getEasyObjectTuner(): EasyLightAttenuation | null {\r\n return this._myEasyObjectTuner;\r\n }\r\n\r\n public pp_clone(targetObject: Object3D): EasyLightAttenuationComponent | null {\r\n const clonedComponent = ComponentUtils.cloneDefault(this, targetObject);\r\n return clonedComponent as any;\r\n }\r\n}", "import { Component, Object3D, property } from \"@wonderlandengine/api\";\r\nimport { ColorModel } from \"../../../../cauldron/utils/color_utils.js\";\r\nimport { ComponentUtils } from \"../../../../cauldron/wl/utils/component_utils.js\";\r\nimport { Globals } from \"../../../../pp/globals.js\";\r\nimport { EasyLightColor } from \"../easy_light_color.js\";\r\n\r\nexport class EasyLightColorComponent extends Component {\r\n public static override TypeName = \"pp-easy-light-color\";\r\n\r\n @property.string(\"\")\r\n private readonly _myVariableName!: string;\r\n\r\n @property.bool(false)\r\n private readonly _mySetAsWidgetCurrentVariable!: boolean;\r\n\r\n @property.bool(false)\r\n private readonly _myUseTuneTarget!: boolean;\r\n\r\n\r\n\r\n @property.enum([ColorModel[ColorModel.RGB], ColorModel[ColorModel.HSV]], ColorModel[ColorModel.HSV])\r\n private readonly _myColorModel!: number;\r\n\r\n\r\n\r\n private _myEasyObjectTuner: EasyLightColor | null = null;\r\n\r\n public override update(dt: number): void {\r\n if (Globals.isToolEnabled(this.engine)) {\r\n if (this._myEasyObjectTuner != null) {\r\n this._myEasyObjectTuner.update(dt);\r\n } else {\r\n this._myEasyObjectTuner = new EasyLightColor(this._myColorModel, this.object, this._myVariableName, this._mySetAsWidgetCurrentVariable, this._myUseTuneTarget, this.engine);\r\n this._myEasyObjectTuner.start();\r\n }\r\n }\r\n }\r\n\r\n public override onActivate(): void {\r\n if (this._myEasyObjectTuner != null) {\r\n this._myEasyObjectTuner.setActive(true);\r\n }\r\n }\r\n\r\n public override onDeactivate(): void {\r\n if (this._myEasyObjectTuner != null) {\r\n this._myEasyObjectTuner.setActive(false);\r\n }\r\n }\r\n\r\n public getEasyObjectTuner(): EasyLightColor | null {\r\n return this._myEasyObjectTuner;\r\n }\r\n\r\n public pp_clone(targetObject: Object3D): EasyLightColorComponent | null {\r\n const clonedComponent = ComponentUtils.cloneDefault(this, targetObject);\r\n return clonedComponent as any;\r\n }\r\n}", "import { Component, Object3D, property } from \"@wonderlandengine/api\";\r\nimport { ColorModel } from \"../../../../cauldron/utils/color_utils.js\";\r\nimport { ComponentUtils } from \"../../../../cauldron/wl/utils/component_utils.js\";\r\nimport { Globals } from \"../../../../pp/globals.js\";\r\nimport { EasyMeshColor } from \"../easy_mesh_color.js\";\r\n\r\nexport class EasyMeshColorComponent extends Component {\r\n public static override TypeName = \"pp-easy-mesh-color\";\r\n\r\n @property.string(\"\")\r\n private readonly _myVariableName!: string;\r\n\r\n @property.bool(false)\r\n private readonly _mySetAsWidgetCurrentVariable!: boolean;\r\n\r\n @property.bool(false)\r\n private readonly _myUseTuneTarget!: boolean;\r\n\r\n\r\n\r\n @property.enum([ColorModel[ColorModel.RGB], ColorModel[ColorModel.HSV]], ColorModel[ColorModel.HSV])\r\n private readonly _myColorModel!: number;\r\n\r\n @property.enum([\"Color\", \"Diffuse Color\", \"Ambient Color\", \"Specular Color\", \"Emissive Color\", \"Fog Color\"], \"Color\")\r\n private readonly _myColorType!: number;\r\n\r\n\r\n\r\n private _myEasyObjectTuner: EasyMeshColor | null = null;\r\n\r\n public override update(dt: number): void {\r\n if (Globals.isToolEnabled(this.engine)) {\r\n if (this._myEasyObjectTuner != null) {\r\n this._myEasyObjectTuner.update(dt);\r\n } else {\r\n this._myEasyObjectTuner = new EasyMeshColor(this._myColorModel, this._myColorType, this.object, this._myVariableName, this._mySetAsWidgetCurrentVariable, this._myUseTuneTarget, this.engine);\r\n this._myEasyObjectTuner.start();\r\n }\r\n }\r\n }\r\n\r\n public override onActivate(): void {\r\n if (this._myEasyObjectTuner != null) {\r\n this._myEasyObjectTuner.setActive(true);\r\n }\r\n }\r\n\r\n public override onDeactivate(): void {\r\n if (this._myEasyObjectTuner != null) {\r\n this._myEasyObjectTuner.setActive(false);\r\n }\r\n }\r\n\r\n public getEasyObjectTuner(): EasyMeshColor | null {\r\n return this._myEasyObjectTuner;\r\n }\r\n\r\n public pp_clone(targetObject: Object3D): EasyMeshColorComponent | null {\r\n const clonedComponent = ComponentUtils.cloneDefault(this, targetObject);\r\n return clonedComponent as any;\r\n }\r\n}", "import { Component, Object3D, property } from \"@wonderlandengine/api\";\r\nimport { ComponentUtils } from \"../../../../cauldron/wl/utils/component_utils.js\";\r\nimport { Globals } from \"../../../../pp/globals.js\";\r\nimport { EasyScale } from \"../easy_scale.js\";\r\n\r\nexport class EasyScaleComponent extends Component {\r\n public static override TypeName = \"pp-easy-scale\";\r\n\r\n @property.string(\"\")\r\n private readonly _myVariableName!: string;\r\n\r\n @property.bool(false)\r\n private readonly _mySetAsWidgetCurrentVariable!: boolean;\r\n\r\n @property.bool(false)\r\n private readonly _myUseTuneTarget!: boolean;\r\n\r\n\r\n\r\n @property.bool(true)\r\n private readonly _myLocal!: boolean;\r\n\r\n /** Edit all scale values together */\r\n @property.bool(true)\r\n private readonly _myScaleAsOne!: boolean;\r\n\r\n @property.float(1)\r\n private readonly _myStepPerSecond!: number;\r\n\r\n\r\n\r\n private _myEasyObjectTuner: EasyScale | null = null;\r\n\r\n public override update(dt: number): void {\r\n if (Globals.isToolEnabled(this.engine)) {\r\n if (this._myEasyObjectTuner != null) {\r\n this._myEasyObjectTuner.update(dt);\r\n } else {\r\n this._myEasyObjectTuner = new EasyScale(this._myLocal, this._myScaleAsOne, this._myStepPerSecond, this.object, this._myVariableName, this._mySetAsWidgetCurrentVariable, this._myUseTuneTarget);\r\n this._myEasyObjectTuner.start();\r\n }\r\n }\r\n }\r\n\r\n public override onActivate(): void {\r\n if (this._myEasyObjectTuner != null) {\r\n this._myEasyObjectTuner.setActive(true);\r\n }\r\n }\r\n\r\n public override onDeactivate(): void {\r\n if (this._myEasyObjectTuner != null) {\r\n this._myEasyObjectTuner.setActive(false);\r\n }\r\n }\r\n\r\n public getEasyObjectTuner(): EasyScale | null {\r\n return this._myEasyObjectTuner;\r\n }\r\n\r\n public pp_clone(targetObject: Object3D): EasyScaleComponent | null {\r\n const clonedComponent = ComponentUtils.cloneDefault(this, targetObject);\r\n return clonedComponent as any;\r\n }\r\n}", "import { Component, Property } from \"@wonderlandengine/api\";\r\nimport { Globals } from \"../../../../pp/globals.js\";\r\nimport { EasyTuneUtils } from \"../../easy_tune_utils.js\";\r\nimport { EasyTuneInt } from \"../../easy_tune_variable_types.js\";\r\n\r\nexport class EasySetTuneTargetChildNumberComponent extends Component {\r\n static TypeName = \"pp-easy-set-tune-target-child-number\";\r\n static Properties = {\r\n _myVariableName: Property.string(\"\"),\r\n _mySetAsWidgetCurrentVariable: Property.bool(false)\r\n };\r\n\r\n start() {\r\n if (Globals.isToolEnabled(this.engine)) {\r\n this._myEasyTuneVariableName = \"Target Child \";\r\n\r\n if (this._myVariableName == \"\") {\r\n this._myEasyTuneVariableName = this._myEasyTuneVariableName.concat(this.object.pp_getID());\r\n } else {\r\n this._myEasyTuneVariableName = this._myEasyTuneVariableName.concat(this._myVariableName);\r\n }\r\n\r\n let childrenCount = this.object.pp_getChildren().length;\r\n let min = 1;\r\n let max = childrenCount;\r\n if (childrenCount == 0) {\r\n min = 0;\r\n max = 0;\r\n }\r\n\r\n this._mySetupDone = false;\r\n\r\n this._myEasyTuneVariable = new EasyTuneInt(this._myEasyTuneVariableName, 0, null, true, 10, min, max, undefined, this.engine);\r\n Globals.getEasyTuneVariables(this.engine).add(this._myEasyTuneVariable);\r\n\r\n this._myCurrentChildIndex = -1;\r\n this._myCurrentChildrenCount = childrenCount;\r\n\r\n this._myEasyTuneTarget = null;\r\n }\r\n }\r\n\r\n update(dt) {\r\n if (Globals.isToolEnabled(this.engine)) {\r\n if (!this._mySetupDone) {\r\n if (Globals.hasEasyTuneWidget()) {\r\n if (this._mySetAsWidgetCurrentVariable) {\r\n EasyTuneUtils.setWidgetCurrentVariable(this._myEasyTuneVariableName, this.engine);\r\n }\r\n\r\n this._mySetupDone = true;\r\n }\r\n }\r\n\r\n if (Globals.getEasyTuneVariables(this.engine).isWidgetCurrentVariable(this._myEasyTuneVariable.getName())) {\r\n let childrenCount = this.object.pp_getChildren().length;\r\n if (childrenCount != this._myCurrentChildrenCount) {\r\n this._myCurrentChildrenCount = childrenCount;\r\n\r\n let min = 1;\r\n let max = childrenCount;\r\n if (childrenCount == 0) {\r\n min = 0;\r\n max = 0;\r\n }\r\n\r\n this._myEasyTuneVariable.setMin(min);\r\n this._myEasyTuneVariable.setMax(max);\r\n }\r\n\r\n let childIndex = this._myEasyTuneVariable.getValue();\r\n if (childIndex != this._myCurrentChildIndex) {\r\n if (childIndex == 0 && this._myCurrentChildIndex != -1) {\r\n if (Globals.getEasyTuneTarget(this.engine) == this._myEasyTuneTarget) {\r\n Globals.removeEasyTuneTarget(this.engine);\r\n }\r\n this._myEasyTuneTarget = null;\r\n } else if (childIndex > 0) {\r\n this._myEasyTuneTarget = this.object.pp_getChildren()[childIndex - 1];\r\n Globals.setEasyTuneTarget(this._myEasyTuneTarget, this.engine);\r\n }\r\n\r\n this._myCurrentChildIndex = childIndex;\r\n }\r\n }\r\n }\r\n }\r\n}", "import { Component } from \"@wonderlandengine/api\";\r\nimport { GrabberHandComponent } from \"../../../../gameplay/grab_throw/grabber_hand_component.js\";\r\nimport { Globals } from \"../../../../pp/globals.js\";\r\n\r\nexport class EasySetTuneTargeetGrabComponent extends Component {\r\n static TypeName = \"pp-easy-set-tune-target-grab\";\r\n\r\n start() {\r\n this._myGrabber = null;\r\n this._myEasyTuneTarget = null;\r\n }\r\n\r\n update(dt) {\r\n if (Globals.isToolEnabled(this.engine)) {\r\n if (this._myGrabber == null) {\r\n this._myGrabber = this.object.pp_getComponent(GrabberHandComponent);\r\n\r\n //this._myGrabber.registerGrabEventListener(this, this._onGrab.bind(this));\r\n this._myGrabber.registerThrowEventListener(this, this._onRelease.bind(this));\r\n }\r\n }\r\n }\r\n\r\n _onRelease(grabber, grabbable) {\r\n if (Globals.isToolEnabled(this.engine)) {\r\n this._myEasyTuneTarget = grabbable.object;\r\n Globals.setEasyTuneTarget(this._myEasyTuneTarget, this.engine);\r\n }\r\n }\r\n\r\n _onGrab(grabber, grabbable) {\r\n if (Globals.isToolEnabled(this.engine)) {\r\n if (Globals.getEasyTuneTarget(this.engine) == this._myEasyTuneTarget) {\r\n Globals.removeEasyTuneTarget(this.engine);\r\n }\r\n this._myEasyTuneTarget = null;\r\n }\r\n }\r\n\r\n onActivate() {\r\n if (this._myGrabber != null) {\r\n //this._myGrabber.registerGrabEventListener(this, this._onGrab.bind(this));\r\n this._myGrabber.registerThrowEventListener(this, this._onRelease.bind(this));\r\n }\r\n }\r\n\r\n onDeactivate() {\r\n if (this._myGrabber != null) {\r\n //this._myGrabber.unregisterGrabEventListener(this);\r\n this._myGrabber.unregisterThrowEventListener(this);\r\n }\r\n }\r\n}", "import { Component, Object3D, property } from \"@wonderlandengine/api\";\r\nimport { ColorModel } from \"../../../../cauldron/utils/color_utils.js\";\r\nimport { ComponentUtils } from \"../../../../cauldron/wl/utils/component_utils.js\";\r\nimport { Globals } from \"../../../../pp/globals.js\";\r\nimport { EasyTextColor } from \"../easy_text_color.js\";\r\n\r\nexport class EasyTextColorComponent extends Component {\r\n public static override TypeName = \"pp-easy-text-color\";\r\n\r\n @property.string(\"\")\r\n private readonly _myVariableName!: string;\r\n\r\n @property.bool(false)\r\n private readonly _mySetAsWidgetCurrentVariable!: boolean;\r\n\r\n @property.bool(false)\r\n private readonly _myUseTuneTarget!: boolean;\r\n\r\n\r\n\r\n @property.enum([ColorModel[ColorModel.RGB], ColorModel[ColorModel.HSV]], ColorModel[ColorModel.HSV])\r\n private readonly _myColorModel!: number;\r\n\r\n @property.enum([\"Color\", \"Effect Color\"], \"Color\")\r\n private readonly _myColorType!: number;\r\n\r\n\r\n\r\n private _myEasyObjectTuner: EasyTextColor | null = null;\r\n\r\n public override update(dt: number): void {\r\n if (Globals.isToolEnabled(this.engine)) {\r\n if (this._myEasyObjectTuner != null) {\r\n this._myEasyObjectTuner.update(dt);\r\n } else {\r\n this._myEasyObjectTuner = new EasyTextColor(this._myColorModel, this._myColorType, this.object, this._myVariableName, this._mySetAsWidgetCurrentVariable, this._myUseTuneTarget, this.engine);\r\n this._myEasyObjectTuner.start();\r\n }\r\n }\r\n }\r\n\r\n public override onActivate(): void {\r\n if (this._myEasyObjectTuner != null) {\r\n this._myEasyObjectTuner.setActive(true);\r\n }\r\n }\r\n\r\n public override onDeactivate(): void {\r\n if (this._myEasyObjectTuner != null) {\r\n this._myEasyObjectTuner.setActive(false);\r\n }\r\n }\r\n\r\n public getEasyObjectTuner(): EasyTextColor | null {\r\n return this._myEasyObjectTuner;\r\n }\r\n\r\n public pp_clone(targetObject: Object3D): EasyTextColorComponent | null {\r\n const clonedComponent = ComponentUtils.cloneDefault(this, targetObject);\r\n return clonedComponent as any;\r\n }\r\n}", "import { Component, Object3D, property } from \"@wonderlandengine/api\";\r\nimport { ComponentUtils } from \"../../../../cauldron/wl/utils/component_utils.js\";\r\nimport { Globals } from \"../../../../pp/globals.js\";\r\nimport { EasyTransform } from \"../easy_transform.js\";\r\n\r\nexport class EasyTransformComponent extends Component {\r\n public static override TypeName = \"pp-easy-transform\";\r\n\r\n @property.string(\"\")\r\n private readonly _myVariableName!: string;\r\n\r\n @property.bool(false)\r\n private readonly _mySetAsWidgetCurrentVariable!: boolean;\r\n\r\n @property.bool(false)\r\n private readonly _myUseTuneTarget!: boolean;\r\n\r\n\r\n\r\n @property.bool(true)\r\n private readonly _myLocal!: boolean;\r\n\r\n /** Edit all scale values together */\r\n @property.bool(true)\r\n private readonly _myScaleAsOne!: boolean;\r\n\r\n @property.float(1)\r\n private readonly _myPositionStepPerSecond!: number;\r\n\r\n @property.float(50)\r\n private readonly _myRotationStepPerSecond!: number;\r\n\r\n @property.float(1)\r\n private readonly _myScaleStepPerSecond!: number;\r\n\r\n\r\n\r\n private _myEasyObjectTuner: EasyTransform | null = null;\r\n\r\n public override update(dt: number): void {\r\n if (Globals.isToolEnabled(this.engine)) {\r\n if (this._myEasyObjectTuner != null) {\r\n this._myEasyObjectTuner.update(dt);\r\n } else {\r\n this._myEasyObjectTuner = new EasyTransform(this._myLocal, this._myScaleAsOne, this._myPositionStepPerSecond, this._myRotationStepPerSecond, this._myScaleStepPerSecond, this.object, this._myVariableName, this._mySetAsWidgetCurrentVariable, this._myUseTuneTarget, this.engine);\r\n this._myEasyObjectTuner.start();\r\n }\r\n }\r\n }\r\n\r\n public override onActivate(): void {\r\n if (this._myEasyObjectTuner != null) {\r\n this._myEasyObjectTuner.setActive(true);\r\n }\r\n }\r\n\r\n public override onDeactivate(): void {\r\n if (this._myEasyObjectTuner != null) {\r\n this._myEasyObjectTuner.setActive(false);\r\n }\r\n }\r\n\r\n public getEasyObjectTuner(): EasyTransform | null {\r\n return this._myEasyObjectTuner;\r\n }\r\n\r\n public pp_clone(targetObject: Object3D): EasyTransformComponent | null {\r\n const clonedComponent = ComponentUtils.cloneDefault(this, targetObject);\r\n return clonedComponent as any;\r\n }\r\n}"], + "mappings": "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A,oBAAAC;EACA;EACA,iBAAAC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,UAAAO;EACA;EACA;EACA,SAAAG;EACA;EACA;EACA,YAAAC;EACA;EACA;EACA,aAAAG;EACA;EACA;EACA,OAAAG;EACA;EACA;EACA,SAAAG;EACA;EACA;EACA,SAAAG;EACA;EACA;EACA,UAAAG;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,QAAAgB;EACA,eAAAC;EACA,eAAAC;EACA;EACA,YAAAC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,YAAAY;EACA,mBAAAE;EACA,mBAAAC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,cAAAI;EACA,qBAAAC;EACA,qBAAAC;EACA;EACA,kBAAAC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,kBAAAa;EACA,yBAAAC;EACA,yBAAAC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,iBAAAkB;EACA;EACA;EACA,OAAAG;EACA;EACA;EACA;EACA;EACA;EACA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", "names": ["MeshComponent", "TextComponent", "gl_mat3", "gl_quat", "gl_mat3", "gl_quat", "EasingFunctionName", "sign", "angle", "random", "randomUUID", "distance", "equals", "length", "gl_vec3", "gl_mat4", "gl_mat4", "gl_quat2", "create", "gl_quat2", "copy", "clone", "equals", "first", "length", "lerp", "interpolate", "slerp", "getRotationDegrees", "getRotationRadians", "setPosition", "setRotationDegrees", "setRotationRadians", "setRotationQuat", "setPositionRotationDegrees", "setPositionRotationRadians", "getForward", "getLeft", "getUp", "angle", "rotateAxisRadians", "toLocal", "_customGLMatrixFromQuat2", "gl_mat4", "create", "getAllocationFunction", "setAllocationFunction", "set", "gl_mat4", "copy", "clone", "equals", "first", "identity", "invert", "mul", "getPosition", "getRotation", "getRotationDegrees", "getRotationRadians", "getRotationQuat", "setPosition", "setRotation", "setRotationDegrees", "setRotationRadians", "setRotationQuat", "scale", "setScale", "setPositionRotationDegreesScale", "setPositionRotationRadiansScale", "setPositionRotation", "setPositionRotationDegrees", "setPositionRotationRadians", "setPositionRotationQuat", "getAxes", "getForward", "getBackward", "getLeft", "getRight", "getUp", "getDown", "hasUniformScale", "toWorld", "toLocal", "toQuat", "_customGLMatrixGetRotation", "create", "getAllocationFunction", "setAllocationFunction", "set", "gl_vec3", "copy", "clone", "equals", "first", "isNormalized", "normalize", "length", "lengthSquared", "mul", "scale", "lerp", "interpolate", "angle", "angleSignedRadians", "anglePivotedRadians", "anglePivotedSignedRadians", "valueAlongAxis", "valueAlongPlane", "removeComponentAlongAxis", "copyComponentAlongAxis", "signTo", "projectOnAxisAlongAxis", "projectOnPlaneAlongAxis", "perpendicularAny", "zero", "rotateDegrees", "rotateRadians", "rotateQuat", "rotateAxis", "rotateAxisDegrees", "rotateAxisRadians", "rotateAroundDegrees", "rotateAroundRadians", "rotateAroundAxisRadians", "degreesAddRotationDegrees", "degreesAddRotationRadians", "degreesAddRotationQuat", "radiansAddRotationDegrees", "radiansAddRotationRadians", "radiansAddRotationQuat", "rotationToDegrees", "rotationToRadians", "rotationToQuat", "rotationToPivotedDegrees", "rotationToPivotedRadians", "rotationToPivotedQuat", "convertPositionToLocalMatrix", "convertPositionToWorldQuat", "convertPositionToLocalQuat", "convertDirectionToWorldMatrix", "convertDirectionToLocalMatrix", "convertDirectionToWorldQuat", "convertDirectionToLocalQuat", "toRadians", "toDegrees", "toQuat", "toMatrix", "degreesToMatrix", "radiansToMatrix", "create", "getAllocationFunction", "setAllocationFunction", "set", "gl_quat", "copy", "clone", "equals", "first", "isNormalized", "normalize", "length", "lengthSquared", "identity", "mul", "invert", "conjugate", "lerp", "interpolate", "slerp", "interpolateSpherical", "angle", "getAngleRadians", "zero", "getAxis", "getAxisScaledRadians", "getAxes", "getForward", "getBackward", "getLeft", "getRight", "getUp", "getDown", "setForward", "setBackward", "setUp", "setDown", "setLeft", "setRight", "toWorld", "toLocal", "fromRadians", "fromAxes", "toDegrees", "toRadians", "toMatrix", "gl_mat3", "addRotation", "addRotationDegrees", "addRotationRadians", "addRotationQuat", "subRotationDegrees", "subRotationRadians", "subRotationQuat", "rotationTo", "rotationToDegrees", "toQuat", "rotationToRadians", "rotationToQuat", "rotationAroundAxisDegrees", "rotationAroundAxisRadians", "getTwist", "getSwing", "getTwistFromSwing", "rotate", "rotateDegrees", "rotateRadians", "rotateQuat", "rotateAxis", "rotateAxisDegrees", "rotateAxisRadians", "_setAxes", "getAllocationFunction", "setAllocationFunction", "set", "gl_mat3", "copy", "clone", "equals", "first", "toDegrees", "create", "toRadians", "toQuat", "gl_quat", "fromAxes", "getPosition", "getRotation", "getRotationDegrees", "getRotationRadians", "getRotationQuat", "getRotationWorldRadians", "getRotationWorldMatrix", "getRotationLocalRadians", "getRotationLocalMatrix", "getScale", "transformQuat", "scale", "getTransformWorldMatrix", "getTransformLocalMatrix", "getAxes", "getForward", "getForwardWorld", "getForwardLocal", "getBackward", "getBackwardWorld", "getBackwardLocal", "getUp", "getUpWorld", "getUpLocal", "getDown", "getDownWorld", "getDownLocal", "getLeft", "getLeftWorld", "getLeftLocal", "getRight", "getRightWorld", "getRightLocal", "setPosition", "setRotation", "setRotationDegrees", "setRotationRadians", "setRotationQuat", "setRotationWorldDegrees", "setRotationWorldRadians", "setRotationWorldMatrix", "setRotationLocalDegrees", "setRotationLocalRadians", "setRotationLocalMatrix", "setScale", "setScaleWorld", "setScaleLocal", "setAxes", "setForward", "setForwardWorld", "setForwardLocal", "setBackward", "setBackwardWorld", "setBackwardLocal", "setUp", "setUpWorld", "setUpLocal", "setDown", "setDownWorld", "setDownLocal", "setLeft", "setLeftWorld", "setLeftLocal", "setRight", "setRightWorld", "setRightLocal", "setTransformWorldMatrix", "setTransformLocalMatrix", "zero", "resetPositionWorld", "resetPositionLocal", "identity", "resetRotationWorld", "resetRotationLocal", "resetScaleWorld", "resetScaleLocal", "translateAxisWorld", "translateAxisLocal", "translateAxisObject", "rotate", "rotateDegrees", "rotateRadians", "rotateQuat", "rotateWorldDegrees", "rotateWorldRadians", "rotateWorldMatrix", "rotateWorldQuat", "rotateLocalDegrees", "rotateLocalRadians", "rotateLocalMatrix", "rotateLocalQuat", "rotateObjectDegrees", "rotateObjectRadians", "rotateObjectMatrix", "rotateAxis", "angle", "rotateAxisDegrees", "rotateAxisRadians", "rotateAxisWorldRadians", "rotateAxisLocalRadians", "rotateAxisObjectRadians", "rotateAround", "rotateAroundDegrees", "rotateAroundRadians", "rotateAroundQuat", "rotateAroundWorldDegrees", "rotateAroundWorldRadians", "rotateAroundWorldMatrix", "rotateAroundWorldQuat", "rotateAroundLocalDegrees", "rotateAroundLocalRadians", "rotateAroundLocalMatrix", "rotateAroundLocalQuat", "rotateAroundObjectDegrees", "rotateAroundObjectRadians", "rotateAroundObjectMatrix", "rotateAroundObjectQuat", "rotateAroundAxis", "rotateAroundAxisDegrees", "rotateAroundAxisRadians", "rotateAroundAxisWorldRadians", "rotateAroundAxisLocalRadians", "rotateAroundAxisObjectRadians", "scaleObject", "lookAtWorld", "lookAtLocal", "lookToWorld", "lookToLocal", "convertPositionObjectToWorld", "convertDirectionObjectToWorld", "convertPositionWorldToObject", "convertDirectionWorldToObject", "convertTransformObjectToWorldMatrix", "convertTransformObjectToWorldQuat", "convertTransformWorldToObjectMatrix", "convertTransformWorldToObjectQuat", "setParent", "hasUniformScale", "hasUniformScaleWorld", "hasUniformScaleLocal", "clone", "toStringExtended", "toStringCompact", "gl_vec2", "create", "getAllocationFunction", "setAllocationFunction", "set", "gl_vec2", "copy", "clone", "equals", "first", "length", "normalize", "zero", "isZero", "lerp", "interpolate", "gl_vec4", "create", "getAllocationFunction", "setAllocationFunction", "set", "gl_vec4", "copy", "clone", "equals", "first", "lerp", "interpolate", "create", "length", "getAllocationFunction", "setAllocationFunction", "set", "copy", "clone", "equals", "zero", "isZero", "scale", "clamp", "lerp", "interpolate", "toString", "log", "error", "warn", "create", "error", "clone", "invert", "makeDoubleSided", "MeshComponent", "TextComponent", "isCloneable", "clone", "error", "_importExportVariablesReplaceFileURLParams", "EasyTuneVariableType", "first", "Component", "Property", "Component", "Howler", "Howler", "Component", "Component", "Property", "error", "isMobile", "isLocalhost", "error", "Component", "Property", "Component", "property", "Component", "__decorate", "property", "Component", "Property", "Emitter", "has", "remove", "clear", "error", "Emitter", "Emitter", "Emitter", "error", "Component", "Property", "Component", "Component", "Component", "clone", "first", "equals", "MeshComponent", "clone", "VisualElementDefaultType", "MeshComponent", "MeshComponent", "MeshComponent", "_copyHook", "MeshComponent", "MeshComponent", "MeshComponent", "MeshComponent", "_copyHook", "PhysXComponent", "first", "raycast", "PhysXComponent", "RaycastBlockColliderType", "length", "first", "_copyHook", "TextComponent", "TextComponent", "_copyHook", "_copyHook", "scale", "_copyHook", "visualElements", "Component", "Component", "Property", "Component", "Property", "Component", "Property", "Component", "Property", "Handedness", "HandednessIndex", "InputSourceType", "TrackedHandJointID", "TrackedHandJointIDIndex", "Component", "Property", "Component", "Alignment", "VerticalAlignment", "Alignment", "VerticalAlignment", "length", "scale", "Component", "Component", "Property", "Component", "Property", "Component", "copy", "reset", "distance", "transformQuat", "transformQuat", "distance", "computeSurfacePerceivedAngle", "distance", "first", "first", "first", "firstHeightPosition", "angleNormalWithMovementThreshold", "zero", "distance", "transformQuat", "angleSigned", "transformQuat", "zero", "transformQuat", "checkMovement", "checkTeleportToTransform", "checkTransform", "updateGroundInfo", "updateCeilingInfo", "convertCollisionRuntimeParamsToCharacterCollisionResults", "convertCharacterColliderSetupToCollisionCheckParams", "Component", "Component", "Property", "Emitter", "GamepadButtonID", "GamepadButtonEvent", "GamepadAxesID", "GamepadAxesEvent", "Emitter", "info", "emitter", "error", "Emitter", "Emitter", "Emitter", "error", "getPosition", "getRotationDegrees", "getRotationRadians", "getRotationQuat", "transformQuat", "getTransformMatrix", "getTransformQuat", "getRotationQuat", "ViewComponent", "ViewComponent", "Emitter", "Component", "Property", "Component", "Property", "Component", "Property", "Component", "Property", "log", "error", "warn", "clear", "Component", "Property", "Component", "Property", "Component", "Property", "ARCamera8thwall", "Cursor", "CursorTarget", "DebugObject", "DeviceOrientationLook", "FingerCursor", "FixedFoveation", "HandTracking", "HitTestLocation", "HowlerAudioListener", "HowlerAudioSource", "ImageTexture", "MouseLookComponent", "PlayerHeight", "TargetFramerate", "TeleportComponent", "Trail", "TwoJointIkSolver", "VideoTexture", "VrModeActiveSwitch", "Vrm", "WasdControlsComponent", "error", "property", "isClass", "scale", "angle", "angle", "angle", "angle", "Object3D", "scale", "angle", "Object3D", "Emitter", "listener", "Emitter", "InputComponent", "ViewComponent", "Cursor", "CursorTarget", "HitTestLocation", "CursorTarget", "InputComponent", "ViewComponent", "HitTestLocation", "session", "Cursor", "Emitter", "CursorTarget", "Emitter", "CursorTarget", "MouseLookComponent", "MouseLookComponent", "Component", "Property", "Component", "Property", "Component", "Property", "Howler", "Component", "Howler", "Component", "Howler", "Component", "Howler", "Component", "PhysXComponent", "Property", "Emitter", "PhysXComponent", "Emitter", "indexesToRemove", "PhysXComponent", "Component", "Property", "distance", "scale", "PhysXComponent", "Alignment", "Component", "MeshComponent", "Property", "TextComponent", "VerticalAlignment", "Component", "Property", "MeshComponent", "TextComponent", "Alignment", "VerticalAlignment", "reset", "Component", "PhysXComponent", "Property", "scale", "Component", "property", "Component", "__decorate", "property", "Component", "Property", "Component", "Property", "Component", "property", "__decorate", "Component", "property", "_ButtonBehaviorWhenNotAvailable", "Component", "__decorate", "property", "Emitter", "PerformMode", "PerformDelayedMode", "SkipStateFunction", "stateData", "clone", "args", "ColorModel", "error", "MeshComponent", "TextComponent", "setAlpha", "MeshComponent", "TextComponent", "TextComponent", "Component", "Property", "Component", "Property", "Alignment", "Component", "Property", "VerticalAlignment", "Component", "Property", "Alignment", "VerticalAlignment", "Component", "property", "Component", "__decorate", "property", "isClass", "isFunction", "error", "first", "isObject", "property", "isClass", "isFunction", "first", "error", "Component", "Property", "Component", "Property", "Component", "Property", "Component", "Property", "Component", "Property", "Component", "Property", "Component", "Property", "Component", "Property", "Component", "Property", "Component", "Property", "AnimationComponent", "CollisionComponent", "Component", "InputComponent", "LightComponent", "MeshComponent", "PhysXComponent", "Property", "TextComponent", "ViewComponent", "Component", "Property", "AnimationComponent", "CollisionComponent", "InputComponent", "LightComponent", "MeshComponent", "PhysXComponent", "TextComponent", "ViewComponent", "fromValue", "toValue", "Component", "MeshComponent", "property", "TextComponent", "CursorTarget", "CursorButtonState", "Component", "CursorTarget", "MeshComponent", "TextComponent", "__decorate", "property", "Component", "Property", "Component", "Property", "Component", "Emitter", "PhysXComponent", "Property", "Component", "Property", "Emitter", "PhysXComponent", "Component", "Emitter", "PhysXComponent", "Property", "Component", "Property", "Emitter", "PhysXComponent", "first", "error", "result", "Component", "Property", "TextComponent", "Component", "Property", "TextComponent", "copy", "computeSurfacePerceivedAngle", "CharacterColliderSetupSimplifiedCreationAccuracyLevel", "NonVRReferenceSpaceMode", "angle", "PlayerTransformManagerSyncFlag", "transformQuat", "resetPosition", "resetRotation", "distance", "transformUp", "collisionRuntimeParams", "Emitter", "PhysXComponent", "distance", "PhysXComponent", "distance", "getPosition", "first", "hit", "PhysXComponent", "distance", "MeshComponent", "MeshComponent", "distance", "angle", "PlayerLocomotionDirectionReferenceType", "PlayerLocomotionType", "Emitter", "params", "first", "PhysXComponent", "collisionRuntimeParams", "Component", "property", "Component", "__decorate", "property", "CollisionComponent", "Component", "PhysXComponent", "property", "CursorTarget", "Component", "first", "PhysXComponent", "CollisionComponent", "CursorTarget", "__decorate", "property", "CollisionComponent", "Component", "PhysXComponent", "property", "Shape", "Cursor", "Component", "PhysXComponent", "Shape", "CollisionComponent", "Cursor", "transformQuat", "error", "__decorate", "property", "Component", "Property", "Component", "Property", "Component", "MeshComponent", "Property", "Component", "Property", "MeshComponent", "transformQuat", "Component", "Property", "Component", "Property", "Component", "Property", "Component", "Property", "transformQuat", "Component", "Property", "Component", "Property", "Alignment", "Component", "MeshComponent", "Property", "TextComponent", "VerticalAlignment", "Component", "Property", "length", "MeshComponent", "TextComponent", "Alignment", "VerticalAlignment", "scale", "angle", "Component", "Property", "Component", "Property", "Component", "Property", "Component", "Property", "Component", "Property", "Component", "Property", "Component", "Property", "Component", "Property", "Component", "Component", "Component", "Property", "Component", "Property", "Component", "Property", "Component", "Property", "Component", "Component", "Component", "Component", "Component", "Component", "Component", "MeshComponent", "Property", "ViewComponent", "Cursor", "CursorTarget", "Component", "Property", "MeshComponent", "Cursor", "ViewComponent", "CursorTarget", "transformQuat", "Alignment", "Collider", "VerticalAlignment", "Collider", "Alignment", "VerticalAlignment", "CollisionComponent", "MeshComponent", "TextComponent", "CursorTarget", "MeshComponent", "TextComponent", "CursorTarget", "CollisionComponent", "Emitter", "Alignment", "Collider", "VerticalAlignment", "Collider", "Alignment", "VerticalAlignment", "CollisionComponent", "MeshComponent", "TextComponent", "CursorTarget", "MeshComponent", "TextComponent", "CursorTarget", "CollisionComponent", "Emitter", "error", "Component", "Property", "Component", "Property", "Component", "property", "Emitter", "Emitter", "Emitter", "Emitter", "Alignment", "Collider", "VerticalAlignment", "Collider", "Alignment", "VerticalAlignment", "CollisionComponent", "MeshComponent", "TextComponent", "CursorTarget", "CollisionComponent", "MeshComponent", "TextComponent", "CursorTarget", "MeshComponent", "TextComponent", "CursorTarget", "CollisionComponent", "TextComponent", "CursorTarget", "CollisionComponent", "MeshComponent", "TextComponent", "TextComponent", "CollisionComponent", "MeshComponent", "TextComponent", "CursorTarget", "TextComponent", "CursorTarget", "CollisionComponent", "MeshComponent", "CollisionComponent", "MeshComponent", "TextComponent", "CursorTarget", "TextComponent", "CursorTarget", "CollisionComponent", "MeshComponent", "length", "Component", "error", "__decorate", "property", "Component", "Property", "Component", "Property", "LightComponent", "LightComponent", "first", "LightComponent", "first", "LightComponent", "MeshComponent", "EasyMeshColorColorType", "first", "MeshComponent", "first", "first", "TextComponent", "EasyTextColorColorType", "first", "TextComponent", "Component", "property", "Component", "__decorate", "property", "Component", "property", "Component", "__decorate", "property", "Component", "property", "Component", "__decorate", "property", "Component", "property", "Component", "__decorate", "property", "Component", "Property", "Component", "Property", "Component", "Component", "Component", "property", "Component", "__decorate", "property", "Component", "property", "Component", "__decorate", "property"] } diff --git a/wle_pp/wle_pp_bundle/package-lock.json b/wle_pp/wle_pp_bundle/package-lock.json index 425eb70..9f0e7bc 100644 --- a/wle_pp/wle_pp_bundle/package-lock.json +++ b/wle_pp/wle_pp_bundle/package-lock.json @@ -1,12 +1,12 @@ { "name": "wle-pp-bundle", - "version": "0.7.2", + "version": "0.7.3", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "wle-pp-bundle", - "version": "0.7.2", + "version": "0.7.3", "license": "ISC", "peerDependencies": { "@wonderlandengine/api": "~1.2.4", diff --git a/wle_pp/wle_pp_bundle/package.json b/wle_pp/wle_pp_bundle/package.json index 3062fd0..6a2db66 100644 --- a/wle_pp/wle_pp_bundle/package.json +++ b/wle_pp/wle_pp_bundle/package.json @@ -1,6 +1,6 @@ { "name": "wle-pp-bundle", - "version": "0.7.2", + "version": "0.7.3", "author": "Pipo", "description": "A library for the Wonderland Engine - Bundled Version", "homepage": "https://github.com/signorpipo/wle-pp",