@mml-io/3d-web-client-core 0.0.0-experimental-751c031-20230804
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 +37 -0
- package/build/character/Character.d.ts +33 -0
- package/build/character/CharacterManager.d.ts +31 -0
- package/build/character/CharacterMaterial.d.ts +12 -0
- package/build/character/CharacterModel.d.ts +23 -0
- package/build/character/CharacterState.d.ts +21 -0
- package/build/character/LocalController.d.ts +64 -0
- package/build/character/ModelLoader.d.ts +14 -0
- package/build/character/RemoteController.d.ts +18 -0
- package/build/collisions/CollisionsManager.d.ts +25 -0
- package/build/helpers/math-helpers.d.ts +6 -0
- package/build/index.d.ts +9 -0
- package/build/index.js +2544 -0
- package/build/index.js.map +7 -0
- package/build/input/KeyInputManager.d.ts +18 -0
- package/build/mml/MMLCompositionScene.d.ts +18 -0
- package/build/rendering/composer.d.ts +35 -0
- package/build/rendering/post-effects/bright-contrast-sat.d.ts +2 -0
- package/build/rendering/post-effects/gauss-grain.d.ts +2 -0
- package/build/rendering/shaders/bayer-dither.d.ts +1 -0
- package/build/rendering/shaders/shader-helpers.d.ts +4 -0
- package/build/rendering/shaders/vertex-shader.d.ts +1 -0
- package/build/time/TimeManager.d.ts +18 -0
- package/build/tweakpane/TweakPane.d.ts +30 -0
- package/build/tweakpane/characterSettings.d.ts +89 -0
- package/build/tweakpane/composerSettings.d.ts +234 -0
- package/build/tweakpane/tweakPaneActivity.d.ts +2 -0
- package/package.json +28 -0
@@ -0,0 +1,7 @@
|
|
1
|
+
{
|
2
|
+
"version": 3,
|
3
|
+
"sources": ["../src/camera/CameraManager.ts", "../src/helpers/math-helpers.ts", "../src/tweakpane/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/tweakpane/characterSettings.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/tweakpane/composerSettings.ts", "../src/tweakpane/TweakPane.ts", "../src/rendering/post-effects/bright-contrast-sat.ts", "../src/rendering/shaders/vertex-shader.ts", "../src/rendering/post-effects/gauss-grain.ts", "../src/time/TimeManager.ts", "../src/collisions/CollisionsManager.ts"],
|
4
|
+
"sourcesContent": ["import { PerspectiveCamera, Raycaster, Vector3 } from \"three\";\n\nimport { CollisionsManager } from \"../collisions/CollisionsManager\";\nimport { ease, remap, clamp } from \"../helpers/math-helpers\";\nimport { getTweakpaneActive } from \"../tweakpane/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 = 63;\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 public 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\n private target: Vector3 = new Vector3(0, 1.55, 0);\n\n private hadTarget: boolean = false;\n\n private rayCaster: Raycaster;\n\n constructor(private collisionsManager: CollisionsManager) {\n this.camera = new PerspectiveCamera(this.fov, window.innerWidth / window.innerHeight, 0.1, 400);\n this.camera.position.set(0, 1.4, -this.initialDistance);\n\n this.rayCaster = new Raycaster();\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: 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 adjustCameraPosition(): void {\n this.rayCaster.set(\n this.camera.position,\n this.target.clone().sub(this.camera.position).normalize(),\n );\n const minimumDistance = this.collisionsManager.raycastFirstDistance(this.rayCaster.ray);\n const cameraToPlayerDistance = this.camera.position.distanceTo(this.target);\n\n if (minimumDistance !== null && minimumDistance <= cameraToPlayerDistance) {\n this.targetDistance = cameraToPlayerDistance - minimumDistance;\n this.distance = this.targetDistance;\n }\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 this.camera.updateMatrixWorld();\n\n this.camera.position.set(x, clamp(y, 0.1, Infinity), z);\n\n this.adjustCameraPosition();\n\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 this.model.material.update();\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\";\nimport { characterValues } from \"../tweakpane/characterSettings\";\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 = characterValues.material.transmission;\n this.metalness = characterValues.material.metalness;\n this.roughness = characterValues.material.roughness;\n this.ior = characterValues.material.ior;\n this.thickness = characterValues.material.thickness;\n this.specularColor = new Color().setRGB(\n characterValues.material.specularColor.r,\n characterValues.material.specularColor.g,\n characterValues.material.specularColor.b,\n );\n this.specularIntensity = characterValues.material.specularIntensity;\n this.emissive = new Color().setRGB(\n characterValues.material.emissive.r,\n characterValues.material.emissive.g,\n characterValues.material.emissive.b,\n );\n this.emissiveIntensity = characterValues.material.emissiveIntensity;\n this.envMapIntensity = characterValues.material.envMapIntensity;\n this.sheenColor = new Color().setRGB(\n characterValues.material.sheenColor.r,\n characterValues.material.sheenColor.g,\n characterValues.material.sheenColor.b,\n );\n this.sheen = characterValues.material.sheen;\n this.clearcoat = characterValues.material.clearcoat;\n this.clearcoatRoughness = characterValues.material.clearcoatRoughness;\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 public update() {\n this.transmission = characterValues.material.transmission;\n this.metalness = characterValues.material.metalness;\n this.roughness = characterValues.material.roughness;\n this.ior = characterValues.material.ior;\n this.thickness = characterValues.material.thickness;\n this.specularColor = new Color().setRGB(\n characterValues.material.specularColor.r,\n characterValues.material.specularColor.g,\n characterValues.material.specularColor.b,\n );\n this.specularIntensity = characterValues.material.specularIntensity;\n this.emissive = new Color().setRGB(\n characterValues.material.emissive.r,\n characterValues.material.emissive.g,\n characterValues.material.emissive.b,\n );\n this.emissiveIntensity = characterValues.material.emissiveIntensity;\n this.envMapIntensity = characterValues.material.envMapIntensity;\n this.sheenColor = new Color().setRGB(\n characterValues.material.sheenColor.r,\n characterValues.material.sheenColor.g,\n characterValues.material.sheenColor.b,\n );\n this.sheen = characterValues.material.sheen;\n this.clearcoat = characterValues.material.clearcoat;\n this.clearcoatRoughness = characterValues.material.clearcoatRoughness;\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 const characterValues = {\n material: {\n transmission: 1,\n metalness: 0.8,\n roughness: 0.12,\n ior: 1.5,\n thickness: 0.1,\n specularColor: { r: 1.0, g: 1.0, b: 1.0 },\n specularIntensity: 0.1,\n emissive: { r: 1.0, g: 1.0, b: 1.0 },\n emissiveIntensity: 0.1,\n envMapIntensity: 1.0,\n sheenColor: { r: 1.0, g: 1.0, b: 1.0 },\n sheen: 0.5,\n clearcoat: 0.0,\n clearcoatRoughness: 0.0,\n },\n};\n\nexport const characterOptions = {\n material: {\n transmission: { min: 0.01, max: 3, step: 0.01 },\n metalness: { min: 0, max: 1, step: 0.01 },\n roughness: { min: 0, max: 1, step: 0.01 },\n ior: { min: 0, max: 5, step: 0.01 },\n thickness: { min: 0, max: 1, step: 0.01 },\n specularIntensity: { min: 0, max: 1, step: 0.01 },\n emissiveIntensity: { min: 0, max: 1, step: 0.01 },\n envMapIntensity: { min: 0, max: 1, step: 0.01 },\n sheen: { min: 0, max: 1, step: 0.01 },\n clearcoat: { min: 0, max: 1, step: 0.01 },\n clearcoatRoughness: { min: 0, max: 1, step: 0.01 },\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 minimumDistance = this.collisionsManager.raycastFirstDistance(this.rayCaster.ray);\n if (minimumDistance !== null) {\n this.currentHeight = minimumDistance;\n }\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 const camToModelDistance = this.thirdPersonCamera.position.distanceTo(this.model.mesh.position);\n const isCameraFirstPerson = camToModelDistance < 2;\n if (isCameraFirstPerson) {\n const cameraForward = new Vector3(0, 0, 1).applyQuaternion(this.thirdPersonCamera.quaternion);\n this.azimuthalAngle = Math.atan2(cameraForward.x, cameraForward.z);\n } else {\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\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 { ease, 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 private cameraOffsetTarget: number = 0;\n private cameraOffset: number = 0;\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\n if (this.character.model?.mesh) {\n this.cameraOffsetTarget = this.cameraManager.targetDistance <= 0.4 ? 0.6 : 0;\n this.cameraOffset += ease(this.cameraOffsetTarget, this.cameraOffset, 0.1);\n const targetOffset = new Vector3(0, 1.3, this.cameraOffset);\n targetOffset.applyQuaternion(this.character.model.mesh.quaternion);\n this.cameraManager.setTarget(this.character.position.add(targetOffset));\n }\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 BlendFunction,\n TextureEffect,\n ToneMappingEffect,\n SMAAEffect,\n SMAAPreset,\n EdgeDetectionMode,\n PredicationMode,\n NormalPass,\n} from \"postprocessing\";\nimport {\n Color,\n HalfFloatType,\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\";\n\nimport { TimeManager } from \"../time/TimeManager\";\nimport { composerValues as vals } from \"../tweakpane/composerSettings\";\nimport { TweakPane } from \"../tweakpane/TweakPane\";\n\nimport { BrightnessContrastSaturation } from \"./post-effects/bright-contrast-sat\";\nimport { GaussGrainEffect } from \"./post-effects/gauss-grain\";\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 private readonly toneMappingEffect: ToneMappingEffect;\n private readonly smaaEffect: SMAAEffect;\n\n private readonly normalPass: NormalPass;\n private readonly normalTextureEffect: TextureEffect;\n private readonly ssaoEffect: SSAOEffect;\n private readonly ssaoPass: EffectPass;\n private readonly toneMappingPass: EffectPass;\n private readonly smaaPass: EffectPass;\n\n private readonly bcs = BrightnessContrastSaturation;\n private readonly bcsPass: ShaderPass;\n\n private readonly gaussGrainEffect = GaussGrainEffect;\n private readonly gaussGrainPass: ShaderPass;\n\n private tweakPane: TweakPane;\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 = vals.renderer.exposure;\n\n document.body.appendChild(this.renderer.domElement);\n\n this.composer = new EffectComposer(this.renderer, {\n frameBufferType: HalfFloatType,\n });\n\n this.tweakPane = new TweakPane(this.renderer, this.scene, this.composer);\n\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 blendFunction: vals.ssao.blendFunction,\n distanceScaling: vals.ssao.distanceScaling,\n depthAwareUpsampling: vals.ssao.depthAwareUpsampling,\n samples: vals.ssao.samples,\n rings: vals.ssao.rings,\n luminanceInfluence: vals.ssao.luminanceInfluence,\n radius: vals.ssao.radius,\n intensity: vals.ssao.intensity,\n bias: vals.ssao.bias,\n fade: vals.ssao.fade,\n resolutionScale: vals.ssao.resolutionScale,\n color: new Color().setRGB(vals.ssao.color.r, vals.ssao.color.g, vals.ssao.color.b),\n worldDistanceThreshold: vals.ssao.worldDistanceThreshold,\n worldDistanceFalloff: vals.ssao.worldDistanceFalloff,\n worldProximityThreshold: vals.ssao.worldProximityThreshold,\n worldProximityFalloff: vals.ssao.worldProximityFalloff,\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.toneMappingEffect = new ToneMappingEffect({\n mode: vals.toneMapping.mode,\n resolution: vals.toneMapping.resolution,\n whitePoint: vals.toneMapping.whitePoint,\n middleGrey: vals.toneMapping.middleGrey,\n minLuminance: vals.toneMapping.minLuminance,\n averageLuminance: vals.toneMapping.averageLuminance,\n adaptationRate: vals.toneMapping.adaptationRate,\n });\n this.smaaEffect = new SMAAEffect({\n preset: SMAAPreset.ULTRA,\n edgeDetectionMode: EdgeDetectionMode.COLOR,\n predicationMode: PredicationMode.DEPTH,\n });\n\n this.toneMappingPass = new EffectPass(this.camera, this.toneMappingEffect);\n this.toneMappingPass.enabled =\n vals.renderer.toneMapping === 5 || vals.renderer.toneMapping === 0 ? true : false;\n\n this.bcsPass = new ShaderPass(this.bcs, \"tDiffuse\");\n this.bcs.uniforms.brightness.value = vals.brightness;\n this.bcs.uniforms.contrast.value = vals.contrast;\n this.bcs.uniforms.saturation.value = vals.saturation;\n\n this.gaussGrainPass = new ShaderPass(this.gaussGrainEffect, \"tDiffuse\");\n this.smaaPass = new EffectPass(this.camera, this.smaaEffect);\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.smaaPass);\n this.composer.addPass(this.bloomPass);\n this.composer.addPass(this.toneMappingPass);\n this.composer.addPass(this.bcsPass);\n this.composer.addPass(this.gaussGrainPass);\n\n this.tweakPane.setupRenderPane(\n this.ssaoEffect,\n this.toneMappingEffect,\n this.toneMappingPass,\n this.bcs,\n this.bloomEffect,\n this.gaussGrainEffect,\n );\n window.addEventListener(\"resize\", () => this.updateProjection());\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 this.composer.setSize(this.width, this.height);\n this.renderPass.setSize(this.width, this.height);\n this.normalPass.setSize(this.width, this.height);\n this.ssaoPass.setSize(this.width, this.height);\n this.fxaaPass.setSize(this.width, this.height);\n this.smaaPass.setSize(this.width, this.height);\n this.bloomPass.setSize(this.width, this.height);\n this.toneMappingPass.setSize(this.width, this.height);\n this.gaussGrainPass.setSize(this.width, this.height);\n this.renderer.setSize(this.width, this.height);\n }\n\n public isTweakPaneVisible(): boolean {\n return this.tweakPane.guiVisible;\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\n if (this.tweakPane.guiVisible) {\n this.tweakPane.updateStats(timeManager);\n }\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 = vals.renderer.bgIntensity;\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, ToneMappingMode } from \"postprocessing\";\n\nexport const composerValues = {\n renderer: {\n shadowMap: 2,\n toneMapping: 4,\n exposure: 1,\n bgIntensity: 0.6,\n bgBlurriness: 0.0,\n },\n ssao: {\n blendFunction: BlendFunction.MULTIPLY,\n distanceScaling: true,\n depthAwareUpsampling: true,\n samples: 17,\n rings: 7,\n luminanceInfluence: 0.7,\n radius: 0.03,\n intensity: 2.5,\n bias: 0.05,\n fade: 0.03,\n resolutionScale: 0.75,\n color: { r: 0, g: 0, b: 0 },\n worldDistanceThreshold: 30,\n worldDistanceFalloff: 7,\n worldProximityThreshold: 0.5,\n worldProximityFalloff: 0.3,\n },\n toneMapping: {\n mode: 2 as ToneMappingMode,\n resolution: 512,\n whitePoint: 32.0,\n middleGrey: 21.0,\n minLuminance: 0.01,\n averageLuminance: 0.01,\n adaptationRate: 2.0,\n },\n brightness: -0.03,\n contrast: 1.3,\n saturation: 0.95,\n grain: 0.055,\n bloom: 0.4,\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: 3, 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 toneMapping: {\n mode: { min: 0, max: 4, step: 1 },\n resolution: { min: 64, max: 512, step: 64 },\n whitePoint: { min: 0, max: 32, step: 0.01 },\n middleGrey: { min: 0, max: 32, step: 0.01 },\n minLuminance: { min: 0, max: 32, step: 0.001 },\n averageLuminance: { min: 0.001, max: 0.2, step: 0.001 },\n adaptationRate: { min: 0.1, max: 2.0, step: 0.1 },\n },\n brightness: {\n amount: { min: -1.0, max: 1.0, step: 0.01 },\n },\n contrast: {\n amount: { min: 0.0, max: 2.0, step: 0.01 },\n },\n saturation: {\n amount: { min: 0.0, max: 2.0, 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 customToneMappingTypes: Record<number, string> = {\n 0: \"REINHARD\",\n 1: \"REINHARD2\",\n 2: \"REINHARD2_ADAPTIVE\",\n 3: \"OPTIMIZED_CINEON\",\n 4: \"ACES_FILMIC\",\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 customToneMappingBlade = {\n customToneMappingType: customToneMappingTypes[composerValues.toneMapping.mode],\n};\n\nexport const setCustomToneMappingType = (value: number): void => {\n customToneMappingBlade.customToneMappingType = customToneMappingTypes[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 rawDeltaTime: \"0\",\n deltaTime: \"0\",\n FPS: \"0\",\n};\n", "import {\n BlendFunction,\n BloomEffect,\n EffectComposer,\n EffectPass,\n SSAOEffect,\n ToneMappingEffect,\n} from \"postprocessing\";\nimport { Color, Scene, WebGLRenderer } from \"three\";\nimport { FolderApi, Pane, TpChangeEvent } from \"tweakpane\";\n\nimport { GaussGrainEffect } from \"../rendering/post-effects/gauss-grain\";\nimport { TimeManager } from \"../time/TimeManager\";\n\nimport { BrightnessContrastSaturation } from \"./../rendering/post-effects/bright-contrast-sat\";\nimport { characterOptions, characterValues } from \"./characterSettings\";\nimport {\n ssaoMaterialParams,\n statsData,\n composerOptions,\n composerValues,\n rendererBlades,\n setShadowMapType,\n setToneMappingType,\n customToneMappingBlade,\n setCustomToneMappingType,\n} from \"./composerSettings\";\nimport { setTweakpaneActive } from \"./tweakPaneActivity\";\n\nexport class TweakPane {\n private renderer: WebGLRenderer;\n private scene: Scene;\n private composer: EffectComposer;\n\n private gui: Pane = new Pane();\n\n private render: FolderApi;\n private stats: FolderApi;\n private renderOptions: FolderApi;\n private ssao: FolderApi;\n private toneMapping: FolderApi;\n private post: FolderApi;\n private export: FolderApi;\n\n private characterMaterial: FolderApi;\n\n private saveVisibilityInLocalStorage: boolean = true;\n public guiVisible: boolean = false;\n\n constructor(renderer: WebGLRenderer, scene: Scene, composer: EffectComposer) {\n if (this.saveVisibilityInLocalStorage) {\n const localStorageGuiVisible = localStorage.getItem(\"guiVisible\");\n if (localStorageGuiVisible !== null) {\n if (localStorageGuiVisible === \"true\") {\n this.guiVisible = true;\n } else if (localStorageGuiVisible === \"false\") {\n this.guiVisible = false;\n }\n }\n }\n\n this.renderer = renderer;\n this.scene = scene;\n this.composer = composer;\n\n this.render = this.gui.addFolder({ title: \"rendering\", expanded: true });\n\n this.stats = this.render.addFolder({ title: \"stats\", expanded: true });\n this.renderOptions = this.render.addFolder({ title: \"renderOptions\", expanded: false });\n this.toneMapping = this.render.addFolder({ title: \"customToneMapping\", expanded: false });\n this.ssao = this.render.addFolder({ title: \"ambientOcclusion\", expanded: false });\n this.post = this.render.addFolder({ title: \"post\", expanded: false });\n\n this.toneMapping.hidden = composerValues.renderer.toneMapping === 5 ? false : true;\n\n this.characterMaterial = this.gui.addFolder({ title: \"characterMaterial\", expanded: false });\n this.characterMaterial.addInput(\n characterValues.material,\n \"transmission\",\n characterOptions.material.transmission,\n );\n this.characterMaterial.addInput(\n characterValues.material,\n \"metalness\",\n characterOptions.material.metalness,\n );\n this.characterMaterial.addInput(\n characterValues.material,\n \"roughness\",\n characterOptions.material.roughness,\n );\n this.characterMaterial.addInput(characterValues.material, \"ior\", characterOptions.material.ior);\n this.characterMaterial.addInput(\n characterValues.material,\n \"thickness\",\n characterOptions.material.thickness,\n );\n this.characterMaterial.addInput(characterValues.material, \"specularColor\", {\n color: { type: \"float\" },\n });\n this.characterMaterial.addInput(\n characterValues.material,\n \"specularIntensity\",\n characterOptions.material.specularIntensity,\n );\n this.characterMaterial.addInput(characterValues.material, \"emissive\", {\n color: { type: \"float\" },\n });\n this.characterMaterial.addInput(\n characterValues.material,\n \"emissiveIntensity\",\n characterOptions.material.emissiveIntensity,\n );\n this.characterMaterial.addInput(\n characterValues.material,\n \"envMapIntensity\",\n characterOptions.material.envMapIntensity,\n );\n this.characterMaterial.addInput(characterValues.material, \"sheenColor\", {\n color: { type: \"float\" },\n });\n this.characterMaterial.addInput(\n characterValues.material,\n \"sheen\",\n characterOptions.material.sheen,\n );\n this.characterMaterial.addInput(\n characterValues.material,\n \"clearcoat\",\n characterOptions.material.clearcoat,\n );\n this.characterMaterial.addInput(\n characterValues.material,\n \"clearcoatRoughness\",\n characterOptions.material.clearcoatRoughness,\n );\n\n this.characterMaterial.on(\"change\", (e: TpChangeEvent<any>) => {\n if (!e.presetKey) {\n return;\n }\n if (e.presetKey === \"specularColor\") {\n characterValues.material.specularColor = {\n r: e.value.r,\n g: e.value.g,\n b: e.value.b,\n };\n return;\n }\n if (e.presetKey === \"emissive\") {\n characterValues.material.emissive = {\n r: e.value.r,\n g: e.value.g,\n b: e.value.b,\n };\n return;\n }\n if (e.presetKey === \"sheenColor\") {\n characterValues.material.sheenColor = {\n r: e.value.r,\n g: e.value.g,\n b: e.value.b,\n };\n return;\n }\n });\n\n this.export = this.gui.addFolder({ title: \"import/export\", expanded: false });\n\n window.addEventListener(\"keydown\", this.processKey.bind(this));\n\n this.setupGUIListeners.bind(this)();\n this.setupRenderPane = this.setupRenderPane.bind(this);\n }\n\n private processKey(e: KeyboardEvent): void {\n if (e.key === \"p\") this.toggleGUI();\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 public setupRenderPane(\n ssaoEffect: SSAOEffect,\n toneMappingEffect: ToneMappingEffect,\n toneMappingPass: EffectPass,\n brightnessContrastSaturation: typeof BrightnessContrastSaturation,\n bloomEffect: BloomEffect,\n gaussGrainEffect: typeof GaussGrainEffect,\n ): 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, \"rawDeltaTime\");\n this.stats.addMonitor(statsData, \"deltaTime\");\n this.stats.addMonitor(statsData, \"FPS\");\n\n this.renderOptions.addInput(\n composerValues.renderer,\n \"shadowMap\",\n composerOptions.renderer.shadowMap,\n );\n this.renderOptions.addMonitor(rendererBlades, \"shadowMapType\");\n\n this.renderOptions.addInput(\n composerValues.renderer,\n \"toneMapping\",\n composerOptions.renderer.toneMapping,\n );\n\n this.renderOptions.addMonitor(rendererBlades, \"toneMappingType\");\n\n this.renderOptions.addInput(\n composerValues.renderer,\n \"exposure\",\n composerOptions.renderer.exposure,\n );\n\n this.renderOptions.addInput(\n composerValues.renderer,\n \"bgIntensity\",\n composerOptions.renderer.bgIntensity,\n );\n\n this.renderOptions.addInput(\n composerValues.renderer,\n \"bgBlurriness\",\n composerOptions.renderer.bgBlurriness,\n );\n\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 if (e.value !== 5 && e.value !== 0) {\n this.toneMapping.hidden = true;\n } else {\n this.toneMapping.hidden = false;\n }\n toneMappingPass.enabled = e.value === 5 || e.value === 0 ? true : false;\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(composerValues.ssao, \"samples\", composerOptions.ssao.samples);\n this.ssao.addInput(composerValues.ssao, \"rings\", composerOptions.ssao.rings);\n this.ssao.addInput(\n composerValues.ssao,\n \"luminanceInfluence\",\n composerOptions.ssao.luminanceInfluence,\n );\n this.ssao.addInput(composerValues.ssao, \"radius\", composerOptions.ssao.radius);\n this.ssao.addInput(composerValues.ssao, \"intensity\", composerOptions.ssao.intensity);\n this.ssao.addInput(composerValues.ssao, \"bias\", composerOptions.ssao.bias);\n this.ssao.addInput(composerValues.ssao, \"fade\", composerOptions.ssao.fade);\n this.ssao.addInput(\n composerValues.ssao,\n \"resolutionScale\",\n composerOptions.ssao.resolutionScale,\n );\n this.ssao.addInput(\n composerValues.ssao,\n \"worldDistanceThreshold\",\n composerOptions.ssao.worldDistanceThreshold,\n );\n this.ssao.addInput(\n composerValues.ssao,\n \"worldDistanceFalloff\",\n composerOptions.ssao.worldDistanceFalloff,\n );\n this.ssao.addInput(\n composerValues.ssao,\n \"worldProximityThreshold\",\n composerOptions.ssao.worldProximityThreshold,\n );\n this.ssao.addInput(\n composerValues.ssao,\n \"worldProximityFalloff\",\n composerOptions.ssao.worldProximityFalloff,\n );\n this.ssao.addInput(composerValues.ssao, \"color\", {\n color: { alpha: false, type: \"float\" },\n });\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 ssaoEffect.blendMode.blendFunction =\n e.value === true ? BlendFunction.NORMAL : BlendFunction.MULTIPLY;\n return;\n }\n if (preset === \"resolutionScale\") {\n ssaoEffect.resolution.scale = e.value;\n return;\n }\n if (ssaoMaterialParams.includes(e.presetKey!)) {\n (ssaoEffect.ssaoMaterial as any)[preset] = e.value;\n return;\n }\n if (e.presetKey === \"color\") {\n ssaoEffect.color = new Color().setRGB(e.value.r, e.value.g, e.value.b);\n return;\n }\n (ssaoEffect as any)[preset] = e.value;\n });\n\n this.toneMapping.addInput(composerValues.toneMapping, \"mode\", composerOptions.toneMapping.mode);\n this.toneMapping.addMonitor(customToneMappingBlade, \"customToneMappingType\");\n this.toneMapping.addInput(\n composerValues.toneMapping,\n \"whitePoint\",\n composerOptions.toneMapping.whitePoint,\n );\n this.toneMapping.addInput(\n composerValues.toneMapping,\n \"middleGrey\",\n composerOptions.toneMapping.middleGrey,\n );\n const minLuminance = this.toneMapping.addInput(\n composerValues.toneMapping,\n \"minLuminance\",\n composerOptions.toneMapping.minLuminance,\n );\n minLuminance.hidden = composerValues.toneMapping.mode === 2 ? true : false;\n const averageLuminance = this.toneMapping.addInput(\n composerValues.toneMapping,\n \"averageLuminance\",\n composerOptions.toneMapping.averageLuminance,\n );\n averageLuminance.hidden = composerValues.toneMapping.mode === 2 ? true : false;\n this.toneMapping.addInput(\n composerValues.toneMapping,\n \"adaptationRate\",\n composerOptions.toneMapping.adaptationRate,\n );\n this.toneMapping.on(\"change\", (e: TpChangeEvent<any>) => {\n if (!e.presetKey) {\n return;\n }\n const preset = e.presetKey;\n if (preset === \"mode\") {\n minLuminance.hidden = composerValues.toneMapping.mode === 2 ? true : false;\n averageLuminance.hidden = composerValues.toneMapping.mode === 2 ? true : false;\n setCustomToneMappingType(e.value);\n }\n (toneMappingEffect as any)[preset] = e.value;\n return;\n });\n\n this.post.addInput(composerValues, \"brightness\", composerOptions.brightness.amount);\n this.post.addInput(composerValues, \"contrast\", composerOptions.contrast.amount);\n this.post.addInput(composerValues, \"saturation\", composerOptions.saturation.amount);\n\n this.post.addInput(composerValues, \"bloom\", composerOptions.bloom.amount);\n this.post.addInput(composerValues, \"grain\", composerOptions.grain.amount);\n\n this.post.on(\"change\", (e: TpChangeEvent<any>) => {\n const target = e.presetKey;\n switch (target) {\n case \"brightness\":\n brightnessContrastSaturation.uniforms.brightness.value = e.value;\n break;\n case \"contrast\":\n brightnessContrastSaturation.uniforms.contrast.value = e.value;\n break;\n case \"saturation\":\n brightnessContrastSaturation.uniforms.saturation.value = e.value;\n break;\n case \"bloom\":\n bloomEffect.intensity = e.value;\n break;\n case \"grain\":\n gaussGrainEffect.uniforms.amount.value = e.value;\n break;\n default:\n break;\n }\n });\n\n const exportButton = this.export.addButton({ title: \"export\" });\n exportButton.on(\"click\", () => {\n this.downloadSettingsAsJSON(this.gui.exportPreset());\n });\n const importButton = this.export.addButton({ title: \"import\" });\n importButton.on(\"click\", () => {\n this.importSettingsFromJSON((settings) => {\n this.gui.importPreset(settings);\n });\n });\n }\n\n private formatDateForFilename(): string {\n const date = new Date();\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, \"0\"); // Months are 0-11\n const day = String(date.getDate()).padStart(2, \"0\");\n const hours = String(date.getHours()).padStart(2, \"0\");\n const minutes = String(date.getMinutes()).padStart(2, \"0\");\n const seconds = String(date.getSeconds()).padStart(2, \"0\");\n return `${year}-${month}-${day} ${hours}-${minutes}-${seconds}`;\n }\n\n private downloadSettingsAsJSON(settings: any) {\n const jsonString = JSON.stringify(settings, null, 2);\n const blob = new Blob([jsonString], { type: \"application/json\" });\n const url = URL.createObjectURL(blob);\n const a = document.createElement(\"a\");\n a.download = `settings ${this.formatDateForFilename()}.json`;\n a.href = url;\n a.click();\n URL.revokeObjectURL(url);\n }\n\n private importSettingsFromJSON(callback: (settings: any) => void) {\n const input = document.createElement(\"input\");\n input.type = \"file\";\n input.accept = \".json\";\n input.addEventListener(\"change\", (event) => {\n const file = (event.target as HTMLInputElement).files?.[0];\n if (file) {\n const reader = new FileReader();\n reader.onload = (loadEvent) => {\n try {\n const settings = JSON.parse(loadEvent.target?.result as string);\n callback(settings);\n } catch (err) {\n console.error(\"Error parsing JSON:\", err);\n }\n };\n reader.readAsText(file);\n }\n });\n input.click();\n }\n\n public 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.rawDeltaTime = (Math.round(timeManager.rawDeltaTime * 100000) / 100000).toString();\n statsData.deltaTime = (Math.round(timeManager.deltaTime * 100000) / 100000).toString();\n statsData.FPS = timeManager.fps.toString();\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 if (this.saveVisibilityInLocalStorage) {\n localStorage.setItem(\"guiVisible\", this.guiVisible === true ? \"true\" : \"false\");\n }\n }\n}\n", "import { ShaderMaterial, Uniform } from \"three\";\n\nimport { vertexShader } from \"../shaders/vertex-shader\";\n\nexport const BrightnessContrastSaturation = new ShaderMaterial({\n uniforms: {\n tDiffuse: new Uniform(null),\n brightness: new Uniform(0.0),\n contrast: new Uniform(1.0),\n saturation: new Uniform(1.0),\n },\n vertexShader: vertexShader,\n fragmentShader: /* glsl */ `\n precision highp float;\n in vec2 vUv;\n\n uniform sampler2D tDiffuse;\n uniform float brightness;\n uniform float contrast;\n uniform float saturation;\n\n mat4 brightnessMatrix(float brightness) {\n return mat4(\n 1, 0, 0, 0,\n 0, 1, 0, 0,\n 0, 0, 1, 0,\n brightness, brightness, brightness, 1\n );\n }\n\n mat4 contrastMatrix(float contrast) {\n float t = (1.0 - contrast) / 2.0;\n\n return mat4(\n contrast, 0, 0, 0,\n 0, contrast, 0, 0,\n 0, 0, contrast, 0,\n t, t, t, 1\n );\n }\n\n mat4 saturationMatrix(float saturation) {\n vec3 luminance = vec3(0.3086, 0.6094, 0.0820);\n float oneMinusSat = 1.0 - saturation;\n vec3 red = vec3(luminance.x * oneMinusSat);\n red += vec3(saturation, 0, 0);\n vec3 green = vec3(luminance.y * oneMinusSat);\n green += vec3(0, saturation, 0);\n vec3 blue = vec3(luminance.z * oneMinusSat);\n blue += vec3(0, 0, saturation);\n return mat4(\n red, 0,\n green, 0,\n blue, 0,\n 0, 0, 0, 1\n );\n }\n\n void main(void) {\n vec4 color = texture(tDiffuse, vUv);\n gl_FragColor = (\n brightnessMatrix(brightness) *\n contrastMatrix(contrast) *\n saturationMatrix(saturation) *\n color\n );\n }\n `,\n dithering: true,\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 { 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.0) / 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 dithering: true,\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 = 150;\n private deltaTimes: 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 smoothDeltaTime: 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.smoothDeltaTime = smoothDT > this.rawDeltaTime * 1.75 ? this.rawDeltaTime : smoothDT;\n this.deltaTime = this.smoothDeltaTime;\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.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 DoubleSide,\n Euler,\n FrontSide,\n Group,\n Line3,\n Mesh,\n MeshStandardMaterial,\n Object3D,\n Ray,\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 public 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 public raycastFirstDistance(ray: Ray): number | null {\n let minimumDistance: number = Infinity;\n for (const [, value] of this.collisionMeshState) {\n const hit = value.meshBVH.raycast(ray, DoubleSide);\n if (hit.length > 0) {\n if (hit[0].distance < minimumDistance) {\n minimumDistance = hit[0].distance;\n }\n }\n }\n return minimumDistance;\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", "Raycaster", "Vector3", "Vector3", "Raycaster", "Color", "Vector3", "Vector3", "AnimationMixer", "Object3D", "Quaternion", "Vector3", "AnimationMixer", "Object3D", "Vector3", "Quaternion", "Vector3", "Group", "Group", "EffectComposer", "EffectPass", "BloomEffect", "SSAOEffect", "BlendFunction", "ToneMappingEffect", "Color", "LoadingManager", "Vector2", "WebGLRenderer", "BlendFunction", "Color", "BlendFunction", "Color", "ShaderMaterial", "Uniform", "ShaderMaterial", "Uniform", "Vector2", "WebGLRenderer", "EffectComposer", "BlendFunction", "BloomEffect", "SSAOEffect", "Color", "EffectPass", "ToneMappingEffect", "LoadingManager", "Color", "Mesh", "MeshStandardMaterial", "Vector3", "Vector3", "Mesh", "MeshStandardMaterial", "Color"]
|
7
|
+
}
|
@@ -0,0 +1,18 @@
|
|
1
|
+
export declare class KeyInputManager {
|
2
|
+
private keys;
|
3
|
+
constructor();
|
4
|
+
private handleUnfocus;
|
5
|
+
private onKeyDown;
|
6
|
+
private onKeyUp;
|
7
|
+
isKeyPressed(key: string): boolean;
|
8
|
+
isMovementKeyPressed(): boolean;
|
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;
|
17
|
+
dispose(): void;
|
18
|
+
}
|
@@ -0,0 +1,18 @@
|
|
1
|
+
import { PositionAndRotation } from "mml-web";
|
2
|
+
import { AudioListener, Group, PerspectiveCamera, Scene, WebGLRenderer } from "three";
|
3
|
+
import { CollisionsManager } from "../collisions/CollisionsManager";
|
4
|
+
export declare class MMLCompositionScene {
|
5
|
+
private renderer;
|
6
|
+
private scene;
|
7
|
+
private camera;
|
8
|
+
private audioListener;
|
9
|
+
private collisionsManager;
|
10
|
+
private getUserPositionAndRotation;
|
11
|
+
group: Group;
|
12
|
+
private debug;
|
13
|
+
private readonly mmlScene;
|
14
|
+
private readonly promptManager;
|
15
|
+
private readonly interactionListener;
|
16
|
+
private readonly clickTrigger;
|
17
|
+
constructor(renderer: WebGLRenderer, scene: Scene, camera: PerspectiveCamera, audioListener: AudioListener, collisionsManager: CollisionsManager, getUserPositionAndRotation: () => PositionAndRotation, documentAddresses: Array<string>);
|
18
|
+
}
|
@@ -0,0 +1,35 @@
|
|
1
|
+
import { PerspectiveCamera, Scene, Vector2, WebGLRenderer } from "three";
|
2
|
+
import { TimeManager } from "../time/TimeManager";
|
3
|
+
export declare class Composer {
|
4
|
+
private width;
|
5
|
+
private height;
|
6
|
+
resolution: Vector2;
|
7
|
+
private isEnvHDRI;
|
8
|
+
private readonly scene;
|
9
|
+
private readonly camera;
|
10
|
+
readonly renderer: WebGLRenderer;
|
11
|
+
private readonly composer;
|
12
|
+
private readonly renderPass;
|
13
|
+
private readonly fxaaEffect;
|
14
|
+
private readonly fxaaPass;
|
15
|
+
private readonly bloomEffect;
|
16
|
+
private readonly bloomPass;
|
17
|
+
private readonly toneMappingEffect;
|
18
|
+
private readonly smaaEffect;
|
19
|
+
private readonly normalPass;
|
20
|
+
private readonly normalTextureEffect;
|
21
|
+
private readonly ssaoEffect;
|
22
|
+
private readonly ssaoPass;
|
23
|
+
private readonly toneMappingPass;
|
24
|
+
private readonly smaaPass;
|
25
|
+
private readonly bcs;
|
26
|
+
private readonly bcsPass;
|
27
|
+
private readonly gaussGrainEffect;
|
28
|
+
private readonly gaussGrainPass;
|
29
|
+
private tweakPane;
|
30
|
+
constructor(scene: Scene, camera: PerspectiveCamera);
|
31
|
+
private updateProjection;
|
32
|
+
isTweakPaneVisible(): boolean;
|
33
|
+
render(timeManager: TimeManager): void;
|
34
|
+
useHDRI(url: string): void;
|
35
|
+
}
|
@@ -0,0 +1 @@
|
|
1
|
+
export declare const bayerDither: string;
|
@@ -0,0 +1,4 @@
|
|
1
|
+
export declare function injectBeforeMain(shaderSource: string, codeToInject: string): string;
|
2
|
+
export declare function injectInsideMain(shaderSource: string, codeToInject: string): string;
|
3
|
+
export declare function injectBefore(shaderSource: string, before: string, codeToInject: string): string;
|
4
|
+
export declare function injectAfter(shaderSource: string, after: string, codeToInject: string): string;
|
@@ -0,0 +1 @@
|
|
1
|
+
export declare const vertexShader = "\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 ";
|
@@ -0,0 +1,18 @@
|
|
1
|
+
export declare class TimeManager {
|
2
|
+
private clock;
|
3
|
+
private roundMagnitude;
|
4
|
+
private maxAverageFrames;
|
5
|
+
private deltaTimes;
|
6
|
+
private targetAverageDeltaTime;
|
7
|
+
private lerpedAverageMagDelta;
|
8
|
+
private fpsUpdateTime;
|
9
|
+
private framesSinceLastFPSUpdate;
|
10
|
+
time: number;
|
11
|
+
deltaTime: number;
|
12
|
+
rawDeltaTime: number;
|
13
|
+
smoothDeltaTime: number;
|
14
|
+
frame: number;
|
15
|
+
fps: number;
|
16
|
+
averageFPS: number;
|
17
|
+
update(): void;
|
18
|
+
}
|
@@ -0,0 +1,30 @@
|
|
1
|
+
import { BloomEffect, EffectComposer, EffectPass, SSAOEffect, ToneMappingEffect } from "postprocessing";
|
2
|
+
import { Scene, WebGLRenderer } from "three";
|
3
|
+
import { GaussGrainEffect } from "../rendering/post-effects/gauss-grain";
|
4
|
+
import { TimeManager } from "../time/TimeManager";
|
5
|
+
import { BrightnessContrastSaturation } from "./../rendering/post-effects/bright-contrast-sat";
|
6
|
+
export declare class TweakPane {
|
7
|
+
private renderer;
|
8
|
+
private scene;
|
9
|
+
private composer;
|
10
|
+
private gui;
|
11
|
+
private render;
|
12
|
+
private stats;
|
13
|
+
private renderOptions;
|
14
|
+
private ssao;
|
15
|
+
private toneMapping;
|
16
|
+
private post;
|
17
|
+
private export;
|
18
|
+
private characterMaterial;
|
19
|
+
private saveVisibilityInLocalStorage;
|
20
|
+
guiVisible: boolean;
|
21
|
+
constructor(renderer: WebGLRenderer, scene: Scene, composer: EffectComposer);
|
22
|
+
private processKey;
|
23
|
+
private setupGUIListeners;
|
24
|
+
setupRenderPane(ssaoEffect: SSAOEffect, toneMappingEffect: ToneMappingEffect, toneMappingPass: EffectPass, brightnessContrastSaturation: typeof BrightnessContrastSaturation, bloomEffect: BloomEffect, gaussGrainEffect: typeof GaussGrainEffect): void;
|
25
|
+
private formatDateForFilename;
|
26
|
+
private downloadSettingsAsJSON;
|
27
|
+
private importSettingsFromJSON;
|
28
|
+
updateStats(timeManager: TimeManager): void;
|
29
|
+
private toggleGUI;
|
30
|
+
}
|
@@ -0,0 +1,89 @@
|
|
1
|
+
export declare const characterValues: {
|
2
|
+
material: {
|
3
|
+
transmission: number;
|
4
|
+
metalness: number;
|
5
|
+
roughness: number;
|
6
|
+
ior: number;
|
7
|
+
thickness: number;
|
8
|
+
specularColor: {
|
9
|
+
r: number;
|
10
|
+
g: number;
|
11
|
+
b: number;
|
12
|
+
};
|
13
|
+
specularIntensity: number;
|
14
|
+
emissive: {
|
15
|
+
r: number;
|
16
|
+
g: number;
|
17
|
+
b: number;
|
18
|
+
};
|
19
|
+
emissiveIntensity: number;
|
20
|
+
envMapIntensity: number;
|
21
|
+
sheenColor: {
|
22
|
+
r: number;
|
23
|
+
g: number;
|
24
|
+
b: number;
|
25
|
+
};
|
26
|
+
sheen: number;
|
27
|
+
clearcoat: number;
|
28
|
+
clearcoatRoughness: number;
|
29
|
+
};
|
30
|
+
};
|
31
|
+
export declare const characterOptions: {
|
32
|
+
material: {
|
33
|
+
transmission: {
|
34
|
+
min: number;
|
35
|
+
max: number;
|
36
|
+
step: number;
|
37
|
+
};
|
38
|
+
metalness: {
|
39
|
+
min: number;
|
40
|
+
max: number;
|
41
|
+
step: number;
|
42
|
+
};
|
43
|
+
roughness: {
|
44
|
+
min: number;
|
45
|
+
max: number;
|
46
|
+
step: number;
|
47
|
+
};
|
48
|
+
ior: {
|
49
|
+
min: number;
|
50
|
+
max: number;
|
51
|
+
step: number;
|
52
|
+
};
|
53
|
+
thickness: {
|
54
|
+
min: number;
|
55
|
+
max: number;
|
56
|
+
step: number;
|
57
|
+
};
|
58
|
+
specularIntensity: {
|
59
|
+
min: number;
|
60
|
+
max: number;
|
61
|
+
step: number;
|
62
|
+
};
|
63
|
+
emissiveIntensity: {
|
64
|
+
min: number;
|
65
|
+
max: number;
|
66
|
+
step: number;
|
67
|
+
};
|
68
|
+
envMapIntensity: {
|
69
|
+
min: number;
|
70
|
+
max: number;
|
71
|
+
step: number;
|
72
|
+
};
|
73
|
+
sheen: {
|
74
|
+
min: number;
|
75
|
+
max: number;
|
76
|
+
step: number;
|
77
|
+
};
|
78
|
+
clearcoat: {
|
79
|
+
min: number;
|
80
|
+
max: number;
|
81
|
+
step: number;
|
82
|
+
};
|
83
|
+
clearcoatRoughness: {
|
84
|
+
min: number;
|
85
|
+
max: number;
|
86
|
+
step: number;
|
87
|
+
};
|
88
|
+
};
|
89
|
+
};
|