@mml-io/3d-web-client-core 0.26.1 → 0.27.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/camera/CameraManager.d.ts +2 -0
- package/build/camera/CameraManager.d.ts.map +1 -1
- package/build/character/CharacterManager.d.ts +10 -11
- package/build/character/CharacterManager.d.ts.map +1 -1
- package/build/character/CharacterState.d.ts +1 -2
- package/build/character/CharacterState.d.ts.map +1 -1
- package/build/character/LocalController.d.ts +33 -6
- package/build/character/LocalController.d.ts.map +1 -1
- package/build/character/RemoteController.d.ts.map +1 -1
- package/build/collisions/CollisionsManager.d.ts +10 -0
- package/build/collisions/CollisionsManager.d.ts.map +1 -1
- package/build/index.d.ts +2 -1
- package/build/index.d.ts.map +1 -1
- package/build/index.js +220 -49
- package/build/index.js.map +2 -2
- package/build/input/VirtualJoystick.d.ts.map +1 -1
- package/build/math/Box.d.ts +1 -0
- package/build/math/Box.d.ts.map +1 -1
- package/build/rendering/IRenderer.d.ts +1 -1
- package/build/rendering/IRenderer.d.ts.map +1 -1
- package/package.json +17 -5
package/build/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/math/Quat.ts", "../src/math/Vect3.ts", "../src/math/Matr4.ts", "../src/math/EulXYZ.ts", "../src/math/Ray.ts", "../src/math/Line.ts", "../src/math/Box.ts", "../src/math/radToDeg.ts", "../src/helpers/math-helpers.ts", "../src/input/EventHandlerCollection.ts", "../src/tweakpane/tweakPaneActivity.ts", "../src/camera/CameraManager.ts", "../src/character/CharacterManager.ts", "../src/character/CharacterState.ts", "../src/character/AnimationMixer.ts", "../src/character/url-position.ts", "../src/character/Spawning.ts", "../src/character/LocalController.ts", "../src/character/RemoteController.ts", "../src/input/KeyInputManager.ts", "../src/input/VirtualJoystick.ts", "../src/collisions/CollisionsManager.ts", "../src/collisions/getRelativePositionAndRotationRelativeToObject.ts", "../src/loading-screen/LoadingScreen.ts", "../src/error-screen/ErrorScreen.ts", "../src/tweakpane/TweakPane.ts", "../src/tweakpane/blades/cameraFolder.ts", "../src/tweakpane/blades/characterControlsFolder.ts", "../src/tweakpane/tweakPaneStyle.ts"],
|
|
4
|
-
"sourcesContent": ["// Largely based on https://github.com/mrdoob/three.js/blob/master/src/math/Quaternion.js\nimport { clamp } from \"../helpers/math-helpers\";\n\nimport { Matr4 } from \"./Matr4\";\n\nexport type IQuat = { x: number; y: number; z: number; w: number };\n\nexport class Quat {\n public x: number;\n public y: number;\n public z: number;\n public w: number;\n\n constructor(x: number = 0, y: number = 0, z: number = 0, w: number = 1) {\n this.x = x;\n this.y = y;\n this.z = z;\n this.w = w;\n }\n\n copy(other: { x?: number; y?: number; z?: number; w?: number }): this {\n this.x = other.x || 0;\n this.y = other.y || 0;\n this.z = other.z || 0;\n this.w = other.w || 0;\n return this;\n }\n\n multiply(q: { x: number; y: number; z: number; w: number }): this {\n return this.multiplyQuaternions(this, q);\n }\n\n premultiply(q: { x: number; y: number; z: number; w: number }): this {\n return this.multiplyQuaternions(q, this);\n }\n\n multiplyQuaternions(\n a: { x: number; y: number; z: number; w: number },\n b: { x: number; y: number; z: number; w: number },\n ): this {\n const qax = a.x;\n const qay = a.y;\n const qaz = a.z;\n const qaw = a.w;\n const qbx = b.x;\n const qby = b.y;\n const qbz = b.z;\n const qbw = b.w;\n\n this.x = qax * qbw + qaw * qbx + qay * qbz - qaz * qby;\n this.y = qay * qbw + qaw * qby + qaz * qbx - qax * qbz;\n this.z = qaz * qbw + qaw * qbz + qax * qby - qay * qbx;\n this.w = qaw * qbw - qax * qbx - qay * qby - qaz * qbz;\n\n return this;\n }\n\n setFromEulerXYZ(euler: { x: number; y: number; z: number }): this {\n const x = euler.x;\n const y = euler.y;\n const z = euler.z;\n\n const cos = Math.cos;\n const sin = Math.sin;\n\n const c1 = cos(x / 2);\n const c2 = cos(y / 2);\n const c3 = cos(z / 2);\n\n const s1 = sin(x / 2);\n const s2 = sin(y / 2);\n const s3 = sin(z / 2);\n\n this.x = s1 * c2 * c3 + c1 * s2 * s3;\n this.y = c1 * s2 * c3 - s1 * c2 * s3;\n this.z = c1 * c2 * s3 + s1 * s2 * c3;\n this.w = c1 * c2 * c3 - s1 * s2 * s3;\n\n return this;\n }\n\n setFromRotationMatrix(m: Matr4): this {\n // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n const te = m.data,\n m11 = te[0],\n m12 = te[4],\n m13 = te[8],\n m21 = te[1],\n m22 = te[5],\n m23 = te[9],\n m31 = te[2],\n m32 = te[6],\n m33 = te[10],\n trace = m11 + m22 + m33;\n\n if (trace > 0) {\n const s = 0.5 / Math.sqrt(trace + 1.0);\n\n this.w = 0.25 / s;\n this.x = (m32 - m23) * s;\n this.y = (m13 - m31) * s;\n this.z = (m21 - m12) * s;\n } else if (m11 > m22 && m11 > m33) {\n const s = 2.0 * Math.sqrt(1.0 + m11 - m22 - m33);\n\n this.w = (m32 - m23) / s;\n this.x = 0.25 * s;\n this.y = (m12 + m21) / s;\n this.z = (m13 + m31) / s;\n } else if (m22 > m33) {\n const s = 2.0 * Math.sqrt(1.0 + m22 - m11 - m33);\n\n this.w = (m13 - m31) / s;\n this.x = (m12 + m21) / s;\n this.y = 0.25 * s;\n this.z = (m23 + m32) / s;\n } else {\n const s = 2.0 * Math.sqrt(1.0 + m33 - m11 - m22);\n\n this.w = (m21 - m12) / s;\n this.x = (m13 + m31) / s;\n this.y = (m23 + m32) / s;\n this.z = 0.25 * s;\n }\n\n return this;\n }\n\n setFromAxisAngle(axis: { x: number; y: number; z: number }, angle: number): this {\n // assumes axis is normalized\n\n const halfAngle = angle / 2;\n const s = Math.sin(halfAngle);\n\n this.x = axis.x * s;\n this.y = axis.y * s;\n this.z = axis.z * s;\n this.w = Math.cos(halfAngle);\n\n return this;\n }\n\n clone(): Quat {\n return new Quat(this.x, this.y, this.z, this.w);\n }\n\n set(x: number, y: number, z: number, w: number): this {\n this.x = x;\n this.y = y;\n this.z = z;\n this.w = w;\n return this;\n }\n\n invert() {\n this.x *= -1;\n this.y *= -1;\n this.z *= -1;\n return this;\n }\n\n dot(other: Quat): number {\n return this.x * other.x + this.y * other.y + this.z * other.z + this.w * other.w;\n }\n\n rotateTowards(other: Quat, scalar: number): this {\n const angle = this.angleTo(other);\n\n if (angle === 0) {\n return this;\n }\n\n const t = Math.min(1, scalar / angle);\n\n this.slerp(other, t);\n\n return this;\n }\n\n angleTo(q: Quat): number {\n return 2 * Math.acos(Math.abs(clamp(this.dot(q), -1, 1)));\n }\n\n slerp(qb: Quat, t: number): this {\n if (t <= 0) return this;\n if (t >= 1) return this.copy(qb);\n\n const x1 = this.x,\n y1 = this.y,\n z1 = this.z,\n w1 = this.w;\n let x2 = qb.x,\n y2 = qb.y,\n z2 = qb.z,\n w2 = qb.w;\n\n let cosHalfTheta = w1 * w2 + x1 * x2 + y1 * y2 + z1 * z2;\n\n if (cosHalfTheta < 0) {\n w2 = -w2;\n x2 = -x2;\n y2 = -y2;\n z2 = -z2;\n cosHalfTheta = -cosHalfTheta;\n }\n\n if (cosHalfTheta >= 1.0) {\n return this.set(x1, y1, z1, w1);\n }\n\n const sinHalfTheta = Math.sqrt(1.0 - cosHalfTheta * cosHalfTheta);\n\n if (sinHalfTheta < 0.001) {\n this.w = 0.5 * (w1 + w2);\n this.x = 0.5 * (x1 + x2);\n this.y = 0.5 * (y1 + y2);\n this.z = 0.5 * (z1 + z2);\n return this.normalize();\n }\n\n const halfTheta = Math.acos(cosHalfTheta);\n const ratioA = Math.sin((1 - t) * halfTheta) / sinHalfTheta;\n const ratioB = Math.sin(t * halfTheta) / sinHalfTheta;\n\n this.w = w1 * ratioA + w2 * ratioB;\n this.x = x1 * ratioA + x2 * ratioB;\n this.y = y1 * ratioA + y2 * ratioB;\n this.z = z1 * ratioA + z2 * ratioB;\n\n return this.normalize();\n }\n\n length(): number {\n return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w);\n }\n\n normalize(): this {\n let l = this.length();\n\n if (l === 0) {\n this.x = 0;\n this.y = 0;\n this.z = 0;\n this.w = 1;\n } else {\n l = 1 / l;\n this.x = this.x * l;\n this.y = this.y * l;\n this.z = this.z * l;\n this.w = this.w * l;\n }\n\n return this;\n }\n}\n", "import { EulXYZ } from \"./EulXYZ\";\nimport { Matr4, Matr4Data } from \"./Matr4\";\nimport { IQuat, Quat } from \"./Quat\";\n\nexport type IVect3 = { x: number; y: number; z: number };\n\nconst tempQuaternion = new Quat();\n\nexport class Vect3 {\n constructor(\n public x: number = 0,\n public y: number = 0,\n public z: number = 0,\n ) {}\n\n copy(other: IVect3): this {\n this.x = other.x;\n this.y = other.y;\n this.z = other.z;\n return this;\n }\n\n length(): number {\n return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z);\n }\n\n lengthSquared(): number {\n return this.x * this.x + this.y * this.y + this.z * this.z;\n }\n\n clone(): Vect3 {\n return new Vect3(this.x, this.y, this.z);\n }\n\n set(x: number, y: number, z: number): this {\n this.x = x;\n this.y = y;\n this.z = z;\n return this;\n }\n\n applyEulerXYZ(euler: EulXYZ) {\n return this.applyQuat(tempQuaternion.setFromEulerXYZ(euler));\n }\n\n applyMatrix4(matrix: { data: Matr4Data }): this {\n const x = this.x;\n const y = this.y;\n const z = this.z;\n const e = matrix.data;\n\n const w = 1 / (e[3] * x + e[7] * y + e[11] * z + e[15]);\n\n this.x = (e[0] * x + e[4] * y + e[8] * z + e[12]) * w;\n this.y = (e[1] * x + e[5] * y + e[9] * z + e[13]) * w;\n this.z = (e[2] * x + e[6] * y + e[10] * z + e[14]) * w;\n\n return this;\n }\n\n transformDirection(matrix: Matr4) {\n const x = this.x;\n const y = this.y;\n const z = this.z;\n const e = matrix.data;\n\n this.x = e[0] * x + e[4] * y + e[8] * z;\n this.y = e[1] * x + e[5] * y + e[9] * z;\n this.z = e[2] * x + e[6] * y + e[10] * z;\n\n return this.normalize();\n }\n\n add(other: IVect3) {\n this.x += other.x;\n this.y += other.y;\n this.z += other.z;\n return this;\n }\n\n sub(other: IVect3) {\n this.x -= other.x;\n this.y -= other.y;\n this.z -= other.z;\n return this;\n }\n\n applyQuat(q: IQuat): this {\n const vx = this.x,\n vy = this.y,\n vz = this.z;\n\n const qx = q.x,\n qy = q.y,\n qz = q.z,\n qw = q.w;\n\n const tx = 2 * (qy * vz - qz * vy);\n const ty = 2 * (qz * vx - qx * vz);\n const tz = 2 * (qx * vy - qy * vx);\n\n this.x = vx + qw * tx + qy * tz - qz * ty;\n this.y = vy + qw * ty + qz * tx - qx * tz;\n this.z = vz + qw * tz + qx * ty - qy * tx;\n\n return this;\n }\n\n multiplyScalar(scalar: number) {\n this.x *= scalar;\n this.y *= scalar;\n this.z *= scalar;\n return this;\n }\n\n normalize() {\n return this.multiplyScalar(1 / (this.length() || 1));\n }\n\n addScaledVector(other: Vect3, scalar: number) {\n this.x += other.x * scalar;\n this.y += other.y * scalar;\n this.z += other.z * scalar;\n return this;\n }\n\n distanceTo(other: Vect3): number {\n return Math.sqrt(this.distanceToSquared(other));\n }\n\n distanceToSquared(other: Vect3): number {\n const dx = other.x - this.x;\n const dy = other.y - this.y;\n const dz = other.z - this.z;\n return dx * dx + dy * dy + dz * dz;\n }\n\n applyAxisAngle(axis: IVect3, angle: number) {\n return this.applyQuat(tempQuaternion.setFromAxisAngle(axis, angle));\n }\n\n min(point: IVect3): this {\n this.x = Math.min(this.x, point.x);\n this.y = Math.min(this.y, point.y);\n this.z = Math.min(this.z, point.z);\n return this;\n }\n\n max(point: IVect3): this {\n this.x = Math.max(this.x, point.x);\n this.y = Math.max(this.y, point.y);\n this.z = Math.max(this.z, point.z);\n return this;\n }\n\n subVectors(a: IVect3, b: IVect3): this {\n this.x = a.x - b.x;\n this.y = a.y - b.y;\n this.z = a.z - b.z;\n return this;\n }\n\n dot(v: IVect3): number {\n return this.x * v.x + this.y * v.y + this.z * v.z;\n }\n\n cross(other: Vect3): this {\n return this.crossVectors(this, other);\n }\n\n crossVectors(a: Vect3, b: Vect3) {\n const ax = a.x;\n const ay = a.y;\n const az = a.z;\n const bx = b.x;\n const by = b.y;\n const bz = b.z;\n\n this.x = ay * bz - az * by;\n this.y = az * bx - ax * bz;\n this.z = ax * by - ay * bx;\n\n return this;\n }\n\n subScalar(s: number): this {\n this.x -= s;\n this.y -= s;\n this.z -= s;\n return this;\n }\n\n addScalar(s: number): this {\n this.x += s;\n this.y += s;\n this.z += s;\n return this;\n }\n\n multiply(other: IVect3): this {\n this.x *= other.x;\n this.y *= other.y;\n this.z *= other.z;\n return this;\n }\n\n lerp(target: IVect3, alpha: number): Vect3 {\n this.x += (target.x - this.x) * alpha;\n this.y += (target.y - this.y) * alpha;\n this.z += (target.z - this.z) * alpha;\n return this;\n }\n\n lerpVectors(v1: IVect3, v2: IVect3, alpha: number): Vect3 {\n this.x = v1.x + (v2.x - v1.x) * alpha;\n this.y = v1.y + (v2.y - v1.y) * alpha;\n this.z = v1.z + (v2.z - v1.z) * alpha;\n return this;\n }\n\n toArray(): number[] {\n return [this.x, this.y, this.z];\n }\n}\n", "// Largely based on https://github.com/mrdoob/three.js/blob/master/src/math/Matrix4.js\nimport { Quat } from \"./Quat\";\nimport { IVect3, Vect3 } from \"./Vect3\";\n\nconst Vect3Zeroes = { x: 0, y: 0, z: 0 };\nconst Vect3Ones = { x: 1, y: 1, z: 1 };\n\nexport type Matr4Data = [\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n];\n\nexport class Matr4 {\n static tempMatr4 = new Matr4();\n static tempVect3 = new Vect3();\n static tempQuat = new Quat();\n\n public data: Matr4Data = [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1];\n\n constructor();\n constructor(\n n11: number,\n n12: number,\n n13: number,\n n14: number,\n n21: number,\n n22: number,\n n23: number,\n n24: number,\n n31: number,\n n32: number,\n n33: number,\n n34: number,\n n41: number,\n n42: number,\n n43: number,\n n44: number,\n );\n constructor(\n ...args:\n | []\n | [\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n ]\n ) {\n if (args.length > 0) {\n this.set(\n ...(args as [\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n ]),\n );\n }\n }\n\n identity(): this {\n this.data = [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1];\n return this;\n }\n\n copy(m: Matr4): Matr4 {\n const te = this.data;\n const me = m.data;\n\n te[0] = me[0];\n te[1] = me[1];\n te[2] = me[2];\n te[3] = me[3];\n te[4] = me[4];\n te[5] = me[5];\n te[6] = me[6];\n te[7] = me[7];\n te[8] = me[8];\n te[9] = me[9];\n te[10] = me[10];\n te[11] = me[11];\n te[12] = me[12];\n te[13] = me[13];\n te[14] = me[14];\n te[15] = me[15];\n\n return this;\n }\n\n fromArray(\n data:\n | [\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n ]\n | Float32Array,\n ): this {\n this.data[0] = data[0];\n this.data[1] = data[1];\n this.data[2] = data[2];\n this.data[3] = data[3];\n this.data[4] = data[4];\n this.data[5] = data[5];\n this.data[6] = data[6];\n this.data[7] = data[7];\n this.data[8] = data[8];\n this.data[9] = data[9];\n this.data[10] = data[10];\n this.data[11] = data[11];\n this.data[12] = data[12];\n this.data[13] = data[13];\n this.data[14] = data[14];\n this.data[15] = data[15];\n return this;\n }\n\n set(\n n11: number,\n n12: number,\n n13: number,\n n14: number,\n n21: number,\n n22: number,\n n23: number,\n n24: number,\n n31: number,\n n32: number,\n n33: number,\n n34: number,\n n41: number,\n n42: number,\n n43: number,\n n44: number,\n ): this {\n const te = this.data;\n\n te[0] = n11;\n te[4] = n12;\n te[8] = n13;\n te[12] = n14;\n te[1] = n21;\n te[5] = n22;\n te[9] = n23;\n te[13] = n24;\n te[2] = n31;\n te[6] = n32;\n te[10] = n33;\n te[14] = n34;\n te[3] = n41;\n te[7] = n42;\n te[11] = n43;\n te[15] = n44;\n\n return this;\n }\n\n public setRotationFromQuaternion(q: { x: number; y: number; z: number; w: number }): this {\n return this.compose(Vect3Zeroes, q, Vect3Ones);\n }\n\n clone(): Matr4 {\n return new Matr4().copy(this);\n }\n\n determinant(): number {\n const te = this.data;\n\n const n11 = te[0],\n n12 = te[4],\n n13 = te[8],\n n14 = te[12];\n const n21 = te[1],\n n22 = te[5],\n n23 = te[9],\n n24 = te[13];\n const n31 = te[2],\n n32 = te[6],\n n33 = te[10],\n n34 = te[14];\n const n41 = te[3],\n n42 = te[7],\n n43 = te[11],\n n44 = te[15];\n\n return (\n n41 *\n (+n14 * n23 * n32 -\n n13 * n24 * n32 -\n n14 * n22 * n33 +\n n12 * n24 * n33 +\n n13 * n22 * n34 -\n n12 * n23 * n34) +\n n42 *\n (+n11 * n23 * n34 -\n n11 * n24 * n33 +\n n14 * n21 * n33 -\n n13 * n21 * n34 +\n n13 * n24 * n31 -\n n14 * n23 * n31) +\n n43 *\n (+n11 * n24 * n32 -\n n11 * n22 * n34 -\n n14 * n21 * n32 +\n n12 * n21 * n34 +\n n14 * n22 * n31 -\n n12 * n24 * n31) +\n n44 *\n (-n13 * n22 * n31 -\n n11 * n23 * n32 +\n n11 * n22 * n33 +\n n13 * n21 * n32 -\n n12 * n21 * n33 +\n n12 * n23 * n31)\n );\n }\n\n makeRotationX(theta: number) {\n const c = Math.cos(theta),\n s = Math.sin(theta);\n\n this.set(1, 0, 0, 0, 0, c, -s, 0, 0, s, c, 0, 0, 0, 0, 1);\n\n return this;\n }\n\n makeRotationY(theta: number) {\n const c = Math.cos(theta),\n s = Math.sin(theta);\n\n this.set(c, 0, s, 0, 0, 1, 0, 0, -s, 0, c, 0, 0, 0, 0, 1);\n\n return this;\n }\n\n makeRotationZ(theta: number) {\n const c = Math.cos(theta),\n s = Math.sin(theta);\n\n this.set(c, -s, 0, 0, s, c, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n return this;\n }\n\n makeTranslation(x: number, y: number, z: number) {\n this.set(1, 0, 0, x, 0, 1, 0, y, 0, 0, 1, z, 0, 0, 0, 1);\n return this;\n }\n\n makeScale(x: number, y: number, z: number) {\n this.set(x, 0, 0, 0, 0, y, 0, 0, 0, 0, z, 0, 0, 0, 0, 1);\n return this;\n }\n\n compose(\n position: { x: number; y: number; z: number },\n quaternion: { x: number; y: number; z: number; w: number },\n scale: { x: number; y: number; z: number },\n ): this {\n const te = this.data;\n\n const x = quaternion.x,\n y = quaternion.y,\n z = quaternion.z,\n w = quaternion.w;\n const x2 = x + x,\n y2 = y + y,\n z2 = z + z;\n const xx = x * x2,\n xy = x * y2,\n xz = x * z2;\n const yy = y * y2,\n yz = y * z2,\n zz = z * z2;\n const wx = w * x2,\n wy = w * y2,\n wz = w * z2;\n\n const sx = scale.x,\n sy = scale.y,\n sz = scale.z;\n\n te[0] = (1 - (yy + zz)) * sx;\n te[1] = (xy + wz) * sx;\n te[2] = (xz - wy) * sx;\n te[3] = 0;\n\n te[4] = (xy - wz) * sy;\n te[5] = (1 - (xx + zz)) * sy;\n te[6] = (yz + wx) * sy;\n te[7] = 0;\n\n te[8] = (xz + wy) * sz;\n te[9] = (yz - wx) * sz;\n te[10] = (1 - (xx + yy)) * sz;\n te[11] = 0;\n\n te[12] = position.x;\n te[13] = position.y;\n te[14] = position.z;\n te[15] = 1;\n\n return this;\n }\n\n decompose(\n position: { x: number; y: number; z: number },\n quaternion: { x: number; y: number; z: number; w: number },\n scale: { x: number; y: number; z: number },\n ): this {\n const te = this.data;\n\n const _v1 = Matr4.tempVect3;\n let sx = _v1.set(te[0], te[1], te[2]).length();\n const sy = _v1.set(te[4], te[5], te[6]).length();\n const sz = _v1.set(te[8], te[9], te[10]).length();\n\n // if determine is negative, we need to invert one scale\n const det = this.determinant();\n if (det < 0) sx = -sx;\n\n position.x = te[12];\n position.y = te[13];\n position.z = te[14];\n\n // scale the rotation part\n const _m1 = Matr4.tempMatr4;\n _m1.copy(this);\n\n const invSX = 1 / sx;\n const invSY = 1 / sy;\n const invSZ = 1 / sz;\n\n _m1.data[0] *= invSX;\n _m1.data[1] *= invSX;\n _m1.data[2] *= invSX;\n\n _m1.data[4] *= invSY;\n _m1.data[5] *= invSY;\n _m1.data[6] *= invSY;\n\n _m1.data[8] *= invSZ;\n _m1.data[9] *= invSZ;\n _m1.data[10] *= invSZ;\n\n const _q1 = Matr4.tempQuat;\n _q1.setFromRotationMatrix(_m1);\n\n quaternion.x = _q1.x;\n quaternion.y = _q1.y;\n quaternion.z = _q1.z;\n quaternion.w = _q1.w;\n\n scale.x = sx;\n scale.y = sy;\n scale.z = sz;\n\n return this;\n }\n\n getScale(vect3: IVect3): IVect3 {\n const te = this.data;\n\n const _v1 = Matr4.tempVect3;\n let sx = _v1.set(te[0], te[1], te[2]).length();\n const sy = _v1.set(te[4], te[5], te[6]).length();\n const sz = _v1.set(te[8], te[9], te[10]).length();\n\n // if determine is negative, we need to invert one scale\n const det = this.determinant();\n if (det < 0) sx = -sx;\n\n vect3.x = sx;\n vect3.y = sy;\n vect3.z = sz;\n return vect3;\n }\n\n multiply(m: Matr4): this {\n return this.multiplyMatrices(this, m);\n }\n\n premultiply(m: Matr4): this {\n return this.multiplyMatrices(m, this);\n }\n\n multiplyMatrices(a: Matr4, b: Matr4): this {\n const ae = a.data;\n const be = b.data;\n const te = this.data;\n\n const a11 = ae[0],\n a12 = ae[4],\n a13 = ae[8],\n a14 = ae[12];\n const a21 = ae[1],\n a22 = ae[5],\n a23 = ae[9],\n a24 = ae[13];\n const a31 = ae[2],\n a32 = ae[6],\n a33 = ae[10],\n a34 = ae[14];\n const a41 = ae[3],\n a42 = ae[7],\n a43 = ae[11],\n a44 = ae[15];\n\n const b11 = be[0],\n b12 = be[4],\n b13 = be[8],\n b14 = be[12];\n const b21 = be[1],\n b22 = be[5],\n b23 = be[9],\n b24 = be[13];\n const b31 = be[2],\n b32 = be[6],\n b33 = be[10],\n b34 = be[14];\n const b41 = be[3],\n b42 = be[7],\n b43 = be[11],\n b44 = be[15];\n\n te[0] = a11 * b11 + a12 * b21 + a13 * b31 + a14 * b41;\n te[4] = a11 * b12 + a12 * b22 + a13 * b32 + a14 * b42;\n te[8] = a11 * b13 + a12 * b23 + a13 * b33 + a14 * b43;\n te[12] = a11 * b14 + a12 * b24 + a13 * b34 + a14 * b44;\n\n te[1] = a21 * b11 + a22 * b21 + a23 * b31 + a24 * b41;\n te[5] = a21 * b12 + a22 * b22 + a23 * b32 + a24 * b42;\n te[9] = a21 * b13 + a22 * b23 + a23 * b33 + a24 * b43;\n te[13] = a21 * b14 + a22 * b24 + a23 * b34 + a24 * b44;\n\n te[2] = a31 * b11 + a32 * b21 + a33 * b31 + a34 * b41;\n te[6] = a31 * b12 + a32 * b22 + a33 * b32 + a34 * b42;\n te[10] = a31 * b13 + a32 * b23 + a33 * b33 + a34 * b43;\n te[14] = a31 * b14 + a32 * b24 + a33 * b34 + a34 * b44;\n\n te[3] = a41 * b11 + a42 * b21 + a43 * b31 + a44 * b41;\n te[7] = a41 * b12 + a42 * b22 + a43 * b32 + a44 * b42;\n te[11] = a41 * b13 + a42 * b23 + a43 * b33 + a44 * b43;\n te[15] = a41 * b14 + a42 * b24 + a43 * b34 + a44 * b44;\n\n return this;\n }\n\n invert(): this {\n // based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm\n const te = this.data,\n n11 = te[0],\n n21 = te[1],\n n31 = te[2],\n n41 = te[3],\n n12 = te[4],\n n22 = te[5],\n n32 = te[6],\n n42 = te[7],\n n13 = te[8],\n n23 = te[9],\n n33 = te[10],\n n43 = te[11],\n n14 = te[12],\n n24 = te[13],\n n34 = te[14],\n n44 = te[15],\n t11 =\n n23 * n34 * n42 -\n n24 * n33 * n42 +\n n24 * n32 * n43 -\n n22 * n34 * n43 -\n n23 * n32 * n44 +\n n22 * n33 * n44,\n t12 =\n n14 * n33 * n42 -\n n13 * n34 * n42 -\n n14 * n32 * n43 +\n n12 * n34 * n43 +\n n13 * n32 * n44 -\n n12 * n33 * n44,\n t13 =\n n13 * n24 * n42 -\n n14 * n23 * n42 +\n n14 * n22 * n43 -\n n12 * n24 * n43 -\n n13 * n22 * n44 +\n n12 * n23 * n44,\n t14 =\n n14 * n23 * n32 -\n n13 * n24 * n32 -\n n14 * n22 * n33 +\n n12 * n24 * n33 +\n n13 * n22 * n34 -\n n12 * n23 * n34;\n\n const det = n11 * t11 + n21 * t12 + n31 * t13 + n41 * t14;\n\n if (det === 0) {\n return this.set(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);\n }\n\n const detInv = 1 / det;\n\n te[0] = t11 * detInv;\n te[1] =\n (n24 * n33 * n41 -\n n23 * n34 * n41 -\n n24 * n31 * n43 +\n n21 * n34 * n43 +\n n23 * n31 * n44 -\n n21 * n33 * n44) *\n detInv;\n te[2] =\n (n22 * n34 * n41 -\n n24 * n32 * n41 +\n n24 * n31 * n42 -\n n21 * n34 * n42 -\n n22 * n31 * n44 +\n n21 * n32 * n44) *\n detInv;\n te[3] =\n (n23 * n32 * n41 -\n n22 * n33 * n41 -\n n23 * n31 * n42 +\n n21 * n33 * n42 +\n n22 * n31 * n43 -\n n21 * n32 * n43) *\n detInv;\n\n te[4] = t12 * detInv;\n te[5] =\n (n13 * n34 * n41 -\n n14 * n33 * n41 +\n n14 * n31 * n43 -\n n11 * n34 * n43 -\n n13 * n31 * n44 +\n n11 * n33 * n44) *\n detInv;\n te[6] =\n (n14 * n32 * n41 -\n n12 * n34 * n41 -\n n14 * n31 * n42 +\n n11 * n34 * n42 +\n n12 * n31 * n44 -\n n11 * n32 * n44) *\n detInv;\n te[7] =\n (n12 * n33 * n41 -\n n13 * n32 * n41 +\n n13 * n31 * n42 -\n n11 * n33 * n42 -\n n12 * n31 * n43 +\n n11 * n32 * n43) *\n detInv;\n\n te[8] = t13 * detInv;\n te[9] =\n (n14 * n23 * n41 -\n n13 * n24 * n41 -\n n14 * n21 * n43 +\n n11 * n24 * n43 +\n n13 * n21 * n44 -\n n11 * n23 * n44) *\n detInv;\n te[10] =\n (n12 * n24 * n41 -\n n14 * n22 * n41 +\n n14 * n21 * n42 -\n n11 * n24 * n42 -\n n12 * n21 * n44 +\n n11 * n22 * n44) *\n detInv;\n te[11] =\n (n13 * n22 * n41 -\n n12 * n23 * n41 -\n n13 * n21 * n42 +\n n11 * n23 * n42 +\n n12 * n21 * n43 -\n n11 * n22 * n43) *\n detInv;\n\n te[12] = t14 * detInv;\n te[13] =\n (n13 * n24 * n31 -\n n14 * n23 * n31 +\n n14 * n21 * n33 -\n n11 * n24 * n33 -\n n13 * n21 * n34 +\n n11 * n23 * n34) *\n detInv;\n te[14] =\n (n14 * n22 * n31 -\n n12 * n24 * n31 -\n n14 * n21 * n32 +\n n11 * n24 * n32 +\n n12 * n21 * n34 -\n n11 * n22 * n34) *\n detInv;\n te[15] =\n (n12 * n23 * n31 -\n n13 * n22 * n31 +\n n13 * n21 * n32 -\n n11 * n23 * n32 -\n n12 * n21 * n33 +\n n11 * n22 * n33) *\n detInv;\n\n return this;\n }\n\n equals(other: Matr4) {\n for (let i = 0; i < 16; i++) {\n if (this.data[i] !== other.data[i]) {\n return false;\n }\n }\n return true;\n }\n\n setPosition(x: number, y: number, z: number): this {\n this.data[12] = x;\n this.data[13] = y;\n this.data[14] = z;\n return this;\n }\n}\n", "// Largely based on https://github.com/mrdoob/three.js/blob/master/src/math/Euler.js\nimport { clamp } from \"../helpers/math-helpers\";\n\nimport { Matr4 } from \"./Matr4\";\n\nexport type IEulXYZ = { x: number; y: number; z: number };\n\nexport class EulXYZ {\n private static tempMatrix = new Matr4();\n public x: number;\n public y: number;\n public z: number;\n\n constructor(x: number = 0, y: number = 0, z: number = 0) {\n this.x = x;\n this.y = y;\n this.z = z;\n }\n\n setFromRotationMatrix(m: Matr4): this {\n const d = m.data;\n const m11 = d[0];\n const m12 = d[4];\n const m13 = d[8];\n const m22 = d[5];\n const m23 = d[9];\n const m32 = d[6];\n const m33 = d[10];\n\n this.y = Math.asin(clamp(m13, -1, 1));\n\n if (Math.abs(m13) < 0.9999999) {\n this.x = Math.atan2(-m23, m33);\n this.z = Math.atan2(-m12, m11);\n } else {\n this.x = Math.atan2(m32, m22);\n this.z = 0;\n }\n\n return this;\n }\n\n setFromQuaternion(q: { x: number; y: number; z: number; w: number }): this {\n const matrix = EulXYZ.tempMatrix;\n matrix.setRotationFromQuaternion(q);\n return this.setFromRotationMatrix(matrix);\n }\n\n copy(other: { x?: number; y?: number; z?: number }): this {\n this.x = other.x || 0;\n this.y = other.y || 0;\n this.z = other.z || 0;\n return this;\n }\n\n length(): number {\n return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z);\n }\n\n lengthSquared(): number {\n return this.x * this.x + this.y * this.y + this.z * this.z;\n }\n\n clone(): EulXYZ {\n return new EulXYZ(this.x, this.y, this.z);\n }\n\n set(x: number, y: number, z: number): this {\n this.x = x;\n this.y = y;\n this.z = z;\n return this;\n }\n}\n", "// Largely from https://github.com/mrdoob/three.js/blob/dev/src/math/Ray.js\n\nimport { Matr4 } from \"./Matr4\";\nimport { IVect3, Vect3 } from \"./Vect3\";\n\nconst _edge1 = new Vect3();\nconst _edge2 = new Vect3();\nconst _normal = new Vect3();\nconst _diff = new Vect3();\n\nexport class Ray {\n public origin = new Vect3();\n public direction = new Vect3();\n\n constructor(origin?: IVect3, direction?: IVect3) {\n if (origin) {\n this.origin.copy(origin);\n }\n if (direction) {\n this.direction.copy(direction);\n }\n }\n\n setOrigin(origin: IVect3): this {\n this.origin.copy(origin);\n return this;\n }\n\n setDirection(direction: IVect3): this {\n this.direction.copy(direction);\n return this;\n }\n\n clone(): Ray {\n return new Ray(this.origin, this.direction);\n }\n\n set(origin: IVect3, direction: IVect3): this {\n this.origin.copy(origin);\n this.direction.copy(direction);\n return this;\n }\n\n copy(ray: Ray): this {\n this.origin.copy(ray.origin);\n this.direction.copy(ray.direction);\n return this;\n }\n\n applyMatrix4(matr4: Matr4): this {\n this.origin.applyMatrix4(matr4);\n this.direction.transformDirection(matr4);\n return this;\n }\n\n intersectTriangle(a: Vect3, b: Vect3, c: Vect3, backfaceCulling: boolean, target: Vect3) {\n _edge1.subVectors(b, a);\n _edge2.subVectors(c, a);\n _normal.crossVectors(_edge1, _edge2);\n\n let DdN = this.direction.dot(_normal);\n let sign;\n\n if (DdN > 0) {\n if (backfaceCulling) return null;\n sign = 1;\n } else if (DdN < 0) {\n sign = -1;\n DdN = -DdN;\n } else {\n return null;\n }\n\n _diff.subVectors(this.origin, a);\n const DdQxE2 = sign * this.direction.dot(_edge2.crossVectors(_diff, _edge2));\n\n // b1 < 0, no intersection\n if (DdQxE2 < 0) {\n return null;\n }\n\n const DdE1xQ = sign * this.direction.dot(_edge1.cross(_diff));\n\n // b2 < 0, no intersection\n if (DdE1xQ < 0) {\n return null;\n }\n\n // b1+b2 > 1, no intersection\n if (DdQxE2 + DdE1xQ > DdN) {\n return null;\n }\n\n // Line intersects triangle, check if ray does.\n const QdN = -sign * _diff.dot(_normal);\n\n // t < 0, no intersection\n if (QdN < 0) {\n return null;\n }\n\n // Ray intersects triangle.\n return this.at(QdN / DdN, target);\n }\n\n public at(t: number, target: Vect3): Vect3 {\n return target.copy(this.origin).addScaledVector(this.direction, t);\n }\n}\n", "import { clamp } from \"../helpers/math-helpers\";\n\nimport { Matr4 } from \"./Matr4\";\nimport { IVect3, Vect3 } from \"./Vect3\";\n\nconst _startP = new Vect3();\nconst _startEnd = new Vect3();\n\nexport class Line {\n public start = new Vect3();\n public end = new Vect3();\n\n constructor(start?: IVect3, end?: IVect3) {\n if (start) {\n this.start.copy(start);\n }\n if (end) {\n this.end.copy(end);\n }\n }\n\n setStart(start: IVect3): this {\n this.start.copy(start);\n return this;\n }\n\n setEnd(end: IVect3): this {\n this.end.copy(end);\n return this;\n }\n\n length(): number {\n const dx = this.end.x - this.start.x;\n const dy = this.end.y - this.start.y;\n const dz = this.end.z - this.start.z;\n return Math.sqrt(dx * dx + dy * dy + dz * dz);\n }\n\n lengthSquared(): number {\n const dx = this.end.x - this.start.x;\n const dy = this.end.y - this.start.y;\n const dz = this.end.z - this.start.z;\n return dx * dx + dy * dy + dz * dz;\n }\n\n clone(): Line {\n return new Line(this.start, this.end);\n }\n\n copy(other: Line): this {\n this.start.copy(other.start);\n this.end.copy(other.end);\n return this;\n }\n\n applyMatrix4(matr4: Matr4): this {\n this.start.applyMatrix4(matr4);\n this.end.applyMatrix4(matr4);\n return this;\n }\n\n distance(): number {\n const dx = this.end.x - this.start.x;\n const dy = this.end.y - this.start.y;\n const dz = this.end.z - this.start.z;\n return Math.sqrt(dx * dx + dy * dy + dz * dz);\n }\n\n at(t: number, target: Vect3): Vect3 {\n target.x = this.start.x + t * (this.end.x - this.start.x);\n target.y = this.start.y + t * (this.end.y - this.start.y);\n target.z = this.start.z + t * (this.end.z - this.start.z);\n return target;\n }\n\n closestPointToPointParameter(point: Vect3, clampToLine: boolean) {\n _startP.subVectors(point, this.start);\n _startEnd.subVectors(this.end, this.start);\n\n const startEnd2 = _startEnd.dot(_startEnd);\n const startEnd_startP = _startEnd.dot(_startP);\n\n let t = startEnd_startP / startEnd2;\n\n if (clampToLine) {\n t = clamp(t, 0, 1);\n }\n\n return t;\n }\n\n closestPointToPoint(point: Vect3, clampToLine: boolean, target: Vect3): Vect3 {\n const t = this.closestPointToPointParameter(point, clampToLine);\n\n return this.delta(target).multiplyScalar(t).add(this.start);\n }\n\n delta(target: Vect3): Vect3 {\n return target.subVectors(this.end, this.start);\n }\n}\n", "import { Matr4 } from \"./Matr4\";\nimport { IVect3, Vect3 } from \"./Vect3\";\n\nconst tempPoints = [\n new Vect3(),\n new Vect3(),\n new Vect3(),\n new Vect3(),\n new Vect3(),\n new Vect3(),\n new Vect3(),\n new Vect3(),\n];\n\nexport class Box {\n public min = new Vect3();\n public max = new Vect3();\n\n constructor(min?: IVect3, max?: IVect3) {\n if (min) {\n this.min.copy(min);\n }\n if (max) {\n this.max.copy(max);\n }\n }\n\n setStart(min: IVect3): this {\n this.min.copy(min);\n return this;\n }\n\n setEnd(max: IVect3): this {\n this.max.copy(max);\n return this;\n }\n\n length(): number {\n const dx = this.max.x - this.min.x;\n const dy = this.max.y - this.min.y;\n const dz = this.max.z - this.min.z;\n return Math.sqrt(dx * dx + dy * dy + dz * dz);\n }\n\n clone(): Box {\n return new Box(this.min, this.max);\n }\n\n copy(other: Box): this {\n this.min.copy(other.min);\n this.max.copy(other.max);\n return this;\n }\n\n expandByPoint(point: Vect3): this {\n this.min.min(point);\n this.max.max(point);\n return this;\n }\n\n makeEmpty(): this {\n this.min.set(Infinity, Infinity, Infinity);\n this.max.set(-Infinity, -Infinity, -Infinity);\n return this;\n }\n\n isEmpty() {\n return this.max.x < this.min.x || this.max.y < this.min.y || this.max.z < this.min.z;\n }\n\n applyMatrix4(matr4: Matr4) {\n if (this.isEmpty()) {\n return this;\n }\n\n tempPoints[0].set(this.min.x, this.min.y, this.min.z).applyMatrix4(matr4);\n tempPoints[1].set(this.min.x, this.min.y, this.max.z).applyMatrix4(matr4);\n tempPoints[2].set(this.min.x, this.max.y, this.min.z).applyMatrix4(matr4);\n tempPoints[3].set(this.min.x, this.max.y, this.max.z).applyMatrix4(matr4);\n tempPoints[4].set(this.max.x, this.min.y, this.min.z).applyMatrix4(matr4);\n tempPoints[5].set(this.max.x, this.min.y, this.max.z).applyMatrix4(matr4);\n tempPoints[6].set(this.max.x, this.max.y, this.min.z).applyMatrix4(matr4);\n tempPoints[7].set(this.max.x, this.max.y, this.max.z).applyMatrix4(matr4);\n\n this.makeEmpty();\n\n for (const p of tempPoints) {\n this.expandByPoint(p);\n }\n\n return this;\n }\n}\n", "export function radToDeg(rad: number): number {\n return rad * (180 / Math.PI);\n}\n\nexport function degToRad(deg: number): number {\n return deg * (Math.PI / 180);\n}\n", "import { IQuat, IVect3, Quat, Vect3 } from \"../math\";\n\nexport const roundToDecimalPlaces = (value: number, decimalPlaces: number): number => {\n const mult = 10 ** decimalPlaces;\n return Math.round(value * mult) / mult;\n};\n\nexport const toArray = (origin: IVect3 | IQuat, precision: number = 3): number[] => {\n const array = [];\n array[0] = roundToDecimalPlaces(origin.x, precision);\n array[1] = roundToDecimalPlaces(origin.y, precision);\n array[2] = roundToDecimalPlaces(origin.z, precision);\n if ((origin as Quat).w !== undefined) {\n array[3] = roundToDecimalPlaces((origin as Quat).w, precision);\n }\n return array;\n};\n\nexport const getSpawnPositionInsideCircle = (\n radius: number,\n positions: number,\n id: number,\n yPos: number = 0,\n): Vect3 => {\n if (id > 0) id += 3;\n const goldenAngle = Math.PI * (3 - Math.sqrt(5));\n const theta = id * goldenAngle;\n const scale = id / positions;\n const scaledRadius = scale * radius;\n const x = Math.cos(theta) * scaledRadius;\n const z = Math.sin(theta) * scaledRadius;\n return new Vect3(x, yPos, z);\n};\n\nexport const round = (n: number, digits: number): number => {\n return Number(n.toFixed(digits));\n};\n\nexport const ease = (target: number, n: number, factor: number): number => {\n return round((target - n) * factor, 5);\n};\n\nexport function clamp(value: number, min: number, max: number): number {\n return Math.min(Math.max(value, min), max);\n}\n\nexport const remap = (\n value: number,\n minValue: number,\n maxValue: number,\n minScaledValue: number,\n maxScaledValue: number,\n): number => {\n return (\n minScaledValue +\n ((maxScaledValue - minScaledValue) * (value - minValue)) / (maxValue - minValue)\n );\n};\n", "type ListenerFunc = (...args: any[]) => void;\n\ntype EventSpecificationTuple = [EventTarget, string, ListenerFunc, AddEventListenerOptions?];\n\nexport class EventHandlerCollection {\n private eventsByTarget: Map<EventTarget, Map<string, Set<ListenerFunc>>> = new Map();\n\n public add(\n target: EventTarget,\n key: string,\n listener: ListenerFunc,\n options?: AddEventListenerOptions,\n ): this {\n target.addEventListener(key, listener, options);\n\n let existingTarget = this.eventsByTarget.get(target);\n if (existingTarget === undefined) {\n existingTarget = new Map();\n this.eventsByTarget.set(target, existingTarget);\n }\n let existingKey = existingTarget.get(key);\n if (existingKey === undefined) {\n existingKey = new Set();\n existingTarget.set(key, existingKey);\n }\n existingKey.add(listener);\n\n return this;\n }\n\n public clear() {\n this.eventsByTarget.forEach((keyMap, target) => {\n keyMap.forEach((listenerSet, key) => {\n listenerSet.forEach((listenerFunc) => {\n target.removeEventListener(key, listenerFunc);\n });\n });\n });\n this.eventsByTarget.clear();\n }\n\n static create(initial?: Array<EventSpecificationTuple>): EventHandlerCollection {\n const instance = new EventHandlerCollection();\n if (initial !== undefined) {\n initial.forEach(([target, key, listenerFunc, options]) => {\n instance.add(target, key, listenerFunc, options);\n });\n }\n return instance;\n }\n}\n", "let isTweakpaneActive = false;\n\nexport function setTweakpaneActive(status: boolean) {\n isTweakpaneActive = status;\n}\n\nexport function getTweakpaneActive() {\n return isTweakpaneActive;\n}\n", "import { CollisionsManager } from \"../collisions/CollisionsManager\";\nimport { remap } from \"../helpers/math-helpers\";\nimport { EventHandlerCollection } from \"../input/EventHandlerCollection\";\nimport { Matr4, Quat, Ray, Vect3 } from \"../math\";\nimport { getTweakpaneActive } from \"../tweakpane/tweakPaneActivity\";\n\nexport type CameraState = {\n position: Vect3;\n rotation: Quat;\n fov: number;\n aspect: number;\n};\n\nconst cameraPanSensitivity = 20;\nconst scrollZoomSensitivity = 0.1;\nconst pinchZoomSensitivity = 0.025;\n\nexport class CameraManager {\n private isMainCameraActive: boolean = true;\n\n public initialDistance = 3.3;\n public minDistance = 0.1;\n public maxDistance = 5;\n public damping = 0.21;\n public zoomScale = 0.04;\n public zoomDamping = 0.04;\n\n public initialFOV = 60;\n public maxFOV = 70;\n public minFOV = 60;\n public invertFOVMapping = false;\n\n public fov: number = this.initialFOV;\n private targetFOV: number = this.initialFOV;\n\n public minPolarAngle: number = Math.PI * 0.05;\n private maxPolarAngle: number = Math.PI * 0.95;\n\n public distance: number = this.initialDistance;\n public targetDistance: number = this.initialDistance;\n public desiredDistance: number = this.initialDistance;\n\n private phi: number;\n private targetPhi: number;\n private theta: number;\n private targetTheta: number;\n\n private target: Vect3 = new Vect3(0, 1.55, 0);\n private hadTarget: boolean = false;\n\n private cameraRay: Ray = new Ray();\n private tempVec3: Vect3 = new Vect3();\n\n private eventHandlerCollection: EventHandlerCollection;\n\n private finalTarget: Vect3 = new Vect3();\n private isLerping: boolean = false;\n private lerpTarget: Vect3 = new Vect3();\n private lerpFactor: number = 0;\n private lerpDuration: number = 2.1;\n\n private tempMatr4: Matr4 = new Matr4();\n\n private activePointers = new Map<number, { x: number; y: number }>();\n\n private cameraState: CameraState;\n private flyCameraState: CameraState;\n private aspect: number;\n\n // Fly camera orbit controls state\n private flyCameraLookAt: Vect3 = new Vect3(0, 0, 0);\n private flyCameraYaw: number = 0;\n private flyCameraPitch: number = Math.PI * 0.4;\n private flyCameraDistance: number = 15.0;\n private flyCameraMouseDown: boolean = false;\n private flyCameraIsPanning: boolean = false;\n private flyCameraLastMouseX: number = 0;\n private flyCameraLastMouseY: number = 0;\n private flyCameraEventHandlerCollection: EventHandlerCollection | null = null;\n\n // Orbit controls settings\n private orbitControlsRotateSensitivity: number = 0.002;\n private orbitControlsPanSensitivity: number = 0.01;\n private orbitControlsZoomSensitivity: number = 0.1;\n // Polar angle constraints: 0 = camera above lookAt (looking down), \u03C0 = camera below lookAt (looking up)\n // Constrain to prevent going over the top (pitch < 0) but allow pointing above horizon (pitch > \u03C0/2)\n private orbitControlsMinPolarAngle: number = 0.001; // Just above 0 to prevent going over the top\n private orbitControlsMaxPolarAngle: number = Math.PI - 0.001; // Just below \u03C0 to allow looking up\n\n // Temporary vectors for panning calculations\n private tempPanRight: Vect3 = new Vect3();\n private tempPanUp: Vect3 = new Vect3();\n private tempPanForward: Vect3 = new Vect3();\n\n constructor(\n private targetElement: HTMLElement,\n private collisionsManager: CollisionsManager,\n initialPhi = Math.PI / 2,\n initialTheta = -Math.PI / 2,\n ) {\n this.targetElement.style.touchAction = \"pinch-zoom\";\n this.phi = initialPhi;\n this.targetPhi = this.phi;\n this.theta = initialTheta;\n this.targetTheta = this.theta;\n\n this.aspect = window.innerWidth / window.innerHeight;\n\n const initialPosition = new Vect3(0, 1.4, -this.initialDistance);\n const initialRotation = new Quat();\n\n this.cameraState = {\n position: initialPosition,\n rotation: initialRotation,\n fov: this.fov,\n aspect: this.aspect,\n };\n\n this.flyCameraState = {\n position: new Vect3().copy(initialPosition),\n rotation: new Quat().copy(initialRotation),\n fov: this.initialFOV,\n aspect: this.aspect,\n };\n\n this.createEventHandlers();\n }\n\n private createEventHandlers(): void {\n this.eventHandlerCollection = EventHandlerCollection.create([\n [this.targetElement, \"pointerdown\", this.onPointerDown.bind(this)],\n [this.targetElement, \"gesturestart\", this.preventDefaultAndStopPropagation.bind(this)],\n [this.targetElement, \"wheel\", this.onMouseWheel.bind(this)],\n [this.targetElement, \"contextmenu\", this.onContextMenu.bind(this)],\n [document, \"pointerup\", this.onPointerUp.bind(this)],\n [document, \"pointercancel\", this.onPointerUp.bind(this)],\n [document, \"pointermove\", this.onPointerMove.bind(this)],\n ]);\n }\n\n private disposeEventHandlers(): void {\n this.eventHandlerCollection.clear();\n }\n\n private createFlyCameraEventHandlers(): void {\n this.flyCameraEventHandlerCollection = EventHandlerCollection.create([\n [window, \"blur\", this.onFlyCameraBlur.bind(this)],\n [this.targetElement, \"mousedown\", this.onFlyCameraMouseDown.bind(this)],\n [document, \"mousemove\", this.onFlyCameraMouseMove.bind(this)],\n [document, \"mouseup\", this.onFlyCameraMouseUp.bind(this)],\n [this.targetElement, \"wheel\", this.onFlyCameraWheel.bind(this)],\n [this.targetElement, \"contextmenu\", this.onContextMenu.bind(this)],\n ]);\n }\n\n private disposeFlyCameraEventHandlers(): void {\n if (this.flyCameraEventHandlerCollection) {\n this.flyCameraEventHandlerCollection.clear();\n this.flyCameraEventHandlerCollection = null;\n }\n }\n\n private onFlyCameraBlur(): void {\n this.flyCameraMouseDown = false;\n this.flyCameraIsPanning = false;\n }\n\n private onFlyCameraMouseDown(event: MouseEvent): void {\n if (event.button === 0) {\n // Left mouse button - rotate\n this.flyCameraMouseDown = true;\n this.flyCameraIsPanning = false;\n this.flyCameraLastMouseX = event.clientX;\n this.flyCameraLastMouseY = event.clientY;\n document.body.style.cursor = \"none\";\n event.preventDefault();\n } else if (event.button === 1 || event.button === 2) {\n // Middle or right mouse button - pan\n this.flyCameraMouseDown = true;\n this.flyCameraIsPanning = true;\n this.flyCameraLastMouseX = event.clientX;\n this.flyCameraLastMouseY = event.clientY;\n document.body.style.cursor = \"move\";\n event.preventDefault();\n }\n }\n\n private onFlyCameraMouseUp(event: MouseEvent): void {\n this.flyCameraMouseDown = false;\n this.flyCameraIsPanning = false;\n document.body.style.cursor = \"default\";\n }\n\n private onFlyCameraMouseMove(event: MouseEvent): void {\n if (!this.flyCameraMouseDown || getTweakpaneActive()) {\n return;\n }\n\n const movementX =\n event.movementX !== undefined ? event.movementX : event.clientX - this.flyCameraLastMouseX;\n const movementY =\n event.movementY !== undefined ? event.movementY : event.clientY - this.flyCameraLastMouseY;\n\n if (this.flyCameraIsPanning) {\n // Pan the lookAt target\n this.panFlyCameraLookAt(movementX, movementY);\n } else {\n // Rotate around lookAt target\n this.flyCameraYaw -= movementX * this.orbitControlsRotateSensitivity;\n this.flyCameraPitch -= movementY * this.orbitControlsRotateSensitivity;\n\n this.flyCameraYaw = this.flyCameraYaw % (Math.PI * 2);\n this.flyCameraPitch = Math.max(\n this.orbitControlsMinPolarAngle,\n Math.min(this.orbitControlsMaxPolarAngle, this.flyCameraPitch),\n );\n }\n\n this.flyCameraLastMouseX = event.clientX;\n this.flyCameraLastMouseY = event.clientY;\n event.preventDefault();\n }\n\n private panFlyCameraLookAt(deltaX: number, deltaY: number): void {\n // Calculate camera's forward direction (from camera to lookAt)\n const sinPhi = Math.sin(this.flyCameraPitch);\n const cosPhi = Math.cos(this.flyCameraPitch);\n const sinTheta = Math.sin(this.flyCameraYaw);\n const cosTheta = Math.cos(this.flyCameraYaw);\n\n // Forward vector (from camera position towards lookAt)\n this.tempPanForward.set(-sinPhi * sinTheta, -cosPhi, -sinPhi * cosTheta).normalize();\n\n // World up vector\n const worldUp = new Vect3(0, 1, 0);\n\n // Right vector = forward \u00D7 worldUp (perpendicular to forward and world up)\n this.tempPanRight.copy(this.tempPanForward).cross(worldUp).normalize();\n\n // If forward is parallel to world up, use a different approach\n if (this.tempPanRight.lengthSquared() < 0.01) {\n // Camera is looking straight up or down, use yaw-based right vector\n this.tempPanRight.set(cosTheta, 0, -sinTheta).normalize();\n }\n\n // Up vector = right \u00D7 forward (perpendicular to both)\n this.tempPanUp.copy(this.tempPanRight).cross(this.tempPanForward).normalize();\n\n // Pan distance is proportional to camera distance\n const panDistance = this.flyCameraDistance * this.orbitControlsPanSensitivity;\n\n // Move lookAt target along camera's right and up vectors\n // Clone vectors before scaling to avoid mutation\n const panRight = this.tempPanRight.clone().multiplyScalar(-deltaX * panDistance);\n const panUp = this.tempPanUp.clone().multiplyScalar(deltaY * panDistance);\n\n this.flyCameraLookAt.add(panRight);\n this.flyCameraLookAt.add(panUp);\n }\n\n private onFlyCameraWheel(event: WheelEvent): void {\n if (getTweakpaneActive()) {\n return;\n }\n event.preventDefault();\n this.flyCameraDistance += event.deltaY * this.orbitControlsZoomSensitivity;\n this.flyCameraDistance = Math.max(0.01, Math.min(this.flyCameraDistance, 1000));\n }\n\n private preventDefaultAndStopPropagation(evt: PointerEvent): void {\n evt.preventDefault();\n evt.stopPropagation();\n }\n\n private onPointerDown(event: PointerEvent): void {\n if (event.button === 0 || event.button === 2) {\n // Left or right mouse button\n\n const pointerInfo = { x: event.clientX, y: event.clientY };\n this.activePointers.set(event.pointerId, pointerInfo);\n document.body.style.cursor = \"none\";\n }\n }\n\n private onPointerUp(event: PointerEvent): void {\n const existingPointer = this.activePointers.get(event.pointerId);\n if (existingPointer) {\n this.activePointers.delete(event.pointerId);\n if (this.activePointers.size === 0) {\n document.body.style.cursor = \"default\";\n }\n }\n }\n\n private getAveragePointerPositionAndSpread(): { pos: { x: number; y: number }; spread: number } {\n const existingSum = { x: 0, y: 0 };\n this.activePointers.forEach((p) => {\n existingSum.x += p.x;\n existingSum.y += p.y;\n });\n const aX = existingSum.x / this.activePointers.size;\n const aY = existingSum.y / this.activePointers.size;\n\n let sumOfDistances = 0;\n this.activePointers.forEach((p) => {\n const distance = Math.sqrt((p.x - aX) ** 2 + (p.y - aY) ** 2);\n sumOfDistances += distance;\n });\n return { pos: { x: aX, y: aY }, spread: sumOfDistances / this.activePointers.size };\n }\n\n private onPointerMove(event: PointerEvent): void {\n if (getTweakpaneActive()) {\n return;\n }\n\n const existingPointer = this.activePointers.get(event.pointerId);\n if (existingPointer) {\n const previous = this.getAveragePointerPositionAndSpread();\n\n // Replace the pointer info and recalculate to determine the delta\n existingPointer.x = event.clientX;\n existingPointer.y = event.clientY;\n\n const latest = this.getAveragePointerPositionAndSpread();\n\n const sX = latest.pos.x - previous.pos.x;\n const sY = latest.pos.y - previous.pos.y;\n\n const dx = (sX / this.targetElement.clientWidth) * cameraPanSensitivity;\n const dy = (sY / this.targetElement.clientHeight) * cameraPanSensitivity;\n\n if (this.activePointers.size > 1) {\n const zoomDelta = latest.spread - previous.spread;\n this.zoom(-zoomDelta * pinchZoomSensitivity);\n }\n\n this.targetTheta += dx;\n this.targetPhi -= dy;\n this.targetPhi = Math.max(this.minPolarAngle, Math.min(this.maxPolarAngle, this.targetPhi));\n event.preventDefault();\n }\n }\n\n private onMouseWheel(event: WheelEvent): void {\n if (getTweakpaneActive()) {\n return;\n }\n event.preventDefault();\n const scrollAmount = event.deltaY * this.zoomScale * scrollZoomSensitivity;\n this.zoom(scrollAmount);\n }\n\n private zoom(delta: number) {\n this.targetDistance += delta;\n this.targetDistance = Math.max(\n this.minDistance,\n Math.min(this.maxDistance, this.targetDistance),\n );\n this.desiredDistance = this.targetDistance;\n }\n\n private onContextMenu(event: PointerEvent): void {\n event.preventDefault();\n }\n\n public setTarget(target: Vect3): void {\n if (!this.isLerping) {\n this.target.copy(target);\n } else {\n this.finalTarget.copy(target);\n this.lerpTarget.copy(this.target);\n this.lerpFactor = 0;\n }\n\n if (!this.hadTarget) {\n this.hadTarget = true;\n this.reverseUpdateFromPositions(this.cameraState.position, this.cameraState.rotation);\n }\n }\n\n public setLerpedTarget(target: Vect3, targetDistance: number): void {\n this.isLerping = true;\n this.targetDistance = targetDistance;\n this.desiredDistance = targetDistance;\n this.setTarget(target);\n }\n\n public reverseUpdateFromPositions(position: Vect3, rotation: Quat): void {\n const dx = position.x - this.target.x;\n const dy = position.y - this.target.y;\n const dz = position.z - this.target.z;\n this.targetDistance = Math.sqrt(dx * dx + dy * dy + dz * dz);\n this.distance = this.targetDistance;\n this.desiredDistance = this.targetDistance;\n this.theta = Math.atan2(dz, dx);\n this.targetTheta = this.theta;\n this.phi = Math.acos(dy / this.targetDistance);\n this.targetPhi = this.phi;\n this.recomputeFoV(true);\n }\n\n public adjustCameraPosition(position: Vect3, rotation: Quat): void {\n const offsetDistance = 0.5;\n const offset = this.tempVec3.set(0, 0, offsetDistance);\n const matr4 = this.tempMatr4.setRotationFromQuaternion(rotation);\n offset.applyMatrix4(matr4);\n const rayOrigin = offset.add(position);\n const rayDirection = rayOrigin.sub(this.target).normalize();\n\n this.cameraRay.set(this.target, rayDirection);\n const firstRaycastHit = this.collisionsManager.raycastFirst(this.cameraRay);\n if (firstRaycastHit !== null && firstRaycastHit[0] <= this.desiredDistance) {\n const distanceToCollision = firstRaycastHit[0] - 0.1;\n this.targetDistance = distanceToCollision;\n this.distance = distanceToCollision;\n } else {\n this.targetDistance = this.desiredDistance;\n }\n }\n\n private updateFlyCameraOrbitControls(): void {\n // Convert spherical coordinates to cartesian position\n const sinPhi = Math.sin(this.flyCameraPitch);\n const cosPhi = Math.cos(this.flyCameraPitch);\n const sinTheta = Math.sin(this.flyCameraYaw);\n const cosTheta = Math.cos(this.flyCameraYaw);\n\n const x = this.flyCameraLookAt.x + this.flyCameraDistance * sinPhi * sinTheta;\n const y = this.flyCameraLookAt.y + this.flyCameraDistance * cosPhi;\n const z = this.flyCameraLookAt.z + this.flyCameraDistance * sinPhi * cosTheta;\n\n this.flyCameraState.position.set(x, y, z);\n\n // Calculate rotation to look at target\n const direction = new Vect3()\n .copy(this.flyCameraLookAt)\n .sub(this.flyCameraState.position)\n .normalize();\n const up = new Vect3(0, 1, 0);\n const right = new Vect3().copy(direction).cross(up).normalize();\n const correctedUp = new Vect3().copy(right).cross(direction).normalize();\n\n const lookAtMatrix = this.tempMatr4.set(\n right.x,\n correctedUp.x,\n -direction.x,\n 0,\n right.y,\n correctedUp.y,\n -direction.y,\n 0,\n right.z,\n correctedUp.z,\n -direction.z,\n 0,\n 0,\n 0,\n 0,\n 1,\n );\n\n this.flyCameraState.rotation.setFromRotationMatrix(lookAtMatrix);\n }\n\n public dispose() {\n this.disposeEventHandlers();\n this.disposeFlyCameraEventHandlers();\n document.body.style.cursor = \"\";\n }\n\n private easeOutExpo(x: number): number {\n return x === 1 ? 1 : 1 - Math.pow(2, -10 * x);\n }\n\n public updateAspect(aspect: number): void {\n this.aspect = aspect;\n this.cameraState.aspect = aspect;\n this.flyCameraState.aspect = aspect;\n }\n\n public recomputeFoV(immediately: boolean = false): void {\n this.targetFOV = remap(\n this.targetDistance,\n this.minDistance,\n this.maxDistance,\n this.invertFOVMapping ? this.minFOV : this.maxFOV,\n this.invertFOVMapping ? this.maxFOV : this.minFOV,\n );\n if (immediately) {\n this.fov = this.targetFOV;\n }\n }\n\n public isFlyCameraOn(): boolean {\n return this.isMainCameraActive === false;\n }\n\n public toggleFlyCamera(): void {\n this.isMainCameraActive = !this.isMainCameraActive;\n\n if (!this.isMainCameraActive) {\n // Entering fly camera mode - initialize from current camera\n this.updateAspect(window.innerWidth / window.innerHeight);\n\n // Copy current camera state including FOV\n this.flyCameraState.position.copy(this.cameraState.position);\n this.flyCameraState.rotation.copy(this.cameraState.rotation);\n this.flyCameraState.fov = this.cameraState.fov;\n\n // Use the main camera's target as the lookAt point\n this.flyCameraLookAt.copy(this.target);\n\n // Calculate spherical coordinates from current camera position relative to target\n const toCamera = new Vect3().copy(this.flyCameraState.position).sub(this.flyCameraLookAt);\n this.flyCameraDistance = toCamera.length();\n if (this.flyCameraDistance > 0.001) {\n this.flyCameraPitch = Math.acos(toCamera.y / this.flyCameraDistance);\n this.flyCameraYaw = Math.atan2(toCamera.x, toCamera.z);\n } else {\n // Fallback if camera is at target\n this.flyCameraDistance = this.distance;\n this.flyCameraPitch = Math.PI * 0.4;\n this.flyCameraYaw = 0;\n }\n\n // Immediately update fly camera orbit controls to ensure position matches exactly\n // This prevents any shift when the first update() call recalculates position\n this.updateFlyCameraOrbitControls();\n\n // Dispose main camera handlers and create fly camera handlers\n this.disposeEventHandlers();\n this.createFlyCameraEventHandlers();\n } else {\n // Exiting fly camera mode\n this.disposeFlyCameraEventHandlers();\n this.createEventHandlers();\n }\n }\n\n public getCameraState(): CameraState {\n return this.isMainCameraActive ? this.cameraState : this.flyCameraState;\n }\n\n public getMainCameraState(): CameraState {\n return this.cameraState;\n }\n\n public getFlyCameraState(): CameraState {\n return this.flyCameraState;\n }\n\n public getCameraPosition(): Vect3 {\n const state = this.getCameraState();\n return state.position;\n }\n\n public getCameraRotation(): Quat {\n const state = this.getCameraState();\n return state.rotation;\n }\n\n public getCameraFOV(): number {\n const state = this.getCameraState();\n return state.fov;\n }\n\n public update(onFlyCameraUpdate?: (state: CameraState) => void): void {\n if (!this.isMainCameraActive) {\n // Update fly camera orbit controls\n this.updateFlyCameraOrbitControls();\n if (onFlyCameraUpdate) {\n onFlyCameraUpdate(this.flyCameraState);\n }\n return;\n }\n\n if (this.isLerping && this.lerpFactor < 1) {\n this.lerpFactor += 0.01 / this.lerpDuration;\n this.lerpFactor = Math.min(1, this.lerpFactor);\n this.target.lerpVectors(this.lerpTarget, this.finalTarget, this.easeOutExpo(this.lerpFactor));\n } else {\n this.adjustCameraPosition(this.cameraState.position, this.cameraState.rotation);\n }\n\n this.distance += (this.targetDistance - this.distance) * this.zoomDamping;\n\n this.theta += (this.targetTheta - this.theta) * this.damping;\n this.phi += (this.targetPhi - this.phi) * this.damping;\n\n const x = this.target.x + this.distance * Math.sin(this.phi) * Math.cos(this.theta);\n const y = this.target.y + this.distance * Math.cos(this.phi);\n const z = this.target.z + this.distance * Math.sin(this.phi) * Math.sin(this.theta);\n\n this.recomputeFoV();\n this.fov += (this.targetFOV - this.fov) * this.zoomDamping;\n\n this.cameraState.position.set(x, y, z);\n this.cameraState.fov = this.fov;\n\n const lookAtTarget = new Vect3(this.target.x, this.target.y, this.target.z);\n const direction = new Vect3().copy(lookAtTarget).sub(this.cameraState.position).normalize();\n const up = new Vect3(0, 1, 0);\n const right = new Vect3().copy(direction).cross(up).normalize();\n const correctedUp = new Vect3().copy(right).cross(direction).normalize();\n\n const lookAtMatrix = this.tempMatr4.set(\n right.x,\n correctedUp.x,\n -direction.x,\n 0,\n right.y,\n correctedUp.y,\n -direction.y,\n 0,\n right.z,\n correctedUp.z,\n -direction.z,\n 0,\n 0,\n 0,\n 0,\n 1,\n );\n\n this.cameraState.rotation.setFromRotationMatrix(lookAtMatrix);\n\n if (this.isLerping && this.lerpFactor >= 1) {\n this.isLerping = false;\n }\n }\n\n public hasActiveInput(): boolean {\n return this.activePointers.size > 0;\n }\n}\n", "import { PositionAndRotation, radToDeg } from \"@mml-io/mml-web\";\n\nimport { CameraManager } from \"../camera/CameraManager\";\nimport { CollisionsManager } from \"../collisions/CollisionsManager\";\nimport { KeyInputManager } from \"../input/KeyInputManager\";\nimport { VirtualJoystick } from \"../input/VirtualJoystick\";\nimport { EulXYZ } from \"../math/EulXYZ\";\nimport { Quat } from \"../math/Quat\";\nimport { Vect3 } from \"../math/Vect3\";\nimport { CharacterRenderState, CharacterDescription } from \"../rendering/IRenderer\";\nimport { CharacterControllerValues } from \"../tweakpane/blades/characterControlsFolder\";\nimport { TweakPane } from \"../tweakpane/TweakPane\";\n\nimport { AnimationMixer } from \"./AnimationMixer\";\nimport { AnimationState, CharacterState } from \"./CharacterState\";\nimport { LocalController } from \"./LocalController\";\nimport { RemoteController } from \"./RemoteController\";\nimport { encodeCharacterAndCamera } from \"./url-position\";\n\ntype SpawnPosition = {\n x: number;\n y: number;\n z: number;\n};\n\ntype SpawnPositionVariance = {\n x: number;\n y: number;\n z: number;\n};\n\ntype RespawnTrigger = {\n minX: number;\n maxX: number;\n minY: number;\n maxY: number;\n minZ: number;\n maxZ: number;\n};\n\nexport type SpawnConfiguration = {\n spawnPosition?: Partial<SpawnPosition>;\n spawnPositionVariance?: Partial<SpawnPositionVariance>;\n spawnYRotation?: number;\n respawnTrigger?: Partial<RespawnTrigger>;\n enableRespawnButton?: boolean;\n};\n\nexport type SpawnConfigurationState = {\n spawnPosition: SpawnPosition;\n spawnPositionVariance: SpawnPositionVariance;\n spawnYRotation: number;\n respawnTrigger: RespawnTrigger;\n enableRespawnButton: boolean;\n};\n\nexport type CharacterManagerConfig = {\n collisionsManager: CollisionsManager;\n cameraManager: CameraManager;\n keyInputManager: KeyInputManager;\n virtualJoystick?: VirtualJoystick;\n remoteUserStates: Map<number, CharacterState>;\n sendUpdate: (update: CharacterState) => void;\n sendLocalCharacterColors: (colors: Array<[number, number, number]>) => void;\n spawnConfiguration: SpawnConfigurationState;\n characterControllerValues: CharacterControllerValues;\n characterResolve: (clientId: number) => {\n username: string | null;\n characterDescription: CharacterDescription | null;\n colors: Array<[number, number, number]> | null;\n };\n updateURLLocation?: boolean;\n};\n\ntype RemoteCharacterState = {\n id: number;\n controller: RemoteController;\n animationMixer: AnimationMixer;\n lastUsername: string;\n lastCharacterDescription: CharacterDescription | null;\n lastColors: Array<[number, number, number]> | null;\n renderState: CharacterRenderState;\n};\n\nexport class CharacterManager {\n public static readonly headTargetOffset = new Vect3(0, 1.75, 0);\n\n private localClientId: number = 0;\n public remoteCharacters: Map<number, RemoteCharacterState> = new Map();\n public localController: LocalController | null = null;\n private localRenderState: CharacterRenderState | null = null;\n private localAnimationMixer: AnimationMixer | null = null;\n\n private lastUpdateSentTime: number = 0;\n private tempCameraTarget = new Vect3();\n private cachedCharacterStates: Map<number, CharacterRenderState> = new Map();\n private pendingDescriptionUpdates: Set<number> = new Set();\n private pendingRemovals: Set<number> = new Set();\n\n constructor(private config: CharacterManagerConfig) {}\n\n /**\n * Sets the local client ID early to prevent the local character from being\n * spawned as a remote character when network updates arrive before spawnLocalCharacter is called.\n */\n public setLocalClientId(id: number): void {\n this.localClientId = id;\n }\n\n public spawnLocalCharacter(\n id: number,\n spawnPosition: Vect3 = new Vect3(),\n spawnRotation: EulXYZ = new EulXYZ(),\n ) {\n const position = new Vect3(spawnPosition.x, spawnPosition.y, spawnPosition.z);\n const quaternion = new Quat().setFromEulerXYZ(spawnRotation);\n\n this.config.sendUpdate({\n position: {\n x: spawnPosition.x,\n y: spawnPosition.y,\n z: spawnPosition.z,\n },\n rotation: { quaternionY: quaternion.y, quaternionW: quaternion.w },\n state: AnimationState.idle,\n });\n\n this.localClientId = id;\n this.localController = new LocalController({\n id: this.localClientId,\n position: position,\n quaternion: quaternion,\n collisionsManager: this.config.collisionsManager,\n keyInputManager: this.config.keyInputManager,\n virtualJoystick: this.config.virtualJoystick,\n cameraManager: this.config.cameraManager,\n spawnConfiguration: this.config.spawnConfiguration,\n characterControllerValues: this.config.characterControllerValues,\n });\n\n // Initialize cached renderState for local character\n const characterInfo = this.config.characterResolve(this.localClientId);\n const rotation = new EulXYZ().setFromQuaternion(quaternion);\n this.localAnimationMixer = new AnimationMixer(AnimationState.idle);\n this.localRenderState = {\n id: this.localClientId,\n position: new Vect3(position.x, position.y, position.z),\n rotation: rotation,\n animationState: AnimationState.idle,\n animationWeights: this.localAnimationMixer.getWeights(),\n animationTimes: this.localAnimationMixer.getAnimationTimes(),\n username: characterInfo.username ?? `Unknown User ${this.localClientId}`,\n characterDescription: characterInfo.characterDescription,\n colors: characterInfo.colors,\n isLocal: true,\n };\n this.cachedCharacterStates.set(this.localClientId, this.localRenderState);\n }\n\n public setupTweakPane(tweakPane: TweakPane) {\n if (this.localController) {\n tweakPane.setupCharacterController(this.localController);\n }\n }\n\n public getLocalCharacterPositionAndRotation(): PositionAndRotation {\n if (this.localController) {\n const rotation = this.localController.config.quaternion;\n return {\n position: this.localController.config.position,\n rotation: {\n x: radToDeg(rotation.x),\n y: radToDeg(rotation.y),\n z: radToDeg(rotation.z),\n },\n };\n }\n return {\n position: { x: 0, y: 0, z: 0 },\n rotation: { x: 0, y: 0, z: 0 },\n };\n }\n\n public clear() {\n // Track all character IDs that need to be removed from the renderer\n for (const [id] of this.remoteCharacters) {\n this.pendingRemovals.add(id);\n }\n if (this.localClientId !== 0) {\n this.pendingRemovals.add(this.localClientId);\n }\n\n this.remoteCharacters.clear();\n this.cachedCharacterStates.clear();\n this.localRenderState = null;\n\n if (this.localController) {\n this.localController = null;\n }\n }\n\n public dispose() {\n this.clear();\n this.localController = null;\n }\n\n public networkCharacterInfoUpdated(id: number) {\n // Handle remote characters\n const remoteChar = this.remoteCharacters.get(id);\n if (remoteChar) {\n const characterInfo = this.config.characterResolve(id);\n const newUsername = characterInfo.username ?? `Unknown User ${id}`;\n\n // Check if description/colors changed BEFORE updating\n const descriptionChanged =\n remoteChar.lastUsername !== newUsername ||\n remoteChar.lastCharacterDescription !== characterInfo.characterDescription ||\n remoteChar.lastColors !== characterInfo.colors;\n\n remoteChar.lastUsername = newUsername;\n remoteChar.lastCharacterDescription = characterInfo.characterDescription;\n remoteChar.lastColors = characterInfo.colors;\n\n // Update cached renderState\n if (remoteChar.renderState) {\n remoteChar.renderState.username = remoteChar.lastUsername;\n remoteChar.renderState.characterDescription = remoteChar.lastCharacterDescription;\n remoteChar.renderState.colors = remoteChar.lastColors;\n }\n\n // Mark for description update in next update() call\n if (descriptionChanged) {\n this.pendingDescriptionUpdates.add(id);\n }\n }\n\n // Handle local character - update renderState if needed\n if (id === this.localClientId && this.localRenderState) {\n const characterInfo = this.config.characterResolve(id);\n const newUsername = characterInfo.username ?? `Unknown User ${id}`;\n\n // Check if description/colors changed BEFORE updating\n const descriptionChanged =\n this.localRenderState.username !== newUsername ||\n this.localRenderState.characterDescription !== characterInfo.characterDescription ||\n this.localRenderState.colors !== characterInfo.colors;\n\n // Update cached renderState\n this.localRenderState.username = newUsername;\n this.localRenderState.characterDescription = characterInfo.characterDescription;\n this.localRenderState.colors = characterInfo.colors;\n\n // Mark for description update in next update() call\n if (descriptionChanged) {\n this.pendingDescriptionUpdates.add(id);\n }\n }\n }\n\n public update(\n deltaTime: number,\n frameCounter: number,\n ): {\n updatedCharacterDescriptions: number[];\n removedUserIds: number[];\n } {\n const updatedCharacterDescriptions: number[] = [];\n const removedUserIds: number[] = [];\n\n // Process pending removals from clear()\n for (const id of this.pendingRemovals) {\n removedUserIds.push(id);\n }\n this.pendingRemovals.clear();\n\n // Process pending description updates from networkCharacterInfoUpdated\n for (const id of this.pendingDescriptionUpdates) {\n updatedCharacterDescriptions.push(id);\n }\n this.pendingDescriptionUpdates.clear();\n\n // Update local character renderState in-place\n if (this.localController && this.localRenderState && this.localAnimationMixer) {\n this.localController.update(deltaTime);\n\n // Mutate cached renderState in-place\n this.localRenderState.position.set(\n this.localController.config.position.x,\n this.localController.config.position.y,\n this.localController.config.position.z,\n );\n const quat = this.localController.config.quaternion;\n this.localRenderState.rotation.setFromQuaternion(new Quat(quat.x, quat.y, quat.z, quat.w));\n\n // Update animation mixer with target state\n const targetAnimation = this.localController.getTargetAnimation();\n this.localAnimationMixer.setTargetState(targetAnimation);\n this.localAnimationMixer.update(deltaTime);\n\n this.localRenderState.animationState = this.localAnimationMixer.getPrimaryState();\n this.localRenderState.animationWeights = this.localAnimationMixer.getWeights();\n this.localRenderState.animationTimes = this.localAnimationMixer.getAnimationTimes();\n\n // Check if description changed\n const characterInfo = this.config.characterResolve(this.localClientId);\n const newUsername = characterInfo.username ?? `Unknown User ${this.localClientId}`;\n if (\n this.localRenderState.username !== newUsername ||\n this.localRenderState.characterDescription !== characterInfo.characterDescription ||\n this.localRenderState.colors !== characterInfo.colors\n ) {\n this.localRenderState.username = newUsername;\n this.localRenderState.characterDescription = characterInfo.characterDescription;\n this.localRenderState.colors = characterInfo.colors;\n updatedCharacterDescriptions.push(this.localClientId);\n }\n\n const currentTime = new Date().getTime();\n const timeSinceLastUpdate = currentTime - this.lastUpdateSentTime;\n if (timeSinceLastUpdate > 30) {\n this.lastUpdateSentTime = currentTime;\n this.config.sendUpdate(this.localController.networkState);\n }\n\n const targetOffset = this.tempCameraTarget\n .set(0, 0, 0)\n .add(CharacterManager.headTargetOffset)\n .applyQuat(this.localController.config.quaternion)\n .add(this.localController.config.position);\n this.config.cameraManager.setTarget(targetOffset);\n\n if (\n this.config.updateURLLocation &&\n frameCounter % 60 === 0 &&\n document.hasFocus() &&\n !this.config.cameraManager.hasActiveInput() &&\n !this.localController.isOnMovingSurface()\n ) {\n const cameraState = this.config.cameraManager.getCameraState();\n const cameraRotation = new EulXYZ().setFromQuaternion(cameraState.rotation);\n const hash = encodeCharacterAndCamera(\n {\n position: this.localController.config.position,\n rotation: new EulXYZ().setFromQuaternion(this.localController.config.quaternion),\n },\n {\n position: cameraState.position,\n rotation: cameraRotation,\n },\n );\n const url = new URL(window.location.href);\n url.hash = hash;\n window.history.replaceState({}, \"\", url);\n }\n }\n\n // Process remote characters\n for (const [id, networkUpdate] of this.config.remoteUserStates) {\n if (id === this.localClientId) {\n continue;\n }\n\n let existingCharacter = this.remoteCharacters.get(id);\n if (!existingCharacter) {\n // Spawn new remote character with a RemoteController\n const { position } = networkUpdate;\n const initialRotation = new EulXYZ().setFromQuaternion(\n new Quat(0, networkUpdate.rotation.quaternionY, 0, networkUpdate.rotation.quaternionW),\n );\n\n const characterInfo = this.config.characterResolve(id);\n const controller = new RemoteController(\n new Vect3(position.x, position.y, position.z),\n initialRotation,\n networkUpdate.state,\n );\n const animationMixer = new AnimationMixer(networkUpdate.state);\n\n // Initialize cached renderState\n const cachedRotation = new EulXYZ();\n cachedRotation.setFromQuaternion(controller.rotation);\n const renderState: CharacterRenderState = {\n id,\n position: new Vect3(controller.position.x, controller.position.y, controller.position.z),\n rotation: cachedRotation,\n animationState: controller.animationState,\n animationWeights: animationMixer.getWeights(),\n animationTimes: animationMixer.getAnimationTimes(),\n username: characterInfo.username ?? `Unknown User ${id}`,\n characterDescription: characterInfo.characterDescription,\n colors: characterInfo.colors,\n isLocal: false,\n };\n\n existingCharacter = {\n id,\n controller,\n animationMixer,\n lastUsername: renderState.username,\n lastCharacterDescription: renderState.characterDescription,\n lastColors: renderState.colors,\n renderState,\n };\n this.remoteCharacters.set(id, existingCharacter);\n this.cachedCharacterStates.set(id, renderState);\n } else {\n // Update existing character's controller with network state\n existingCharacter.controller.update(networkUpdate, deltaTime);\n\n // Update animation mixer\n existingCharacter.animationMixer.setTargetState(\n existingCharacter.controller.animationState,\n );\n existingCharacter.animationMixer.update(deltaTime);\n\n // Mutate cached renderState in-place\n existingCharacter.renderState.position.set(\n existingCharacter.controller.position.x,\n existingCharacter.controller.position.y,\n existingCharacter.controller.position.z,\n );\n existingCharacter.renderState.rotation.setFromQuaternion(\n existingCharacter.controller.rotation,\n );\n existingCharacter.renderState.animationState =\n existingCharacter.animationMixer.getPrimaryState();\n existingCharacter.renderState.animationWeights =\n existingCharacter.animationMixer.getWeights();\n existingCharacter.renderState.animationTimes =\n existingCharacter.animationMixer.getAnimationTimes();\n\n // Check if description changed\n const characterInfo = this.config.characterResolve(id);\n const newUsername = characterInfo.username ?? `Unknown User ${id}`;\n if (\n existingCharacter.lastUsername !== newUsername ||\n existingCharacter.lastCharacterDescription !== characterInfo.characterDescription ||\n existingCharacter.lastColors !== characterInfo.colors\n ) {\n existingCharacter.lastUsername = newUsername;\n existingCharacter.lastCharacterDescription = characterInfo.characterDescription;\n existingCharacter.lastColors = characterInfo.colors;\n existingCharacter.renderState.username = newUsername;\n existingCharacter.renderState.characterDescription = characterInfo.characterDescription;\n existingCharacter.renderState.colors = characterInfo.colors;\n updatedCharacterDescriptions.push(id);\n }\n }\n }\n\n // Find despawned characters\n for (const [id] of this.remoteCharacters) {\n if (!this.config.remoteUserStates.has(id)) {\n removedUserIds.push(id);\n this.remoteCharacters.delete(id);\n this.cachedCharacterStates.delete(id);\n }\n }\n\n return {\n updatedCharacterDescriptions,\n removedUserIds,\n };\n }\n\n public getAllCharacterStates(): Map<number, CharacterRenderState> {\n // Return the cached Map directly - all objects are mutated in-place by update()\n return this.cachedCharacterStates;\n }\n\n public getLocalClientId(): number {\n return this.localClientId;\n }\n}\n", "export enum AnimationState {\n \"idle\" = 0,\n \"walking\" = 1,\n \"running\" = 2,\n \"jumpToAir\" = 3,\n \"air\" = 4,\n \"airToGround\" = 5,\n \"doubleJump\" = 6,\n}\n\nexport type CharacterState = {\n position: {\n x: number;\n y: number;\n z: number;\n };\n rotation: {\n quaternionY: number;\n quaternionW: number;\n };\n state: AnimationState;\n};\n", "import { AnimationState } from \"./CharacterState\";\n\nexport { AnimationState };\n\n/**\n * Animation weights for rendering. Each animation can have a weight between 0 and 1.\n * When transitioning between animations, multiple animations can have non-zero weights.\n */\nexport type AnimationWeights = {\n [AnimationState.idle]: number;\n [AnimationState.walking]: number;\n [AnimationState.running]: number;\n [AnimationState.jumpToAir]: number;\n [AnimationState.air]: number;\n [AnimationState.airToGround]: number;\n [AnimationState.doubleJump]: number;\n};\n\n/**\n * Animation times for rendering. Each animation has its own time value in seconds.\n * When an animation starts playing, its time is reset to 0.\n */\nexport type AnimationTimes = {\n [AnimationState.idle]: number;\n [AnimationState.walking]: number;\n [AnimationState.running]: number;\n [AnimationState.jumpToAir]: number;\n [AnimationState.air]: number;\n [AnimationState.airToGround]: number;\n [AnimationState.doubleJump]: number;\n};\n\n/**\n * Manages smooth transitions between animation states.\n * Calculates animation weights for blending during transitions.\n */\nexport class AnimationMixer {\n private currentState: AnimationState;\n private targetState: AnimationState;\n private transitionProgress: number = 1.0; // 0 to 1, where 1 means transition complete\n private transitionDuration: number = 0.15; // Default transition time in seconds\n private weights: AnimationWeights;\n private animationTimes: AnimationTimes;\n\n constructor(initialState: AnimationState = AnimationState.idle) {\n this.currentState = initialState;\n this.targetState = initialState;\n this.weights = this.createZeroWeights();\n this.weights[initialState] = 1.0;\n this.animationTimes = this.createZeroTimes();\n }\n\n /**\n * Set the target animation state. If different from current, begins a transition.\n */\n public setTargetState(state: AnimationState): void {\n if (this.targetState === state) {\n return;\n }\n\n // If we're mid-transition, snap to the target and start a new transition\n if (this.transitionProgress < 1.0) {\n this.currentState = this.targetState;\n }\n\n this.targetState = state;\n this.transitionProgress = 0.0;\n\n // Reset the time for the new target animation to start from 0\n this.animationTimes[state] = 0.0;\n\n // Update weights immediately to reflect the new transition\n this.updateWeights();\n }\n\n /**\n * Update the animation mixer, progressing any active transitions.\n */\n public update(deltaTime: number): void {\n // Update times for all animations that have non-zero weight\n for (const state of [\n AnimationState.idle,\n AnimationState.walking,\n AnimationState.running,\n AnimationState.jumpToAir,\n AnimationState.air,\n AnimationState.airToGround,\n AnimationState.doubleJump,\n ]) {\n if (this.weights[state] > 0) {\n this.animationTimes[state] += deltaTime;\n }\n }\n\n if (this.transitionProgress >= 1.0) {\n // No active transition, but ensure weights are up to date\n return;\n }\n\n this.transitionProgress += deltaTime / this.transitionDuration;\n if (this.transitionProgress >= 1.0) {\n this.transitionProgress = 1.0;\n this.currentState = this.targetState;\n }\n\n this.updateWeights();\n }\n\n /**\n * Get the current animation weights for rendering.\n */\n public getWeights(): AnimationWeights {\n return this.weights;\n }\n\n /**\n * Get the animation times for each animation state.\n */\n public getAnimationTimes(): AnimationTimes {\n return this.animationTimes;\n }\n\n /**\n * Get the primary animation state (the target we're transitioning to, or current if no transition).\n */\n public getPrimaryState(): AnimationState {\n return this.targetState;\n }\n\n /**\n * Returns true if currently transitioning between animations.\n */\n public isTransitioning(): boolean {\n return this.transitionProgress < 1.0;\n }\n\n /**\n * Immediately snap to a state without transitioning.\n */\n public snapToState(state: AnimationState): void {\n this.currentState = state;\n this.targetState = state;\n this.transitionProgress = 1.0;\n this.weights = this.createZeroWeights();\n this.weights[state] = 1.0;\n this.animationTimes = this.createZeroTimes();\n }\n\n private updateWeights(): void {\n this.weights = this.createZeroWeights();\n\n if (this.transitionProgress >= 1.0) {\n // Transition complete\n this.weights[this.targetState] = 1.0;\n } else {\n // In transition: blend between current and target\n const t = this.easeInOut(this.transitionProgress);\n this.weights[this.currentState] = 1.0 - t;\n this.weights[this.targetState] = t;\n }\n }\n\n private createZeroWeights(): AnimationWeights {\n return {\n [AnimationState.idle]: 0,\n [AnimationState.walking]: 0,\n [AnimationState.running]: 0,\n [AnimationState.jumpToAir]: 0,\n [AnimationState.air]: 0,\n [AnimationState.airToGround]: 0,\n [AnimationState.doubleJump]: 0,\n };\n }\n\n private createZeroTimes(): AnimationTimes {\n return {\n [AnimationState.idle]: 0,\n [AnimationState.walking]: 0,\n [AnimationState.running]: 0,\n [AnimationState.jumpToAir]: 0,\n [AnimationState.air]: 0,\n [AnimationState.airToGround]: 0,\n [AnimationState.doubleJump]: 0,\n };\n }\n\n private easeInOut(t: number): number {\n // Smooth ease-in-out curve for natural-looking transitions\n return t < 0.5 ? 2 * t * t : 1 - Math.pow(-2 * t + 2, 2) / 2;\n }\n}\n", "import { toArray } from \"../helpers/math-helpers\";\nimport { IEulXYZ } from \"../math/EulXYZ\";\nimport { Quat } from \"../math/Quat\";\nimport { IVect3, Vect3 } from \"../math/Vect3\";\n\nconst tempQuat = new Quat();\n\ntype PositionAndRotation = {\n position: IVect3;\n rotation: IEulXYZ;\n};\n\nexport function encodeCharacterAndCamera(\n character: PositionAndRotation,\n camera: PositionAndRotation,\n): string {\n return [\n ...toArray(character.position),\n ...toArray(tempQuat.setFromEulerXYZ(character.rotation)),\n ...toArray(camera.position),\n ...toArray(tempQuat.setFromEulerXYZ(camera.rotation)),\n ].join(\",\");\n}\n\nexport function decodeCharacterAndCamera(hash: string): {\n character: { position: Vect3; quaternion: Quat };\n camera: { position: Vect3; quaternion: Quat };\n} {\n const values = hash.split(\",\").map(Number);\n return {\n character: {\n position: new Vect3(values[0], values[1], values[2]),\n quaternion: new Quat(values[3], values[4], values[5], values[6]),\n },\n camera: {\n position: new Vect3(values[7], values[8], values[9]),\n quaternion: new Quat(values[10], values[11], values[12], values[13]),\n },\n };\n}\n", "import { EulXYZ } from \"../math/EulXYZ\";\nimport { Vect3 } from \"../math/Vect3\";\n\nimport { CharacterManager, SpawnConfigurationState } from \"./CharacterManager\";\nimport { decodeCharacterAndCamera } from \"./url-position\";\n\nfunction randomWithVariance(value: number, variance: number): number {\n const min = value - variance;\n const max = value + variance;\n return Math.random() * (max - min) + min;\n}\n\nexport function getSpawnData(\n config: SpawnConfigurationState,\n useLocationHash = false,\n): {\n spawnPosition: Vect3;\n spawnRotation: EulXYZ;\n cameraPosition: Vect3;\n} {\n const spawnPosition = new Vect3();\n spawnPosition.set(\n randomWithVariance(config.spawnPosition.x, config.spawnPositionVariance.x),\n randomWithVariance(config.spawnPosition.y, config.spawnPositionVariance.y),\n randomWithVariance(config.spawnPosition!.z, config.spawnPositionVariance.z),\n );\n const spawnRotation = new EulXYZ(0, -config.spawnYRotation! * (Math.PI / 180), 0);\n\n let cameraPosition: Vect3 | null = null;\n const offset = new Vect3(0, 0, 3.3);\n offset.applyEulerXYZ(new EulXYZ(0, spawnRotation.y, 0));\n cameraPosition = spawnPosition.clone().sub(offset).add(CharacterManager.headTargetOffset);\n\n if (useLocationHash && window.location.hash && window.location.hash.length > 1) {\n const urlParams = decodeCharacterAndCamera(window.location.hash.substring(1));\n spawnPosition.copy(urlParams.character.position);\n spawnRotation.setFromQuaternion(urlParams.character.quaternion);\n cameraPosition = new Vect3().copy(urlParams.camera.position);\n }\n\n return {\n spawnPosition,\n spawnRotation,\n cameraPosition,\n };\n}\n", "import { CameraManager } from \"../camera/CameraManager\";\nimport { CollisionMeshState, CollisionsManager } from \"../collisions/CollisionsManager\";\nimport { KeyInputManager } from \"../input/KeyInputManager\";\nimport { VirtualJoystick } from \"../input/VirtualJoystick\";\nimport { EulXYZ } from \"../math/EulXYZ\";\nimport { Line } from \"../math/Line\";\nimport { Matr4 } from \"../math/Matr4\";\nimport { Quat } from \"../math/Quat\";\nimport { Ray } from \"../math/Ray\";\nimport { IVect3, Vect3 } from \"../math/Vect3\";\nimport { CharacterControllerValues } from \"../tweakpane/blades/characterControlsFolder\";\n\nimport { SpawnConfigurationState } from \"./CharacterManager\";\nimport { AnimationState, CharacterState } from \"./CharacterState\";\nimport { getSpawnData } from \"./Spawning\";\n\nconst downVector = new Vect3(0, -1, 0);\n\nexport type LocalControllerConfig = {\n id: number;\n position: Vect3;\n quaternion: Quat;\n collisionsManager: CollisionsManager;\n keyInputManager: KeyInputManager;\n virtualJoystick?: VirtualJoystick;\n cameraManager: CameraManager;\n spawnConfiguration: SpawnConfigurationState;\n characterControllerValues: CharacterControllerValues;\n};\n\nexport class LocalController {\n public capsuleInfo = {\n radius: 0.45,\n segment: new Line(new Vect3(), new Vect3(0, 1.05, 0)),\n };\n\n public gravity: number;\n public jumpForce: number;\n public doubleJumpForce: number;\n public coyoteTimeThreshold: number;\n public canJump: boolean = true;\n public canDoubleJump: boolean = true;\n public coyoteJumped = false;\n public doubleJumpUsed: boolean = false;\n public jumpCounter: number = 0;\n\n public airResistance: number;\n public groundResistance: number;\n public airControlModifier: number;\n public groundWalkControl: number;\n public groundRunControl: number;\n public baseControl: number;\n public minimumSurfaceAngle: number;\n\n public latestPosition: Vect3 = new Vect3();\n public characterOnGround: boolean = false;\n public coyoteTime: boolean = false;\n\n private collisionDetectionSteps = 15;\n\n private characterWasOnGround: boolean = false;\n private characterAirborneSince: number = 0;\n private currentHeight: number = 0;\n private currentSurfaceAngle = new Vect3();\n\n private characterVelocity: Vect3 = new Vect3();\n private vectorUp: Vect3 = new Vect3(0, 1, 0);\n private vectorDown: Vect3 = new Vect3(0, -1, 0);\n\n private rotationOffset: number = 0;\n private azimuthalAngle: number = 0;\n\n private tempSegment: Line = new Line();\n private tempQuat: Quat = new Quat();\n private tempEulXYZ: EulXYZ = new EulXYZ();\n private tempVector: Vect3 = new Vect3();\n private tempVector2: Vect3 = new Vect3();\n private tempVect3: Vect3 = new Vect3();\n private tempRay: Ray = new Ray();\n private tempCameraPos = new Vect3();\n private tempPositionCopy = new Vect3();\n\n private surfaceTempQuat = new Quat();\n private surfaceTempQuat2 = new Quat();\n private surfaceTempVector1 = new Vect3();\n private surfaceTempVector2 = new Vect3();\n private surfaceTempVect3 = new Vect3();\n private surfaceTempVector4 = new Vect3();\n private surfaceTempVector5 = new Vect3();\n private surfaceTempRay = new Ray();\n private lastMatrixTemp: Matr4 = new Matr4();\n private lastFrameSurfaceState:\n | [\n CollisionMeshState,\n {\n lastMatrix: Matr4;\n },\n ]\n | null = null;\n private surfaceIsMoving: boolean = false;\n\n public jumpReleased: boolean = true; // Indicates if the jump button has been released\n\n /** Returns true if the character is currently on a moving surface (e.g., a rotating platform) */\n public isOnMovingSurface(): boolean {\n return this.surfaceIsMoving;\n }\n\n public networkState: CharacterState;\n public config: LocalControllerConfig;\n private controlState: { direction: number | null; isSprinting: boolean; jump: boolean } | null =\n null;\n\n private minimumX: number;\n private maximumX: number;\n private minimumY: number;\n private maximumY: number;\n private minimumZ: number;\n private maximumZ: number;\n\n constructor(config: LocalControllerConfig) {\n this.config = config;\n this.gravity = -config.characterControllerValues.gravity;\n this.jumpForce = config.characterControllerValues.jumpForce;\n this.doubleJumpForce = config.characterControllerValues.doubleJumpForce;\n this.coyoteTimeThreshold = config.characterControllerValues.coyoteJump;\n this.airResistance = config.characterControllerValues.airResistance;\n this.groundResistance = 0.99999999 + config.characterControllerValues.groundResistance * 1e-7;\n this.airControlModifier = config.characterControllerValues.airControlModifier;\n this.groundWalkControl = config.characterControllerValues.groundWalkControl;\n this.groundRunControl = config.characterControllerValues.groundRunControl;\n this.baseControl = config.characterControllerValues.baseControlMultiplier;\n this.minimumSurfaceAngle = config.characterControllerValues.minimumSurfaceAngle;\n\n this.networkState = {\n position: { x: 0, y: 0, z: 0 },\n rotation: { quaternionY: 0, quaternionW: 1 },\n state: AnimationState.idle,\n };\n this.minimumX = this.config.spawnConfiguration.respawnTrigger.minX;\n this.maximumX = this.config.spawnConfiguration.respawnTrigger.maxX;\n this.minimumY = this.config.spawnConfiguration.respawnTrigger.minY;\n this.maximumY = this.config.spawnConfiguration.respawnTrigger.maxY;\n this.minimumZ = this.config.spawnConfiguration.respawnTrigger.minZ;\n this.maximumZ = this.config.spawnConfiguration.respawnTrigger.maxZ;\n\n const maxAbsSpawnX =\n Math.abs(this.config.spawnConfiguration.spawnPosition.x) +\n Math.abs(this.config.spawnConfiguration.spawnPositionVariance.x);\n\n const maxAbsSpawnY =\n Math.abs(this.config.spawnConfiguration.spawnPosition.y) +\n Math.abs(this.config.spawnConfiguration.spawnPositionVariance.y);\n\n const maxAbsSpawnZ =\n Math.abs(this.config.spawnConfiguration.spawnPosition.z) +\n Math.abs(this.config.spawnConfiguration.spawnPositionVariance.z);\n\n if (Math.abs(this.minimumX) < maxAbsSpawnX || Math.abs(this.maximumX) < maxAbsSpawnX) {\n // If the respawn trigger minX or maxX is out of bounds of the spawn position variance,\n // set it to the spawn position variance +- a 1m skin to prevent a respawn infinite loop\n // and warn the user. The same goes for all other axes.\n this.minimumX = -maxAbsSpawnX - 1;\n this.maximumX = maxAbsSpawnX + 1;\n console.warn(\n \"The respawnTrigger X values are out of the bounds of the spawnPosition + spawnPositionVariance. Please check your respawnTrigger config.\",\n );\n }\n\n if (Math.abs(this.minimumY) < maxAbsSpawnY || Math.abs(this.maximumY) < maxAbsSpawnY) {\n this.minimumY = -maxAbsSpawnY - 1;\n this.maximumY = maxAbsSpawnY + 1;\n console.warn(\n \"The respawnTrigger Y values are out of the bounds of the spawnPosition + spawnPositionVariance. Please check your respawnTrigger config.\",\n );\n }\n\n if (Math.abs(this.minimumZ) < maxAbsSpawnZ) {\n this.minimumZ = -maxAbsSpawnZ - 1;\n this.maximumZ = maxAbsSpawnZ + 1;\n console.warn(\n \"The respawnTrigger Z values are out of the bounds of the spawnPosition + spawnPositionVariance. Please check your respawnTrigger config.\",\n );\n }\n }\n\n public updateSpawnConfig(spawnConfig: SpawnConfigurationState): void {\n this.config.spawnConfiguration = spawnConfig;\n this.minimumX = spawnConfig.respawnTrigger.minX;\n this.maximumX = spawnConfig.respawnTrigger.maxX;\n this.minimumY = spawnConfig.respawnTrigger.minY;\n this.maximumY = spawnConfig.respawnTrigger.maxY;\n this.minimumZ = spawnConfig.respawnTrigger.minZ;\n this.maximumZ = spawnConfig.respawnTrigger.maxZ;\n }\n\n public update(deltaTime: number): void {\n this.controlState =\n this.config.keyInputManager.getOutput() || this.config.virtualJoystick?.getOutput() || null;\n\n this.tempRay.set(this.config.position, this.vectorDown);\n this.tempRay.origin.y += this.capsuleInfo.radius;\n const firstRaycastHit = this.config.collisionsManager.raycastFirst(this.tempRay);\n if (firstRaycastHit !== null) {\n this.currentHeight = firstRaycastHit[0];\n this.currentSurfaceAngle.copy(firstRaycastHit[1]);\n } else {\n this.currentHeight = Number.POSITIVE_INFINITY;\n }\n\n if (this.controlState) {\n this.updateRotation(deltaTime);\n }\n\n for (let i = 0; i < this.collisionDetectionSteps; i++) {\n this.updatePosition(deltaTime, deltaTime / this.collisionDetectionSteps, i);\n }\n\n // bounds check\n const outOfBounds =\n this.config.position.x < this.minimumX || // left\n this.config.position.x > this.maximumX || // right\n this.config.position.z < this.minimumZ || // back\n this.config.position.z > this.maximumZ || // front\n this.config.position.y < this.minimumY || // down\n this.config.position.y > this.maximumY; // up\n\n if (outOfBounds) {\n this.resetPosition();\n }\n this.updateNetworkState();\n }\n\n public getTargetAnimation(): AnimationState {\n const jumpHeight = this.characterVelocity.y > 0 ? 0.2 : 1.8;\n if (this.currentHeight > jumpHeight && !this.characterOnGround) {\n if (this.doubleJumpUsed) {\n return AnimationState.doubleJump;\n }\n return AnimationState.air;\n }\n if (!this.controlState || this.controlState.direction === null) {\n return AnimationState.idle;\n }\n\n if (this.controlState.isSprinting) {\n return AnimationState.running;\n }\n\n return AnimationState.walking;\n }\n\n private updateRotationOffset(): void {\n if (this.controlState && this.controlState.direction !== null) {\n this.rotationOffset = this.controlState.direction;\n }\n }\n\n private updateAzimuthalAngle(): void {\n const cameraPos = this.tempCameraPos.copy(this.config.cameraManager.getCameraPosition());\n const camToModelDistance = cameraPos.distanceTo(\n this.tempPositionCopy.copy(this.config.position),\n );\n const isCameraFirstPerson = camToModelDistance < 2;\n if (isCameraFirstPerson) {\n const cameraRotation = this.config.cameraManager.getCameraRotation();\n const cameraForward = this.tempVector.set(0, 0, 1).applyQuat(cameraRotation);\n this.azimuthalAngle = Math.atan2(cameraForward.x, cameraForward.z);\n } else {\n const cameraPos = this.config.cameraManager.getCameraPosition();\n this.azimuthalAngle = Math.atan2(\n cameraPos.x - this.config.position.x,\n cameraPos.z - this.config.position.z,\n );\n }\n }\n\n private computeAngularDifference(rotationQuat: Quat): number {\n const rotation = new Quat().copy(this.config.quaternion);\n return 2 * Math.acos(Math.abs(rotation.dot(rotationQuat)));\n }\n\n private updateRotation(deltaTime: number): void {\n this.updateRotationOffset();\n this.updateAzimuthalAngle();\n const rotationQuat = this.tempQuat.setFromAxisAngle(\n this.vectorUp,\n this.azimuthalAngle + this.rotationOffset,\n );\n const angularDifference = this.computeAngularDifference(rotationQuat);\n const desiredTime = 0.07;\n const angularSpeed = angularDifference / desiredTime;\n const frameRotation = angularSpeed * deltaTime;\n this.config.quaternion.rotateTowards(rotationQuat, frameRotation);\n }\n\n private processJump(currentAcceleration: Vect3, deltaTime: number) {\n const jump = this.controlState?.jump;\n\n if (this.characterOnGround) {\n this.coyoteJumped = false;\n this.canDoubleJump = false;\n this.doubleJumpUsed = false;\n this.jumpCounter = 0;\n\n if (!jump) {\n this.canDoubleJump = !this.doubleJumpUsed && this.jumpReleased && this.jumpCounter === 1;\n this.canJump = true;\n this.jumpReleased = true;\n }\n\n if (jump && this.canJump && this.jumpReleased) {\n currentAcceleration.y += this.jumpForce / deltaTime;\n this.canJump = false;\n this.jumpReleased = false;\n this.jumpCounter++;\n } else {\n if (this.currentSurfaceAngle.y < this.minimumSurfaceAngle) {\n currentAcceleration.y += this.gravity;\n }\n }\n } else {\n if (jump && !this.coyoteJumped && this.coyoteTime) {\n this.coyoteJumped = true;\n currentAcceleration.y += this.jumpForce / deltaTime;\n this.canJump = false;\n this.jumpReleased = false;\n this.jumpCounter++;\n } else if (jump && this.canDoubleJump) {\n currentAcceleration.y += this.doubleJumpForce / deltaTime;\n this.doubleJumpUsed = true;\n this.jumpReleased = false;\n this.jumpCounter++;\n } else {\n currentAcceleration.y += this.gravity;\n this.canJump = false;\n }\n }\n\n if (!jump) {\n this.jumpReleased = true;\n if (!this.characterOnGround) {\n currentAcceleration.y += this.gravity;\n }\n }\n }\n\n private applyControls(stepDeltaTime: number): void {\n const resistance = this.characterOnGround ? this.groundResistance : this.airResistance;\n\n // Dampen the velocity based on the resistance\n const speedFactor = Math.pow(1 - resistance, stepDeltaTime);\n this.characterVelocity.multiplyScalar(speedFactor);\n\n const acceleration = this.tempVector.set(0, 0, 0);\n this.canDoubleJump = !this.doubleJumpUsed && this.jumpReleased && this.jumpCounter === 1;\n this.processJump(acceleration, stepDeltaTime);\n\n const control =\n (this.characterOnGround\n ? this.controlState?.isSprinting\n ? this.groundRunControl\n : this.groundWalkControl\n : this.airControlModifier) * this.baseControl;\n\n const controlAcceleration = this.tempVector2.set(0, 0, 0);\n\n if (this.controlState && this.controlState.direction !== null) {\n // convert heading to direction vector\n const heading = this.controlState.direction;\n const headingVector = this.tempVect3\n .set(0, 0, 1)\n .applyAxisAngle(this.vectorUp, this.azimuthalAngle + heading);\n controlAcceleration.add(headingVector);\n }\n if (controlAcceleration.lengthSquared() > 0) {\n controlAcceleration.normalize();\n controlAcceleration.multiplyScalar(control);\n }\n acceleration.add(controlAcceleration);\n this.characterVelocity.addScaledVector(acceleration, stepDeltaTime);\n\n this.config.position.addScaledVector(this.characterVelocity, stepDeltaTime);\n }\n\n private updatePosition(deltaTime: number, stepDeltaTime: number, iter: number): void {\n this.applyControls(stepDeltaTime);\n\n if (iter === 0) {\n const lastMovement = this.getMovementFromSurfaces(this.config.position, deltaTime);\n if (lastMovement) {\n const newPosition = this.tempVector.copy(this.config.position);\n newPosition.add(lastMovement.position);\n this.config.position.set(newPosition.x, newPosition.y, newPosition.z);\n const asQuat = this.config.quaternion;\n const lastMovementEulXYZ = this.tempEulXYZ.setFromQuaternion(lastMovement.rotation);\n lastMovementEulXYZ.x = 0;\n lastMovementEulXYZ.z = 0;\n lastMovement.rotation.setFromEulerXYZ(lastMovementEulXYZ);\n asQuat.multiply(lastMovement.rotation);\n }\n }\n\n const avatarSegment = this.tempSegment;\n avatarSegment.copy(this.capsuleInfo.segment!);\n avatarSegment.start.add(this.config.position);\n avatarSegment.start.y += this.capsuleInfo.radius;\n avatarSegment.end.add(this.config.position);\n avatarSegment.end.y += this.capsuleInfo.radius;\n\n const positionBeforeCollisions = this.tempVector.copy(avatarSegment.start);\n this.config.collisionsManager.applyColliders(avatarSegment, this.capsuleInfo.radius!);\n\n // Raycast from the top of the capsule to the bottom of the capsule to see if there is a surface intersecting the capsule\n const capsuleLength =\n this.capsuleInfo.segment.end.y -\n this.capsuleInfo.segment.start.y +\n this.capsuleInfo.radius * 2;\n // Set the origin of the ray to the bottom of the segment (1 radius length from the bottom point of the capsule)\n this.tempRay.set(avatarSegment.start, this.vectorDown);\n\n // Amount to ignore from the start and end of the ray (to avoid unwanted collisions)\n const endIgnoreLength = 0.1;\n\n // Move the ray origin to the bottom of the capsule and then add the total length to move the ray origin to the top point of the capsule\n this.tempRay.origin.y += -this.capsuleInfo.radius + capsuleLength - endIgnoreLength;\n // Find the first mesh that intersects the ray\n const withinCapsuleRayHit = this.config.collisionsManager.raycastFirst(\n this.tempRay,\n capsuleLength - endIgnoreLength * 2,\n );\n if (withinCapsuleRayHit !== null) {\n // There is a mesh ray collision within the capsule. Move the character up to the point of the collision\n const rayHitPosition = withinCapsuleRayHit[3];\n avatarSegment.start.copy(rayHitPosition);\n // Account for the radius of the capsule\n avatarSegment.start.y += this.capsuleInfo.radius;\n }\n\n this.config.position.set(\n avatarSegment.start.x,\n avatarSegment.start.y - this.capsuleInfo.radius,\n avatarSegment.start.z,\n );\n const deltaCollisionPosition = avatarSegment.start.sub(positionBeforeCollisions);\n this.characterOnGround = deltaCollisionPosition.y > 0;\n\n if (this.characterOnGround) {\n this.doubleJumpUsed = false;\n this.jumpCounter = 0;\n }\n\n if (this.characterWasOnGround && !this.characterOnGround) {\n this.characterAirborneSince = Date.now();\n }\n\n if (!this.controlState?.jump) {\n this.jumpReleased = true;\n }\n\n this.coyoteTime =\n this.characterVelocity.y < 0 &&\n !this.characterOnGround &&\n Date.now() - this.characterAirborneSince < this.coyoteTimeThreshold;\n\n this.latestPosition.copy(this.config.position);\n this.characterWasOnGround = this.characterOnGround;\n }\n\n public getMovementFromSurfaces(userPosition: IVect3, deltaTime: number) {\n let lastMovement: { rotation: Quat; position: Vect3 } | null = null;\n\n // If we have a last frame state, we can calculate the movement of the mesh to apply it to the user\n if (this.lastFrameSurfaceState !== null) {\n const meshState = this.lastFrameSurfaceState[0];\n\n // Extract the matrix from the current frame and the last frame\n const currentFrameMatrix = meshState.matrix;\n const lastFrameMatrix = this.lastFrameSurfaceState[1].lastMatrix;\n\n if (lastFrameMatrix.equals(currentFrameMatrix)) {\n // No movement from this mesh - do nothing\n this.surfaceIsMoving = false;\n } else {\n this.surfaceIsMoving = true;\n // The mesh has moved since the last frame - calculate the movement\n\n // Get the position of the mesh in the last frame\n const lastMeshPosition = this.surfaceTempVector1;\n const lastMeshRotation = this.surfaceTempQuat;\n lastFrameMatrix.decompose(lastMeshPosition, lastMeshRotation, this.surfaceTempVect3);\n\n // Get the position of the mesh in the current frame\n const currentMeshPosition = this.surfaceTempVector2;\n const currentMeshRotation = this.surfaceTempQuat2;\n currentFrameMatrix.decompose(\n currentMeshPosition,\n currentMeshRotation,\n this.surfaceTempVect3,\n );\n\n // Calculate the difference between the new position and the old position to determine the movement due to translation of position\n const meshTranslationDelta = this.surfaceTempVector5\n .copy(currentMeshPosition)\n .sub(lastMeshPosition);\n\n // Calculate the relative position of the user to the mesh in the last frame\n const lastFrameRelativeUserPosition = this.surfaceTempVect3\n .copy(userPosition)\n .sub(lastMeshPosition);\n\n // Calculate the world-relative rotation delta from the last frame to the current frame\n const meshRotationDelta = currentMeshRotation.multiply(lastMeshRotation.invert());\n\n // Apply the relative quaternion to the relative user position to determine the new position of the user given just the rotation\n const translationDueToRotation = this.surfaceTempVector4\n .copy(lastFrameRelativeUserPosition)\n .applyQuat(meshRotationDelta)\n .sub(lastFrameRelativeUserPosition);\n\n // Combine the mesh translation delta and the rotation translation delta to determine the total movement of the user\n const translationAndRotationPositionDelta = this.surfaceTempVector1\n .copy(meshTranslationDelta)\n .add(translationDueToRotation);\n\n lastMovement = {\n position: translationAndRotationPositionDelta,\n rotation: meshRotationDelta,\n };\n lastFrameMatrix.copy(currentFrameMatrix);\n }\n }\n\n const newPosition = this.surfaceTempVect3.copy(userPosition);\n if (lastMovement) {\n newPosition.add(lastMovement.position);\n }\n newPosition.y = newPosition.y + 0.05;\n\n // Raycast down from the new position to see if there is a surface below the user which will be tracked in the next frame\n const ray = this.surfaceTempRay.set(newPosition, downVector);\n const hit = this.config.collisionsManager.raycastFirst(ray);\n if (hit && hit[0] < 0.8) {\n // There is a surface below the user\n const currentCollisionMeshState = hit[2];\n this.lastFrameSurfaceState = [\n currentCollisionMeshState,\n { lastMatrix: this.lastMatrixTemp.copy(currentCollisionMeshState.matrix) },\n ];\n } else {\n if (this.lastFrameSurfaceState !== null && lastMovement) {\n // Apply the last movement to the user's velocity\n this.characterVelocity.add(\n lastMovement.position.clone().multiplyScalar(1 / deltaTime), // The position delta is the result of one tick which is deltaTime seconds, so we need to divide by deltaTime to get the velocity per second\n );\n }\n this.lastFrameSurfaceState = null;\n this.surfaceIsMoving = false;\n }\n return lastMovement;\n }\n\n private updateNetworkState(): void {\n const characterPosition = this.config.position;\n const characterQuat = this.config.quaternion;\n\n this.networkState = {\n position: {\n x: characterPosition.x,\n y: characterPosition.y,\n z: characterPosition.z,\n },\n rotation: { quaternionY: characterQuat.y, quaternionW: characterQuat.w },\n state: this.getTargetAnimation(),\n };\n }\n\n public resetPosition(): void {\n this.characterVelocity.x = 0;\n this.characterVelocity.y = 0;\n this.characterVelocity.z = 0;\n\n this.characterOnGround = false;\n this.doubleJumpUsed = false;\n this.jumpReleased = true;\n this.jumpCounter = 0;\n\n const spawnData = getSpawnData(this.config.spawnConfiguration, false);\n\n this.config.position.set(\n spawnData.spawnPosition.x,\n spawnData.spawnPosition.y,\n spawnData.spawnPosition.z,\n );\n\n this.config.quaternion.setFromEulerXYZ(spawnData.spawnRotation);\n }\n}\n", "import { EulXYZ, Quat, Vect3 } from \"../math\";\n\nimport { AnimationState, CharacterState } from \"./CharacterState\";\n\nconst tempQuaternion = new Quat();\n\n/**\n * RemoteController handles interpolation of remote character state.\n * It's renderer-agnostic and only calculates interpolated positions/rotations.\n */\nexport class RemoteController {\n // Current interpolated state\n public position: Vect3;\n public rotation: Quat;\n public animationState: AnimationState;\n\n private hasReceivedInitialUpdate = false;\n private interpolationRate = 8.0; // How quickly to interpolate (higher = faster)\n private cachedTargetPos = new Vect3();\n\n constructor(initialPosition: Vect3, initialRotation: EulXYZ, initialAnimation: AnimationState) {\n this.position = new Vect3(initialPosition.x, initialPosition.y, initialPosition.z);\n this.rotation = new Quat().setFromEulerXYZ(initialRotation);\n this.animationState = initialAnimation;\n }\n\n public update(networkUpdate: CharacterState, deltaTime: number): void {\n const { position, rotation, state } = networkUpdate;\n\n // Reuse cached Vect3 instead of allocating new one\n const targetPos = this.cachedTargetPos.set(position.x, position.y, position.z);\n const targetRotQuat = tempQuaternion.set(0, rotation.quaternionY, 0, rotation.quaternionW);\n\n if (!this.hasReceivedInitialUpdate) {\n // First update, snap into position\n this.position.set(targetPos.x, targetPos.y, targetPos.z);\n this.rotation.set(targetRotQuat.x, targetRotQuat.y, targetRotQuat.z, targetRotQuat.w);\n this.animationState = state;\n this.hasReceivedInitialUpdate = true;\n } else {\n // Interpolate position\n const distSq = this.position.distanceToSquared(targetPos);\n if (distSq > 5 * 5) {\n // More than 5m of movement - teleport\n this.position.set(targetPos.x, targetPos.y, targetPos.z);\n } else {\n // Frame-rate independent exponential smoothing\n const lerpFactor = Math.min(1.0, 1.0 - Math.exp(-this.interpolationRate * deltaTime));\n this.position.lerp(targetPos, lerpFactor);\n }\n\n // Interpolate rotation\n const lerpFactor = Math.min(1.0, 1.0 - Math.exp(-this.interpolationRate * deltaTime));\n this.rotation.slerp(targetRotQuat, lerpFactor);\n\n // Update animation\n this.animationState = state;\n }\n }\n\n public getRotationEuler(): EulXYZ {\n return new EulXYZ().setFromQuaternion(this.rotation);\n }\n}\n", "import { EventHandlerCollection } from \"./EventHandlerCollection\";\nimport { VirtualJoystick } from \"./VirtualJoystick\";\n\nexport enum Key {\n W = \"w\",\n A = \"a\",\n S = \"s\",\n D = \"d\",\n SHIFT = \"shift\",\n SPACE = \" \",\n C = \"c\",\n}\n\ntype KeyCallback = () => void;\ntype BindingsType = Map<Key, KeyCallback>;\n\nexport class KeyInputManager {\n private keys = new Map<string, boolean>();\n private eventHandlerCollection = new EventHandlerCollection();\n private bindings: BindingsType = new Map();\n\n constructor(private shouldCaptureKeyPress: () => boolean = () => true) {\n this.eventHandlerCollection.add(document, \"keydown\", this.onKeyDown.bind(this));\n this.eventHandlerCollection.add(document, \"keyup\", this.onKeyUp.bind(this));\n this.eventHandlerCollection.add(window, \"blur\", this.handleUnfocus.bind(this));\n }\n\n private handleUnfocus(_event: FocusEvent): void {\n this.keys.clear();\n }\n\n private onKeyDown(event: KeyboardEvent): void {\n if (this.shouldCaptureKeyPress()) {\n if (event.key.length === 2 && event.key[0] === \"F\") {\n // Ignore all Function keys\n return;\n }\n if (event.metaKey) {\n // Ignore all meta keys (e.g. Alt, Cmd)\n return;\n }\n this.keys.set(event.key.toLowerCase(), true);\n event.preventDefault();\n }\n }\n\n private onKeyUp(event: KeyboardEvent): void {\n this.keys.set(event.key.toLowerCase(), false);\n if (this.bindings.has(event.key.toLowerCase() as Key)) {\n this.bindings.get(event.key.toLowerCase() as Key)!();\n }\n }\n\n public isKeyPressed(key: string): boolean {\n return this.keys.get(key) || false;\n }\n\n public createKeyBinding(key: Key, callback: () => void): void {\n if (this.bindings.has(key)) {\n return;\n }\n this.bindings.set(key, callback);\n }\n\n public removeKeyBinding(key: Key): void {\n if (!this.bindings.has(key)) {\n return;\n }\n this.bindings.delete(key);\n }\n\n public isMovementKeyPressed(): boolean {\n return [Key.W, Key.A, Key.S, Key.D].some((key) => this.isKeyPressed(key));\n }\n\n private getForward(): boolean {\n return this.isKeyPressed(Key.W);\n }\n\n private getBackward(): boolean {\n return this.isKeyPressed(Key.S);\n }\n\n private getLeft(): boolean {\n return this.isKeyPressed(Key.A);\n }\n\n private getRight(): boolean {\n return this.isKeyPressed(Key.D);\n }\n\n private getRun(): boolean {\n return this.isKeyPressed(Key.SHIFT);\n }\n\n private getJump(): boolean {\n return this.isKeyPressed(Key.SPACE);\n }\n\n public getOutput(): { direction: number | null; isSprinting: boolean; jump: boolean } | null {\n const dx = (this.getRight() ? 1 : 0) - (this.getLeft() ? 1 : 0);\n const dy = (this.getBackward() ? 1 : 0) - (this.getForward() ? 1 : 0);\n const jump = this.getJump();\n if (dx === 0 && dy === 0) {\n if (this.getJump()) {\n return { direction: null, isSprinting: false, jump };\n }\n return null;\n }\n const direction = Math.atan2(dx, dy);\n return { direction, isSprinting: this.getRun(), jump };\n }\n\n public dispose() {\n this.eventHandlerCollection.clear();\n this.bindings.clear();\n }\n}\n", "interface VirtualJoyStickConfig {\n radius?: number;\n innerRadius?: number;\n mouseSupport?: boolean;\n}\n\nconst sprintingThreshold = 0.6;\n\nexport class VirtualJoystick {\n private radius: number;\n private innerRadius: number;\n private mouseSupport: boolean;\n\n private element: HTMLDivElement;\n\n private joystickBaseElement: HTMLSpanElement;\n private joystickCenterElement: HTMLSpanElement;\n private joystickPointerId: number | null = null;\n private joystickOutput: { direction: number; isSprinting: boolean } | null = null;\n\n private jumpButton: HTMLButtonElement;\n private jumpPointerId: number | null = null;\n\n constructor(\n private holderElement: HTMLElement,\n private config: VirtualJoyStickConfig,\n ) {\n this.radius = config.radius || 50;\n this.innerRadius = config.innerRadius || this.radius / 2;\n this.mouseSupport = this.checkTouch() || config.mouseSupport === true;\n\n this.element = document.createElement(\"div\");\n const style = this.element.style;\n style.display = this.mouseSupport ? \"flex\" : \"none\";\n style.position = \"absolute\";\n style.width = `100%`;\n style.height = `200px`;\n style.bottom = \"50px\";\n style.zIndex = \"10000\";\n style.alignItems = \"center\";\n style.justifyContent = \"space-between\";\n style.pointerEvents = \"none\";\n style.padding = \"20px\";\n style.boxSizing = \"border-box\";\n style.userSelect = \"none\";\n this.holderElement.appendChild(this.element);\n\n this.joystickBaseElement = this.createBase();\n this.element.appendChild(this.joystickBaseElement);\n\n this.joystickCenterElement = this.createCenter();\n this.joystickBaseElement.appendChild(this.joystickCenterElement);\n\n this.jumpButton = this.createJumpButton();\n this.element.appendChild(this.jumpButton);\n\n this.bindEvents();\n\n this.clearJoystickState();\n }\n\n public static checkForTouch(): boolean {\n try {\n document.createEvent(\"TouchEvent\");\n return true;\n } catch (e) {\n return false;\n }\n }\n\n private checkTouch() {\n return VirtualJoystick.checkForTouch();\n }\n\n private createBase() {\n const base = document.createElement(\"span\");\n const style = base.style;\n style.touchAction = \"pinch-zoom\";\n style.width = `${this.radius * 2}px`;\n style.height = `${this.radius * 2}px`;\n style.position = \"relative\";\n style.display = \"block\";\n style.borderRadius = \"50%\";\n style.borderColor = \"rgba(200,200,200,0.5)\";\n style.borderWidth = \"2px\";\n style.borderStyle = \"solid\";\n style.pointerEvents = \"auto\";\n style.userSelect = \"none\";\n return base;\n }\n\n private createCenter() {\n const center = document.createElement(\"div\");\n const style = center.style;\n style.width = `${this.innerRadius * 2}px`;\n style.height = `${this.innerRadius * 2}px`;\n style.position = \"absolute\";\n style.borderRadius = \"50%\";\n style.backgroundColor = \"rgba(200,200,200,0.3)\";\n style.borderWidth = \"1px\";\n style.borderColor = \"rgba(200,200,200,0.8)\";\n style.borderStyle = \"solid\";\n style.userSelect = \"none\";\n return center;\n }\n\n private createJumpButton() {\n const button = document.createElement(\"button\");\n button.textContent = \"JUMP\";\n const style = button.style;\n style.touchAction = \"pinch-zoom\";\n style.width = `100px`;\n style.height = `100px`;\n style.borderRadius = \"20px\";\n style.color = \"white\";\n style.font = \"Helvetica, sans-serif\";\n style.fontSize = \"16px\";\n style.backgroundColor = \"rgba(200,200,200,0.3)\";\n style.color = \"rgba(220,220,220,1)\";\n style.borderWidth = \"1px\";\n style.borderColor = \"rgba(200,200,200,0.8)\";\n style.borderStyle = \"solid\";\n style.pointerEvents = \"auto\";\n style.userSelect = \"none\";\n return button;\n }\n\n private bindEvents(): void {\n this.joystickBaseElement.addEventListener(\"pointerdown\", this.onJoystickPointerDown.bind(this));\n this.joystickBaseElement.addEventListener(\n \"contextmenu\",\n this.preventDefaultAndStopPropagation.bind(this),\n );\n this.joystickBaseElement.addEventListener(\n \"touchstart\",\n this.preventDefaultAndStopPropagation.bind(this),\n );\n\n this.jumpButton.addEventListener(\"pointerdown\", this.onJumpPointerDown.bind(this));\n this.jumpButton.addEventListener(\n \"contextmenu\",\n this.preventDefaultAndStopPropagation.bind(this),\n );\n this.jumpButton.addEventListener(\n \"touchstart\",\n this.preventDefaultAndStopPropagation.bind(this),\n );\n document.addEventListener(\"pointermove\", this.onPointerMove.bind(this));\n document.addEventListener(\"pointerup\", this.onPointerUp.bind(this));\n document.addEventListener(\"pointercancel\", this.onPointerUp.bind(this));\n }\n\n private preventDefaultAndStopPropagation(evt: PointerEvent): void {\n evt.preventDefault();\n evt.stopPropagation();\n }\n\n private onJumpPointerDown(evt: PointerEvent): void {\n if (this.jumpPointerId === null) {\n this.jumpPointerId = evt.pointerId;\n }\n }\n\n private onJoystickPointerDown(evt: PointerEvent): void {\n evt.preventDefault();\n evt.stopPropagation();\n if (evt.buttons !== 1) {\n return;\n }\n if (this.joystickPointerId === null) {\n this.joystickPointerId = evt.pointerId;\n this.updateControlAndDirection(evt);\n }\n }\n\n private onPointerMove(evt: PointerEvent): void {\n evt.preventDefault();\n evt.stopPropagation();\n if (evt.pointerId !== this.joystickPointerId) {\n return;\n }\n this.updateControlAndDirection(evt);\n }\n\n private onPointerUp(evt: PointerEvent): void {\n evt.preventDefault();\n evt.stopPropagation();\n\n if (evt.pointerId === this.jumpPointerId) {\n this.jumpPointerId = null;\n }\n if (evt.pointerId === this.joystickPointerId) {\n this.joystickPointerId = null;\n this.clearJoystickState();\n }\n }\n\n private clearJoystickState = (): void => {\n this.joystickOutput = null;\n this.joystickCenterElement.style.left = `${this.radius - this.innerRadius}px`;\n this.joystickCenterElement.style.top = `${this.radius - this.innerRadius}px`;\n };\n\n private updateControlAndDirection(input: PointerEvent): void {\n const rect = this.joystickBaseElement.getBoundingClientRect();\n const dx = input.clientX - (rect.left + this.radius);\n const dy = input.clientY - (rect.top + this.radius);\n\n const distance = Math.min(Math.sqrt(dx * dx + dy * dy), this.radius);\n const angle = Math.atan2(dy, dx);\n const constrainedX = distance * Math.cos(angle);\n const constrainedY = distance * Math.sin(angle);\n\n this.joystickCenterElement.style.left = `${constrainedX + this.radius - this.innerRadius}px`;\n this.joystickCenterElement.style.top = `${constrainedY + this.radius - this.innerRadius}px`;\n\n const direction = Math.atan2(dx, dy);\n const speed = distance / this.radius;\n const isSprinting = speed > sprintingThreshold;\n this.joystickOutput = { direction, isSprinting };\n }\n\n public getOutput(): { direction: number | null; isSprinting: boolean; jump: boolean } | null {\n const jump = this.jumpPointerId !== null;\n if (!this.joystickOutput) {\n if (jump) {\n return { direction: null, isSprinting: false, jump: jump };\n }\n return null;\n }\n return {\n ...this.joystickOutput,\n jump: jump,\n };\n }\n}\n", "import { MElement, MMLCollisionTrigger } from \"@mml-io/mml-web\";\nimport type { Ray as ThreeRay, Vector3, Box3, Line3 } from \"three\";\nimport type { MeshBVH } from \"three-mesh-bvh\";\n\nimport { Box } from \"../math/Box\";\nimport { EulXYZ } from \"../math/EulXYZ\";\nimport { Line } from \"../math/Line\";\nimport { Matr4 } from \"../math/Matr4\";\nimport { Quat } from \"../math/Quat\";\nimport { Ray } from \"../math/Ray\";\nimport { IVect3, Vect3 } from \"../math/Vect3\";\n\nimport { getRelativePositionAndRotationRelativeToObject } from \"./getRelativePositionAndRotationRelativeToObject\";\n\ntype CollisionSourceRef = unknown;\n\nexport type CollisionMeshState = {\n matrix: Matr4;\n localScale: IVect3;\n source: CollisionSourceRef;\n meshBVH: MeshBVH;\n trackCollisions: boolean;\n};\n\nexport type CollisionMesh = {\n meshBVH: MeshBVH;\n matrix: Matr4;\n localScale: IVect3;\n};\n\nexport class CollisionsManager {\n private tempVector: Vect3 = new Vect3();\n private tempVector2: Vect3 = new Vect3();\n private tempVect3: Vect3 = new Vect3();\n private tempQuat: Quat = new Quat();\n private tempRay: Ray = new Ray();\n private tempMatrix = new Matr4();\n private tempBox = new Box();\n private tempEulXYZ = new EulXYZ();\n private tempSegment = new Line();\n private tempSegment2 = new Line();\n private tempCollisionPosition = new Vect3();\n private tempMinimalNormal = new Vect3();\n private tempMinimalPoint = new Vect3();\n\n public collisionMeshState: Map<CollisionSourceRef, CollisionMeshState> = new Map();\n private collisionTrigger: MMLCollisionTrigger<CollisionSourceRef>;\n private previouslyCollidingElements: null | Map<\n CollisionSourceRef,\n { position: { x: number; y: number; z: number } }\n >;\n\n private debugEnabled: boolean = false;\n public onDebugChange?: (enabled: boolean) => void;\n\n constructor() {\n this.collisionTrigger = MMLCollisionTrigger.init();\n this.toggleDebug = this.toggleDebug.bind(this);\n }\n\n public isDebugEnabled(): boolean {\n return this.debugEnabled;\n }\n\n public toggleDebug(enabled: boolean) {\n this.debugEnabled = enabled;\n if (this.onDebugChange) {\n this.onDebugChange(enabled);\n }\n }\n\n public raycastFirst(\n ray: Ray,\n maximumDistance: number | null = null,\n ): [number, Vect3, CollisionMeshState, Vect3] | null {\n let minimumDistance: number | null = null;\n let minimumHit: CollisionMeshState | null = null;\n let minimumNormal: Vect3 = this.tempMinimalNormal;\n let minimumPoint: Vect3 = this.tempMinimalPoint;\n for (const [, collisionMeshState] of this.collisionMeshState) {\n const invertedMatrix = this.tempMatrix.copy(collisionMeshState.matrix).invert();\n\n const originalRay = this.tempRay.copy(ray);\n originalRay.applyMatrix4(invertedMatrix);\n\n const hit = collisionMeshState.meshBVH.raycastFirst(\n originalRay as unknown as ThreeRay,\n 2, // DoubleSide\n );\n if (hit) {\n this.tempSegment.start.copy(originalRay.origin);\n this.tempSegment.end.copy(hit.point);\n this.tempSegment.applyMatrix4(collisionMeshState.matrix);\n const dist = this.tempSegment.distance();\n if (\n (maximumDistance === null || dist < maximumDistance) &&\n (minimumDistance === null || dist < minimumDistance)\n ) {\n minimumDistance = dist;\n minimumHit = collisionMeshState;\n minimumNormal = (hit.normal ? minimumNormal.copy(hit.normal) : minimumNormal.set(0, 1, 0))\n // Apply the rotation of the mesh to the normal\n .applyQuat(this.tempQuat.setFromRotationMatrix(collisionMeshState.matrix))\n .normalize();\n minimumPoint = minimumPoint.copy(hit.point).applyMatrix4(collisionMeshState.matrix);\n }\n }\n }\n if (minimumDistance === null || minimumHit === null) {\n return null;\n }\n return [minimumDistance, minimumNormal, minimumHit, minimumPoint];\n }\n\n public addMeshesGroup(\n group: CollisionSourceRef,\n creationResult: CollisionMesh,\n mElement?: MElement,\n ): void {\n if (mElement) {\n this.collisionTrigger.addCollider(group, mElement);\n }\n const { meshBVH, matrix, localScale } = creationResult;\n\n const meshState: CollisionMeshState = {\n source: group,\n meshBVH,\n matrix,\n localScale,\n trackCollisions: mElement !== undefined,\n };\n this.collisionMeshState.set(group, meshState);\n }\n\n public updateMeshesGroup(group: CollisionSourceRef, matrix: Matr4, localScale: IVect3): void {\n const meshState = this.collisionMeshState.get(group);\n if (meshState) {\n meshState.matrix.copy(matrix);\n meshState.localScale.x = localScale.x;\n meshState.localScale.y = localScale.y;\n meshState.localScale.z = localScale.z;\n }\n }\n\n public removeMeshesGroup(group: CollisionSourceRef): void {\n this.collisionTrigger.removeCollider(group);\n const meshState = this.collisionMeshState.get(group);\n if (meshState) {\n this.collisionMeshState.delete(group);\n }\n }\n\n private applyCollider(\n worldBasedCapsuleSegment: Line,\n capsuleRadius: number,\n meshState: CollisionMeshState,\n ): Vect3 | null {\n // Create a matrix to convert from world-space to mesh-space\n const meshMatrix = this.tempMatrix.copy(meshState.matrix).invert();\n\n // Create the bounding box for the capsule if it were in mesh-space\n const meshRelativeCapsuleBoundingBox = this.tempBox;\n meshRelativeCapsuleBoundingBox.makeEmpty();\n meshRelativeCapsuleBoundingBox.expandByPoint(worldBasedCapsuleSegment.start);\n meshRelativeCapsuleBoundingBox.expandByPoint(worldBasedCapsuleSegment.end);\n meshRelativeCapsuleBoundingBox.min.subScalar(capsuleRadius);\n meshRelativeCapsuleBoundingBox.max.addScalar(capsuleRadius);\n meshRelativeCapsuleBoundingBox.applyMatrix4(meshMatrix);\n // Create a segment/line for the capsule in mesh-space\n const meshRelativeCapsuleSegment = this.tempSegment;\n meshRelativeCapsuleSegment.start.copy(worldBasedCapsuleSegment.start);\n meshRelativeCapsuleSegment.end.copy(worldBasedCapsuleSegment.end);\n meshRelativeCapsuleSegment.applyMatrix4(meshMatrix);\n\n // Keep track of where the segment started in mesh-space so that we can calculate the delta later\n const initialMeshRelativeCapsuleSegmentStart = this.tempVect3.copy(\n meshRelativeCapsuleSegment.start,\n );\n\n let collisionPosition: Vect3 | null = null;\n let currentCollisionDistance: number = -1;\n meshState.meshBVH.shapecast({\n intersectsBounds: (meshBox) => {\n // Determine if this portion of the mesh overlaps with the capsule bounding box and is therefore worth checking\n // all of the triangles within\n return meshBox.intersectsBox(meshRelativeCapsuleBoundingBox as unknown as Box3);\n },\n intersectsTriangle: (meshTriangle) => {\n const closestPointOnTriangle = this.tempVector;\n const closestPointOnSegment = this.tempVector2;\n // Find the closest point between this triangle and the capsule segment in mesh-space\n meshTriangle.closestPointToSegment(\n meshRelativeCapsuleSegment as unknown as Line3,\n closestPointOnTriangle as unknown as Vector3,\n closestPointOnSegment as unknown as Vector3,\n );\n // Create a line segment between the closest points\n const intersectionSegment = this.tempSegment2;\n intersectionSegment.start.copy(closestPointOnTriangle);\n intersectionSegment.end.copy(closestPointOnSegment);\n // Calculate the distance between the closest points in mesh-space\n const modelReferenceDistance = intersectionSegment.distance();\n\n // Calculate the distance between the points in world-space\n intersectionSegment.applyMatrix4(meshState.matrix);\n const realDistance = intersectionSegment.distance();\n\n // If the real distance is less than the capsule radius then there is actually a collision between the capsule\n // and the triangle\n if (realDistance < capsuleRadius) {\n if (!collisionPosition) {\n collisionPosition = this.tempCollisionPosition\n .copy(closestPointOnTriangle)\n .applyMatrix4(meshState.matrix);\n currentCollisionDistance = realDistance;\n } else if (realDistance < currentCollisionDistance) {\n collisionPosition.copy(closestPointOnTriangle).applyMatrix4(meshState.matrix);\n currentCollisionDistance = realDistance;\n }\n // Calculate the ratio between the real distance and the mesh-space distance\n const ratio = realDistance / modelReferenceDistance;\n // Calculate the depth of the collision in world-space\n const realDepth = capsuleRadius - realDistance;\n // Convert that depth back into mesh-space as all calculations during collision are to a mesh-space segment\n const modelDepth = realDepth / ratio;\n\n // Apply a corrective movement to the segment in mesh-space\n const direction = closestPointOnSegment.sub(closestPointOnTriangle).normalize();\n meshRelativeCapsuleSegment.start.addScaledVector(direction, modelDepth);\n meshRelativeCapsuleSegment.end.addScaledVector(direction, modelDepth);\n }\n },\n });\n\n if (collisionPosition) {\n // If there was a collision, calculate the delta between the original mesh-space segment and the now-moved one\n const delta = this.tempVector\n .copy(meshRelativeCapsuleSegment.start)\n .sub(initialMeshRelativeCapsuleSegmentStart);\n\n // Use the matrix for the mesh to convert the delta vector back to world-space (remove the position component of the matrix first to avoid translation)\n this.tempMatrix.copy(meshState.matrix).setPosition(0, 0, 0);\n delta.applyMatrix4(this.tempMatrix);\n\n // There's a possibility that the matrix is invalid (or scale zero) and the delta is NaN - if so, don't apply the delta\n if (!(isNaN(delta.x) && isNaN(delta.y) && isNaN(delta.z))) {\n // Convert the potentially-modified mesh-space segment back to world-space\n worldBasedCapsuleSegment.start.add(delta);\n worldBasedCapsuleSegment.end.add(delta);\n }\n }\n\n return collisionPosition;\n }\n\n public applyColliders(tempSegment: Line, radius: number) {\n const collidedElements = new Map<\n CollisionSourceRef,\n {\n position: { x: number; y: number; z: number };\n }\n >();\n for (const meshState of this.collisionMeshState.values()) {\n const collisionPosition = this.applyCollider(tempSegment, radius, meshState);\n if (collisionPosition && meshState.trackCollisions) {\n const relativePosition = getRelativePositionAndRotationRelativeToObject(\n {\n position: collisionPosition,\n rotation: this.tempEulXYZ.set(0, 0, 0),\n },\n meshState.matrix,\n meshState.localScale,\n );\n collidedElements.set(meshState.source, {\n position: relativePosition.position,\n });\n }\n }\n\n /*\n The reported collisions include elements that were reported in the previous tick to ensure that the case of an\n avatar rising to a negligible distance above the surface and immediately back down onto it does not result in a\n discontinuity in the collision lifecycle. If the element is not colliding in the next frame then it will be\n dropped.\n\n This results in a single tick delay of reporting leave events, but this is a reasonable trade-off to avoid\n flickering collisions.\n */\n const reportedCollidingElements = new Map(collidedElements);\n if (this.previouslyCollidingElements) {\n for (const [element, position] of this.previouslyCollidingElements) {\n if (!reportedCollidingElements.has(element)) {\n reportedCollidingElements.set(element, position);\n }\n }\n }\n\n // Store the elements that were genuinely collided with this tick for the next tick to preserve if they are missed\n this.previouslyCollidingElements = collidedElements;\n this.collisionTrigger.setCurrentCollisions(reportedCollidingElements);\n }\n}\n", "import { PositionAndRotation } from \"@mml-io/mml-web\";\n\nimport { EulXYZ, IVect3, Matr4, Quat, Vect3 } from \"../math\";\n\nconst tempContainerMatrix = new Matr4();\nconst tempTargetMatrix = new Matr4();\nconst tempPositionVector = new Vect3();\nconst tempRotationEuler = new EulXYZ();\nconst tempRotationQuaternion = new Quat();\nconst tempScaleVector = new Vect3();\n\nexport function getRelativePositionAndRotationRelativeToObject(\n positionAndRotation: PositionAndRotation,\n matrix: Matr4,\n localScale: IVect3,\n): PositionAndRotation {\n const { x, y, z } = positionAndRotation.position;\n const { x: rx, y: ry, z: rz } = positionAndRotation.rotation;\n\n tempContainerMatrix.copy(matrix).invert();\n\n tempPositionVector.set(x, y, z);\n tempRotationEuler.set(rx, ry, rz);\n tempRotationQuaternion.setFromEulerXYZ(tempRotationEuler);\n tempScaleVector.set(1, 1, 1);\n\n tempTargetMatrix.compose(tempPositionVector, tempRotationQuaternion, tempScaleVector);\n tempTargetMatrix.premultiply(tempContainerMatrix);\n tempTargetMatrix.decompose(tempPositionVector, tempRotationQuaternion, tempScaleVector);\n\n tempRotationEuler.setFromQuaternion(tempRotationQuaternion);\n\n tempPositionVector.multiply(localScale);\n\n return {\n position: {\n x: tempPositionVector.x,\n y: tempPositionVector.y,\n z: tempPositionVector.z,\n },\n rotation: {\n x: tempRotationEuler.x,\n y: tempRotationEuler.y,\n z: tempRotationEuler.z,\n },\n };\n}\n", "import { LoadingProgressManager } from \"@mml-io/mml-web\";\n\nexport type LoadingScreenConfig = {\n background?: string;\n backgroundImageUrl?: string;\n backgroundBlurAmount?: number;\n overlayLayers?: Array<{\n overlayImageUrl: string;\n overlayAnchor: \"top-left\" | \"top-right\" | \"bottom-left\" | \"bottom-right\";\n overlayOffset?: { x: number; y: number };\n }>;\n title?: string;\n subtitle?: string;\n color?: string;\n};\n\nexport class LoadingScreen {\n public readonly element: HTMLDivElement;\n\n private readonly backgroundBlur: HTMLDivElement;\n\n private overlayLayers: HTMLDivElement[] = [];\n\n private loadingBanner: HTMLDivElement;\n private loadingBannerTitle: HTMLDivElement;\n private loadingBannerSubtitle: HTMLDivElement;\n\n private progressBarBackground: HTMLDivElement;\n private progressBarHolder: HTMLDivElement;\n private progressBar: HTMLDivElement;\n private loadingStatusText: HTMLDivElement;\n\n private progressDebugViewHolder: HTMLDivElement;\n private progressDebugView: HTMLDivElement;\n private progressDebugElement: HTMLPreElement;\n\n private debugLabel: HTMLLabelElement;\n private debugCheckbox: HTMLInputElement;\n\n private hasCompleted = false;\n private loadingCallback: () => void;\n private disposed: boolean = false;\n\n constructor(\n private loadingProgressManager: LoadingProgressManager,\n private config?: LoadingScreenConfig,\n ) {\n const defaultBackground = \"linear-gradient(45deg, #28284B 0%, #303056 100%)\";\n this.element = document.createElement(\"div\");\n this.element.id = \"loading-screen\";\n\n this.element.style.position = \"absolute\";\n this.element.style.top = \"0\";\n this.element.style.left = \"0\";\n this.element.style.width = \"100%\";\n this.element.style.height = \"100%\";\n this.element.style.backgroundColor = this.config?.background || defaultBackground;\n this.element.style.background = this.config?.background || defaultBackground;\n this.element.style.zIndex = \"10001\";\n\n this.backgroundBlur = document.createElement(\"div\");\n this.backgroundBlur.id = \"loading-screen-blur\";\n this.backgroundBlur.style.position = \"absolute\";\n this.backgroundBlur.style.top = \"0\";\n this.backgroundBlur.style.left = \"0\";\n this.backgroundBlur.style.width = \"100%\";\n this.backgroundBlur.style.height = \"100%\";\n this.backgroundBlur.style.display = \"flex\";\n if (this.config?.backgroundBlurAmount) {\n this.backgroundBlur.style.backdropFilter = `blur(${this.config.backgroundBlurAmount}px)`;\n }\n this.element.append(this.backgroundBlur);\n\n if (this.config?.backgroundImageUrl) {\n this.element.style.backgroundImage = `url(${this.config.backgroundImageUrl})`;\n this.element.style.backgroundPosition = \"center\";\n this.element.style.backgroundSize = \"cover\";\n }\n\n if (this.config?.overlayLayers) {\n const logLoadError = (imageUrl: string) => {\n console.error(`Failed to load overlay image: ${imageUrl}`);\n };\n\n for (const layer of this.config.overlayLayers) {\n const overlayLayer = document.createElement(\"div\");\n overlayLayer.style.position = \"absolute\";\n overlayLayer.style.background = `url(${layer.overlayImageUrl}) no-repeat`;\n overlayLayer.style.backgroundSize = \"contain\";\n\n const anchor = layer.overlayAnchor;\n const offsetX = layer.overlayOffset?.x || 0;\n const offsetY = layer.overlayOffset?.y || 0;\n\n if (anchor.includes(\"top\")) {\n overlayLayer.style.top = `${offsetY}px`;\n } else if (anchor.includes(\"bottom\")) {\n overlayLayer.style.bottom = `${offsetY}px`;\n }\n\n if (anchor.includes(\"left\")) {\n overlayLayer.style.left = `${offsetX}px`;\n } else if (anchor.includes(\"right\")) {\n overlayLayer.style.right = `${offsetX}px`;\n }\n\n const image = new Image();\n image.src = layer.overlayImageUrl;\n image.onload = () => {\n const naturalWidth = image.naturalWidth;\n const naturalHeight = image.naturalHeight;\n\n overlayLayer.style.width = `${naturalWidth}px`;\n overlayLayer.style.height = `${naturalHeight}px`;\n };\n\n image.onerror = () => logLoadError(layer.overlayImageUrl);\n\n this.overlayLayers.push(overlayLayer);\n this.backgroundBlur.append(overlayLayer);\n }\n }\n\n this.element.style.color = this.config?.color || \"white\";\n\n this.loadingBanner = document.createElement(\"div\");\n this.loadingBanner.style.position = \"absolute\";\n this.loadingBanner.style.display = \"flex\";\n this.loadingBanner.style.flexDirection = \"column\";\n this.loadingBanner.style.left = \"0\";\n this.loadingBanner.style.bottom = \"0\";\n this.loadingBanner.style.padding = \"0\";\n this.loadingBanner.style.width = \"100%\";\n this.loadingBanner.style.justifyContent = \"flex-end\";\n this.backgroundBlur.append(this.loadingBanner);\n\n if (this.config?.title) {\n this.loadingBannerTitle = document.createElement(\"div\");\n this.loadingBannerTitle.textContent = this.config.title;\n this.loadingBannerTitle.style.color = this.config?.color || \"white\";\n this.loadingBannerTitle.style.paddingLeft = \"40px\";\n this.loadingBannerTitle.style.paddingRight = \"40px\";\n this.loadingBannerTitle.style.fontSize = \"42px\";\n this.loadingBannerTitle.style.fontWeight = \"bold\";\n this.loadingBannerTitle.style.fontFamily = \"sans-serif\";\n if (this.config?.background) {\n this.loadingBannerTitle.style.textShadow = `0px 0px 80px ${this.config.background}`;\n }\n this.loadingBanner.append(this.loadingBannerTitle);\n }\n\n if (this.config?.subtitle) {\n this.loadingBannerSubtitle = document.createElement(\"div\");\n this.loadingBannerSubtitle.style.color = this.config?.color || \"white\";\n this.loadingBannerSubtitle.style.paddingLeft = \"40px\";\n this.loadingBannerSubtitle.style.paddingRight = \"40px\";\n this.loadingBannerSubtitle.style.fontSize = \"16px\";\n this.loadingBannerSubtitle.style.fontWeight = \"400\";\n this.loadingBannerSubtitle.style.fontFamily = \"sans-serif\";\n this.loadingBannerSubtitle.style.marginTop = \"12px\";\n if (this.config?.background) {\n this.loadingBannerSubtitle.style.textShadow = `0px 0px 40px ${this.config.background}`;\n }\n\n this.loadingBannerSubtitle.textContent = this.config.subtitle;\n this.loadingBanner.append(this.loadingBannerSubtitle);\n }\n\n this.progressDebugViewHolder = document.createElement(\"div\");\n this.progressDebugViewHolder.style.display = \"none\";\n this.progressDebugViewHolder.style.position = \"absolute\";\n this.progressDebugViewHolder.style.width = \"calc(100% - 80px)\";\n this.progressDebugViewHolder.style.maxHeight = \"calc(100% - 120px)\";\n this.progressDebugViewHolder.style.left = \"40px\";\n this.progressDebugViewHolder.style.bottom = \"60px\";\n this.progressDebugViewHolder.style.alignItems = \"center\";\n this.progressDebugViewHolder.style.justifyContent = \"center\";\n this.progressDebugViewHolder.style.zIndex = \"10003\";\n this.element.append(this.progressDebugViewHolder);\n\n this.progressDebugView = document.createElement(\"div\");\n this.progressDebugView.style.backgroundColor = \"rgba(128, 128, 128, 0.5)\";\n this.progressDebugView.style.border = \"1px solid black\";\n this.progressDebugView.style.borderRadius = \"7px\";\n this.progressDebugView.style.width = \"100%\";\n this.progressDebugView.style.maxWidth = \"100%\";\n this.progressDebugView.style.overflow = \"auto\";\n this.progressDebugViewHolder.append(this.progressDebugView);\n\n this.debugCheckbox = document.createElement(\"input\");\n this.debugCheckbox.type = \"checkbox\";\n this.debugCheckbox.checked = false;\n this.debugCheckbox.addEventListener(\"change\", () => {\n this.progressDebugElement.style.display = this.debugCheckbox.checked ? \"block\" : \"none\";\n this.loadingBannerTitle.style.display = this.debugCheckbox.checked ? \"none\" : \"flex\";\n this.loadingBannerSubtitle.style.display = this.debugCheckbox.checked ? \"none\" : \"flex\";\n if (this.hasCompleted) {\n this.dispose();\n }\n });\n\n this.debugLabel = document.createElement(\"label\");\n this.debugLabel.textContent = \"Debug loading\";\n this.debugLabel.style.fontFamily = \"sans-serif\";\n this.debugLabel.style.padding = \"5px\";\n this.debugLabel.style.display = \"inline-block\";\n this.debugLabel.style.userSelect = \"none\";\n this.debugLabel.append(this.debugCheckbox);\n this.progressDebugView.append(this.debugLabel);\n\n this.progressDebugElement = document.createElement(\"pre\");\n this.progressDebugElement.style.margin = \"0\";\n this.progressDebugElement.style.display = this.debugCheckbox.checked ? \"block\" : \"none\";\n this.progressDebugView.append(this.progressDebugElement);\n\n this.progressBarHolder = document.createElement(\"div\");\n this.progressBarHolder.style.display = \"flex\";\n this.progressBarHolder.style.alignItems = \"start\";\n this.progressBarHolder.style.justifyContent = \"flex-start\";\n this.progressBarHolder.style.width = \"100%\";\n this.progressBarHolder.style.marginLeft = \"40px\";\n this.progressBarHolder.style.marginBottom = \"40px\";\n this.progressBarHolder.style.cursor = \"pointer\";\n this.progressBarHolder.style.marginTop = \"24px\";\n this.loadingBanner.append(this.progressBarHolder);\n\n this.progressBarBackground = document.createElement(\"div\");\n this.progressBarBackground.style.position = \"relative\";\n this.progressBarBackground.style.width = \"80%\";\n this.progressBarBackground.style.maxWidth = \"400px\";\n this.progressBarBackground.style.minWidth = \"240px\";\n this.progressBarBackground.style.backgroundColor = \"rgba(32,32,32, 0.25)\";\n this.progressBarBackground.style.backdropFilter = \"blur(4px)\";\n this.progressBarBackground.style.height = \"16px\";\n this.progressBarBackground.style.lineHeight = \"16px\";\n this.progressBarBackground.style.borderRadius = \"16px\";\n this.progressBarBackground.style.overflow = \"hidden\";\n this.progressBarBackground.addEventListener(\"click\", () => {\n const display = this.progressDebugViewHolder.style.display;\n if (display === \"none\") {\n this.progressDebugViewHolder.style.display = \"flex\";\n } else {\n this.progressDebugViewHolder.style.display = \"none\";\n this.debugCheckbox.checked = false;\n this.progressDebugElement.style.display = this.debugCheckbox.checked ? \"block\" : \"none\";\n this.loadingBannerTitle.style.display = this.debugCheckbox.checked ? \"none\" : \"flex\";\n }\n });\n this.progressBarHolder.append(this.progressBarBackground);\n\n this.progressBar = document.createElement(\"div\");\n this.progressBar.style.position = \"absolute\";\n this.progressBar.style.top = \"0\";\n this.progressBar.style.left = \"0\";\n this.progressBar.style.width = \"0\";\n this.progressBar.style.height = \"100%\";\n this.progressBar.style.pointerEvents = \"none\";\n this.progressBar.style.backgroundColor = this.config?.color || \"#0050a4\";\n this.progressBarBackground.append(this.progressBar);\n\n this.loadingStatusText = document.createElement(\"div\");\n this.loadingStatusText.style.position = \"absolute\";\n this.loadingStatusText.style.top = \"0\";\n this.loadingStatusText.style.left = \"0\";\n this.loadingStatusText.style.width = \"100%\";\n this.loadingStatusText.style.height = \"100%\";\n this.loadingStatusText.style.color = \"rgba(200,200,200,0.9)\";\n this.loadingStatusText.style.fontSize = \"10px\";\n this.loadingStatusText.style.textAlign = \"center\";\n this.loadingStatusText.style.verticalAlign = \"middle\";\n this.loadingStatusText.style.mixBlendMode = \"difference\";\n this.loadingStatusText.style.fontFamily = \"sans-serif\";\n this.loadingStatusText.style.fontWeight = \"bold\";\n this.loadingStatusText.style.userSelect = \"none\";\n this.loadingStatusText.textContent = \"Loading...\";\n this.progressBarBackground.append(this.loadingStatusText);\n\n this.loadingCallback = () => {\n const [loadingRatio, completedLoading] = this.loadingProgressManager.toRatio();\n if (completedLoading) {\n if (!this.hasCompleted) {\n this.hasCompleted = true;\n if (!this.debugCheckbox.checked) {\n this.dispose();\n }\n }\n this.loadingStatusText.textContent = \"Completed\";\n this.progressBar.style.width = \"100%\";\n } else {\n this.loadingStatusText.textContent = `${(loadingRatio * 100).toFixed(2)}%`;\n this.progressBar.style.width = `${loadingRatio * 100}%`;\n }\n this.progressDebugElement.textContent = LoadingProgressManager.LoadingProgressSummaryToString(\n this.loadingProgressManager.toSummary(),\n );\n };\n\n this.loadingProgressManager.addProgressCallback(this.loadingCallback);\n }\n\n public dispose() {\n if (this.disposed) {\n return;\n }\n this.disposed = true;\n this.loadingProgressManager.removeProgressCallback(this.loadingCallback);\n this.element.remove();\n }\n}\n", "export class ErrorScreen {\n public readonly element: HTMLDivElement;\n\n private titleBannerText: HTMLDivElement;\n private messageText: HTMLDivElement;\n\n constructor(title: string, message: string) {\n this.element = document.createElement(\"div\");\n this.element.style.position = \"absolute\";\n this.element.style.top = \"0\";\n this.element.style.left = \"0\";\n this.element.style.display = \"flex\";\n this.element.style.alignItems = \"center\";\n this.element.style.justifyContent = \"center\";\n this.element.style.flexDirection = \"column\";\n this.element.style.width = \"100%\";\n this.element.style.height = \"100%\";\n this.element.style.zIndex = \"10000\";\n this.element.style.background = \"linear-gradient(45deg, #111111 0%, #444444 100%)\";\n this.element.style.color = \"white\";\n\n this.titleBannerText = document.createElement(\"div\");\n this.titleBannerText.textContent = title;\n this.titleBannerText.style.fontSize = \"40px\";\n this.titleBannerText.style.fontWeight = \"bold\";\n this.titleBannerText.style.fontFamily = \"sans-serif\";\n this.element.append(this.titleBannerText);\n\n this.messageText = document.createElement(\"div\");\n this.messageText.style.textAlign = \"center\";\n this.messageText.style.fontFamily = \"sans-serif\";\n this.messageText.style.fontWeight = \"bold\";\n this.messageText.textContent = message;\n this.element.append(this.messageText);\n }\n\n public dispose() {\n this.element.remove();\n }\n}\n", "import * as EssentialsPlugin from \"@tweakpane/plugin-essentials\";\nimport { Pane } from \"tweakpane\";\n\nimport { CameraManager } from \"../camera/CameraManager\";\nimport { LocalController } from \"../character/LocalController\";\nimport { EventHandlerCollection } from \"../input/EventHandlerCollection\";\n\nimport { CameraFolder, CameraValues } from \"./blades/cameraFolder\";\nimport {\n CharacterControlsFolder,\n CharacterControllerValues,\n} from \"./blades/characterControlsFolder\";\nimport { setTweakpaneActive } from \"./tweakPaneActivity\";\nimport { tweakPaneStyle } from \"./tweakPaneStyle\";\n\nexport type TweakPaneConfig = {\n cameraValues: CameraValues;\n characterControllerValues: CharacterControllerValues;\n};\n\nexport class TweakPane {\n private gui: Pane;\n\n private camera: CameraFolder;\n private characterControls: CharacterControlsFolder;\n\n private saveVisibilityInLocalStorage: boolean = true;\n private tweakPaneWrapper: HTMLDivElement;\n private eventHandlerCollection: EventHandlerCollection;\n\n constructor(\n holderElement: HTMLElement,\n config: TweakPaneConfig,\n public guiVisible: boolean = false,\n ) {\n this.tweakPaneWrapper = document.createElement(\"div\");\n this.tweakPaneWrapper.style.position = \"fixed\";\n this.tweakPaneWrapper.style.width = \"400px\";\n this.tweakPaneWrapper.style.height = \"100%\";\n this.tweakPaneWrapper.style.top = \"0px\";\n this.tweakPaneWrapper.style.right = \"calc(-50vw)\";\n this.tweakPaneWrapper.style.zIndex = \"99\";\n this.tweakPaneWrapper.style.overflow = \"auto\";\n this.tweakPaneWrapper.style.backgroundColor = \"rgba(0, 0, 0, 0.66)\";\n this.tweakPaneWrapper.style.paddingLeft = \"5px\";\n this.tweakPaneWrapper.style.boxShadow = \"-7px 0px 12px rgba(0, 0, 0, 0.5)\";\n this.tweakPaneWrapper.style.transition = \"right cubic-bezier(0.83, 0, 0.17, 1) 0.7s\";\n holderElement.appendChild(this.tweakPaneWrapper);\n\n this.gui = new Pane({ container: this.tweakPaneWrapper! });\n this.gui.registerPlugin(EssentialsPlugin);\n\n if (this.saveVisibilityInLocalStorage) {\n const localStorageGuiVisible = localStorage.getItem(\"guiVisible\");\n if (localStorageGuiVisible !== null) {\n if (localStorageGuiVisible === \"true\") {\n this.guiVisible = true;\n } else if (localStorageGuiVisible === \"false\") {\n this.guiVisible = false;\n }\n }\n }\n\n const styleElement = document.createElement(\"style\");\n styleElement.type = \"text/css\";\n styleElement.appendChild(document.createTextNode(tweakPaneStyle));\n document.head.appendChild(styleElement);\n\n this.camera = new CameraFolder(this.gui, config.cameraValues);\n this.characterControls = new CharacterControlsFolder(\n this.gui,\n config.characterControllerValues,\n false,\n );\n\n const exportFolder = this.gui.addFolder({ title: \"import / export\", expanded: false });\n const exportButton = exportFolder.addButton({ title: \"export\" });\n exportButton.on(\"click\", () => {\n this.downloadSettingsAsJSON(this.gui.exportState());\n });\n const importButton = exportFolder.addButton({ title: \"import\" });\n importButton.on(\"click\", () => {\n this.importSettingsFromJSON((settings) => {\n this.gui.importState(settings);\n });\n });\n\n this.eventHandlerCollection = new EventHandlerCollection();\n\n const gui = this.gui as any;\n const paneElement: HTMLElement = gui.containerElem_;\n paneElement.style.right = this.guiVisible ? \"0px\" : \"-450px\";\n this.eventHandlerCollection.add(this.gui.element, \"mouseenter\", () => setTweakpaneActive(true));\n this.eventHandlerCollection.add(this.gui.element, \"mousemove\", () => setTweakpaneActive(true));\n this.eventHandlerCollection.add(this.gui.element, \"mousedown\", () => setTweakpaneActive(true));\n this.eventHandlerCollection.add(this.gui.element, \"mouseleave\", () =>\n setTweakpaneActive(false),\n );\n this.eventHandlerCollection.add(this.gui.element, \"mouseup\", () => setTweakpaneActive(false));\n this.eventHandlerCollection.add(window, \"keydown\", (e) => {\n this.processKey(e);\n });\n\n this.updateVisibility();\n }\n\n private processKey(e: KeyboardEvent): void {\n if (e.key === \"p\") {\n this.toggleGUI();\n }\n }\n\n public dispose() {\n this.eventHandlerCollection.clear();\n this.gui.dispose();\n this.tweakPaneWrapper.remove();\n }\n\n public setupCamPane(cameraManager: CameraManager) {\n this.camera.setupChangeEvent(cameraManager);\n }\n\n public setupCharacterController(localController: LocalController) {\n this.characterControls.setupChangeEvent(localController);\n }\n\n public updateCameraData(cameraManager: CameraManager) {\n this.camera.update(cameraManager);\n }\n\n public updateCharacterData(localController: LocalController) {\n this.characterControls.update(localController);\n }\n\n private formatDateForFilename(): string {\n const date = new Date();\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, \"0\"); // Months are 0-11\n const day = String(date.getDate()).padStart(2, \"0\");\n const hours = String(date.getHours()).padStart(2, \"0\");\n const minutes = String(date.getMinutes()).padStart(2, \"0\");\n const seconds = String(date.getSeconds()).padStart(2, \"0\");\n return `${year}-${month}-${day} ${hours}-${minutes}-${seconds}`;\n }\n\n private downloadSettingsAsJSON(settings: any): void {\n const jsonString = JSON.stringify(settings, null, 2);\n const blob = new Blob([jsonString], { type: \"application/json\" });\n const url = URL.createObjectURL(blob);\n const a = document.createElement(\"a\");\n a.download = `settings ${this.formatDateForFilename()}.json`;\n a.href = url;\n a.click();\n URL.revokeObjectURL(url);\n }\n\n private importSettingsFromJSON(callback: (settings: any) => void): void {\n const input = document.createElement(\"input\");\n input.type = \"file\";\n input.accept = \".json\";\n input.addEventListener(\"change\", (event) => {\n const file = (event.target as HTMLInputElement).files?.[0];\n if (file) {\n const reader = new FileReader();\n reader.onload = (loadEvent) => {\n try {\n const settings = JSON.parse(loadEvent.target?.result as string);\n callback(settings);\n } catch (err) {\n console.error(\"Error parsing JSON:\", err);\n }\n };\n reader.readAsText(file);\n }\n });\n input.click();\n }\n\n private toggleGUI(): void {\n this.guiVisible = !this.guiVisible;\n this.updateVisibility();\n }\n\n public setVisible(visible: boolean): void {\n this.guiVisible = visible;\n this.updateVisibility();\n }\n\n private updateVisibility(): void {\n const gui = this.gui as any;\n const paneElement: HTMLElement = gui.containerElem_;\n paneElement.style.right = this.guiVisible ? \"0px\" : \"-450px\";\n if (this.saveVisibilityInLocalStorage) {\n localStorage.setItem(\"guiVisible\", this.guiVisible === true ? \"true\" : \"false\");\n }\n }\n}\n", "import { BladeController, View } from \"@tweakpane/core\";\nimport { BladeApi, FolderApi, TpChangeEvent } from \"tweakpane\";\n\nimport { CameraManager } from \"../../camera/CameraManager\";\n\nexport type CameraValues = {\n initialDistance: number;\n minDistance: number;\n maxDistance: number;\n initialFOV: number;\n maxFOV: number;\n minFOV: number;\n invertFOVMapping: boolean;\n damping: number;\n zoomScale: number;\n zoomDamping: number;\n};\n\nexport function createDefaultCameraValues(): CameraValues {\n return {\n initialDistance: 3.3,\n minDistance: 0.1,\n maxDistance: 5,\n initialFOV: 60,\n maxFOV: 70,\n minFOV: 60,\n invertFOVMapping: false,\n damping: 0.21,\n zoomScale: 0.04,\n zoomDamping: 0.04,\n };\n}\n\nconst camOptions = {\n initialDistance: { min: 1, max: 5, step: 0.1 },\n minDistance: { min: 0.1, max: 2, step: 0.1 },\n maxDistance: { min: 5, max: 20, step: 0.5 },\n initialFOV: { min: 60, max: 85, step: 1 },\n maxFOV: { min: 50, max: 100, step: 1 },\n minFOV: { min: 50, max: 100, step: 1 },\n damping: { min: 0.01, max: 1, step: 0.001 },\n zoomScale: { min: 0.005, max: 0.3, step: 0.001 },\n zoomDamping: { min: 0.0, max: 2.0, step: 0.01 },\n};\n\ntype CamData = {\n distance: string;\n FoV: string;\n};\n\nexport class CameraFolder {\n public folder: FolderApi;\n\n private camData: CamData = {\n distance: \"0\",\n FoV: \"0\",\n };\n\n constructor(\n parentFolder: FolderApi,\n private cameraValues: CameraValues,\n ) {\n this.folder = parentFolder.addFolder({ title: \"camera\", expanded: false });\n this.folder.addBinding(this.camData, \"distance\", { readonly: true });\n this.folder.addBinding(this.camData, \"FoV\", { readonly: true });\n this.folder.addBinding(this.cameraValues, \"initialDistance\", camOptions.initialDistance);\n this.folder.addBinding(this.cameraValues, \"minDistance\", camOptions.minDistance);\n this.folder.addBinding(this.cameraValues, \"maxDistance\", camOptions.maxDistance);\n this.folder.addBinding(this.cameraValues, \"minFOV\", camOptions.minFOV);\n this.folder.addBinding(this.cameraValues, \"maxFOV\", camOptions.maxFOV);\n this.folder.addBinding(this.cameraValues, \"invertFOVMapping\");\n this.folder.addBinding(this.cameraValues, \"damping\", camOptions.damping);\n this.folder.addBinding(this.cameraValues, \"zoomScale\", camOptions.zoomScale);\n this.folder.addBinding(this.cameraValues, \"zoomDamping\", camOptions.zoomDamping);\n }\n\n public setupChangeEvent(cameraManager: CameraManager): void {\n this.folder.on(\"change\", (e: TpChangeEvent<unknown, BladeApi<BladeController<View>>>) => {\n const target = (e.target as any).key;\n if (!target) return;\n switch (target) {\n case \"initialDistance\": {\n const value = e.value as number;\n cameraManager.initialDistance = value;\n cameraManager.distance = value;\n cameraManager.targetDistance = value;\n cameraManager.desiredDistance = value;\n cameraManager.recomputeFoV();\n break;\n }\n case \"minDistance\": {\n const value = e.value as number;\n cameraManager.minDistance = value;\n cameraManager.distance = value;\n cameraManager.targetDistance = value;\n cameraManager.desiredDistance = value;\n cameraManager.recomputeFoV();\n break;\n }\n case \"maxDistance\": {\n const value = e.value as number;\n cameraManager.maxDistance = value;\n cameraManager.distance = value;\n cameraManager.targetDistance = value;\n cameraManager.desiredDistance = value;\n cameraManager.recomputeFoV();\n break;\n }\n case \"minFOV\": {\n const value = e.value as number;\n cameraManager.minFOV = value;\n cameraManager.recomputeFoV();\n break;\n }\n case \"maxFOV\": {\n const value = e.value as number;\n cameraManager.maxFOV = value;\n cameraManager.recomputeFoV();\n break;\n }\n case \"invertFOVMapping\": {\n const boolValue = e.value as boolean;\n cameraManager.invertFOVMapping = boolValue;\n break;\n }\n case \"damping\": {\n const value = e.value as number;\n cameraManager.damping = value;\n break;\n }\n case \"zoomScale\": {\n const value = e.value as number;\n cameraManager.zoomScale = value;\n break;\n }\n case \"zoomDamping\": {\n const value = e.value as number;\n cameraManager.zoomDamping = value;\n break;\n }\n default:\n break;\n }\n });\n }\n\n public update(cameraManager: CameraManager): void {\n this.camData.distance = cameraManager.distance.toFixed(2);\n this.camData.FoV = cameraManager.fov.toFixed(2);\n }\n}\n", "import { BladeController, View } from \"@tweakpane/core\";\nimport { BladeApi, FolderApi, TpChangeEvent } from \"tweakpane\";\n\nimport { LocalController } from \"../../character/LocalController\";\n\nexport type CharacterControllerValues = {\n gravity: number;\n jumpForce: number;\n doubleJumpForce: number;\n coyoteJump: number;\n airResistance: number;\n groundResistance: number;\n airControlModifier: number;\n groundWalkControl: number;\n groundRunControl: number;\n baseControlMultiplier: number;\n minimumSurfaceAngle: number;\n};\n\nexport function createDefaultCharacterControllerValues(): CharacterControllerValues {\n return {\n gravity: 37,\n jumpForce: 17,\n doubleJumpForce: 16.7,\n coyoteJump: 120,\n airResistance: 0.5,\n groundResistance: 0,\n airControlModifier: 0.05,\n groundWalkControl: 0.625,\n groundRunControl: 0.8,\n baseControlMultiplier: 200,\n minimumSurfaceAngle: 0.905,\n };\n}\n\nconst characterControllerOptions = {\n gravity: { min: 1, max: 100, step: 0.05 },\n jumpForce: { min: 1, max: 50, step: 0.05 },\n doubleJumpForce: { min: 1, max: 50, step: 0.05 },\n coyoteJump: { min: 60, max: 200, step: 1 },\n airResistance: { min: 0.01, max: 0.9, step: 0.01 },\n groundResistance: { min: -100, max: 0, step: 1 },\n airControlModifier: { min: 0.001, max: 0.15, step: 0.01 },\n groundWalkControl: { min: 0.1, max: 1.5, step: 0.01 },\n groundRunControl: { min: 0.5, max: 2.0, step: 0.01 },\n baseControlMultiplier: { min: 150, max: 300, step: 1 },\n minimumSurfaceAngle: { min: 0.254, max: 1, step: 0.001 },\n};\n\ntype CharacterData = {\n position: string;\n onGround: string;\n canJump: string;\n canDoubleJump: string;\n jumpCount: string;\n coyoteTime: string;\n coyoteJumped: string;\n};\n\nexport class CharacterControlsFolder {\n public folder: FolderApi;\n\n private characterData: CharacterData = {\n position: \"(0, 0, 0)\",\n onGround: \"false\",\n canJump: \"false\",\n canDoubleJump: \"false\",\n jumpCount: \"0\",\n coyoteTime: \"false\",\n coyoteJumped: \"false\",\n };\n\n constructor(\n parentFolder: FolderApi,\n private controllerValues: CharacterControllerValues,\n expand: boolean = false,\n ) {\n this.folder = parentFolder.addFolder({ title: \"character\", expanded: expand });\n this.folder.addBinding(this.characterData, \"position\", { readonly: true });\n this.folder.addBinding(this.characterData, \"onGround\", { readonly: true });\n this.folder.addBinding(this.characterData, \"canJump\", { readonly: true });\n this.folder.addBinding(this.characterData, \"canDoubleJump\", { readonly: true });\n this.folder.addBinding(this.characterData, \"jumpCount\", { readonly: true });\n this.folder.addBinding(this.characterData, \"coyoteTime\", { readonly: true });\n this.folder.addBinding(this.characterData, \"coyoteJumped\", { readonly: true });\n this.folder.addBinding(this.controllerValues, \"gravity\", characterControllerOptions.gravity);\n this.folder.addBinding(\n this.controllerValues,\n \"jumpForce\",\n characterControllerOptions.jumpForce,\n );\n this.folder.addBinding(\n this.controllerValues,\n \"doubleJumpForce\",\n characterControllerOptions.doubleJumpForce,\n );\n this.folder.addBinding(\n this.controllerValues,\n \"coyoteJump\",\n characterControllerOptions.coyoteJump,\n );\n this.folder.addBinding(\n this.controllerValues,\n \"airResistance\",\n characterControllerOptions.airResistance,\n );\n this.folder.addBinding(\n this.controllerValues,\n \"groundResistance\",\n characterControllerOptions.groundResistance,\n );\n this.folder.addBinding(\n this.controllerValues,\n \"airControlModifier\",\n characterControllerOptions.airControlModifier,\n );\n this.folder.addBinding(\n this.controllerValues,\n \"groundWalkControl\",\n characterControllerOptions.groundWalkControl,\n );\n this.folder.addBinding(\n this.controllerValues,\n \"groundRunControl\",\n characterControllerOptions.groundRunControl,\n );\n this.folder.addBinding(\n this.controllerValues,\n \"baseControlMultiplier\",\n characterControllerOptions.baseControlMultiplier,\n );\n this.folder.addBinding(\n this.controllerValues,\n \"minimumSurfaceAngle\",\n characterControllerOptions.minimumSurfaceAngle,\n );\n }\n\n public setupChangeEvent(localController: LocalController): void {\n this.folder.on(\"change\", (e: TpChangeEvent<unknown, BladeApi<BladeController<View>>>) => {\n const target = (e.target as any).key;\n if (!target) return;\n switch (target) {\n case \"gravity\": {\n const value = e.value as number;\n localController.gravity = value * -1;\n break;\n }\n case \"jumpForce\": {\n const value = e.value as number;\n localController.jumpForce = value;\n break;\n }\n case \"doubleJumpForce\": {\n const value = e.value as number;\n localController.doubleJumpForce = value;\n break;\n }\n case \"coyoteJump\": {\n const value = e.value as number;\n localController.coyoteTimeThreshold = value;\n break;\n }\n case \"airResistance\": {\n const value = e.value as number;\n localController.airResistance = value;\n break;\n }\n case \"groundResistance\": {\n const value = e.value as number;\n localController.groundResistance = 0.99999999 + value * 1e-6;\n break;\n }\n case \"airControlModifier\": {\n const value = e.value as number;\n localController.airControlModifier = value;\n break;\n }\n case \"groundWalkControl\": {\n const value = e.value as number;\n localController.groundWalkControl = value;\n break;\n }\n case \"groundRunControl\": {\n const value = e.value as number;\n localController.groundRunControl = value;\n break;\n }\n case \"baseControlMultiplier\": {\n const value = e.value as number;\n localController.baseControl = value;\n break;\n }\n case \"minimumSurfaceAngle\": {\n const value = e.value as number;\n localController.minimumSurfaceAngle = value;\n break;\n }\n default:\n break;\n }\n });\n }\n\n public update(localController: LocalController): void {\n const { x, y, z } = localController.latestPosition;\n this.characterData.position = `(${x.toFixed(2)}, ${y.toFixed(2)}, ${z.toFixed(2)})`;\n this.characterData.onGround = `${localController.characterOnGround}`;\n this.characterData.canJump = `${localController.canJump || localController.coyoteTime ? \"true\" : \"false\"}`;\n this.characterData.canDoubleJump = `${localController.canDoubleJump}`;\n this.characterData.jumpCount = `${localController.jumpCounter}`;\n this.characterData.coyoteTime = `${localController.coyoteTime}`;\n this.characterData.coyoteJumped = `${localController.coyoteJumped}`;\n }\n}\n", "export const tweakPaneStyle = `\n:root {\n --tp-base-background-color: rgba(12, 12, 12, 0.6);\n --tp-base-shadow-color: hsla(0, 0%, 0%, 0.2);\n --tp-button-background-color: hsla(0, 0%, 80%, 1);\n --tp-button-background-color-active: hsla(0, 0%, 100%, 1);\n --tp-button-background-color-focus: hsla(0, 0%, 95%, 1);\n --tp-button-background-color-hover: hsla(0, 0%, 85%, 1);\n --tp-button-foreground-color: hsla(0, 0%, 0%, 0.7);\n --tp-container-background-color: hsla(0, 0%, 0%, 0.3);\n --tp-container-background-color-active: hsla(0, 0%, 0%, 0.6);\n --tp-container-background-color-focus: hsla(0, 0%, 0%, 0.5);\n --tp-container-background-color-hover: hsla(0, 0%, 0%, 0.4);\n --tp-container-foreground-color: hsla(0, 0%, 90%, 0.6);\n --tp-groove-foreground-color: hsla(0, 0%, 0%, 0.2);\n --tp-input-background-color: hsla(0, 0%, 30%, 0.3);\n --tp-input-background-color-active: hsla(0, 0%, 0%, 0.6);\n --tp-input-background-color-focus: hsla(0, 0%, 0%, 0.5);\n --tp-input-background-color-hover: hsla(0, 0%, 0%, 0.4);\n --tp-input-foreground-color: hsla(0, 0%, 100%, 0.6);\n --tp-label-foreground-color: hsla(0, 0%, 100%, 0.6);\n --tp-monitor-background-color: hsla(0, 0%, 0%, 0.3);\n --tp-monitor-foreground-color: hsla(0, 0%, 100%, 0.3);\n}\n\n.tp-brkv {\n -webkit-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n\n.tp-dfwv {\n z-index: 100;\n color: white;\n width: 600px !important;\n display: none;\n -webkit-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n\n.tp-fldv {\n margin: 1px 0px 0px 0px !important;\n}\n\n.tp-fldv_b {\n overflow: visible !important;\n}\n\n.tp-fldv_t {\n font-size: 13px;\n font-weight: 900;\n color: #ffffff;\n background-color: rgba(70, 70, 70, 0.3);\n border-top: 1px solid rgba(210, 210, 210, 0.1);\n border-radius: 3px;\n}\n\n.tp-lblv_l {\n font-size: 12px;\n padding-left: 0px !important;\n padding-right: 0px !important;\n}\n\n.tp-lblv_v {\n width: 150px;\n}\n\n.tp-sldtxtv_t {\n max-width: 50px;\n}\n\n.tp-sglv_i {\n font-size: 12px;\n color: rgba(255, 255, 255, 0.7);\n}\n\n.tp-ckbv_w {\n border: 1px solid rgba(200, 200, 250, 0.2);\n}\n`;\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["// Largely based on https://github.com/mrdoob/three.js/blob/master/src/math/Quaternion.js\nimport { clamp } from \"../helpers/math-helpers\";\n\nimport { Matr4 } from \"./Matr4\";\n\nexport type IQuat = { x: number; y: number; z: number; w: number };\n\nexport class Quat {\n public x: number;\n public y: number;\n public z: number;\n public w: number;\n\n constructor(x: number = 0, y: number = 0, z: number = 0, w: number = 1) {\n this.x = x;\n this.y = y;\n this.z = z;\n this.w = w;\n }\n\n copy(other: { x?: number; y?: number; z?: number; w?: number }): this {\n this.x = other.x || 0;\n this.y = other.y || 0;\n this.z = other.z || 0;\n this.w = other.w || 0;\n return this;\n }\n\n multiply(q: { x: number; y: number; z: number; w: number }): this {\n return this.multiplyQuaternions(this, q);\n }\n\n premultiply(q: { x: number; y: number; z: number; w: number }): this {\n return this.multiplyQuaternions(q, this);\n }\n\n multiplyQuaternions(\n a: { x: number; y: number; z: number; w: number },\n b: { x: number; y: number; z: number; w: number },\n ): this {\n const qax = a.x;\n const qay = a.y;\n const qaz = a.z;\n const qaw = a.w;\n const qbx = b.x;\n const qby = b.y;\n const qbz = b.z;\n const qbw = b.w;\n\n this.x = qax * qbw + qaw * qbx + qay * qbz - qaz * qby;\n this.y = qay * qbw + qaw * qby + qaz * qbx - qax * qbz;\n this.z = qaz * qbw + qaw * qbz + qax * qby - qay * qbx;\n this.w = qaw * qbw - qax * qbx - qay * qby - qaz * qbz;\n\n return this;\n }\n\n setFromEulerXYZ(euler: { x: number; y: number; z: number }): this {\n const x = euler.x;\n const y = euler.y;\n const z = euler.z;\n\n const cos = Math.cos;\n const sin = Math.sin;\n\n const c1 = cos(x / 2);\n const c2 = cos(y / 2);\n const c3 = cos(z / 2);\n\n const s1 = sin(x / 2);\n const s2 = sin(y / 2);\n const s3 = sin(z / 2);\n\n this.x = s1 * c2 * c3 + c1 * s2 * s3;\n this.y = c1 * s2 * c3 - s1 * c2 * s3;\n this.z = c1 * c2 * s3 + s1 * s2 * c3;\n this.w = c1 * c2 * c3 - s1 * s2 * s3;\n\n return this;\n }\n\n setFromRotationMatrix(m: Matr4): this {\n // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n const te = m.data,\n m11 = te[0],\n m12 = te[4],\n m13 = te[8],\n m21 = te[1],\n m22 = te[5],\n m23 = te[9],\n m31 = te[2],\n m32 = te[6],\n m33 = te[10],\n trace = m11 + m22 + m33;\n\n if (trace > 0) {\n const s = 0.5 / Math.sqrt(trace + 1.0);\n\n this.w = 0.25 / s;\n this.x = (m32 - m23) * s;\n this.y = (m13 - m31) * s;\n this.z = (m21 - m12) * s;\n } else if (m11 > m22 && m11 > m33) {\n const s = 2.0 * Math.sqrt(1.0 + m11 - m22 - m33);\n\n this.w = (m32 - m23) / s;\n this.x = 0.25 * s;\n this.y = (m12 + m21) / s;\n this.z = (m13 + m31) / s;\n } else if (m22 > m33) {\n const s = 2.0 * Math.sqrt(1.0 + m22 - m11 - m33);\n\n this.w = (m13 - m31) / s;\n this.x = (m12 + m21) / s;\n this.y = 0.25 * s;\n this.z = (m23 + m32) / s;\n } else {\n const s = 2.0 * Math.sqrt(1.0 + m33 - m11 - m22);\n\n this.w = (m21 - m12) / s;\n this.x = (m13 + m31) / s;\n this.y = (m23 + m32) / s;\n this.z = 0.25 * s;\n }\n\n return this;\n }\n\n setFromAxisAngle(axis: { x: number; y: number; z: number }, angle: number): this {\n // assumes axis is normalized\n\n const halfAngle = angle / 2;\n const s = Math.sin(halfAngle);\n\n this.x = axis.x * s;\n this.y = axis.y * s;\n this.z = axis.z * s;\n this.w = Math.cos(halfAngle);\n\n return this;\n }\n\n clone(): Quat {\n return new Quat(this.x, this.y, this.z, this.w);\n }\n\n set(x: number, y: number, z: number, w: number): this {\n this.x = x;\n this.y = y;\n this.z = z;\n this.w = w;\n return this;\n }\n\n invert() {\n this.x *= -1;\n this.y *= -1;\n this.z *= -1;\n return this;\n }\n\n dot(other: Quat): number {\n return this.x * other.x + this.y * other.y + this.z * other.z + this.w * other.w;\n }\n\n rotateTowards(other: Quat, scalar: number): this {\n const angle = this.angleTo(other);\n\n if (angle === 0) {\n return this;\n }\n\n const t = Math.min(1, scalar / angle);\n\n this.slerp(other, t);\n\n return this;\n }\n\n angleTo(q: Quat): number {\n return 2 * Math.acos(Math.abs(clamp(this.dot(q), -1, 1)));\n }\n\n slerp(qb: Quat, t: number): this {\n if (t <= 0) return this;\n if (t >= 1) return this.copy(qb);\n\n const x1 = this.x,\n y1 = this.y,\n z1 = this.z,\n w1 = this.w;\n let x2 = qb.x,\n y2 = qb.y,\n z2 = qb.z,\n w2 = qb.w;\n\n let cosHalfTheta = w1 * w2 + x1 * x2 + y1 * y2 + z1 * z2;\n\n if (cosHalfTheta < 0) {\n w2 = -w2;\n x2 = -x2;\n y2 = -y2;\n z2 = -z2;\n cosHalfTheta = -cosHalfTheta;\n }\n\n if (cosHalfTheta >= 1.0) {\n return this.set(x1, y1, z1, w1);\n }\n\n const sinHalfTheta = Math.sqrt(1.0 - cosHalfTheta * cosHalfTheta);\n\n if (sinHalfTheta < 0.001) {\n this.w = 0.5 * (w1 + w2);\n this.x = 0.5 * (x1 + x2);\n this.y = 0.5 * (y1 + y2);\n this.z = 0.5 * (z1 + z2);\n return this.normalize();\n }\n\n const halfTheta = Math.acos(cosHalfTheta);\n const ratioA = Math.sin((1 - t) * halfTheta) / sinHalfTheta;\n const ratioB = Math.sin(t * halfTheta) / sinHalfTheta;\n\n this.w = w1 * ratioA + w2 * ratioB;\n this.x = x1 * ratioA + x2 * ratioB;\n this.y = y1 * ratioA + y2 * ratioB;\n this.z = z1 * ratioA + z2 * ratioB;\n\n return this.normalize();\n }\n\n length(): number {\n return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w);\n }\n\n normalize(): this {\n let l = this.length();\n\n if (l === 0) {\n this.x = 0;\n this.y = 0;\n this.z = 0;\n this.w = 1;\n } else {\n l = 1 / l;\n this.x = this.x * l;\n this.y = this.y * l;\n this.z = this.z * l;\n this.w = this.w * l;\n }\n\n return this;\n }\n}\n", "import { EulXYZ } from \"./EulXYZ\";\nimport { Matr4, Matr4Data } from \"./Matr4\";\nimport { IQuat, Quat } from \"./Quat\";\n\nexport type IVect3 = { x: number; y: number; z: number };\n\nconst tempQuaternion = new Quat();\n\nexport class Vect3 {\n constructor(\n public x: number = 0,\n public y: number = 0,\n public z: number = 0,\n ) {}\n\n copy(other: IVect3): this {\n this.x = other.x;\n this.y = other.y;\n this.z = other.z;\n return this;\n }\n\n length(): number {\n return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z);\n }\n\n lengthSquared(): number {\n return this.x * this.x + this.y * this.y + this.z * this.z;\n }\n\n clone(): Vect3 {\n return new Vect3(this.x, this.y, this.z);\n }\n\n set(x: number, y: number, z: number): this {\n this.x = x;\n this.y = y;\n this.z = z;\n return this;\n }\n\n applyEulerXYZ(euler: EulXYZ) {\n return this.applyQuat(tempQuaternion.setFromEulerXYZ(euler));\n }\n\n applyMatrix4(matrix: { data: Matr4Data }): this {\n const x = this.x;\n const y = this.y;\n const z = this.z;\n const e = matrix.data;\n\n const w = 1 / (e[3] * x + e[7] * y + e[11] * z + e[15]);\n\n this.x = (e[0] * x + e[4] * y + e[8] * z + e[12]) * w;\n this.y = (e[1] * x + e[5] * y + e[9] * z + e[13]) * w;\n this.z = (e[2] * x + e[6] * y + e[10] * z + e[14]) * w;\n\n return this;\n }\n\n transformDirection(matrix: Matr4) {\n const x = this.x;\n const y = this.y;\n const z = this.z;\n const e = matrix.data;\n\n this.x = e[0] * x + e[4] * y + e[8] * z;\n this.y = e[1] * x + e[5] * y + e[9] * z;\n this.z = e[2] * x + e[6] * y + e[10] * z;\n\n return this.normalize();\n }\n\n add(other: IVect3) {\n this.x += other.x;\n this.y += other.y;\n this.z += other.z;\n return this;\n }\n\n sub(other: IVect3) {\n this.x -= other.x;\n this.y -= other.y;\n this.z -= other.z;\n return this;\n }\n\n applyQuat(q: IQuat): this {\n const vx = this.x,\n vy = this.y,\n vz = this.z;\n\n const qx = q.x,\n qy = q.y,\n qz = q.z,\n qw = q.w;\n\n const tx = 2 * (qy * vz - qz * vy);\n const ty = 2 * (qz * vx - qx * vz);\n const tz = 2 * (qx * vy - qy * vx);\n\n this.x = vx + qw * tx + qy * tz - qz * ty;\n this.y = vy + qw * ty + qz * tx - qx * tz;\n this.z = vz + qw * tz + qx * ty - qy * tx;\n\n return this;\n }\n\n multiplyScalar(scalar: number) {\n this.x *= scalar;\n this.y *= scalar;\n this.z *= scalar;\n return this;\n }\n\n normalize() {\n return this.multiplyScalar(1 / (this.length() || 1));\n }\n\n addScaledVector(other: Vect3, scalar: number) {\n this.x += other.x * scalar;\n this.y += other.y * scalar;\n this.z += other.z * scalar;\n return this;\n }\n\n distanceTo(other: Vect3): number {\n return Math.sqrt(this.distanceToSquared(other));\n }\n\n distanceToSquared(other: Vect3): number {\n const dx = other.x - this.x;\n const dy = other.y - this.y;\n const dz = other.z - this.z;\n return dx * dx + dy * dy + dz * dz;\n }\n\n applyAxisAngle(axis: IVect3, angle: number) {\n return this.applyQuat(tempQuaternion.setFromAxisAngle(axis, angle));\n }\n\n min(point: IVect3): this {\n this.x = Math.min(this.x, point.x);\n this.y = Math.min(this.y, point.y);\n this.z = Math.min(this.z, point.z);\n return this;\n }\n\n max(point: IVect3): this {\n this.x = Math.max(this.x, point.x);\n this.y = Math.max(this.y, point.y);\n this.z = Math.max(this.z, point.z);\n return this;\n }\n\n subVectors(a: IVect3, b: IVect3): this {\n this.x = a.x - b.x;\n this.y = a.y - b.y;\n this.z = a.z - b.z;\n return this;\n }\n\n dot(v: IVect3): number {\n return this.x * v.x + this.y * v.y + this.z * v.z;\n }\n\n cross(other: Vect3): this {\n return this.crossVectors(this, other);\n }\n\n crossVectors(a: Vect3, b: Vect3) {\n const ax = a.x;\n const ay = a.y;\n const az = a.z;\n const bx = b.x;\n const by = b.y;\n const bz = b.z;\n\n this.x = ay * bz - az * by;\n this.y = az * bx - ax * bz;\n this.z = ax * by - ay * bx;\n\n return this;\n }\n\n subScalar(s: number): this {\n this.x -= s;\n this.y -= s;\n this.z -= s;\n return this;\n }\n\n addScalar(s: number): this {\n this.x += s;\n this.y += s;\n this.z += s;\n return this;\n }\n\n multiply(other: IVect3): this {\n this.x *= other.x;\n this.y *= other.y;\n this.z *= other.z;\n return this;\n }\n\n lerp(target: IVect3, alpha: number): Vect3 {\n this.x += (target.x - this.x) * alpha;\n this.y += (target.y - this.y) * alpha;\n this.z += (target.z - this.z) * alpha;\n return this;\n }\n\n lerpVectors(v1: IVect3, v2: IVect3, alpha: number): Vect3 {\n this.x = v1.x + (v2.x - v1.x) * alpha;\n this.y = v1.y + (v2.y - v1.y) * alpha;\n this.z = v1.z + (v2.z - v1.z) * alpha;\n return this;\n }\n\n toArray(): number[] {\n return [this.x, this.y, this.z];\n }\n}\n", "// Largely based on https://github.com/mrdoob/three.js/blob/master/src/math/Matrix4.js\nimport { Quat } from \"./Quat\";\nimport { IVect3, Vect3 } from \"./Vect3\";\n\nconst Vect3Zeroes = { x: 0, y: 0, z: 0 };\nconst Vect3Ones = { x: 1, y: 1, z: 1 };\n\nexport type Matr4Data = [\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n];\n\nexport class Matr4 {\n static tempMatr4 = new Matr4();\n static tempVect3 = new Vect3();\n static tempQuat = new Quat();\n\n public data: Matr4Data = [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1];\n\n constructor();\n constructor(\n n11: number,\n n12: number,\n n13: number,\n n14: number,\n n21: number,\n n22: number,\n n23: number,\n n24: number,\n n31: number,\n n32: number,\n n33: number,\n n34: number,\n n41: number,\n n42: number,\n n43: number,\n n44: number,\n );\n constructor(\n ...args:\n | []\n | [\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n ]\n ) {\n if (args.length > 0) {\n this.set(\n ...(args as [\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n ]),\n );\n }\n }\n\n identity(): this {\n this.data = [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1];\n return this;\n }\n\n copy(m: Matr4): Matr4 {\n const te = this.data;\n const me = m.data;\n\n te[0] = me[0];\n te[1] = me[1];\n te[2] = me[2];\n te[3] = me[3];\n te[4] = me[4];\n te[5] = me[5];\n te[6] = me[6];\n te[7] = me[7];\n te[8] = me[8];\n te[9] = me[9];\n te[10] = me[10];\n te[11] = me[11];\n te[12] = me[12];\n te[13] = me[13];\n te[14] = me[14];\n te[15] = me[15];\n\n return this;\n }\n\n fromArray(\n data:\n | [\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n ]\n | Float32Array,\n ): this {\n this.data[0] = data[0];\n this.data[1] = data[1];\n this.data[2] = data[2];\n this.data[3] = data[3];\n this.data[4] = data[4];\n this.data[5] = data[5];\n this.data[6] = data[6];\n this.data[7] = data[7];\n this.data[8] = data[8];\n this.data[9] = data[9];\n this.data[10] = data[10];\n this.data[11] = data[11];\n this.data[12] = data[12];\n this.data[13] = data[13];\n this.data[14] = data[14];\n this.data[15] = data[15];\n return this;\n }\n\n set(\n n11: number,\n n12: number,\n n13: number,\n n14: number,\n n21: number,\n n22: number,\n n23: number,\n n24: number,\n n31: number,\n n32: number,\n n33: number,\n n34: number,\n n41: number,\n n42: number,\n n43: number,\n n44: number,\n ): this {\n const te = this.data;\n\n te[0] = n11;\n te[4] = n12;\n te[8] = n13;\n te[12] = n14;\n te[1] = n21;\n te[5] = n22;\n te[9] = n23;\n te[13] = n24;\n te[2] = n31;\n te[6] = n32;\n te[10] = n33;\n te[14] = n34;\n te[3] = n41;\n te[7] = n42;\n te[11] = n43;\n te[15] = n44;\n\n return this;\n }\n\n public setRotationFromQuaternion(q: { x: number; y: number; z: number; w: number }): this {\n return this.compose(Vect3Zeroes, q, Vect3Ones);\n }\n\n clone(): Matr4 {\n return new Matr4().copy(this);\n }\n\n determinant(): number {\n const te = this.data;\n\n const n11 = te[0],\n n12 = te[4],\n n13 = te[8],\n n14 = te[12];\n const n21 = te[1],\n n22 = te[5],\n n23 = te[9],\n n24 = te[13];\n const n31 = te[2],\n n32 = te[6],\n n33 = te[10],\n n34 = te[14];\n const n41 = te[3],\n n42 = te[7],\n n43 = te[11],\n n44 = te[15];\n\n return (\n n41 *\n (+n14 * n23 * n32 -\n n13 * n24 * n32 -\n n14 * n22 * n33 +\n n12 * n24 * n33 +\n n13 * n22 * n34 -\n n12 * n23 * n34) +\n n42 *\n (+n11 * n23 * n34 -\n n11 * n24 * n33 +\n n14 * n21 * n33 -\n n13 * n21 * n34 +\n n13 * n24 * n31 -\n n14 * n23 * n31) +\n n43 *\n (+n11 * n24 * n32 -\n n11 * n22 * n34 -\n n14 * n21 * n32 +\n n12 * n21 * n34 +\n n14 * n22 * n31 -\n n12 * n24 * n31) +\n n44 *\n (-n13 * n22 * n31 -\n n11 * n23 * n32 +\n n11 * n22 * n33 +\n n13 * n21 * n32 -\n n12 * n21 * n33 +\n n12 * n23 * n31)\n );\n }\n\n makeRotationX(theta: number) {\n const c = Math.cos(theta),\n s = Math.sin(theta);\n\n this.set(1, 0, 0, 0, 0, c, -s, 0, 0, s, c, 0, 0, 0, 0, 1);\n\n return this;\n }\n\n makeRotationY(theta: number) {\n const c = Math.cos(theta),\n s = Math.sin(theta);\n\n this.set(c, 0, s, 0, 0, 1, 0, 0, -s, 0, c, 0, 0, 0, 0, 1);\n\n return this;\n }\n\n makeRotationZ(theta: number) {\n const c = Math.cos(theta),\n s = Math.sin(theta);\n\n this.set(c, -s, 0, 0, s, c, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n return this;\n }\n\n makeTranslation(x: number, y: number, z: number) {\n this.set(1, 0, 0, x, 0, 1, 0, y, 0, 0, 1, z, 0, 0, 0, 1);\n return this;\n }\n\n makeScale(x: number, y: number, z: number) {\n this.set(x, 0, 0, 0, 0, y, 0, 0, 0, 0, z, 0, 0, 0, 0, 1);\n return this;\n }\n\n compose(\n position: { x: number; y: number; z: number },\n quaternion: { x: number; y: number; z: number; w: number },\n scale: { x: number; y: number; z: number },\n ): this {\n const te = this.data;\n\n const x = quaternion.x,\n y = quaternion.y,\n z = quaternion.z,\n w = quaternion.w;\n const x2 = x + x,\n y2 = y + y,\n z2 = z + z;\n const xx = x * x2,\n xy = x * y2,\n xz = x * z2;\n const yy = y * y2,\n yz = y * z2,\n zz = z * z2;\n const wx = w * x2,\n wy = w * y2,\n wz = w * z2;\n\n const sx = scale.x,\n sy = scale.y,\n sz = scale.z;\n\n te[0] = (1 - (yy + zz)) * sx;\n te[1] = (xy + wz) * sx;\n te[2] = (xz - wy) * sx;\n te[3] = 0;\n\n te[4] = (xy - wz) * sy;\n te[5] = (1 - (xx + zz)) * sy;\n te[6] = (yz + wx) * sy;\n te[7] = 0;\n\n te[8] = (xz + wy) * sz;\n te[9] = (yz - wx) * sz;\n te[10] = (1 - (xx + yy)) * sz;\n te[11] = 0;\n\n te[12] = position.x;\n te[13] = position.y;\n te[14] = position.z;\n te[15] = 1;\n\n return this;\n }\n\n decompose(\n position: { x: number; y: number; z: number },\n quaternion: { x: number; y: number; z: number; w: number },\n scale: { x: number; y: number; z: number },\n ): this {\n const te = this.data;\n\n const _v1 = Matr4.tempVect3;\n let sx = _v1.set(te[0], te[1], te[2]).length();\n const sy = _v1.set(te[4], te[5], te[6]).length();\n const sz = _v1.set(te[8], te[9], te[10]).length();\n\n // if determine is negative, we need to invert one scale\n const det = this.determinant();\n if (det < 0) sx = -sx;\n\n position.x = te[12];\n position.y = te[13];\n position.z = te[14];\n\n // scale the rotation part\n const _m1 = Matr4.tempMatr4;\n _m1.copy(this);\n\n const invSX = 1 / sx;\n const invSY = 1 / sy;\n const invSZ = 1 / sz;\n\n _m1.data[0] *= invSX;\n _m1.data[1] *= invSX;\n _m1.data[2] *= invSX;\n\n _m1.data[4] *= invSY;\n _m1.data[5] *= invSY;\n _m1.data[6] *= invSY;\n\n _m1.data[8] *= invSZ;\n _m1.data[9] *= invSZ;\n _m1.data[10] *= invSZ;\n\n const _q1 = Matr4.tempQuat;\n _q1.setFromRotationMatrix(_m1);\n\n quaternion.x = _q1.x;\n quaternion.y = _q1.y;\n quaternion.z = _q1.z;\n quaternion.w = _q1.w;\n\n scale.x = sx;\n scale.y = sy;\n scale.z = sz;\n\n return this;\n }\n\n getScale(vect3: IVect3): IVect3 {\n const te = this.data;\n\n const _v1 = Matr4.tempVect3;\n let sx = _v1.set(te[0], te[1], te[2]).length();\n const sy = _v1.set(te[4], te[5], te[6]).length();\n const sz = _v1.set(te[8], te[9], te[10]).length();\n\n // if determine is negative, we need to invert one scale\n const det = this.determinant();\n if (det < 0) sx = -sx;\n\n vect3.x = sx;\n vect3.y = sy;\n vect3.z = sz;\n return vect3;\n }\n\n multiply(m: Matr4): this {\n return this.multiplyMatrices(this, m);\n }\n\n premultiply(m: Matr4): this {\n return this.multiplyMatrices(m, this);\n }\n\n multiplyMatrices(a: Matr4, b: Matr4): this {\n const ae = a.data;\n const be = b.data;\n const te = this.data;\n\n const a11 = ae[0],\n a12 = ae[4],\n a13 = ae[8],\n a14 = ae[12];\n const a21 = ae[1],\n a22 = ae[5],\n a23 = ae[9],\n a24 = ae[13];\n const a31 = ae[2],\n a32 = ae[6],\n a33 = ae[10],\n a34 = ae[14];\n const a41 = ae[3],\n a42 = ae[7],\n a43 = ae[11],\n a44 = ae[15];\n\n const b11 = be[0],\n b12 = be[4],\n b13 = be[8],\n b14 = be[12];\n const b21 = be[1],\n b22 = be[5],\n b23 = be[9],\n b24 = be[13];\n const b31 = be[2],\n b32 = be[6],\n b33 = be[10],\n b34 = be[14];\n const b41 = be[3],\n b42 = be[7],\n b43 = be[11],\n b44 = be[15];\n\n te[0] = a11 * b11 + a12 * b21 + a13 * b31 + a14 * b41;\n te[4] = a11 * b12 + a12 * b22 + a13 * b32 + a14 * b42;\n te[8] = a11 * b13 + a12 * b23 + a13 * b33 + a14 * b43;\n te[12] = a11 * b14 + a12 * b24 + a13 * b34 + a14 * b44;\n\n te[1] = a21 * b11 + a22 * b21 + a23 * b31 + a24 * b41;\n te[5] = a21 * b12 + a22 * b22 + a23 * b32 + a24 * b42;\n te[9] = a21 * b13 + a22 * b23 + a23 * b33 + a24 * b43;\n te[13] = a21 * b14 + a22 * b24 + a23 * b34 + a24 * b44;\n\n te[2] = a31 * b11 + a32 * b21 + a33 * b31 + a34 * b41;\n te[6] = a31 * b12 + a32 * b22 + a33 * b32 + a34 * b42;\n te[10] = a31 * b13 + a32 * b23 + a33 * b33 + a34 * b43;\n te[14] = a31 * b14 + a32 * b24 + a33 * b34 + a34 * b44;\n\n te[3] = a41 * b11 + a42 * b21 + a43 * b31 + a44 * b41;\n te[7] = a41 * b12 + a42 * b22 + a43 * b32 + a44 * b42;\n te[11] = a41 * b13 + a42 * b23 + a43 * b33 + a44 * b43;\n te[15] = a41 * b14 + a42 * b24 + a43 * b34 + a44 * b44;\n\n return this;\n }\n\n invert(): this {\n // based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm\n const te = this.data,\n n11 = te[0],\n n21 = te[1],\n n31 = te[2],\n n41 = te[3],\n n12 = te[4],\n n22 = te[5],\n n32 = te[6],\n n42 = te[7],\n n13 = te[8],\n n23 = te[9],\n n33 = te[10],\n n43 = te[11],\n n14 = te[12],\n n24 = te[13],\n n34 = te[14],\n n44 = te[15],\n t11 =\n n23 * n34 * n42 -\n n24 * n33 * n42 +\n n24 * n32 * n43 -\n n22 * n34 * n43 -\n n23 * n32 * n44 +\n n22 * n33 * n44,\n t12 =\n n14 * n33 * n42 -\n n13 * n34 * n42 -\n n14 * n32 * n43 +\n n12 * n34 * n43 +\n n13 * n32 * n44 -\n n12 * n33 * n44,\n t13 =\n n13 * n24 * n42 -\n n14 * n23 * n42 +\n n14 * n22 * n43 -\n n12 * n24 * n43 -\n n13 * n22 * n44 +\n n12 * n23 * n44,\n t14 =\n n14 * n23 * n32 -\n n13 * n24 * n32 -\n n14 * n22 * n33 +\n n12 * n24 * n33 +\n n13 * n22 * n34 -\n n12 * n23 * n34;\n\n const det = n11 * t11 + n21 * t12 + n31 * t13 + n41 * t14;\n\n if (det === 0) {\n return this.set(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);\n }\n\n const detInv = 1 / det;\n\n te[0] = t11 * detInv;\n te[1] =\n (n24 * n33 * n41 -\n n23 * n34 * n41 -\n n24 * n31 * n43 +\n n21 * n34 * n43 +\n n23 * n31 * n44 -\n n21 * n33 * n44) *\n detInv;\n te[2] =\n (n22 * n34 * n41 -\n n24 * n32 * n41 +\n n24 * n31 * n42 -\n n21 * n34 * n42 -\n n22 * n31 * n44 +\n n21 * n32 * n44) *\n detInv;\n te[3] =\n (n23 * n32 * n41 -\n n22 * n33 * n41 -\n n23 * n31 * n42 +\n n21 * n33 * n42 +\n n22 * n31 * n43 -\n n21 * n32 * n43) *\n detInv;\n\n te[4] = t12 * detInv;\n te[5] =\n (n13 * n34 * n41 -\n n14 * n33 * n41 +\n n14 * n31 * n43 -\n n11 * n34 * n43 -\n n13 * n31 * n44 +\n n11 * n33 * n44) *\n detInv;\n te[6] =\n (n14 * n32 * n41 -\n n12 * n34 * n41 -\n n14 * n31 * n42 +\n n11 * n34 * n42 +\n n12 * n31 * n44 -\n n11 * n32 * n44) *\n detInv;\n te[7] =\n (n12 * n33 * n41 -\n n13 * n32 * n41 +\n n13 * n31 * n42 -\n n11 * n33 * n42 -\n n12 * n31 * n43 +\n n11 * n32 * n43) *\n detInv;\n\n te[8] = t13 * detInv;\n te[9] =\n (n14 * n23 * n41 -\n n13 * n24 * n41 -\n n14 * n21 * n43 +\n n11 * n24 * n43 +\n n13 * n21 * n44 -\n n11 * n23 * n44) *\n detInv;\n te[10] =\n (n12 * n24 * n41 -\n n14 * n22 * n41 +\n n14 * n21 * n42 -\n n11 * n24 * n42 -\n n12 * n21 * n44 +\n n11 * n22 * n44) *\n detInv;\n te[11] =\n (n13 * n22 * n41 -\n n12 * n23 * n41 -\n n13 * n21 * n42 +\n n11 * n23 * n42 +\n n12 * n21 * n43 -\n n11 * n22 * n43) *\n detInv;\n\n te[12] = t14 * detInv;\n te[13] =\n (n13 * n24 * n31 -\n n14 * n23 * n31 +\n n14 * n21 * n33 -\n n11 * n24 * n33 -\n n13 * n21 * n34 +\n n11 * n23 * n34) *\n detInv;\n te[14] =\n (n14 * n22 * n31 -\n n12 * n24 * n31 -\n n14 * n21 * n32 +\n n11 * n24 * n32 +\n n12 * n21 * n34 -\n n11 * n22 * n34) *\n detInv;\n te[15] =\n (n12 * n23 * n31 -\n n13 * n22 * n31 +\n n13 * n21 * n32 -\n n11 * n23 * n32 -\n n12 * n21 * n33 +\n n11 * n22 * n33) *\n detInv;\n\n return this;\n }\n\n equals(other: Matr4) {\n for (let i = 0; i < 16; i++) {\n if (this.data[i] !== other.data[i]) {\n return false;\n }\n }\n return true;\n }\n\n setPosition(x: number, y: number, z: number): this {\n this.data[12] = x;\n this.data[13] = y;\n this.data[14] = z;\n return this;\n }\n}\n", "// Largely based on https://github.com/mrdoob/three.js/blob/master/src/math/Euler.js\nimport { clamp } from \"../helpers/math-helpers\";\n\nimport { Matr4 } from \"./Matr4\";\n\nexport type IEulXYZ = { x: number; y: number; z: number };\n\nexport class EulXYZ {\n private static tempMatrix = new Matr4();\n public x: number;\n public y: number;\n public z: number;\n\n constructor(x: number = 0, y: number = 0, z: number = 0) {\n this.x = x;\n this.y = y;\n this.z = z;\n }\n\n setFromRotationMatrix(m: Matr4): this {\n const d = m.data;\n const m11 = d[0];\n const m12 = d[4];\n const m13 = d[8];\n const m22 = d[5];\n const m23 = d[9];\n const m32 = d[6];\n const m33 = d[10];\n\n this.y = Math.asin(clamp(m13, -1, 1));\n\n if (Math.abs(m13) < 0.9999999) {\n this.x = Math.atan2(-m23, m33);\n this.z = Math.atan2(-m12, m11);\n } else {\n this.x = Math.atan2(m32, m22);\n this.z = 0;\n }\n\n return this;\n }\n\n setFromQuaternion(q: { x: number; y: number; z: number; w: number }): this {\n const matrix = EulXYZ.tempMatrix;\n matrix.setRotationFromQuaternion(q);\n return this.setFromRotationMatrix(matrix);\n }\n\n copy(other: { x?: number; y?: number; z?: number }): this {\n this.x = other.x || 0;\n this.y = other.y || 0;\n this.z = other.z || 0;\n return this;\n }\n\n length(): number {\n return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z);\n }\n\n lengthSquared(): number {\n return this.x * this.x + this.y * this.y + this.z * this.z;\n }\n\n clone(): EulXYZ {\n return new EulXYZ(this.x, this.y, this.z);\n }\n\n set(x: number, y: number, z: number): this {\n this.x = x;\n this.y = y;\n this.z = z;\n return this;\n }\n}\n", "// Largely from https://github.com/mrdoob/three.js/blob/dev/src/math/Ray.js\n\nimport { Matr4 } from \"./Matr4\";\nimport { IVect3, Vect3 } from \"./Vect3\";\n\nconst _edge1 = new Vect3();\nconst _edge2 = new Vect3();\nconst _normal = new Vect3();\nconst _diff = new Vect3();\n\nexport class Ray {\n public origin = new Vect3();\n public direction = new Vect3();\n\n constructor(origin?: IVect3, direction?: IVect3) {\n if (origin) {\n this.origin.copy(origin);\n }\n if (direction) {\n this.direction.copy(direction);\n }\n }\n\n setOrigin(origin: IVect3): this {\n this.origin.copy(origin);\n return this;\n }\n\n setDirection(direction: IVect3): this {\n this.direction.copy(direction);\n return this;\n }\n\n clone(): Ray {\n return new Ray(this.origin, this.direction);\n }\n\n set(origin: IVect3, direction: IVect3): this {\n this.origin.copy(origin);\n this.direction.copy(direction);\n return this;\n }\n\n copy(ray: Ray): this {\n this.origin.copy(ray.origin);\n this.direction.copy(ray.direction);\n return this;\n }\n\n applyMatrix4(matr4: Matr4): this {\n this.origin.applyMatrix4(matr4);\n this.direction.transformDirection(matr4);\n return this;\n }\n\n intersectTriangle(a: Vect3, b: Vect3, c: Vect3, backfaceCulling: boolean, target: Vect3) {\n _edge1.subVectors(b, a);\n _edge2.subVectors(c, a);\n _normal.crossVectors(_edge1, _edge2);\n\n let DdN = this.direction.dot(_normal);\n let sign;\n\n if (DdN > 0) {\n if (backfaceCulling) return null;\n sign = 1;\n } else if (DdN < 0) {\n sign = -1;\n DdN = -DdN;\n } else {\n return null;\n }\n\n _diff.subVectors(this.origin, a);\n const DdQxE2 = sign * this.direction.dot(_edge2.crossVectors(_diff, _edge2));\n\n // b1 < 0, no intersection\n if (DdQxE2 < 0) {\n return null;\n }\n\n const DdE1xQ = sign * this.direction.dot(_edge1.cross(_diff));\n\n // b2 < 0, no intersection\n if (DdE1xQ < 0) {\n return null;\n }\n\n // b1+b2 > 1, no intersection\n if (DdQxE2 + DdE1xQ > DdN) {\n return null;\n }\n\n // Line intersects triangle, check if ray does.\n const QdN = -sign * _diff.dot(_normal);\n\n // t < 0, no intersection\n if (QdN < 0) {\n return null;\n }\n\n // Ray intersects triangle.\n return this.at(QdN / DdN, target);\n }\n\n public at(t: number, target: Vect3): Vect3 {\n return target.copy(this.origin).addScaledVector(this.direction, t);\n }\n}\n", "import { clamp } from \"../helpers/math-helpers\";\n\nimport { Matr4 } from \"./Matr4\";\nimport { IVect3, Vect3 } from \"./Vect3\";\n\nconst _startP = new Vect3();\nconst _startEnd = new Vect3();\n\nexport class Line {\n public start = new Vect3();\n public end = new Vect3();\n\n constructor(start?: IVect3, end?: IVect3) {\n if (start) {\n this.start.copy(start);\n }\n if (end) {\n this.end.copy(end);\n }\n }\n\n setStart(start: IVect3): this {\n this.start.copy(start);\n return this;\n }\n\n setEnd(end: IVect3): this {\n this.end.copy(end);\n return this;\n }\n\n length(): number {\n const dx = this.end.x - this.start.x;\n const dy = this.end.y - this.start.y;\n const dz = this.end.z - this.start.z;\n return Math.sqrt(dx * dx + dy * dy + dz * dz);\n }\n\n lengthSquared(): number {\n const dx = this.end.x - this.start.x;\n const dy = this.end.y - this.start.y;\n const dz = this.end.z - this.start.z;\n return dx * dx + dy * dy + dz * dz;\n }\n\n clone(): Line {\n return new Line(this.start, this.end);\n }\n\n copy(other: Line): this {\n this.start.copy(other.start);\n this.end.copy(other.end);\n return this;\n }\n\n applyMatrix4(matr4: Matr4): this {\n this.start.applyMatrix4(matr4);\n this.end.applyMatrix4(matr4);\n return this;\n }\n\n distance(): number {\n const dx = this.end.x - this.start.x;\n const dy = this.end.y - this.start.y;\n const dz = this.end.z - this.start.z;\n return Math.sqrt(dx * dx + dy * dy + dz * dz);\n }\n\n at(t: number, target: Vect3): Vect3 {\n target.x = this.start.x + t * (this.end.x - this.start.x);\n target.y = this.start.y + t * (this.end.y - this.start.y);\n target.z = this.start.z + t * (this.end.z - this.start.z);\n return target;\n }\n\n closestPointToPointParameter(point: Vect3, clampToLine: boolean) {\n _startP.subVectors(point, this.start);\n _startEnd.subVectors(this.end, this.start);\n\n const startEnd2 = _startEnd.dot(_startEnd);\n const startEnd_startP = _startEnd.dot(_startP);\n\n let t = startEnd_startP / startEnd2;\n\n if (clampToLine) {\n t = clamp(t, 0, 1);\n }\n\n return t;\n }\n\n closestPointToPoint(point: Vect3, clampToLine: boolean, target: Vect3): Vect3 {\n const t = this.closestPointToPointParameter(point, clampToLine);\n\n return this.delta(target).multiplyScalar(t).add(this.start);\n }\n\n delta(target: Vect3): Vect3 {\n return target.subVectors(this.end, this.start);\n }\n}\n", "import { Matr4 } from \"./Matr4\";\nimport { IVect3, Vect3 } from \"./Vect3\";\n\nconst tempPoints = [\n new Vect3(),\n new Vect3(),\n new Vect3(),\n new Vect3(),\n new Vect3(),\n new Vect3(),\n new Vect3(),\n new Vect3(),\n];\n\nexport class Box {\n public min = new Vect3();\n public max = new Vect3();\n\n constructor(min?: IVect3, max?: IVect3) {\n if (min) {\n this.min.copy(min);\n }\n if (max) {\n this.max.copy(max);\n }\n }\n\n setStart(min: IVect3): this {\n this.min.copy(min);\n return this;\n }\n\n setEnd(max: IVect3): this {\n this.max.copy(max);\n return this;\n }\n\n length(): number {\n const dx = this.max.x - this.min.x;\n const dy = this.max.y - this.min.y;\n const dz = this.max.z - this.min.z;\n return Math.sqrt(dx * dx + dy * dy + dz * dz);\n }\n\n clone(): Box {\n return new Box(this.min, this.max);\n }\n\n copy(other: Box): this {\n this.min.copy(other.min);\n this.max.copy(other.max);\n return this;\n }\n\n expandByPoint(point: Vect3): this {\n this.min.min(point);\n this.max.max(point);\n return this;\n }\n\n makeEmpty(): this {\n this.min.set(Infinity, Infinity, Infinity);\n this.max.set(-Infinity, -Infinity, -Infinity);\n return this;\n }\n\n isEmpty() {\n return this.max.x < this.min.x || this.max.y < this.min.y || this.max.z < this.min.z;\n }\n\n union(box: Box): this {\n this.min.min(box.min);\n this.max.max(box.max);\n return this;\n }\n\n applyMatrix4(matr4: Matr4) {\n if (this.isEmpty()) {\n return this;\n }\n\n tempPoints[0].set(this.min.x, this.min.y, this.min.z).applyMatrix4(matr4);\n tempPoints[1].set(this.min.x, this.min.y, this.max.z).applyMatrix4(matr4);\n tempPoints[2].set(this.min.x, this.max.y, this.min.z).applyMatrix4(matr4);\n tempPoints[3].set(this.min.x, this.max.y, this.max.z).applyMatrix4(matr4);\n tempPoints[4].set(this.max.x, this.min.y, this.min.z).applyMatrix4(matr4);\n tempPoints[5].set(this.max.x, this.min.y, this.max.z).applyMatrix4(matr4);\n tempPoints[6].set(this.max.x, this.max.y, this.min.z).applyMatrix4(matr4);\n tempPoints[7].set(this.max.x, this.max.y, this.max.z).applyMatrix4(matr4);\n\n this.makeEmpty();\n\n for (const p of tempPoints) {\n this.expandByPoint(p);\n }\n\n return this;\n }\n}\n", "export function radToDeg(rad: number): number {\n return rad * (180 / Math.PI);\n}\n\nexport function degToRad(deg: number): number {\n return deg * (Math.PI / 180);\n}\n", "import { IQuat, IVect3, Quat, Vect3 } from \"../math\";\n\nexport const roundToDecimalPlaces = (value: number, decimalPlaces: number): number => {\n const mult = 10 ** decimalPlaces;\n return Math.round(value * mult) / mult;\n};\n\nexport const toArray = (origin: IVect3 | IQuat, precision: number = 3): number[] => {\n const array = [];\n array[0] = roundToDecimalPlaces(origin.x, precision);\n array[1] = roundToDecimalPlaces(origin.y, precision);\n array[2] = roundToDecimalPlaces(origin.z, precision);\n if ((origin as Quat).w !== undefined) {\n array[3] = roundToDecimalPlaces((origin as Quat).w, precision);\n }\n return array;\n};\n\nexport const getSpawnPositionInsideCircle = (\n radius: number,\n positions: number,\n id: number,\n yPos: number = 0,\n): Vect3 => {\n if (id > 0) id += 3;\n const goldenAngle = Math.PI * (3 - Math.sqrt(5));\n const theta = id * goldenAngle;\n const scale = id / positions;\n const scaledRadius = scale * radius;\n const x = Math.cos(theta) * scaledRadius;\n const z = Math.sin(theta) * scaledRadius;\n return new Vect3(x, yPos, z);\n};\n\nexport const round = (n: number, digits: number): number => {\n return Number(n.toFixed(digits));\n};\n\nexport const ease = (target: number, n: number, factor: number): number => {\n return round((target - n) * factor, 5);\n};\n\nexport function clamp(value: number, min: number, max: number): number {\n return Math.min(Math.max(value, min), max);\n}\n\nexport const remap = (\n value: number,\n minValue: number,\n maxValue: number,\n minScaledValue: number,\n maxScaledValue: number,\n): number => {\n return (\n minScaledValue +\n ((maxScaledValue - minScaledValue) * (value - minValue)) / (maxValue - minValue)\n );\n};\n", "type ListenerFunc = (...args: any[]) => void;\n\ntype EventSpecificationTuple = [EventTarget, string, ListenerFunc, AddEventListenerOptions?];\n\nexport class EventHandlerCollection {\n private eventsByTarget: Map<EventTarget, Map<string, Set<ListenerFunc>>> = new Map();\n\n public add(\n target: EventTarget,\n key: string,\n listener: ListenerFunc,\n options?: AddEventListenerOptions,\n ): this {\n target.addEventListener(key, listener, options);\n\n let existingTarget = this.eventsByTarget.get(target);\n if (existingTarget === undefined) {\n existingTarget = new Map();\n this.eventsByTarget.set(target, existingTarget);\n }\n let existingKey = existingTarget.get(key);\n if (existingKey === undefined) {\n existingKey = new Set();\n existingTarget.set(key, existingKey);\n }\n existingKey.add(listener);\n\n return this;\n }\n\n public clear() {\n this.eventsByTarget.forEach((keyMap, target) => {\n keyMap.forEach((listenerSet, key) => {\n listenerSet.forEach((listenerFunc) => {\n target.removeEventListener(key, listenerFunc);\n });\n });\n });\n this.eventsByTarget.clear();\n }\n\n static create(initial?: Array<EventSpecificationTuple>): EventHandlerCollection {\n const instance = new EventHandlerCollection();\n if (initial !== undefined) {\n initial.forEach(([target, key, listenerFunc, options]) => {\n instance.add(target, key, listenerFunc, options);\n });\n }\n return instance;\n }\n}\n", "let isTweakpaneActive = false;\n\nexport function setTweakpaneActive(status: boolean) {\n isTweakpaneActive = status;\n}\n\nexport function getTweakpaneActive() {\n return isTweakpaneActive;\n}\n", "import { CollisionsManager } from \"../collisions/CollisionsManager\";\nimport { remap } from \"../helpers/math-helpers\";\nimport { EventHandlerCollection } from \"../input/EventHandlerCollection\";\nimport { Matr4, Quat, Ray, Vect3 } from \"../math\";\nimport { getTweakpaneActive } from \"../tweakpane/tweakPaneActivity\";\n\nexport type CameraState = {\n position: Vect3;\n rotation: Quat;\n fov: number;\n aspect: number;\n};\n\nconst cameraPanSensitivity = 20;\nconst scrollZoomSensitivity = 0.1;\nconst pinchZoomSensitivity = 0.025;\n\nexport class CameraManager {\n private isMainCameraActive: boolean = true;\n\n public initialDistance = 3.3;\n public minDistance = 0.1;\n public maxDistance = 5;\n public damping = 0.21;\n public zoomScale = 0.04;\n public zoomDamping = 0.04;\n\n public initialFOV = 60;\n public maxFOV = 70;\n public minFOV = 60;\n public invertFOVMapping = false;\n\n public fov: number = this.initialFOV;\n private targetFOV: number = this.initialFOV;\n\n public minPolarAngle: number = Math.PI * 0.05;\n private maxPolarAngle: number = Math.PI * 0.95;\n\n public distance: number = this.initialDistance;\n public targetDistance: number = this.initialDistance;\n public desiredDistance: number = this.initialDistance;\n\n private phi: number;\n private targetPhi: number;\n private theta: number;\n private targetTheta: number;\n\n private target: Vect3 = new Vect3(0, 1.55, 0);\n private hadTarget: boolean = false;\n\n private cameraRay: Ray = new Ray();\n private tempVec3: Vect3 = new Vect3();\n\n private eventHandlerCollection: EventHandlerCollection;\n\n private finalTarget: Vect3 = new Vect3();\n private isLerping: boolean = false;\n private lerpTarget: Vect3 = new Vect3();\n private lerpFactor: number = 0;\n private lerpDuration: number = 2.1;\n\n private tempMatr4: Matr4 = new Matr4();\n\n private activePointers = new Map<number, { x: number; y: number }>();\n\n private cameraState: CameraState;\n private flyCameraState: CameraState;\n private aspect: number;\n\n // Fly camera orbit controls state\n private flyCameraLookAt: Vect3 = new Vect3(0, 0, 0);\n private flyCameraYaw: number = 0;\n private flyCameraPitch: number = Math.PI * 0.4;\n private flyCameraDistance: number = 15.0;\n private flyCameraMouseDown: boolean = false;\n private flyCameraIsPanning: boolean = false;\n private flyCameraLastMouseX: number = 0;\n private flyCameraLastMouseY: number = 0;\n private flyCameraEventHandlerCollection: EventHandlerCollection | null = null;\n\n // Orbit controls settings\n private orbitControlsRotateSensitivity: number = 0.002;\n private orbitControlsPanSensitivity: number = 0.01;\n private orbitControlsZoomSensitivity: number = 0.1;\n // Polar angle constraints: 0 = camera above lookAt (looking down), \u03C0 = camera below lookAt (looking up)\n // Constrain to prevent going over the top (pitch < 0) but allow pointing above horizon (pitch > \u03C0/2)\n private orbitControlsMinPolarAngle: number = 0.001; // Just above 0 to prevent going over the top\n private orbitControlsMaxPolarAngle: number = Math.PI - 0.001; // Just below \u03C0 to allow looking up\n\n // Temporary vectors for panning calculations\n private tempPanRight: Vect3 = new Vect3();\n private tempPanUp: Vect3 = new Vect3();\n private tempPanForward: Vect3 = new Vect3();\n\n constructor(\n private targetElement: HTMLElement,\n private collisionsManager: CollisionsManager,\n initialPhi = Math.PI / 2,\n initialTheta = -Math.PI / 2,\n ) {\n this.targetElement.style.touchAction = \"pinch-zoom\";\n this.phi = initialPhi;\n this.targetPhi = this.phi;\n this.theta = initialTheta;\n this.targetTheta = this.theta;\n\n this.aspect = window.innerWidth / window.innerHeight;\n\n const initialPosition = new Vect3(0, 1.4, -this.initialDistance);\n const initialRotation = new Quat();\n\n this.cameraState = {\n position: initialPosition,\n rotation: initialRotation,\n fov: this.fov,\n aspect: this.aspect,\n };\n\n this.flyCameraState = {\n position: new Vect3().copy(initialPosition),\n rotation: new Quat().copy(initialRotation),\n fov: this.initialFOV,\n aspect: this.aspect,\n };\n\n this.createEventHandlers();\n }\n\n private createEventHandlers(): void {\n this.eventHandlerCollection = EventHandlerCollection.create([\n [this.targetElement, \"pointerdown\", this.onPointerDown.bind(this)],\n [this.targetElement, \"gesturestart\", this.preventDefaultAndStopPropagation.bind(this)],\n [this.targetElement, \"wheel\", this.onMouseWheel.bind(this)],\n [this.targetElement, \"contextmenu\", this.onContextMenu.bind(this)],\n [document, \"pointerup\", this.onPointerUp.bind(this)],\n [document, \"pointercancel\", this.onPointerUp.bind(this)],\n [document, \"pointermove\", this.onPointerMove.bind(this)],\n ]);\n }\n\n private disposeEventHandlers(): void {\n this.eventHandlerCollection.clear();\n }\n\n private createFlyCameraEventHandlers(): void {\n this.flyCameraEventHandlerCollection = EventHandlerCollection.create([\n [window, \"blur\", this.onFlyCameraBlur.bind(this)],\n [this.targetElement, \"mousedown\", this.onFlyCameraMouseDown.bind(this)],\n [document, \"mousemove\", this.onFlyCameraMouseMove.bind(this)],\n [document, \"mouseup\", this.onFlyCameraMouseUp.bind(this)],\n [this.targetElement, \"wheel\", this.onFlyCameraWheel.bind(this)],\n [this.targetElement, \"contextmenu\", this.onContextMenu.bind(this)],\n ]);\n }\n\n private disposeFlyCameraEventHandlers(): void {\n if (this.flyCameraEventHandlerCollection) {\n this.flyCameraEventHandlerCollection.clear();\n this.flyCameraEventHandlerCollection = null;\n }\n }\n\n private onFlyCameraBlur(): void {\n this.flyCameraMouseDown = false;\n this.flyCameraIsPanning = false;\n }\n\n private onFlyCameraMouseDown(event: MouseEvent): void {\n if (event.button === 0) {\n // Left mouse button - rotate\n this.flyCameraMouseDown = true;\n this.flyCameraIsPanning = false;\n this.flyCameraLastMouseX = event.clientX;\n this.flyCameraLastMouseY = event.clientY;\n document.body.style.cursor = \"none\";\n event.preventDefault();\n } else if (event.button === 1 || event.button === 2) {\n // Middle or right mouse button - pan\n this.flyCameraMouseDown = true;\n this.flyCameraIsPanning = true;\n this.flyCameraLastMouseX = event.clientX;\n this.flyCameraLastMouseY = event.clientY;\n document.body.style.cursor = \"move\";\n event.preventDefault();\n }\n }\n\n private onFlyCameraMouseUp(event: MouseEvent): void {\n this.flyCameraMouseDown = false;\n this.flyCameraIsPanning = false;\n document.body.style.cursor = \"default\";\n }\n\n private onFlyCameraMouseMove(event: MouseEvent): void {\n if (!this.flyCameraMouseDown || getTweakpaneActive()) {\n return;\n }\n\n const movementX =\n event.movementX !== undefined ? event.movementX : event.clientX - this.flyCameraLastMouseX;\n const movementY =\n event.movementY !== undefined ? event.movementY : event.clientY - this.flyCameraLastMouseY;\n\n if (this.flyCameraIsPanning) {\n // Pan the lookAt target\n this.panFlyCameraLookAt(movementX, movementY);\n } else {\n // Rotate around lookAt target\n this.flyCameraYaw -= movementX * this.orbitControlsRotateSensitivity;\n this.flyCameraPitch -= movementY * this.orbitControlsRotateSensitivity;\n\n this.flyCameraYaw = this.flyCameraYaw % (Math.PI * 2);\n this.flyCameraPitch = Math.max(\n this.orbitControlsMinPolarAngle,\n Math.min(this.orbitControlsMaxPolarAngle, this.flyCameraPitch),\n );\n }\n\n this.flyCameraLastMouseX = event.clientX;\n this.flyCameraLastMouseY = event.clientY;\n event.preventDefault();\n }\n\n private panFlyCameraLookAt(deltaX: number, deltaY: number): void {\n // Calculate camera's forward direction (from camera to lookAt)\n const sinPhi = Math.sin(this.flyCameraPitch);\n const cosPhi = Math.cos(this.flyCameraPitch);\n const sinTheta = Math.sin(this.flyCameraYaw);\n const cosTheta = Math.cos(this.flyCameraYaw);\n\n // Forward vector (from camera position towards lookAt)\n this.tempPanForward.set(-sinPhi * sinTheta, -cosPhi, -sinPhi * cosTheta).normalize();\n\n // World up vector\n const worldUp = new Vect3(0, 1, 0);\n\n // Right vector = forward \u00D7 worldUp (perpendicular to forward and world up)\n this.tempPanRight.copy(this.tempPanForward).cross(worldUp).normalize();\n\n // If forward is parallel to world up, use a different approach\n if (this.tempPanRight.lengthSquared() < 0.01) {\n // Camera is looking straight up or down, use yaw-based right vector\n this.tempPanRight.set(cosTheta, 0, -sinTheta).normalize();\n }\n\n // Up vector = right \u00D7 forward (perpendicular to both)\n this.tempPanUp.copy(this.tempPanRight).cross(this.tempPanForward).normalize();\n\n // Pan distance is proportional to camera distance\n const panDistance = this.flyCameraDistance * this.orbitControlsPanSensitivity;\n\n // Move lookAt target along camera's right and up vectors\n // Clone vectors before scaling to avoid mutation\n const panRight = this.tempPanRight.clone().multiplyScalar(-deltaX * panDistance);\n const panUp = this.tempPanUp.clone().multiplyScalar(deltaY * panDistance);\n\n this.flyCameraLookAt.add(panRight);\n this.flyCameraLookAt.add(panUp);\n }\n\n private onFlyCameraWheel(event: WheelEvent): void {\n if (getTweakpaneActive()) {\n return;\n }\n event.preventDefault();\n this.flyCameraDistance += event.deltaY * this.orbitControlsZoomSensitivity;\n this.flyCameraDistance = Math.max(0.01, Math.min(this.flyCameraDistance, 1000));\n }\n\n private preventDefaultAndStopPropagation(evt: PointerEvent): void {\n evt.preventDefault();\n evt.stopPropagation();\n }\n\n private onPointerDown(event: PointerEvent): void {\n if (event.button === 0 || event.button === 2) {\n // Left or right mouse button\n\n const pointerInfo = { x: event.clientX, y: event.clientY };\n this.activePointers.set(event.pointerId, pointerInfo);\n document.body.style.cursor = \"none\";\n }\n }\n\n private onPointerUp(event: PointerEvent): void {\n const existingPointer = this.activePointers.get(event.pointerId);\n if (existingPointer) {\n this.activePointers.delete(event.pointerId);\n if (this.activePointers.size === 0) {\n document.body.style.cursor = \"default\";\n }\n }\n }\n\n private getAveragePointerPositionAndSpread(): { pos: { x: number; y: number }; spread: number } {\n const existingSum = { x: 0, y: 0 };\n this.activePointers.forEach((p) => {\n existingSum.x += p.x;\n existingSum.y += p.y;\n });\n const aX = existingSum.x / this.activePointers.size;\n const aY = existingSum.y / this.activePointers.size;\n\n let sumOfDistances = 0;\n this.activePointers.forEach((p) => {\n const distance = Math.sqrt((p.x - aX) ** 2 + (p.y - aY) ** 2);\n sumOfDistances += distance;\n });\n return { pos: { x: aX, y: aY }, spread: sumOfDistances / this.activePointers.size };\n }\n\n private onPointerMove(event: PointerEvent): void {\n if (getTweakpaneActive()) {\n return;\n }\n\n const existingPointer = this.activePointers.get(event.pointerId);\n if (existingPointer) {\n const previous = this.getAveragePointerPositionAndSpread();\n\n // Replace the pointer info and recalculate to determine the delta\n existingPointer.x = event.clientX;\n existingPointer.y = event.clientY;\n\n const latest = this.getAveragePointerPositionAndSpread();\n\n const sX = latest.pos.x - previous.pos.x;\n const sY = latest.pos.y - previous.pos.y;\n\n const dx = (sX / this.targetElement.clientWidth) * cameraPanSensitivity;\n const dy = (sY / this.targetElement.clientHeight) * cameraPanSensitivity;\n\n if (this.activePointers.size > 1) {\n const zoomDelta = latest.spread - previous.spread;\n this.zoom(-zoomDelta * pinchZoomSensitivity);\n }\n\n this.targetTheta += dx;\n this.targetPhi -= dy;\n this.targetPhi = Math.max(this.minPolarAngle, Math.min(this.maxPolarAngle, this.targetPhi));\n event.preventDefault();\n }\n }\n\n private onMouseWheel(event: WheelEvent): void {\n if (getTweakpaneActive()) {\n return;\n }\n event.preventDefault();\n const scrollAmount = event.deltaY * this.zoomScale * scrollZoomSensitivity;\n this.zoom(scrollAmount);\n }\n\n private zoom(delta: number) {\n this.targetDistance += delta;\n this.targetDistance = Math.max(\n this.minDistance,\n Math.min(this.maxDistance, this.targetDistance),\n );\n this.desiredDistance = this.targetDistance;\n }\n\n private onContextMenu(event: PointerEvent): void {\n event.preventDefault();\n }\n\n public setTarget(target: Vect3): void {\n if (!this.isLerping) {\n this.target.copy(target);\n } else {\n this.finalTarget.copy(target);\n this.lerpTarget.copy(this.target);\n this.lerpFactor = 0;\n }\n\n if (!this.hadTarget) {\n this.hadTarget = true;\n this.reverseUpdateFromPositions(this.cameraState.position, this.cameraState.rotation);\n }\n }\n\n public setLerpedTarget(target: Vect3, targetDistance: number): void {\n this.isLerping = true;\n this.targetDistance = targetDistance;\n this.desiredDistance = targetDistance;\n this.setTarget(target);\n }\n\n /** Set the horizontal orbit angle (theta). The camera will smoothly rotate to this angle via the shortest path. */\n public setOrbitAngle(theta: number): void {\n // Normalize so the camera takes the shortest rotation path\n let delta = theta - this.theta;\n delta = delta - Math.round(delta / (2 * Math.PI)) * 2 * Math.PI;\n this.targetTheta = this.theta + delta;\n }\n\n public reverseUpdateFromPositions(position: Vect3, rotation: Quat): void {\n const dx = position.x - this.target.x;\n const dy = position.y - this.target.y;\n const dz = position.z - this.target.z;\n this.targetDistance = Math.sqrt(dx * dx + dy * dy + dz * dz);\n this.distance = this.targetDistance;\n this.desiredDistance = this.targetDistance;\n this.theta = Math.atan2(dz, dx);\n this.targetTheta = this.theta;\n this.phi = Math.acos(dy / this.targetDistance);\n this.targetPhi = this.phi;\n this.recomputeFoV(true);\n }\n\n public adjustCameraPosition(position: Vect3, rotation: Quat): void {\n const offsetDistance = 0.5;\n const offset = this.tempVec3.set(0, 0, offsetDistance);\n const matr4 = this.tempMatr4.setRotationFromQuaternion(rotation);\n offset.applyMatrix4(matr4);\n const rayOrigin = offset.add(position);\n const rayDirection = rayOrigin.sub(this.target).normalize();\n\n this.cameraRay.set(this.target, rayDirection);\n const firstRaycastHit = this.collisionsManager.raycastFirst(this.cameraRay);\n if (firstRaycastHit !== null && firstRaycastHit[0] <= this.desiredDistance) {\n const distanceToCollision = firstRaycastHit[0] - 0.1;\n this.targetDistance = distanceToCollision;\n this.distance = distanceToCollision;\n } else {\n this.targetDistance = this.desiredDistance;\n }\n }\n\n private updateFlyCameraOrbitControls(): void {\n // Convert spherical coordinates to cartesian position\n const sinPhi = Math.sin(this.flyCameraPitch);\n const cosPhi = Math.cos(this.flyCameraPitch);\n const sinTheta = Math.sin(this.flyCameraYaw);\n const cosTheta = Math.cos(this.flyCameraYaw);\n\n const x = this.flyCameraLookAt.x + this.flyCameraDistance * sinPhi * sinTheta;\n const y = this.flyCameraLookAt.y + this.flyCameraDistance * cosPhi;\n const z = this.flyCameraLookAt.z + this.flyCameraDistance * sinPhi * cosTheta;\n\n this.flyCameraState.position.set(x, y, z);\n\n // Calculate rotation to look at target\n const direction = new Vect3()\n .copy(this.flyCameraLookAt)\n .sub(this.flyCameraState.position)\n .normalize();\n const up = new Vect3(0, 1, 0);\n const right = new Vect3().copy(direction).cross(up).normalize();\n const correctedUp = new Vect3().copy(right).cross(direction).normalize();\n\n const lookAtMatrix = this.tempMatr4.set(\n right.x,\n correctedUp.x,\n -direction.x,\n 0,\n right.y,\n correctedUp.y,\n -direction.y,\n 0,\n right.z,\n correctedUp.z,\n -direction.z,\n 0,\n 0,\n 0,\n 0,\n 1,\n );\n\n this.flyCameraState.rotation.setFromRotationMatrix(lookAtMatrix);\n }\n\n public dispose() {\n this.disposeEventHandlers();\n this.disposeFlyCameraEventHandlers();\n document.body.style.cursor = \"\";\n }\n\n private easeOutExpo(x: number): number {\n return x === 1 ? 1 : 1 - Math.pow(2, -10 * x);\n }\n\n public updateAspect(aspect: number): void {\n this.aspect = aspect;\n this.cameraState.aspect = aspect;\n this.flyCameraState.aspect = aspect;\n }\n\n public recomputeFoV(immediately: boolean = false): void {\n this.targetFOV = remap(\n this.targetDistance,\n this.minDistance,\n this.maxDistance,\n this.invertFOVMapping ? this.minFOV : this.maxFOV,\n this.invertFOVMapping ? this.maxFOV : this.minFOV,\n );\n if (immediately) {\n this.fov = this.targetFOV;\n }\n }\n\n public isFlyCameraOn(): boolean {\n return this.isMainCameraActive === false;\n }\n\n public toggleFlyCamera(): void {\n this.isMainCameraActive = !this.isMainCameraActive;\n\n if (!this.isMainCameraActive) {\n // Entering fly camera mode - initialize from current camera\n this.updateAspect(window.innerWidth / window.innerHeight);\n\n // Copy current camera state including FOV\n this.flyCameraState.position.copy(this.cameraState.position);\n this.flyCameraState.rotation.copy(this.cameraState.rotation);\n this.flyCameraState.fov = this.cameraState.fov;\n\n // Use the main camera's target as the lookAt point\n this.flyCameraLookAt.copy(this.target);\n\n // Calculate spherical coordinates from current camera position relative to target\n const toCamera = new Vect3().copy(this.flyCameraState.position).sub(this.flyCameraLookAt);\n this.flyCameraDistance = toCamera.length();\n if (this.flyCameraDistance > 0.001) {\n this.flyCameraPitch = Math.acos(toCamera.y / this.flyCameraDistance);\n this.flyCameraYaw = Math.atan2(toCamera.x, toCamera.z);\n } else {\n // Fallback if camera is at target\n this.flyCameraDistance = this.distance;\n this.flyCameraPitch = Math.PI * 0.4;\n this.flyCameraYaw = 0;\n }\n\n // Immediately update fly camera orbit controls to ensure position matches exactly\n // This prevents any shift when the first update() call recalculates position\n this.updateFlyCameraOrbitControls();\n\n // Dispose main camera handlers and create fly camera handlers\n this.disposeEventHandlers();\n this.createFlyCameraEventHandlers();\n } else {\n // Exiting fly camera mode\n this.disposeFlyCameraEventHandlers();\n this.createEventHandlers();\n }\n }\n\n public getCameraState(): CameraState {\n return this.isMainCameraActive ? this.cameraState : this.flyCameraState;\n }\n\n public getMainCameraState(): CameraState {\n return this.cameraState;\n }\n\n public getFlyCameraState(): CameraState {\n return this.flyCameraState;\n }\n\n public getCameraPosition(): Vect3 {\n const state = this.getCameraState();\n return state.position;\n }\n\n public getCameraRotation(): Quat {\n const state = this.getCameraState();\n return state.rotation;\n }\n\n public getCameraFOV(): number {\n const state = this.getCameraState();\n return state.fov;\n }\n\n public update(onFlyCameraUpdate?: (state: CameraState) => void): void {\n if (!this.isMainCameraActive) {\n // Update fly camera orbit controls\n this.updateFlyCameraOrbitControls();\n if (onFlyCameraUpdate) {\n onFlyCameraUpdate(this.flyCameraState);\n }\n return;\n }\n\n if (this.isLerping && this.lerpFactor < 1) {\n this.lerpFactor += 0.01 / this.lerpDuration;\n this.lerpFactor = Math.min(1, this.lerpFactor);\n this.target.lerpVectors(this.lerpTarget, this.finalTarget, this.easeOutExpo(this.lerpFactor));\n } else {\n this.adjustCameraPosition(this.cameraState.position, this.cameraState.rotation);\n }\n\n this.distance += (this.targetDistance - this.distance) * this.zoomDamping;\n\n this.theta += (this.targetTheta - this.theta) * this.damping;\n this.phi += (this.targetPhi - this.phi) * this.damping;\n\n const x = this.target.x + this.distance * Math.sin(this.phi) * Math.cos(this.theta);\n const y = this.target.y + this.distance * Math.cos(this.phi);\n const z = this.target.z + this.distance * Math.sin(this.phi) * Math.sin(this.theta);\n\n this.recomputeFoV();\n this.fov += (this.targetFOV - this.fov) * this.zoomDamping;\n\n this.cameraState.position.set(x, y, z);\n this.cameraState.fov = this.fov;\n\n const lookAtTarget = new Vect3(this.target.x, this.target.y, this.target.z);\n const direction = new Vect3().copy(lookAtTarget).sub(this.cameraState.position).normalize();\n const up = new Vect3(0, 1, 0);\n const right = new Vect3().copy(direction).cross(up).normalize();\n const correctedUp = new Vect3().copy(right).cross(direction).normalize();\n\n const lookAtMatrix = this.tempMatr4.set(\n right.x,\n correctedUp.x,\n -direction.x,\n 0,\n right.y,\n correctedUp.y,\n -direction.y,\n 0,\n right.z,\n correctedUp.z,\n -direction.z,\n 0,\n 0,\n 0,\n 0,\n 1,\n );\n\n this.cameraState.rotation.setFromRotationMatrix(lookAtMatrix);\n\n if (this.isLerping && this.lerpFactor >= 1) {\n this.isLerping = false;\n }\n }\n\n public hasActiveInput(): boolean {\n return this.activePointers.size > 0;\n }\n}\n", "import { PositionAndRotation, radToDeg } from \"@mml-io/mml-web\";\n\nimport { CameraManager } from \"../camera/CameraManager\";\nimport { CollisionsManager } from \"../collisions/CollisionsManager\";\nimport { KeyInputManager } from \"../input/KeyInputManager\";\nimport { EulXYZ } from \"../math/EulXYZ\";\nimport { Quat } from \"../math/Quat\";\nimport { Vect3 } from \"../math/Vect3\";\nimport { CharacterRenderState, CharacterDescription } from \"../rendering/IRenderer\";\nimport { CharacterControllerValues } from \"../tweakpane/blades/characterControlsFolder\";\nimport { TweakPane } from \"../tweakpane/TweakPane\";\n\nimport { AnimationMixer } from \"./AnimationMixer\";\nimport { AnimationState, CharacterState } from \"./CharacterState\";\nimport { InputProvider, LocalController } from \"./LocalController\";\nimport { RemoteController } from \"./RemoteController\";\nimport { encodeCharacterAndCamera } from \"./url-position\";\n\ntype SpawnPosition = {\n x: number;\n y: number;\n z: number;\n};\n\ntype SpawnPositionVariance = {\n x: number;\n y: number;\n z: number;\n};\n\ntype RespawnTrigger = {\n minX: number;\n maxX: number;\n minY: number;\n maxY: number;\n minZ: number;\n maxZ: number;\n};\n\nexport type SpawnConfiguration = {\n spawnPosition?: Partial<SpawnPosition>;\n spawnPositionVariance?: Partial<SpawnPositionVariance>;\n spawnYRotation?: number;\n respawnTrigger?: Partial<RespawnTrigger>;\n};\n\nexport type SpawnConfigurationState = {\n spawnPosition: SpawnPosition;\n spawnPositionVariance: SpawnPositionVariance;\n spawnYRotation: number;\n respawnTrigger: RespawnTrigger;\n};\n\nexport function normalizeSpawnConfiguration(\n spawnConfig?: SpawnConfiguration,\n): SpawnConfigurationState {\n return {\n spawnPosition: {\n x: spawnConfig?.spawnPosition?.x ?? 0,\n y: spawnConfig?.spawnPosition?.y ?? 0,\n z: spawnConfig?.spawnPosition?.z ?? 0,\n },\n spawnPositionVariance: {\n x: spawnConfig?.spawnPositionVariance?.x ?? 0,\n y: spawnConfig?.spawnPositionVariance?.y ?? 0,\n z: spawnConfig?.spawnPositionVariance?.z ?? 0,\n },\n spawnYRotation: spawnConfig?.spawnYRotation ?? 0,\n respawnTrigger: {\n minX: spawnConfig?.respawnTrigger?.minX ?? Number.NEGATIVE_INFINITY,\n maxX: spawnConfig?.respawnTrigger?.maxX ?? Number.POSITIVE_INFINITY,\n minY: spawnConfig?.respawnTrigger?.minY ?? -100,\n maxY: spawnConfig?.respawnTrigger?.maxY ?? Number.POSITIVE_INFINITY,\n minZ: spawnConfig?.respawnTrigger?.minZ ?? Number.NEGATIVE_INFINITY,\n maxZ: spawnConfig?.respawnTrigger?.maxZ ?? Number.POSITIVE_INFINITY,\n },\n };\n}\n\nexport type CharacterManagerConfig = {\n collisionsManager: CollisionsManager;\n cameraManager: CameraManager;\n keyInputManager: KeyInputManager;\n additionalInputProvider?: InputProvider;\n remoteUserStates: Map<number, CharacterState>;\n sendUpdate: (update: CharacterState) => void;\n sendLocalCharacterColors: (colors: Array<[number, number, number]>) => void;\n spawnConfiguration: SpawnConfigurationState;\n characterControllerValues: CharacterControllerValues;\n characterResolve: (connectionId: number) => {\n username: string | null;\n characterDescription: CharacterDescription | null;\n colors: Array<[number, number, number]> | null;\n };\n updateURLLocation?: boolean;\n};\n\ntype RemoteCharacterState = {\n id: number;\n controller: RemoteController;\n animationMixer: AnimationMixer;\n lastUsername: string;\n lastCharacterDescription: CharacterDescription | null;\n lastColors: Array<[number, number, number]> | null;\n renderState: CharacterRenderState;\n};\n\nexport class CharacterManager {\n public static readonly headTargetOffset = new Vect3(0, 1.75, 0);\n\n private localConnectionId: number = 0;\n public remoteCharacters: Map<number, RemoteCharacterState> = new Map();\n public localController: LocalController | null = null;\n private localRenderState: CharacterRenderState | null = null;\n private localAnimationMixer: AnimationMixer | null = null;\n\n private lastUpdateSentTime: number = 0;\n private tempCameraTarget = new Vect3();\n private cachedCharacterStates: Map<number, CharacterRenderState> = new Map();\n private pendingDescriptionUpdates: Set<number> = new Set();\n private pendingRemovals: Set<number> = new Set();\n\n constructor(private config: CharacterManagerConfig) {}\n\n public setAdditionalInputProvider(inputProvider: InputProvider | undefined): void {\n this.config.additionalInputProvider = inputProvider;\n if (this.localController) {\n this.localController.config.additionalInputProvider = inputProvider;\n }\n }\n\n /**\n * Sets the local connection ID early to prevent the local character from being\n * spawned as a remote character when network updates arrive before spawnLocalCharacter is called.\n */\n public setLocalConnectionId(id: number): void {\n this.localConnectionId = id;\n }\n\n public spawnLocalCharacter(\n id: number,\n spawnPosition: Vect3 = new Vect3(),\n spawnRotation: EulXYZ = new EulXYZ(),\n ) {\n const position = new Vect3(spawnPosition.x, spawnPosition.y, spawnPosition.z);\n const quaternion = new Quat().setFromEulerXYZ(spawnRotation);\n\n this.config.sendUpdate({\n position: {\n x: spawnPosition.x,\n y: spawnPosition.y,\n z: spawnPosition.z,\n },\n rotation: { eulerY: 2 * Math.atan2(quaternion.y, quaternion.w) },\n state: AnimationState.idle,\n });\n\n this.localConnectionId = id;\n this.localController = new LocalController({\n id: this.localConnectionId,\n position: position,\n quaternion: quaternion,\n collisionsManager: this.config.collisionsManager,\n keyInputManager: this.config.keyInputManager,\n additionalInputProvider: this.config.additionalInputProvider,\n cameraManager: this.config.cameraManager,\n spawnConfiguration: this.config.spawnConfiguration,\n characterControllerValues: this.config.characterControllerValues,\n });\n\n // Initialize cached renderState for local character\n const characterInfo = this.config.characterResolve(this.localConnectionId);\n const rotation = new EulXYZ().setFromQuaternion(quaternion);\n this.localAnimationMixer = new AnimationMixer(AnimationState.idle);\n this.localRenderState = {\n id: this.localConnectionId,\n position: new Vect3(position.x, position.y, position.z),\n rotation: rotation,\n animationState: AnimationState.idle,\n animationWeights: this.localAnimationMixer.getWeights(),\n animationTimes: this.localAnimationMixer.getAnimationTimes(),\n username: characterInfo.username ?? `Unknown User ${this.localConnectionId}`,\n characterDescription: characterInfo.characterDescription,\n colors: characterInfo.colors,\n isLocal: true,\n };\n this.cachedCharacterStates.set(this.localConnectionId, this.localRenderState);\n }\n\n public setupTweakPane(tweakPane: TweakPane) {\n if (this.localController) {\n tweakPane.setupCharacterController(this.localController);\n }\n }\n\n public getLocalCharacterPositionAndRotation(): PositionAndRotation {\n if (this.localController) {\n const rotation = this.localController.config.quaternion;\n return {\n position: this.localController.config.position,\n rotation: {\n x: radToDeg(rotation.x),\n y: radToDeg(rotation.y),\n z: radToDeg(rotation.z),\n },\n };\n }\n return {\n position: { x: 0, y: 0, z: 0 },\n rotation: { x: 0, y: 0, z: 0 },\n };\n }\n\n public clear() {\n // Track all character IDs that need to be removed from the renderer\n for (const [id] of this.remoteCharacters) {\n this.pendingRemovals.add(id);\n }\n if (this.localConnectionId !== 0) {\n this.pendingRemovals.add(this.localConnectionId);\n }\n\n this.remoteCharacters.clear();\n this.cachedCharacterStates.clear();\n this.localRenderState = null;\n\n if (this.localController) {\n this.localController = null;\n }\n }\n\n public dispose() {\n this.clear();\n this.localController = null;\n }\n\n public networkCharacterInfoUpdated(id: number) {\n // Handle remote characters\n const remoteChar = this.remoteCharacters.get(id);\n if (remoteChar) {\n const characterInfo = this.config.characterResolve(id);\n const newUsername = characterInfo.username ?? `Unknown User ${id}`;\n\n // Check if description/colors changed BEFORE updating\n const descriptionChanged =\n remoteChar.lastUsername !== newUsername ||\n remoteChar.lastCharacterDescription !== characterInfo.characterDescription ||\n remoteChar.lastColors !== characterInfo.colors;\n\n remoteChar.lastUsername = newUsername;\n remoteChar.lastCharacterDescription = characterInfo.characterDescription;\n remoteChar.lastColors = characterInfo.colors;\n\n // Update cached renderState\n if (remoteChar.renderState) {\n remoteChar.renderState.username = remoteChar.lastUsername;\n remoteChar.renderState.characterDescription = remoteChar.lastCharacterDescription;\n remoteChar.renderState.colors = remoteChar.lastColors;\n }\n\n // Mark for description update in next update() call\n if (descriptionChanged) {\n this.pendingDescriptionUpdates.add(id);\n }\n }\n\n // Handle local character - update renderState if needed\n if (id === this.localConnectionId && this.localRenderState) {\n const characterInfo = this.config.characterResolve(id);\n const newUsername = characterInfo.username ?? `Unknown User ${id}`;\n\n // Check if description/colors changed BEFORE updating\n const descriptionChanged =\n this.localRenderState.username !== newUsername ||\n this.localRenderState.characterDescription !== characterInfo.characterDescription ||\n this.localRenderState.colors !== characterInfo.colors;\n\n // Update cached renderState\n this.localRenderState.username = newUsername;\n this.localRenderState.characterDescription = characterInfo.characterDescription;\n this.localRenderState.colors = characterInfo.colors;\n\n // Mark for description update in next update() call\n if (descriptionChanged) {\n this.pendingDescriptionUpdates.add(id);\n }\n }\n }\n\n public update(\n deltaTime: number,\n frameCounter: number,\n ): {\n updatedCharacterDescriptions: number[];\n removedConnectionIds: number[];\n } {\n const updatedCharacterDescriptions: number[] = [];\n const removedConnectionIds: number[] = [];\n\n // Process pending removals from clear()\n for (const id of this.pendingRemovals) {\n removedConnectionIds.push(id);\n }\n this.pendingRemovals.clear();\n\n // Process pending description updates from networkCharacterInfoUpdated\n for (const id of this.pendingDescriptionUpdates) {\n updatedCharacterDescriptions.push(id);\n }\n this.pendingDescriptionUpdates.clear();\n\n // Update local character renderState in-place\n if (this.localController && this.localRenderState && this.localAnimationMixer) {\n this.localController.update(deltaTime);\n\n // Mutate cached renderState in-place\n this.localRenderState.position.set(\n this.localController.config.position.x,\n this.localController.config.position.y,\n this.localController.config.position.z,\n );\n const quat = this.localController.config.quaternion;\n this.localRenderState.rotation.setFromQuaternion(new Quat(quat.x, quat.y, quat.z, quat.w));\n\n // Update animation mixer with target state\n const targetAnimation = this.localController.getTargetAnimation();\n this.localAnimationMixer.setTargetState(targetAnimation);\n this.localAnimationMixer.update(deltaTime);\n\n this.localRenderState.animationState = this.localAnimationMixer.getPrimaryState();\n this.localRenderState.animationWeights = this.localAnimationMixer.getWeights();\n this.localRenderState.animationTimes = this.localAnimationMixer.getAnimationTimes();\n\n // Check if description changed\n const characterInfo = this.config.characterResolve(this.localConnectionId);\n const newUsername = characterInfo.username ?? `Unknown User ${this.localConnectionId}`;\n if (\n this.localRenderState.username !== newUsername ||\n this.localRenderState.characterDescription !== characterInfo.characterDescription ||\n this.localRenderState.colors !== characterInfo.colors\n ) {\n this.localRenderState.username = newUsername;\n this.localRenderState.characterDescription = characterInfo.characterDescription;\n this.localRenderState.colors = characterInfo.colors;\n updatedCharacterDescriptions.push(this.localConnectionId);\n }\n\n const currentTime = new Date().getTime();\n const timeSinceLastUpdate = currentTime - this.lastUpdateSentTime;\n if (timeSinceLastUpdate > 30) {\n this.lastUpdateSentTime = currentTime;\n this.config.sendUpdate(this.localController.networkState);\n }\n\n const targetOffset = this.tempCameraTarget\n .set(0, 0, 0)\n .add(CharacterManager.headTargetOffset)\n .applyQuat(this.localController.config.quaternion)\n .add(this.localController.config.position);\n this.config.cameraManager.setTarget(targetOffset);\n\n if (\n this.config.updateURLLocation &&\n frameCounter % 60 === 0 &&\n document.hasFocus() &&\n !this.config.cameraManager.hasActiveInput() &&\n !this.localController.isOnMovingSurface()\n ) {\n const cameraState = this.config.cameraManager.getCameraState();\n const cameraRotation = new EulXYZ().setFromQuaternion(cameraState.rotation);\n const hash = encodeCharacterAndCamera(\n {\n position: this.localController.config.position,\n rotation: new EulXYZ().setFromQuaternion(this.localController.config.quaternion),\n },\n {\n position: cameraState.position,\n rotation: cameraRotation,\n },\n );\n const url = new URL(window.location.href);\n url.hash = hash;\n window.history.replaceState({}, \"\", url);\n }\n }\n\n // Process remote characters\n for (const [id, networkUpdate] of this.config.remoteUserStates) {\n if (id === this.localConnectionId) {\n continue;\n }\n\n let existingCharacter = this.remoteCharacters.get(id);\n if (!existingCharacter) {\n // Spawn new remote character with a RemoteController\n const { position } = networkUpdate;\n const halfY = networkUpdate.rotation.eulerY / 2;\n const initialRotation = new EulXYZ().setFromQuaternion(\n new Quat(0, Math.sin(halfY), 0, Math.cos(halfY)),\n );\n\n const characterInfo = this.config.characterResolve(id);\n const controller = new RemoteController(\n new Vect3(position.x, position.y, position.z),\n initialRotation,\n networkUpdate.state,\n );\n const animationMixer = new AnimationMixer(networkUpdate.state);\n\n // Initialize cached renderState\n const cachedRotation = new EulXYZ();\n cachedRotation.setFromQuaternion(controller.rotation);\n const renderState: CharacterRenderState = {\n id,\n position: new Vect3(controller.position.x, controller.position.y, controller.position.z),\n rotation: cachedRotation,\n animationState: controller.animationState,\n animationWeights: animationMixer.getWeights(),\n animationTimes: animationMixer.getAnimationTimes(),\n username: characterInfo.username ?? `Unknown User ${id}`,\n characterDescription: characterInfo.characterDescription,\n colors: characterInfo.colors,\n isLocal: false,\n };\n\n existingCharacter = {\n id,\n controller,\n animationMixer,\n lastUsername: renderState.username,\n lastCharacterDescription: renderState.characterDescription,\n lastColors: renderState.colors,\n renderState,\n };\n this.remoteCharacters.set(id, existingCharacter);\n this.cachedCharacterStates.set(id, renderState);\n } else {\n // Update existing character's controller with network state\n existingCharacter.controller.update(networkUpdate, deltaTime);\n\n // Update animation mixer\n existingCharacter.animationMixer.setTargetState(\n existingCharacter.controller.animationState,\n );\n existingCharacter.animationMixer.update(deltaTime);\n\n // Mutate cached renderState in-place\n existingCharacter.renderState.position.set(\n existingCharacter.controller.position.x,\n existingCharacter.controller.position.y,\n existingCharacter.controller.position.z,\n );\n existingCharacter.renderState.rotation.setFromQuaternion(\n existingCharacter.controller.rotation,\n );\n existingCharacter.renderState.animationState =\n existingCharacter.animationMixer.getPrimaryState();\n existingCharacter.renderState.animationWeights =\n existingCharacter.animationMixer.getWeights();\n existingCharacter.renderState.animationTimes =\n existingCharacter.animationMixer.getAnimationTimes();\n\n // Check if description changed\n const characterInfo = this.config.characterResolve(id);\n const newUsername = characterInfo.username ?? `Unknown User ${id}`;\n if (\n existingCharacter.lastUsername !== newUsername ||\n existingCharacter.lastCharacterDescription !== characterInfo.characterDescription ||\n existingCharacter.lastColors !== characterInfo.colors\n ) {\n existingCharacter.lastUsername = newUsername;\n existingCharacter.lastCharacterDescription = characterInfo.characterDescription;\n existingCharacter.lastColors = characterInfo.colors;\n existingCharacter.renderState.username = newUsername;\n existingCharacter.renderState.characterDescription = characterInfo.characterDescription;\n existingCharacter.renderState.colors = characterInfo.colors;\n updatedCharacterDescriptions.push(id);\n }\n }\n }\n\n // Find despawned characters\n for (const [id] of this.remoteCharacters) {\n if (!this.config.remoteUserStates.has(id)) {\n removedConnectionIds.push(id);\n this.remoteCharacters.delete(id);\n this.cachedCharacterStates.delete(id);\n }\n }\n\n return {\n updatedCharacterDescriptions,\n removedConnectionIds,\n };\n }\n\n public getAllCharacterStates(): Map<number, CharacterRenderState> {\n // Return the cached Map directly - all objects are mutated in-place by update()\n return this.cachedCharacterStates;\n }\n\n public getLocalConnectionId(): number {\n return this.localConnectionId;\n }\n}\n", "export enum AnimationState {\n \"idle\" = 0,\n \"walking\" = 1,\n \"running\" = 2,\n \"jumpToAir\" = 3,\n \"air\" = 4,\n \"airToGround\" = 5,\n \"doubleJump\" = 6,\n}\n\nexport type CharacterState = {\n position: {\n x: number;\n y: number;\n z: number;\n };\n rotation: {\n eulerY: number;\n };\n state: AnimationState;\n};\n", "import { AnimationState } from \"./CharacterState\";\n\nexport { AnimationState };\n\n/**\n * Animation weights for rendering. Each animation can have a weight between 0 and 1.\n * When transitioning between animations, multiple animations can have non-zero weights.\n */\nexport type AnimationWeights = {\n [AnimationState.idle]: number;\n [AnimationState.walking]: number;\n [AnimationState.running]: number;\n [AnimationState.jumpToAir]: number;\n [AnimationState.air]: number;\n [AnimationState.airToGround]: number;\n [AnimationState.doubleJump]: number;\n};\n\n/**\n * Animation times for rendering. Each animation has its own time value in seconds.\n * When an animation starts playing, its time is reset to 0.\n */\nexport type AnimationTimes = {\n [AnimationState.idle]: number;\n [AnimationState.walking]: number;\n [AnimationState.running]: number;\n [AnimationState.jumpToAir]: number;\n [AnimationState.air]: number;\n [AnimationState.airToGround]: number;\n [AnimationState.doubleJump]: number;\n};\n\n/**\n * Manages smooth transitions between animation states.\n * Calculates animation weights for blending during transitions.\n */\nexport class AnimationMixer {\n private currentState: AnimationState;\n private targetState: AnimationState;\n private transitionProgress: number = 1.0; // 0 to 1, where 1 means transition complete\n private transitionDuration: number = 0.15; // Default transition time in seconds\n private weights: AnimationWeights;\n private animationTimes: AnimationTimes;\n\n constructor(initialState: AnimationState = AnimationState.idle) {\n this.currentState = initialState;\n this.targetState = initialState;\n this.weights = this.createZeroWeights();\n this.weights[initialState] = 1.0;\n this.animationTimes = this.createZeroTimes();\n }\n\n /**\n * Set the target animation state. If different from current, begins a transition.\n */\n public setTargetState(state: AnimationState): void {\n if (this.targetState === state) {\n return;\n }\n\n // If we're mid-transition, snap to the target and start a new transition\n if (this.transitionProgress < 1.0) {\n this.currentState = this.targetState;\n }\n\n this.targetState = state;\n this.transitionProgress = 0.0;\n\n // Reset the time for the new target animation to start from 0\n this.animationTimes[state] = 0.0;\n\n // Update weights immediately to reflect the new transition\n this.updateWeights();\n }\n\n /**\n * Update the animation mixer, progressing any active transitions.\n */\n public update(deltaTime: number): void {\n // Update times for all animations that have non-zero weight\n for (const state of [\n AnimationState.idle,\n AnimationState.walking,\n AnimationState.running,\n AnimationState.jumpToAir,\n AnimationState.air,\n AnimationState.airToGround,\n AnimationState.doubleJump,\n ]) {\n if (this.weights[state] > 0) {\n this.animationTimes[state] += deltaTime;\n }\n }\n\n if (this.transitionProgress >= 1.0) {\n // No active transition, but ensure weights are up to date\n return;\n }\n\n this.transitionProgress += deltaTime / this.transitionDuration;\n if (this.transitionProgress >= 1.0) {\n this.transitionProgress = 1.0;\n this.currentState = this.targetState;\n }\n\n this.updateWeights();\n }\n\n /**\n * Get the current animation weights for rendering.\n */\n public getWeights(): AnimationWeights {\n return this.weights;\n }\n\n /**\n * Get the animation times for each animation state.\n */\n public getAnimationTimes(): AnimationTimes {\n return this.animationTimes;\n }\n\n /**\n * Get the primary animation state (the target we're transitioning to, or current if no transition).\n */\n public getPrimaryState(): AnimationState {\n return this.targetState;\n }\n\n /**\n * Returns true if currently transitioning between animations.\n */\n public isTransitioning(): boolean {\n return this.transitionProgress < 1.0;\n }\n\n /**\n * Immediately snap to a state without transitioning.\n */\n public snapToState(state: AnimationState): void {\n this.currentState = state;\n this.targetState = state;\n this.transitionProgress = 1.0;\n this.weights = this.createZeroWeights();\n this.weights[state] = 1.0;\n this.animationTimes = this.createZeroTimes();\n }\n\n private updateWeights(): void {\n this.weights = this.createZeroWeights();\n\n if (this.transitionProgress >= 1.0) {\n // Transition complete\n this.weights[this.targetState] = 1.0;\n } else {\n // In transition: blend between current and target\n const t = this.easeInOut(this.transitionProgress);\n this.weights[this.currentState] = 1.0 - t;\n this.weights[this.targetState] = t;\n }\n }\n\n private createZeroWeights(): AnimationWeights {\n return {\n [AnimationState.idle]: 0,\n [AnimationState.walking]: 0,\n [AnimationState.running]: 0,\n [AnimationState.jumpToAir]: 0,\n [AnimationState.air]: 0,\n [AnimationState.airToGround]: 0,\n [AnimationState.doubleJump]: 0,\n };\n }\n\n private createZeroTimes(): AnimationTimes {\n return {\n [AnimationState.idle]: 0,\n [AnimationState.walking]: 0,\n [AnimationState.running]: 0,\n [AnimationState.jumpToAir]: 0,\n [AnimationState.air]: 0,\n [AnimationState.airToGround]: 0,\n [AnimationState.doubleJump]: 0,\n };\n }\n\n private easeInOut(t: number): number {\n // Smooth ease-in-out curve for natural-looking transitions\n return t < 0.5 ? 2 * t * t : 1 - Math.pow(-2 * t + 2, 2) / 2;\n }\n}\n", "import { toArray } from \"../helpers/math-helpers\";\nimport { IEulXYZ } from \"../math/EulXYZ\";\nimport { Quat } from \"../math/Quat\";\nimport { IVect3, Vect3 } from \"../math/Vect3\";\n\nconst tempQuat = new Quat();\n\ntype PositionAndRotation = {\n position: IVect3;\n rotation: IEulXYZ;\n};\n\nexport function encodeCharacterAndCamera(\n character: PositionAndRotation,\n camera: PositionAndRotation,\n): string {\n return [\n ...toArray(character.position),\n ...toArray(tempQuat.setFromEulerXYZ(character.rotation)),\n ...toArray(camera.position),\n ...toArray(tempQuat.setFromEulerXYZ(camera.rotation)),\n ].join(\",\");\n}\n\nexport function decodeCharacterAndCamera(hash: string): {\n character: { position: Vect3; quaternion: Quat };\n camera: { position: Vect3; quaternion: Quat };\n} {\n const values = hash.split(\",\").map(Number);\n return {\n character: {\n position: new Vect3(values[0], values[1], values[2]),\n quaternion: new Quat(values[3], values[4], values[5], values[6]),\n },\n camera: {\n position: new Vect3(values[7], values[8], values[9]),\n quaternion: new Quat(values[10], values[11], values[12], values[13]),\n },\n };\n}\n", "import { EulXYZ } from \"../math/EulXYZ\";\nimport { Vect3 } from \"../math/Vect3\";\n\nimport { CharacterManager, SpawnConfigurationState } from \"./CharacterManager\";\nimport { decodeCharacterAndCamera } from \"./url-position\";\n\nfunction randomWithVariance(value: number, variance: number): number {\n const min = value - variance;\n const max = value + variance;\n return Math.random() * (max - min) + min;\n}\n\nexport function getSpawnData(\n config: SpawnConfigurationState,\n useLocationHash = false,\n): {\n spawnPosition: Vect3;\n spawnRotation: EulXYZ;\n cameraPosition: Vect3;\n} {\n const spawnPosition = new Vect3();\n spawnPosition.set(\n randomWithVariance(config.spawnPosition.x, config.spawnPositionVariance.x),\n randomWithVariance(config.spawnPosition.y, config.spawnPositionVariance.y),\n randomWithVariance(config.spawnPosition!.z, config.spawnPositionVariance.z),\n );\n const spawnRotation = new EulXYZ(0, -config.spawnYRotation! * (Math.PI / 180), 0);\n\n let cameraPosition: Vect3 | null = null;\n const offset = new Vect3(0, 0, 3.3);\n offset.applyEulerXYZ(new EulXYZ(0, spawnRotation.y, 0));\n cameraPosition = spawnPosition.clone().sub(offset).add(CharacterManager.headTargetOffset);\n\n if (useLocationHash && window.location.hash && window.location.hash.length > 1) {\n const urlParams = decodeCharacterAndCamera(window.location.hash.substring(1));\n spawnPosition.copy(urlParams.character.position);\n spawnRotation.setFromQuaternion(urlParams.character.quaternion);\n cameraPosition = new Vect3().copy(urlParams.camera.position);\n }\n\n return {\n spawnPosition,\n spawnRotation,\n cameraPosition,\n };\n}\n", "import { CollisionMeshState, CollisionsManager } from \"../collisions/CollisionsManager\";\nimport { EulXYZ } from \"../math/EulXYZ\";\nimport { Line } from \"../math/Line\";\nimport { Matr4 } from \"../math/Matr4\";\nimport { Quat } from \"../math/Quat\";\nimport { Ray } from \"../math/Ray\";\nimport { IVect3, Vect3 } from \"../math/Vect3\";\nimport { CharacterControllerValues } from \"../tweakpane/blades/characterControlsFolder\";\n\nimport { SpawnConfigurationState } from \"./CharacterManager\";\nimport { AnimationState, CharacterState } from \"./CharacterState\";\nimport { getSpawnData } from \"./Spawning\";\n\nconst downVector = new Vect3(0, -1, 0);\n\nexport type InputOutput = { direction: number | null; isSprinting: boolean; jump: boolean };\n\nexport type InputProvider = {\n getOutput(): InputOutput | null;\n};\n\nexport type CameraProvider = {\n getCameraPosition(): Vect3;\n getCameraRotation(): Quat;\n};\n\nexport type LocalControllerConfig = {\n id: number;\n position: Vect3;\n quaternion: Quat;\n collisionsManager: CollisionsManager;\n keyInputManager: InputProvider;\n additionalInputProvider?: InputProvider;\n cameraManager: CameraProvider;\n spawnConfiguration: SpawnConfigurationState;\n characterControllerValues: CharacterControllerValues;\n};\n\nexport class LocalController {\n public capsuleInfo = {\n radius: 0.45,\n segment: new Line(new Vect3(), new Vect3(0, 1.05, 0)),\n };\n\n public gravity: number;\n public jumpForce: number;\n public doubleJumpForce: number;\n public coyoteTimeThreshold: number;\n public canJump: boolean = true;\n public canDoubleJump: boolean = true;\n public coyoteJumped = false;\n public doubleJumpUsed: boolean = false;\n public jumpCounter: number = 0;\n\n public airResistance: number;\n public groundResistance: number;\n public airControlModifier: number;\n public groundWalkControl: number;\n public groundRunControl: number;\n public baseControl: number;\n public minimumSurfaceAngle: number;\n\n public latestPosition: Vect3 = new Vect3();\n public characterOnGround: boolean = false;\n public coyoteTime: boolean = false;\n\n private collisionDetectionSteps = 4;\n private useCollisionsCulling: boolean = true;\n\n private characterWasOnGround: boolean = false;\n private characterAirborneSince: number = 0;\n private currentHeight: number = 0;\n private currentSurfaceAngle = new Vect3();\n\n private characterVelocity: Vect3 = new Vect3();\n private vectorUp: Vect3 = new Vect3(0, 1, 0);\n private vectorDown: Vect3 = new Vect3(0, -1, 0);\n\n private rotationOffset: number = 0;\n private azimuthalAngle: number = 0;\n\n private tempSegment: Line = new Line();\n private tempQuat: Quat = new Quat();\n private tempEulXYZ: EulXYZ = new EulXYZ();\n private tempVector: Vect3 = new Vect3();\n private tempVector2: Vect3 = new Vect3();\n private tempVect3: Vect3 = new Vect3();\n private tempRay: Ray = new Ray();\n private tempCameraPos = new Vect3();\n private tempPositionCopy = new Vect3();\n\n private surfaceTempQuat = new Quat();\n private surfaceTempQuat2 = new Quat();\n private surfaceTempVector1 = new Vect3();\n private surfaceTempVector2 = new Vect3();\n private surfaceTempVect3 = new Vect3();\n private surfaceTempVector4 = new Vect3();\n private surfaceTempVector5 = new Vect3();\n private surfaceTempRay = new Ray();\n private lastMatrixTemp: Matr4 = new Matr4();\n private lastFrameSurfaceState:\n | [\n CollisionMeshState,\n {\n lastMatrix: Matr4;\n },\n ]\n | null = null;\n private surfaceIsMoving: boolean = false;\n\n public jumpReleased: boolean = true; // Indicates if the jump button has been released\n\n /** Returns true if the character is currently on a moving surface (e.g., a rotating platform) */\n public isOnMovingSurface(): boolean {\n return this.surfaceIsMoving;\n }\n\n public networkState: CharacterState;\n public config: LocalControllerConfig;\n private controlState: { direction: number | null; isSprinting: boolean; jump: boolean } | null =\n null;\n\n private minimumX: number;\n private maximumX: number;\n private minimumY: number;\n private maximumY: number;\n private minimumZ: number;\n private maximumZ: number;\n\n constructor(config: LocalControllerConfig) {\n this.config = config;\n this.gravity = -config.characterControllerValues.gravity;\n this.jumpForce = config.characterControllerValues.jumpForce;\n this.doubleJumpForce = config.characterControllerValues.doubleJumpForce;\n this.coyoteTimeThreshold = config.characterControllerValues.coyoteJump;\n this.airResistance = config.characterControllerValues.airResistance;\n this.groundResistance = 0.99999999 + config.characterControllerValues.groundResistance * 1e-7;\n this.airControlModifier = config.characterControllerValues.airControlModifier;\n this.groundWalkControl = config.characterControllerValues.groundWalkControl;\n this.groundRunControl = config.characterControllerValues.groundRunControl;\n this.baseControl = config.characterControllerValues.baseControlMultiplier;\n this.minimumSurfaceAngle = config.characterControllerValues.minimumSurfaceAngle;\n\n this.networkState = {\n position: { x: 0, y: 0, z: 0 },\n rotation: { eulerY: 0 },\n state: AnimationState.idle,\n };\n this.minimumX = this.config.spawnConfiguration.respawnTrigger.minX;\n this.maximumX = this.config.spawnConfiguration.respawnTrigger.maxX;\n this.minimumY = this.config.spawnConfiguration.respawnTrigger.minY;\n this.maximumY = this.config.spawnConfiguration.respawnTrigger.maxY;\n this.minimumZ = this.config.spawnConfiguration.respawnTrigger.minZ;\n this.maximumZ = this.config.spawnConfiguration.respawnTrigger.maxZ;\n\n const maxAbsSpawnX =\n Math.abs(this.config.spawnConfiguration.spawnPosition.x) +\n Math.abs(this.config.spawnConfiguration.spawnPositionVariance.x);\n\n const maxAbsSpawnY =\n Math.abs(this.config.spawnConfiguration.spawnPosition.y) +\n Math.abs(this.config.spawnConfiguration.spawnPositionVariance.y);\n\n const maxAbsSpawnZ =\n Math.abs(this.config.spawnConfiguration.spawnPosition.z) +\n Math.abs(this.config.spawnConfiguration.spawnPositionVariance.z);\n\n if (Math.abs(this.minimumX) < maxAbsSpawnX || Math.abs(this.maximumX) < maxAbsSpawnX) {\n // If the respawn trigger minX or maxX is out of bounds of the spawn position variance,\n // set it to the spawn position variance +- a 1m skin to prevent a respawn infinite loop\n // and warn the user. The same goes for all other axes.\n this.minimumX = -maxAbsSpawnX - 1;\n this.maximumX = maxAbsSpawnX + 1;\n console.warn(\n \"The respawnTrigger X values are out of the bounds of the spawnPosition + spawnPositionVariance. Please check your respawnTrigger config.\",\n );\n }\n\n if (Math.abs(this.minimumY) < maxAbsSpawnY || Math.abs(this.maximumY) < maxAbsSpawnY) {\n this.minimumY = -maxAbsSpawnY - 1;\n this.maximumY = maxAbsSpawnY + 1;\n console.warn(\n \"The respawnTrigger Y values are out of the bounds of the spawnPosition + spawnPositionVariance. Please check your respawnTrigger config.\",\n );\n }\n\n if (Math.abs(this.minimumZ) < maxAbsSpawnZ) {\n this.minimumZ = -maxAbsSpawnZ - 1;\n this.maximumZ = maxAbsSpawnZ + 1;\n console.warn(\n \"The respawnTrigger Z values are out of the bounds of the spawnPosition + spawnPositionVariance. Please check your respawnTrigger config.\",\n );\n }\n\n this.config.collisionsManager.setCullingEnabled(this.useCollisionsCulling);\n }\n\n public updateSpawnConfig(spawnConfig: SpawnConfigurationState): void {\n this.config.spawnConfiguration = spawnConfig;\n this.minimumX = spawnConfig.respawnTrigger.minX;\n this.maximumX = spawnConfig.respawnTrigger.maxX;\n this.minimumY = spawnConfig.respawnTrigger.minY;\n this.maximumY = spawnConfig.respawnTrigger.maxY;\n this.minimumZ = spawnConfig.respawnTrigger.minZ;\n this.maximumZ = spawnConfig.respawnTrigger.maxZ;\n }\n\n public update(deltaTime: number): void {\n this.controlState =\n this.config.keyInputManager.getOutput() ||\n this.config.additionalInputProvider?.getOutput() ||\n null;\n\n this.tempRay.set(this.config.position, this.vectorDown);\n this.tempRay.origin.y += this.capsuleInfo.radius;\n const firstRaycastHit = this.config.collisionsManager.raycastFirst(this.tempRay);\n if (firstRaycastHit !== null) {\n this.currentHeight = firstRaycastHit[0];\n this.currentSurfaceAngle.copy(firstRaycastHit[1]);\n } else {\n this.currentHeight = Number.POSITIVE_INFINITY;\n }\n\n if (this.controlState) {\n this.updateRotation(deltaTime);\n }\n\n this.config.collisionsManager.setCharacterPosition(this.config.position);\n this.config.collisionsManager.setExemptFromCulling(\n this.lastFrameSurfaceState ? this.lastFrameSurfaceState[0] : null,\n );\n\n for (let i = 0; i < this.collisionDetectionSteps; i++) {\n this.updatePosition(deltaTime, deltaTime / this.collisionDetectionSteps, i);\n }\n\n // bounds check\n const outOfBounds =\n this.config.position.x < this.minimumX || // left\n this.config.position.x > this.maximumX || // right\n this.config.position.z < this.minimumZ || // back\n this.config.position.z > this.maximumZ || // front\n this.config.position.y < this.minimumY || // down\n this.config.position.y > this.maximumY; // up\n\n if (outOfBounds) {\n this.resetPosition();\n }\n this.updateNetworkState();\n }\n\n public getTargetAnimation(): AnimationState {\n const jumpHeight = this.characterVelocity.y > 0 ? 0.2 : 1.8;\n if (this.currentHeight > jumpHeight && !this.characterOnGround) {\n if (this.doubleJumpUsed) {\n return AnimationState.doubleJump;\n }\n return AnimationState.air;\n }\n if (!this.controlState || this.controlState.direction === null) {\n return AnimationState.idle;\n }\n\n if (this.controlState.isSprinting) {\n return AnimationState.running;\n }\n\n return AnimationState.walking;\n }\n\n private updateRotationOffset(): void {\n if (this.controlState && this.controlState.direction !== null) {\n this.rotationOffset = this.controlState.direction;\n }\n }\n\n private updateAzimuthalAngle(): void {\n const cameraPos = this.tempCameraPos.copy(this.config.cameraManager.getCameraPosition());\n const camToModelDistance = cameraPos.distanceTo(\n this.tempPositionCopy.copy(this.config.position),\n );\n const isCameraFirstPerson = camToModelDistance < 2;\n if (isCameraFirstPerson) {\n const cameraRotation = this.config.cameraManager.getCameraRotation();\n const cameraForward = this.tempVector.set(0, 0, 1).applyQuat(cameraRotation);\n this.azimuthalAngle = Math.atan2(cameraForward.x, cameraForward.z);\n } else {\n const cameraPos = this.config.cameraManager.getCameraPosition();\n this.azimuthalAngle = Math.atan2(\n cameraPos.x - this.config.position.x,\n cameraPos.z - this.config.position.z,\n );\n }\n }\n\n private computeAngularDifference(rotationQuat: Quat): number {\n const rotation = new Quat().copy(this.config.quaternion);\n return 2 * Math.acos(Math.abs(rotation.dot(rotationQuat)));\n }\n\n private updateRotation(deltaTime: number): void {\n this.updateRotationOffset();\n this.updateAzimuthalAngle();\n const rotationQuat = this.tempQuat.setFromAxisAngle(\n this.vectorUp,\n this.azimuthalAngle + this.rotationOffset,\n );\n const angularDifference = this.computeAngularDifference(rotationQuat);\n const desiredTime = 0.07;\n const angularSpeed = angularDifference / desiredTime;\n const frameRotation = angularSpeed * deltaTime;\n this.config.quaternion.rotateTowards(rotationQuat, frameRotation);\n }\n\n private processJump(currentAcceleration: Vect3, deltaTime: number) {\n const jump = this.controlState?.jump;\n\n if (this.characterOnGround) {\n this.coyoteJumped = false;\n this.canDoubleJump = false;\n this.doubleJumpUsed = false;\n this.jumpCounter = 0;\n\n if (!jump) {\n this.canDoubleJump = !this.doubleJumpUsed && this.jumpReleased && this.jumpCounter === 1;\n this.canJump = true;\n this.jumpReleased = true;\n }\n\n if (jump && this.canJump && this.jumpReleased) {\n currentAcceleration.y += this.jumpForce / deltaTime;\n this.canJump = false;\n this.jumpReleased = false;\n this.jumpCounter++;\n } else {\n if (this.currentSurfaceAngle.y < this.minimumSurfaceAngle) {\n currentAcceleration.y += this.gravity;\n }\n }\n } else {\n if (jump && !this.coyoteJumped && this.coyoteTime) {\n this.coyoteJumped = true;\n currentAcceleration.y += this.jumpForce / deltaTime;\n this.canJump = false;\n this.jumpReleased = false;\n this.jumpCounter++;\n } else if (jump && this.canDoubleJump) {\n currentAcceleration.y += this.doubleJumpForce / deltaTime;\n this.doubleJumpUsed = true;\n this.jumpReleased = false;\n this.jumpCounter++;\n } else {\n currentAcceleration.y += this.gravity;\n this.canJump = false;\n }\n }\n\n if (!jump) {\n this.jumpReleased = true;\n if (!this.characterOnGround) {\n currentAcceleration.y += this.gravity;\n }\n }\n }\n\n private applyControls(stepDeltaTime: number): void {\n const resistance = this.characterOnGround ? this.groundResistance : this.airResistance;\n\n // Dampen the velocity based on the resistance\n const speedFactor = Math.pow(1 - resistance, stepDeltaTime);\n this.characterVelocity.multiplyScalar(speedFactor);\n\n const acceleration = this.tempVector.set(0, 0, 0);\n this.canDoubleJump = !this.doubleJumpUsed && this.jumpReleased && this.jumpCounter === 1;\n this.processJump(acceleration, stepDeltaTime);\n\n const control =\n (this.characterOnGround\n ? this.controlState?.isSprinting\n ? this.groundRunControl\n : this.groundWalkControl\n : this.airControlModifier) * this.baseControl;\n\n const controlAcceleration = this.tempVector2.set(0, 0, 0);\n\n if (this.controlState && this.controlState.direction !== null) {\n // convert heading to direction vector\n const heading = this.controlState.direction;\n const headingVector = this.tempVect3\n .set(0, 0, 1)\n .applyAxisAngle(this.vectorUp, this.azimuthalAngle + heading);\n controlAcceleration.add(headingVector);\n }\n if (controlAcceleration.lengthSquared() > 0) {\n controlAcceleration.normalize();\n controlAcceleration.multiplyScalar(control);\n }\n acceleration.add(controlAcceleration);\n this.characterVelocity.addScaledVector(acceleration, stepDeltaTime);\n\n this.config.position.addScaledVector(this.characterVelocity, stepDeltaTime);\n }\n\n private updatePosition(deltaTime: number, stepDeltaTime: number, iter: number): void {\n this.applyControls(stepDeltaTime);\n\n if (iter === 0) {\n const lastMovement = this.getMovementFromSurfaces(this.config.position, deltaTime);\n if (lastMovement) {\n const newPosition = this.tempVector.copy(this.config.position);\n newPosition.add(lastMovement.position);\n this.config.position.set(newPosition.x, newPosition.y, newPosition.z);\n const asQuat = this.config.quaternion;\n const lastMovementEulXYZ = this.tempEulXYZ.setFromQuaternion(lastMovement.rotation);\n lastMovementEulXYZ.x = 0;\n lastMovementEulXYZ.z = 0;\n lastMovement.rotation.setFromEulerXYZ(lastMovementEulXYZ);\n asQuat.multiply(lastMovement.rotation);\n }\n }\n\n const avatarSegment = this.tempSegment;\n avatarSegment.copy(this.capsuleInfo.segment!);\n avatarSegment.start.add(this.config.position);\n avatarSegment.start.y += this.capsuleInfo.radius;\n avatarSegment.end.add(this.config.position);\n avatarSegment.end.y += this.capsuleInfo.radius;\n\n const positionBeforeCollisions = this.tempVector.copy(avatarSegment.start);\n this.config.collisionsManager.applyColliders(avatarSegment, this.capsuleInfo.radius!);\n\n // Raycast from the top of the capsule to the bottom of the capsule to see if there is a surface intersecting the capsule\n const capsuleLength =\n this.capsuleInfo.segment.end.y -\n this.capsuleInfo.segment.start.y +\n this.capsuleInfo.radius * 2;\n // Set the origin of the ray to the bottom of the segment (1 radius length from the bottom point of the capsule)\n this.tempRay.set(avatarSegment.start, this.vectorDown);\n\n // Amount to ignore from the start and end of the ray (to avoid unwanted collisions)\n const endIgnoreLength = 0.1;\n\n // Move the ray origin to the bottom of the capsule and then add the total length to move the ray origin to the top point of the capsule\n this.tempRay.origin.y += -this.capsuleInfo.radius + capsuleLength - endIgnoreLength;\n // Find the first mesh that intersects the ray\n const withinCapsuleRayHit = this.config.collisionsManager.raycastFirst(\n this.tempRay,\n capsuleLength - endIgnoreLength * 2,\n );\n if (withinCapsuleRayHit !== null) {\n // There is a mesh ray collision within the capsule. Move the character up to the point of the collision\n const rayHitPosition = withinCapsuleRayHit[3];\n avatarSegment.start.copy(rayHitPosition);\n // Account for the radius of the capsule\n avatarSegment.start.y += this.capsuleInfo.radius;\n }\n\n this.config.position.set(\n avatarSegment.start.x,\n avatarSegment.start.y - this.capsuleInfo.radius,\n avatarSegment.start.z,\n );\n const deltaCollisionPosition = avatarSegment.start.sub(positionBeforeCollisions);\n this.characterOnGround = deltaCollisionPosition.y > 0;\n\n if (this.characterOnGround) {\n this.doubleJumpUsed = false;\n this.jumpCounter = 0;\n }\n\n if (this.characterWasOnGround && !this.characterOnGround) {\n this.characterAirborneSince = Date.now();\n }\n\n if (!this.controlState?.jump) {\n this.jumpReleased = true;\n }\n\n this.coyoteTime =\n this.characterVelocity.y < 0 &&\n !this.characterOnGround &&\n Date.now() - this.characterAirborneSince < this.coyoteTimeThreshold;\n\n this.latestPosition.copy(this.config.position);\n this.characterWasOnGround = this.characterOnGround;\n }\n\n public getMovementFromSurfaces(userPosition: IVect3, deltaTime: number) {\n let lastMovement: { rotation: Quat; position: Vect3 } | null = null;\n\n // If we have a last frame state, we can calculate the movement of the mesh to apply it to the user\n if (this.lastFrameSurfaceState !== null) {\n const meshState = this.lastFrameSurfaceState[0];\n\n // Extract the matrix from the current frame and the last frame\n const currentFrameMatrix = meshState.matrix;\n const lastFrameMatrix = this.lastFrameSurfaceState[1].lastMatrix;\n\n if (lastFrameMatrix.equals(currentFrameMatrix)) {\n // No movement from this mesh - do nothing\n this.surfaceIsMoving = false;\n } else {\n this.surfaceIsMoving = true;\n // The mesh has moved since the last frame - calculate the movement\n\n // Get the position of the mesh in the last frame\n const lastMeshPosition = this.surfaceTempVector1;\n const lastMeshRotation = this.surfaceTempQuat;\n lastFrameMatrix.decompose(lastMeshPosition, lastMeshRotation, this.surfaceTempVect3);\n\n // Get the position of the mesh in the current frame\n const currentMeshPosition = this.surfaceTempVector2;\n const currentMeshRotation = this.surfaceTempQuat2;\n currentFrameMatrix.decompose(\n currentMeshPosition,\n currentMeshRotation,\n this.surfaceTempVect3,\n );\n\n // Calculate the difference between the new position and the old position to determine the movement due to translation of position\n const meshTranslationDelta = this.surfaceTempVector5\n .copy(currentMeshPosition)\n .sub(lastMeshPosition);\n\n // Calculate the relative position of the user to the mesh in the last frame\n const lastFrameRelativeUserPosition = this.surfaceTempVect3\n .copy(userPosition)\n .sub(lastMeshPosition);\n\n // Calculate the world-relative rotation delta from the last frame to the current frame\n const meshRotationDelta = currentMeshRotation.multiply(lastMeshRotation.invert());\n\n // Apply the relative quaternion to the relative user position to determine the new position of the user given just the rotation\n const translationDueToRotation = this.surfaceTempVector4\n .copy(lastFrameRelativeUserPosition)\n .applyQuat(meshRotationDelta)\n .sub(lastFrameRelativeUserPosition);\n\n // Combine the mesh translation delta and the rotation translation delta to determine the total movement of the user\n const translationAndRotationPositionDelta = this.surfaceTempVector1\n .copy(meshTranslationDelta)\n .add(translationDueToRotation);\n\n lastMovement = {\n position: translationAndRotationPositionDelta,\n rotation: meshRotationDelta,\n };\n lastFrameMatrix.copy(currentFrameMatrix);\n }\n }\n\n const newPosition = this.surfaceTempVect3.copy(userPosition);\n if (lastMovement) {\n newPosition.add(lastMovement.position);\n }\n newPosition.y = newPosition.y + 0.05;\n\n // Raycast down from the new position to see if there is a surface below the user which will be tracked in the next frame\n const ray = this.surfaceTempRay.set(newPosition, downVector);\n const hit = this.config.collisionsManager.raycastFirst(ray);\n if (hit && hit[0] < 0.8) {\n // There is a surface below the user\n const currentCollisionMeshState = hit[2];\n this.lastFrameSurfaceState = [\n currentCollisionMeshState,\n { lastMatrix: this.lastMatrixTemp.copy(currentCollisionMeshState.matrix) },\n ];\n } else {\n if (this.lastFrameSurfaceState !== null && lastMovement) {\n // Apply the last movement to the user's velocity\n this.characterVelocity.add(\n lastMovement.position.clone().multiplyScalar(1 / deltaTime), // The position delta is the result of one tick which is deltaTime seconds, so we need to divide by deltaTime to get the velocity per second\n );\n }\n this.lastFrameSurfaceState = null;\n this.surfaceIsMoving = false;\n }\n return lastMovement;\n }\n\n private updateNetworkState(): void {\n const characterPosition = this.config.position;\n const characterQuat = this.config.quaternion;\n\n this.networkState = {\n position: {\n x: characterPosition.x,\n y: characterPosition.y,\n z: characterPosition.z,\n },\n rotation: { eulerY: 2 * Math.atan2(characterQuat.y, characterQuat.w) },\n state: this.getTargetAnimation(),\n };\n }\n\n /**\n * Programmatic jump with optional custom force. Supports double jump.\n * Returns true if the jump was initiated.\n */\n public jump(force?: number): boolean {\n if (this.characterOnGround && this.jumpCounter === 0) {\n this.characterVelocity.y = force ?? this.jumpForce;\n this.characterOnGround = false;\n this.jumpReleased = false;\n this.jumpCounter++;\n return true;\n }\n if (!this.characterOnGround && this.jumpCounter === 1 && !this.doubleJumpUsed) {\n this.characterVelocity.y += force ?? this.doubleJumpForce;\n this.doubleJumpUsed = true;\n this.jumpReleased = false;\n this.jumpCounter++;\n return true;\n }\n return false;\n }\n\n /**\n * Set horizontal velocity directly, bypassing the input-based acceleration.\n * Useful for programmatic movement (e.g., agent bridge waypoint following).\n * Vertical velocity is not affected (gravity and jump still apply normally).\n */\n public setHorizontalVelocity(vx: number, vz: number): void {\n this.characterVelocity.x = vx;\n this.characterVelocity.z = vz;\n }\n\n /** Current vertical velocity (positive = upward). */\n public get verticalVelocity(): number {\n return this.characterVelocity.y;\n }\n\n /**\n * Reset velocity and jump state (e.g., on teleport).\n */\n public resetVelocity(): void {\n this.characterVelocity.set(0, 0, 0);\n this.characterOnGround = false;\n this.doubleJumpUsed = false;\n this.jumpReleased = true;\n this.jumpCounter = 0;\n this.lastFrameSurfaceState = null;\n }\n\n public resetPosition(): void {\n this.resetVelocity();\n\n const spawnData = getSpawnData(this.config.spawnConfiguration, false);\n\n this.config.position.set(\n spawnData.spawnPosition.x,\n spawnData.spawnPosition.y,\n spawnData.spawnPosition.z,\n );\n\n this.config.quaternion.setFromEulerXYZ(spawnData.spawnRotation);\n }\n}\n", "import { EulXYZ, Quat, Vect3 } from \"../math\";\n\nimport { AnimationState, CharacterState } from \"./CharacterState\";\n\nconst tempQuaternion = new Quat();\n\n/**\n * RemoteController handles interpolation of remote character state.\n * It's renderer-agnostic and only calculates interpolated positions/rotations.\n */\nexport class RemoteController {\n // Current interpolated state\n public position: Vect3;\n public rotation: Quat;\n public animationState: AnimationState;\n\n private hasReceivedInitialUpdate = false;\n private interpolationRate = 8.0; // How quickly to interpolate (higher = faster)\n private cachedTargetPos = new Vect3();\n\n constructor(initialPosition: Vect3, initialRotation: EulXYZ, initialAnimation: AnimationState) {\n this.position = new Vect3(initialPosition.x, initialPosition.y, initialPosition.z);\n this.rotation = new Quat().setFromEulerXYZ(initialRotation);\n this.animationState = initialAnimation;\n }\n\n public update(networkUpdate: CharacterState, deltaTime: number): void {\n const { position, rotation, state } = networkUpdate;\n\n // Reuse cached Vect3 instead of allocating new one\n const targetPos = this.cachedTargetPos.set(position.x, position.y, position.z);\n const halfY = rotation.eulerY / 2;\n const targetRotQuat = tempQuaternion.set(0, Math.sin(halfY), 0, Math.cos(halfY));\n\n if (!this.hasReceivedInitialUpdate) {\n // First update, snap into position\n this.position.set(targetPos.x, targetPos.y, targetPos.z);\n this.rotation.set(targetRotQuat.x, targetRotQuat.y, targetRotQuat.z, targetRotQuat.w);\n this.animationState = state;\n this.hasReceivedInitialUpdate = true;\n } else {\n // Interpolate position\n const distSq = this.position.distanceToSquared(targetPos);\n if (distSq > 5 * 5) {\n // More than 5m of movement - teleport\n this.position.set(targetPos.x, targetPos.y, targetPos.z);\n } else {\n // Frame-rate independent exponential smoothing\n const lerpFactor = Math.min(1.0, 1.0 - Math.exp(-this.interpolationRate * deltaTime));\n this.position.lerp(targetPos, lerpFactor);\n }\n\n // Interpolate rotation\n const lerpFactor = Math.min(1.0, 1.0 - Math.exp(-this.interpolationRate * deltaTime));\n this.rotation.slerp(targetRotQuat, lerpFactor);\n\n // Update animation\n this.animationState = state;\n }\n }\n\n public getRotationEuler(): EulXYZ {\n return new EulXYZ().setFromQuaternion(this.rotation);\n }\n}\n", "import { EventHandlerCollection } from \"./EventHandlerCollection\";\nimport { VirtualJoystick } from \"./VirtualJoystick\";\n\nexport enum Key {\n W = \"w\",\n A = \"a\",\n S = \"s\",\n D = \"d\",\n SHIFT = \"shift\",\n SPACE = \" \",\n C = \"c\",\n}\n\ntype KeyCallback = () => void;\ntype BindingsType = Map<Key, KeyCallback>;\n\nexport class KeyInputManager {\n private keys = new Map<string, boolean>();\n private eventHandlerCollection = new EventHandlerCollection();\n private bindings: BindingsType = new Map();\n\n constructor(private shouldCaptureKeyPress: () => boolean = () => true) {\n this.eventHandlerCollection.add(document, \"keydown\", this.onKeyDown.bind(this));\n this.eventHandlerCollection.add(document, \"keyup\", this.onKeyUp.bind(this));\n this.eventHandlerCollection.add(window, \"blur\", this.handleUnfocus.bind(this));\n }\n\n private handleUnfocus(_event: FocusEvent): void {\n this.keys.clear();\n }\n\n private onKeyDown(event: KeyboardEvent): void {\n if (this.shouldCaptureKeyPress()) {\n if (event.key.length === 2 && event.key[0] === \"F\") {\n // Ignore all Function keys\n return;\n }\n if (event.metaKey) {\n // Ignore all meta keys (e.g. Alt, Cmd)\n return;\n }\n this.keys.set(event.key.toLowerCase(), true);\n event.preventDefault();\n }\n }\n\n private onKeyUp(event: KeyboardEvent): void {\n this.keys.set(event.key.toLowerCase(), false);\n if (this.bindings.has(event.key.toLowerCase() as Key)) {\n this.bindings.get(event.key.toLowerCase() as Key)!();\n }\n }\n\n public isKeyPressed(key: string): boolean {\n return this.keys.get(key) || false;\n }\n\n public createKeyBinding(key: Key, callback: () => void): void {\n if (this.bindings.has(key)) {\n return;\n }\n this.bindings.set(key, callback);\n }\n\n public removeKeyBinding(key: Key): void {\n if (!this.bindings.has(key)) {\n return;\n }\n this.bindings.delete(key);\n }\n\n public isMovementKeyPressed(): boolean {\n return [Key.W, Key.A, Key.S, Key.D].some((key) => this.isKeyPressed(key));\n }\n\n private getForward(): boolean {\n return this.isKeyPressed(Key.W);\n }\n\n private getBackward(): boolean {\n return this.isKeyPressed(Key.S);\n }\n\n private getLeft(): boolean {\n return this.isKeyPressed(Key.A);\n }\n\n private getRight(): boolean {\n return this.isKeyPressed(Key.D);\n }\n\n private getRun(): boolean {\n return this.isKeyPressed(Key.SHIFT);\n }\n\n private getJump(): boolean {\n return this.isKeyPressed(Key.SPACE);\n }\n\n public getOutput(): { direction: number | null; isSprinting: boolean; jump: boolean } | null {\n const dx = (this.getRight() ? 1 : 0) - (this.getLeft() ? 1 : 0);\n const dy = (this.getBackward() ? 1 : 0) - (this.getForward() ? 1 : 0);\n const jump = this.getJump();\n if (dx === 0 && dy === 0) {\n if (this.getJump()) {\n return { direction: null, isSprinting: false, jump };\n }\n return null;\n }\n const direction = Math.atan2(dx, dy);\n return { direction, isSprinting: this.getRun(), jump };\n }\n\n public dispose() {\n this.eventHandlerCollection.clear();\n this.bindings.clear();\n }\n}\n", "interface VirtualJoyStickConfig {\n radius?: number;\n innerRadius?: number;\n mouseSupport?: boolean;\n}\n\nconst sprintingThreshold = 0.6;\n\nexport class VirtualJoystick {\n private radius: number;\n private innerRadius: number;\n private mouseSupport: boolean;\n\n private element: HTMLDivElement;\n\n private joystickBaseElement: HTMLSpanElement;\n private joystickCenterElement: HTMLSpanElement;\n private joystickPointerId: number | null = null;\n private joystickOutput: { direction: number; isSprinting: boolean } | null = null;\n\n private jumpButton: HTMLButtonElement;\n private jumpPointerId: number | null = null;\n\n constructor(\n private holderElement: HTMLElement,\n private config: VirtualJoyStickConfig,\n ) {\n this.radius = config.radius || 50;\n this.innerRadius = config.innerRadius || this.radius / 2;\n this.mouseSupport = this.checkTouch() || config.mouseSupport === true;\n\n this.element = document.createElement(\"div\");\n const style = this.element.style;\n style.display = this.mouseSupport ? \"flex\" : \"none\";\n style.position = \"absolute\";\n style.width = `100%`;\n style.height = `200px`;\n style.bottom = \"68px\";\n style.zIndex = \"10000\";\n style.alignItems = \"center\";\n style.justifyContent = \"space-between\";\n style.pointerEvents = \"none\";\n style.padding = \"12px\";\n style.boxSizing = \"border-box\";\n style.userSelect = \"none\";\n this.holderElement.appendChild(this.element);\n\n this.joystickBaseElement = this.createBase();\n this.element.appendChild(this.joystickBaseElement);\n\n this.joystickCenterElement = this.createCenter();\n this.joystickBaseElement.appendChild(this.joystickCenterElement);\n\n this.jumpButton = this.createJumpButton();\n this.element.appendChild(this.jumpButton);\n\n this.bindEvents();\n\n this.clearJoystickState();\n }\n\n public static checkForTouch(): boolean {\n try {\n document.createEvent(\"TouchEvent\");\n return true;\n } catch (e) {\n return false;\n }\n }\n\n private checkTouch() {\n return VirtualJoystick.checkForTouch();\n }\n\n private createBase() {\n const base = document.createElement(\"span\");\n const style = base.style;\n style.touchAction = \"pinch-zoom\";\n style.width = `${this.radius * 2}px`;\n style.height = `${this.radius * 2}px`;\n style.position = \"relative\";\n style.display = \"block\";\n style.borderRadius = \"50%\";\n style.background = \"rgba(0, 0, 0, 0.3)\";\n style.borderColor = \"rgba(255, 255, 255, 0.2)\";\n style.borderWidth = \"1px\";\n style.borderStyle = \"solid\";\n style.backdropFilter = \"blur(10px)\";\n style.setProperty(\"-webkit-backdrop-filter\", \"blur(10px)\");\n style.boxShadow = \"0 4px 24px rgba(0, 0, 0, 0.4)\";\n style.pointerEvents = \"auto\";\n style.userSelect = \"none\";\n return base;\n }\n\n private createCenter() {\n const center = document.createElement(\"div\");\n const style = center.style;\n style.width = `${this.innerRadius * 2}px`;\n style.height = `${this.innerRadius * 2}px`;\n style.position = \"absolute\";\n style.borderRadius = \"50%\";\n style.backgroundColor = \"rgba(255, 255, 255, 0.15)\";\n style.borderWidth = \"1px\";\n style.borderColor = \"rgba(255, 255, 255, 0.3)\";\n style.borderStyle = \"solid\";\n style.boxShadow = \"0 2px 8px rgba(0, 0, 0, 0.3)\";\n style.userSelect = \"none\";\n return center;\n }\n\n private createJumpButton() {\n const button = document.createElement(\"button\");\n button.textContent = \"JUMP\";\n const style = button.style;\n style.touchAction = \"pinch-zoom\";\n style.width = `100px`;\n style.height = `100px`;\n style.borderRadius = \"50%\";\n style.color = \"rgba(255, 255, 255, 0.9)\";\n style.fontFamily =\n \"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, sans-serif\";\n style.fontSize = \"14px\";\n style.fontWeight = \"500\";\n style.letterSpacing = \"0.5px\";\n style.background = \"linear-gradient(135deg, rgba(0, 0, 0, 0.6), rgba(0, 0, 0, 0.4))\";\n style.borderWidth = \"1px\";\n style.borderColor = \"rgba(255, 255, 255, 0.2)\";\n style.borderStyle = \"solid\";\n style.backdropFilter = \"blur(10px)\";\n style.setProperty(\"-webkit-backdrop-filter\", \"blur(10px)\");\n style.boxShadow = \"0 4px 24px rgba(0, 0, 0, 0.4)\";\n style.pointerEvents = \"auto\";\n style.userSelect = \"none\";\n style.transition = \"all 0.2s ease-in-out\";\n style.cursor = \"pointer\";\n return button;\n }\n\n private bindEvents(): void {\n this.joystickBaseElement.addEventListener(\"pointerdown\", this.onJoystickPointerDown.bind(this));\n this.joystickBaseElement.addEventListener(\n \"contextmenu\",\n this.preventDefaultAndStopPropagation.bind(this),\n );\n this.joystickBaseElement.addEventListener(\n \"touchstart\",\n this.preventDefaultAndStopPropagation.bind(this),\n );\n\n this.jumpButton.addEventListener(\"pointerenter\", () => {\n this.jumpButton.style.background =\n \"linear-gradient(135deg, rgba(0, 0, 0, 0.8), rgba(0, 0, 0, 0.6))\";\n this.jumpButton.style.borderColor = \"rgba(255, 255, 255, 0.3)\";\n this.jumpButton.style.transform = \"scale(1.05)\";\n });\n this.jumpButton.addEventListener(\"pointerleave\", () => {\n this.jumpButton.style.background =\n \"linear-gradient(135deg, rgba(0, 0, 0, 0.6), rgba(0, 0, 0, 0.4))\";\n this.jumpButton.style.borderColor = \"rgba(255, 255, 255, 0.2)\";\n this.jumpButton.style.transform = \"\";\n });\n this.jumpButton.addEventListener(\"pointerdown\", this.onJumpPointerDown.bind(this));\n this.jumpButton.addEventListener(\n \"contextmenu\",\n this.preventDefaultAndStopPropagation.bind(this),\n );\n this.jumpButton.addEventListener(\n \"touchstart\",\n this.preventDefaultAndStopPropagation.bind(this),\n );\n document.addEventListener(\"pointermove\", this.onPointerMove.bind(this));\n document.addEventListener(\"pointerup\", this.onPointerUp.bind(this));\n document.addEventListener(\"pointercancel\", this.onPointerUp.bind(this));\n }\n\n private preventDefaultAndStopPropagation(evt: PointerEvent): void {\n evt.preventDefault();\n evt.stopPropagation();\n }\n\n private onJumpPointerDown(evt: PointerEvent): void {\n if (this.jumpPointerId === null) {\n this.jumpPointerId = evt.pointerId;\n }\n }\n\n private onJoystickPointerDown(evt: PointerEvent): void {\n evt.preventDefault();\n evt.stopPropagation();\n if (evt.buttons !== 1) {\n return;\n }\n if (this.joystickPointerId === null) {\n this.joystickPointerId = evt.pointerId;\n this.updateControlAndDirection(evt);\n }\n }\n\n private onPointerMove(evt: PointerEvent): void {\n evt.preventDefault();\n evt.stopPropagation();\n if (evt.pointerId !== this.joystickPointerId) {\n return;\n }\n this.updateControlAndDirection(evt);\n }\n\n private onPointerUp(evt: PointerEvent): void {\n evt.preventDefault();\n evt.stopPropagation();\n\n if (evt.pointerId === this.jumpPointerId) {\n this.jumpPointerId = null;\n }\n if (evt.pointerId === this.joystickPointerId) {\n this.joystickPointerId = null;\n this.clearJoystickState();\n }\n }\n\n private clearJoystickState = (): void => {\n this.joystickOutput = null;\n this.joystickCenterElement.style.left = `${this.radius - this.innerRadius}px`;\n this.joystickCenterElement.style.top = `${this.radius - this.innerRadius}px`;\n };\n\n private updateControlAndDirection(input: PointerEvent): void {\n const rect = this.joystickBaseElement.getBoundingClientRect();\n const dx = input.clientX - (rect.left + this.radius);\n const dy = input.clientY - (rect.top + this.radius);\n\n const distance = Math.min(Math.sqrt(dx * dx + dy * dy), this.radius);\n const angle = Math.atan2(dy, dx);\n const constrainedX = distance * Math.cos(angle);\n const constrainedY = distance * Math.sin(angle);\n\n this.joystickCenterElement.style.left = `${constrainedX + this.radius - this.innerRadius}px`;\n this.joystickCenterElement.style.top = `${constrainedY + this.radius - this.innerRadius}px`;\n\n const direction = Math.atan2(dx, dy);\n const speed = distance / this.radius;\n const isSprinting = speed > sprintingThreshold;\n this.joystickOutput = { direction, isSprinting };\n }\n\n public getOutput(): { direction: number | null; isSprinting: boolean; jump: boolean } | null {\n const jump = this.jumpPointerId !== null;\n if (!this.joystickOutput) {\n if (jump) {\n return { direction: null, isSprinting: false, jump: jump };\n }\n return null;\n }\n return {\n ...this.joystickOutput,\n jump: jump,\n };\n }\n}\n", "import { MElement, MMLCollisionTrigger } from \"@mml-io/mml-web\";\nimport type { Ray as ThreeRay, Vector3, Box3, Line3 } from \"three\";\nimport type { MeshBVH } from \"three-mesh-bvh\";\n\nimport { Box } from \"../math/Box\";\nimport { EulXYZ } from \"../math/EulXYZ\";\nimport { Line } from \"../math/Line\";\nimport { Matr4 } from \"../math/Matr4\";\nimport { Quat } from \"../math/Quat\";\nimport { Ray } from \"../math/Ray\";\nimport { IVect3, Vect3 } from \"../math/Vect3\";\n\nimport { getRelativePositionAndRotationRelativeToObject } from \"./getRelativePositionAndRotationRelativeToObject\";\n\ntype CollisionSourceRef = unknown;\n\nexport type CollisionMeshState = {\n matrix: Matr4;\n localScale: IVect3;\n source: CollisionSourceRef;\n meshBVH: MeshBVH;\n trackCollisions: boolean;\n boundingSphereRadius: number; // Cached bounding sphere radius for culling\n};\n\nexport type CollisionMesh = {\n meshBVH: MeshBVH;\n matrix: Matr4;\n localScale: IVect3;\n};\n\nexport class CollisionsManager {\n private tempVector: Vect3 = new Vect3();\n private tempVector2: Vect3 = new Vect3();\n private tempVect3: Vect3 = new Vect3();\n private tempQuat: Quat = new Quat();\n private tempRay: Ray = new Ray();\n private tempMatrix = new Matr4();\n private tempBox = new Box();\n private tempEulXYZ = new EulXYZ();\n private tempSegment = new Line();\n private tempSegment2 = new Line();\n private tempCollisionPosition = new Vect3();\n private tempMinimalNormal = new Vect3();\n private tempMinimalPoint = new Vect3();\n private tempBoundsBox = new Box(); // Pre-allocated for getBoundingBox\n\n public collisionMeshState: Map<CollisionSourceRef, CollisionMeshState> = new Map();\n private collisionTrigger: MMLCollisionTrigger<CollisionSourceRef>;\n private previouslyCollidingElements: null | Map<\n CollisionSourceRef,\n { position: { x: number; y: number; z: number } }\n >;\n\n private debugEnabled: boolean = false;\n public onDebugChange?: (enabled: boolean) => void;\n\n private cullingEnabled: boolean = true;\n private cullingRadius: number = 50; // max distance from character to consider meshes\n private characterPosition: Vect3 = new Vect3();\n\n private exemptFromCulling: CollisionMeshState | null = null;\n\n constructor() {\n this.collisionTrigger = MMLCollisionTrigger.init();\n this.toggleDebug = this.toggleDebug.bind(this);\n }\n\n public isDebugEnabled(): boolean {\n return this.debugEnabled;\n }\n\n public toggleDebug(enabled: boolean) {\n this.debugEnabled = enabled;\n if (this.onDebugChange) {\n this.onDebugChange(enabled);\n }\n }\n\n public setCullingEnabled(enabled: boolean): void {\n this.cullingEnabled = enabled;\n }\n\n public setCharacterPosition(position: IVect3): void {\n this.characterPosition.set(position.x, position.y, position.z);\n }\n\n public setExemptFromCulling(meshState: CollisionMeshState | null): void {\n this.exemptFromCulling = meshState;\n }\n\n private isMeshWithinCullingDistance(meshState: CollisionMeshState): boolean {\n if (!this.cullingEnabled) return true;\n\n // never cull the mesh the player is standing on\n if (this.exemptFromCulling !== null && meshState === this.exemptFromCulling) {\n return true;\n }\n\n const matrixData = meshState.matrix.data;\n const dx = matrixData[12] - this.characterPosition.x;\n const dy = matrixData[13] - this.characterPosition.y;\n const dz = matrixData[14] - this.characterPosition.z;\n const distanceSquared = dx * dx + dy * dy + dz * dz;\n\n const maxScale = Math.max(\n meshState.localScale.x,\n meshState.localScale.y,\n meshState.localScale.z,\n );\n const worldBoundingSphereRadius = meshState.boundingSphereRadius * maxScale;\n\n const effectiveRadius = this.cullingRadius + worldBoundingSphereRadius;\n return distanceSquared <= effectiveRadius * effectiveRadius;\n }\n\n public raycastFirst(\n ray: Ray,\n maximumDistance: number | null = null,\n ): [number, Vect3, CollisionMeshState, Vect3] | null {\n let minimumDistance: number | null = null;\n let minimumHit: CollisionMeshState | null = null;\n let minimumNormal: Vect3 = this.tempMinimalNormal;\n let minimumPoint: Vect3 = this.tempMinimalPoint;\n for (const [, collisionMeshState] of this.collisionMeshState) {\n if (this.cullingEnabled && !this.isMeshWithinCullingDistance(collisionMeshState)) {\n continue;\n }\n\n const invertedMatrix = this.tempMatrix.copy(collisionMeshState.matrix).invert();\n\n const originalRay = this.tempRay.copy(ray);\n originalRay.applyMatrix4(invertedMatrix);\n\n const hit = collisionMeshState.meshBVH.raycastFirst(\n originalRay as unknown as ThreeRay,\n 2, // DoubleSide\n );\n if (hit) {\n this.tempSegment.start.copy(originalRay.origin);\n this.tempSegment.end.copy(hit.point);\n this.tempSegment.applyMatrix4(collisionMeshState.matrix);\n const dist = this.tempSegment.distance();\n if (\n (maximumDistance === null || dist < maximumDistance) &&\n (minimumDistance === null || dist < minimumDistance)\n ) {\n minimumDistance = dist;\n minimumHit = collisionMeshState;\n minimumNormal = (hit.normal ? minimumNormal.copy(hit.normal) : minimumNormal.set(0, 1, 0))\n // Apply the rotation of the mesh to the normal\n .applyQuat(this.tempQuat.setFromRotationMatrix(collisionMeshState.matrix))\n .normalize();\n minimumPoint = minimumPoint.copy(hit.point).applyMatrix4(collisionMeshState.matrix);\n }\n }\n }\n if (minimumDistance === null || minimumHit === null) {\n return null;\n }\n return [minimumDistance, minimumNormal, minimumHit, minimumPoint];\n }\n\n public addMeshesGroup(\n group: CollisionSourceRef,\n creationResult: CollisionMesh,\n mElement?: MElement,\n ): void {\n if (mElement) {\n this.collisionTrigger.addCollider(group, mElement);\n }\n const { meshBVH, matrix, localScale } = creationResult;\n\n // bounding sphere radius as max distance from local origin to any corner of bounds.\n meshBVH.getBoundingBox(this.tempBoundsBox as unknown as Box3);\n const minX = this.tempBoundsBox.min.x;\n const minY = this.tempBoundsBox.min.y;\n const minZ = this.tempBoundsBox.min.z;\n const maxX = this.tempBoundsBox.max.x;\n const maxY = this.tempBoundsBox.max.y;\n const maxZ = this.tempBoundsBox.max.z;\n // Compare squared distances, then sqrt once at the end\n const boundingSphereRadiusSq = Math.max(\n minX * minX + minY * minY + minZ * minZ,\n minX * minX + minY * minY + maxZ * maxZ,\n minX * minX + maxY * maxY + minZ * minZ,\n minX * minX + maxY * maxY + maxZ * maxZ,\n maxX * maxX + minY * minY + minZ * minZ,\n maxX * maxX + minY * minY + maxZ * maxZ,\n maxX * maxX + maxY * maxY + minZ * minZ,\n maxX * maxX + maxY * maxY + maxZ * maxZ,\n );\n const boundingSphereRadius = Math.sqrt(boundingSphereRadiusSq);\n\n const meshState: CollisionMeshState = {\n source: group,\n meshBVH,\n matrix,\n localScale,\n trackCollisions: mElement !== undefined,\n boundingSphereRadius,\n };\n this.collisionMeshState.set(group, meshState);\n }\n\n public updateMeshesGroup(group: CollisionSourceRef, matrix: Matr4, localScale: IVect3): void {\n const meshState = this.collisionMeshState.get(group);\n if (meshState) {\n meshState.matrix.copy(matrix);\n meshState.localScale.x = localScale.x;\n meshState.localScale.y = localScale.y;\n meshState.localScale.z = localScale.z;\n }\n }\n\n public removeMeshesGroup(group: CollisionSourceRef): void {\n this.collisionTrigger.removeCollider(group);\n const meshState = this.collisionMeshState.get(group);\n if (meshState) {\n this.collisionMeshState.delete(group);\n }\n }\n\n private applyCollider(\n worldBasedCapsuleSegment: Line,\n capsuleRadius: number,\n meshState: CollisionMeshState,\n ): Vect3 | null {\n // Create a matrix to convert from world-space to mesh-space\n const meshMatrix = this.tempMatrix.copy(meshState.matrix).invert();\n\n // Create the bounding box for the capsule if it were in mesh-space\n const meshRelativeCapsuleBoundingBox = this.tempBox;\n meshRelativeCapsuleBoundingBox.makeEmpty();\n meshRelativeCapsuleBoundingBox.expandByPoint(worldBasedCapsuleSegment.start);\n meshRelativeCapsuleBoundingBox.expandByPoint(worldBasedCapsuleSegment.end);\n meshRelativeCapsuleBoundingBox.min.subScalar(capsuleRadius);\n meshRelativeCapsuleBoundingBox.max.addScalar(capsuleRadius);\n meshRelativeCapsuleBoundingBox.applyMatrix4(meshMatrix);\n // Create a segment/line for the capsule in mesh-space\n const meshRelativeCapsuleSegment = this.tempSegment;\n meshRelativeCapsuleSegment.start.copy(worldBasedCapsuleSegment.start);\n meshRelativeCapsuleSegment.end.copy(worldBasedCapsuleSegment.end);\n meshRelativeCapsuleSegment.applyMatrix4(meshMatrix);\n\n // Keep track of where the segment started in mesh-space so that we can calculate the delta later\n const initialMeshRelativeCapsuleSegmentStart = this.tempVect3.copy(\n meshRelativeCapsuleSegment.start,\n );\n\n let collisionPosition: Vect3 | null = null;\n let currentCollisionDistance: number = -1;\n meshState.meshBVH.shapecast({\n intersectsBounds: (meshBox) => {\n // Determine if this portion of the mesh overlaps with the capsule bounding box and is therefore worth checking\n // all of the triangles within\n return meshBox.intersectsBox(meshRelativeCapsuleBoundingBox as unknown as Box3);\n },\n intersectsTriangle: (meshTriangle) => {\n const closestPointOnTriangle = this.tempVector;\n const closestPointOnSegment = this.tempVector2;\n // Find the closest point between this triangle and the capsule segment in mesh-space\n meshTriangle.closestPointToSegment(\n meshRelativeCapsuleSegment as unknown as Line3,\n closestPointOnTriangle as unknown as Vector3,\n closestPointOnSegment as unknown as Vector3,\n );\n // Create a line segment between the closest points\n const intersectionSegment = this.tempSegment2;\n intersectionSegment.start.copy(closestPointOnTriangle);\n intersectionSegment.end.copy(closestPointOnSegment);\n // Calculate the distance between the closest points in mesh-space\n const modelReferenceDistance = intersectionSegment.distance();\n\n // Calculate the distance between the points in world-space\n intersectionSegment.applyMatrix4(meshState.matrix);\n const realDistance = intersectionSegment.distance();\n\n // If the real distance is less than the capsule radius then there is actually a collision between the capsule\n // and the triangle\n if (realDistance < capsuleRadius) {\n if (!collisionPosition) {\n collisionPosition = this.tempCollisionPosition\n .copy(closestPointOnTriangle)\n .applyMatrix4(meshState.matrix);\n currentCollisionDistance = realDistance;\n } else if (realDistance < currentCollisionDistance) {\n collisionPosition.copy(closestPointOnTriangle).applyMatrix4(meshState.matrix);\n currentCollisionDistance = realDistance;\n }\n // Calculate the ratio between the real distance and the mesh-space distance\n const ratio = realDistance / modelReferenceDistance;\n // Calculate the depth of the collision in world-space\n const realDepth = capsuleRadius - realDistance;\n // Convert that depth back into mesh-space as all calculations during collision are to a mesh-space segment\n const modelDepth = realDepth / ratio;\n\n // Apply a corrective movement to the segment in mesh-space\n const direction = closestPointOnSegment.sub(closestPointOnTriangle).normalize();\n meshRelativeCapsuleSegment.start.addScaledVector(direction, modelDepth);\n meshRelativeCapsuleSegment.end.addScaledVector(direction, modelDepth);\n }\n },\n });\n\n if (collisionPosition) {\n // If there was a collision, calculate the delta between the original mesh-space segment and the now-moved one\n const delta = this.tempVector\n .copy(meshRelativeCapsuleSegment.start)\n .sub(initialMeshRelativeCapsuleSegmentStart);\n\n // Use the matrix for the mesh to convert the delta vector back to world-space (remove the position component of the matrix first to avoid translation)\n this.tempMatrix.copy(meshState.matrix).setPosition(0, 0, 0);\n delta.applyMatrix4(this.tempMatrix);\n\n // There's a possibility that the matrix is invalid (or scale zero) and the delta is NaN - if so, don't apply the delta\n if (!(isNaN(delta.x) && isNaN(delta.y) && isNaN(delta.z))) {\n // Convert the potentially-modified mesh-space segment back to world-space\n worldBasedCapsuleSegment.start.add(delta);\n worldBasedCapsuleSegment.end.add(delta);\n }\n }\n\n return collisionPosition;\n }\n\n public applyColliders(tempSegment: Line, radius: number) {\n const collidedElements = new Map<\n CollisionSourceRef,\n {\n position: { x: number; y: number; z: number };\n }\n >();\n for (const meshState of this.collisionMeshState.values()) {\n // Skip meshes that are too far from the character\n if (this.cullingEnabled && !this.isMeshWithinCullingDistance(meshState)) {\n continue;\n }\n\n const collisionPosition = this.applyCollider(tempSegment, radius, meshState);\n if (collisionPosition && meshState.trackCollisions) {\n const relativePosition = getRelativePositionAndRotationRelativeToObject(\n {\n position: collisionPosition,\n rotation: this.tempEulXYZ.set(0, 0, 0),\n },\n meshState.matrix,\n meshState.localScale,\n );\n collidedElements.set(meshState.source, {\n position: relativePosition.position,\n });\n }\n }\n\n /*\n The reported collisions include elements that were reported in the previous tick to ensure that the case of an\n avatar rising to a negligible distance above the surface and immediately back down onto it does not result in a\n discontinuity in the collision lifecycle. If the element is not colliding in the next frame then it will be\n dropped.\n\n This results in a single tick delay of reporting leave events, but this is a reasonable trade-off to avoid\n flickering collisions.\n */\n const reportedCollidingElements = new Map(collidedElements);\n if (this.previouslyCollidingElements) {\n for (const [element, position] of this.previouslyCollidingElements) {\n if (!reportedCollidingElements.has(element)) {\n reportedCollidingElements.set(element, position);\n }\n }\n }\n\n // Store the elements that were genuinely collided with this tick for the next tick to preserve if they are missed\n this.previouslyCollidingElements = collidedElements;\n this.collisionTrigger.setCurrentCollisions(reportedCollidingElements);\n }\n}\n", "import { PositionAndRotation } from \"@mml-io/mml-web\";\n\nimport { EulXYZ, IVect3, Matr4, Quat, Vect3 } from \"../math\";\n\nconst tempContainerMatrix = new Matr4();\nconst tempTargetMatrix = new Matr4();\nconst tempPositionVector = new Vect3();\nconst tempRotationEuler = new EulXYZ();\nconst tempRotationQuaternion = new Quat();\nconst tempScaleVector = new Vect3();\n\nexport function getRelativePositionAndRotationRelativeToObject(\n positionAndRotation: PositionAndRotation,\n matrix: Matr4,\n localScale: IVect3,\n): PositionAndRotation {\n const { x, y, z } = positionAndRotation.position;\n const { x: rx, y: ry, z: rz } = positionAndRotation.rotation;\n\n tempContainerMatrix.copy(matrix).invert();\n\n tempPositionVector.set(x, y, z);\n tempRotationEuler.set(rx, ry, rz);\n tempRotationQuaternion.setFromEulerXYZ(tempRotationEuler);\n tempScaleVector.set(1, 1, 1);\n\n tempTargetMatrix.compose(tempPositionVector, tempRotationQuaternion, tempScaleVector);\n tempTargetMatrix.premultiply(tempContainerMatrix);\n tempTargetMatrix.decompose(tempPositionVector, tempRotationQuaternion, tempScaleVector);\n\n tempRotationEuler.setFromQuaternion(tempRotationQuaternion);\n\n tempPositionVector.multiply(localScale);\n\n return {\n position: {\n x: tempPositionVector.x,\n y: tempPositionVector.y,\n z: tempPositionVector.z,\n },\n rotation: {\n x: tempRotationEuler.x,\n y: tempRotationEuler.y,\n z: tempRotationEuler.z,\n },\n };\n}\n", "import { LoadingProgressManager } from \"@mml-io/mml-web\";\n\nexport type LoadingScreenConfig = {\n background?: string;\n backgroundImageUrl?: string;\n backgroundBlurAmount?: number;\n overlayLayers?: Array<{\n overlayImageUrl: string;\n overlayAnchor: \"top-left\" | \"top-right\" | \"bottom-left\" | \"bottom-right\";\n overlayOffset?: { x: number; y: number };\n }>;\n title?: string;\n subtitle?: string;\n color?: string;\n};\n\nexport class LoadingScreen {\n public readonly element: HTMLDivElement;\n\n private readonly backgroundBlur: HTMLDivElement;\n\n private overlayLayers: HTMLDivElement[] = [];\n\n private loadingBanner: HTMLDivElement;\n private loadingBannerTitle: HTMLDivElement;\n private loadingBannerSubtitle: HTMLDivElement;\n\n private progressBarBackground: HTMLDivElement;\n private progressBarHolder: HTMLDivElement;\n private progressBar: HTMLDivElement;\n private loadingStatusText: HTMLDivElement;\n\n private progressDebugViewHolder: HTMLDivElement;\n private progressDebugView: HTMLDivElement;\n private progressDebugElement: HTMLPreElement;\n\n private debugLabel: HTMLLabelElement;\n private debugCheckbox: HTMLInputElement;\n\n private hasCompleted = false;\n private loadingCallback: () => void;\n private disposed: boolean = false;\n\n constructor(\n private loadingProgressManager: LoadingProgressManager,\n private config?: LoadingScreenConfig,\n ) {\n const defaultBackground = \"linear-gradient(45deg, #28284B 0%, #303056 100%)\";\n this.element = document.createElement(\"div\");\n this.element.id = \"loading-screen\";\n\n this.element.style.position = \"absolute\";\n this.element.style.top = \"0\";\n this.element.style.left = \"0\";\n this.element.style.width = \"100%\";\n this.element.style.height = \"100%\";\n this.element.style.backgroundColor = this.config?.background || defaultBackground;\n this.element.style.background = this.config?.background || defaultBackground;\n this.element.style.zIndex = \"10001\";\n\n this.backgroundBlur = document.createElement(\"div\");\n this.backgroundBlur.id = \"loading-screen-blur\";\n this.backgroundBlur.style.position = \"absolute\";\n this.backgroundBlur.style.top = \"0\";\n this.backgroundBlur.style.left = \"0\";\n this.backgroundBlur.style.width = \"100%\";\n this.backgroundBlur.style.height = \"100%\";\n this.backgroundBlur.style.display = \"flex\";\n if (this.config?.backgroundBlurAmount) {\n this.backgroundBlur.style.backdropFilter = `blur(${this.config.backgroundBlurAmount}px)`;\n }\n this.element.append(this.backgroundBlur);\n\n if (this.config?.backgroundImageUrl) {\n this.element.style.backgroundImage = `url(${this.config.backgroundImageUrl})`;\n this.element.style.backgroundPosition = \"center\";\n this.element.style.backgroundSize = \"cover\";\n }\n\n if (this.config?.overlayLayers) {\n const logLoadError = (imageUrl: string) => {\n console.error(`Failed to load overlay image: ${imageUrl}`);\n };\n\n for (const layer of this.config.overlayLayers) {\n const overlayLayer = document.createElement(\"div\");\n overlayLayer.style.position = \"absolute\";\n overlayLayer.style.background = `url(${layer.overlayImageUrl}) no-repeat`;\n overlayLayer.style.backgroundSize = \"contain\";\n\n const anchor = layer.overlayAnchor;\n const offsetX = layer.overlayOffset?.x || 0;\n const offsetY = layer.overlayOffset?.y || 0;\n\n if (anchor.includes(\"top\")) {\n overlayLayer.style.top = `${offsetY}px`;\n } else if (anchor.includes(\"bottom\")) {\n overlayLayer.style.bottom = `${offsetY}px`;\n }\n\n if (anchor.includes(\"left\")) {\n overlayLayer.style.left = `${offsetX}px`;\n } else if (anchor.includes(\"right\")) {\n overlayLayer.style.right = `${offsetX}px`;\n }\n\n const image = new Image();\n image.src = layer.overlayImageUrl;\n image.onload = () => {\n const naturalWidth = image.naturalWidth;\n const naturalHeight = image.naturalHeight;\n\n overlayLayer.style.width = `${naturalWidth}px`;\n overlayLayer.style.height = `${naturalHeight}px`;\n };\n\n image.onerror = () => logLoadError(layer.overlayImageUrl);\n\n this.overlayLayers.push(overlayLayer);\n this.backgroundBlur.append(overlayLayer);\n }\n }\n\n this.element.style.color = this.config?.color || \"white\";\n\n this.loadingBanner = document.createElement(\"div\");\n this.loadingBanner.style.position = \"absolute\";\n this.loadingBanner.style.display = \"flex\";\n this.loadingBanner.style.flexDirection = \"column\";\n this.loadingBanner.style.left = \"0\";\n this.loadingBanner.style.bottom = \"0\";\n this.loadingBanner.style.padding = \"0\";\n this.loadingBanner.style.width = \"100%\";\n this.loadingBanner.style.justifyContent = \"flex-end\";\n this.backgroundBlur.append(this.loadingBanner);\n\n if (this.config?.title) {\n this.loadingBannerTitle = document.createElement(\"div\");\n this.loadingBannerTitle.textContent = this.config.title;\n this.loadingBannerTitle.style.color = this.config?.color || \"white\";\n this.loadingBannerTitle.style.paddingLeft = \"40px\";\n this.loadingBannerTitle.style.paddingRight = \"40px\";\n this.loadingBannerTitle.style.fontSize = \"42px\";\n this.loadingBannerTitle.style.fontWeight = \"bold\";\n this.loadingBannerTitle.style.fontFamily = \"sans-serif\";\n if (this.config?.background) {\n this.loadingBannerTitle.style.textShadow = `0px 0px 80px ${this.config.background}`;\n }\n this.loadingBanner.append(this.loadingBannerTitle);\n }\n\n if (this.config?.subtitle) {\n this.loadingBannerSubtitle = document.createElement(\"div\");\n this.loadingBannerSubtitle.style.color = this.config?.color || \"white\";\n this.loadingBannerSubtitle.style.paddingLeft = \"40px\";\n this.loadingBannerSubtitle.style.paddingRight = \"40px\";\n this.loadingBannerSubtitle.style.fontSize = \"16px\";\n this.loadingBannerSubtitle.style.fontWeight = \"400\";\n this.loadingBannerSubtitle.style.fontFamily = \"sans-serif\";\n this.loadingBannerSubtitle.style.marginTop = \"12px\";\n if (this.config?.background) {\n this.loadingBannerSubtitle.style.textShadow = `0px 0px 40px ${this.config.background}`;\n }\n\n this.loadingBannerSubtitle.textContent = this.config.subtitle;\n this.loadingBanner.append(this.loadingBannerSubtitle);\n }\n\n this.progressDebugViewHolder = document.createElement(\"div\");\n this.progressDebugViewHolder.style.display = \"none\";\n this.progressDebugViewHolder.style.position = \"absolute\";\n this.progressDebugViewHolder.style.width = \"calc(100% - 80px)\";\n this.progressDebugViewHolder.style.maxHeight = \"calc(100% - 120px)\";\n this.progressDebugViewHolder.style.left = \"40px\";\n this.progressDebugViewHolder.style.bottom = \"60px\";\n this.progressDebugViewHolder.style.alignItems = \"center\";\n this.progressDebugViewHolder.style.justifyContent = \"center\";\n this.progressDebugViewHolder.style.zIndex = \"10003\";\n this.element.append(this.progressDebugViewHolder);\n\n this.progressDebugView = document.createElement(\"div\");\n this.progressDebugView.style.backgroundColor = \"rgba(128, 128, 128, 0.5)\";\n this.progressDebugView.style.border = \"1px solid black\";\n this.progressDebugView.style.borderRadius = \"7px\";\n this.progressDebugView.style.width = \"100%\";\n this.progressDebugView.style.maxWidth = \"100%\";\n this.progressDebugView.style.overflow = \"auto\";\n this.progressDebugViewHolder.append(this.progressDebugView);\n\n this.debugCheckbox = document.createElement(\"input\");\n this.debugCheckbox.type = \"checkbox\";\n this.debugCheckbox.checked = false;\n this.debugCheckbox.addEventListener(\"change\", () => {\n this.progressDebugElement.style.display = this.debugCheckbox.checked ? \"block\" : \"none\";\n this.loadingBannerTitle.style.display = this.debugCheckbox.checked ? \"none\" : \"flex\";\n this.loadingBannerSubtitle.style.display = this.debugCheckbox.checked ? \"none\" : \"flex\";\n if (this.hasCompleted) {\n this.dispose();\n }\n });\n\n this.debugLabel = document.createElement(\"label\");\n this.debugLabel.textContent = \"Debug loading\";\n this.debugLabel.style.fontFamily = \"sans-serif\";\n this.debugLabel.style.padding = \"5px\";\n this.debugLabel.style.display = \"inline-block\";\n this.debugLabel.style.userSelect = \"none\";\n this.debugLabel.append(this.debugCheckbox);\n this.progressDebugView.append(this.debugLabel);\n\n this.progressDebugElement = document.createElement(\"pre\");\n this.progressDebugElement.style.margin = \"0\";\n this.progressDebugElement.style.display = this.debugCheckbox.checked ? \"block\" : \"none\";\n this.progressDebugView.append(this.progressDebugElement);\n\n this.progressBarHolder = document.createElement(\"div\");\n this.progressBarHolder.style.display = \"flex\";\n this.progressBarHolder.style.alignItems = \"start\";\n this.progressBarHolder.style.justifyContent = \"flex-start\";\n this.progressBarHolder.style.width = \"100%\";\n this.progressBarHolder.style.marginLeft = \"40px\";\n this.progressBarHolder.style.marginBottom = \"40px\";\n this.progressBarHolder.style.cursor = \"pointer\";\n this.progressBarHolder.style.marginTop = \"24px\";\n this.loadingBanner.append(this.progressBarHolder);\n\n this.progressBarBackground = document.createElement(\"div\");\n this.progressBarBackground.style.position = \"relative\";\n this.progressBarBackground.style.width = \"80%\";\n this.progressBarBackground.style.maxWidth = \"400px\";\n this.progressBarBackground.style.minWidth = \"240px\";\n this.progressBarBackground.style.backgroundColor = \"rgba(32,32,32, 0.25)\";\n this.progressBarBackground.style.backdropFilter = \"blur(4px)\";\n this.progressBarBackground.style.height = \"16px\";\n this.progressBarBackground.style.lineHeight = \"16px\";\n this.progressBarBackground.style.borderRadius = \"16px\";\n this.progressBarBackground.style.overflow = \"hidden\";\n this.progressBarBackground.addEventListener(\"click\", () => {\n const display = this.progressDebugViewHolder.style.display;\n if (display === \"none\") {\n this.progressDebugViewHolder.style.display = \"flex\";\n } else {\n this.progressDebugViewHolder.style.display = \"none\";\n this.debugCheckbox.checked = false;\n this.progressDebugElement.style.display = this.debugCheckbox.checked ? \"block\" : \"none\";\n this.loadingBannerTitle.style.display = this.debugCheckbox.checked ? \"none\" : \"flex\";\n }\n });\n this.progressBarHolder.append(this.progressBarBackground);\n\n this.progressBar = document.createElement(\"div\");\n this.progressBar.style.position = \"absolute\";\n this.progressBar.style.top = \"0\";\n this.progressBar.style.left = \"0\";\n this.progressBar.style.width = \"0\";\n this.progressBar.style.height = \"100%\";\n this.progressBar.style.pointerEvents = \"none\";\n this.progressBar.style.backgroundColor = this.config?.color || \"#0050a4\";\n this.progressBarBackground.append(this.progressBar);\n\n this.loadingStatusText = document.createElement(\"div\");\n this.loadingStatusText.style.position = \"absolute\";\n this.loadingStatusText.style.top = \"0\";\n this.loadingStatusText.style.left = \"0\";\n this.loadingStatusText.style.width = \"100%\";\n this.loadingStatusText.style.height = \"100%\";\n this.loadingStatusText.style.color = \"rgba(200,200,200,0.9)\";\n this.loadingStatusText.style.fontSize = \"10px\";\n this.loadingStatusText.style.textAlign = \"center\";\n this.loadingStatusText.style.verticalAlign = \"middle\";\n this.loadingStatusText.style.mixBlendMode = \"difference\";\n this.loadingStatusText.style.fontFamily = \"sans-serif\";\n this.loadingStatusText.style.fontWeight = \"bold\";\n this.loadingStatusText.style.userSelect = \"none\";\n this.loadingStatusText.textContent = \"Loading...\";\n this.progressBarBackground.append(this.loadingStatusText);\n\n this.loadingCallback = () => {\n const [loadingRatio, completedLoading] = this.loadingProgressManager.toRatio();\n if (completedLoading) {\n if (!this.hasCompleted) {\n this.hasCompleted = true;\n if (!this.debugCheckbox.checked) {\n this.dispose();\n }\n }\n this.loadingStatusText.textContent = \"Completed\";\n this.progressBar.style.width = \"100%\";\n } else {\n this.loadingStatusText.textContent = `${(loadingRatio * 100).toFixed(2)}%`;\n this.progressBar.style.width = `${loadingRatio * 100}%`;\n }\n this.progressDebugElement.textContent = LoadingProgressManager.LoadingProgressSummaryToString(\n this.loadingProgressManager.toSummary(),\n );\n };\n\n this.loadingProgressManager.addProgressCallback(this.loadingCallback);\n }\n\n public dispose() {\n if (this.disposed) {\n return;\n }\n this.disposed = true;\n this.loadingProgressManager.removeProgressCallback(this.loadingCallback);\n this.element.remove();\n }\n}\n", "export class ErrorScreen {\n public readonly element: HTMLDivElement;\n\n private titleBannerText: HTMLDivElement;\n private messageText: HTMLDivElement;\n\n constructor(title: string, message: string) {\n this.element = document.createElement(\"div\");\n this.element.style.position = \"absolute\";\n this.element.style.top = \"0\";\n this.element.style.left = \"0\";\n this.element.style.display = \"flex\";\n this.element.style.alignItems = \"center\";\n this.element.style.justifyContent = \"center\";\n this.element.style.flexDirection = \"column\";\n this.element.style.width = \"100%\";\n this.element.style.height = \"100%\";\n this.element.style.zIndex = \"10000\";\n this.element.style.background = \"linear-gradient(45deg, #111111 0%, #444444 100%)\";\n this.element.style.color = \"white\";\n\n this.titleBannerText = document.createElement(\"div\");\n this.titleBannerText.textContent = title;\n this.titleBannerText.style.fontSize = \"40px\";\n this.titleBannerText.style.fontWeight = \"bold\";\n this.titleBannerText.style.fontFamily = \"sans-serif\";\n this.element.append(this.titleBannerText);\n\n this.messageText = document.createElement(\"div\");\n this.messageText.style.textAlign = \"center\";\n this.messageText.style.fontFamily = \"sans-serif\";\n this.messageText.style.fontWeight = \"bold\";\n this.messageText.textContent = message;\n this.element.append(this.messageText);\n }\n\n public dispose() {\n this.element.remove();\n }\n}\n", "import * as EssentialsPlugin from \"@tweakpane/plugin-essentials\";\nimport { Pane } from \"tweakpane\";\n\nimport { CameraManager } from \"../camera/CameraManager\";\nimport { LocalController } from \"../character/LocalController\";\nimport { EventHandlerCollection } from \"../input/EventHandlerCollection\";\n\nimport { CameraFolder, CameraValues } from \"./blades/cameraFolder\";\nimport {\n CharacterControlsFolder,\n CharacterControllerValues,\n} from \"./blades/characterControlsFolder\";\nimport { setTweakpaneActive } from \"./tweakPaneActivity\";\nimport { tweakPaneStyle } from \"./tweakPaneStyle\";\n\nexport type TweakPaneConfig = {\n cameraValues: CameraValues;\n characterControllerValues: CharacterControllerValues;\n};\n\nexport class TweakPane {\n private gui: Pane;\n\n private camera: CameraFolder;\n private characterControls: CharacterControlsFolder;\n\n private saveVisibilityInLocalStorage: boolean = true;\n private tweakPaneWrapper: HTMLDivElement;\n private eventHandlerCollection: EventHandlerCollection;\n\n constructor(\n holderElement: HTMLElement,\n config: TweakPaneConfig,\n public guiVisible: boolean = false,\n ) {\n this.tweakPaneWrapper = document.createElement(\"div\");\n this.tweakPaneWrapper.style.position = \"fixed\";\n this.tweakPaneWrapper.style.width = \"400px\";\n this.tweakPaneWrapper.style.height = \"100%\";\n this.tweakPaneWrapper.style.top = \"0px\";\n this.tweakPaneWrapper.style.right = \"calc(-50vw)\";\n this.tweakPaneWrapper.style.zIndex = \"99\";\n this.tweakPaneWrapper.style.overflow = \"auto\";\n this.tweakPaneWrapper.style.backgroundColor = \"rgba(0, 0, 0, 0.66)\";\n this.tweakPaneWrapper.style.paddingLeft = \"5px\";\n this.tweakPaneWrapper.style.boxShadow = \"-7px 0px 12px rgba(0, 0, 0, 0.5)\";\n this.tweakPaneWrapper.style.transition = \"right cubic-bezier(0.83, 0, 0.17, 1) 0.7s\";\n holderElement.appendChild(this.tweakPaneWrapper);\n\n this.gui = new Pane({ container: this.tweakPaneWrapper! });\n this.gui.registerPlugin(EssentialsPlugin);\n\n if (this.saveVisibilityInLocalStorage) {\n const localStorageGuiVisible = localStorage.getItem(\"guiVisible\");\n if (localStorageGuiVisible !== null) {\n if (localStorageGuiVisible === \"true\") {\n this.guiVisible = true;\n } else if (localStorageGuiVisible === \"false\") {\n this.guiVisible = false;\n }\n }\n }\n\n const styleElement = document.createElement(\"style\");\n styleElement.type = \"text/css\";\n styleElement.appendChild(document.createTextNode(tweakPaneStyle));\n document.head.appendChild(styleElement);\n\n this.camera = new CameraFolder(this.gui, config.cameraValues);\n this.characterControls = new CharacterControlsFolder(\n this.gui,\n config.characterControllerValues,\n false,\n );\n\n const exportFolder = this.gui.addFolder({ title: \"import / export\", expanded: false });\n const exportButton = exportFolder.addButton({ title: \"export\" });\n exportButton.on(\"click\", () => {\n this.downloadSettingsAsJSON(this.gui.exportState());\n });\n const importButton = exportFolder.addButton({ title: \"import\" });\n importButton.on(\"click\", () => {\n this.importSettingsFromJSON((settings) => {\n this.gui.importState(settings);\n });\n });\n\n this.eventHandlerCollection = new EventHandlerCollection();\n\n const gui = this.gui as any;\n const paneElement: HTMLElement = gui.containerElem_;\n paneElement.style.right = this.guiVisible ? \"0px\" : \"-450px\";\n this.eventHandlerCollection.add(this.gui.element, \"mouseenter\", () => setTweakpaneActive(true));\n this.eventHandlerCollection.add(this.gui.element, \"mousemove\", () => setTweakpaneActive(true));\n this.eventHandlerCollection.add(this.gui.element, \"mousedown\", () => setTweakpaneActive(true));\n this.eventHandlerCollection.add(this.gui.element, \"mouseleave\", () =>\n setTweakpaneActive(false),\n );\n this.eventHandlerCollection.add(this.gui.element, \"mouseup\", () => setTweakpaneActive(false));\n this.eventHandlerCollection.add(window, \"keydown\", (e) => {\n this.processKey(e);\n });\n\n this.updateVisibility();\n }\n\n private processKey(e: KeyboardEvent): void {\n if (e.key === \"p\") {\n this.toggleGUI();\n }\n }\n\n public dispose() {\n this.eventHandlerCollection.clear();\n this.gui.dispose();\n this.tweakPaneWrapper.remove();\n }\n\n public setupCamPane(cameraManager: CameraManager) {\n this.camera.setupChangeEvent(cameraManager);\n }\n\n public setupCharacterController(localController: LocalController) {\n this.characterControls.setupChangeEvent(localController);\n }\n\n public updateCameraData(cameraManager: CameraManager) {\n this.camera.update(cameraManager);\n }\n\n public updateCharacterData(localController: LocalController) {\n this.characterControls.update(localController);\n }\n\n private formatDateForFilename(): string {\n const date = new Date();\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, \"0\"); // Months are 0-11\n const day = String(date.getDate()).padStart(2, \"0\");\n const hours = String(date.getHours()).padStart(2, \"0\");\n const minutes = String(date.getMinutes()).padStart(2, \"0\");\n const seconds = String(date.getSeconds()).padStart(2, \"0\");\n return `${year}-${month}-${day} ${hours}-${minutes}-${seconds}`;\n }\n\n private downloadSettingsAsJSON(settings: any): void {\n const jsonString = JSON.stringify(settings, null, 2);\n const blob = new Blob([jsonString], { type: \"application/json\" });\n const url = URL.createObjectURL(blob);\n const a = document.createElement(\"a\");\n a.download = `settings ${this.formatDateForFilename()}.json`;\n a.href = url;\n a.click();\n URL.revokeObjectURL(url);\n }\n\n private importSettingsFromJSON(callback: (settings: any) => void): void {\n const input = document.createElement(\"input\");\n input.type = \"file\";\n input.accept = \".json\";\n input.addEventListener(\"change\", (event) => {\n const file = (event.target as HTMLInputElement).files?.[0];\n if (file) {\n const reader = new FileReader();\n reader.onload = (loadEvent) => {\n try {\n const settings = JSON.parse(loadEvent.target?.result as string);\n callback(settings);\n } catch (err) {\n console.error(\"Error parsing JSON:\", err);\n }\n };\n reader.readAsText(file);\n }\n });\n input.click();\n }\n\n private toggleGUI(): void {\n this.guiVisible = !this.guiVisible;\n this.updateVisibility();\n }\n\n public setVisible(visible: boolean): void {\n this.guiVisible = visible;\n this.updateVisibility();\n }\n\n private updateVisibility(): void {\n const gui = this.gui as any;\n const paneElement: HTMLElement = gui.containerElem_;\n paneElement.style.right = this.guiVisible ? \"0px\" : \"-450px\";\n if (this.saveVisibilityInLocalStorage) {\n localStorage.setItem(\"guiVisible\", this.guiVisible === true ? \"true\" : \"false\");\n }\n }\n}\n", "import { BladeController, View } from \"@tweakpane/core\";\nimport { BladeApi, FolderApi, TpChangeEvent } from \"tweakpane\";\n\nimport { CameraManager } from \"../../camera/CameraManager\";\n\nexport type CameraValues = {\n initialDistance: number;\n minDistance: number;\n maxDistance: number;\n initialFOV: number;\n maxFOV: number;\n minFOV: number;\n invertFOVMapping: boolean;\n damping: number;\n zoomScale: number;\n zoomDamping: number;\n};\n\nexport function createDefaultCameraValues(): CameraValues {\n return {\n initialDistance: 3.3,\n minDistance: 0.1,\n maxDistance: 5,\n initialFOV: 60,\n maxFOV: 70,\n minFOV: 60,\n invertFOVMapping: false,\n damping: 0.21,\n zoomScale: 0.04,\n zoomDamping: 0.04,\n };\n}\n\nconst camOptions = {\n initialDistance: { min: 1, max: 5, step: 0.1 },\n minDistance: { min: 0.1, max: 2, step: 0.1 },\n maxDistance: { min: 5, max: 20, step: 0.5 },\n initialFOV: { min: 60, max: 85, step: 1 },\n maxFOV: { min: 50, max: 100, step: 1 },\n minFOV: { min: 50, max: 100, step: 1 },\n damping: { min: 0.01, max: 1, step: 0.001 },\n zoomScale: { min: 0.005, max: 0.3, step: 0.001 },\n zoomDamping: { min: 0.0, max: 2.0, step: 0.01 },\n};\n\ntype CamData = {\n distance: string;\n FoV: string;\n};\n\nexport class CameraFolder {\n public folder: FolderApi;\n\n private camData: CamData = {\n distance: \"0\",\n FoV: \"0\",\n };\n\n constructor(\n parentFolder: FolderApi,\n private cameraValues: CameraValues,\n ) {\n this.folder = parentFolder.addFolder({ title: \"camera\", expanded: false });\n this.folder.addBinding(this.camData, \"distance\", { readonly: true });\n this.folder.addBinding(this.camData, \"FoV\", { readonly: true });\n this.folder.addBinding(this.cameraValues, \"initialDistance\", camOptions.initialDistance);\n this.folder.addBinding(this.cameraValues, \"minDistance\", camOptions.minDistance);\n this.folder.addBinding(this.cameraValues, \"maxDistance\", camOptions.maxDistance);\n this.folder.addBinding(this.cameraValues, \"minFOV\", camOptions.minFOV);\n this.folder.addBinding(this.cameraValues, \"maxFOV\", camOptions.maxFOV);\n this.folder.addBinding(this.cameraValues, \"invertFOVMapping\");\n this.folder.addBinding(this.cameraValues, \"damping\", camOptions.damping);\n this.folder.addBinding(this.cameraValues, \"zoomScale\", camOptions.zoomScale);\n this.folder.addBinding(this.cameraValues, \"zoomDamping\", camOptions.zoomDamping);\n }\n\n public setupChangeEvent(cameraManager: CameraManager): void {\n this.folder.on(\"change\", (e: TpChangeEvent<unknown, BladeApi<BladeController<View>>>) => {\n const target = (e.target as any).key;\n if (!target) return;\n switch (target) {\n case \"initialDistance\": {\n const value = e.value as number;\n cameraManager.initialDistance = value;\n cameraManager.distance = value;\n cameraManager.targetDistance = value;\n cameraManager.desiredDistance = value;\n cameraManager.recomputeFoV();\n break;\n }\n case \"minDistance\": {\n const value = e.value as number;\n cameraManager.minDistance = value;\n cameraManager.distance = value;\n cameraManager.targetDistance = value;\n cameraManager.desiredDistance = value;\n cameraManager.recomputeFoV();\n break;\n }\n case \"maxDistance\": {\n const value = e.value as number;\n cameraManager.maxDistance = value;\n cameraManager.distance = value;\n cameraManager.targetDistance = value;\n cameraManager.desiredDistance = value;\n cameraManager.recomputeFoV();\n break;\n }\n case \"minFOV\": {\n const value = e.value as number;\n cameraManager.minFOV = value;\n cameraManager.recomputeFoV();\n break;\n }\n case \"maxFOV\": {\n const value = e.value as number;\n cameraManager.maxFOV = value;\n cameraManager.recomputeFoV();\n break;\n }\n case \"invertFOVMapping\": {\n const boolValue = e.value as boolean;\n cameraManager.invertFOVMapping = boolValue;\n break;\n }\n case \"damping\": {\n const value = e.value as number;\n cameraManager.damping = value;\n break;\n }\n case \"zoomScale\": {\n const value = e.value as number;\n cameraManager.zoomScale = value;\n break;\n }\n case \"zoomDamping\": {\n const value = e.value as number;\n cameraManager.zoomDamping = value;\n break;\n }\n default:\n break;\n }\n });\n }\n\n public update(cameraManager: CameraManager): void {\n this.camData.distance = cameraManager.distance.toFixed(2);\n this.camData.FoV = cameraManager.fov.toFixed(2);\n }\n}\n", "import { BladeController, View } from \"@tweakpane/core\";\nimport { BladeApi, FolderApi, TpChangeEvent } from \"tweakpane\";\n\nimport { LocalController } from \"../../character/LocalController\";\n\nexport type CharacterControllerValues = {\n gravity: number;\n jumpForce: number;\n doubleJumpForce: number;\n coyoteJump: number;\n airResistance: number;\n groundResistance: number;\n airControlModifier: number;\n groundWalkControl: number;\n groundRunControl: number;\n baseControlMultiplier: number;\n minimumSurfaceAngle: number;\n};\n\nexport function createDefaultCharacterControllerValues(): CharacterControllerValues {\n return {\n gravity: 37,\n jumpForce: 17,\n doubleJumpForce: 16.7,\n coyoteJump: 120,\n airResistance: 0.5,\n groundResistance: 0,\n airControlModifier: 0.05,\n groundWalkControl: 0.625,\n groundRunControl: 0.8,\n baseControlMultiplier: 200,\n minimumSurfaceAngle: 0.905,\n };\n}\n\nconst characterControllerOptions = {\n gravity: { min: 1, max: 100, step: 0.05 },\n jumpForce: { min: 1, max: 50, step: 0.05 },\n doubleJumpForce: { min: 1, max: 50, step: 0.05 },\n coyoteJump: { min: 60, max: 200, step: 1 },\n airResistance: { min: 0.01, max: 0.9, step: 0.01 },\n groundResistance: { min: -100, max: 0, step: 1 },\n airControlModifier: { min: 0.001, max: 0.15, step: 0.01 },\n groundWalkControl: { min: 0.1, max: 1.5, step: 0.01 },\n groundRunControl: { min: 0.5, max: 2.0, step: 0.01 },\n baseControlMultiplier: { min: 150, max: 300, step: 1 },\n minimumSurfaceAngle: { min: 0.254, max: 1, step: 0.001 },\n};\n\ntype CharacterData = {\n position: string;\n onGround: string;\n canJump: string;\n canDoubleJump: string;\n jumpCount: string;\n coyoteTime: string;\n coyoteJumped: string;\n};\n\nexport class CharacterControlsFolder {\n public folder: FolderApi;\n\n private characterData: CharacterData = {\n position: \"(0, 0, 0)\",\n onGround: \"false\",\n canJump: \"false\",\n canDoubleJump: \"false\",\n jumpCount: \"0\",\n coyoteTime: \"false\",\n coyoteJumped: \"false\",\n };\n\n constructor(\n parentFolder: FolderApi,\n private controllerValues: CharacterControllerValues,\n expand: boolean = false,\n ) {\n this.folder = parentFolder.addFolder({ title: \"character\", expanded: expand });\n this.folder.addBinding(this.characterData, \"position\", { readonly: true });\n this.folder.addBinding(this.characterData, \"onGround\", { readonly: true });\n this.folder.addBinding(this.characterData, \"canJump\", { readonly: true });\n this.folder.addBinding(this.characterData, \"canDoubleJump\", { readonly: true });\n this.folder.addBinding(this.characterData, \"jumpCount\", { readonly: true });\n this.folder.addBinding(this.characterData, \"coyoteTime\", { readonly: true });\n this.folder.addBinding(this.characterData, \"coyoteJumped\", { readonly: true });\n this.folder.addBinding(this.controllerValues, \"gravity\", characterControllerOptions.gravity);\n this.folder.addBinding(\n this.controllerValues,\n \"jumpForce\",\n characterControllerOptions.jumpForce,\n );\n this.folder.addBinding(\n this.controllerValues,\n \"doubleJumpForce\",\n characterControllerOptions.doubleJumpForce,\n );\n this.folder.addBinding(\n this.controllerValues,\n \"coyoteJump\",\n characterControllerOptions.coyoteJump,\n );\n this.folder.addBinding(\n this.controllerValues,\n \"airResistance\",\n characterControllerOptions.airResistance,\n );\n this.folder.addBinding(\n this.controllerValues,\n \"groundResistance\",\n characterControllerOptions.groundResistance,\n );\n this.folder.addBinding(\n this.controllerValues,\n \"airControlModifier\",\n characterControllerOptions.airControlModifier,\n );\n this.folder.addBinding(\n this.controllerValues,\n \"groundWalkControl\",\n characterControllerOptions.groundWalkControl,\n );\n this.folder.addBinding(\n this.controllerValues,\n \"groundRunControl\",\n characterControllerOptions.groundRunControl,\n );\n this.folder.addBinding(\n this.controllerValues,\n \"baseControlMultiplier\",\n characterControllerOptions.baseControlMultiplier,\n );\n this.folder.addBinding(\n this.controllerValues,\n \"minimumSurfaceAngle\",\n characterControllerOptions.minimumSurfaceAngle,\n );\n }\n\n public setupChangeEvent(localController: LocalController): void {\n this.folder.on(\"change\", (e: TpChangeEvent<unknown, BladeApi<BladeController<View>>>) => {\n const target = (e.target as any).key;\n if (!target) return;\n switch (target) {\n case \"gravity\": {\n const value = e.value as number;\n localController.gravity = value * -1;\n break;\n }\n case \"jumpForce\": {\n const value = e.value as number;\n localController.jumpForce = value;\n break;\n }\n case \"doubleJumpForce\": {\n const value = e.value as number;\n localController.doubleJumpForce = value;\n break;\n }\n case \"coyoteJump\": {\n const value = e.value as number;\n localController.coyoteTimeThreshold = value;\n break;\n }\n case \"airResistance\": {\n const value = e.value as number;\n localController.airResistance = value;\n break;\n }\n case \"groundResistance\": {\n const value = e.value as number;\n localController.groundResistance = 0.99999999 + value * 1e-6;\n break;\n }\n case \"airControlModifier\": {\n const value = e.value as number;\n localController.airControlModifier = value;\n break;\n }\n case \"groundWalkControl\": {\n const value = e.value as number;\n localController.groundWalkControl = value;\n break;\n }\n case \"groundRunControl\": {\n const value = e.value as number;\n localController.groundRunControl = value;\n break;\n }\n case \"baseControlMultiplier\": {\n const value = e.value as number;\n localController.baseControl = value;\n break;\n }\n case \"minimumSurfaceAngle\": {\n const value = e.value as number;\n localController.minimumSurfaceAngle = value;\n break;\n }\n default:\n break;\n }\n });\n }\n\n public update(localController: LocalController): void {\n const { x, y, z } = localController.latestPosition;\n this.characterData.position = `(${x.toFixed(2)}, ${y.toFixed(2)}, ${z.toFixed(2)})`;\n this.characterData.onGround = `${localController.characterOnGround}`;\n this.characterData.canJump = `${localController.canJump || localController.coyoteTime ? \"true\" : \"false\"}`;\n this.characterData.canDoubleJump = `${localController.canDoubleJump}`;\n this.characterData.jumpCount = `${localController.jumpCounter}`;\n this.characterData.coyoteTime = `${localController.coyoteTime}`;\n this.characterData.coyoteJumped = `${localController.coyoteJumped}`;\n }\n}\n", "export const tweakPaneStyle = `\n:root {\n --tp-base-background-color: rgba(12, 12, 12, 0.6);\n --tp-base-shadow-color: hsla(0, 0%, 0%, 0.2);\n --tp-button-background-color: hsla(0, 0%, 80%, 1);\n --tp-button-background-color-active: hsla(0, 0%, 100%, 1);\n --tp-button-background-color-focus: hsla(0, 0%, 95%, 1);\n --tp-button-background-color-hover: hsla(0, 0%, 85%, 1);\n --tp-button-foreground-color: hsla(0, 0%, 0%, 0.7);\n --tp-container-background-color: hsla(0, 0%, 0%, 0.3);\n --tp-container-background-color-active: hsla(0, 0%, 0%, 0.6);\n --tp-container-background-color-focus: hsla(0, 0%, 0%, 0.5);\n --tp-container-background-color-hover: hsla(0, 0%, 0%, 0.4);\n --tp-container-foreground-color: hsla(0, 0%, 90%, 0.6);\n --tp-groove-foreground-color: hsla(0, 0%, 0%, 0.2);\n --tp-input-background-color: hsla(0, 0%, 30%, 0.3);\n --tp-input-background-color-active: hsla(0, 0%, 0%, 0.6);\n --tp-input-background-color-focus: hsla(0, 0%, 0%, 0.5);\n --tp-input-background-color-hover: hsla(0, 0%, 0%, 0.4);\n --tp-input-foreground-color: hsla(0, 0%, 100%, 0.6);\n --tp-label-foreground-color: hsla(0, 0%, 100%, 0.6);\n --tp-monitor-background-color: hsla(0, 0%, 0%, 0.3);\n --tp-monitor-foreground-color: hsla(0, 0%, 100%, 0.3);\n}\n\n.tp-brkv {\n -webkit-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n\n.tp-dfwv {\n z-index: 100;\n color: white;\n width: 600px !important;\n display: none;\n -webkit-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n\n.tp-fldv {\n margin: 1px 0px 0px 0px !important;\n}\n\n.tp-fldv_b {\n overflow: visible !important;\n}\n\n.tp-fldv_t {\n font-size: 13px;\n font-weight: 900;\n color: #ffffff;\n background-color: rgba(70, 70, 70, 0.3);\n border-top: 1px solid rgba(210, 210, 210, 0.1);\n border-radius: 3px;\n}\n\n.tp-lblv_l {\n font-size: 12px;\n padding-left: 0px !important;\n padding-right: 0px !important;\n}\n\n.tp-lblv_v {\n width: 150px;\n}\n\n.tp-sldtxtv_t {\n max-width: 50px;\n}\n\n.tp-sglv_i {\n font-size: 12px;\n color: rgba(255, 255, 255, 0.7);\n}\n\n.tp-ckbv_w {\n border: 1px solid rgba(200, 200, 250, 0.2);\n}\n`;\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["radToDeg", "AnimationState", "cameraPos", "tempQuaternion", "lerpFactor", "radToDeg", "Key", "_a"]
|
|
7
7
|
}
|