@mml-io/3d-web-client-core 0.1.0 → 0.2.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 +13 -3
- package/build/character/Character.d.ts +1 -0
- package/build/character/CharacterManager.d.ts +2 -2
- package/build/character/LocalController.d.ts +21 -7
- package/build/character/ModelLoader.d.ts +8 -3
- package/build/character/RemoteController.d.ts +2 -4
- package/build/collisions/CollisionsManager.d.ts +4 -0
- package/build/helpers/math-helpers.d.ts +2 -0
- package/build/index.js +721 -207
- package/build/index.js.map +4 -4
- package/build/input/KeyInputManager.d.ts +9 -2
- package/build/rendering/composer.d.ts +20 -1
- package/build/rendering/composerSettings.d.ts +154 -0
- package/build/rendering/tweakPaneActivity.d.ts +2 -0
- package/build/time/TimeManager.d.ts +3 -0
- package/package.json +4 -2
package/build/index.js.map
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
{
|
2
2
|
"version": 3,
|
3
|
-
"sources": ["../src/camera/CameraManager.ts", "../src/helpers/math-helpers.ts", "../src/character/Character.ts", "../src/character/CharacterModel.ts", "../src/character/CharacterMaterial.ts", "../src/rendering/shaders/bayer-dither.ts", "../src/rendering/shaders/shader-helpers.ts", "../src/character/CharacterState.ts", "../src/character/ModelLoader.ts", "../src/character/LocalController.ts", "../src/character/CharacterManager.ts", "../src/character/RemoteController.ts", "../src/input/KeyInputManager.ts", "../src/mml/MMLCompositionScene.ts", "../src/rendering/composer.ts", "../src/rendering/post-effects/gauss-grain.ts", "../src/rendering/shaders/vertex-shader.ts", "../src/time/TimeManager.ts", "../src/collisions/CollisionsManager.ts"],
|
4
|
-
"sourcesContent": ["import { PerspectiveCamera, Vector3 } from \"three\";\n\nimport { ease } from \"../helpers/math-helpers\";\n\nexport class CameraManager {\n public readonly camera: PerspectiveCamera;\n private dragging: boolean = false;\n private target: Vector3 = new Vector3(0, 1.55, 0);\n private targetDistance: number;\n private maxTargetDistance: number = 20;\n private distance: number;\n private targetPhi: number | null = Math.PI / 2;\n private phi: number | null = Math.PI / 2;\n private targetTheta: number | null = -Math.PI / 2;\n private theta: number | null = -Math.PI / 2;\n private hadTarget: boolean = false;\n\n constructor() {\n this.camera = new PerspectiveCamera(80, window.innerWidth / window.innerHeight, 0.1, 2000);\n this.camera.position.set(0, 1.4, 3);\n\n this.targetDistance = 2.5;\n this.distance = this.targetDistance;\n\n document.addEventListener(\"mousedown\", this.onMouseDown.bind(this));\n document.addEventListener(\"mouseup\", this.onMouseUp.bind(this));\n document.addEventListener(\"mousemove\", this.onMouseMove.bind(this));\n document.addEventListener(\"wheel\", this.onMouseWheel.bind(this));\n window.addEventListener(\"resize\", this.onResize.bind(this));\n }\n\n private onResize(): void {\n const width = window.innerWidth;\n const height = window.innerHeight;\n this.camera.aspect = width / height;\n this.camera.updateProjectionMatrix();\n }\n\n private onMouseDown(_event: MouseEvent): void {\n this.dragging = true;\n }\n\n private onMouseUp(_event: MouseEvent): void {\n this.dragging = false;\n }\n\n private onMouseMove(event: MouseEvent): void {\n if (!this.dragging) {\n return;\n }\n if (this.targetTheta === null || this.targetPhi === null) {\n return;\n }\n this.targetTheta += event.movementX * 0.01;\n this.targetPhi -= event.movementY * 0.01;\n this.targetPhi = Math.max(Math.PI * 0.1, Math.min(Math.PI - Math.PI * 0.1, this.targetPhi));\n this.targetPhi = Math.min(Math.PI * 0.7, this.targetPhi);\n }\n\n private onMouseWheel(event: WheelEvent): void {\n const scrollAmount = event.deltaY * 0.01;\n this.targetDistance += scrollAmount;\n this.targetDistance = Math.max(0, this.targetDistance);\n this.targetDistance = Math.min(this.targetDistance, this.maxTargetDistance);\n }\n\n public setTarget(target: THREE.Vector3): void {\n this.target.copy(target);\n if (!this.hadTarget) {\n this.hadTarget = true;\n this.reverseUpdateFromPositions();\n }\n }\n\n private reverseUpdateFromPositions(): void {\n if (this.phi === null || this.theta == null) return;\n const dx = this.camera.position.x - this.target.x;\n const dy = this.camera.position.y - this.target.y;\n const dz = this.camera.position.z - this.target.z;\n this.targetDistance = Math.sqrt(dx * dx + dy * dy + dz * dz);\n this.targetTheta = (this.theta + 2 * Math.PI) % (2 * Math.PI);\n this.targetPhi = Math.max(0, Math.min(Math.PI, this.phi));\n this.phi = this.targetPhi;\n this.theta = this.targetTheta;\n this.distance = this.targetDistance;\n }\n\n public update(): void {\n if (this.target === null) {\n return;\n }\n if (\n this.phi !== null &&\n this.targetPhi !== null &&\n this.theta !== null &&\n this.targetTheta !== null\n ) {\n this.distance += ease(this.targetDistance, this.distance, 0.02);\n this.distance = Math.min(this.distance, this.maxTargetDistance);\n this.phi += ease(this.targetPhi, this.phi, 0.07);\n this.theta += ease(this.targetTheta, this.theta, 0.07);\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.camera.position.set(x, y, z);\n this.camera.lookAt(this.target);\n }\n }\n}\n", "import { Vector3 } from \"three\";\n\nexport const getSpawnPositionInsideCircle = (\n radius: number,\n positions: number,\n id: number,\n yPos: number = 0,\n): Vector3 => {\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 Vector3(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", "import { Color, Vector3 } from \"three\";\n\nimport { CameraManager } from \"../camera/CameraManager\";\nimport { CollisionsManager } from \"../collisions/CollisionsManager\";\nimport { KeyInputManager } from \"../input/KeyInputManager\";\nimport { TimeManager } from \"../time/TimeManager\";\n\nimport { CharacterModel } from \"./CharacterModel\";\nimport { LocalController } from \"./LocalController\";\n\nexport type CharacterDescription = {\n meshFileUrl: string;\n idleAnimationFileUrl: string;\n jogAnimationFileUrl: string;\n sprintAnimationFileUrl: string;\n modelScale: number;\n};\n\nexport class Character {\n public controller: LocalController | null = null;\n\n public name: string | null = null;\n public model: CharacterModel | null = null;\n public color: Color = new Color();\n\n public position: Vector3 = new Vector3();\n\n constructor(\n private readonly characterDescription: CharacterDescription,\n private readonly id: number,\n private readonly isLocal: boolean,\n private readonly modelLoadedCallback: () => void,\n private readonly collisionsManager: CollisionsManager,\n private readonly keyInputManager: KeyInputManager,\n private readonly cameraManager: CameraManager,\n private readonly timeManager: TimeManager,\n ) {\n this.load();\n }\n\n private async load(): Promise<void> {\n this.model = new CharacterModel(this.characterDescription);\n await this.model.init();\n this.color = this.model.material.colorsCube216[this.id];\n if (this.isLocal) {\n this.controller = new LocalController(\n this.model,\n this.id,\n this.collisionsManager,\n this.keyInputManager,\n this.cameraManager,\n this.timeManager,\n );\n }\n this.modelLoadedCallback();\n }\n\n public update(time: number) {\n if (!this.model) return;\n this.model.mesh!.getWorldPosition(this.position);\n if (typeof this.model.material.uniforms.time !== \"undefined\") {\n this.model.material.uniforms.time.value = time;\n this.model.material.uniforms.diffuseRandomColor.value = this.color;\n }\n }\n}\n", "import {\n AnimationAction,\n AnimationClip,\n AnimationMixer,\n LoopRepeat,\n Mesh,\n MeshStandardMaterial,\n Object3D,\n} from \"three\";\n\nimport { CharacterDescription } from \"./Character\";\nimport { CharacterMaterial } from \"./CharacterMaterial\";\nimport { AnimationState } from \"./CharacterState\";\nimport { ModelLoader } from \"./ModelLoader\";\n\nexport class CharacterModel {\n private modelLoader: ModelLoader = new ModelLoader();\n\n public mesh: Object3D | null = null;\n public material: CharacterMaterial = new CharacterMaterial();\n\n public animations: Record<string, AnimationAction> = {};\n public animationMixer: AnimationMixer | null = null;\n public currentAnimation: AnimationState = AnimationState.idle;\n\n constructor(private readonly characterDescription: CharacterDescription) {}\n\n public async init(): Promise<void> {\n await this.loadMainMesh();\n await this.setAnimationFromFile(\n this.characterDescription.idleAnimationFileUrl,\n AnimationState.idle,\n );\n await this.setAnimationFromFile(\n this.characterDescription.jogAnimationFileUrl,\n AnimationState.walking,\n );\n await this.setAnimationFromFile(\n this.characterDescription.sprintAnimationFileUrl,\n AnimationState.running,\n );\n this.applyMaterialToAllSkinnedMeshes(this.material);\n }\n\n public updateAnimation(targetAnimation: AnimationState, deltaTime: number) {\n if (this.currentAnimation !== targetAnimation) {\n this.transitionToAnimation(targetAnimation);\n }\n this.animationMixer?.update(deltaTime);\n }\n\n public hideMaterialByMeshName(meshName: any): void {\n if (!this.mesh) return;\n this.mesh.traverse((child: Object3D) => {\n if (child.type === \"SkinnedMesh\" && child.name === meshName) {\n (child as Mesh).material = new MeshStandardMaterial({\n color: 0xff0000,\n transparent: true,\n opacity: 0,\n });\n }\n });\n }\n\n private setShadows(\n mesh: Object3D,\n castShadow: boolean = true,\n receiveShadow: boolean = true,\n ): void {\n mesh.traverse((child: Object3D) => {\n if (child.type === \"SkinnedMesh\") {\n child.castShadow = castShadow;\n child.receiveShadow = receiveShadow;\n }\n });\n }\n\n private applyMaterialToAllSkinnedMeshes(material: any): void {\n if (!this.mesh) return;\n this.mesh.traverse((child: Object3D) => {\n if (child.type === \"SkinnedMesh\") {\n (child as Mesh).material = material;\n }\n });\n }\n\n private initAnimationMixer() {\n if (this.animationMixer !== null || this.mesh === null) return;\n this.animationMixer = new AnimationMixer(this.mesh);\n }\n\n private async loadMainMesh(): Promise<void> {\n const mainMeshUrl = this.characterDescription.meshFileUrl;\n const scale = this.characterDescription.modelScale;\n const extension = mainMeshUrl.split(\".\").pop();\n const name = mainMeshUrl.split(\"/\").pop()!.replace(`.${extension}`, \"\");\n const mainMesh = await this.modelLoader.load(mainMeshUrl, \"model\");\n if (typeof mainMesh !== \"undefined\") {\n this.mesh = new Object3D();\n const model = mainMesh as Object3D;\n model.position.set(0, -0.35, 0);\n this.mesh.add(model);\n this.mesh.name = name;\n this.mesh.scale.set(scale, scale, scale);\n this.setShadows(this.mesh);\n }\n }\n\n private async setAnimationFromFile(\n animationFileUrl: string,\n animationType: AnimationState,\n ): Promise<void> {\n return new Promise(async (resolve, reject) => {\n this.initAnimationMixer();\n const animation = await this.modelLoader.load(animationFileUrl, \"animation\");\n if (typeof animation !== \"undefined\" && animation instanceof AnimationClip) {\n this.animations[animationType] = this.animationMixer!.clipAction(animation);\n this.animations[animationType].stop();\n if (animationType === AnimationState.idle) {\n this.animations[animationType].play();\n }\n resolve();\n } else {\n reject(`failed to load ${animationType} from ${animationFileUrl}`);\n }\n });\n }\n\n private transitionToAnimation(\n targetAnimation: AnimationState,\n transitionDuration: number = 0.21,\n ): void {\n if (!this.mesh || this.currentAnimation === null) return;\n\n const currentAction = this.animations[this.currentAnimation];\n const targetAction = this.animations[targetAnimation];\n\n if (!targetAction) return;\n\n if (currentAction) {\n currentAction.enabled = true;\n currentAction.fadeOut(transitionDuration);\n }\n\n if (!targetAction.isRunning()) targetAction.play();\n\n targetAction.setLoop(LoopRepeat, Infinity);\n targetAction.enabled = true;\n targetAction.fadeIn(transitionDuration);\n\n this.currentAnimation = targetAnimation;\n }\n}\n", "import { Color, MeshPhysicalMaterial, UniformsUtils } from \"three\";\n\nimport { bayerDither } from \"../rendering/shaders/bayer-dither\";\nimport {\n injectBefore,\n injectBeforeMain,\n injectInsideMain,\n} from \"../rendering/shaders/shader-helpers\";\n\ntype TUniform<TValue = any> = { value: TValue };\n\nexport class CharacterMaterial extends MeshPhysicalMaterial {\n public uniforms: Record<string, TUniform> = {};\n public colorsCube216: Color[] = [];\n\n constructor() {\n super();\n this.color = new Color(0xffffff);\n this.transmission = 0.5;\n this.metalness = 0.5;\n this.roughness = 0.3;\n this.ior = 2.0;\n this.thickness = 0.1;\n this.specularColor = new Color(0x0077ff);\n this.specularIntensity = 0.1;\n this.envMapIntensity = 1.8;\n this.sheenColor = new Color(0x770077);\n this.sheen = 0.35;\n\n this.onBeforeCompile = (shader) => {\n this.uniforms = UniformsUtils.clone(shader.uniforms);\n this.uniforms.nearClip = { value: 0.01 };\n this.uniforms.farClip = { value: 1000.0 };\n this.uniforms.ditheringNear = { value: 0.25 };\n this.uniforms.ditheringRange = { value: 0.5 };\n this.uniforms.time = { value: 0.0 };\n this.uniforms.diffuseRandomColor = { value: new Color() };\n shader.uniforms = this.uniforms;\n\n shader.vertexShader = injectBeforeMain(shader.vertexShader, \"varying vec2 vUv;\");\n shader.vertexShader = injectInsideMain(shader.vertexShader, \"vUv = uv;\");\n\n shader.fragmentShader = injectBeforeMain(\n shader.fragmentShader,\n /* glsl */ `\n varying vec2 vUv;\n uniform float nearClip;\n uniform float farClip;\n uniform float ditheringNear;\n uniform float ditheringRange;\n uniform float time;\n uniform vec3 diffuseRandomColor;\n ${bayerDither}\n `,\n );\n\n shader.fragmentShader = injectBefore(\n shader.fragmentShader,\n \"#include <output_fragment>\",\n /* glsl */ `\n float distance = length(vWorldPosition - cameraPosition);\n float normalizedDistance = (distance - nearClip) / (farClip - nearClip);\n ivec2 p = ivec2(mod(gl_FragCoord.xy, 8.0));\n float d = 0.0;\n if (p.x <= 3 && p.y <= 3) {\n d = bayerDither(bayertl, p);\n } else if (p.x > 3 && p.y <= 3) {\n d = bayerDither(bayertr, p - ivec2(4, 0));\n } else if (p.x <= 3 && p.y > 3) {\n d = bayerDither(bayerbl, p - ivec2(0, 4));\n } else if (p.x > 3 && p.y > 3) {\n d = bayerDither(bayerbr, p - ivec2(4, 4));\n }\n if (distance <= ditheringNear + d * ditheringRange) discard;\n vec2 suv = vUv;\n float s = clamp(0.35 + 0.35 * sin(5.0 * -time + suv.y * 500.0), 0.0, 1.0);\n float scanLines = pow(s, 1.33);\n outgoingLight *= diffuseRandomColor;\n outgoingLight += smoothstep(0.1, 0.0, scanLines) * 0.1;\n `,\n );\n };\n\n this.generateColorCube();\n }\n\n private generateColorCube() {\n const saturation = 0.7;\n const lightness = 0.8;\n const goldenRatioConjugate = 0.618033988749895;\n let hue = 0;\n\n for (let i = 0; i < 216; i++) {\n const color = new Color();\n color.setHSL(hue, saturation, lightness);\n this.colorsCube216.push(color);\n hue = (hue + goldenRatioConjugate) % 1;\n }\n }\n}\n", "export const bayerDither: string = /* glsl */ `\nconst mat4 bayertl = mat4( \n 0.0 / 64.0, 32.0 / 64.0, 8.0 / 64.0, 40.0 / 64.0,\n 48.0 / 64.0, 16.0 / 64.0, 56.0 / 64.0, 24.0 / 64.0,\n 12.0 / 64.0, 44.0 / 64.0, 4.0 / 64.0, 36.0 / 64.0,\n 60.0 / 64.0, 28.0 / 64.0, 52.0 / 64.0, 20.0 / 64.0\n);\n\nconst mat4 bayertr = mat4( \n 2.0 / 64.0, 34.0 / 64.0, 10.0 / 64.0, 42.0 / 64.0,\n 50.0 / 64.0, 18.0 / 64.0, 58.0 / 64.0, 26.0 / 64.0,\n 14.0 / 64.0, 46.0 / 64.0, 6.0 / 64.0, 38.0 / 64.0,\n 62.0 / 64.0, 30.0 / 64.0, 54.0 / 64.0, 22.0 / 64.0\n);\n\nconst mat4 bayerbl = mat4( \n 3.0 / 64.0, 35.0 / 64.0, 11.0 / 64.0, 43.0 / 64.0,\n 51.0 / 64.0, 19.0 / 64.0, 59.0 / 64.0, 27.0 / 64.0,\n 15.0 / 64.0, 47.0 / 64.0, 7.0 / 64.0, 39.0 / 64.0,\n 63.0 / 64.0, 31.0 / 64.0, 55.0 / 64.0, 23.0 / 64.0\n);\n\nconst mat4 bayerbr = mat4( \n 1.0 / 64.0, 33.0 / 64.0, 9.0 / 64.0, 41.0 / 64.0,\n 49.0 / 64.0, 17.0 / 64.0, 57.0 / 64.0, 25.0 / 64.0,\n 13.0 / 64.0, 45.0 / 64.0, 5.0 / 64.0, 37.0 / 64.0,\n 61.0 / 64.0, 29.0 / 64.0, 53.0 / 64.0, 21.0 / 64.0\n);\n\nfloat bayerDither(mat4 m, ivec2 p) {\n if (p.y == 0) {\n if (p.x == 0) { return m[0][0]; }\n else if (p.x == 1) { return m[1][0]; }\n else if (p.x == 2) { return m[2][0]; }\n else { return m[3][0]; }\n } else if (p.y == 1) {\n if (p.x == 0) { return m[0][1]; }\n else if (p.x == 1) { return m[1][1]; }\n else if (p.x == 2) { return m[2][1]; }\n else { return m[3][1]; }\n } else if (p.y == 2) {\n if (p.x == 0) { return m[0][1]; }\n else if (p.x == 1) { return m[1][2]; }\n else if (p.x == 2) { return m[2][2]; }\n else { return m[3][2]; }\n } else {\n if (p.x == 0) { return m[0][3]; }\n else if (p.x == 1) { return m[1][3]; }\n else if (p.x == 2) { return m[2][3]; }\n else { return m[3][3]; }\n }\n}\n`;\n", "export function injectBeforeMain(shaderSource: string, codeToInject: string): string {\n return shaderSource.replace(\n \"void main() {\",\n `\n\n${codeToInject}\n\nvoid main() {`,\n );\n}\n\nexport function injectInsideMain(shaderSource: string, codeToInject: string): string {\n return shaderSource.replace(\n \"void main() {\",\n `void main() {\n\n${codeToInject}\n\n `,\n );\n}\n\nexport function injectBefore(shaderSource: string, before: string, codeToInject: string): string {\n return shaderSource.replace(\n before,\n `\n${codeToInject}\n\n${before}\n `,\n );\n}\n\nexport function injectAfter(shaderSource: string, after: string, codeToInject: string): string {\n return shaderSource.replace(\n after,\n `\n${after}\n\n${codeToInject}\n\n `,\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}\n\nexport type CharacterState = {\n id: number;\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 { AnimationClip, LoadingManager, Object3D } from \"three\";\nimport { FBXLoader } from \"three/examples/jsm/loaders/FBXLoader.js\";\nimport { GLTF, GLTFLoader } from \"three/examples/jsm/loaders/GLTFLoader.js\";\n\nexport class ModelLoader {\n private debug: boolean = false;\n private readonly loadingManager: LoadingManager;\n private readonly fbxLoader: FBXLoader;\n private readonly gltfLoader: GLTFLoader;\n\n constructor() {\n this.loadingManager = new LoadingManager();\n this.fbxLoader = new FBXLoader(this.loadingManager);\n this.gltfLoader = new GLTFLoader(this.loadingManager);\n }\n\n async load(\n fileUrl: string,\n fileType: \"model\" | \"animation\",\n ): Promise<Object3D | AnimationClip | undefined> {\n const extension = fileUrl.split(\".\").pop();\n if (typeof extension === \"undefined\") {\n console.error(`Unable to identify model type from ${fileUrl}`);\n return;\n }\n const name = fileUrl.split(\"/\").pop()!.replace(`.${extension!}`, \"\");\n if (this.debug) {\n console.log(`Loading ${extension} model ${name} from ${fileUrl}`);\n }\n if ([\"gltf\", \"glb\"].includes(extension)) {\n return new Promise((resolve, reject) => {\n this.gltfLoader.load(\n fileUrl,\n (object: GLTF) => {\n if (fileType === \"model\") {\n resolve(object.scene as Object3D);\n } else if (fileType === \"animation\") {\n resolve(object.animations[0] as AnimationClip);\n } else {\n const error = `Trying to load unknown ${fileType} type of element from file ${fileUrl}`;\n console.error(error);\n reject(error);\n }\n },\n undefined,\n (error) => {\n console.error(`Error loading GL(B|TF) from ${fileUrl}: ${error}`);\n reject(error);\n },\n );\n });\n } else if (extension === \"fbx\") {\n return new Promise((resolve, reject) => {\n this.fbxLoader.load(\n fileUrl,\n (object: Object3D) => {\n resolve(object as Object3D);\n },\n undefined,\n (error) => {\n console.error(`Error loading FBX from ${fileUrl}: ${error}`);\n reject(error);\n },\n );\n });\n }\n }\n}\n", "import { Box3, Line3, Matrix4, PerspectiveCamera, Quaternion, Vector3 } from \"three\";\n\nimport { CameraManager } from \"../camera/CameraManager\";\nimport { CollisionsManager } from \"../collisions/CollisionsManager\";\nimport { ease } from \"../helpers/math-helpers\";\nimport { KeyInputManager } from \"../input/KeyInputManager\";\nimport { TimeManager } from \"../time/TimeManager\";\n\nimport { CharacterModel } from \"./CharacterModel\";\nimport { AnimationState, CharacterState } from \"./CharacterState\";\n\nexport class LocalController {\n private collisionDetectionSteps = 15;\n\n public capsuleInfo = {\n radius: 0.4,\n segment: new Line3(new Vector3(), new Vector3(0, 1.05, 0)),\n };\n\n private characterOnGround: boolean = false;\n private characterVelocity: Vector3 = new Vector3();\n private gravity = -20;\n private upVector: Vector3 = new Vector3(0, 1, 0);\n\n private rotationOffset: number = 0;\n private azimuthalAngle: number = 0;\n\n private tempBox: Box3 = new Box3();\n private tempMatrix: Matrix4 = new Matrix4();\n private tempSegment: Line3 = new Line3();\n private tempVector: Vector3 = new Vector3();\n private tempVector2: Vector3 = new Vector3();\n\n private jumpInput: boolean = false;\n private jumpForce: number = 10;\n private canJump: boolean = true;\n\n private inputDirections: {\n forward: boolean;\n backward: boolean;\n left: boolean;\n right: boolean;\n } = {\n forward: false,\n backward: false,\n left: false,\n right: false,\n };\n private runInput: boolean = false;\n\n private thirdPersonCamera: PerspectiveCamera | null = null;\n\n private speed: number = 0;\n private targetSpeed: number = 0;\n\n public networkState: CharacterState = {\n id: 0,\n position: { x: 0, y: 0, z: 0 },\n rotation: { quaternionY: 0, quaternionW: 0 },\n state: AnimationState.idle,\n };\n\n constructor(\n private readonly model: CharacterModel,\n private readonly id: number,\n private readonly collisionsManager: CollisionsManager,\n private readonly keyInputManager: KeyInputManager,\n private readonly cameraManager: CameraManager,\n private readonly timeManager: TimeManager,\n ) {}\n\n public update(): void {\n if (!this.model?.mesh || !this.model?.animationMixer) return;\n if (!this.thirdPersonCamera) this.thirdPersonCamera = this.cameraManager.camera;\n\n const movementKeysPressed = this.keyInputManager.isMovementKeyPressed();\n const forward = this.keyInputManager.isKeyPressed(\"w\");\n const backward = this.keyInputManager.isKeyPressed(\"s\");\n const left = this.keyInputManager.isKeyPressed(\"a\");\n const right = this.keyInputManager.isKeyPressed(\"d\");\n\n this.inputDirections = { forward, backward, left, right };\n this.jumpInput = this.keyInputManager.isJumping();\n this.runInput = this.keyInputManager.isShiftPressed();\n\n if (movementKeysPressed) {\n const targetAnimation = this.getTargetAnimation();\n this.model.updateAnimation(targetAnimation, this.timeManager.deltaTime);\n } else {\n this.model.updateAnimation(AnimationState.idle, this.timeManager.deltaTime);\n }\n\n if (Object.values(this.inputDirections).some((v) => v)) {\n this.updateRotation();\n }\n\n for (let i = 0; i < this.collisionDetectionSteps; i++) {\n this.updatePosition(this.timeManager.deltaTime / this.collisionDetectionSteps, i);\n }\n\n if (this.model.mesh.position.y < 0) {\n this.resetPosition();\n }\n this.updateNetworkState();\n }\n\n private getTargetAnimation(): AnimationState {\n const { forward, backward, left, right } = this.inputDirections;\n const hasAnyDirection = forward || backward || left || right;\n const isRunning = this.runInput && hasAnyDirection;\n const conflictingDirections = (forward && backward) || (left && right);\n\n if (conflictingDirections) return AnimationState.idle;\n return hasAnyDirection\n ? isRunning\n ? AnimationState.running\n : AnimationState.walking\n : AnimationState.idle;\n }\n\n private updateRotationOffset(): void {\n const { forward, backward, left, right } = this.inputDirections;\n if ((left && right) || (forward && backward)) return;\n if (forward) {\n this.rotationOffset = Math.PI;\n if (left) this.rotationOffset = Math.PI + Math.PI / 4;\n if (right) this.rotationOffset = Math.PI - Math.PI / 4;\n } else if (backward) {\n this.rotationOffset = Math.PI * 2;\n if (left) this.rotationOffset = -Math.PI * 2 - Math.PI / 4;\n if (right) this.rotationOffset = Math.PI * 2 + Math.PI / 4;\n } else if (left) {\n this.rotationOffset = Math.PI * -0.5;\n } else if (right) {\n this.rotationOffset = Math.PI * 0.5;\n }\n }\n\n private updateAzimuthalAngle(): void {\n if (!this.thirdPersonCamera || !this.model?.mesh) return;\n this.azimuthalAngle = Math.atan2(\n this.thirdPersonCamera.position.x - this.model.mesh.position.x,\n this.thirdPersonCamera.position.z - this.model.mesh.position.z,\n );\n }\n\n private updateRotation(): void {\n if (!this.thirdPersonCamera || !this.model?.mesh) return;\n this.updateRotationOffset();\n this.updateAzimuthalAngle();\n const rotationQuaternion = new Quaternion();\n rotationQuaternion.setFromAxisAngle(this.upVector, this.azimuthalAngle + this.rotationOffset);\n this.model.mesh.quaternion.rotateTowards(rotationQuaternion, 0.07);\n }\n\n private addScaledVectorToCharacter(deltaTime: number) {\n if (!this.model?.mesh) return;\n this.model.mesh.position.addScaledVector(this.tempVector, this.speed * deltaTime);\n }\n\n private updatePosition(deltaTime: number, _iter: number): void {\n if (!this.model?.mesh) return;\n const { forward, backward, left, right } = this.inputDirections;\n\n this.targetSpeed = this.runInput ? 14 : 8;\n this.speed += ease(this.targetSpeed, this.speed, 0.07);\n\n if (this.characterOnGround) {\n this.canJump = true;\n if (this.jumpInput && this.canJump) {\n this.characterVelocity.y += this.jumpForce;\n this.canJump = false;\n } else {\n this.characterVelocity.y = deltaTime * this.gravity;\n }\n } else {\n this.characterVelocity.y += deltaTime * this.gravity;\n this.canJump = false;\n }\n\n this.model.mesh.position.addScaledVector(this.characterVelocity, deltaTime);\n\n if (forward) {\n this.tempVector.set(0, 0, -1).applyAxisAngle(this.upVector, this.azimuthalAngle);\n this.addScaledVectorToCharacter(deltaTime);\n }\n\n if (backward) {\n this.tempVector.set(0, 0, 1).applyAxisAngle(this.upVector, this.azimuthalAngle);\n this.addScaledVectorToCharacter(deltaTime);\n }\n\n if (left) {\n this.tempVector.set(-1, 0, 0).applyAxisAngle(this.upVector, this.azimuthalAngle);\n this.addScaledVectorToCharacter(deltaTime);\n }\n\n if (right) {\n this.tempVector.set(1, 0, 0).applyAxisAngle(this.upVector, this.azimuthalAngle);\n this.addScaledVectorToCharacter(deltaTime);\n }\n\n this.model.mesh.updateMatrixWorld();\n\n this.tempBox.makeEmpty();\n\n this.tempSegment.copy(this.capsuleInfo.segment!);\n this.tempSegment.start.applyMatrix4(this.model.mesh.matrixWorld).applyMatrix4(this.tempMatrix);\n this.tempSegment.end.applyMatrix4(this.model.mesh.matrixWorld).applyMatrix4(this.tempMatrix);\n\n this.tempBox.expandByPoint(this.tempSegment.start);\n this.tempBox.expandByPoint(this.tempSegment.end);\n\n this.tempBox.min.subScalar(this.capsuleInfo.radius!);\n this.tempBox.max.addScalar(this.capsuleInfo.radius!);\n\n this.collisionsManager.applyColliders(this.tempSegment, this.capsuleInfo.radius!, this.tempBox);\n\n const newPosition = this.tempVector;\n newPosition.copy(this.tempSegment.start);\n\n const deltaVector = this.tempVector2;\n deltaVector.subVectors(newPosition, this.model.mesh.position);\n\n const offset = Math.max(0.0, deltaVector.length() - 1e-5);\n deltaVector.normalize().multiplyScalar(offset);\n\n this.model.mesh.position.add(deltaVector);\n\n this.characterOnGround = deltaVector.y > Math.abs(deltaTime * this.characterVelocity.y * 0.25);\n\n if (this.characterOnGround) {\n this.characterVelocity.set(0, 0, 0);\n } else {\n deltaVector.normalize();\n this.characterVelocity.addScaledVector(deltaVector, -deltaVector.dot(this.characterVelocity));\n }\n }\n\n private updateNetworkState(): void {\n if (!this.model?.mesh) return;\n const characterQuaternion = this.model.mesh.getWorldQuaternion(new Quaternion());\n const positionUpdate = new Vector3(\n this.model.mesh.position.x,\n this.model.mesh.position.y,\n this.model.mesh.position.z,\n );\n this.networkState = {\n id: this.id,\n position: positionUpdate,\n rotation: { quaternionY: characterQuaternion?.y, quaternionW: characterQuaternion?.w },\n state: this.model.currentAnimation as AnimationState,\n };\n }\n\n private resetPosition(): void {\n if (!this.model?.mesh) return;\n this.characterVelocity.y = 0;\n this.model.mesh.position.y = 5;\n this.characterOnGround = false;\n }\n}\n", "import { PositionAndRotation } from \"mml-web\";\nimport { Camera, Group, Object3D, PerspectiveCamera, Vector3 } from \"three\";\n\nimport { CameraManager } from \"../camera/CameraManager\";\nimport { CollisionsManager } from \"../collisions/CollisionsManager\";\nimport { getSpawnPositionInsideCircle } from \"../helpers/math-helpers\";\nimport { KeyInputManager } from \"../input/KeyInputManager\";\nimport { TimeManager } from \"../time/TimeManager\";\n\nimport { Character, CharacterDescription } from \"./Character\";\nimport { AnimationState, CharacterState } from \"./CharacterState\";\nimport { RemoteController } from \"./RemoteController\";\n\nfunction encodeCharacterAndCamera(character: Object3D, camera: PerspectiveCamera): string {\n return [\n ...character.position.toArray(),\n ...character.quaternion.toArray(),\n ...camera.position.toArray(),\n ...camera.quaternion.toArray(),\n ].join(\",\");\n}\n\nfunction decodeCharacterAndCamera(hash: string, character: Object3D, camera: Camera) {\n const values = hash.split(\",\").map(Number);\n character.position.fromArray(values.slice(0, 3));\n character.quaternion.fromArray(values.slice(3, 7));\n camera.position.fromArray(values.slice(7, 10));\n camera.quaternion.fromArray(values.slice(10, 14));\n}\n\nexport class CharacterManager {\n /*\n TODO - re-enable updating location hash when there is a solution that waits for models to load (currently if the \n character was standing on a model and the page is reloaded the character falls into the model before it loads and \n can be trapped).\n */\n private updateLocationHash = false;\n\n public loadingCharacters: Map<number, Promise<Character>> = new Map();\n\n public remoteCharacters: Map<number, Character> = new Map();\n public remoteCharacterControllers: Map<number, RemoteController> = new Map();\n\n private characterDescription: CharacterDescription | null = null;\n public character: Character | null = null;\n\n public readonly group: Group;\n\n constructor(\n private readonly collisionsManager: CollisionsManager,\n private readonly cameraManager: CameraManager,\n private readonly timeManager: TimeManager,\n private readonly inputManager: KeyInputManager,\n private readonly clientStates: Map<number, CharacterState>,\n private readonly sendUpdate: (update: CharacterState) => void,\n ) {\n this.group = new Group();\n }\n\n public spawnCharacter(\n characterDescription: CharacterDescription,\n id: number,\n isLocal: boolean = false,\n ) {\n this.characterDescription = characterDescription;\n const characterLoadingPromise = new Promise<Character>((resolve) => {\n const character = new Character(\n characterDescription,\n id,\n isLocal,\n () => {\n if (window.location.hash && window.location.hash.length > 1) {\n decodeCharacterAndCamera(\n window.location.hash.substring(1),\n character.model!.mesh!,\n this.cameraManager.camera,\n );\n } else {\n const spawnPosition = getSpawnPositionInsideCircle(3, 30, id);\n character.model!.mesh!.position.set(spawnPosition.x, spawnPosition.y, spawnPosition.z);\n this.cameraManager.camera.position.set(\n spawnPosition.x,\n spawnPosition.y + 1.5,\n spawnPosition.z + 3,\n );\n }\n character.model!.hideMaterialByMeshName(\"SK_UE5Mannequin_1\");\n this.group.add(character.model!.mesh!);\n\n if (isLocal) {\n this.character = character;\n } else {\n this.remoteCharacters.set(id, character);\n const remoteController = new RemoteController(character, id);\n remoteController.setAnimationFromFile(\n AnimationState.idle,\n characterDescription.idleAnimationFileUrl,\n );\n remoteController.setAnimationFromFile(\n AnimationState.walking,\n characterDescription.jogAnimationFileUrl,\n );\n remoteController.setAnimationFromFile(\n AnimationState.running,\n characterDescription.sprintAnimationFileUrl,\n );\n this.remoteCharacterControllers.set(id, remoteController);\n }\n\n resolve(character);\n },\n this.collisionsManager,\n this.inputManager,\n this.cameraManager,\n this.timeManager,\n );\n });\n\n this.loadingCharacters.set(id, characterLoadingPromise);\n return characterLoadingPromise;\n }\n\n public getLocalCharacterPositionAndRotation(): PositionAndRotation {\n if (this.character && this.character.model && this.character.model.mesh) {\n return {\n position: this.character.model.mesh.position,\n rotation: this.character.model.mesh.rotation,\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 for (const [id, character] of this.remoteCharacters) {\n this.group.remove(character.model!.mesh!);\n this.remoteCharacters.delete(id);\n this.remoteCharacterControllers.delete(id);\n }\n if (this.character) {\n this.group.remove(this.character.model!.mesh!);\n this.character = null;\n }\n this.loadingCharacters.clear();\n }\n\n public update() {\n if (this.character) {\n this.character.update(this.timeManager.time);\n this.cameraManager.setTarget(this.character.position.add(new Vector3(0, 1.3, 0)));\n\n if (this.character.controller) {\n this.character.controller.update();\n if (this.timeManager.frame % 2 === 0) {\n this.sendUpdate(this.character.controller.networkState);\n }\n }\n\n for (const [id, update] of this.clientStates) {\n if (!this.remoteCharacters.has(id) && !this.loadingCharacters.has(id)) {\n this.spawnCharacter(this.characterDescription!, id).then(() => {\n this.loadingCharacters.delete(id);\n });\n }\n\n const characterController = this.remoteCharacterControllers.get(id);\n if (characterController) {\n characterController.update(update, this.timeManager.time, this.timeManager.deltaTime);\n }\n }\n\n for (const [id, character] of this.remoteCharacters) {\n if (!this.clientStates.has(id)) {\n this.group.remove(character.model!.mesh!);\n this.remoteCharacters.delete(id);\n this.remoteCharacterControllers.delete(id);\n }\n }\n\n if (this.updateLocationHash && this.timeManager.frame % 60 === 0) {\n window.location.hash = encodeCharacterAndCamera(\n this.character.model!.mesh!,\n this.cameraManager.camera,\n );\n }\n }\n }\n}\n", "import {\n AnimationAction,\n AnimationClip,\n AnimationMixer,\n LoadingManager,\n Object3D,\n Quaternion,\n Vector3,\n} from \"three\";\nimport { FBXLoader } from \"three/examples/jsm/loaders/FBXLoader.js\";\nimport { GLTFLoader } from \"three/examples/jsm/loaders/GLTFLoader.js\";\n\nimport { Character } from \"./Character\";\nimport { AnimationState, CharacterState } from \"./CharacterState\";\n\nexport class RemoteController {\n public characterModel: Object3D | null = null;\n private loadManager: LoadingManager = new LoadingManager();\n\n private animationMixer: AnimationMixer = new AnimationMixer(new Object3D());\n private animations = new Map<AnimationState, AnimationAction>();\n public currentAnimation: AnimationState = AnimationState.idle;\n\n private fbxLoader: FBXLoader = new FBXLoader(this.loadManager);\n private gltfLoader: GLTFLoader = new GLTFLoader(this.loadManager);\n\n public networkState: CharacterState = {\n id: 0,\n position: { x: 0, y: 0, z: 0 },\n rotation: { quaternionY: 0, quaternionW: 0 },\n state: this.currentAnimation as AnimationState,\n };\n\n constructor(public readonly character: Character, public readonly id: number) {\n this.characterModel = this.character.model!.mesh!;\n this.animationMixer = new AnimationMixer(this.characterModel);\n }\n\n public update(clientUpdate: CharacterState, time: number, deltaTime: number): void {\n if (!this.character) return;\n this.character.update(time);\n this.updateFromNetwork(clientUpdate);\n this.animationMixer.update(deltaTime);\n }\n\n public setAnimationFromFile(animationType: AnimationState, fileName: string): void {\n const animationFile = `${fileName}`;\n const extension = fileName.split(\".\").pop();\n if (typeof extension !== \"string\") {\n console.error(`Error: could not recognize extension of animation: ${animationFile}`);\n return;\n }\n if ([\"gltf\", \"glb\"].includes(extension)) {\n this.gltfLoader.load(\n animationFile,\n (anim) => {\n const animation = anim.animations[0] as AnimationClip;\n const animationAction = this.animationMixer.clipAction(animation);\n this.animations.set(animationType, animationAction);\n if (animationType === AnimationState.idle) {\n animationAction.play();\n }\n },\n undefined,\n (error) => console.error(`Error loading ${animationFile}: ${error}`),\n );\n } else if ([\"fbx\"].includes(extension)) {\n this.fbxLoader.load(\n animationFile,\n (anim) => {\n const animation = anim.animations[0] as AnimationClip;\n const animationAction = this.animationMixer.clipAction(animation);\n this.animations.set(animationType, animationAction);\n if (animationType === AnimationState.idle) {\n animationAction.play();\n }\n },\n undefined,\n (error) => console.error(`Error loading ${animationFile}: ${error}`),\n );\n }\n }\n\n private transitionToAnimation(\n targetAnimation: AnimationState,\n transitionDuration: number = 0.21,\n ): void {\n if (this.currentAnimation === targetAnimation) return;\n\n const currentAction = this.animations.get(this.currentAnimation);\n const targetAction = this.animations.get(targetAnimation);\n\n if (!targetAction) return;\n\n if (currentAction) {\n currentAction.enabled = true;\n targetAction\n .reset()\n .setEffectiveTimeScale(1)\n .setEffectiveWeight(1)\n .fadeIn(transitionDuration)\n .play();\n currentAction.crossFadeTo(targetAction, transitionDuration, true);\n } else {\n targetAction.play();\n }\n\n this.currentAnimation = targetAnimation;\n }\n\n private updateFromNetwork(clientUpdate: CharacterState): void {\n if (!this.characterModel) return;\n const { position, rotation, state } = clientUpdate;\n this.characterModel.position.lerp(new Vector3(position.x, position.y, position.z), 0.2);\n const rotationQuaternion = new Quaternion(0, rotation.quaternionY, 0, rotation.quaternionW);\n this.characterModel.quaternion.slerp(rotationQuaternion, 0.2);\n if (state !== this.currentAnimation) {\n this.transitionToAnimation(state);\n }\n }\n}\n", "export class KeyInputManager {\n private keys = new Map<string, boolean>();\n\n constructor() {\n document.addEventListener(\"keydown\", this.onKeyDown.bind(this));\n document.addEventListener(\"keyup\", this.onKeyUp.bind(this));\n }\n\n private onKeyDown(event: KeyboardEvent): void {\n this.keys.set(event.key.toLowerCase(), true);\n }\n\n private onKeyUp(event: KeyboardEvent): void {\n this.keys.set(event.key.toLowerCase(), false);\n }\n\n public isKeyPressed(key: string): boolean {\n return this.keys.get(key) || false;\n }\n\n public isMovementKeyPressed(): boolean {\n return [\"w\", \"a\", \"s\", \"d\"].some((key) => this.isKeyPressed(key));\n }\n\n public isShiftPressed(): boolean {\n return this.isKeyPressed(\"shift\");\n }\n\n public isJumping(): boolean {\n return this.isKeyPressed(\" \");\n }\n\n public dispose() {\n document.removeEventListener(\"keydown\", this.onKeyDown.bind(this));\n document.removeEventListener(\"keyup\", this.onKeyDown.bind(this));\n }\n}\n", "import {\n IMMLScene,\n Interaction,\n InteractionListener,\n InteractionManager,\n MMLClickTrigger,\n PromptManager,\n PromptProps,\n registerCustomElementsToWindow,\n setGlobalMScene,\n PositionAndRotation,\n MElement,\n} from \"mml-web\";\nimport { AudioListener, Group, Object3D, PerspectiveCamera, Scene, WebGLRenderer } from \"three\";\n\nimport { CollisionsManager } from \"../collisions/CollisionsManager\";\n\nexport class MMLCompositionScene {\n public group: Group;\n private debug: boolean = false;\n\n private readonly mmlScene: Partial<IMMLScene>;\n private readonly promptManager: PromptManager;\n private readonly interactionListener: InteractionListener;\n private readonly clickTrigger: MMLClickTrigger;\n\n constructor(\n private renderer: WebGLRenderer,\n private scene: Scene,\n private camera: PerspectiveCamera,\n private audioListener: AudioListener,\n private collisionsManager: CollisionsManager,\n private getUserPositionAndRotation: () => PositionAndRotation,\n documentAddresses: Array<string>,\n ) {\n this.group = new Group();\n this.promptManager = PromptManager.init(document.body);\n\n const { interactionListener } = InteractionManager.init(document.body, this.camera, this.scene);\n this.interactionListener = interactionListener;\n\n this.mmlScene = {\n getAudioListener: () => this.audioListener,\n getRenderer: () => this.renderer,\n getThreeScene: () => this.scene,\n getRootContainer: () => this.group,\n getCamera: () => this.camera,\n addCollider: (object: Object3D, mElement: MElement) => {\n this.collisionsManager.addMeshesGroup(object as Group, mElement);\n },\n updateCollider: (object: Object3D) => {\n this.collisionsManager.updateMeshesGroup(object as Group);\n },\n removeCollider: (object: Object3D) => {\n this.collisionsManager.removeMeshesGroup(object as Group);\n },\n getUserPositionAndRotation: this.getUserPositionAndRotation,\n addInteraction: (interaction: Interaction) => {\n this.interactionListener.addInteraction(interaction);\n },\n updateInteraction: (interaction: Interaction) => {\n this.interactionListener.updateInteraction(interaction);\n },\n removeInteraction: (interaction: Interaction) => {\n this.interactionListener.removeInteraction(interaction);\n },\n prompt: (promptProps: PromptProps, callback: (message: string | null) => void) => {\n this.promptManager.prompt(promptProps, callback);\n },\n };\n setGlobalMScene(this.mmlScene as IMMLScene);\n registerCustomElementsToWindow(window);\n this.clickTrigger = MMLClickTrigger.init(document, this.mmlScene as IMMLScene);\n if (this.debug) {\n console.log(this.clickTrigger);\n }\n for (const address of documentAddresses) {\n const frameElement = document.createElement(\"m-frame\");\n frameElement.setAttribute(\"src\", address);\n document.body.appendChild(frameElement);\n }\n }\n}\n", "import {\n EffectComposer,\n RenderPass,\n EffectPass,\n FXAAEffect,\n ShaderPass,\n BloomEffect,\n} from \"postprocessing\";\nimport {\n ACESFilmicToneMapping,\n PCFSoftShadowMap,\n PerspectiveCamera,\n Scene,\n Vector2,\n WebGLRenderer,\n} from \"three\";\n\nimport { GaussGrainEffect } from \"./post-effects/gauss-grain\";\n\nexport class Composer {\n private width: number = window.innerWidth;\n private height: number = window.innerHeight;\n public resolution: Vector2 = new Vector2(this.width, this.height);\n\n private readonly scene: Scene;\n private readonly camera: PerspectiveCamera;\n public readonly renderer: WebGLRenderer;\n\n private readonly composer: EffectComposer;\n private readonly renderPass: RenderPass;\n private readonly fxaaEffect: FXAAEffect;\n private readonly fxaaPass: EffectPass;\n private readonly bloomEffect: BloomEffect;\n private readonly bloomPass: EffectPass;\n\n private readonly gaussGrainEffect = GaussGrainEffect;\n private readonly gaussGrainPass: ShaderPass;\n\n constructor(scene: Scene, camera: PerspectiveCamera) {\n this.scene = scene;\n this.camera = camera;\n this.renderer = new WebGLRenderer({\n powerPreference: \"high-performance\",\n antialias: false,\n stencil: false,\n depth: false,\n });\n this.renderer.setSize(this.width, this.height);\n this.renderer.shadowMap.enabled = true;\n this.renderer.shadowMap.type = PCFSoftShadowMap;\n this.renderer.toneMapping = ACESFilmicToneMapping;\n this.renderer.toneMappingExposure = 0.5;\n document.body.appendChild(this.renderer.domElement);\n\n this.composer = new EffectComposer(this.renderer);\n this.renderPass = new RenderPass(this.scene, this.camera);\n this.fxaaEffect = new FXAAEffect();\n this.fxaaPass = new EffectPass(this.camera, this.fxaaEffect);\n this.bloomEffect = new BloomEffect();\n this.bloomPass = new EffectPass(this.camera, this.bloomEffect);\n this.gaussGrainPass = new ShaderPass(this.gaussGrainEffect, \"tDiffuse\");\n\n this.composer.addPass(this.renderPass);\n this.composer.addPass(this.fxaaPass);\n this.composer.addPass(this.bloomPass);\n this.composer.addPass(this.gaussGrainPass);\n\n window.addEventListener(\"resize\", () => {\n this.updateProjection();\n });\n this.updateProjection();\n }\n\n private updateProjection(): void {\n this.width = window.innerWidth;\n this.height = innerHeight;\n this.resolution = new Vector2(this.width, this.height);\n if (this.composer) this.composer.setSize(this.width, this.height);\n if (this.fxaaPass) this.fxaaPass.setSize(this.width, this.height);\n if (this.renderPass) this.renderPass.setSize(this.width, this.height);\n this.renderer.setSize(this.width, this.height);\n }\n\n public render(time: number): void {\n this.composer.render();\n this.gaussGrainEffect.uniforms.resolution.value = this.resolution;\n this.gaussGrainEffect.uniforms.time.value = time;\n this.gaussGrainEffect.uniforms.alpha.value = 1.0;\n this.gaussGrainEffect.uniforms.amount.value = 0.035;\n this.bloomEffect.intensity = 1.0;\n }\n}\n", "import { ShaderMaterial, Uniform, Vector2 } from \"three\";\n\nimport { vertexShader } from \"../shaders/vertex-shader\";\n\nexport const GaussGrainEffect = new ShaderMaterial({\n uniforms: {\n tDiffuse: new Uniform(null),\n resolution: new Uniform(new Vector2()),\n time: new Uniform(0.0),\n amount: new Uniform(0.0),\n alpha: new Uniform(0.0),\n },\n vertexShader: vertexShader,\n fragmentShader: /* glsl */ `\n precision highp float;\n in vec2 vUv;\n\n uniform sampler2D tDiffuse;\n uniform vec2 resolution;\n uniform float time;\n uniform float amount;\n uniform float alpha;\n\n const float PI = acos(-1.0);\n const float TAU = PI * 2.0;\n const float SQRTAU = sqrt(TAU);\n\n float gaussian(float z, float u, float o) {\n return (\n (1.0 / (o * SQRTAU)) *\n (exp(-(((z - u) * (z - u)) / (2.0 * (o * o)))))\n );\n }\n\n vec3 gaussgrain() {\n vec2 ps = vec2(1.01) / resolution.xy;\n vec2 uv = gl_FragCoord.xy * ps;\n float t = time;\n float seed = dot(uv, vec2(12.9898, 78.233));\n float noise = fract(sin(seed) * 43758.5453123 + t);\n noise = gaussian(noise, 0.0, 0.5);\n return vec3(noise);\n }\n\n void main(void) {\n vec2 uv = vUv;\n vec4 originalColor = texture(tDiffuse, uv);\n vec3 grain = gaussgrain();\n vec3 col = originalColor.rgb + (grain * amount);\n gl_FragColor = vec4(clamp(col, 0.0, 1.0), alpha);\n }\n `,\n});\n", "export const vertexShader = /* glsl */ `\n precision highp float;\n\n out vec2 vUv;\n void main() {\n vUv = uv;\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n }\n `;\n", "import { Clock } from \"three\";\n\nimport { ease } from \"../helpers/math-helpers\";\n\nexport class TimeManager {\n private clock: Clock = new Clock();\n private roundMagnitude: number = 200000;\n private maxAverageFrames: number = 300;\n private deltaTimes: number[] = [];\n private targetAverageDeltaTime: number = 0;\n private lerpedAverageMagDelta: number = 0;\n private fpsUpdateTime: number = 0;\n private framesSinceLastFPSUpdate: number = 0;\n\n public time: number = 0;\n public deltaTime: number = 0;\n public rawDeltaTime: number = 0;\n public frame: number = 0;\n public fps: number = 0;\n\n update() {\n this.rawDeltaTime = this.clock.getDelta();\n this.frame++;\n this.time += this.rawDeltaTime;\n this.deltaTimes.push(this.rawDeltaTime);\n\n if (this.deltaTimes.length > this.maxAverageFrames) {\n this.deltaTimes.shift();\n }\n\n this.targetAverageDeltaTime =\n this.deltaTimes.reduce((prev, curr) => prev + curr, 0) / this.deltaTimes.length;\n\n this.lerpedAverageMagDelta += ease(\n this.targetAverageDeltaTime * this.roundMagnitude,\n this.lerpedAverageMagDelta,\n 0.12,\n );\n\n const revertMagnitude = this.lerpedAverageMagDelta / this.roundMagnitude;\n const smoothDT = Math.round(revertMagnitude * this.roundMagnitude) / this.roundMagnitude;\n\n this.deltaTime = smoothDT > this.rawDeltaTime * 1.75 ? this.rawDeltaTime : smoothDT;\n\n this.framesSinceLastFPSUpdate++;\n if (this.framesSinceLastFPSUpdate >= this.maxAverageFrames) {\n this.fps =\n Math.round((this.framesSinceLastFPSUpdate / (this.time - this.fpsUpdateTime)) * 100) / 100;\n this.fpsUpdateTime = this.time;\n this.framesSinceLastFPSUpdate = 0;\n }\n }\n}\n", "import {\n MElement,\n MMLCollisionTrigger,\n getRelativePositionAndRotationRelativeToObject,\n} from \"mml-web\";\nimport {\n Box3,\n BufferGeometry,\n Color,\n Euler,\n FrontSide,\n Group,\n Line3,\n Mesh,\n MeshStandardMaterial,\n Object3D,\n Scene,\n Vector3,\n} from \"three\";\nimport * as BufferGeometryUtils from \"three/examples/jsm/utils/BufferGeometryUtils.js\";\nimport { MeshBVH, MeshBVHVisualizer } from \"three-mesh-bvh\";\n\ntype CollisionMeshState = {\n source: Group;\n meshBVH: MeshBVH;\n visualizer: MeshBVHVisualizer | null;\n};\n\nexport class CollisionsManager {\n private debug: boolean = false;\n private scene: Scene;\n private tempVector: Vector3 = new Vector3();\n private tempVector2: Vector3 = new Vector3();\n\n private collisionMeshState: Map<Group, CollisionMeshState> = new Map();\n private collisionTrigger: MMLCollisionTrigger;\n\n constructor(scene: Scene) {\n this.scene = scene;\n this.collisionTrigger = MMLCollisionTrigger.init();\n }\n\n private createCollisionMeshState(group: Group): CollisionMeshState {\n const geometries: Array<BufferGeometry> = [];\n group.traverse((child: Object3D) => {\n if (child.type === \"Mesh\") {\n const mesh = child as Mesh;\n mesh.localToWorld(new Vector3());\n mesh.updateMatrixWorld();\n const clonedGeometry = mesh.geometry.clone();\n clonedGeometry.applyMatrix4(mesh.matrixWorld);\n\n for (const key in clonedGeometry.attributes) {\n if (key !== \"position\") {\n clonedGeometry.deleteAttribute(key);\n }\n }\n if (clonedGeometry.index) {\n geometries.push(clonedGeometry.toNonIndexed());\n } else {\n geometries.push(clonedGeometry);\n }\n }\n });\n const newBufferGeometry = BufferGeometryUtils.mergeGeometries(geometries);\n const meshBVH = new MeshBVH(newBufferGeometry);\n\n if (!this.debug) {\n return { source: group, visualizer: null, meshBVH };\n }\n\n const mergedMesh = new Mesh(\n newBufferGeometry,\n new MeshStandardMaterial({ color: 0xff0000, side: FrontSide, wireframe: true }),\n );\n mergedMesh.geometry.boundsTree = meshBVH;\n const visualizer = new MeshBVHVisualizer(mergedMesh, 3);\n visualizer.edgeMaterial.color = new Color(0x0000ff);\n visualizer.update();\n return { source: group, visualizer, meshBVH };\n }\n\n public addMeshesGroup(group: Group, mElement?: MElement): void {\n if (mElement) {\n this.collisionTrigger.addCollider(group, mElement);\n }\n const meshState = this.createCollisionMeshState(group);\n if (meshState.visualizer) {\n this.scene.add(meshState.visualizer);\n }\n this.collisionMeshState.set(group, meshState);\n }\n\n public updateMeshesGroup(group: Group): void {\n const meshState = this.collisionMeshState.get(group);\n if (meshState) {\n const newMeshState = this.createCollisionMeshState(group);\n if (meshState.visualizer) {\n this.scene.remove(meshState.visualizer);\n }\n if (newMeshState.visualizer) {\n this.scene.add(newMeshState.visualizer);\n }\n this.collisionMeshState.set(group, newMeshState);\n }\n }\n\n public removeMeshesGroup(group: Group): void {\n this.collisionTrigger.removeCollider(group);\n const meshState = this.collisionMeshState.get(group);\n if (meshState) {\n if (meshState.visualizer) {\n this.scene.remove(meshState.visualizer);\n }\n this.collisionMeshState.delete(group);\n }\n }\n\n private applyCollider(\n tempSegment: Line3,\n radius: number,\n boundingBox: Box3,\n meshState: CollisionMeshState,\n ): Vector3 | null {\n let collisionPosition: Vector3 | null = null;\n meshState.meshBVH.shapecast({\n intersectsBounds: (box) => box.intersectsBox(boundingBox),\n intersectsTriangle: (tri) => {\n const triPoint = this.tempVector;\n const capsulePoint = this.tempVector2;\n const distance = tri.closestPointToSegment(tempSegment, triPoint, capsulePoint);\n if (distance < radius) {\n const depth = radius - distance;\n collisionPosition = new Vector3().copy(capsulePoint);\n const direction = capsulePoint.sub(triPoint).normalize();\n tempSegment.start.addScaledVector(direction, depth);\n tempSegment.end.addScaledVector(direction, depth);\n }\n },\n });\n return collisionPosition;\n }\n\n public applyColliders(tempSegment: Line3, radius: number, boundingBox: Box3) {\n let collidedElements: Map<\n Object3D,\n {\n position: { x: number; y: number; z: number };\n }\n > | null = null;\n for (const meshState of this.collisionMeshState.values()) {\n const collisionPosition = this.applyCollider(tempSegment, radius, boundingBox, meshState);\n if (collisionPosition) {\n if (collidedElements === null) {\n collidedElements = new Map();\n }\n const relativePosition = getRelativePositionAndRotationRelativeToObject(\n {\n position: collisionPosition,\n rotation: new Euler(),\n },\n meshState.source,\n );\n collidedElements.set(meshState.source, {\n position: relativePosition.position,\n });\n }\n }\n\n this.collisionTrigger.setCurrentCollisions(collidedElements);\n }\n}\n"],
|
5
|
-
"mappings": "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",
|
6
|
-
"names": ["Vector3", "Vector3", "Color", "Vector3", "AnimationClip", "Object3D", "AnimationState", "Object3D", "AnimationClip", "Vector3", "Vector3", "Color", "Vector3", "Vector3", "AnimationMixer", "
|
3
|
+
"sources": ["../src/camera/CameraManager.ts", "../src/helpers/math-helpers.ts", "../src/rendering/tweakPaneActivity.ts", "../src/character/Character.ts", "../src/character/CharacterModel.ts", "../src/character/CharacterMaterial.ts", "../src/rendering/shaders/bayer-dither.ts", "../src/rendering/shaders/shader-helpers.ts", "../src/character/CharacterState.ts", "../src/character/ModelLoader.ts", "../src/character/LocalController.ts", "../src/character/CharacterManager.ts", "../src/character/RemoteController.ts", "../src/input/KeyInputManager.ts", "../src/mml/MMLCompositionScene.ts", "../src/rendering/composer.ts", "../src/rendering/composerSettings.ts", "../src/rendering/post-effects/gauss-grain.ts", "../src/rendering/shaders/vertex-shader.ts", "../src/time/TimeManager.ts", "../src/collisions/CollisionsManager.ts"],
|
4
|
+
"sourcesContent": ["import { PerspectiveCamera, Vector3 } from \"three\";\n\nimport { ease, remap, clamp } from \"../helpers/math-helpers\";\nimport { getTweakpaneActive } from \"../rendering/tweakPaneActivity\";\n\nexport class CameraManager {\n public readonly camera: PerspectiveCamera;\n\n public initialDistance: number = 2.5;\n\n private minDistance: number = 0.1;\n private maxDistance: number = 6;\n\n private initialFOV: number = 80;\n private fov: number = this.initialFOV;\n private minFOV: number = 65;\n private maxFOV: number = 85;\n private targetFOV: number = this.initialFOV;\n\n private minPolarAngle: number = Math.PI * 0.25;\n private maxPolarAngle: number = Math.PI * 0.95;\n\n private dampingFactor: number = 0.091;\n\n private targetDistance: number = this.initialDistance;\n private distance: number = this.initialDistance;\n\n private targetPhi: number | null = Math.PI / 2;\n private phi: number | null = Math.PI / 2;\n private targetTheta: number | null = -Math.PI / 2;\n private theta: number | null = -Math.PI / 2;\n private dragging: boolean = false;\n private target: Vector3 = new Vector3(0, 1.55, 0);\n private hadTarget: boolean = false;\n\n constructor() {\n this.camera = new PerspectiveCamera(\n this.fov,\n window.innerWidth / window.innerHeight,\n 0.1,\n 2000,\n );\n this.camera.position.set(0, 1.4, -this.initialDistance);\n\n document.addEventListener(\"mousedown\", this.onMouseDown.bind(this));\n document.addEventListener(\"mouseup\", this.onMouseUp.bind(this));\n document.addEventListener(\"mousemove\", this.onMouseMove.bind(this));\n document.addEventListener(\"wheel\", this.onMouseWheel.bind(this));\n window.addEventListener(\"resize\", this.onResize.bind(this));\n }\n\n private onResize(): void {\n const width = window.innerWidth;\n const height = window.innerHeight;\n this.camera.aspect = width / height;\n this.camera.updateProjectionMatrix();\n }\n\n private onMouseDown(_event: MouseEvent): void {\n this.dragging = true;\n }\n\n private onMouseUp(_event: MouseEvent): void {\n this.dragging = false;\n }\n\n private onMouseMove(event: MouseEvent): void {\n if (!this.dragging || getTweakpaneActive() === true) return;\n if (this.targetTheta === null || this.targetPhi === null) return;\n this.targetTheta += event.movementX * 0.01;\n this.targetPhi -= event.movementY * 0.01;\n this.targetPhi = Math.max(this.minPolarAngle, Math.min(this.maxPolarAngle, this.targetPhi));\n }\n\n private onMouseWheel(event: WheelEvent): void {\n const scrollAmount = event.deltaY * 0.001;\n this.targetDistance += scrollAmount;\n this.targetDistance = Math.max(\n this.minDistance,\n Math.min(this.maxDistance, this.targetDistance),\n );\n }\n\n public setTarget(target: THREE.Vector3): void {\n this.target.copy(target);\n if (!this.hadTarget) {\n this.hadTarget = true;\n this.reverseUpdateFromPositions();\n }\n }\n\n private reverseUpdateFromPositions(): void {\n if (this.phi === null || this.theta == null) return;\n const dx = this.camera.position.x - this.target.x;\n const dy = this.camera.position.y - this.target.y;\n const dz = this.camera.position.z - this.target.z;\n this.targetDistance = Math.sqrt(dx * dx + dy * dy + dz * dz);\n this.targetTheta = (this.theta + 2 * Math.PI) % (2 * Math.PI);\n this.targetPhi = Math.max(0, Math.min(Math.PI, this.phi));\n this.phi = this.targetPhi;\n this.theta = this.targetTheta;\n this.distance = this.targetDistance;\n }\n\n public update(): void {\n if (this.target === null) return;\n if (\n this.phi !== null &&\n this.targetPhi !== null &&\n this.theta !== null &&\n this.targetTheta !== null\n ) {\n this.distance += (this.targetDistance - this.distance) * this.dampingFactor * 0.21;\n this.phi += (this.targetPhi - this.phi) * this.dampingFactor;\n this.theta += (this.targetTheta - this.theta) * this.dampingFactor;\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.targetFOV = remap(\n this.targetDistance,\n this.minDistance,\n this.maxDistance,\n this.minFOV,\n this.maxFOV,\n );\n\n this.fov += ease(this.targetFOV, this.fov, 0.07);\n this.camera.fov = this.fov;\n this.camera.updateProjectionMatrix();\n\n this.camera.position.set(x, clamp(y, 0.1, Infinity), z);\n this.camera.lookAt(this.target);\n }\n }\n}\n", "import { Vector3 } from \"three\";\n\nexport const getSpawnPositionInsideCircle = (\n radius: number,\n positions: number,\n id: number,\n yPos: number = 0,\n): Vector3 => {\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 Vector3(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", "let isTweakpaneActive = false;\n\nexport function setTweakpaneActive(status: boolean) {\n isTweakpaneActive = status;\n}\n\nexport function getTweakpaneActive() {\n return isTweakpaneActive;\n}\n", "import { Color, Vector3 } from \"three\";\n\nimport { CameraManager } from \"../camera/CameraManager\";\nimport { CollisionsManager } from \"../collisions/CollisionsManager\";\nimport { KeyInputManager } from \"../input/KeyInputManager\";\nimport { TimeManager } from \"../time/TimeManager\";\n\nimport { CharacterModel } from \"./CharacterModel\";\nimport { LocalController } from \"./LocalController\";\n\nexport type CharacterDescription = {\n meshFileUrl: string;\n idleAnimationFileUrl: string;\n jogAnimationFileUrl: string;\n sprintAnimationFileUrl: string;\n airAnimationFileUrl: string;\n modelScale: number;\n};\n\nexport class Character {\n public controller: LocalController | null = null;\n\n public name: string | null = null;\n public model: CharacterModel | null = null;\n public color: Color = new Color();\n\n public position: Vector3 = new Vector3();\n\n constructor(\n private readonly characterDescription: CharacterDescription,\n private readonly id: number,\n private readonly isLocal: boolean,\n private readonly modelLoadedCallback: () => void,\n private readonly collisionsManager: CollisionsManager,\n private readonly keyInputManager: KeyInputManager,\n private readonly cameraManager: CameraManager,\n private readonly timeManager: TimeManager,\n ) {\n this.load();\n }\n\n private async load(): Promise<void> {\n this.model = new CharacterModel(this.characterDescription);\n await this.model.init();\n this.color = this.model.material.colorsCube216[this.id];\n if (this.isLocal) {\n this.controller = new LocalController(\n this.model,\n this.id,\n this.collisionsManager,\n this.keyInputManager,\n this.cameraManager,\n this.timeManager,\n );\n }\n this.modelLoadedCallback();\n }\n\n public update(time: number) {\n if (!this.model) return;\n this.model.mesh!.getWorldPosition(this.position);\n if (typeof this.model.material.uniforms.time !== \"undefined\") {\n this.model.material.uniforms.time.value = time;\n this.model.material.uniforms.diffuseRandomColor.value = this.color;\n }\n }\n}\n", "import {\n AnimationAction,\n AnimationClip,\n AnimationMixer,\n LoopRepeat,\n Mesh,\n MeshStandardMaterial,\n Object3D,\n} from \"three\";\n\nimport { CharacterDescription } from \"./Character\";\nimport { CharacterMaterial } from \"./CharacterMaterial\";\nimport { AnimationState } from \"./CharacterState\";\nimport MODEL_LOADER from \"./ModelLoader\";\n\nexport class CharacterModel {\n /* TODO: pick between below eager instantiation or ModelLoader.getInstance() lazy one */\n private modelLoader = MODEL_LOADER;\n\n public mesh: Object3D | null = null;\n public material: CharacterMaterial = new CharacterMaterial();\n\n public animations: Record<string, AnimationAction> = {};\n public animationMixer: AnimationMixer | null = null;\n public currentAnimation: AnimationState = AnimationState.idle;\n\n constructor(private readonly characterDescription: CharacterDescription) {}\n\n public async init(): Promise<void> {\n await this.loadMainMesh();\n await this.setAnimationFromFile(\n this.characterDescription.idleAnimationFileUrl,\n AnimationState.idle,\n );\n await this.setAnimationFromFile(\n this.characterDescription.jogAnimationFileUrl,\n AnimationState.walking,\n );\n await this.setAnimationFromFile(\n this.characterDescription.sprintAnimationFileUrl,\n AnimationState.running,\n );\n await this.setAnimationFromFile(\n this.characterDescription.airAnimationFileUrl,\n AnimationState.air,\n );\n this.applyMaterialToAllSkinnedMeshes(this.material);\n }\n\n public updateAnimation(targetAnimation: AnimationState, deltaTime: number) {\n if (this.currentAnimation !== targetAnimation) {\n this.transitionToAnimation(targetAnimation);\n }\n this.animationMixer?.update(deltaTime);\n }\n\n public hideMaterialByMeshName(meshName: any): void {\n if (!this.mesh) return;\n this.mesh.traverse((child: Object3D) => {\n if (child.type === \"SkinnedMesh\" && child.name === meshName) {\n (child as Mesh).material = new MeshStandardMaterial({\n color: 0xff0000,\n transparent: true,\n opacity: 0,\n });\n }\n });\n }\n\n private setShadows(\n mesh: Object3D,\n castShadow: boolean = true,\n receiveShadow: boolean = true,\n ): void {\n mesh.traverse((child: Object3D) => {\n if (child.type === \"SkinnedMesh\") {\n child.castShadow = castShadow;\n child.receiveShadow = receiveShadow;\n }\n });\n }\n\n private applyMaterialToAllSkinnedMeshes(material: any): void {\n if (!this.mesh) return;\n this.mesh.traverse((child: Object3D) => {\n if (child.type === \"SkinnedMesh\") {\n (child as Mesh).material = material;\n }\n });\n }\n\n private initAnimationMixer() {\n if (this.animationMixer !== null || this.mesh === null) return;\n this.animationMixer = new AnimationMixer(this.mesh);\n }\n\n private async loadMainMesh(): Promise<void> {\n const mainMeshUrl = this.characterDescription.meshFileUrl;\n const scale = this.characterDescription.modelScale;\n const extension = mainMeshUrl.split(\".\").pop();\n const name = mainMeshUrl.split(\"/\").pop()!.replace(`.${extension}`, \"\");\n const mainMesh = await this.modelLoader.load(mainMeshUrl, \"model\");\n if (typeof mainMesh !== \"undefined\") {\n this.mesh = new Object3D();\n const model = mainMesh as Object3D;\n model.position.set(0, -0.4, 0);\n this.mesh.add(model);\n this.mesh.name = name;\n this.mesh.scale.set(scale, scale, scale);\n this.setShadows(this.mesh);\n }\n }\n\n private async setAnimationFromFile(\n animationFileUrl: string,\n animationType: AnimationState,\n ): Promise<void> {\n return new Promise(async (resolve, reject) => {\n this.initAnimationMixer();\n const animation = await this.modelLoader.load(animationFileUrl, \"animation\");\n if (typeof animation !== \"undefined\" && animation instanceof AnimationClip) {\n this.animations[animationType] = this.animationMixer!.clipAction(animation);\n this.animations[animationType].stop();\n if (animationType === AnimationState.idle) {\n this.animations[animationType].play();\n }\n resolve();\n } else {\n reject(`failed to load ${animationType} from ${animationFileUrl}`);\n }\n });\n }\n\n private transitionToAnimation(\n targetAnimation: AnimationState,\n transitionDuration: number = 0.15,\n ): void {\n if (!this.mesh || this.currentAnimation === null) return;\n\n const currentAction = this.animations[this.currentAnimation];\n const targetAction = this.animations[targetAnimation];\n\n if (!targetAction) return;\n\n if (currentAction) {\n currentAction.enabled = true;\n currentAction.fadeOut(transitionDuration);\n }\n\n if (!targetAction.isRunning()) targetAction.play();\n\n targetAction.setLoop(LoopRepeat, Infinity);\n targetAction.enabled = true;\n targetAction.fadeIn(transitionDuration);\n\n this.currentAnimation = targetAnimation;\n }\n}\n", "import { Color, MeshPhysicalMaterial, UniformsUtils } from \"three\";\n\nimport { bayerDither } from \"../rendering/shaders/bayer-dither\";\nimport {\n injectBefore,\n injectBeforeMain,\n injectInsideMain,\n} from \"../rendering/shaders/shader-helpers\";\n\ntype TUniform<TValue = any> = { value: TValue };\n\nexport class CharacterMaterial extends MeshPhysicalMaterial {\n public uniforms: Record<string, TUniform> = {};\n public colorsCube216: Color[] = [];\n\n constructor() {\n super();\n this.color = new Color(0xffffff);\n this.transmission = 0.5;\n this.metalness = 0.9;\n this.roughness = 0.1;\n this.ior = 1.2;\n this.thickness = 0.1;\n this.specularColor = new Color(0x0077ff);\n this.specularIntensity = 0.1;\n this.emissive = new Color(0xffffff);\n this.emissiveIntensity = 0.1;\n this.envMapIntensity = 1.8;\n this.sheenColor = new Color(0xffffff);\n this.sheen = 0.5;\n\n this.onBeforeCompile = (shader) => {\n this.uniforms = UniformsUtils.clone(shader.uniforms);\n this.uniforms.nearClip = { value: 0.01 };\n this.uniforms.farClip = { value: 1000.0 };\n this.uniforms.ditheringNear = { value: 0.25 };\n this.uniforms.ditheringRange = { value: 0.5 };\n this.uniforms.time = { value: 0.0 };\n this.uniforms.diffuseRandomColor = { value: new Color() };\n shader.uniforms = this.uniforms;\n\n shader.vertexShader = injectBeforeMain(shader.vertexShader, \"varying vec2 vUv;\");\n shader.vertexShader = injectInsideMain(shader.vertexShader, \"vUv = uv;\");\n\n shader.fragmentShader = injectBeforeMain(\n shader.fragmentShader,\n /* glsl */ `\n //#define showPattern\n varying vec2 vUv;\n uniform float nearClip;\n uniform float farClip;\n uniform float ditheringNear;\n uniform float ditheringRange;\n uniform float time;\n uniform vec3 diffuseRandomColor;\n ${bayerDither}\n\n #ifdef showPattern\n vec2 rand2(vec2 p) {\n return fract(vec2(sin(p.x * 591.32 + p.y * 154.077), cos(p.x * 391.32 + p.y * 49.077)));\n }\n float voronoi(in vec2 x) {\n vec2 p = floor(x);\n vec2 f = fract(x);\n float minDistance = 1.0;\n for(int j = -1; j <= 1; j ++)\n for(int i = -1; i <= 1; i ++) {\n vec2 b = vec2(i, j);\n vec2 rand = 0.5 + 0.5 * sin(time * 1.5 + 12.0 * rand2(p + b));\n vec2 r = vec2(b) - f + rand;\n minDistance = min(minDistance, length(r));\n }\n return minDistance;\n }\n #endif\n `,\n );\n\n shader.fragmentShader = injectBefore(\n shader.fragmentShader,\n \"#include <output_fragment>\",\n /* glsl */ `\n float distance = length(vWorldPosition - cameraPosition);\n float normalizedDistance = (distance - nearClip) / (farClip - nearClip);\n ivec2 p = ivec2(mod(gl_FragCoord.xy, 8.0));\n float d = 0.0;\n if (p.x <= 3 && p.y <= 3) {\n d = bayerDither(bayertl, p);\n } else if (p.x > 3 && p.y <= 3) {\n d = bayerDither(bayertr, p - ivec2(4, 0));\n } else if (p.x <= 3 && p.y > 3) {\n d = bayerDither(bayerbl, p - ivec2(0, 4));\n } else if (p.x > 3 && p.y > 3) {\n d = bayerDither(bayerbr, p - ivec2(4, 4));\n }\n if (distance <= ditheringNear + d * ditheringRange) discard;\n\n vec2 uv = vUv;\n float s = clamp(0.35 + 0.35 * sin(5.0 * -time + vUv.y * 600.0), 0.0, 1.0);\n float scanLines = pow(s, 1.33);\n\n outgoingLight *= diffuseRandomColor;\n\n #ifdef showPattern\n float val = pow(voronoi(uv * 8.0) * 1.2, 0.5);\n float thickness = 1.0 / 500.0;\n vec2 g = step(mod(uv, 0.015), vec2(thickness));\n float a = 1.0 - clamp(val * (g.x + g.y), 0.0, 1.0);\n vec3 grid = vec3(smoothstep(0.01, 0.0, a) * 1.15) * diffuseRandomColor;\n outgoingLight += grid;\n #endif\n\n outgoingLight += smoothstep(0.1, 0.0, scanLines) * 0.1;\n `,\n );\n };\n\n this.generateColorCube();\n }\n\n private generateColorCube() {\n const saturation = 0.4;\n const lightness = 0.7;\n const goldenRatioConjugate = 0.618033988749895;\n let hue = 0;\n\n for (let i = 0; i < 216; i++) {\n const color = new Color();\n color.setHSL(hue, saturation, lightness);\n this.colorsCube216.push(color);\n hue = (hue + goldenRatioConjugate) % 1;\n }\n }\n}\n", "export const bayerDither: string = /* glsl */ `\nconst mat4 bayertl = mat4( \n 0.0 / 64.0, 32.0 / 64.0, 8.0 / 64.0, 40.0 / 64.0,\n 48.0 / 64.0, 16.0 / 64.0, 56.0 / 64.0, 24.0 / 64.0,\n 12.0 / 64.0, 44.0 / 64.0, 4.0 / 64.0, 36.0 / 64.0,\n 60.0 / 64.0, 28.0 / 64.0, 52.0 / 64.0, 20.0 / 64.0\n);\n\nconst mat4 bayertr = mat4( \n 2.0 / 64.0, 34.0 / 64.0, 10.0 / 64.0, 42.0 / 64.0,\n 50.0 / 64.0, 18.0 / 64.0, 58.0 / 64.0, 26.0 / 64.0,\n 14.0 / 64.0, 46.0 / 64.0, 6.0 / 64.0, 38.0 / 64.0,\n 62.0 / 64.0, 30.0 / 64.0, 54.0 / 64.0, 22.0 / 64.0\n);\n\nconst mat4 bayerbl = mat4( \n 3.0 / 64.0, 35.0 / 64.0, 11.0 / 64.0, 43.0 / 64.0,\n 51.0 / 64.0, 19.0 / 64.0, 59.0 / 64.0, 27.0 / 64.0,\n 15.0 / 64.0, 47.0 / 64.0, 7.0 / 64.0, 39.0 / 64.0,\n 63.0 / 64.0, 31.0 / 64.0, 55.0 / 64.0, 23.0 / 64.0\n);\n\nconst mat4 bayerbr = mat4( \n 1.0 / 64.0, 33.0 / 64.0, 9.0 / 64.0, 41.0 / 64.0,\n 49.0 / 64.0, 17.0 / 64.0, 57.0 / 64.0, 25.0 / 64.0,\n 13.0 / 64.0, 45.0 / 64.0, 5.0 / 64.0, 37.0 / 64.0,\n 61.0 / 64.0, 29.0 / 64.0, 53.0 / 64.0, 21.0 / 64.0\n);\n\nfloat bayerDither(mat4 m, ivec2 p) {\n if (p.y == 0) {\n if (p.x == 0) { return m[0][0]; }\n else if (p.x == 1) { return m[1][0]; }\n else if (p.x == 2) { return m[2][0]; }\n else { return m[3][0]; }\n } else if (p.y == 1) {\n if (p.x == 0) { return m[0][1]; }\n else if (p.x == 1) { return m[1][1]; }\n else if (p.x == 2) { return m[2][1]; }\n else { return m[3][1]; }\n } else if (p.y == 2) {\n if (p.x == 0) { return m[0][1]; }\n else if (p.x == 1) { return m[1][2]; }\n else if (p.x == 2) { return m[2][2]; }\n else { return m[3][2]; }\n } else {\n if (p.x == 0) { return m[0][3]; }\n else if (p.x == 1) { return m[1][3]; }\n else if (p.x == 2) { return m[2][3]; }\n else { return m[3][3]; }\n }\n}\n`;\n", "export function injectBeforeMain(shaderSource: string, codeToInject: string): string {\n return shaderSource.replace(\n \"void main() {\",\n `\n\n${codeToInject}\n\nvoid main() {`,\n );\n}\n\nexport function injectInsideMain(shaderSource: string, codeToInject: string): string {\n return shaderSource.replace(\n \"void main() {\",\n `void main() {\n\n${codeToInject}\n\n `,\n );\n}\n\nexport function injectBefore(shaderSource: string, before: string, codeToInject: string): string {\n return shaderSource.replace(\n before,\n `\n${codeToInject}\n\n${before}\n `,\n );\n}\n\nexport function injectAfter(shaderSource: string, after: string, codeToInject: string): string {\n return shaderSource.replace(\n after,\n `\n${after}\n\n${codeToInject}\n\n `,\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}\n\nexport type CharacterState = {\n id: number;\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 { AnimationClip, LoadingManager, Object3D } from \"three\";\nimport { GLTF, GLTFLoader as ThreeGLTFLoader } from \"three/examples/jsm/loaders/GLTFLoader.js\";\n\nclass CachedGLTFLoader extends ThreeGLTFLoader {\n private blobCache: Map<string, string>;\n\n constructor(manager?: LoadingManager) {\n super(manager);\n this.blobCache = new Map();\n }\n\n setBlobUrl(originalUrl: string, blobUrl: string) {\n this.blobCache.set(originalUrl, blobUrl);\n }\n\n getBlobUrl(originalUrl: string): string | undefined {\n return this.blobCache.get(originalUrl);\n }\n\n load(\n url: string,\n onLoad: (gltf: GLTF) => void,\n onProgress?: ((event: ProgressEvent<EventTarget>) => void) | undefined,\n onError?: ((event: ErrorEvent) => void) | undefined,\n ): void {\n const blobUrl = this.getBlobUrl(url);\n if (blobUrl) {\n console.log(`Loading cached ${url.split(\"/\").pop()}`);\n super.load(blobUrl, onLoad, onProgress, onError);\n } else {\n super.load(url, onLoad, onProgress, onError);\n }\n }\n}\n\nclass LRUCache<K, V> {\n private maxSize: number;\n private cache: Map<K, V>;\n\n constructor(maxSize: number = 100) {\n this.maxSize = maxSize;\n this.cache = new Map();\n }\n\n get(key: K): V | undefined {\n const item = this.cache.get(key);\n if (item) {\n this.cache.delete(key);\n this.cache.set(key, item);\n }\n return item;\n }\n\n set(key: K, value: V): void {\n if (this.cache.size >= this.maxSize) {\n const oldestKey = this.cache.keys().next().value;\n this.cache.delete(oldestKey);\n }\n this.cache.set(key, value);\n }\n}\n\ninterface CachedModel {\n blob: Blob;\n originalExtension: string;\n}\n\nexport class ModelLoader {\n private static instance: ModelLoader | null = null;\n\n private readonly loadingManager: LoadingManager;\n private readonly gltfLoader: CachedGLTFLoader;\n private modelCache: LRUCache<string, CachedModel>;\n private ongoingLoads: Map<string, Promise<Object3D | AnimationClip | undefined>> = new Map();\n\n constructor(maxCacheSize: number = 100) {\n this.loadingManager = new LoadingManager();\n this.gltfLoader = new CachedGLTFLoader(this.loadingManager);\n this.modelCache = new LRUCache(maxCacheSize);\n }\n\n /* TODO: decide between below lazy initialization or eager on this file's bottom export */\n static getInstance(): ModelLoader {\n if (!ModelLoader.instance) {\n ModelLoader.instance = new ModelLoader();\n }\n return ModelLoader.instance;\n }\n\n async load(\n fileUrl: string,\n fileType: \"model\" | \"animation\",\n ): Promise<Object3D | AnimationClip | undefined> {\n const cachedModel = this.modelCache.get(fileUrl);\n\n if (cachedModel) {\n const blobURL = URL.createObjectURL(cachedModel.blob);\n this.gltfLoader.setBlobUrl(fileUrl, blobURL);\n return this.loadFromUrl(fileUrl, fileType, cachedModel.originalExtension);\n } else {\n console.log(`Loading ${fileUrl} from server`);\n const ongoingLoad = this.ongoingLoads.get(fileUrl);\n if (ongoingLoad) return ongoingLoad;\n\n const loadPromise = fetch(fileUrl)\n .then((response) => response.blob())\n .then((blob) => {\n const originalExtension = fileUrl.split(\".\").pop() || \"\";\n this.modelCache.set(fileUrl, { blob, originalExtension });\n const blobURL = URL.createObjectURL(blob);\n this.ongoingLoads.delete(fileUrl);\n return this.loadFromUrl(blobURL, fileType, originalExtension);\n });\n\n this.ongoingLoads.set(fileUrl, loadPromise);\n return loadPromise;\n }\n }\n\n private async loadFromUrl(\n url: string,\n fileType: \"model\" | \"animation\",\n extension: string,\n ): Promise<Object3D | AnimationClip | undefined> {\n if ([\"gltf\", \"glb\"].includes(extension)) {\n return new Promise((resolve, reject) => {\n this.gltfLoader.load(\n url,\n (object: GLTF) => {\n if (fileType === \"model\") {\n resolve(object.scene as Object3D);\n } else if (fileType === \"animation\") {\n resolve(object.animations[0] as AnimationClip);\n } else {\n const error = `Trying to load unknown ${fileType} type of element from file ${url}`;\n console.error(error);\n reject(error);\n }\n },\n undefined,\n (error) => {\n console.error(`Error loading GL(B|TF) from ${url}: ${error}`);\n reject(error);\n },\n );\n });\n } else {\n console.error(`Error: can't recognize ${url} extension: ${extension}`);\n }\n }\n}\n\n/* TODO: decide between below eager initialization or static getInstance() lazy one */\nconst MODEL_LOADER = ModelLoader.getInstance();\nexport default MODEL_LOADER;\n", "import { Box3, Line3, Matrix4, PerspectiveCamera, Quaternion, Raycaster, Vector3 } from \"three\";\n\nimport { CameraManager } from \"../camera/CameraManager\";\nimport { CollisionsManager } from \"../collisions/CollisionsManager\";\nimport { ease } from \"../helpers/math-helpers\";\nimport { KeyInputManager } from \"../input/KeyInputManager\";\nimport { TimeManager } from \"../time/TimeManager\";\n\nimport { CharacterModel } from \"./CharacterModel\";\nimport { AnimationState, CharacterState } from \"./CharacterState\";\n\nexport class LocalController {\n private collisionDetectionSteps = 15;\n\n public capsuleInfo = {\n radius: 0.4,\n segment: new Line3(new Vector3(), new Vector3(0, 1.05, 0)),\n };\n\n private maxWalkSpeed = 6;\n private maxRunSpeed = 8.5;\n private gravity: number = -42;\n private jumpForce: number = 16;\n private coyoteTimeThreshold: number = 290;\n\n private coyoteTime: boolean = false;\n private canJump: boolean = true;\n private characterOnGround: boolean = false;\n private characterWasOnGround: boolean = false;\n private characterAirborneSince: number = 0;\n private currentHeight: number = 0;\n\n private characterVelocity: Vector3 = new Vector3();\n private vectorUp: Vector3 = new Vector3(0, 1, 0);\n private vectorDown: Vector3 = new Vector3(0, -1, 0);\n\n private rotationOffset: number = 0;\n private azimuthalAngle: number = 0;\n\n private tempBox: Box3 = new Box3();\n private tempMatrix: Matrix4 = new Matrix4();\n private tempSegment: Line3 = new Line3();\n private tempVector: Vector3 = new Vector3();\n private tempVector2: Vector3 = new Vector3();\n private rayCaster: Raycaster = new Raycaster();\n\n private forward: boolean;\n private backward: boolean;\n private left: boolean;\n private right: boolean;\n private run: boolean;\n private jump: boolean;\n private anyDirection: boolean;\n private conflictingDirections: boolean;\n\n private thirdPersonCamera: PerspectiveCamera | null = null;\n\n private speed: number = 0;\n private targetSpeed: number = 0;\n\n public networkState: CharacterState = {\n id: 0,\n position: { x: 0, y: 0, z: 0 },\n rotation: { quaternionY: 0, quaternionW: 0 },\n state: AnimationState.idle,\n };\n\n constructor(\n private readonly model: CharacterModel,\n private readonly id: number,\n private readonly collisionsManager: CollisionsManager,\n private readonly keyInputManager: KeyInputManager,\n private readonly cameraManager: CameraManager,\n private readonly timeManager: TimeManager,\n ) {\n setInterval(() => this.update.bind(this), 3000);\n }\n\n public update(): void {\n if (!this.model?.mesh || !this.model?.animationMixer) return;\n if (!this.thirdPersonCamera) this.thirdPersonCamera = this.cameraManager.camera;\n\n const { forward, backward, left, right, run, jump, anyDirection, conflictingDirection } =\n this.keyInputManager;\n\n this.forward = forward;\n this.backward = backward;\n this.left = left;\n this.right = right;\n this.run = run;\n this.jump = jump;\n this.anyDirection = anyDirection;\n this.conflictingDirections = conflictingDirection;\n\n this.targetSpeed = this.run ? this.maxRunSpeed : this.maxWalkSpeed;\n this.speed += ease(this.targetSpeed, this.speed, 0.07);\n\n this.rayCaster.set(this.model.mesh.position, this.vectorDown);\n const hit = this.rayCaster.intersectObjects([this.collisionsManager.colliders]);\n if (hit.length > 0) this.currentHeight = hit[0].distance;\n\n if (anyDirection || !this.characterOnGround) {\n const targetAnimation = this.getTargetAnimation();\n this.model.updateAnimation(targetAnimation, this.timeManager.deltaTime);\n } else {\n this.model.updateAnimation(AnimationState.idle, this.timeManager.deltaTime);\n }\n\n if (this.anyDirection) this.updateRotation();\n\n for (let i = 0; i < this.collisionDetectionSteps; i++) {\n this.updatePosition(this.timeManager.deltaTime / this.collisionDetectionSteps, i);\n }\n\n if (this.model.mesh.position.y < 0) this.resetPosition();\n this.updateNetworkState();\n }\n\n private getTargetAnimation(): AnimationState {\n if (!this.model.mesh) return AnimationState.idle;\n\n if (this.conflictingDirections) return AnimationState.idle;\n const jumpHeight = this.characterVelocity.y > 0 ? 0.2 : 1.8;\n if (this.currentHeight > jumpHeight && !this.characterOnGround) {\n return AnimationState.air;\n }\n return this.run && this.anyDirection\n ? AnimationState.running\n : this.anyDirection\n ? AnimationState.walking\n : AnimationState.idle;\n }\n\n private updateRotationOffset(): void {\n if (this.conflictingDirections) return;\n if (this.forward) {\n this.rotationOffset = Math.PI;\n if (this.left) this.rotationOffset = Math.PI + Math.PI / 4;\n if (this.right) this.rotationOffset = Math.PI - Math.PI / 4;\n } else if (this.backward) {\n this.rotationOffset = Math.PI * 2;\n if (this.left) this.rotationOffset = -Math.PI * 2 - Math.PI / 4;\n if (this.right) this.rotationOffset = Math.PI * 2 + Math.PI / 4;\n } else if (this.left) {\n this.rotationOffset = Math.PI * -0.5;\n } else if (this.right) {\n this.rotationOffset = Math.PI * 0.5;\n }\n }\n\n private updateAzimuthalAngle(): void {\n if (!this.thirdPersonCamera || !this.model?.mesh) return;\n this.azimuthalAngle = Math.atan2(\n this.thirdPersonCamera.position.x - this.model.mesh.position.x,\n this.thirdPersonCamera.position.z - this.model.mesh.position.z,\n );\n }\n\n private updateRotation(): void {\n if (!this.thirdPersonCamera || !this.model?.mesh) return;\n this.updateRotationOffset();\n this.updateAzimuthalAngle();\n const rotationQuaternion = new Quaternion();\n rotationQuaternion.setFromAxisAngle(this.vectorUp, this.azimuthalAngle + this.rotationOffset);\n this.model.mesh.quaternion.rotateTowards(rotationQuaternion, 0.07);\n }\n\n private addScaledVectorToCharacter(deltaTime: number) {\n if (!this.model?.mesh) return;\n this.model.mesh.position.addScaledVector(this.tempVector, this.speed * deltaTime);\n }\n\n private updatePosition(deltaTime: number, _iter: number): void {\n if (!this.model?.mesh) return;\n\n if (this.characterOnGround) {\n if (!this.jump) this.canJump = true;\n\n if (this.jump && this.canJump) {\n this.characterVelocity.y += this.jumpForce;\n this.canJump = false;\n } else {\n this.characterVelocity.y = deltaTime * this.gravity;\n }\n } else if (this.jump && this.coyoteTime) {\n console.log(\"coyoteJump\");\n this.characterVelocity.y = this.jumpForce;\n this.canJump = false;\n } else {\n this.characterVelocity.y += deltaTime * this.gravity;\n this.canJump = false;\n }\n\n this.model.mesh.position.addScaledVector(this.characterVelocity, deltaTime);\n\n this.tempVector.set(0, 0, 0);\n\n if (this.forward) {\n const forward = new Vector3(0, 0, -1).applyAxisAngle(this.vectorUp, this.azimuthalAngle);\n this.tempVector.add(forward);\n }\n\n if (this.backward) {\n const backward = new Vector3(0, 0, 1).applyAxisAngle(this.vectorUp, this.azimuthalAngle);\n this.tempVector.add(backward);\n }\n\n if (this.left) {\n const left = new Vector3(-1, 0, 0).applyAxisAngle(this.vectorUp, this.azimuthalAngle);\n this.tempVector.add(left);\n }\n\n if (this.right) {\n const right = new Vector3(1, 0, 0).applyAxisAngle(this.vectorUp, this.azimuthalAngle);\n this.tempVector.add(right);\n }\n\n if (this.tempVector.length() > 0) {\n this.tempVector.normalize();\n this.addScaledVectorToCharacter(deltaTime);\n }\n\n this.model.mesh.updateMatrixWorld();\n\n this.tempBox.makeEmpty();\n\n this.tempSegment.copy(this.capsuleInfo.segment!);\n this.tempSegment.start.applyMatrix4(this.model.mesh.matrixWorld).applyMatrix4(this.tempMatrix);\n this.tempSegment.end.applyMatrix4(this.model.mesh.matrixWorld).applyMatrix4(this.tempMatrix);\n\n this.tempBox.expandByPoint(this.tempSegment.start);\n this.tempBox.expandByPoint(this.tempSegment.end);\n\n this.tempBox.min.subScalar(this.capsuleInfo.radius!);\n this.tempBox.max.addScalar(this.capsuleInfo.radius!);\n\n this.collisionsManager.applyColliders(this.tempSegment, this.capsuleInfo.radius!, this.tempBox);\n\n const newPosition = this.tempVector;\n newPosition.copy(this.tempSegment.start);\n\n const deltaVector = this.tempVector2;\n deltaVector.subVectors(newPosition, this.model.mesh.position);\n\n const offset = Math.max(0.0, deltaVector.length() - 1e-5);\n deltaVector.normalize().multiplyScalar(offset);\n\n this.model.mesh.position.add(deltaVector);\n\n this.characterOnGround = deltaVector.y > Math.abs(deltaTime * this.characterVelocity.y * 0.25);\n\n if (this.characterWasOnGround && !this.characterOnGround) {\n this.characterAirborneSince = Date.now();\n }\n\n this.coyoteTime =\n this.characterVelocity.y < 0 &&\n this.characterOnGround === false &&\n Date.now() - this.characterAirborneSince < this.coyoteTimeThreshold;\n\n this.characterWasOnGround = this.characterOnGround;\n\n if (this.characterOnGround) {\n this.characterVelocity.set(0, 0, 0);\n } else {\n deltaVector.normalize();\n this.characterVelocity.addScaledVector(deltaVector, -deltaVector.dot(this.characterVelocity));\n }\n }\n\n private updateNetworkState(): void {\n if (!this.model?.mesh) return;\n const characterQuaternion = this.model.mesh.getWorldQuaternion(new Quaternion());\n const positionUpdate = new Vector3(\n this.model.mesh.position.x,\n this.model.mesh.position.y,\n this.model.mesh.position.z,\n );\n this.networkState = {\n id: this.id,\n position: positionUpdate,\n rotation: { quaternionY: characterQuaternion?.y, quaternionW: characterQuaternion?.w },\n state: this.model.currentAnimation as AnimationState,\n };\n }\n\n private resetPosition(): void {\n if (!this.model?.mesh) return;\n this.characterVelocity.y = 0;\n this.model.mesh.position.y = 3;\n this.characterOnGround = false;\n }\n}\n", "import { PositionAndRotation } from \"mml-web\";\nimport { Camera, Group, Object3D, PerspectiveCamera, Vector3 } from \"three\";\n\nimport { CameraManager } from \"../camera/CameraManager\";\nimport { CollisionsManager } from \"../collisions/CollisionsManager\";\nimport { getSpawnPositionInsideCircle } from \"../helpers/math-helpers\";\nimport { KeyInputManager } from \"../input/KeyInputManager\";\nimport { TimeManager } from \"../time/TimeManager\";\n\nimport { Character, CharacterDescription } from \"./Character\";\nimport { AnimationState, CharacterState } from \"./CharacterState\";\nimport { RemoteController } from \"./RemoteController\";\n\nfunction encodeCharacterAndCamera(character: Object3D, camera: PerspectiveCamera): string {\n return [\n ...character.position.toArray(),\n ...character.quaternion.toArray(),\n ...camera.position.toArray(),\n ...camera.quaternion.toArray(),\n ].join(\",\");\n}\n\nfunction decodeCharacterAndCamera(hash: string, character: Object3D, camera: Camera) {\n const values = hash.split(\",\").map(Number);\n character.position.fromArray(values.slice(0, 3));\n character.quaternion.fromArray(values.slice(3, 7));\n camera.position.fromArray(values.slice(7, 10));\n camera.quaternion.fromArray(values.slice(10, 14));\n}\n\nexport class CharacterManager {\n /*\n TODO - re-enable updating location hash when there is a solution that waits for models to load (currently if the \n character was standing on a model and the page is reloaded the character falls into the model before it loads and \n can be trapped).\n */\n private updateLocationHash = false;\n\n public loadingCharacters: Map<number, Promise<Character>> = new Map();\n\n public remoteCharacters: Map<number, Character> = new Map();\n public remoteCharacterControllers: Map<number, RemoteController> = new Map();\n\n private characterDescription: CharacterDescription | null = null;\n public character: Character | null = null;\n\n public readonly group: Group;\n\n constructor(\n private readonly collisionsManager: CollisionsManager,\n private readonly cameraManager: CameraManager,\n private readonly timeManager: TimeManager,\n private readonly inputManager: KeyInputManager,\n private readonly clientStates: Map<number, CharacterState>,\n private readonly sendUpdate: (update: CharacterState) => void,\n ) {\n this.group = new Group();\n setInterval(() => this.update.bind(this), 3000);\n }\n\n /* TODO: \n 1) Separate this method into spawnLocalCharacter and spawnRemoteCharacter\n 2) Make this synchronous to avoid having loadingCharacters and instead manage\n the mesh loading async (would allow us to show a nameplate where a remote\n user is before the asset loads).\n */\n public spawnCharacter(\n characterDescription: CharacterDescription,\n id: number,\n isLocal: boolean = false,\n spawnPosition: Vector3 = new Vector3(),\n ) {\n this.characterDescription = characterDescription;\n const characterLoadingPromise = new Promise<Character>((resolve) => {\n const character = new Character(\n characterDescription,\n id,\n isLocal,\n () => {\n if (window.location.hash && window.location.hash.length > 1) {\n decodeCharacterAndCamera(\n window.location.hash.substring(1),\n character.model!.mesh!,\n this.cameraManager.camera,\n );\n } else {\n spawnPosition = getSpawnPositionInsideCircle(3, 30, id, 0.4);\n character.model!.mesh!.position.set(spawnPosition.x, spawnPosition.y, spawnPosition.z);\n character.model!.mesh!.updateMatrixWorld();\n this.sendUpdate({\n id: id,\n position: {\n x: spawnPosition.x,\n y: spawnPosition.y,\n z: spawnPosition.z,\n },\n rotation: { quaternionY: 0, quaternionW: 0 },\n state: AnimationState.idle,\n });\n }\n character.model!.hideMaterialByMeshName(\"SK_Mannequin_2\");\n if (!isLocal) {\n character.model?.mesh?.position.set(spawnPosition.x, spawnPosition.y, spawnPosition.z);\n character.model?.mesh?.updateMatrixWorld();\n character.position.set(spawnPosition.x, spawnPosition.y, spawnPosition.z);\n }\n this.group.add(character.model!.mesh!);\n\n if (isLocal) {\n this.character = character;\n } else {\n this.remoteCharacters.set(id, character);\n const remoteController = new RemoteController(character, id);\n remoteController.setAnimationFromFile(\n AnimationState.idle,\n characterDescription.idleAnimationFileUrl,\n );\n remoteController.setAnimationFromFile(\n AnimationState.walking,\n characterDescription.jogAnimationFileUrl,\n );\n remoteController.setAnimationFromFile(\n AnimationState.running,\n characterDescription.sprintAnimationFileUrl,\n );\n remoteController.setAnimationFromFile(\n AnimationState.air,\n characterDescription.airAnimationFileUrl,\n );\n remoteController.characterModel?.position.set(\n spawnPosition.x,\n spawnPosition.y,\n spawnPosition.z,\n );\n this.remoteCharacterControllers.set(id, remoteController);\n }\n resolve(character);\n },\n this.collisionsManager,\n this.inputManager,\n this.cameraManager,\n this.timeManager,\n );\n });\n\n this.loadingCharacters.set(id, characterLoadingPromise);\n return characterLoadingPromise;\n }\n\n public getLocalCharacterPositionAndRotation(): PositionAndRotation {\n if (this.character && this.character.model && this.character.model.mesh) {\n return {\n position: this.character.model.mesh.position,\n rotation: this.character.model.mesh.rotation,\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 for (const [id, character] of this.remoteCharacters) {\n this.group.remove(character.model!.mesh!);\n this.remoteCharacters.delete(id);\n this.remoteCharacterControllers.delete(id);\n }\n if (this.character) {\n this.group.remove(this.character.model!.mesh!);\n this.character = null;\n }\n this.loadingCharacters.clear();\n }\n\n public update() {\n if (this.character) {\n this.character.update(this.timeManager.time);\n this.cameraManager.setTarget(this.character.position.add(new Vector3(0, 1.3, 0)));\n\n if (this.character.controller) {\n this.character.controller.update();\n if (this.timeManager.frame % 2 === 0) {\n this.sendUpdate(this.character.controller.networkState);\n }\n }\n\n for (const [id, update] of this.clientStates) {\n const { position } = update;\n if (!this.remoteCharacters.has(id) && !this.loadingCharacters.has(id)) {\n this.spawnCharacter(\n this.characterDescription!,\n id,\n false,\n new Vector3(position.x, position.y, position.z),\n ).then((_character) => {\n this.loadingCharacters.delete(id);\n });\n }\n\n const characterController = this.remoteCharacterControllers.get(id);\n if (characterController) {\n characterController.update(update, this.timeManager.time, this.timeManager.deltaTime);\n }\n }\n\n for (const [id, character] of this.remoteCharacters) {\n if (!this.clientStates.has(id)) {\n this.group.remove(character.model!.mesh!);\n this.remoteCharacters.delete(id);\n this.remoteCharacterControllers.delete(id);\n }\n }\n\n if (this.updateLocationHash && this.timeManager.frame % 60 === 0) {\n window.location.hash = encodeCharacterAndCamera(\n this.character.model!.mesh!,\n this.cameraManager.camera,\n );\n }\n }\n }\n}\n", "import {\n AnimationAction,\n AnimationClip,\n AnimationMixer,\n Object3D,\n Quaternion,\n Vector3,\n} from \"three\";\n\nimport { Character } from \"./Character\";\nimport { AnimationState, CharacterState } from \"./CharacterState\";\nimport MODEL_LOADER from \"./ModelLoader\";\n\nexport class RemoteController {\n private modelLoader = MODEL_LOADER;\n\n public characterModel: Object3D | null = null;\n\n private animationMixer: AnimationMixer = new AnimationMixer(new Object3D());\n private animations = new Map<AnimationState, AnimationAction>();\n public currentAnimation: AnimationState = AnimationState.idle;\n\n public networkState: CharacterState = {\n id: 0,\n position: { x: 0, y: 0, z: 0 },\n rotation: { quaternionY: 0, quaternionW: 0 },\n state: this.currentAnimation as AnimationState,\n };\n\n constructor(public readonly character: Character, public readonly id: number) {\n this.characterModel = this.character.model!.mesh!;\n this.characterModel.updateMatrixWorld();\n this.animationMixer = new AnimationMixer(this.characterModel);\n }\n\n public update(clientUpdate: CharacterState, time: number, deltaTime: number): void {\n if (!this.character) return;\n this.character.update(time);\n this.updateFromNetwork(clientUpdate);\n this.animationMixer.update(deltaTime);\n }\n\n public async setAnimationFromFile(\n animationType: AnimationState,\n fileName: string,\n ): Promise<void> {\n const animation = await this.modelLoader.load(fileName, \"animation\");\n const animationAction = this.animationMixer.clipAction(animation as AnimationClip);\n this.animations.set(animationType, animationAction);\n if (animationType === AnimationState.idle) {\n animationAction.play();\n }\n }\n\n private transitionToAnimation(\n targetAnimation: AnimationState,\n transitionDuration: number = 0.15,\n ): void {\n if (this.currentAnimation === targetAnimation) return;\n\n const currentAction = this.animations.get(this.currentAnimation);\n const targetAction = this.animations.get(targetAnimation);\n\n if (!targetAction) return;\n\n if (currentAction) {\n currentAction.enabled = true;\n targetAction\n .reset()\n .setEffectiveTimeScale(1)\n .setEffectiveWeight(1)\n .fadeIn(transitionDuration)\n .play();\n currentAction.crossFadeTo(targetAction, transitionDuration, true);\n } else {\n targetAction.play();\n }\n\n this.currentAnimation = targetAnimation;\n }\n\n private updateFromNetwork(clientUpdate: CharacterState): void {\n if (!this.characterModel) return;\n const { position, rotation, state } = clientUpdate;\n this.characterModel.position.lerp(new Vector3(position.x, position.y, position.z), 0.15);\n const rotationQuaternion = new Quaternion(0, rotation.quaternionY, 0, rotation.quaternionW);\n this.characterModel.quaternion.slerp(rotationQuaternion, 0.6);\n if (state !== this.currentAnimation) {\n this.transitionToAnimation(state);\n }\n }\n}\n", "export class KeyInputManager {\n private keys = new Map<string, boolean>();\n\n constructor() {\n document.addEventListener(\"keydown\", this.onKeyDown.bind(this));\n document.addEventListener(\"keyup\", this.onKeyUp.bind(this));\n window.addEventListener(\"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 this.keys.set(event.key.toLowerCase(), true);\n }\n\n private onKeyUp(event: KeyboardEvent): void {\n this.keys.set(event.key.toLowerCase(), false);\n }\n\n public isKeyPressed(key: string): boolean {\n return this.keys.get(key) || false;\n }\n\n public isMovementKeyPressed(): boolean {\n return [\"w\", \"a\", \"s\", \"d\"].some((key) => this.isKeyPressed(key));\n }\n\n get forward(): boolean {\n return this.isKeyPressed(\"w\");\n }\n\n get backward(): boolean {\n return this.isKeyPressed(\"s\");\n }\n\n get left(): boolean {\n return this.isKeyPressed(\"a\");\n }\n\n get right(): boolean {\n return this.isKeyPressed(\"d\");\n }\n\n get run(): boolean {\n return this.isKeyPressed(\"shift\");\n }\n\n get jump(): boolean {\n return this.isKeyPressed(\" \");\n }\n\n get anyDirection(): boolean {\n return this.isMovementKeyPressed();\n }\n\n get conflictingDirection(): boolean {\n return (\n (this.isKeyPressed(\"w\") && this.isKeyPressed(\"s\")) ||\n (this.isKeyPressed(\"a\") && this.isKeyPressed(\"d\"))\n );\n }\n\n public dispose() {\n document.removeEventListener(\"keydown\", this.onKeyDown.bind(this));\n document.removeEventListener(\"keyup\", this.onKeyDown.bind(this));\n window.removeEventListener(\"blur\", this.handleUnfocus.bind(this));\n }\n}\n", "import {\n IMMLScene,\n Interaction,\n InteractionListener,\n InteractionManager,\n MMLClickTrigger,\n PromptManager,\n PromptProps,\n registerCustomElementsToWindow,\n setGlobalMScene,\n PositionAndRotation,\n MElement,\n} from \"mml-web\";\nimport { AudioListener, Group, Object3D, PerspectiveCamera, Scene, WebGLRenderer } from \"three\";\n\nimport { CollisionsManager } from \"../collisions/CollisionsManager\";\n\nexport class MMLCompositionScene {\n public group: Group;\n private debug: boolean = false;\n\n private readonly mmlScene: Partial<IMMLScene>;\n private readonly promptManager: PromptManager;\n private readonly interactionListener: InteractionListener;\n private readonly clickTrigger: MMLClickTrigger;\n\n constructor(\n private renderer: WebGLRenderer,\n private scene: Scene,\n private camera: PerspectiveCamera,\n private audioListener: AudioListener,\n private collisionsManager: CollisionsManager,\n private getUserPositionAndRotation: () => PositionAndRotation,\n documentAddresses: Array<string>,\n ) {\n this.group = new Group();\n this.promptManager = PromptManager.init(document.body);\n\n const { interactionListener } = InteractionManager.init(document.body, this.camera, this.scene);\n this.interactionListener = interactionListener;\n\n this.mmlScene = {\n getAudioListener: () => this.audioListener,\n getRenderer: () => this.renderer,\n getThreeScene: () => this.scene,\n getRootContainer: () => this.group,\n getCamera: () => this.camera,\n addCollider: (object: Object3D, mElement: MElement) => {\n this.collisionsManager.addMeshesGroup(object as Group, mElement);\n },\n updateCollider: (object: Object3D) => {\n this.collisionsManager.updateMeshesGroup(object as Group);\n },\n removeCollider: (object: Object3D) => {\n this.collisionsManager.removeMeshesGroup(object as Group);\n },\n getUserPositionAndRotation: this.getUserPositionAndRotation,\n addInteraction: (interaction: Interaction) => {\n this.interactionListener.addInteraction(interaction);\n },\n updateInteraction: (interaction: Interaction) => {\n this.interactionListener.updateInteraction(interaction);\n },\n removeInteraction: (interaction: Interaction) => {\n this.interactionListener.removeInteraction(interaction);\n },\n prompt: (promptProps: PromptProps, callback: (message: string | null) => void) => {\n this.promptManager.prompt(promptProps, callback);\n },\n };\n setGlobalMScene(this.mmlScene as IMMLScene);\n registerCustomElementsToWindow(window);\n this.clickTrigger = MMLClickTrigger.init(document, this.mmlScene as IMMLScene);\n if (this.debug) {\n console.log(this.clickTrigger);\n }\n for (const address of documentAddresses) {\n const frameElement = document.createElement(\"m-frame\");\n frameElement.setAttribute(\"src\", address);\n document.body.appendChild(frameElement);\n }\n }\n}\n", "import {\n EffectComposer,\n RenderPass,\n EffectPass,\n FXAAEffect,\n ShaderPass,\n BloomEffect,\n SSAOEffect,\n NormalPass,\n BlendFunction,\n TextureEffect,\n} from \"postprocessing\";\nimport {\n Color,\n LinearSRGBColorSpace,\n LoadingManager,\n PMREMGenerator,\n PerspectiveCamera,\n Scene,\n ShadowMapType,\n ToneMapping,\n Vector2,\n WebGLRenderer,\n} from \"three\";\nimport { RGBELoader } from \"three/examples/jsm/loaders/RGBELoader.js\";\nimport { Pane, TpChangeEvent } from \"tweakpane\";\n\nimport { TimeManager } from \"../time/TimeManager\";\n\nimport {\n ssaoMaterialParams,\n statsData,\n composerOptions as opts,\n composerValues as vals,\n rendererBlades,\n setShadowMapType,\n setToneMappingType,\n} from \"./composerSettings\";\nimport { GaussGrainEffect } from \"./post-effects/gauss-grain\";\nimport { setTweakpaneActive } from \"./tweakPaneActivity\";\n\nexport class Composer {\n private width: number = window.innerWidth;\n private height: number = window.innerHeight;\n\n public resolution: Vector2 = new Vector2(this.width, this.height);\n\n private isEnvHDRI: boolean = false;\n\n private readonly scene: Scene;\n private readonly camera: PerspectiveCamera;\n public readonly renderer: WebGLRenderer;\n\n private readonly composer: EffectComposer;\n private readonly renderPass: RenderPass;\n private readonly fxaaEffect: FXAAEffect;\n private readonly fxaaPass: EffectPass;\n private readonly bloomEffect: BloomEffect;\n private readonly bloomPass: EffectPass;\n\n private readonly normalPass: NormalPass;\n private readonly normalTextureEffect: TextureEffect;\n private readonly ssaoEffect: SSAOEffect;\n private readonly ssaoPass: EffectPass;\n\n private readonly gaussGrainEffect = GaussGrainEffect;\n private readonly gaussGrainPass: ShaderPass;\n\n private gui: Pane = new Pane();\n private guiVisible: boolean = false;\n private stats = this.gui.addFolder({ title: \"stats\", expanded: true });\n private renderOptions = this.gui.addFolder({ title: \"renderOptions\", expanded: false });\n private ssao = this.gui.addFolder({ title: \"ambientOcclusion\", expanded: false });\n private post = this.gui.addFolder({ title: \"post\", expanded: false });\n private export = this.gui.addFolder({ title: \"import/export\", expanded: false });\n\n constructor(scene: Scene, camera: PerspectiveCamera) {\n this.scene = scene;\n this.camera = camera;\n this.renderer = new WebGLRenderer({\n powerPreference: \"high-performance\",\n antialias: false,\n stencil: false,\n depth: false,\n });\n this.renderer.info.autoReset = false;\n this.renderer.setSize(this.width, this.height);\n this.renderer.shadowMap.enabled = true;\n this.renderer.shadowMap.type = vals.renderer.shadowMap as ShadowMapType;\n this.renderer.toneMapping = vals.renderer.toneMapping as ToneMapping;\n this.renderer.toneMappingExposure = 0.7;\n\n document.body.appendChild(this.renderer.domElement);\n\n this.composer = new EffectComposer(this.renderer);\n this.renderPass = new RenderPass(this.scene, this.camera);\n this.normalPass = new NormalPass(this.scene, this.camera);\n this.normalTextureEffect = new TextureEffect({\n blendFunction: BlendFunction.SKIP,\n texture: this.normalPass.texture,\n });\n\n this.fxaaEffect = new FXAAEffect();\n this.bloomEffect = new BloomEffect({\n intensity: vals.bloom,\n });\n this.ssaoEffect = new SSAOEffect(this.camera, this.normalPass.texture, {\n ...vals.ssao,\n });\n\n this.fxaaPass = new EffectPass(this.camera, this.fxaaEffect);\n this.bloomPass = new EffectPass(this.camera, this.bloomEffect);\n this.ssaoPass = new EffectPass(this.camera, this.ssaoEffect, this.normalTextureEffect);\n this.gaussGrainPass = new ShaderPass(this.gaussGrainEffect, \"tDiffuse\");\n\n this.composer.addPass(this.renderPass);\n this.composer.addPass(this.normalPass);\n this.composer.addPass(this.ssaoPass);\n this.composer.addPass(this.fxaaPass);\n this.composer.addPass(this.bloomPass);\n this.composer.addPass(this.gaussGrainPass);\n\n window.addEventListener(\"resize\", () => this.updateProjection());\n window.addEventListener(\"keydown\", this.processKey.bind(this));\n this.setupGUIListeners.bind(this)();\n\n this.updateProjection();\n this.setupTweakPane();\n }\n\n private setupGUIListeners(): void {\n const gui = this.gui as any;\n const paneElement: HTMLElement = gui.containerElem_;\n paneElement.style.display = this.guiVisible ? \"unset\" : \"none\";\n this.gui.element.addEventListener(\"mousedown\", () => setTweakpaneActive(true));\n this.gui.element.addEventListener(\"mouseup\", () => setTweakpaneActive(false));\n this.gui.element.addEventListener(\"mouseleave\", () => setTweakpaneActive(false));\n }\n\n private setupTweakPane(): void {\n this.stats.addMonitor(statsData, \"triangles\");\n this.stats.addMonitor(statsData, \"geometries\");\n this.stats.addMonitor(statsData, \"textures\");\n this.stats.addMonitor(statsData, \"shaders\");\n this.stats.addMonitor(statsData, \"postPasses\");\n this.stats.addMonitor(statsData, \"drawCalls\");\n this.stats.addMonitor(statsData, \"FPS\");\n\n this.renderOptions.addInput(vals.renderer, \"shadowMap\", opts.renderer.shadowMap);\n this.renderOptions.addMonitor(rendererBlades, \"shadowMapType\");\n\n this.renderOptions.addInput(vals.renderer, \"toneMapping\", opts.renderer.toneMapping);\n this.renderOptions.addMonitor(rendererBlades, \"toneMappingType\");\n\n this.renderOptions.addInput(vals.renderer, \"exposure\", opts.renderer.exposure);\n this.renderOptions.addInput(vals.renderer, \"bgIntensity\", opts.renderer.bgIntensity);\n this.renderOptions.addInput(vals.renderer, \"bgBlurriness\", opts.renderer.bgBlurriness);\n this.renderOptions.on(\"change\", (e: TpChangeEvent<any>) => {\n const target = e.target as any;\n switch (target.label) {\n case \"shadowMap\":\n this.renderer.shadowMap.type = e.value;\n setShadowMapType(e.value);\n break;\n case \"toneMapping\":\n this.renderer.toneMapping = e.value;\n setToneMappingType(e.value);\n break;\n case \"exposure\":\n this.renderer.toneMappingExposure = e.value;\n break;\n case \"bgIntensity\":\n this.scene.backgroundIntensity = e.value;\n break;\n case \"bgBlurriness\":\n this.scene.backgroundBlurriness = e.value;\n break;\n default:\n break;\n }\n });\n\n this.ssao.addInput({ showEffectOnly: false }, \"showEffectOnly\");\n this.ssao.addInput(vals.ssao, \"samples\", opts.ssao.samples);\n this.ssao.addInput(vals.ssao, \"rings\", opts.ssao.rings);\n this.ssao.addInput(vals.ssao, \"luminanceInfluence\", opts.ssao.luminanceInfluence);\n this.ssao.addInput(vals.ssao, \"radius\", opts.ssao.radius);\n this.ssao.addInput(vals.ssao, \"intensity\", opts.ssao.intensity);\n this.ssao.addInput(vals.ssao, \"bias\", opts.ssao.bias);\n this.ssao.addInput(vals.ssao, \"fade\", opts.ssao.fade);\n this.ssao.addInput(vals.ssao, \"resolutionScale\", opts.ssao.resolutionScale);\n this.ssao.addInput(vals.ssao, \"worldDistanceThreshold\", opts.ssao.worldDistanceThreshold);\n this.ssao.addInput(vals.ssao, \"worldDistanceFalloff\", opts.ssao.worldDistanceFalloff);\n this.ssao.addInput(vals.ssao, \"worldProximityThreshold\", opts.ssao.worldProximityThreshold);\n this.ssao.addInput(vals.ssao, \"worldProximityFalloff\", opts.ssao.worldProximityFalloff);\n this.ssao.addInput(vals.ssao, \"color\");\n this.ssao.on(\"change\", (e: TpChangeEvent<any>) => {\n if (!e.presetKey) {\n return;\n }\n const preset = e.presetKey;\n if (preset === \"showEffectOnly\") {\n this.ssaoEffect.blendMode.blendFunction =\n e.value === true ? BlendFunction.NORMAL : BlendFunction.MULTIPLY;\n return;\n }\n if (preset === \"resolutionScale\") {\n this.ssaoEffect.resolution.scale = e.value;\n return;\n }\n if (ssaoMaterialParams.includes(e.presetKey!)) {\n (this.ssaoEffect.ssaoMaterial as any)[preset] = e.value;\n return;\n }\n if (e.presetKey === \"color\") {\n this.ssaoEffect.color = new Color().setRGB(\n e.value.r / 255,\n e.value.g / 255,\n e.value.b / 255,\n );\n return;\n }\n (this.ssaoEffect as any)[preset] = e.value;\n });\n\n this.post.addInput(vals, \"bloom\", opts.bloom.amount);\n this.post.addInput(vals, \"grain\", opts.grain.amount);\n\n this.post.on(\"change\", (e: TpChangeEvent<any>) => {\n const target = e.presetKey;\n console.log(target);\n switch (target) {\n case \"bloom\":\n this.bloomEffect.intensity = e.value;\n break;\n case \"grain\":\n this.gaussGrainEffect.uniforms.amount.value = e.value;\n break;\n default:\n break;\n }\n });\n\n const button = this.export.addButton({ title: \"export\" });\n button.on(\"click\", () => {\n console.log(this.gui.exportPreset());\n });\n }\n\n private toggleGUI(): void {\n const gui = this.gui as any;\n const paneElement: HTMLElement = gui.containerElem_;\n paneElement.style.display = this.guiVisible ? \"none\" : \"unset\";\n this.guiVisible = !this.guiVisible;\n }\n\n private processKey(e: KeyboardEvent): void {\n if (e.key === \"p\") this.toggleGUI();\n }\n\n private updateProjection(): void {\n this.width = window.innerWidth;\n this.height = innerHeight;\n this.resolution = new Vector2(this.width, this.height);\n if (this.composer) this.composer.setSize(this.width, this.height);\n if (this.fxaaPass) this.fxaaPass.setSize(this.width, this.height);\n if (this.renderPass) this.renderPass.setSize(this.width, this.height);\n if (this.bloomPass) this.bloomPass.setSize(this.width, this.height);\n if (this.ssaoPass) this.ssaoPass.setSize(this.width, this.height);\n if (this.normalPass) this.normalPass.setSize(this.width, this.height);\n this.renderer.setSize(this.width, this.height);\n }\n\n private updateStats(timeManager: TimeManager): void {\n const { geometries, textures } = this.renderer.info.memory;\n const { triangles, calls } = this.renderer.info.render;\n statsData.triangles = triangles.toString();\n statsData.geometries = geometries.toString();\n statsData.textures = textures.toString();\n statsData.shaders = this.renderer.info.programs!.length.toString();\n statsData.postPasses = this.composer.passes.length.toString();\n statsData.drawCalls = calls.toString();\n statsData.FPS = Math.round(timeManager.averageFPS).toString();\n }\n\n public render(timeManager: TimeManager): void {\n this.renderer.info.reset();\n this.normalPass.texture.needsUpdate = true;\n this.gaussGrainEffect.uniforms.resolution.value = this.resolution;\n this.gaussGrainEffect.uniforms.time.value = timeManager.time;\n this.gaussGrainEffect.uniforms.alpha.value = 1.0;\n this.composer.render();\n this.updateStats(timeManager);\n }\n\n public useHDRI(url: string): void {\n if (this.isEnvHDRI || !this.renderer) return;\n const pmremGenerator = new PMREMGenerator(this.renderer);\n new RGBELoader(new LoadingManager()).load(\n url,\n (texture) => {\n const envMap = pmremGenerator!.fromEquirectangular(texture).texture;\n if (envMap) {\n envMap.colorSpace = LinearSRGBColorSpace;\n envMap.needsUpdate = true;\n this.scene.environment = envMap;\n this.scene.background = envMap;\n this.scene.backgroundIntensity = 0.5;\n this.isEnvHDRI = true;\n texture.dispose();\n pmremGenerator!.dispose();\n }\n },\n () => {},\n (error: ErrorEvent) => {\n console.error(`Can't load ${url}: ${JSON.stringify(error)}`);\n },\n );\n }\n}\n", "import { BlendFunction } from \"postprocessing\";\nimport { Color } from \"three\";\n\nexport const composerValues = {\n renderer: {\n shadowMap: 2,\n toneMapping: 1,\n exposure: 0.75,\n bgIntensity: 0.6,\n bgBlurriness: 0.0,\n },\n ssao: {\n blendFunction: BlendFunction.MULTIPLY,\n distanceScaling: true,\n depthAwareUpsampling: true,\n samples: 50,\n rings: 11,\n luminanceInfluence: 0.3,\n radius: 0.07,\n intensity: 3.0,\n bias: 0.03,\n fade: 0.03,\n resolutionScale: 1,\n color: new Color(0x000000),\n worldDistanceThreshold: 200,\n worldDistanceFalloff: 2,\n worldProximityThreshold: 100,\n worldProximityFalloff: 2,\n },\n grain: 0.04,\n bloom: 0.7,\n};\n\nexport const composerOptions = {\n renderer: {\n shadowMap: { min: 0, max: 2, step: 1 },\n toneMapping: { min: 0, max: 5, step: 1 },\n exposure: { min: 0, max: 1, step: 0.01 },\n bgIntensity: { min: 0, max: 1, step: 0.01 },\n bgBlurriness: { min: 0, max: 0.1, step: 0.001 },\n },\n ssao: {\n samples: { min: 1, max: 50, step: 1 },\n rings: { min: 1, max: 50, step: 1 },\n luminanceInfluence: { min: 0, max: 1, step: 0.01 },\n radius: { min: 0, max: 0.1, step: 0.001 },\n intensity: { min: 0, max: 5, step: 0.1 },\n bias: { min: 0, max: 0.1, step: 0.001 },\n fade: { min: 0, max: 0.1, step: 0.001 },\n resolutionScale: { min: 0.25, max: 2, step: 0.25 },\n worldDistanceThreshold: { min: 0, max: 200, step: 1 },\n worldDistanceFalloff: { min: 0, max: 200, step: 1 },\n worldProximityThreshold: { min: 0, max: 2, step: 0.01 },\n worldProximityFalloff: { min: 0, max: 2, step: 0.01 },\n },\n grain: {\n amount: { min: 0, max: 0.2, step: 0.002 },\n },\n bloom: {\n amount: { min: 0, max: 4, step: 0.1 },\n },\n};\n\nexport const shadowMapTypes: Record<number, string> = {\n 0: \"BasicShadowMap\",\n 1: \"PCFShadowMap\",\n 2: \"PCFSoftShadowMap\",\n};\n\nexport const rendererToneMappingTypes: Record<number, string> = {\n 0: \"NoToneMapping\",\n 1: \"LinearToneMapping\",\n 2: \"ReinhardToneMapping\",\n 3: \"CineonToneMapping\",\n 4: \"ACESFilmicToneMapping\",\n 5: \"CustomToneMapping\",\n};\n\nexport const rendererBlades = {\n shadowMapType: shadowMapTypes[composerValues.renderer.shadowMap],\n toneMappingType: rendererToneMappingTypes[composerValues.renderer.toneMapping],\n};\n\nexport const setShadowMapType = (value: number): void => {\n rendererBlades.shadowMapType = shadowMapTypes[value];\n};\n\nexport const setToneMappingType = (value: number): void => {\n rendererBlades.toneMappingType = rendererToneMappingTypes[value];\n};\n\nexport const ssaoMaterialParams = [\n \"fade\",\n \"bias\",\n \"minRadiusScale\",\n \"worldDistanceThreshold\",\n \"worldDistanceFalloff\",\n \"worldProximityThreshold\",\n \"worldProximityFalloff\",\n];\n\nexport const statsData = {\n triangles: \"0\",\n geometries: \"0\",\n textures: \"0\",\n shaders: \"0\",\n postPasses: \"0\",\n drawCalls: \"0\",\n FPS: \"0\",\n};\n", "import { ShaderMaterial, Uniform, Vector2 } from \"three\";\n\nimport { vertexShader } from \"../shaders/vertex-shader\";\n\nexport const GaussGrainEffect = new ShaderMaterial({\n uniforms: {\n tDiffuse: new Uniform(null),\n resolution: new Uniform(new Vector2()),\n time: new Uniform(0.0),\n amount: new Uniform(0.0),\n alpha: new Uniform(0.0),\n },\n vertexShader: vertexShader,\n fragmentShader: /* glsl */ `\n precision highp float;\n in vec2 vUv;\n\n uniform sampler2D tDiffuse;\n uniform vec2 resolution;\n uniform float time;\n uniform float amount;\n uniform float alpha;\n\n const float PI = acos(-1.0);\n const float TAU = PI * 2.0;\n const float SQRTAU = sqrt(TAU);\n\n float gaussian(float z, float u, float o) {\n return (\n (1.0 / (o * SQRTAU)) *\n (exp(-(((z - u) * (z - u)) / (2.0 * (o * o)))))\n );\n }\n\n vec3 gaussgrain() {\n vec2 ps = vec2(1.01) / resolution.xy;\n vec2 uv = gl_FragCoord.xy * ps;\n float t = time;\n float seed = dot(uv, vec2(12.9898, 78.233));\n float noise = fract(sin(seed) * 43758.5453123 + t);\n noise = gaussian(noise, 0.0, 0.5);\n return vec3(noise);\n }\n\n void main(void) {\n vec2 uv = vUv;\n vec4 originalColor = texture(tDiffuse, uv);\n vec3 grain = gaussgrain();\n vec3 col = originalColor.rgb + (grain * amount);\n gl_FragColor = vec4(clamp(col, 0.0, 1.0), alpha);\n }\n `,\n});\n", "export const vertexShader = /* glsl */ `\n precision highp float;\n\n out vec2 vUv;\n void main() {\n vUv = uv;\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n }\n `;\n", "import { Clock } from \"three\";\n\nimport { ease } from \"../helpers/math-helpers\";\n\nexport class TimeManager {\n private clock: Clock = new Clock();\n private roundMagnitude: number = 200000;\n private maxAverageFrames: number = 700;\n private deltaTimes: number[] = [];\n\n private fpsMaxSamples: number = 10;\n private fpsSamples: number[] = [];\n\n private targetAverageDeltaTime: number = 0;\n private lerpedAverageMagDelta: number = 0;\n private fpsUpdateTime: number = 0;\n private framesSinceLastFPSUpdate: number = 0;\n\n public time: number = 0;\n public deltaTime: number = 0;\n public rawDeltaTime: number = 0;\n public frame: number = 0;\n public fps: number = 0;\n public averageFPS: number = 0;\n\n update() {\n this.rawDeltaTime = this.clock.getDelta();\n this.frame++;\n this.time += this.rawDeltaTime;\n this.deltaTimes.push(this.rawDeltaTime);\n\n if (this.deltaTimes.length > this.maxAverageFrames) this.deltaTimes.shift();\n\n this.targetAverageDeltaTime =\n this.deltaTimes.reduce((prev, curr) => prev + curr, 0) / this.deltaTimes.length;\n\n this.lerpedAverageMagDelta += ease(\n this.targetAverageDeltaTime * this.roundMagnitude,\n this.lerpedAverageMagDelta,\n 0.12,\n );\n\n const revertMagnitude = this.lerpedAverageMagDelta / this.roundMagnitude;\n const smoothDT = Math.round(revertMagnitude * this.roundMagnitude) / this.roundMagnitude;\n\n this.deltaTime = smoothDT > this.rawDeltaTime * 1.75 ? this.rawDeltaTime : smoothDT;\n\n this.framesSinceLastFPSUpdate++;\n if (this.framesSinceLastFPSUpdate >= 60) {\n this.fps =\n Math.round((this.framesSinceLastFPSUpdate / (this.time - this.fpsUpdateTime)) * 100) / 100;\n\n this.fpsSamples.push(this.fps);\n if (this.fpsSamples.length > this.fpsMaxSamples) this.fpsSamples.shift();\n this.averageFPS =\n this.fpsSamples.length === this.fpsMaxSamples\n ? Math.round(\n this.fpsSamples.reduce((prev, curr) => prev + curr, 0) / this.fpsSamples.length,\n )\n : this.fps;\n\n this.fpsUpdateTime = this.time;\n this.framesSinceLastFPSUpdate = 0;\n }\n }\n}\n", "import {\n MElement,\n MMLCollisionTrigger,\n getRelativePositionAndRotationRelativeToObject,\n} from \"mml-web\";\nimport {\n Box3,\n BufferGeometry,\n Color,\n Euler,\n FrontSide,\n Group,\n Line3,\n Mesh,\n MeshStandardMaterial,\n Object3D,\n Scene,\n Vector3,\n} from \"three\";\nimport * as BufferGeometryUtils from \"three/examples/jsm/utils/BufferGeometryUtils.js\";\nimport { MeshBVH, MeshBVHVisualizer } from \"three-mesh-bvh\";\n\ntype CollisionMeshState = {\n source: Group;\n meshBVH: MeshBVH;\n visualizer: MeshBVHVisualizer | null;\n};\n\nexport class CollisionsManager {\n private debug: boolean = false;\n private scene: Scene;\n private tempVector: Vector3 = new Vector3();\n private tempVector2: Vector3 = new Vector3();\n\n private collisionMeshState: Map<Group, CollisionMeshState> = new Map();\n private collisionTrigger: MMLCollisionTrigger;\n\n public colliders: Group = new Group();\n private collisionEnabledMeshes: Record<string, Mesh> = {};\n\n constructor(scene: Scene) {\n this.scene = scene;\n this.collisionTrigger = MMLCollisionTrigger.init();\n }\n\n private safeAddColliders(child: Mesh): void {\n if (!(child.uuid in this.collisionEnabledMeshes)) {\n const clone = child.clone();\n this.collisionEnabledMeshes[child.uuid] = clone;\n this.colliders.add(clone);\n }\n }\n\n private removeFromColliders(child: Mesh): void {\n if (child.uuid in this.collisionEnabledMeshes) {\n this.colliders.remove(this.collisionEnabledMeshes[child.uuid]);\n delete this.collisionEnabledMeshes[child.uuid];\n }\n }\n\n private createCollisionMeshState(group: Group): CollisionMeshState {\n const geometries: Array<BufferGeometry> = [];\n group.traverse((child: Object3D) => {\n if (child.type === \"Mesh\") {\n const mesh = child as Mesh;\n mesh.localToWorld(new Vector3());\n mesh.updateMatrixWorld();\n this.safeAddColliders(mesh);\n const clonedGeometry = mesh.geometry.clone();\n clonedGeometry.applyMatrix4(mesh.matrixWorld);\n\n for (const key in clonedGeometry.attributes) {\n if (key !== \"position\") {\n clonedGeometry.deleteAttribute(key);\n }\n }\n if (clonedGeometry.index) {\n geometries.push(clonedGeometry.toNonIndexed());\n } else {\n geometries.push(clonedGeometry);\n }\n }\n });\n const newBufferGeometry = BufferGeometryUtils.mergeGeometries(geometries);\n const meshBVH = new MeshBVH(newBufferGeometry);\n\n if (!this.debug) {\n return { source: group, visualizer: null, meshBVH };\n }\n\n const mergedMesh = new Mesh(\n newBufferGeometry,\n new MeshStandardMaterial({ color: 0xff0000, side: FrontSide, wireframe: true }),\n );\n mergedMesh.geometry.boundsTree = meshBVH;\n const visualizer = new MeshBVHVisualizer(mergedMesh, 3);\n visualizer.edgeMaterial.color = new Color(0x0000ff);\n visualizer.update();\n return { source: group, visualizer, meshBVH };\n }\n\n public addMeshesGroup(group: Group, mElement?: MElement): void {\n if (mElement) {\n this.collisionTrigger.addCollider(group, mElement);\n }\n const meshState = this.createCollisionMeshState(group);\n if (meshState.visualizer) {\n this.scene.add(meshState.visualizer);\n }\n this.collisionMeshState.set(group, meshState);\n }\n\n public updateMeshesGroup(group: Group): void {\n const meshState = this.collisionMeshState.get(group);\n if (meshState) {\n const newMeshState = this.createCollisionMeshState(group);\n if (meshState.visualizer) {\n this.scene.remove(meshState.visualizer);\n }\n if (newMeshState.visualizer) {\n this.scene.add(newMeshState.visualizer);\n }\n this.collisionMeshState.set(group, newMeshState);\n }\n }\n\n public removeMeshesGroup(group: Group): void {\n this.collisionTrigger.removeCollider(group);\n const meshState = this.collisionMeshState.get(group);\n if (meshState) {\n if (meshState.visualizer) {\n this.scene.remove(meshState.visualizer);\n }\n this.collisionMeshState.delete(group);\n if (group) {\n group.traverse((child) => {\n if (child.type === \"Mesh\") {\n this.removeFromColliders(child as Mesh);\n }\n });\n }\n }\n }\n\n private applyCollider(\n tempSegment: Line3,\n radius: number,\n boundingBox: Box3,\n meshState: CollisionMeshState,\n ): Vector3 | null {\n let collisionPosition: Vector3 | null = null;\n meshState.meshBVH.shapecast({\n intersectsBounds: (box) => box.intersectsBox(boundingBox),\n intersectsTriangle: (tri) => {\n const triPoint = this.tempVector;\n const capsulePoint = this.tempVector2;\n const distance = tri.closestPointToSegment(tempSegment, triPoint, capsulePoint);\n if (distance < radius) {\n const depth = radius - distance;\n collisionPosition = new Vector3().copy(capsulePoint);\n const direction = capsulePoint.sub(triPoint).normalize();\n tempSegment.start.addScaledVector(direction, depth);\n tempSegment.end.addScaledVector(direction, depth);\n }\n },\n });\n return collisionPosition;\n }\n\n public applyColliders(tempSegment: Line3, radius: number, boundingBox: Box3) {\n let collidedElements: Map<\n Object3D,\n {\n position: { x: number; y: number; z: number };\n }\n > | null = null;\n for (const meshState of this.collisionMeshState.values()) {\n const collisionPosition = this.applyCollider(tempSegment, radius, boundingBox, meshState);\n if (collisionPosition) {\n if (collidedElements === null) {\n collidedElements = new Map();\n }\n const relativePosition = getRelativePositionAndRotationRelativeToObject(\n {\n position: collisionPosition,\n rotation: new Euler(),\n },\n meshState.source,\n );\n collidedElements.set(meshState.source, {\n position: relativePosition.position,\n });\n }\n }\n\n this.collisionTrigger.setCurrentCollisions(collidedElements);\n }\n}\n"],
|
5
|
+
"mappings": "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",
|
6
|
+
"names": ["Vector3", "Vector3", "Color", "Vector3", "AnimationClip", "Object3D", "AnimationState", "Object3D", "AnimationClip", "Vector3", "Vector3", "Color", "Vector3", "Vector3", "AnimationMixer", "Object3D", "Quaternion", "Vector3", "AnimationMixer", "Object3D", "Vector3", "Quaternion", "Vector3", "Group", "Group", "BlendFunction", "Color", "LoadingManager", "Vector2", "WebGLRenderer", "Color", "Vector2", "WebGLRenderer", "BlendFunction", "Color", "LoadingManager", "Color", "Group", "Mesh", "MeshStandardMaterial", "Vector3", "Vector3", "Group", "Mesh", "MeshStandardMaterial", "Color"]
|
7
7
|
}
|
@@ -1,11 +1,18 @@
|
|
1
1
|
export declare class KeyInputManager {
|
2
2
|
private keys;
|
3
3
|
constructor();
|
4
|
+
private handleUnfocus;
|
4
5
|
private onKeyDown;
|
5
6
|
private onKeyUp;
|
6
7
|
isKeyPressed(key: string): boolean;
|
7
8
|
isMovementKeyPressed(): boolean;
|
8
|
-
|
9
|
-
|
9
|
+
get forward(): boolean;
|
10
|
+
get backward(): boolean;
|
11
|
+
get left(): boolean;
|
12
|
+
get right(): boolean;
|
13
|
+
get run(): boolean;
|
14
|
+
get jump(): boolean;
|
15
|
+
get anyDirection(): boolean;
|
16
|
+
get conflictingDirection(): boolean;
|
10
17
|
dispose(): void;
|
11
18
|
}
|
@@ -1,8 +1,10 @@
|
|
1
1
|
import { PerspectiveCamera, Scene, Vector2, WebGLRenderer } from "three";
|
2
|
+
import { TimeManager } from "../time/TimeManager";
|
2
3
|
export declare class Composer {
|
3
4
|
private width;
|
4
5
|
private height;
|
5
6
|
resolution: Vector2;
|
7
|
+
private isEnvHDRI;
|
6
8
|
private readonly scene;
|
7
9
|
private readonly camera;
|
8
10
|
readonly renderer: WebGLRenderer;
|
@@ -12,9 +14,26 @@ export declare class Composer {
|
|
12
14
|
private readonly fxaaPass;
|
13
15
|
private readonly bloomEffect;
|
14
16
|
private readonly bloomPass;
|
17
|
+
private readonly normalPass;
|
18
|
+
private readonly normalTextureEffect;
|
19
|
+
private readonly ssaoEffect;
|
20
|
+
private readonly ssaoPass;
|
15
21
|
private readonly gaussGrainEffect;
|
16
22
|
private readonly gaussGrainPass;
|
23
|
+
private gui;
|
24
|
+
private guiVisible;
|
25
|
+
private stats;
|
26
|
+
private renderOptions;
|
27
|
+
private ssao;
|
28
|
+
private post;
|
29
|
+
private export;
|
17
30
|
constructor(scene: Scene, camera: PerspectiveCamera);
|
31
|
+
private setupGUIListeners;
|
32
|
+
private setupTweakPane;
|
33
|
+
private toggleGUI;
|
34
|
+
private processKey;
|
18
35
|
private updateProjection;
|
19
|
-
|
36
|
+
private updateStats;
|
37
|
+
render(timeManager: TimeManager): void;
|
38
|
+
useHDRI(url: string): void;
|
20
39
|
}
|